diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000000000000000000000000000000000000..c6429ef43f0772af18279a0e30d3b509822cb830
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,26 @@
+# Private key used for publishing
+RPC_URL=
+# If private key is filled, it will be used for both deposits and publishing -- be careful if you are doing both
+PRIVATE_KEY=
+THREADS=0 # Use all available threads
+PROFIT=2 # Minimum profit in priority gwei (coinbase_fee is automatically added on top of this)
+
+# Anonymous Publishing -- Advanced Users Only
+# -- MUST USE COMPATIBLE SEND_RPC
+ANON=0 # Must be 0 if WITHDRAW is enabled.
+COINBASE_FEE=2 # Fee in Gwei per gas paid to Eth builders to anonymize publishing -- Ignored if ANON is FALSE
+SEND_RPC=https://protect.flashbots.net/configure/refund?builder=Titan&builder=builder0x69&hint=hash # For builder sponsorship
+
+# If this is enabled, anonymous publishing is disabled.
+WITHDRAW=0 # Withdrawal address 0x...
+
+# Nargo Stuff
+NARGO_PATH=~/.nargo/backends/acvm-backend-barretenberg/backend_binary
+VERBOSE=FALSE
+
+# Nostr Relays -- optional if you have working seeds
+RELAYS=
+
+# Nostr Relay APIs ("Seed" nodes) -- expects an array returned
+MAX_RELAYS=8
+SEEDS=https://api.nostr.watch/v1/online
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..bfccd05f9a9599b603b1a0006d2c11df4d734a80
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,26 @@
+# Ignore node_modules directory
+node_modules/
+
+# Ignore built output
+dist/
+
+# Ignore environment variables file
+.env
+.envSepolia
+
+# Ignore IDE and editor files
+.vscode/
+.idea/
+*.sublime-project
+*.sublime-workspace
+
+# Ignore logs and generated files
+logs/
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Ignore OS generated files
+.DS_Store
+Thumbs.db
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..ef40147b276e315bbf7481c752d0da340df5e769
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,13 @@
+FROM node:20.0
+RUN mkdir /code && mkdir /code/node 
+WORKDIR /code/node
+RUN wget https://github.com/noir-lang/noir/releases/download/v0.28.0/nargo-x86_64-unknown-linux-gnu.tar.gz
+RUN tar xvf nargo-x86_64-unknown-linux-gnu.tar.gz
+RUN mv nargo /bin
+RUN rm nargo-x86_64-unknown-linux-gnu.tar.gz
+COPY . .
+RUN npm install
+RUN cd ./momiji-helpers/ && npm install
+WORKDIR /code/node
+
+ENTRYPOINT [ "npm", "start"]
diff --git a/README.md b/README.md
index 7c1b70a1681b0427912162c52d6f0b4587b204df..51603d8d5883886237d08575f152d925f187735d 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,51 @@
-# momiji-node-mainnet
+# momiji-node-ts
 
+This is the node for publishing batch transactions to the momiji protocol
+
+
+## FAQ
+- Global Config: One config, initialized in index.ts and borrowed from the .env
+- npm warnings are ok, npm outputs a lot of warnings.
+
+## USAGE
+
+First clone this repo.
+
+- Copy over the .env.example file to .env
+and Fill out the `.env` file with your hex formatted private key and your RPC URL
+
+and after that there are 2 alternatives for running a node either the quick way with docker or for those who already have a configured development machine setup.
+
+### Docker setup
+for building
+```sh
+sudo docker build -t xftnode .
+```
+
+for running
+```sh
+sudo docker run -it xftnode
+```
+### npm usage
+- Install noirup, the Nargo package manager
+```sh
+curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash
+```
+- Install nargo v0.28.0
+```
+noirup --version 0.28.0
+```
+
+- Install nvm and grab the latest LTS version of node 
+```sh
+curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
+```
+Restart your terminal and then run
+```sh
+nvm install --lts
+nvm use --lts
+```
+```
+cd ./momiji-helpers && npm install && cd .. && npm install
+```
+- Run `npm run start` to start the node
diff --git a/hardhat.config.ts b/hardhat.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..688b75ee0ef91fca49395f0a75af5c0822c045ad
--- /dev/null
+++ b/hardhat.config.ts
@@ -0,0 +1,29 @@
+import { HardhatUserConfig } from "hardhat/config";
+import "@nomicfoundation/hardhat-toolbox";
+import "@openzeppelin/hardhat-upgrades";
+
+const config: HardhatUserConfig = {
+  solidity: {
+    version: '0.8.24',
+    settings: {
+      evmVersion: 'cancun',
+      optimizer: { enabled: true, runs: 5000 },
+    },
+  },
+  networks: {
+    hardhat: {
+      blockGasLimit: 30000000,
+      gasPrice: "auto",
+      hardfork: 'cancun',
+      accounts: {
+        mnemonic: "artwork story jeans lyrics expose update sword absurd rail game argue submit"
+      },
+      chainId: 1
+    }
+  },
+  mocha: {
+    timeout: 200000
+  }
+};
+
+export default config;
diff --git a/momiji-helpers/.gitignore b/momiji-helpers/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..30c0c395fbf98bedc6d5e80badf983907a8451f9
--- /dev/null
+++ b/momiji-helpers/.gitignore
@@ -0,0 +1,17 @@
+node_modules
+.env
+coverage
+coverage.json
+typechain
+
+#Hardhat files
+cache
+artifacts
+
+#node_modules
+node_modules
+package-lock.json
+
+#ignore JS
+*.js
+typechain-types-ignore
\ No newline at end of file
diff --git a/momiji-helpers/README.md b/momiji-helpers/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..683918bea5009058e0a583adb1757b1da9c0bb3b
--- /dev/null
+++ b/momiji-helpers/README.md
@@ -0,0 +1 @@
+# momiji-ts
\ No newline at end of file
diff --git a/momiji-helpers/circuits/helpers/Nargo.toml b/momiji-helpers/circuits/helpers/Nargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..33b49616917449921c335fcd186295a2d640b260
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/Nargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "helpers"
+type = "lib"
+authors = [""]
+compiler_version = ">=0.19.2"
+
+[dependencies]
\ No newline at end of file
diff --git a/momiji-helpers/circuits/helpers/Prover.toml b/momiji-helpers/circuits/helpers/Prover.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/momiji-helpers/circuits/helpers/Verifier.toml b/momiji-helpers/circuits/helpers/Verifier.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/momiji-helpers/circuits/helpers/codegen/bytes_contract_only_inputs_without_deposit.ts b/momiji-helpers/circuits/helpers/codegen/bytes_contract_only_inputs_without_deposit.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3612f64636e619e422a465a56963275ceb2bdc2b
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/bytes_contract_only_inputs_without_deposit.ts
@@ -0,0 +1,37 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type u8 = string | number;
+export type Field = string;
+
+export type EncryptedUTXO = {
+  secret: Field;
+  amount: Field;
+  data: Field;
+};
+
+export type ContractOnlyInputs = {
+  timestamp: Field;
+  deadline: Field;
+  signature_hash: Field;
+  price_limit: Field;
+  recipients: Field[];
+  swap_amounts: Field[];
+  uids: Field[];
+  encrypted_utxo: EncryptedUTXO[];
+};
+
+
+export const bytes_contract_only_inputs_without_deposit_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"contract_only_inputs","type":{"kind":"struct","path":"structs::ContractOnlyInputs","fields":[{"name":"timestamp","type":{"kind":"field"}},{"name":"deadline","type":{"kind":"field"}},{"name":"signature_hash","type":{"kind":"field"}},{"name":"price_limit","type":{"kind":"field"}},{"name":"recipients","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"swap_amounts","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"uids","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"encrypted_utxo","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::EncryptedUTXO","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"data","type":{"kind":"field"}}]}}}]},"visibility":"private"}],"param_witnesses":{"contract_only_inputs":[{"start":0,"end":100}]},"return_type":{"abi_type":{"kind":"array","length":3168,"type":{"kind":"integer","sign":"unsigned","width":8}},"visibility":"private"},"return_witnesses":[131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,259,258,257,256,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,291,290,289,288,287,286,285,284,283,282,281,280,279,278,277,276,275,274,273,272,271,270,269,268,267,266,265,264,263,262,261,260,323,322,321,320,319,318,317,316,315,314,313,312,311,310,309,308,307,306,305,304,303,302,301,300,299,298,297,296,295,294,293,292,355,354,353,352,351,350,349,348,347,346,345,344,343,342,341,340,339,338,337,336,335,334,333,332,331,330,329,328,327,326,325,324,387,386,385,384,383,382,381,380,379,378,377,376,375,374,373,372,371,370,369,368,367,366,365,364,363,362,361,360,359,358,357,356,419,418,417,416,415,414,413,412,411,410,409,408,407,406,405,404,403,402,401,400,399,398,397,396,395,394,393,392,391,390,389,388,451,450,449,448,447,446,445,444,443,442,441,440,439,438,437,436,435,434,433,432,431,430,429,428,427,426,425,424,423,422,421,420,483,482,481,480,479,478,477,476,475,474,473,472,471,470,469,468,467,466,465,464,463,462,461,460,459,458,457,456,455,454,453,452,515,514,513,512,511,510,509,508,507,506,505,504,503,502,501,500,499,498,497,496,495,494,493,492,491,490,489,488,487,486,485,484,547,546,545,544,543,542,541,540,539,538,537,536,535,534,533,532,531,530,529,528,527,526,525,524,523,522,521,520,519,518,517,516,579,578,577,576,575,574,573,572,571,570,569,568,567,566,565,564,563,562,561,560,559,558,557,556,555,554,553,552,551,550,549,548,611,610,609,608,607,606,605,604,603,602,601,600,599,598,597,596,595,594,593,592,591,590,589,588,587,586,585,584,583,582,581,580,643,642,641,640,639,638,637,636,635,634,633,632,631,630,629,628,627,626,625,624,623,622,621,620,619,618,617,616,615,614,613,612,675,674,673,672,671,670,669,668,667,666,665,664,663,662,661,660,659,658,657,656,655,654,653,652,651,650,649,648,647,646,645,644,707,706,705,704,703,702,701,700,699,698,697,696,695,694,693,692,691,690,689,688,687,686,685,684,683,682,681,680,679,678,677,676,739,738,737,736,735,734,733,732,731,730,729,728,727,726,725,724,723,722,721,720,719,718,717,716,715,714,713,712,711,710,709,708,771,770,769,768,767,766,765,764,763,762,761,760,759,758,757,756,755,754,753,752,751,750,749,748,747,746,745,744,743,742,741,740,803,802,801,800,799,798,797,796,795,794,793,792,791,790,789,788,787,786,785,784,783,782,781,780,779,778,777,776,775,774,773,772,835,834,833,832,831,830,829,828,827,826,825,824,823,822,821,820,819,818,817,816,815,814,813,812,811,810,809,808,807,806,805,804,867,866,865,864,863,862,861,860,859,858,857,856,855,854,853,852,851,850,849,848,847,846,845,844,843,842,841,840,839,838,837,836,899,898,897,896,895,894,893,892,891,890,889,888,887,886,885,884,883,882,881,880,879,878,877,876,875,874,873,872,871,870,869,868,931,930,929,928,927,926,925,924,923,922,921,920,919,918,917,916,915,914,913,912,911,910,909,908,907,906,905,904,903,902,901,900,963,962,961,960,959,958,957,956,955,954,953,952,951,950,949,948,947,946,945,944,943,942,941,940,939,938,937,936,935,934,933,932,995,994,993,992,991,990,989,988,987,986,985,984,983,982,981,980,979,978,977,976,975,974,973,972,971,970,969,968,967,966,965,964,1027,1026,1025,1024,1023,1022,1021,1020,1019,1018,1017,1016,1015,1014,1013,1012,1011,1010,1009,1008,1007,1006,1005,1004,1003,1002,1001,1000,999,998,997,996,1059,1058,1057,1056,1055,1054,1053,1052,1051,1050,1049,1048,1047,1046,1045,1044,1043,1042,1041,1040,1039,1038,1037,1036,1035,1034,1033,1032,1031,1030,1029,1028,1091,1090,1089,1088,1087,1086,1085,1084,1083,1082,1081,1080,1079,1078,1077,1076,1075,1074,1073,1072,1071,1070,1069,1068,1067,1066,1065,1064,1063,1062,1061,1060,1123,1122,1121,1120,1119,1118,1117,1116,1115,1114,1113,1112,1111,1110,1109,1108,1107,1106,1105,1104,1103,1102,1101,1100,1099,1098,1097,1096,1095,1094,1093,1092,1155,1154,1153,1152,1151,1150,1149,1148,1147,1146,1145,1144,1143,1142,1141,1140,1139,1138,1137,1136,1135,1134,1133,1132,1131,1130,1129,1128,1127,1126,1125,1124,1187,1186,1185,1184,1183,1182,1181,1180,1179,1178,1177,1176,1175,1174,1173,1172,1171,1170,1169,1168,1167,1166,1165,1164,1163,1162,1161,1160,1159,1158,1157,1156,1219,1218,1217,1216,1215,1214,1213,1212,1211,1210,1209,1208,1207,1206,1205,1204,1203,1202,1201,1200,1199,1198,1197,1196,1195,1194,1193,1192,1191,1190,1189,1188,1251,1250,1249,1248,1247,1246,1245,1244,1243,1242,1241,1240,1239,1238,1237,1236,1235,1234,1233,1232,1231,1230,1229,1228,1227,1226,1225,1224,1223,1222,1221,1220,1283,1282,1281,1280,1279,1278,1277,1276,1275,1274,1273,1272,1271,1270,1269,1268,1267,1266,1265,1264,1263,1262,1261,1260,1259,1258,1257,1256,1255,1254,1253,1252,1315,1314,1313,1312,1311,1310,1309,1308,1307,1306,1305,1304,1303,1302,1301,1300,1299,1298,1297,1296,1295,1294,1293,1292,1291,1290,1289,1288,1287,1286,1285,1284,1347,1346,1345,1344,1343,1342,1341,1340,1339,1338,1337,1336,1335,1334,1333,1332,1331,1330,1329,1328,1327,1326,1325,1324,1323,1322,1321,1320,1319,1318,1317,1316,1379,1378,1377,1376,1375,1374,1373,1372,1371,1370,1369,1368,1367,1366,1365,1364,1363,1362,1361,1360,1359,1358,1357,1356,1355,1354,1353,1352,1351,1350,1349,1348,1411,1410,1409,1408,1407,1406,1405,1404,1403,1402,1401,1400,1399,1398,1397,1396,1395,1394,1393,1392,1391,1390,1389,1388,1387,1386,1385,1384,1383,1382,1381,1380,1443,1442,1441,1440,1439,1438,1437,1436,1435,1434,1433,1432,1431,1430,1429,1428,1427,1426,1425,1424,1423,1422,1421,1420,1419,1418,1417,1416,1415,1414,1413,1412,1475,1474,1473,1472,1471,1470,1469,1468,1467,1466,1465,1464,1463,1462,1461,1460,1459,1458,1457,1456,1455,1454,1453,1452,1451,1450,1449,1448,1447,1446,1445,1444,1507,1506,1505,1504,1503,1502,1501,1500,1499,1498,1497,1496,1495,1494,1493,1492,1491,1490,1489,1488,1487,1486,1485,1484,1483,1482,1481,1480,1479,1478,1477,1476,1539,1538,1537,1536,1535,1534,1533,1532,1531,1530,1529,1528,1527,1526,1525,1524,1523,1522,1521,1520,1519,1518,1517,1516,1515,1514,1513,1512,1511,1510,1509,1508,1571,1570,1569,1568,1567,1566,1565,1564,1563,1562,1561,1560,1559,1558,1557,1556,1555,1554,1553,1552,1551,1550,1549,1548,1547,1546,1545,1544,1543,1542,1541,1540,1603,1602,1601,1600,1599,1598,1597,1596,1595,1594,1593,1592,1591,1590,1589,1588,1587,1586,1585,1584,1583,1582,1581,1580,1579,1578,1577,1576,1575,1574,1573,1572,1635,1634,1633,1632,1631,1630,1629,1628,1627,1626,1625,1624,1623,1622,1621,1620,1619,1618,1617,1616,1615,1614,1613,1612,1611,1610,1609,1608,1607,1606,1605,1604,1667,1666,1665,1664,1663,1662,1661,1660,1659,1658,1657,1656,1655,1654,1653,1652,1651,1650,1649,1648,1647,1646,1645,1644,1643,1642,1641,1640,1639,1638,1637,1636,1699,1698,1697,1696,1695,1694,1693,1692,1691,1690,1689,1688,1687,1686,1685,1684,1683,1682,1681,1680,1679,1678,1677,1676,1675,1674,1673,1672,1671,1670,1669,1668,1731,1730,1729,1728,1727,1726,1725,1724,1723,1722,1721,1720,1719,1718,1717,1716,1715,1714,1713,1712,1711,1710,1709,1708,1707,1706,1705,1704,1703,1702,1701,1700,1763,1762,1761,1760,1759,1758,1757,1756,1755,1754,1753,1752,1751,1750,1749,1748,1747,1746,1745,1744,1743,1742,1741,1740,1739,1738,1737,1736,1735,1734,1733,1732,1795,1794,1793,1792,1791,1790,1789,1788,1787,1786,1785,1784,1783,1782,1781,1780,1779,1778,1777,1776,1775,1774,1773,1772,1771,1770,1769,1768,1767,1766,1765,1764,1827,1826,1825,1824,1823,1822,1821,1820,1819,1818,1817,1816,1815,1814,1813,1812,1811,1810,1809,1808,1807,1806,1805,1804,1803,1802,1801,1800,1799,1798,1797,1796,1859,1858,1857,1856,1855,1854,1853,1852,1851,1850,1849,1848,1847,1846,1845,1844,1843,1842,1841,1840,1839,1838,1837,1836,1835,1834,1833,1832,1831,1830,1829,1828,1891,1890,1889,1888,1887,1886,1885,1884,1883,1882,1881,1880,1879,1878,1877,1876,1875,1874,1873,1872,1871,1870,1869,1868,1867,1866,1865,1864,1863,1862,1861,1860,1923,1922,1921,1920,1919,1918,1917,1916,1915,1914,1913,1912,1911,1910,1909,1908,1907,1906,1905,1904,1903,1902,1901,1900,1899,1898,1897,1896,1895,1894,1893,1892,1955,1954,1953,1952,1951,1950,1949,1948,1947,1946,1945,1944,1943,1942,1941,1940,1939,1938,1937,1936,1935,1934,1933,1932,1931,1930,1929,1928,1927,1926,1925,1924,1987,1986,1985,1984,1983,1982,1981,1980,1979,1978,1977,1976,1975,1974,1973,1972,1971,1970,1969,1968,1967,1966,1965,1964,1963,1962,1961,1960,1959,1958,1957,1956,2019,2018,2017,2016,2015,2014,2013,2012,2011,2010,2009,2008,2007,2006,2005,2004,2003,2002,2001,2000,1999,1998,1997,1996,1995,1994,1993,1992,1991,1990,1989,1988,2051,2050,2049,2048,2047,2046,2045,2044,2043,2042,2041,2040,2039,2038,2037,2036,2035,2034,2033,2032,2031,2030,2029,2028,2027,2026,2025,2024,2023,2022,2021,2020,2083,2082,2081,2080,2079,2078,2077,2076,2075,2074,2073,2072,2071,2070,2069,2068,2067,2066,2065,2064,2063,2062,2061,2060,2059,2058,2057,2056,2055,2054,2053,2052,2115,2114,2113,2112,2111,2110,2109,2108,2107,2106,2105,2104,2103,2102,2101,2100,2099,2098,2097,2096,2095,2094,2093,2092,2091,2090,2089,2088,2087,2086,2085,2084,2147,2146,2145,2144,2143,2142,2141,2140,2139,2138,2137,2136,2135,2134,2133,2132,2131,2130,2129,2128,2127,2126,2125,2124,2123,2122,2121,2120,2119,2118,2117,2116,2179,2178,2177,2176,2175,2174,2173,2172,2171,2170,2169,2168,2167,2166,2165,2164,2163,2162,2161,2160,2159,2158,2157,2156,2155,2154,2153,2152,2151,2150,2149,2148,2211,2210,2209,2208,2207,2206,2205,2204,2203,2202,2201,2200,2199,2198,2197,2196,2195,2194,2193,2192,2191,2190,2189,2188,2187,2186,2185,2184,2183,2182,2181,2180,2243,2242,2241,2240,2239,2238,2237,2236,2235,2234,2233,2232,2231,2230,2229,2228,2227,2226,2225,2224,2223,2222,2221,2220,2219,2218,2217,2216,2215,2214,2213,2212,2275,2274,2273,2272,2271,2270,2269,2268,2267,2266,2265,2264,2263,2262,2261,2260,2259,2258,2257,2256,2255,2254,2253,2252,2251,2250,2249,2248,2247,2246,2245,2244,2307,2306,2305,2304,2303,2302,2301,2300,2299,2298,2297,2296,2295,2294,2293,2292,2291,2290,2289,2288,2287,2286,2285,2284,2283,2282,2281,2280,2279,2278,2277,2276,2339,2338,2337,2336,2335,2334,2333,2332,2331,2330,2329,2328,2327,2326,2325,2324,2323,2322,2321,2320,2319,2318,2317,2316,2315,2314,2313,2312,2311,2310,2309,2308,2371,2370,2369,2368,2367,2366,2365,2364,2363,2362,2361,2360,2359,2358,2357,2356,2355,2354,2353,2352,2351,2350,2349,2348,2347,2346,2345,2344,2343,2342,2341,2340,2403,2402,2401,2400,2399,2398,2397,2396,2395,2394,2393,2392,2391,2390,2389,2388,2387,2386,2385,2384,2383,2382,2381,2380,2379,2378,2377,2376,2375,2374,2373,2372,2435,2434,2433,2432,2431,2430,2429,2428,2427,2426,2425,2424,2423,2422,2421,2420,2419,2418,2417,2416,2415,2414,2413,2412,2411,2410,2409,2408,2407,2406,2405,2404,2467,2466,2465,2464,2463,2462,2461,2460,2459,2458,2457,2456,2455,2454,2453,2452,2451,2450,2449,2448,2447,2446,2445,2444,2443,2442,2441,2440,2439,2438,2437,2436,2499,2498,2497,2496,2495,2494,2493,2492,2491,2490,2489,2488,2487,2486,2485,2484,2483,2482,2481,2480,2479,2478,2477,2476,2475,2474,2473,2472,2471,2470,2469,2468,2531,2530,2529,2528,2527,2526,2525,2524,2523,2522,2521,2520,2519,2518,2517,2516,2515,2514,2513,2512,2511,2510,2509,2508,2507,2506,2505,2504,2503,2502,2501,2500,2563,2562,2561,2560,2559,2558,2557,2556,2555,2554,2553,2552,2551,2550,2549,2548,2547,2546,2545,2544,2543,2542,2541,2540,2539,2538,2537,2536,2535,2534,2533,2532,2595,2594,2593,2592,2591,2590,2589,2588,2587,2586,2585,2584,2583,2582,2581,2580,2579,2578,2577,2576,2575,2574,2573,2572,2571,2570,2569,2568,2567,2566,2565,2564,2627,2626,2625,2624,2623,2622,2621,2620,2619,2618,2617,2616,2615,2614,2613,2612,2611,2610,2609,2608,2607,2606,2605,2604,2603,2602,2601,2600,2599,2598,2597,2596,2659,2658,2657,2656,2655,2654,2653,2652,2651,2650,2649,2648,2647,2646,2645,2644,2643,2642,2641,2640,2639,2638,2637,2636,2635,2634,2633,2632,2631,2630,2629,2628,2691,2690,2689,2688,2687,2686,2685,2684,2683,2682,2681,2680,2679,2678,2677,2676,2675,2674,2673,2672,2671,2670,2669,2668,2667,2666,2665,2664,2663,2662,2661,2660,2723,2722,2721,2720,2719,2718,2717,2716,2715,2714,2713,2712,2711,2710,2709,2708,2707,2706,2705,2704,2703,2702,2701,2700,2699,2698,2697,2696,2695,2694,2693,2692,2755,2754,2753,2752,2751,2750,2749,2748,2747,2746,2745,2744,2743,2742,2741,2740,2739,2738,2737,2736,2735,2734,2733,2732,2731,2730,2729,2728,2727,2726,2725,2724,2787,2786,2785,2784,2783,2782,2781,2780,2779,2778,2777,2776,2775,2774,2773,2772,2771,2770,2769,2768,2767,2766,2765,2764,2763,2762,2761,2760,2759,2758,2757,2756,2819,2818,2817,2816,2815,2814,2813,2812,2811,2810,2809,2808,2807,2806,2805,2804,2803,2802,2801,2800,2799,2798,2797,2796,2795,2794,2793,2792,2791,2790,2789,2788,2851,2850,2849,2848,2847,2846,2845,2844,2843,2842,2841,2840,2839,2838,2837,2836,2835,2834,2833,2832,2831,2830,2829,2828,2827,2826,2825,2824,2823,2822,2821,2820,2883,2882,2881,2880,2879,2878,2877,2876,2875,2874,2873,2872,2871,2870,2869,2868,2867,2866,2865,2864,2863,2862,2861,2860,2859,2858,2857,2856,2855,2854,2853,2852,2915,2914,2913,2912,2911,2910,2909,2908,2907,2906,2905,2904,2903,2902,2901,2900,2899,2898,2897,2896,2895,2894,2893,2892,2891,2890,2889,2888,2887,2886,2885,2884,2947,2946,2945,2944,2943,2942,2941,2940,2939,2938,2937,2936,2935,2934,2933,2932,2931,2930,2929,2928,2927,2926,2925,2924,2923,2922,2921,2920,2919,2918,2917,2916,2979,2978,2977,2976,2975,2974,2973,2972,2971,2970,2969,2968,2967,2966,2965,2964,2963,2962,2961,2960,2959,2958,2957,2956,2955,2954,2953,2952,2951,2950,2949,2948,3011,3010,3009,3008,3007,3006,3005,3004,3003,3002,3001,3000,2999,2998,2997,2996,2995,2994,2993,2992,2991,2990,2989,2988,2987,2986,2985,2984,2983,2982,2981,2980,3043,3042,3041,3040,3039,3038,3037,3036,3035,3034,3033,3032,3031,3030,3029,3028,3027,3026,3025,3024,3023,3022,3021,3020,3019,3018,3017,3016,3015,3014,3013,3012,3075,3074,3073,3072,3071,3070,3069,3068,3067,3066,3065,3064,3063,3062,3061,3060,3059,3058,3057,3056,3055,3054,3053,3052,3051,3050,3049,3048,3047,3046,3045,3044,3107,3106,3105,3104,3103,3102,3101,3100,3099,3098,3097,3096,3095,3094,3093,3092,3091,3090,3089,3088,3087,3086,3085,3084,3083,3082,3081,3080,3079,3078,3077,3076,3139,3138,3137,3136,3135,3134,3133,3132,3131,3130,3129,3128,3127,3126,3125,3124,3123,3122,3121,3120,3119,3118,3117,3116,3115,3114,3113,3112,3111,3110,3109,3108,3171,3170,3169,3168,3167,3166,3165,3164,3163,3162,3161,3160,3159,3158,3157,3156,3155,3154,3153,3152,3151,3150,3149,3148,3147,3146,3145,3144,3143,3142,3141,3140,3203,3202,3201,3200,3199,3198,3197,3196,3195,3194,3193,3192,3191,3190,3189,3188,3187,3186,3185,3184,3183,3182,3181,3180,3179,3178,3177,3176,3175,3174,3173,3172,3235,3234,3233,3232,3231,3230,3229,3228,3227,3226,3225,3224,3223,3222,3221,3220,3219,3218,3217,3216,3215,3214,3213,3212,3211,3210,3209,3208,3207,3206,3205,3204,3267,3266,3265,3264,3263,3262,3261,3260,3259,3258,3257,3256,3255,3254,3253,3252,3251,3250,3249,3248,3247,3246,3245,3244,3243,3242,3241,3240,3239,3238,3237,3236]},"bytecode":"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"};
+
+export async function bytes_contract_only_inputs_without_deposit(contract_only_inputs: ContractOnlyInputs, foreignCallHandler?: ForeignCallHandler): Promise<u8[]> {
+  const program = new Noir(bytes_contract_only_inputs_without_deposit_circuit);
+  const args: InputMap = { contract_only_inputs };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as u8[];
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/contract_only_inputs_with_signature_hash.ts b/momiji-helpers/circuits/helpers/codegen/contract_only_inputs_with_signature_hash.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9bc9a71351ed19a51219cd54b1aef29e773f6542
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/contract_only_inputs_with_signature_hash.ts
@@ -0,0 +1,36 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+export type EncryptedUTXO = {
+  secret: Field;
+  amount: Field;
+  data: Field;
+};
+
+export type ContractOnlyInputs = {
+  timestamp: Field;
+  deadline: Field;
+  signature_hash: Field;
+  price_limit: Field;
+  recipients: Field[];
+  swap_amounts: Field[];
+  uids: Field[];
+  encrypted_utxo: EncryptedUTXO[];
+};
+
+
+export const contract_only_inputs_with_signature_hash_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"contract_only_inputs","type":{"kind":"struct","path":"structs::ContractOnlyInputs","fields":[{"name":"timestamp","type":{"kind":"field"}},{"name":"deadline","type":{"kind":"field"}},{"name":"signature_hash","type":{"kind":"field"}},{"name":"price_limit","type":{"kind":"field"}},{"name":"recipients","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"swap_amounts","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"uids","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"encrypted_utxo","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::EncryptedUTXO","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"data","type":{"kind":"field"}}]}}}]},"visibility":"private"}],"param_witnesses":{"contract_only_inputs":[{"start":0,"end":100}]},"return_type":{"abi_type":{"kind":"struct","path":"structs::ContractOnlyInputs","fields":[{"name":"timestamp","type":{"kind":"field"}},{"name":"deadline","type":{"kind":"field"}},{"name":"signature_hash","type":{"kind":"field"}},{"name":"price_limit","type":{"kind":"field"}},{"name":"recipients","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"swap_amounts","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"uids","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"encrypted_utxo","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::EncryptedUTXO","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"data","type":{"kind":"field"}}]}}}]},"visibility":"private"},"return_witnesses":[0,1,3301,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,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,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]},"bytecode":"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"};
+
+export async function contract_only_inputs_with_signature_hash(contract_only_inputs: ContractOnlyInputs, foreignCallHandler?: ForeignCallHandler): Promise<ContractOnlyInputs> {
+  const program = new Noir(contract_only_inputs_with_signature_hash_circuit);
+  const args: InputMap = { contract_only_inputs };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as ContractOnlyInputs;
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/create_transaction.ts b/momiji-helpers/circuits/helpers/codegen/create_transaction.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7425d265ed726dd7a9f24966986d413c2bed99c0
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/create_transaction.ts
@@ -0,0 +1,93 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+export type MerkleProof = {
+  path_utxo: Field[];
+  path_tx: Field[];
+  path_historic: Field[];
+  index_utxo: Field;
+  index_tx: Field;
+  index_historic: Field;
+};
+
+export type UTXO_Spendable = {
+  secret: Field;
+  amount: Field;
+  asset_type: Field;
+  oracle: Field;
+  old_root_proof: Field;
+  merkle_proof: MerkleProof;
+  spend_in_same_batch: boolean;
+};
+
+export type UTXO_New = {
+  secret: Field;
+  amount: Field;
+  asset_type: Field;
+};
+
+export type EncryptedUTXO = {
+  secret: Field;
+  amount: Field;
+  data: Field;
+};
+
+export type ContractOnlyInputs = {
+  timestamp: Field;
+  deadline: Field;
+  signature_hash: Field;
+  price_limit: Field;
+  recipients: Field[];
+  swap_amounts: Field[];
+  uids: Field[];
+  encrypted_utxo: EncryptedUTXO[];
+};
+
+export type PublicInputs = {
+  current_root: Field;
+  utxo_root: Field;
+  deposit_amount: Field;
+  withdrawals: Field;
+  commitment_in: Field[];
+  commitment_out: Field[];
+  nullifier_hashes: Field[];
+  contract_only_inputs: Field;
+};
+
+export type UTXO = {
+  owner: Field;
+  amount: Field;
+  asset_type: Field;
+};
+
+export type PrivateInputs = {
+  oracle: Field[];
+  old_root_proof: Field[];
+  secrets: Field[];
+  utxo_in: UTXO[];
+  merkle_proofs: MerkleProof[];
+  utxo_out: UTXO[];
+};
+
+export type TransactionInputs = {
+  public_inputs_hash: Field;
+  public_inputs: PublicInputs;
+  private_inputs: PrivateInputs;
+};
+
+
+export const create_transaction_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"current_root","type":{"kind":"field"},"visibility":"private"},{"name":"deposit_amount","type":{"kind":"field"},"visibility":"private"},{"name":"withdrawals","type":{"kind":"array","length":16,"type":{"kind":"field"}},"visibility":"private"},{"name":"utxo_spendable","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::UTXO_Spendable","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"asset_type","type":{"kind":"field"}},{"name":"oracle","type":{"kind":"field"}},{"name":"old_root_proof","type":{"kind":"field"}},{"name":"merkle_proof","type":{"kind":"struct","path":"structs::MerkleProof","fields":[{"name":"path_utxo","type":{"kind":"array","length":4,"type":{"kind":"field"}}},{"name":"path_tx","type":{"kind":"array","length":4,"type":{"kind":"field"}}},{"name":"path_historic","type":{"kind":"array","length":20,"type":{"kind":"field"}}},{"name":"index_utxo","type":{"kind":"field"}},{"name":"index_tx","type":{"kind":"field"}},{"name":"index_historic","type":{"kind":"field"}}]}},{"name":"spend_in_same_batch","type":{"kind":"boolean"}}]}},"visibility":"private"},{"name":"utxo_new","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::UTXO_New","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"asset_type","type":{"kind":"field"}}]}},"visibility":"private"},{"name":"contract_only_inputs","type":{"kind":"struct","path":"structs::ContractOnlyInputs","fields":[{"name":"timestamp","type":{"kind":"field"}},{"name":"deadline","type":{"kind":"field"}},{"name":"signature_hash","type":{"kind":"field"}},{"name":"price_limit","type":{"kind":"field"}},{"name":"recipients","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"swap_amounts","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"uids","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"encrypted_utxo","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::EncryptedUTXO","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"data","type":{"kind":"field"}}]}}}]},"visibility":"private"}],"param_witnesses":{"contract_only_inputs":[{"start":658,"end":758}],"current_root":[{"start":0,"end":1}],"deposit_amount":[{"start":1,"end":2}],"utxo_new":[{"start":610,"end":658}],"utxo_spendable":[{"start":18,"end":610}],"withdrawals":[{"start":2,"end":18}]},"return_type":{"abi_type":{"kind":"struct","path":"structs::TransactionInputs","fields":[{"name":"public_inputs_hash","type":{"kind":"field"}},{"name":"public_inputs","type":{"kind":"struct","path":"structs::PublicInputs","fields":[{"name":"current_root","type":{"kind":"field"}},{"name":"utxo_root","type":{"kind":"field"}},{"name":"deposit_amount","type":{"kind":"field"}},{"name":"withdrawals","type":{"kind":"field"}},{"name":"commitment_in","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"commitment_out","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"nullifier_hashes","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"contract_only_inputs","type":{"kind":"field"}}]}},{"name":"private_inputs","type":{"kind":"struct","path":"structs::PrivateInputs","fields":[{"name":"oracle","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"old_root_proof","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"secrets","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"utxo_in","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::UTXO","fields":[{"name":"owner","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"asset_type","type":{"kind":"field"}}]}}},{"name":"merkle_proofs","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::MerkleProof","fields":[{"name":"path_utxo","type":{"kind":"array","length":4,"type":{"kind":"field"}}},{"name":"path_tx","type":{"kind":"array","length":4,"type":{"kind":"field"}}},{"name":"path_historic","type":{"kind":"array","length":20,"type":{"kind":"field"}}},{"name":"index_utxo","type":{"kind":"field"}},{"name":"index_tx","type":{"kind":"field"}},{"name":"index_historic","type":{"kind":"field"}}]}}},{"name":"utxo_out","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::UTXO","fields":[{"name":"owner","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"asset_type","type":{"kind":"field"}}]}}}]}}]},"visibility":"public"},"return_witnesses":[13916,0,10648,1,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,10618,10619,10621,10622,10624,10625,10627,10628,10630,10631,10633,10634,10636,10637,10639,10640,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13917,13917,13917,13917,13917,13917,13917,13917,13917,13917,13917,13917,13917,13917,13917,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541]},"bytecode":"H4sIAAAAAAAA/+TdZXAb2cKt4dhOHMcBJw4zM9kWWA4zM3MiGcLMzMzMzMzMzMzMzMzJteZ66ujL5N+sNdWroqpTZxJ17fT79FarJW3ZbpH+/+24LVKk1db//99u4f9zD/+fNeK///5z7V/+3OuXP8//5c9Hfvnzy1/+HM/t//456Jc/1/vlz31/+fOiX/58/Jc/v/nlzwnd/++f8/zyZ3vEn11v7hH/XyDi/01+VrM5NDAg1N/kb/cLCHLYLH5mi8Nq87f5W2yWkACbyRRqM9sCgxxBgX5B/mZTqH+YJcgU5vf/b3GBY31w/99Yfv5Wu9nkZ7dbbFabxe6wh4/pH2A224MCTXaTI9hksdksQSF2mzXQZnaEWvz9gswmqy3UFuawhgUG+HlG+t+x//Xm9ouB37+7+f+f/f6XN9f9/fib4wfbaRaE606jxv3kjptkrO5P7vBj9Ndk8HLZX9/w//2I+O/PEc7O+91/ud91uy8u2/1unK8u93u4/J3z/rgR28Vz2f6bS2ekSPgTCvJYf3fHPl5YzVbgWD/cjX2OcLZ+/8054t92/wSehBndzuYfhG7ngxbZ/evc/rdPxH93oxyd55+fBEc3D/L8ATmij89P4PnW3cPYj8EEzkE88HPHw+DdCUndkQ3enYjUHcXg3YlJ3Z4G705C6o5q8O6kpG4vg3cnI3VHM3h3clK3t8G7U5C6oxu8OyWpO4bBu1ORumMavDs1qTuWwbvTkLp9DN6dltQd2+Dd6UjdcQzenZ7U7Wvw7gyk7rgG785I6o5n8O5MpO74Bu/OTOpOYPDuLKTuhAbvzkrqTmTw7myk7sQG785O6k5i8O4cpO6kBu/OSepOZvBuP1J3coN3+5O6Uxi8O4DUndLg3SZSdyqDd5tJ3akN3m0hdacBdv+XCxgdwLUzrvub1kNsAaMTIq0H4Y0uD+CCH1J3Og/4MfrHAkbnv/P3QsL0Hv9ceOj8O+f9wRHbhbhsn8HjnwsZXcfL6LL/zpv7Ly3/1h15DDN5YB8HrGYbcKzMHrhFS//lyTGzB+fkmEXt5OiEyEI4OWY1+MnR2Z31Pzg5Bkb638ksm8c/V3f/fb/rdtl/c1J0vT/Hb06yOSJOsraI7YJcts9JPokij7WfyEm0NnAsfw9jnyOcx8SfcGUdYPBXFH+taPfAr85FfhvCZHBD5+PEjzB3zAJzx93gc8ciYOhBmDtWge7IhO5Age4ohG6bQLcnoTtIoDsqoTuXQLcXoTu3QHc0QncegW5vQndege7ohO58At0xCN35BbpjEroLCHTHInQXFOj2IXQXEuiOTeguLNAdh9BdRKDbl9BdVKA7LqG7mEB3PEJ3cYHu+ITuEgLdCQjdJQW6ExK6Swl0JyJ0lxboTkzoLiPQnYTQXVagOymhu5xAdzJCd3mB7uSE7goC3SkI3RUFulMSuisJdKcidFcW6E5N6K4i0J2G0F0V3O0O7naujwGu7/B3jmUmOFYz+je9Irr/cXz+5VqMAOC6t+oCcxG4XsTfHDEeei7WMPhcdP6UXsZPSq0pMH+s4PljJcyfWgafP7nDxwggdNc2eLfzJ2MzHjd1DN4dN+J8gX7uQq4jrGtww3iROHOnHrj775sH8VgjfmIxyq++wefNF3fjP/YaCDzvB4Kf9wMJz392AUcb2NFGcHQIOAaBHYMIjsECjrnAjrkIjiECjrnBjrkJjqECjnnAjnkIjmECjnnBjnkJjg0FHPOBHfMRHBsJOOYHO+YnODYWcCwAdixAcGwi4FgQ7FiQ4NhUwLEQ2LEQwbGZgGNhsGNhgmNzAcciYMciBMcWAo5FwY5FCY4tBRyLgR2LERxbCTgWBzsWJzi2FnAsAXYsQXBsI+BYEuxYkuDYVsCxFNixFMGxnYBjabBjaYJjewHHMmDHMgTHDgKOZcGOZQmOHQUcy4EdyxEcOwk4lgc7lic4dhZwrAB2rEBw7CLgWBHsWJHg2FXAsRLYsRLBsZuAY2WwY2WCY3cBxypgxyoExx4CjlXBjlUJjj3Bjui1j3kicdaZ9zJ4d15Sd2+Dd+cjdfcxeHd+Undfg3cXIHX3M3h3QVJ3f4N3FyJ1DzB4d2FS90CDdxchdQ8yeHdRUvdgg3cXI3UPMXh3cVL3UIN3lyB1DzN4d0lS93CDd5cidY8weHdpUvdIg3eXIXWPMnh3WVL3aIN3lyN1jzF4d3lS91iDd1cgdY8zeHdFUvd4g3dXInVPMHh3ZVL3RIN3VyF1TzJ4d1VS92SDd1cjdU8xeHd1UvdUg3fXIHVPM3h3TVL3dIN31yJ1zwB2/5e/QDvUHbffrvs70+M3+4/aaRbETA/8uLM8cJOM1e3cR/Ax+scv0Hb+O3//IuvZEc6uv/ja+XfO+8Mitmvosv0cl+1/N95cl/133tx/afm37shjOM/D2I+DDOH7l8kD/8Oy0gEN54OfZP6+eRCb/+1YmYB+Cwz+JJ0xYg6in6QXGrw72N34j71FBjcMcefMncWkcw76uaoucKwlwPPXf3lRu8QDex3z922p2kWtE2Ip4aJ2mcEvap3dy/6Di9o6kf53Ebrc5SLV/Zf7Xbdb8ZuLWdf7V/7m4nhlxMVx3Yjt6rlsv4p88Ys81qvBF7+s5l7AsdYY/ILfeUzWEJ4w14KfMN3B3Vk9sL+Vwy98rGoEx3UGv+DqFT7GakL3eoH5YwHPn+oExw1/oGMNguNGAUcr2LEWwXGTwc9nzu7ahO7NAvMnEDx/7ATHLQKONrCjg+C4VcAxCOwYTHDcJuCYC+wYQnDcLuCYG+wYSnDcIeCYB+wYRnDcKeCYF+zYkOC4S8AxH9ixEcFxt4BjfrBjY4LjHgHHAmDHJgTHvQKOBcGOTQmO+wQcC4EdmxEc9ws4FgY7Nic4HhBwLAJ2bEFwPCjgWBTs2JLgeEjAsRjYsRXB8bCAY3GwY2uC4xEBxxJgxzYEx6MCjiXBjm0JjscEHEuBHdsRHI8LOJYGO7YnOJ4QcCwDduxAcDwp4FgW7NiR4HhKwLEc2LETwfG0gGN5sGNnguMZAccKYMcuBMezAo4VwY5dCY7nBBwrgR27ERzPCzhWBjt2JzheEHCsAnbsQXC8KOBYFezYk+B4CezIWK/Yi9B9WaC7N6H7ikB3H0L3VYHuvoTuawLd/Qjd1wW6+xO6bwh0DyB03xToHkjoviXQPYjQfVugezCh+45A9xBC912B7qGE7nsC3cMI3fcFuocTuh8IdI8gdD8U6B5J6H4k0D2K0P1YoHs0ofuJQPcYQvdTge6xhO5nAt3jCN3PBbrHE7pfCHRPIHS/FOieSOh+JdA9idD9WqB7MqH7jUD3FEL3W4HuqYTudwLd0wjd7wW6pxO6Pwh0zyB0fzT45+nOn7cG/Flh/s6x1hMcPwk4An9mlv/6iPHQjp8N/jhcFTF//nF8/uUPknX9uYL/1vCLwFzcCJ6LGwlz8avAWqOa4LVGNQmO3wz+mA50jkHo/i7wONwEfhxuIjj+EHDcDHbcTHD8afDHYYPwMdYSuiNFNv55vA74PF6H4Ogm4FgX7FiX4Ogu4FgP7FiP4OgR2djns2wenOuKyALzpz5w/tgicRyjGHz+BJG6Pf+w+eMXMR7aMaqAYwOwYwOCo9cfNh+zk54Xohnc0XltD/w513+9TtpCcPQWcNwKdtxKcIwu4LgN7LiN4BhDwHE72HE7wTGmgOMOsOMOgmMsAcedYMedBEcfAcddYMddBMfYAo67wY67CY5xBBz3gB33EBx9BRz3gh33EhzjCjjuAzvuIzjGE3DcD3bcT3CML+B4AOx4gOCYQMDxINjxIMExoYDjIbDjIYJjIgHHw2DHwwTHxAKOR8CORwiOSQQcj4IdjxIckwo4HgM7HiM4JhNwPA52PE5wTC7geALseILgmELA8STY8STBMaWA4ymw4ymCYyoBx9Ngx9MEx9QCjmfAjmcIjmkEHM+CHc8SHNMKOJ4DO54jOKYTcDwPdjxPcEwv4HgB7HiB4JhBwPEi2PEiwTGjgOMlsOMlgmMmAcfLYMfLBMfMAo5XwI5XCI5ZBByvgh2vEhyzCjheAzteIzhmE3C8Dna8TnDMLuB4A+x4g+CYQ8DxJtjxJsExp4DjLbDjLYKjn4DjbbDjbYKjv4DjHbDjHYJjgIDjXbDjXYKjScDxHtjxHsHRLOB4H+x4n+BoEXB8AHZ8QHC0Cjg+BDs+JDgGCjg+Ajs+IjjaBBwfgx0fExyDBByfgB2fEBxzCTg+BTs+JTjmFnB8BnZ8RnDMI+D4HOz4nOCYV8DxBdjxBcExn4DjS7DjS4JjfgHHV2DHVwTHAgKOr8GOrwmOBQUc34Ad3xAcCwk4vgU7viU4FhZwfAd2fEdwLCLg+B7s+J7gWFTA8QPY8QPBsZiA40ew40eCY3GD//xQeyTOz9MuYfBuB6m7pMG7g0ndpQzeHULqLm3w7lBSdxmDd4eRussavLshqbucwbsbkbrLG7y7Mam7gsG7m5C6Kxq8uympu5LBu5uRuisbvLs5qbuKwbtbkLqrGry7Jam7msG7W5G6qxu8uzWpu4bBu9uQumsavLstqbuWwbvbkbprG7y7Pam7jsG7O5C66xq8uyOpu57BuzuRuusbvLszqbuBwbu7kLrtBu/uSup2GLy7G6k72ODd3UndIQbv7kHqDjV4d09Sdxiw2zNinL/30fUGf1/dHbffrvvbMPJv9h+10ywI152GjRsZN8lY3c59BB+jvyaDl8v+Ov+dHxH/3TjC2Xm/h8vfOe9vHLFdE5ftm7hs/7vxmrrsv/Pm/kvLv3VHHsNmkbGPA/TCm1nhB2Q+cOHNvIjx0Cfc5gZfwOR0XAB0nBM+1jyCY4s/zHFexHhox5YCjgvBjgsJjq0EHBeBHRcRHFsLOC4GOy4mOLYx+AuauaTnhbZ/2PNCmDvHsZ3RF5SRutuDu/++oa/t+wDH6uDa7G+1m01+drvFZrVZ7A57+Jj+AWazPSjQZDc5gk0Wm80SFGK3WQNtZkeoxd8vyGyy2kJtYQ5rWGDAf/omQAfgsXLd345qbwI4IToS3gToZPA3AZzdnf6DNwF6R/rfi/bOLi/q3X+533W7Lr958e96f9ffvJnQNeLNhD4R2/V12b4b+c0C5LHuDn6zgNU8HzhWj8jGPkc4j0mPyPgnzJ4Gv+BaFv7gWge84FodPtYnwoVHL4NfcDkfK90J86e3wPzZAJ4/nwnzp4+A40aw4xeCY98/0PErwbGfgOMmsOMPgmN/AcfNYMefBMcBBn9+dXZHIjy/DhSYP1vA88eb4DhIwHEr2DE6wXGwgOM2sGMMguMQAcftYMeYBMehAo47wI6xCI7DBBx3gh19CI7DBRx3gR1jExxHCDjuBjvGITiOFHDcA3b0JTiOEnDcC3aMS3AcLeC4D+wYj+A4RsBxP9gxPsFxrIDjAbBjAoLjOAHHg2DHhATH8QKOh8COiQiOEwQcD4MdExMcJwo4HgE7JiE4ThJwPAp2TEpwnCzgeAzsmIzgOEXA8TjYMTnBcaqA4wmwYwqC4zQBx5Ngx5QEx+kCjqfAjqkIjjMEHE+DHVMTHGcKOJ4BO6YhOM4ScDwLdkxLcJwt4HgO7JiO4DhHwPE82DE9wXGugOMFsGMGguM8AceLYMeMBMf5Ao6XwI6ZCI4LBBwvgx0zExwXCjheATtmITguEnC8CnbMSnBcLOB4DeyYjeC4RMDxOtgxO8FxqYDjDbBjDoLjMgHHm2DHnATH5QKOt8COfgTHFQKOt8GO/gTHlQKOd8COAQTHVQKOd8GOJoLjagHHe2BHM8FxjYDjfbCjheC4VsDxAdjRSnBcJ+D4EOwYSHBcL+D4COxoIzhuEHB8DHYMIjhuFHB8AnbMRXDcJOD4FOyYm+C4WcDxGdgxD8Fxi4Djc7BjXoLjVgHHF2DHfATHbQKOL8GO+QmO2wUcX4EdCxAcdwg4vgY7FiQ47hRwfAN2LERw3CXg+BbsWJjguFvA8R3YsQjBcY+A43uwY1GC414Bxw9gx2IEx30Cjh/BjsUJjvvBjoyfM1iC0H1AoLskofugQHcpQvchge7ShO7DAt1lCN1HBLrLErqPCnSXI3QfE+guT+g+LtBdgdB9QqC7IqH7pEB3JUL3KYHuyoTu0wLdVQjdZwS6qxK6zwp0VyN0nxPork7oPi/QXYPQfUGguyah+6JAdy1C9yWB7tqE7ssC3XUI3VcEuusSuq8KdNcjdF8T6K5P6L4u0N2A0H1DoNtO6L4p0O0gdN8S6A4mdN8W6A4hdN8R6A4ldN8V6A4jdN8z+Ofpzt/bC/yds/7OsXoTHO8LOAJ/96p/74jx0I4PBBz7gh37EhwfGvx81i3icfiP4+NvtZtNfna7xWa1WewOe3i/f4DZbA8KNNlNjmCTxWazBIXYbdZAm9kRavH3CzKbrLZQW5jDGhYY8H9+z/e/NXwkMBf7gediP8JcfCywZusbeM2Wczy04xMBx+9gx+8Ex6cGPzfWCR9jNaH7mcD5rD/4fNafcD57LuA4AOw4gOD4QsBxINhxIMHxpcHPZ/3Dx+hJ6H4l8HzoFhn7fOhGcHwt4OgOdnQnOL4RcPQAO3oQHN8KOEYGO0YmOL4TcIwCdoxCcHwv4OgJdvQkOH4w+HXKcg/O666PAvMnKnD+1I3Ecfxk8PlTj9T9+Q+bP6sjxkM7fhFw9AI7ehEcvwo4RgM7RiM4fvvDHtcrSM+v3wXeRxoEfh9pEGE+/hBwHAx2HExw/CngOATsOITgGCmK8R2Hgh2HEhzdBByHgR2HERzdBRyHgx2HExw9BBxHgB1HEBwjCziOBDuOJDhGEXAcBXYcRXD0FHAcDXYcTXCMKuA4Buw4huDoJeA4Fuw4luAYTcBxHNhxHMHRW8BxPNhxPMExuoDjBLDjBIJjDAHHiWDHiQTHmAKOk8COkwiOsQQcJ4MdJxMcfQQcp4AdpxAcYws4TgU7TiU4xhFwnAZ2nEZw9BVwnA52nE5wjCvgOAPsOIPgGE/AcSbYcSbBMb6A4yyw4yyCYwIBx9lgx9kEx4QCjnPAjnMIjokEHOeCHecSHBMLOM4DO84jOCYRcJwPdpxPcEwq4LgA7LiA4JhMwHEh2HEhwTG5gOMisOMigmMKAcfFYMfFBMeUAo5LwI5LCI6pBByXgh2XEhxTCzguAzsuIzimEXBcDnZcTnBMK+C4Auy4guCYTsBxJdhxJcExvYDjKrDjKoJjBgHH1WDH1QTHjAKOa8COawiOmQQc14Id1xIcMws4rgM7riM4ZhFwXA92XE9wzCrguAHsuIHgmE3AcSPYcSPBMbuA4yaw4yaCYw4Bx81gx80Ex5wCjlvAjlsIjn4CjlvBjlsJjv4CjtvAjtsIjgECjtvBjtsJjiYBxx1gxx0ER7OA406w406Co0XAcRfYcRfB0SrguBvsuJvgGCjguAfsuIfgaBNw3At23EtwDBJw3Ad23EdwzCXguB/suJ/gmFvA8QDY8QDBMY+A40Gw40GCY14Bx0Ngx0MEx3wCjofBjocJjvkFHI+AHY8QHAsIOB4FOx4lOBYUcDwGdjxGcCwk4Hgc7Hic4FhYwPEE2PEEwbGIgONJsONJgmNRAcdTYMdTBMdiAo6nwY6nCY7FBRzPgB3PEBxLCDieBTueJTiWFHA8B3Y8R3AsJeB4Hux4nuBYWsDxAtjxAsGxjIDjRbDjRYJjWQHHS2DHSwTHcgKOl8GOlwmO5QUcr4AdrxAcKwg4XgU7XiU4VhRwvAZ2vEZwrCTgeB3seJ3gWFnA8QbY8QbBsYqA402w402CY1UBx1tgx1sEx2oCjrfBjrcJjtUFHO+AHe8QHGsION4FO94lONYUcLwHdrxHcKwFdkT//vQB4WP0JHTXNnj3QFJ3HYN3DyJ11zV492BSdz2Ddw8hddc3ePdQUncDg3cPI3XbDd49nNTtMHj3CFJ3sMG7R5K6QwzePYrUHWrw7tGk7jCDd48hdTc0ePdYUncjg3ePI3U3Nnj3eFJ3E4N3TyB1NzV490RSdzODd08idTc3ePdkUncLg3dPIXW3NHj3VFJ3K4N3TyN1tzZ493RSdxuDd88gdbc1ePdMUnc7g3fPInW3N3j3bFJ3B4N3zyF1dzR491xSdyeDd88jdXcGdntGjPP3Prre0B5N3XH77bq/XaL8Zv9RO82CcN1p1Lhdo+AmGavbuY/gY/TXZPBy2V/nv/Mj4r+7RTg77/dw+Tvn/c0itmvusn13l+1/N14Pl/133tx/afm37shj2DMK9nGAXnjTKPzk2By48KZZxHjoE24vgy9gcjq2ADu2IDj2FnBsCXRsEj5WM4Jjnz/MsVnEeGjHvgKOrcCOrQiO/QQcW4MdWxMc+ws4tgE7tiE4DhBwbAt2bEtwHCjg2A7s2I7gOEjAsT3YsT3BcbDB3/BpSrreG/KHXe81duc4DjX4/GlC6h4G7v77hn7vYyFwrOGuzf5Wu9nkZ7dbbFabxe6wh4/pH2A224MCTXaTI9hksdksQSF2mzXQZnaEWvz9gswmqy3UFuawhgUG/Kdvkg4HHivX/R2h9iapE2IE4U3SkQZ/k9TZPfI/eJN0QaT/vak5yuVNT/df7nfdbvRv3hx1vX/Mb95sHRPxZuvCiO0WuWw/lvxmKvJYjwO/mcpqPgIca3wUY58jnMdkfBT8E+YEg19wdQq/SOgFvODqHj7WfcKFx0SDX3A5HyvjCPNnksD86QOePw8I82eygGNfsONDguMUAcd+YMdHBMepf6DjY4LjNAHH/mDH5wTH6QKOA8COLwiOMwQcB4IdXxIcZxr8es/Z/YrQPUtg/gwCz58fBMfZAo6DwY4/CY5zBByHgB0jEV7HzRVwHAp2dCM4zhNwHAZ2dCc4zhdwHA529CA4LhBwHAF2jExwXCjgOBLsGIXguEjAcRTY0ZPguFjAcTTYMSrBcYmA4xiwoxfBcamA41iwYzSC4zIBx3FgR2+C43IBx/Fgx+gExxUCjhPAjjEIjisFHCeCHWMSHFcJOE4CO8YiOK4WcJwMdvQhOK4RcJwCdoxNcFwr4DgV7BiH4LhOwHEa2NGX4LhewHE62DEuwXGDgOMMsGM8guNGAceZYMf4BMdNAo6zwI4JCI6bBRxngx0TEhy3CDjOATsmIjhuFXCcC3ZMTHDcJuA4D+yYhOC4XcBxPtgxKcFxh4DjArBjMoLjTgHHhWDH5ATHXQKOi8COKQiOuwUcF4MdUxIc9wg4LgE7piI47hVwXAp2TE1w3CfguAzsmIbguF/AcTnYMS3B8YCA4wqwYzqC40EBx5Vgx/QEx0MCjqvAjhkIjocFHFeDHTMSHI8IOK4BO2YiOB4VcFwLdsxMcDwm4LgO7JiF4HhcwHE92DErwfGEgOMGsGM2guNJAceNYMfsBMdTAo6bwI45CI6nBRw3gx1zEhzPCDhuATv6ERzPCjhuBTv6ExzPCThuAzsGEBzPCzhuBzuaCI4XBBx3gB3NBMeLAo47wY4WguMlAcddYEcrwfGygONusGMgwfGKgOMesKON4HhVwHEv2DGI4HhNwHEf2DEXwfG6gON+sGNuguMNAccDYMc8BMebAo4HwY55CY63BBwPgR3zERxvCzgeBjvmJzjeEXA8AnYsQHC8K+B4FOxYkOB4T8DxGNixEMHxvoDjcbBjYYLjAwHHE2DHIgTHhwKOJ8GORQmOjwQcT4EdixEcHws4ngY7Fic4PhFwPAN2LEFwfCrgeBbsWJLg+EzA8RzYsRTB8bmA43mwY2mC4wsBxwtgxzIEx5cCjhfBjmUJjq8EHC+BHcsRHF8LOF4GO5YnOL4RcLwCdqxAcHwr4HgV7FiR4PhOwPEa2LESwfG9gON1sGNlguMHAccbYMcqBMePAo43wY5VCY6fBBxvgR2rERw/CzjeBjtWJzh+EXC8A3asQXD8KuB4F+xYk+D4TcDxHtixFsHxO9iR8fuBaxO6fwh01yF0/xTorkvojuRp/O56hG43ge76hG53ge4GhG4PgW47oTuyQLeD0B1FoDuY0O0p0B1C6I4q0B1K6PYS6A4jdEcT6G5I6PYW6G5E6I4u0N2Y0B1DoLsJoTumQHdTQncsge5mhG4fge7mhO7YAt0tCN1xBLpbErp9BbpbEbrjCnS3JnTHE+huQ+iOL9DdltCdQKC7HaE7oUB3e0J3IoHuDoTuxALdHQndSQS6OxG6kwp0dyZ0JwN3oz9PnxDePBH32aW/c6xJBMfkAo6TgY6TIsZDO6YQcJwCdpxCcEwp4DgV7DiV4JjK4M8LYyPOZ/84Pv5Wu9nkZ7dbbFabxe6wh/f7B5jN9qBAk93kCDZZbDZLUIjdZg20mR2hFn+/ILPJagu1hTmsYYEBfhOi4AxTC8zFaeC5OI0wF9MY3NG59u0JeO2bczy0Y1oBx6dgx6cEx3QCjs/Ajs8IjukN/hzTO3yM7oTuDALPC9PBzwvTCc8LGQUcZ4AdZxAcMwk4zgQ7ziQ4ZhZwnAV2nEVwzGLw54Ul4WNMIHRnFbiueA2+rnhNeH7NJuD4Buz4huCYXcDxLdjxLcExh4DjO7DjO4JjTgHH92DH9wRHPwHHD2DHDwRHfwHHj2DHjwTHAAHHT2DHTwRHk4DjZ7DjZ4Kj2eCvPzpH5rwvZRGYP1+A86dPJI6j1eDzpy+pO/APmz/dI8ZDO9oEHL+CHb8SHIMEHL+BHb8RHHMJOH4HO34nOOb+w86PXUjXKXkE3mefDX6ffTbh/ea8Ao5zwI5zCI75BBzngh3nEhzzCzjOAzvOIzgWEHCcD3acT3AsKOC4AOy4gOBYSMBxIdhxIcGxsIDjIrDjIoJjEQHHxWDHxQTHogKOS8COSwiOxQQcl4IdlxIciws4LgM7LiM4lhBwXA52XE5wLCnguALsuILgWErAcSXYcSXBsbSA4yqw4yqCYxkBx9Vgx9UEx7ICjmvAjmsIjuUEHNeCHdcSHMsLOK4DO64jOFYQcFwPdlxPcKwo4LgB7LiB4FhJwHEj2HEjwbGygOMmsOMmgmMVAcfNYMfNBMeqAo5bwI5bCI7VBBy3gh23EhyrCzhuAztuIzjWEHDcDnbcTnCsKeC4A+y4g+BYS8BxJ9hxJ8GxtoDjLrDjLoJjHQHH3WDH3QTHugKOe8COewiO9QQc94Id9xIc6ws47gM77iM4NhBw3A923E9wtAs4HgA7HiA4OgQcD4IdDxIcgwUcD4EdDxEcQwQcD4MdDxMcQwUcj4AdjxAcwwQcj4IdjxIcGwo4HgM7HiM4NhJwPA52PE5wbCzgeALseILg2ETA8STY8STBsamA4ymw4ymCYzMBx9Ngx9MEx+YCjmfAjmcIji0EHM+CHc8SHFsKOJ4DO54jOLYScDwPdjxPcGwt4HgB7HiB4NhGwPEi2PEiwbGtgOMlsOMlgmM7AcfLYMfLBMf2Ao5XwI5XCI4dBByvgh2vEhw7CjheAzteIzh2EnC8Dna8TnDsLOB4A+x4g+DYRcDxJtjxJsGxq4DjLbDjLYJjNwHH22DH2wTH7gKOd8COdwiOPQQc74Id7xIcewo43gM73iM49hJwvA92vE9w7C3g+ADs+IDg2EfA8SHY8SHBsa+A4yOw4yOCYz8Bx8dgx8cEx/4Cjk/Ajk8IjgMEHJ+CHZ8SHAcKOD4DOz4jOA4ScHwOdnxOcBws4PgC7PiC4DhEwPEl2PElwXGogOMrsOMrguMwAcfXYMfXBMfhAo5vwI5vCI4jBBzfgh3fEhxHCji+Azu+IziOEnB8D3Z8T3AcLeD4Aez4geA4RsDxI9jxI8FxrIDjJ7DjJ4LjOAHHz2DHzwTH8QKOX8COXwiOEwQcv4IdvxIcJwo4fgM7fiM4ThJw/A52/E5wnCzg+APs+IPgOEXA8SfY8SfBcaqAYyRPrKNzPLTjNAFHN7CjG8FxuoCjO9jRneA4Q8DRA+zoQXCcKeAYGewYmeA4S8AxCtgxCsFxtoCjJ9jRk+A4R8AxKtgxKsFxroCjF9jRi+A4T8AxGtgxGsFxvoCjN9jRm+C4QMAxOtgxOsFxoYBjDLBjDILjIgHHmGDHmATHxQKOscCOsQiOSwQcfcCOPgTHpQKOscGOsQmOywQc44Ad4xAclws4+oIdfQmOKwQc44Id4xIcVwo4xgM7xiM4rhJwjA92jE9wXC3gmADsmIDguEbAMSHYMSHBca2AYyKwYyKC4zoBx8Rgx8QEx/UCjknAjkkIjhsEHJOCHZMSHDcKOCYDOyYjOG4CO7qBHZeGjzGBsD5ss8G7l5G6txi8ezmpe6vBu1eQurcZvHslqXu7wbtXkbp3GLx7Nal7p8G715C6dxm8ey2pe7fBu9eRuvcYvHs9qXuvwbs3kLr3Gbx7I6l7v8G7N5G6Dxi8ezOp+6DBu7eQug8ZvHsrqfuwwbu3kbqPGLx7O6n7qMG7d5C6jxm8eyep+7jBu3eRuk8YvHs3qfukwbv3kLpPGbx7L6n7tMG795G6zxi8ez+p+6zBuw+Qus8ZvPsgqfu8wbsPkbovGLz7MKn7IrDbM2Kcv/fR9Yb2aOGO22/X/b3k+Zv9R+00C+KSJ37cy564ScbqvuwJP0Z/TQYvl/11/js/Iv77SoSz834Pl79z3t8yYrtWLttfddn+d+Ndc9l/5839l5Z/6448htc9sY8D9MKbruEnx17AH1DUM2I89An3hsEXMDkde4MdexMcbwo49gE79iE43hJw7At07B4+Vk+C4+0/zLFnxHhoxzsCjv3Ajv0IjncFHPuDHfsTHO8JOA4AOw4gON4XcBwIdhxIcHwg4DgI7DiI4PhQwHEw2HEwwfGRgOMQsOMQguNjAcehYMehBMcnAo7DwI7DCI5PDf6GeA/S67hnf9jruGbuHMfnBp8/zUndL8Ddf9/Q7w0fA4710rXZ32o3m/zsdovNarPYHfbwMf0DzGZ7UKDJbnIEmyw2myUoxG6zBtrMjlCLv1+Q2WS1hdrCHNawwID/9EOkl8Bj5bq/r9Q+RHJCvCJ8iPTa4B8iObtf/wcfIh2N9L8Pfd64fCjk/sv9rtu9/c2HR673v/vNh1HvIj6MOhax3XGX7d+TP2xCHusP4A+bWM0vgWN99DT2OcJ5TD4Svon+yeAXXCPDLxImAi+4xoWPlZzg+NngF1zOx8oHQvcXgfkzGTx/UhAcvwo4TgE7piQ4fhNwnAp2TEVw/C7gOA3smJrg+OMPdExDcPwp4Dgd7JiR4BgpqvEdZ4AdMxEc3QQcZ4IdMxMc3QUcZ4EdsxAcPcCO6Ncfzu6shO7IAvNnNnj+5CU4RhFwnAN2zEdw9BRwnAt2zE9wjCrgOA/sWIDg6CXgOB/sWJDgGE3AcQHYsRDB0VvAcSHYsTDBMbqA4yKwYxGCYwwBx8Vgx6IEx5gCjkvAjsUIjrEEHJeCHYsTHH0EHJeBHUsQHGMLOC4HO5YkOMYRcFwBdixFcPQVcFwJdixNcIwr4LgK7FiG4BhPwHE12LEswTG+gOMasGM5gmMCAce1YMfyBMeEAo7rwI4VCI6JBBzXgx0rEhwTCzhuADtWIjgmEXDcCHasTHBMKuC4CexYheCYTMBxM9ixKsExuYDjFrBjNYJjCgHHrWDH6gTHlAKO28CONQiOqQQct4MdaxIcUws47gA71iI4phFw3Al2rE1wTCvguAvsWIfgmE7AcTfYsS7BMb2A4x6wYz2CYwYBx71gx/oEx4wCjvvAjg0IjpkEHPeDHe0Ex8wCjgfAjg6CYxYBx4Ngx2CCY1YBx0NgxxCCYzYBx8Ngx1CCY3YBxyNgxzCCYw4Bx6Ngx4YEx5wCjsfAjo0Ijn4CjsfBjo0Jjv4CjifAjk0IjgECjifBjk0JjiYBx1Ngx2YER7OA42mwY3OCo0XA8QzYsQXB0SrgeBbs2JLgGCjgeA7s2IrgaBNwPA92bE1wDBJwvAB2bENwzCXgeBHs2JbgmFvA8RLYsR3BMY+A42WwY3uCY14Bxytgxw4Ex3wCjlfBjh0JjvkFHK+BHTsRHAsIOF4HO3YmOBYUcLwBduxCcCwk4HgT7NiV4FhYwPEW2LEbwbGIgONtsGN3gmNRAcc7YMceBMdiAo53wY49CY7FBRzvgR17ERxLCDjeBzv2JjiWFHB8AHbsQ3AsJeD4EOzYl+BYWsDxEdixH8GxjIDjY7Bjf4JjWQHHJ2DHAQTHcgKOT8GOAwmO5QUcn4EdBxEcKwg4Pgc7DiY4VhRwfAF2HEJwrCTg+BLsOJTgWFnA8RXYcRjBsYqA42uw43CCY1UBxzdgxxEEx2oCjm/BjiMJjtUFHN+BHUcRHGsIOL4HO44mONYUcPwAdhxDcKwl4PgR7DiW4FhbwPET2HEcwbGOgONnsON4gmNdAccvYMcJBMd6Ao5fwY4TCY71BRy/gR0nERwbCDh+BztOJjjaBRx/gB2nEBwdAo4/wY5TCY7BAo6RPLGO0wiOIQKObmDH6QTHUAFHd7DjDIJjmICjB9hxJsGxoYBjZLDjLIJjIwHHKGDH2QTHxgKOnmDHOQTHJgKOUcGOcwmOTQUcvcCO8wiOzQQco4Ed5xMcmws4eoMdFxAcWwg4Rgc7LiQ4thRwjAF2XERwbCXgGBPsuJjg2FrAMRbYcQnBsY2Aow/YcSnBsa2AY2yw4zKCYzsBxzhgx+UEx/YCjr5gxxUExw4CjnHBjisJjh0FHOOBHVcRHDsJOMYHO64mOHYWcEwAdlxDcOwi4JgQ7LiW4NhVwDER2HEdwbGbgGNisON6gmN3AcckYMcNBMceAo5JwY4bCY49BRyTgR03ERx7gR3dwI7O7s2E7t4C3VsI3X0EurcSuvsKdG8jdPcT6N5O6O4v0L2D0D1AoHsnoXugQPcuQvcgge7dhO7BAt17CN1DBLr3ErqHCnTvI3QPE+jeT+geLtB9gNA9QqD7IKF7pED3IUL3KIHuw4Tu0QLdRwjdYwS6jxK6xwp0HyN0jxPoPk7oHi/QfYLQPUGg+yShe6JA9ylC9ySB7tOE7skC3WcI3VMEus8SuqcKdJ8jdE8T6D5P6J4u0H2B0D1DoPsioXumwT9P/xTe/Bn4ebpzrC8Ex1kCjl+Bjl8ixkM7zhZw/AZ2/EZwnCPg+B3s+J3gOFfA8QfY8QfBcZ7Bn1/fRzwv/OP4+FvtZpOf3W6xWW0Wu8Me3u8fYDbbgwJNdpMj2GSx2SxBIXabNdBmdoRa/P2CzCarLdQW5rCGBQb4ffLEGc4XmIs/wXPxJ2EuLhBYQ5gWvIYwLcFxoYBjOrBjOoLjIgHH9GDH9ATHxQKOGcCOGQiOSwz+XL0gfAxnO7p7qcDza6So2OdX53hox2UCjm5gRzeC43IBR3ewozvBcYWAowfY0YPguFLAMTLYMTLBcZXBn19Pho/xiXBdsVrg+iwb+PosG8FxjYBjdrBjdoLjWgHHHGDHHATHdQKOOcGOOQmO6wUc/cCOfgTHDQKO/mBHf4LjRgHHALBjAMFxk4CjCexoIjhuFnA0gx3NBMctAo4WsKOF4LhVwNEKdrQSHLcJOAaCHQMJjtsN/r7CqCic9+13CMwfG3D+LIzEcdxp8PmziNS96w+bP+MixkM77hZwDAI7BhEc9wg45gI75iI47hVwzA12zE1w3CfgmAfsmIfguP8Pe54ZTbreOyDwOWQU8OeQUQifQx4UcPQEO3oSHA8JOEYFO0YlOB4WcPQCO3oRHI8IOEYDO0YjOB4VcPQGO3oTHI8JOEYHO0YnOB4XcIwBdoxBcDwh4BgT7BiT4HhSwDEW2DEWwfGUgKMP2NGH4HhawDE22DE2wfGMgGMcsGMcguNZAUdfsKMvwfGcgGNcsGNcguN5Acd4YMd4BMcLAo7xwY7xCY4XBRwTgB0TEBwvCTgmBDsmJDheFnBMBHZMRHC8IuCYGOyYmOB4VcAxCdgxCcHxmoBjUrBjUoLjdQHHZGDHZATHGwKOycGOyQmONwUcU4AdUxAcbwk4pgQ7piQ43hZwTAV2TEVwvCPgmBrsmJrgeFfAMQ3YMQ3B8Z6AY1qwY1qC430Bx3Rgx3QExwcCjunBjukJjg8FHDOAHTMQHB8JOGYEO2YkOD4WcMwEdsxEcHwi4JgZ7JiZ4PhUwDEL2DELwfGZgGNWsGNWguNzAcdsYMdsBMcXAo7ZwY7ZCY4vBRxzgB1zEBxfCTjmBDvmJDi+FnD0Azv6ERzfCDj6gx39CY5vBRwDwI4BBMd3Ao4msKOJ4PhewNEMdjQTHD8IOFrAjhaC40cBRyvY0Upw/CTgGAh2DCQ4fhZwtIEdbQTHLwKOQWDHIILjVwHHXGDHXATHbwKOucGOuQmO3wUc84Ad8xAcfwg45gU75iU4/hRwzAd2zEdwjORlfMf8YMf8BEc3AccCYMcCBEd3AceCYMeCBEcPAcdCYMdCBMfIAo6FwY6FCY5RBByLgB2LEBw9BRyLgh2LEhyjCjgWAzsWIzh6CTgWBzsWJzhGE3AsAXYsQXD0FnAsCXYsSXCMLuBYCuxYiuAYQ8CxNNixNMExpoBjGbBjGYJjLAHHsmDHsgRHHwHHcmDHcgTH2AKO5cGO5QmOcQQcK4AdKxAcfQUcK4IdKxIc4wo4VgI7ViI4xhNwrAx2rExwjC/gWAXsWIXgmEDAsSrYsSrBMaGAYzWwYzWCYyIBx+pgx+oEx8QCjjXAjjUIjkkEHGuCHWsSHJMKONYCO9YiOCYTcKwNdqxNcEwu4FgH7FiH4JhCwLEu2LEuwTGlgGM9sGM9gmMqAcf6YMf6BMfUAo4NwI4NCI5pBBztYEc7wTGtgKMD7OggOKYTcAwGOwYTHNMLOIaAHUMIjhkEHEPBjqEEx4wCjmFgxzCCYyYBx4Zgx4YEx8wCjo3Ajo0IjlkEHBuDHRsTHLMKODYBOzYhOGYTcGwKdmxKcMwu4NgM7NiM4JhDwLE52LE5wTGngGMLsGMLgqOfgGNLsGNLgqO/gGMrsGMrgmOAgGNrsGNrgqNJwLEN2LENwdEs4NgW7NiW4GgRcGwHdmxHcLQKOLYHO7YnOAYKOHYAO3YgONoEHDuCHTsSHIMEHDuBHTsRHHMJOHYGO3YmOOYWcOwCduxCcMwj4NgV7NiV4JhXwLEb2LEbwTGfgGN3sGN3gmN+AcceYMceBMcCAo49wY49CY4FBRx7gR17ERwLCTj2Bjv2JjgWFnDsA3bsQ3AsIuDYF+zYl+BYVMCxH9ixH8GxmIBjf7Bjf4JjcQHHAWDHAQTHEgKOA8GOAwmOJQUcB4EdBxEcSwk4DgY7DiY4lhZwHAJ2HEJwLCPgOBTsOJTgWFbAcRjYcRjBsZyA43Cw43CCY3kBxxFgxxEExwoCjiPBjiMJjhUFHEeBHUcRHCsJOI4GO44mOFYWcBwDdhxDcKwi4DgW7DiW4FhVwHEc2HEcwbGagON4sON4gmN1AccJYMcJBMcaAo4TwY4TCY41BRwngR0nERxrCThOBjtOJjjWFnCcAnacQnCsI+A4Few4leBYV8BxGthxGsGxnoDjdLDjdIJjfQHHGWDHGQTHBgKOM8GOMwmOdrCjG9jxVPgYTkt0t8Pg3adJ3cEG7z5D6g4xePdZUneowbvPkbrDDN59ntTd0ODdF0jdjQzefZHU3djg3ZdI3U0M3n2Z1N3U4N1XSN3NDN59ldTd3ODd10jdLQzefZ3U3dLg3TdI3a0M3n2T1N3a4N23SN1tDN59m9Td1uDdd0jd7QzefZfU3d7g3fdI3R0M3n2f1N3R4N0PSN2dDN79kNTd2eDdj0jdXQze/ZjU3dXg3U9I3d0M3v2U1N3d4N3PSN09DN79nNTd0+DdL0jdvYDdnhHj/L2Prje0R2t33H677m9vr9/sP2qnWRCuO40at48XbpKxup37CD5Gf00GL5f9df47PyL+u2+Es/N+D5e/c97fJmK7ti7b93PZ/nfj9XfZf+fN/ZeWf+uOPIYDvLCPA/TCm8vhZ58bnsA3eiPGQ59wBxp8AZPT8SbY8SbBcZCA4y2w4y2C42ABx9tgx9sExyECjneAjlfDx7pOcBz6hzlejxgP7ThMwPEu2PEuwXG4gOM9sOM9guMIAcf7YMf7BMeRAo4PwI4PCI6jBBwfgh0fEhxHCzg+Ajs+IjiOEXB8DHZ8THAcK+D4BOz4hOA4TsDxKdjxKcFxvIDjM7DjM4LjBAHH52DH5wTHiQKOL8COLwiOk4y+QJv0/szkP+z9mZbuHMcpBp8/rUjdU8Hdf9/Qn529Bo41zbXZ32o3m/zsdovNarPYHfbwMf0DzGZ7UKDJbnIEmyw2myUoxG6zBtrMjlCLv1+Q2WS1hdrCHNawwID/9EP2acBj5bq/09U+ZHdCTCd8yD7D4B+yO7tn/Acfsr+K9L8PxWe6fGju/sv9rtvN+s2H6673z/7Nh/WzIz6sfx2x3RuX7eeQP4xHHuu54A/jWc3x3HBjzfMy9jnCeUzmeeGfMOcb/ILrdfgz0mfgBdeH8LFmEX7iyQKDX3A5HytzCfNnocD8+QqeP7MJ82eRgOM3sOMcguNiAcfvYMe5BMclAo4/wI7zCI5LBRx/gh3nExyX/YGOCwiOywUcI0XFOi4jOK4QcHQDOy4nOK4UcHQHO64gOK4ScPQAO64kOK4WcIwMdlxFcFxj8NfDzu7VhO61AvMnCnj+HCQ4rhNw9AQ7HiI4rhdwjAp2PExw3CDg6AV2PEJw3CjgGA3seJTguEnA0RvseIzguFnAMTrY8TjBcYuAYwyw4wmC41YBx5hgx5MEx20CjrHAjqcIjtsFHH3AjqcJjjsEHGODHc8QHHcKOMYBO54lOO4ScPQFO54jOO4WcIwLdjxPcNwj4BgP7HiB4LhXwDE+2PEiwXGfgGMCsOMlguN+AceEYMfLBMcDAo6JwI5XCI4HBRwTgx2vEhwPCTgmATteIzgeFnBMCna8TnA8IuCYDOx4g+B4VMAxOdjxJsHxmIBjCrDjLYLjcQHHlGDH2wTHEwKOqcCOdwiOJwUcU4Md7xIcTwk4pgE73iM4nhZwTAt2vE9wPCPgmA7s+IDgeFbAMT3Y8SHB8ZyAYwaw4yOC43kBx4xgx8cExwsCjpnAjk8IjhcFHDODHZ8SHC8JOGYBOz4jOF4WcMwKdnxOcLwi4JgN7PiC4HhVwDE72PElwfGagGMOsOMrguN1AcecYMfXBMcbAo5+YMc3BMebAo7+YMe3BMdbAo4BYMd3BMfbAo4msON7guMdAUcz2PEDwfGugKMF7PiR4HhPwNEKdvxEcLwv4BgIdvxMcHwg4GgDO34hOD4UcAwCO34lOD4ScMwFdvxGcHws4Jgb7Pid4PhEwDEP2PEHwfGpgGNesONPguMzAcd8YMdIhJ+v/FzAMT/Y0Y3g+ELAsQDY0Z3g+FLAsSDY0YPg+ErAsRDYMTLB8bWAY2GwYxSC4xsBxyJgR0+C41sBx6Jgx6gEx3cCjsXAjl4Ex/cCjsXBjtEIjh8EHEuAHb0Jjh8FHEuCHaMTHD8JOJYCO8YgOH4WcCwNdoxJcPwi4FgG7BiL4PhVwLEs2NGH4PhNwLEc2DE2wfG7gGN5sGMcguMPAccKYEdfguNPAceKYMe4BMdI0YzvWAnsGI/g6CbgWBnsGJ/g6C7gWAXsmIDg6CHgWBXsmJDgGFnAsRrYMRHBMYqAY3WwY2KCo6eAYw2wYxKCY1QBx5pgx6QERy8Bx1pgx2QEx2gCjrXBjskJjt4CjnXAjikIjtEFHOuCHVMSHGMIONYDO6YiOMYUcKwPdkxNcIwl4NgA7JiG4Ogj4GgHO6YlOMYWcHSAHdMRHOMIOAaDHdMTHH0FHEPAjhkIjnEFHEPBjhkJjvEEHMPAjpkIjvEFHBuCHTMTHBMIODYCO2YhOCYUcGwMdsxKcEwk4NgE7JiN4JhYwLEp2DE7wTGJgGMzsGMOgmNSAcfmYMecBMdkAo4twI5+BMfkAo4twY7+BMcUAo6twI4BBMeUAo6twY4mgmMqAcc2YEczwTG1gGNbsKOF4JhGwLEd2NFKcEwr4Nge7BhIcEwn4NgB7GgjOKYXcOwIdgwiOGYQcOwEdsxFcMwo4NgZ7Jib4JhJwLEL2DEPwTGzgGNXsGNegmMWAcduYMd8BMesAo7dwY75CY7ZBBx7gB0LEByzCzj2BDsWJDjmEHDsBXYsRHDMKeDYG+xYmODoJ+DYB+xYhODoL+DYF+xYlOAYIODYD+xYjOBoEnDsD3YsTnA0CzgOADuWIDhaBBwHgh1LEhytAo6DwI6lCI6BAo6DwY6lCY42AcchYMcyBMcgAcehYMeyBMdcAo7DwI7lCI65BRyHgx3LExzzCDiOADtWIDjmFXAcCXasSHDMJ+A4CuxYieCYX8BxNNixMsGxgIDjGLBjFYJjQQHHsWDHqgTHQgKO48CO1QiOhQUcx4MdqxMciwg4TgA71iA4FhVwnAh2rElwLCbgOAnsWIvgWFzAcTLYsTbBsYSA4xSwYx2CY0kBx6lgx7oEx1ICjtPAjvUIjqUFHKeDHesTHMsIOM4AOzYgOJYVcJwJdrQTHMuBHd3Ajs5uB6G7vEB3MKG7gkB3CKG7okB3KKG7kkB3GKG7skB3Q0J3FYHuRoTuqgLdjQnd1QS6mxC6qwt0NyV01xDobkborinQ3ZzQXUuguwWhu7ZAd0tCdx2B7laE7roC3a0J3fUEutsQuusLdLcldDcQ6G5H6LYLdLcndDsEujsQuoMFujsSukMEujsRukMFujsTusMEursQuhsKdHcldDcS6O5G6G4s0N2d0N1EoLsHobupQHdPQnczge5ehO7mBv88fX548wIv3HjOsRYSHFsIOC4COi6MGA/t2FLAcTHYcTHBsZWA4xKw4xKCY2sBx6Vgx6UExzYCjsvAjssIjm0Nfp0yJ+L59R/Hx99qN5v87HaLzWqz2B328H7/ALPZHhRospscwSaLzWYJCrHbrIE2syPU4u8XZDZZbaG2MIc1LDDAb74XzrCdwFxcDp6Lywlzsb3AWsyF4LWYzvHQjh0EHBeBHRcRHDsKOC4GOy4mOHYScFwCdlxCcOws4LgU7LiU4NjF4Nc8R8PHcLaju7sKXKesAF+nrCBcp3QTcFwJdlxJcOwu4LgK7LiK4NhDwHE12HE1wbGngOMasOMagmMvAce1YMe1BMfeBr9OeRc+xnxCdx+B69w14OvcNYTr3L4CjmvBjmsJjv0EHNeBHdcRHPsLOK4HO64nOA4QcNwAdtxAcBwo4LgR7LiR4DhIwHET2HETwXGwgONmsONmguMQAcctYMctBMehAo5bwY5bCY7DBBy3gR23ERyHCzhuBztuJziOEHDcAXbcQXAcKeC4E+y4k+A4SsBxF9hxF8FxtMHfL3zjyflcc4zA/NkNnD/HInEcxxp8/hwndY/7w+bPh4jx0I7jBRz3gB33EBwnCDjuBTvuJThOFHDcB3bcR3CcJOC4H+y4n+A4WcDxANjxAMFxyh/2fP2WdN08VWCdxjrwOo11hPUK0wQc14Md1xMcpws4bgA7biA4zhBw3Ah23EhwnCnguAnsuIngOEvAcTPYcTPBcbaA4xaw4xaC4xwBx61gx60Ex7kCjtvAjtsIjvMEHLeDHbcTHOcLOO4AO+4gOC4QcNwJdtxJcFwo4LgL7LiL4LhIwHE32HE3wXGxgOMesOMeguMSAce9YMe9BMelAo77wI77CI7LBBz3gx33ExyXCzgeADseIDiuEHA8CHY8SHBcKeB4COx4iOC4SsDxMNjxMMFxtYDjEbDjEYLjGgHHo2DHowTHtQKOx8COxwiO6wQcj4MdjxMc1ws4ngA7niA4bhBwPAl2PElw3CjgeArseIrguEnA8TTY8TTBcbOA4xmw4xmC4xYBx7Ngx7MEx60CjufAjucIjtsEHM+DHc8THLcLOF4AO14gOO4QcLwIdrxIcNwp4HgJ7HiJ4LhLwPEy2PEywXG3gOMVsOMVguMeAcerYMerBMe9Ao7XwI7XCI77BByvgx2vExz3CzjeADveIDgeEHC8CXa8SXA8KOB4C+x4i+B4SMDxNtjxNsHxsIDjHbDjHYLjEQHHu2DHuwTHowKO98CO9wiOxwQc74Md7xMcjws4PgA7PiA4nhBwfAh2fEhwPCng+Ajs+IjgeErA8THY8THB8bSA4xOw4xOC4xkBx6dgx6cEx7MCjs/Ajs8IjucEHJ+DHZ8THM8LOL4AO74gOF4QcHwJdnxJcLwo4PgK7PiK4HhJwPE12PE1wfGygOMbsOMbguMVAce3YMe3BMerAo7vwI7vCI7XBBzfgx3fExyvCzh+ADt+IDjeEHD8CHb8SHC8KeD4Cez4ieB4S8DxM9jxM8HxtoDjF7DjF4LjHQHHr2DHrwTHuwKO38CO3wiO9wQcv4MdvxMc7ws4/gA7/iA4PhBw/Al2/ElwfCjgGCka1tE5HtrxkYCjG9jRjeD4WMDRHezoTnB8IuDoAXb0IDg+FXCMDHaMTHB8JuAYBewYheD4XMDRE+zoSXB8IeAYFewYleD4UsDRC+zoRXB8JeAYDewYjeD4WsDRG+zoTXB8I+AYHewYneD4VsAxBtgxBsHxnYBjTLBjTILjewHHWGDHWATHDwKOPmBHH4LjRwHH2GDH2ATHTwKOccCOcQiOnwUcfcGOvgTHLwKOccGOcQmOXwUc44Ed4xEcvwk4xgc7xic4fhdwTAB2TEBw/CHgmBDsmJDg+FPAMRHYMRHBMZK38R0Tgx0TExzdBByTgB2TEBzdBRyTgh2TEhw9BByTgR2TERwjCzgmBzsmJzhGEXBMAXZMQXD0FHBMCXZMSXCMKuCYCuyYiuDoJeCYGuyYmuAYTcAxDdgxDcHRW8AxLdgxLcExuoBjOrBjOoJjDAHH9GDH9ATHmAKOGcCOGQiOsQQcM4IdMxIcfQQcM4EdMxEcYws4ZgY7ZiY4xhFwzAJ2zEJw9BVwzAp2zEpwjCvgmA3smI3gGE/AMTvYMTvBMb6AYw6wYw6CYwIBx5xgx5wEx4QCjn5gRz+CYyIBR3+woz/BMbGAYwDYMYDgmETA0QR2NBEckwo4msGOZoJjMgFHC9jRQnBMLuBoBTtaCY4pBBwDwY6BBMeUAo42sKON4JhKwDEI7BhEcEwt4JgL7JiL4JhGwDE32DE3wTGtgGMesGMegmM6Ace8YMe8BMf0Ao75wI75CI4ZBBzzgx3zExwzCjgWADsWIDhmEnAsCHYsSHDMLOBYCOxYiOCYRcCxMNixMMExq4BjEbBjEYJjNgHHomDHogTH7AKOxcCOxQiOOQQci4MdixMccwo4lgA7liA4+gk4lgQ7liQ4+gs4lgI7liI4Bgg4lgY7liY4mgQcy4AdyxAczQKOZcGOZQmOFgHHcmDHcgRHq4BjebBjeYJjoIBjBbBjBYKjTcCxItixIsExSMCxEtixEsExl4BjZbBjZYJjbgHHKmDHKgTHPAKOVcGOVQmOeQUcq4EdqxEc8wk4Vgc7Vic45hdwrAF2rEFwLCDgWBPsWJPgWFDAsRbYsRbBsZCAY22wY22CY2EBxzpgxzoExyICjnXBjnUJjkUFHOuBHesRHIsJONYHO9YnOBYXcGwAdmxAcCwh4GgHO9oJjiUFHB1gRwfBsZSAYzDYMZjgWFrAMQTsGEJwLCPgGAp2DCU4lhVwDAM7hhEcywk4NgQ7NiQ4lhdwbAR2bERwrCDg2Bjs2JjgWFHAsQnYsQnBsZKAY1OwY1OCY2UBx2Zgx2YExyoCjs3Bjs0JjlXBjm5gx/fhYzgt0d3VDN79gdRd3eDdH0ndNQze/YnUXdPg3Z9J3bUM3v2F1F3b4N1fSd11DN79jdRd1+Dd30nd9Qze/YPUXd/g3T9J3Q0M3u0ckNFtN3i3G6nbYfBud1J3sMG7PUjdIQbvjkzqDjV4dxRSd5jBuz1J3Q0N3h2V1N3I4N1epO7GBu+ORupuYvBub1J3U4N3Ryd1NzN4dwxSd3ODd8ckdbcweHcsUndLg3f7kLpbGbw7Nqm7tcG745C62xi825fU3dbg3XFJ3e2A3Z4R4/y9j643tEc7d9x+u+5ve+/f7D9qp1kQrjuNGreDN26Ssbqd+wg+Rn9NBi+X/XX+Oz8i/rtjhLPzfg+Xv3Pe3z5iuw4u23dy2f5343V22X/nzf2Xln/rjjyGXbyxjwP0wps+4cgDvXDjDYgYD33C7WrwBUxOx0Fgx0EEx24CjoPBjoMJjt0FHIeAHYcQHHsIOA4FOw4lOPYUcBwGdOwXPtYAgmOvP8xxQMR4aMfeAo7DwY7DCY59BBxHgB1HEBz7CjiOBDuOJDj2E3AcBXYcRXDsL+A4Guw4muA4QMBxDNhxDMFxoIDjWLDjWILjIAHHcWDHcQTHwQKO48GO4wmOQwQcJ4AdJxAchwo4TgQ7TiQ4DhNwnAR2nERwHC7gOBnsOJngOELAcQrYcQrBcaSA41Sw41SC4yiDL6joT3rfdfQf9r5rG3eO4xiDz5+2pO6x4O6/b+7g/UzghhtrnGuzv9VuNvnZ7Rab1WaxO+zhY/oHmM32oECT3eQINllsNktQiN1mDbSZHaEWf78gs8lqC7WFOaxhgQH/6SKkccBj5bq/49UWITkhxhMWIU0w+CIkZ/eE/2ARUny3/y0amuiyqMj9l/tdt5v0m8VHrvdP/s1ipskRi5kSRGyX0GX7KeTFSshjPRW8WInVHAQ8iU7zNvY5wnlMpnnjnzCnG/yCa0b4A2wB8IJrbvhYLQg/EWqGwS+4nI+VqYT5M1Ng/iwCz5+WhPkzS8BxMdixFcFxtoDjErBja4LjHAHHpWDHNgTHuQKOy8CObQmO8wQcl4Md2xEc5/+Bju0JjgsEHFeAHbsRHBcKOK4EO3YnOC4ScFwFduxBcFws4Lga7NiT4LhEwHEN2LEXwXGpgONasGNvguMyg78/4+zuQ+heLjB/1oHnzzSC4woBx/Vgx+kEx5UCjhvAjjMIjqsEHDeCHWcSHFcLOG4CO84iOK4RcNwMdpxNcFwr4LgF7DiH4LhOwHEr2HEuwXG9gOM2sOM8guMGAcftYMf5BMeNAo47wI4LCI6bBBx3gh0XEhw3CzjuAjsuIjhuEXDcDXZcTHDcKuC4B+y4hOC4TcBxL9hxKcFxu4DjPrDjMoLjDgHH/WDH5QTHnQKOB8COKwiOuwQcD4IdVxIcdws4HgI7riI47hFwPAx2XE1w3CvgeATsuIbguE/A8SjYcS3Bcb+A4zGw4zqC4wEBx+Ngx/UEx4MCjifAjhsIjocEHE+CHTcSHA8LOJ4CO24iOB4RcDwNdtxMcDwq4HgG7LiF4HhMwPEs2HErwfG4gOM5sOM2guMJAcfzYMftBMeTAo4XwI47CI6nBBwvgh13EhxPCzheAjvuIjieEXC8DHbcTXA8K+B4Bey4h+B4TsDxKthxL8HxvIDjNbDjPoLjBQHH62DH/QTHiwKON8COBwiOlwQcb4IdDxIcLws43gI7HiI4XhFwvA12PExwvCrgeAfseITgeE3A8S7Y8SjB8bqA4z2w4zGC4w0Bx/tgx+MEx5sCjg/AjicIjrcEHB+CHU8SHG8LOD4CO54iON4RcHwMdjxNcLwr4PgE7HiG4HhPwPEp2PEswfG+gOMzsOM5guMDAcfnYMfzBMeHAo4vwI4XCI6PBBxfgh0vEhwfCzi+AjteIjg+EXB8DXa8THB8KuD4Bux4heD4TMDxLdjxKsHxuYDjO7DjNYLjCwHH92DH6wTHlwKOH8CONwiOrwQcP4IdbxIcXws4fgI73iI4vhFw/Ax2vE1wfCvg+AXseIfg+E7A8SvY8S7B8b2A4zew4z2C4wcBx+9gx/sEx48Cjj/Ajg8Ijp8EHH+CHR8SHD8LOEaKhnV8RHD8IuDoBnZ8THD8KuDoDnZ8QnD8JuDoAXZ8SnD8LuAYGez4jOD4Q8AxCtjxOcHxp4CjJ9jxBcExUnTjO0YFO74kOLoJOHqBHV8RHN0FHKOBHV8THD0EHL3Bjm8IjpEFHKODHd8SHKMIOMYAO74jOHoKOMYEO74nOEYVcIwFdvxAcPQScPQBO34kOEYTcIwNdvxEcPQWcIwDdvxMcIwu4OgLdvxCcIwh4BgX7PiV4BhTwDEe2PEbwTGWgGN8sON3gqOPgGMCsOMPgmNsAceEYMefBMc4Ao6JwI6RvPGOvgKOicGObgTHuAKOScCO7gTHeAKOScGOHgTH+AKOycCOkQmOCQQck4MdoxAcEwo4pgA7ehIcEwk4pgQ7RiU4JhZwTAV29CI4JhFwTA12jEZwTCrgmAbs6E1wTCbgmBbsGJ3gmFzAMR3YMQbBMYWAY3qwY0yCY0oBxwxgx1gEx1QCjhnBjj4Ex9QCjpnAjrEJjmkEHDODHeMQHNMKOGYBO/oSHNMJOGYFO8YlOKYXcMwGdoxHcMwg4Jgd7Bif4JhRwDEH2DEBwTGTgGNOsGNCgmNmAUc/sGMigmMWAUd/sGNigmNWAccAsGMSgmM2AUcT2DEpwTG7gKMZ7JiM4JhDwNECdkxOcMwp4GgFO6YgOPoJOAaCHVMSHP0FHG1gx1QExwABxyCwY2qCo0nAMRfYMQ3B0SzgmBvsmJbgaBFwzAN2TEdwtAo45gU7pic4Bgo45gM7ZiA42gQc84MdMxIcgwQcC4AdMxEccwk4FgQ7ZiY45hZwLAR2zEJwzCPgWBjsmJXgmFfAsQjYMRvBMZ+AY1GwY3aCY34Bx2JgxxwExwICjsXBjjkJjgUFHEuAHf0IjoUEHEuCHf0JjoUFHEuBHQMIjkUEHEuDHU0Ex6ICjmXAjmaCYzEBx7JgRwvBsbiAYzmwo5XgWELAsTzYMZDgWFLAsQLY0UZwLCXgWBHsGERwLC3gWAnsmIvgWEbAsTLYMTfBsayAYxWwYx6CYzkBx6pgx7wEx/ICjtXAjvkIjhUEHKuDHfMTHCsKONYAOxYgOFYScKwJdixIcKws4FgL7FiI4FhFwLE22LEwwbGqgGMdsGMRgmM1Ace6YMeiBMfqAo71wI7FCI41BBzrgx2LExxrCjg2ADuWIDjWEnC0gx1LEhxrCzg6wI6lCI51BByDwY6lCY51BRxDwI5lCI71BBxDwY5lCY71BRzDwI7lCI4NBBwbgh3LExztAo6NwI4VCI4OAcfGYMeKBMdgAccmYMdKBMcQAcemYMfKBMdQAcdmYMcqBMcwAcfmYMeqBMeGYEc3sKOzuxqhu5FAd3VCd2OB7hqE7iYC3TUJ3U0FumsRupsJdNcmdDcX6K5D6G4h0F2X0N1SoLseobuVQHd9Qndrge4GhO42At12QndbgW4HobudQHcwobu9QHcIobuDQHcoobujQHcYobuTQHdDQndnge5GhO4uAt2NCd1dBbqbELq7CXQ3JXR3F+huRujuIdDdnNDdU6C7BaG7l0B3S0J3b4HuVoTuPgLdrQndfQW62xC6+wl0tyV09xfobkfoHmDwz9OnhzfP8AZ+Ph8+1kyC40ABx1lAx5kR46EdBwk4zgY7ziY4DhZwnAN2nENwHCLgOBfsOJfgOFTAcR7YcR7BcZiA43yw43yC43CDX+9NibhO+cfx8bfazSY/u91is9osdoc9vN8/wGy2BwWa7CZHsMlis1mCQuw2a6DN7Ai1+PsFmU1WW6gtzGENCwzwm+6NMxwhMBcXgOfiAsJcHCmwprUDeE2rczy04ygBx45gx44Ex9ECjp3Ajp0IjmMEHDuDHTsTHMcKOHYBO3YhOI4TcOwKduxKcBxv8GvHV+FjONvR3RMErvcWgq/3FhKu9yYKOC4COy4iOE4ScFwMdlxMcJws4LgE7LiE4DhFwHEp2HEpwXGqgOMysOMyguM0AcflYMflBMfpBr/eSxw+4HRC9wyB1wt9wa8X+hJeL8wUcOwHduxHcJwl4Ngf7Nif4DhbwHEA2HEAwXGOgONAsONAguNcAcdBYMdBBMd5Ao6DwY6DCY7zBRyHgB2HEBwXCDgOBTsOJTguFHAcBnYcRnBcJOA4HOw4nOC4WMBxBNhxBMFxiYDjSLDjSILjUgHHUWDHUQTHZQKOo8GOowmOywUcx4AdxxAcVwg4jgU7jiU4rhRwHAd2HEdwXGXwzwFmenHWfawWmD/jgfPndSSO4xqDz583pO61f9j8mRsxHtpxnYDjBLDjBILjegHHiWDHiQTHDQKOk8COkwiOGwUcJ4MdJxMcNwk4TgE7TiE4bhZwnAp2nEpw3PKHXffMIr3+2Cqwjm0FeB3bCsJ6rm0CjivBjisJjtsFHFeBHVcRHHcIOK4GO64mOO4UcFwDdlxDcNwl4LgW7LiW4LhbwHEd2HEdwXGPgON6sON6guNeAccNYMcNBMd9Ao4bwY4bCY77BRw3gR03ERwPCDhuBjtuJjgeFHDcAnbcQnA8JOC4Fey4leB4WMBxG9hxG8HxiIDjdrDjdoLjUQHHHWDHHQTHYwKOO8GOOwmOxwUcd4EddxEcTwg47gY77iY4nhRw3AN23ENwPCXguBfsuJfgeFrAcR/YcR/B8YyA436w436C41kBxwNgxwMEx3MCjgfBjgcJjucFHA+BHQ8RHC8IOB4GOx4mOF4UcDwCdjxCcLwk4HgU7HiU4HhZwPEY2PEYwfGKgONxsONxguNVAccTYMcTBMdrAo4nwY4nCY7XBRxPgR1PERxvCDieBjueJjjeFHA8A3Y8Q3C8JeB4Fux4luB4W8DxHNjxHMHxjoDjebDjeYLjXQHHC2DHCwTHewKOF8GOFwmO9wUcL4EdLxEcHwg4XgY7XiY4PhRwvAJ2vEJwfCTgeBXseJXg+FjA8RrY8RrB8YmA43Ww43WC41MBxxtgxxsEx2cCjjfBjjcJjs8FHG+BHW8RHF8ION4GO94mOL4UcLwDdrxDcHwl4HgX7HiX4PhawPEe2PEewfGNgON9sON9guNbAccHYMcHBMd3Ao4PwY4PCY7vBRwfgR0fERw/CDg+Bjs+Jjh+FHB8AnZ8QnD8JOD4FOz4lOD4WcDxGdjxGcHxi4Djc7Djc4LjVwHHF2DHFwTHbwKOL8GOLwmO3wUcX4EdXxEcfwg4vgY7viY4/hRwfAN2fENwjBTD+I5vwY5vCY5uAo7vwI7vCI7uAo7vwY7vCY4eAo4fwI4fCI6RBRw/gh0/EhyjCDh+Ajt+Ijh6Cjh+Bjt+JjhGFXD8Anb8QnD0EnD8Cnb8SnCMJuD4Dez4jeDoLeD4Hez4neAYXcDxB9jxB8ExhoDjT7DjT4JjTAHHSNGxjs7x0I6xBBzdwI5uBEcfAUd3sKM7wTG2gKMH2NGD4BhHwDEy2DEywdFXwDEK2DEKwTGugKMn2NGT4BhPwDEq2DEqwTG+gKMX2NGL4JhAwDEa2DEawTGhgKM32NGb4JhIwDE62DE6wTGxgGMMsGMMgmMSAceYYMeYBMekAo6xwI6xCI7JBBx9wI4+BMfkAo6xwY6xCY4pBBzjgB3jEBxTCjj6gh19CY6pBBzjgh3jEhxTCzjGAzvGIzimEXCMD3aMT3BMK+CYAOyYgOCYTsAxIdgxIcExvYBjIrBjIoJjBgHHxGDHxATHjAKOScCOSQiOmQQck4IdkxIcMws4JgM7JiM4ZhFwTA52TE5wzCrgmALsmILgmE3AMSXYMSXBMbuAYyqwYyqCYw4Bx9Rgx9QEx5wCjmnAjmkIjn4CjmnBjmkJjv4CjunAjukIjgECjunBjukJjiYBxwxgxwwER7OAY0awY0aCo0XAMRPYMRPB0SrgmBnsmJngGCjgmAXsmIXgaBNwzAp2zEpwDBJwzAZ2zEZwzCXgmB3smJ3gmFvAMQfYMQfBMY+AY06wY06CY14BRz+wox/BMZ+Aoz/Y0Z/gmF/AMQDsGEBwLCDgaAI7mgiOBQUczWBHM8GxkICjBexoITgWFnC0gh2tBMciAo6BYMdAgmNRAUcb2NFGcCwm4BgEdgwiOBYXcMwFdsxFcCwh4Jgb7Jib4FhSwDEP2DEPwbGUgGNesGNegmNpAcd8YMd8BMcyAo75wY75CY5lBRwLgB0LEBzLCTgWBDsWJDiWF3AsBHYsRHCsIOBYGOxYmOBYUcCxCNixCMGxkoBjUbBjUYJjZQHHYmDHYgTHKgKOxcGOxQmOVQUcS4AdSxAcqwk4lgQ7liQ4VhdwLAV2LEVwrCHgWBrsWJrgWFPAsQzYsQzBsZaAY1mwY1mCY20Bx3Jgx3IExzoCjuXBjuUJjnUFHCuAHSsQHOsJOFYEO1YkONYXcKwEdqxEcGwg4FgZ7FiZ4GgXcKwCdqxCcHQIOFYFO1YlOAYLOFYDO1YjOIYIOFYHO1YnOIYKONYAO9YgOIYJONYEO9YkODYUcKwFdqxFcGwk4Fgb7Fib4NhYwLEO2LEOwbGJgGNdsGNdgmNTAcd6YMd6BMdmAo71wY71CY7NBRwbgB0bEBxbCDjawY52gmNLAUcH2NFBcGwl4BgMdgwmOLYWcAwBO4YQHNsIOIaCHUMJjm0FHMPAjmEEx3YCjg3Bjg0Jju0FHBuBHRsRHDsIODYGOzYmOHYUcGwCdmxCcOwk4NgU7NiU4NhZwLEZ2LEZwbGLgGNzsGNzgmNXAccWYMcWBMduAo4twY4tCY7dBRxbgR1bERx7CDi2Bju2Jjj2FHBsA3ZsQ3DsJeDYFuzYluDYW8CxHdixHcGxj4Bje7Bje4JjXwHHDmDHDgTHfgKOHcGOHQmO/QUcO4EdOxEcBwg4dgY7diY4DhRw7AJ27EJwHCTg2BXs2JXgOFjAsRvYsRvBcYiAY3ewY3eC41ABxx5gxx4Ex2ECjj3Bjj0JjsMFHHuBHXsRHEcIOPYGO/YmOI4UcOwDduxDcBwl4NgX7NiX4DhawLEf2LEfwXGMgGN/sGN/guNYAccBYMcBBMdxYEc3sGOS8AGdluju8QbvTkrqnmDw7mSk7okG705O6p5k8O4UpO7JBu9OSeqeYvDuVKTuqQbvTk3qnmbw7jSk7ukG705L6p5h8O50pO6ZBu9OT+qeZfDuDKTu2QbvzkjqnmPw7kyk7rkG785M6p5n8O4spO75Bu/OSupeYPDubKTuhQbvzk7qXmTw7hyk7sUG785J6l5i8G4/UvdSg3f7k7qXGbw7gNS93ODdJlL3CoN3m0ndKw3ebSF1rzJ4t5XUvdrg3YGk7jUG77aRutcCuz0jxvl7H11vaI+O7rj9dt3fdTF+s/+onWZBuO40atz1MXCTjNXt3EfwMfprMni57K/z3/kR8d8bIpyd93u4/J3z/k4R23V22X6jy/a/G2+Ty/47b+6/tPxbd+Qx3BwD+zhAL7zp4PwChTduvC4R46FPuFsMvoDJ6dgN7NiN4LhVwLE72LE7wXGbgGMPsGMPguN2AceeYMeeBMcdAo69wI69CI47BRx7Ax07Ob+ISnDc9Yc5dokYD+24W8CxD9ixD8Fxj4BjX7BjX4LjXgHHfmDHfgTHfQKO/cGO/QmO+wUcB4AdBxAcDwg4DgQ7DiQ4HhRwHAR2HERwPCTgOBjsOJjgeFjAcQjYcQjB8YiA41Cw41CC41EBx2Fgx2EEx2MCjsPBjsMJjscFHEeAHUcQHE8IOI4EO44kOJ4UcBwFdhxFcDwl4Dga7Dia4HhawHEM2HEMwfGMgONYsONYguNZgy8460z6POXcH/Z5Snt3juN5g8+fDqTuC+Duv2/u4P3M7YYb66Jrs7/Vbjb52e0Wm9VmsTvs4WP6B5jN9qBAk93kCDZZbDZLUIjdZg20mR2hFn+/ILPJagu1hTmsYYEB/+kizYvAY+W6v5fUFmk6IS4RFmleNvgiTWf35f9gkWYut/8tqrzisujS/Zf7Xbe7+pvFma73X/vNYs9rEYs9c0dsl8dl++vkxZzIY30DvJiT1VwPeBK9GcPY5wjnMbkZA/+EecvgF1wTwi8SZgAvuKY6PxAj/MS82wa/4HI+Vm4Q5s8dgfkzCzx/BhHmz10Bx9lgx8EEx3sCjnPAjkMIjvcFHOeCHYcSHB8IOM4DOw4jOD4UcJwPdhxOcHwk4LgA7DiC4Pj4D3QcSXB8IuC4EOw4keD4VMBxEdhxEsHxmYDjYrDjZILjcwHHJWDHKQTHFwKOS8GOUwmOLwUcl4EdpxEcXwk4Lgc7Tic4vjb4+4XO7hmE7jcC82cFeP5sIzi+FXBcCXbcTnB8J+C4Cuy4g+D4XsBxNdhxJ8Hxg4DjGrDjLoLjRwHHtWDH3QTHTwKO68COewiOnwUc14Md9xIcvwg4bgA77iM4fhVw3Ah23E9w/CbguAnseIDg+F3AcTPY8SDB8YeA4xaw4yGC408Bx61gx8MEx0gxje+4Dex4hODoJuC4Hex4lODoLuC4A+x4jODoIeC4E+x4nOAYWcBxF9jxBMExioDjbrDjSYKjp4DjHrDjKYJjVAHHvWDH0wRHLwHHfWDHMwTHaAKO+8GOZwmO3gKOB8CO5wiO0QUcD4IdzxMcYwg4HgI7XiA4xhRwPAx2vEhwjCXgeATseIng6CPgeBTseJngGFvA8RjY8QrBMY6A43Gw41WCo6+A4wmw4zWCY1wBx5Ngx+sEx3gCjqfAjjcIjvEFHE+DHW8SHBMIOJ4BO94iOCYUcDwLdrxNcEwk4HgO7HiH4JhYwPE82PEuwTGJgOMFsOM9gmNSAceLYMf7BMdkAo6XwI4PCI7JBRwvgx0fEhxTCDheATs+IjimFHC8CnZ8THBMJeB4Dez4hOCYWsDxOtjxKcExjYDjDbDjM4JjWgHHm2DH5wTHdAKOt8COLwiO6QUcb4MdXxIcMwg43gE7viI4ZhRwvAt2fE1wzCTgeA/s+IbgmFnA8T7Y8S3BMYuA4wOw4zuCY1YBx4dgx/cEx2wCjo/Ajh8IjtkFHB+DHT8SHHMIOD4BO34iOOYUcHwKdvxMcPQTcHwGdvxCcPQXcHwOdvxKcAwQcHwBdvxGcDQJOL4EO34nOJoFHF+BHX8QHC0Cjq/Bjj8JjlYBxzdgx0iE30sWKOD4FuzoRnC0CTi+Azu6ExyDBBzfgx09CI65BBw/gB0jExxzCzh+BDtGITjmEXD8BHb0JDjmFXD8DHaMSnDMJ+D4BezoRXDML+D4FewYjeBYQMDxG9jRm+BYUMDxO9gxOsGxkIDjD7BjDIJjYQHHn2DHmATHIgKOkaJjHWMRHIsKOLqBHX0IjsUEHN3BjrEJjsUFHD3AjnEIjiUEHCODHX0JjiUFHKOAHeMSHEsJOHqCHeMRHEsLOEYFO8YnOJYRcPQCOyYgOJYVcIwGdkxIcCwn4OgNdkxEcCwv4Bgd7JiY4FhBwDEG2DEJwbGigGNMsGNSgmMlAcdYYMdkBMfKAo4+YMfkBMcqAo6xwY4pCI5VBRzjgB1TEhyrCTj6gh1TERyrCzjGBTumJjjWEHCMB3ZMQ3CsKeAYH+yYluBYS8AxAdgxHcGxtoBjQrBjeoJjHQHHRGDHDATHugKOicGOGQmO9QQck4AdMxEc6ws4JgU7ZiY4NhBwTAZ2zEJwtAs4Jgc7ZiU4OgQcU4AdsxEcgwUcU4IdsxMcQwQcU4EdcxAcQwUcU4MdcxIcwwQc04Ad/QiODQUc04Id/QmOjQQc04EdAwiOjQUc04MdTQTHJgKOGcCOZoJjUwHHjGBHC8GxmYBjJrCjleDYXMAxM9gxkODYQsAxC9jRRnBsKeCYFewYRHBsJeCYDeyYi+DYWsAxO9gxN8GxjYBjDrBjHoJjWwHHnGDHvATHdgKOfmDHfATH9gKO/mDH/ATHDgKOAWDHAgTHjgKOJrBjQYJjJwFHM9ixEMGxs4CjBexYmODYRcDRCnYsQnDsKuAYCHYsSnDsJuBoAzsWIzh2F3AMAjsWJzj2EHDMBXYsQXDsKeCYG+xYkuDYS8AxD9ixFMGxt4BjXrBjaYJjHwHHfGDHMgTHvgKO+cGOZQmO/QQcC4AdyxEc+ws4FgQ7lic4DhBwLAR2rEBwHCjgWBjsWJHgOEjAsQjYsRLBcbCAY1GwY2WC4xABx2JgxyoEx6ECjsXBjlUJjsMEHEuAHasRHIcLOJYEO1YnOI4QcCwFdqxBcBwp4Fga7FiT4DhKwLEM2LEWwXG0gGNZsGNtguMYAcdyYMc6BMexAo7lwY51CY7jBBwrgB3rERzHCzhWBDvWJzhOEHCsBHZsQHCcKOBYGexoJzhOEnCsAnZ0EBwnCzhWBTsGExynCDhWAzuGEBynCjhWBzuGEhynCTjWADuGERynCzjWBDs2JDjOEHCsBXZsRHCcKeBYG+zYmOA4S8CxDtixCcFxtoBjXbBjU4LjHAHHemDHZgTHuQKO9cGOzQmO8wQcG4AdWxAc5ws42sGOLQmOCwQcHWDHVgTHhQKOwWDH1gTHRQKOIWDHNgTHxQKOoWDHtgTHJQKOYWDHdgTHpQKODcGO7QmOywQcG4EdOxAclws4NgY7diQ4rhBwbAJ27ERwXCng2BTs2JnguErAsRnYsQvBcbWAY3OwY1eC4xoBxxZgx24Ex7UCji3Bjt0JjusEHFuBHXsQHNcLOLYGO/YkOG4QcGwDduxFcNwo4NgW7Nib4LhJwLEd2LEPwXGzgGN7sGNfguMWAccOYMd+BMetAo4dwY79CY7bBBw7gR0HEBy3Czh2BjsOJDjuEHDsAnYcRHDcKeDYFew4mOC4S8CxG9hxCMFxt4Bjd7DjUILjHgHHHmDHYQTHvQKOPcGOwwmO+wQce4EdRxAc9ws49gY7jiQ4HhBw7AN2HEVwPCjg2BfsOJrgeEjAsR/YcQzB8bCAY3+w41iC4xEBxwFgx3EEx6NgRzewo7N7PKH7mED3BEL3cYHuiYTuEwLdkwjdJwW6JxO6Twl0TyF0nxbonkroPiPQPY3QfVagezqh+5xA9wxC93mB7pmE7gsC3bMI3RcFumcTui8JdM8hdF8W6J5L6L4i0D2P0H1VoHs+ofuaQPcCQvd1ge6FhO4bAt2LCN03BboXE7pvCXQvIXTfFuheSui+I9C9jNB9V6B7OaH7nkD3CkL3fYHulYTuBwLdqwjdDwW6VxO6Hwl0ryF0PxboXkvofmLwz9NvhTffjoEbzznWHYLjUwHHu0DHOxHjoR2fCTjeAzveIzg+F3C8D3a8T3B8IeD4AOz4gOD4UsDxIdjxIcHxlYDjI7DjI4LjawHHx2DHxwTHNwa/br4ecb33j+Pjb7WbTX52u8VmtVnsDnt4v3+A2WwPCjTZTY5gk8VmswSF2G3WQJvZEWrx9wsym6y2UFuYwxoWGOB3KwbO8K3AXHwCnotPCHPxncDa4FHo705Exzu+F3Acjf7uBMHxg4DjGPR3JwiOHwUcx6K/O0Fw/CTgOA793QmC42cBx/Fgx/EExy8CjhPAjhMIjl8Nfg0eP3xAZzu6+5vAdfNT8HXzU8J183cBx2dgx2cExx8Cjs/Bjs8Jjj8FHF+AHV8QHCPFMr7jS7DjS4Kjm4DjK7DjK4Kju4Dja7Dja4Kjh4DjG7DjG4JjZLAj+ro5X/iAtwjdUQw+f5yvu2aCX3fNJLzu8hRwnAV2nEVwjCrgOBvsOJvg6CXgOAfsOIfgGE3AcS7YcS7B0VvAcR7YcR7BMbqA43yw43yCYwwBxwVgxwUEx5gCjgvBjgsJjrEEHBeBHRcRHH0EHBeDHRcTHGMLOC4BOy4hOMYRcFwKdlxKcPQVcFwGdlxGcIwr4Lgc7Lic4BhPwHEF2HEFwTG+gONKsONKgmMCAcdVYMdVBMeEAo6rwY6rCY6JBBzXgB3XEBwTCziuBTuuJTgmMfjnexO9OevikgrMn3XA+ZOAtL4wmcHnT0JSd/I/bP5MjRgP7ZhCwHE92HE9wTGlgOMGsOMGgmMqAceNYMeNBMfUAo6bwI6bCI5pBBw3gx03ExzTCjhuATtuITimE3DcCnbcSnBM/4ddP04ivY7LILDO9y14ne9bwnrXjAKO78CO7wiOmQQc34Md3xMcMws4fgA7fiA4ZhFw/Ah2/EhwzCrg+Ans+IngmE3A8TPY8TPBMbuA4xew4xeCYw4Bx69gx68Ex5wCjt/Ajt8Ijn4Cjt/Bjt8Jjv4Cjj/Ajj8IjgECjj/Bjj8JjiYBx0gxsY7O8dCOZgFHN7CjG8HRIuDoDnZ0JzhaBRw9wI4eBMdAAcfIYMfIBEebgGMUsGMUgmOQgKMn2NGT4JhLwDEq2DEqwTG3gKMX2NGL4JhHwDEa2DEawTGvgKM32NGb4JhPwDE62DE6wTG/gGMMsGMMgmMBAceYYMeYBMeCAo6xwI6xCI6FBBx9wI4+BMfCAo6xwY6xCY5FBBzjgB3jEByLCjj6gh19CY7FBBzjgh3jEhyLCzjGAzvGIziWEHCMD3aMT3AsKeCYAOyYgOBYSsAxIdgxIcGxtIBjIrBjIoJjGQHHxGDHxATHsgKOScCOSQiO5QQck4IdkxIcyws4JgM7JiM4VhBwTA52TE5wrCjgmALsmILgWEnAMSXYMSXBsbKAYyqwYyqCYxUBx9Rgx9QEx6oCjmnAjmkIjtUEHNOCHdMSHKsLOKYDO6YjONYQcEwPdkxPcKwp4JgB7JiB4FhLwDEj2DEjwbG2gGMmsGMmgmMdAcfMYMfMBMe6Ao5ZwI5ZCI71BByzgh2zEhzrCzhmAztmIzg2EHDMDnbMTnC0CzjmADvmIDg6BBxzgh1zEhyDBRz9wI5+BMcQAUd/sKM/wTFUwDEA7BhAcAwTcDSBHU0Ex4YCjmawo5ng2EjA0QJ2tBAcGws4WsGOVoJjEwHHQLBjIMGxqYCjDexoIzg2E3AMAjsGERybCzjmAjvmIji2EHDMDXbMTXBsKeCYB+yYh+DYSsAxL9gxL8GxtYBjPrBjPoJjGwHH/GDH/ATHtgKOBcCOBQiO7QQcC4IdCxIc2ws4FgI7FiI4dhBwLAx2LExw7CjgWATsWITg2EnAsSjYsSjBsbOAYzGwYzGCYxcBx+Jgx+IEx64CjiXAjiUIjt0EHEuCHUsSHLsLOJYCO5YiOPYQcCwNdixNcOwp4FgG7FiG4NhLwLEs2LEswbG3gGM5sGM5gmMfAcfyYMfyBMe+Ao4VwI4VCI79BBwrgh0rEhz7CzhWAjtWIjgOEHCsDHasTHAcKOBYBexYheA4SMCxKtixKsFxsIBjNbBjNYLjEAHH6mDH6gTHoQKONcCONQiOwwQca4IdaxIchws41gI71iI4jhBwrA12rE1wHCngWAfsWIfgOErAsS7YsS7BcbSAYz2wYz2C4xgBx/pgx/oEx7ECjg3Ajg0IjuMEHO1gRzvBcbyAowPs6CA4ThBwDAY7BhMcJwo4hoAdQwiOkwQcQ8GOoQTHyQKOYWDHMILjFAHHhmDHhgTHqQKOjcCOjQiO0wQcG4MdGxMcpws4NgE7NiE4zhBwbAp2bEpwnCng2Azs2IzgOEvAsTnYsTnBcbaAYwuwYwuC4xwBx5Zgx5YEx7kCjq3Ajq0IjvMEHFuDHVsTHOcLOLYBO7YhOC4QcGwLdmxLcFwo4NgO7NiO4LhIwLE92LE9wXGxgGMHsGMHguMSAceOYMeOBMelAo6dwI6dCI7LBBw7gx07ExyXCzh2ATt2ITiuEHDsCnbsSnBcKeDYDezYjeC4SsCxO9ixO8FxtYBjD7BjD4LjGgHHnmDHngTHtQKOvcCOvQiO6wQce4MdexMc1ws49gE79iE4bhBw7At27Etw3Cjg2A/s2I/guEnAsT/YsT/BcbOA4wCw4wCC4xYBx4Fgx4EEx60CjoPAjoMIjtsEHAeDHQcTHLcLOA4BOw4hOO4QcBwKdhxKcNwp4DgM7DiM4LhLwHE42HE4wXG3gOMIsOMIguMeAceRYMeRBMe9Ao6jwI6jCI77BBxHgx1HExz3CziOATuOITgeEHAcC3YcS3A8KOA4Duw4juB4SMBxPNhxPMHxsIDjBLDjBILjEQHHiWDHiQTHowKOk8COkwiOxwQcJ4MdJxMcjws4TgE7TiE4nhBwnAp2nEpwPCngOA3sOI3geErAcTrYcTrB8bSA4wyw4wyC4xkBx5lgx5kEx7MCjrPAjrMIjucEHGeDHWcTHM8LOM4BO84hOF4QcJwLdpxLcLwo4DgP7DiP4HhJwHE+2HE+wfGygOMCsOMCguMVAceFYMeFBMerAo6LwI6LCI7XBBwXgx0XExyvCzguATsuITjeEHBcCnZcSnC8KeC4DOy4jOB4S8BxOdhxOcHxtoDjCrDjCoLjHQHHlWDHlQTHuwKOq8COqwiO9wQcV4MdVxMc7ws4rgE7riE4PhBwXAt2XEtwfCjguA7suI7g+EjAcT3YcT3B8bGA4waw4waC4xMBx41gx40Ex6cCjpvAjpsIjs8EHDeDHTcTHJ8LOG4BO24hOL4QcNwKdtxKcHwp4LgN7LiN4PhKwHE72HE7wfG1gOMOsOMOguMbAcedYMedBMe3Ao67wI67CI7vBBx3gx13ExzfCzjuATvuITh+EHDcC3bcS3D8KOC4D+y4j+D4ScBxP9hxP8Hxs4DjAbDjAYLjFwHHg2DHgwTHrwKOh8COhwiO3wQcD4MdDxMcvws4HgE7HiE4/hBwPAp2PEpw/CngeAzseIzgGMnH+I7HwY7HCY5uAo4nwI4nCI7uAo4nwY4nCY4eAo6nwI6nCI6RBRxPgx1PExyjCDieATueITh6CjieBTueJThGFXA8B3Y8R3D0EnA8D3Y8T3CMJuB4Aex4geDoLeB4Eex4keAYXcDxEtjxEsExhoDjZbDjZYJjTAHHK2DHKwTHWAKOV8GOVwmOPgKO18CO1wiOsQUcr4MdrxMc4wg43gA73iA4+go43gQ73iQ4xhVwvAV2vEVwjCfgeBvseJvgGF/A8Q7Y8Q7BMYGA412w412CY0IBx3tgx3sEx0QCjvfBjvcJjokFHB+AHR8QHJMIOD4EOz4kOCYVcHwEdnxEcEwm4PgY7PiY4JhcwPEJ2PEJwTEF2NEN7Jg/fECnJbo7pcG7C5C6Uxm8uyCpO7XBuwuRutMYvLswqTutwbuLkLrTGby7KKk7vcG7i5G6Mxi8uzipO6PBu0uQujMZvLskqTuzwbtLkbqzGLy7NKk7q8G7y5C6sxm8uyypO7vBu8uRunMYvLs8qTunwbsrkLr9DN5dkdTtb/DuSqTuAIN3VyZ1mwzeXYXUbTZ4d1VSt8Xg3dVI3VaDd1cndQcavLsGqdtm8O6apO4gg3fXInXnMnh3bVJ3boN31yF15zF4d11Sd15gt2fEOH/vo+sN7dHFHbffrvubz+c3+4/aaRaE606jxs3vg5tkrG7nPoKP0V+Twctlf53/zo+//40IZ+f9Hi5/57y/a8R23Vy2L+iy/e/GK+Sy/86b+y8t/9YdeQwL+2AfB+iFN+vDT45bYuDG2xwxHvqEW8TgC5icjlvBjlsJjkUFHLeBHbcRHIsJOG4HO24nOBYXcNwBdtxBcCwh4LgT7LiT4FhSwHEX2HEXwbGUgONuoOPG8LE2ExxL/2GOmyPGQzuWEXDcA3bcQ3AsK+C4F+y4l+BYTsBxH9hxH8GxvIDjfrDjfoJjBQHHA2DHAwTHigKOB8GOBwmOlQQcD4EdDxEcKws4HgY7HiY4VhFwPAJ2PEJwrCrgeBTseJTgWE3A8RjY8RjBsbqA43Gw43GCYw0BxxNgxxMEx5oCjifBjicJjrUEHE+BHU8RHGsLOJ4GO54mONYRcDwDdjxDcKwr4HgW7HiW4FhPwPEc2PEcwbG+gON5sON5gmMDAccLYMcLBEe7wRfkbiJ9Tur4wz4n7eTOcQw2+PzpTOoOAXf/fXMH72cDN9xYoa7N/la72eRnt1tsVpvF7rCHj+kfYDbbgwJNdpMj2GSx2SxBIXabNdBmdoRa/P2CzCarLdQW5rCGBQb8p4vYQ4HHynV/w9QWsTshwgiL2BsafBG7s7vhf7CIvb7b/xadN3JZlO7+y/2u2zX+zeJ11/ub/GYxfJOIxfANIrazu2zflLzYHXmsm4EXu7Oa+wJPos19jH2OcB6T5j74J8wWBr/guhx+kXAbeMF1I3ysp4SfKNrS4BdczsdKM8L8aSUwf+6C588zwvxpLeB4D+z4nODYRsDxPtjxBcGxrYDjA7DjS4JjOwHHh2DHVwTH9gKOj8COrwmOHQQcH4Md3xAcOwo4PgE7viU4dvoDHd8RHDsLOD4FO34nOHYRcHwGdvxBcOwq4Pgc7PiT4NhNwPEF2DFSLLxjdwHHl2BHN4JjDwHHV2BHd4JjTwHH12BHD4JjLwHHN2DHyATH3gZ//9rZHYXQ3Udg/rwFz5+MBMe+Ao7vwI6ZCI79BBzfgx0zExz7Czh+ADtmITgOEHD8CHbMSnAcKOD4CeyYjeA4SMDxM9gxO8FxsIDjF7BjDoLjEAHHr2DHnATHoQKO38COfgTHYQKO38GO/gTH4QKOP8COAQTHEQKOP8GOJoLjSAHHSDGxjmaC4ygBRzewo4XgOFrA0R3saCU4jhFw9AA7BhIcxwo4RgY72giO4wQco4AdgwiO4wUcPcGOuQiOEwQco4IdcxMcJwo4eoEd8xAcJwk4RgM75iU4ThZw9AY75iM4ThFwjA52zE9wnCrgGAPsWIDgOE3AMSbYsSDBcbqAYyywYyGC4wwBRx+wY2GC40wBx9hgxyIEx1kCjnHAjkUJjrMFHH3BjsUIjnMEHOOCHYsTHOcKOMYDO5YgOM4TcIwPdixJcJwv4JgA7FiK4LhAwDEh2LE0wXGhgGMisGMZguMiAcfEYMeyBMfFAo5JwI7lCI5LBByTgh3LExyXCjgmAztWIDguE3BMDnasSHBcLuCYAuxYieC4QsAxJdixMsFxpYBjKrBjFYLjKgHH1GDHqgTH1QKOacCO1QiOawQc04IdqxMc1wo4pgM71iA4rhNwTA92rElwXC/gmAHsWIvguEHAMSPYsTbBcaOAYyawYx2C4yYBx8xgx7oEx80CjlnAjvUIjlsEHLOCHesTHLcKOGYDOzYgOG4TcMwOdrQTHLcLOOYAOzoIjjsEHHOCHYMJjjsFHP3AjiEEx10Cjv5gx1CC424BxwCwYxjBcY+Aowns2JDguFfA0Qx2bERw3CfgaAE7NiY47hdwtIIdmxAcDwg4BoIdmxIcDwo42sCOzQiOhwQcg8COzQmOhwUcc4EdWxAcjwg45gY7tiQ4HhVwzAN2bEVwPCbgmBfs2JrgeFzAMR/YsQ3B8YSAY36wY1uC40kBxwJgx3YEx1MCjgXBju0JjqcFHAuBHTsQHM8IOBYGO3YkOJ4VcCwCduxEcDwn4FgU7NiZ4HhewLEY2LELwfGCgGNxsGNXguNFAccSYMduBMdLAo4lwY7dCY6XBRxLgR17EByvCDiWBjv2JDheFXAsA3bsRXC8JuBYFuzYm+B4XcCxHNixD8HxhoBjebBjX4LjTQHHCmDHfgTHWwKOFcGO/QmOtwUcK4EdBxAc7wg4VgY7DiQ43hVwrAJ2HERwvCfgWBXsOJjgeF/AsRrYcQjB8YGAY3Ww41CC40MBxxpgx2EEx0cCjjXBjsMJjo8FHGuBHUcQHJ8IONYGO44kOD4VcKwDdhxFcHwm4FgX7Dia4PhcwLEe2HEMwfGFgGN9sONYguNLAccGYMdxBMdXAo52sON4guNrAUcH2HECwfGNgGMw2HEiwfGtgGMI2HESwfGdgGMo2HEywfG9gGMY2HEKwfGDgGNDsONUguNHAcdGYMdpBMdPAo6NwY7TCY6fBRybgB1nEBy/CDg2BTvOJDh+FXBsBnacRXD8JuDYHOw4m+D4XcCxBdhxDsHxh4BjS7DjXILjTwHHVmDHeQTHSLGN79ga7Dif4Ogm4NgG7LiA4Ogu4NgW7LiQ4Ogh4NgO7LiI4BhZwLE92HExwTGKgGMHsOMSgqOngGNHsONSgmNUAcdOYMdlBEcvAcfOYMflBMdoAo5dwI4rCI7eAo5dwY4rCY7RBRy7gR1XERxjCDh2BzuuJjjGFHDsAXZcQ3CMJeDYE+y4luDoI+DYC+y4juAYW8CxN9hxPcExjoBjH7DjBoKjr4BjX7DjRoJjXAHHfmDHTQTHeAKO/cGOmwmO8QUcB4AdtxAcEwg4DgQ7biU4JhRwHAR23EZwTCTgOBjsuJ3gmFjAcQjYcQfBMYmA41Cw406CY1IBx2Fgx10Ex2QCjsPBjrsJjskFHEeAHfcQHFMIOI4EO+4lOKYUcBwFdtxHcEwl4Dga7Lif4JhawHEM2PEAwTGNgONYsONBgmNaAcdxYMdDBMd0Ao7jwY6HCY7pBRwngB2PEBwzCDhOBDseJThmFHCcBHY8RnDMJOA4Gex4nOCYWcBxCtjxBMExi4DjVLDjSYJjVgHHaWDHUwTHbAKO08GOpwmO2QUcZ4AdzxAccwg4zgQ7niU45hRwnAV2PEdw9BNwnA12PE9w9BdwnAN2vEBwDBBwnAt2vEhwNAk4zgM7XiI4mgUc54MdLxMcLQKOC8COVwiOVgHHhWDHqwTHQAHHRWDHawRHm4DjYrDjdYJjkIDjErDjDYJjLgHHpWDHmwTH3AKOy8COtwiOeQQcl4MdbxMc8wo4rgA73iE45hNwXAl2vEtwzC/guArseI/gWEDAcTXY8T7BsaCA4xqw4wOCYyEBx7Vgx4cEx8ICjuvAjo8IjkUEHNeDHR8THIsKOG4AOz4hOBYTcNwIdnxKcCwu4LgJ7PiM4FhCwHEz2PE5wbGkgOMWsOMLgmMpAcetYMeXBMfSAo7bwI6vCI5lBBy3gx1fExzLCjjuADu+ITiWE3DcCXZ8S3AsL+C4C+z4juBYQcBxN9jxPcGxooDjHrDjB4JjJQHHvWDHjwTHygKO+8COnwiOVQQc94MdPxMcqwo4HgA7fiE4VhNwPAh2/EpwrC7geAjs+I3gWEPA8TDY8TvBsaaA4xGw4w+CYy0Bx6Ngx58Ex9oCjsfAjpF88I51BByPgx3dCI51BRxPgB3dCY71BBxPgh09CI71BRxPgR0jExwbCDieBjtGITjaBRzPgB09CY4OAcezYMeoBMdgAcdzYEcvgmOIgON5sGM0gmOogOMFsKM3wTFMwPEi2DE6wbGhgOMlsGMMgmMjAcfLYMeYBMfGAo5XwI6xCI5NBByvgh19CI5NBRyvgR1jExybCTheBzvGITg2F3C8AXb0JTi2EHC8CXaMS3BsKeB4C+wYj+DYSsDxNtgxPsGxtYDjHbBjAoJjGwHHu2DHhATHtgKO98COiQiO7QQc74MdExMc2ws4PgA7JiE4dhBwfAh2TEpw7Cjg+AjsmIzg2EnA8THYMTnBsbOA4xOwYwqCYxewoxvY0dmdktDdVaA7FaG7m0B3akJ3d4HuNITuHgLdaQndPQW60xG6ewl0pyd09xbozkDo7iPQnZHQ3VegOxOhu59Ad2ZCd3+B7iyE7gEC3VkJ3QMFurMRugcJdGcndA8W6M5B6B4i0J2T0D1UoNuP0D1MoNuf0D1coDuA0D1CoNtE6B4p0G0mdI8S6LYQukcLdFsJ3WMEugMJ3WMFum2E7nEC3UGE7vEC3bkI3RMEunMTuicKdOchdE8S6M5L6J5s8M/TW4Q3t/TBjeccqxXBcYqAY2ugY6uI8dCOUwUc24Ad2xAcpwk4tgU7tiU4ThdwbAd2bEdwnCHg2B7s2J7gOFPAsQPYsQPBcZaAY0ewY0eC42wBx05gx04ExzkGf/3RNOK6+R/Hx99qN5v87HaLzWqz2B328H7/ALPZHhRospscwSaLzWYJCrHbrIE2syPU4u8XZDZZbaG2MIc1LDDAr4UPznCuwFzsDJ6LnQlzcZ7AGuv36N/1EBPvOF/A8QP6dz0QHBcIOH5E/64HguNCAcdP6N/1QHBcJOD4Gf27HgiOiwUcv6B/1wPBcYmA41f073ogOC4VcPyG/l0PBMdlBn8tkyt8wL9+/ji4e7nA648u4NcfXQivP1YIOHYFO3YlOK4UcOwGduxGcFwl4Ngd7Nid4LhawLEH2LEHwXGNgGNPsGNPguNaAcdeYMdeBMd1Ao69wY69CY7rBRz7gB37EBw3GPz1R3D4gC0I3RsFXr96xsK+fvUk/E6zTQKOUcGOUQmOmwUcvcCOXgTHLQKO0cCO0QiOWwUcvcGO3gTHbQKO0cGO0QmO2wUcY4AdYxAcdwg4xgQ7xiQ47hRwjAV2jEVw3CXg6AN29CE47hZwjA12jE1w3CPgGAfsGIfguFfA0Rfs6Etw3CfgGBfsGJfguF/AMR7YMR7B8YCAY3ywY3yC40EBxwRgxwQEx0MCjgnBjgkJjocFHBOBHRMRHI8IOCYGOyYmOB4VcEwCdkxCcDwm4JgU7JiU4HhcwDEZ2DEZwfGEgGNysGNyguNJg39ufyUGZ93wKYH5kwI4f3KT1l+fNvj8yUPqPvOHzZ8bEeOhHc8KOKYEO6YkOJ4TcEwFdkxFcDwv4Jga7Jia4HhBwDEN2DENwfGigGNasGNaguMlAcd0YMd0BMfLAo7pwY7pCY5XBBwzgB0zEByv/mHX4VdJr4evCXwPoi/4exB9Cd8HuC7g2A/s2I/geEPAsT/YsT/B8aaA4wCw4wCC4y0Bx4Fgx4EEx9sCjoPAjoMIjncEHAeDHQcTHO8KOA4BOw4hON4TcBwKdhxKcLwv4DgM7DiM4PhAwHE42HE4wfGhgOMIsOMIguMjAceRYMeRBMfHAo6jwI6jCI5PBBxHgx1HExyfCjiOATuOITg+E3AcC3YcS3B8LuA4Duw4juD4QsBxPNhxPMHxpYDjBLDjBILjKwHHiWDHiQTH1wKOk8COkwiObwQcJ4MdJxMc3wo4TgE7TiE4vhNwnAp2nEpwfC/gOA3sOI3g+EHAcTrYcTrB8aOA4wyw4wyC4ycBx5lgx5kEx88CjrPAjrMIjl8EHGeDHWcTHL8KOM4BO84hOH4TcJwLdpxLcPwu4DgP7DiP4PhDwHE+2HE+wfGngOMCsOMCgmOkOMZ3XAh2XEhwdBNwXAR2XERwdBdwXAx2XExw9BBwXAJ2XEJwjCzguBTsuJTgGEXAcRnYcRnB0VPAcTnYcTnBMaqA4wqw4wqCo5eA40qw40qCYzQBx1Vgx1UER28Bx9Vgx9UEx+gCjmvAjmsIjjEEHNeCHdcSHGMKOK4DO64jOMYScFwPdlxPcPQRcNwAdtxAcIwt4LgR7LiR4BhHwHET2HETwdFXwHEz2HEzwTGugOMWsOMWgmM8AcetYMetBMf4Ao7bwI7bCI4JBBy3gx23ExwTCjjuADvuIDgmEnDcCXbcSXBMLOC4C+y4i+CYRMBxN9hxN8ExqYDjHrDjHoJjMgHHvWDHvQTH5AKO+8CO+wiOKQQc94Md9xMcUwo4HgA7HiA4phJwPAh2PEhwTC3geAjseIjgmEbA8TDY8TDBMa2A4xGw4xGCYzoBx6Ngx6MEx/QCjsfAjscIjhkEHI+DHY8THDMKOJ4AO54gOGYScDwJdjxJcMws4HgK7HiK4JhFwPE02PE0wTGrgOMZsOMZgmM2AcezYMezBMfsAo7nwI7nCI45BBzPgx3PExxzCjheADteIDj6CTheBDteJDj6CzheAjteIjgGCDheBjteJjiaBByvgB2vEBzNAo5XwY5XCY4WAcdrYMdrBEergON1sON1gmOggOMNsOMNgqNNwPEm2PEmwTFIwPEW2PEWwTGXgONtsONtgmNuAcc7YMc7BMc8Ao53wY53CY55BRzvgR3vERzzCTjeBzveJzjmF3B8AHZ8QHAsIOD4EOz4kOBYUMDxEdjxEcGxkIDjY7DjY4JjYQHHJ2DHJwTHIgKOT8GOTwmORQUcn4EdnxEciwk4Pgc7Pic4FhdwfAF2fEFwLCHg+BLs+JLgWFLA8RXY8RXBsZSA42uw42uCY2kBxzdgxzcExzICjm/Bjm8JjmUFHN+BHd8RHMsJOL4HO74nOJYXcPwAdvxAcKwg4PgR7PiR4FhRwPET2PETwbGSgONnsONngmNlAccvYMcvBMcqAo5fwY5fCY5VBRy/gR2/ERyrCTh+Bzt+JzhWF3D8AXb8QXCsIeD4E+z4k+BYU8AxUmyso3M8tGMtAUc3sKMbwbG2gKM72NGd4FhHwNED7OhBcKwr4BgZ7BiZ4FhPwDEK2DEKwbG+gKMn2NGT4NhAwDEq2DEqwdEu4OgFdvQiODoEHKOBHaMRHIMFHL3Bjt4ExxABx+hgx+gEx1ABxxhgxxgExzABx5hgx5gEx4YCjrHAjrEIjo0EHH3Ajj4Ex8YCjrHBjrEJjk0EHOOAHeMQHJsKOPqCHX0Jjs0EHOOCHeMSHJsLOMYDO8YjOLYQcIwPdoxPcGwp4JgA7JiA4NhKwDEh2DEhwbG1gGMisGMigmMbAcfEYMfEBMe2Ao5JwI5JCI7tBByTgh2TEhzbCzgmAzsmIzh2EHBMDnZMTnDsKOCYAuyYguDYScAxJdgxJcGxs4BjKrBjKoJjFwHH1GDH1ATHrgKOacCOaQiO3QQc04Id0xIcuws4pgM7piM49hBwTA92TE9w7CngmAHsmIHg2EvAMSPYMSPBsbeAYyawYyaCYx8Bx8xgx8wEx74CjlnAjlkIjv0EHLOCHbMSHPsLOGYDO2YjOA4QcMwOdsxOcBwo4JgD7JiD4DhIwDEn2DEnwXGwgKMf2NGP4DhEwNEf7OhPcBwq4BgAdgwgOA4TcDSBHU0Ex+ECjmawo5ngOELA0QJ2tBAcRwo4WsGOVoLjKAHHQLBjIMFxtICjDexoIziOEXAMAjsGERzHCjjmAjvmIjiOE3DMDXbMTXAcL+CYB+yYh+A4QcAxL9gxL8FxooBjPrBjPoLjJAHH/GDH/ATHyQKOBcCOBQiOUwQcC4IdCxIcpwo4FgI7FiI4ThNwLAx2LExwnC7gWATsWITgOEPAsSjYsSjBcaaAYzGwYzGC4ywBx+Jgx+IEx9kCjiXAjiUIjnMEHEuCHUsSHOcKOJYCO5YiOM4TcCwNdixNcJwv4FgG7FiG4LhAwLEs2LEswXGhgGM5sGM5guMiAcfyYMfyBMfFAo4VwI4VCI5LBBwrgh0rEhyXCjhWAjtWIjguE3CsDHasTHBcLuBYBexYheC4QsCxKtixKsFxpYBjNbBjNYLjKgHH6mDH6gTH1QKONcCONQiOawQca4IdaxIc1wo41gI71iI4rhNwrA12rE1wXC/gWAfsWIfguEHAsS7YsS7BcaOAYz2wYz2C4yYBx/pgx/oEx80Cjg3Ajg0IjlsEHO1gRzvBcauAowPs6CA4bhNwDAY7BhMctws4hoAdQwiOOwQcQ8GOoQTHnQKOYWDHMILjLgHHhmDHhgTH3QKOjcCOjQiOewQcG4MdGxMc9wo4NgE7NiE47hNwbAp2bEpw3C/g2Azs2IzgeEDAsTnYsTnB8aCAYwuwYwuC4yEBx5Zgx5YEx8MCjq3Ajq0IjkcEHFuDHVsTHI8KOLYBO7YhOB4TcGwLdmxLcDwu4NgO7NiO4HhCwLE92LE9wfGkgGMHsGMHguMpAceOYMeOBMfTAo6dwI6dCI5nBBw7gx07ExzPCjh2ATt2ITieE3DsCnbsSnA8L+DYDezYjeB4QcCxO9ixO8HxooBjD7BjD4LjJQHHnmDHngTHywKOvcCOvQiOVwQce4MdexMcrwo49gE79iE4XhNw7At27EtwvC7g2A/s2I/geEPAsT/YsT/B8aaA4wCw4wCC4y0Bx4Fgx4EEx9sCjoPAjoMIjncEHAeDHQcTHO8KOA4BOw4hON4TcBwKdhxKcLwv4DgM7DiM4PhAwHE42HE4wfGhgOMIsOMIguMjAceRYMeRBMfHAo6jwI6jCI5PBBxHgx1HExyfCjiOATuOITg+E3AcC3YcS3B8LuA4Duw4juD4QsBxPNhxPMHxpYDjBLDjBILjKwHHiWDHiQTH1wKOk8COkwiObwQcJ4MdJxMc34Id3cCOIeEDOi3R3e8M3h1K6n5v8O4wUvcHg3c3JHV/NHh3I1L3J4N3NyZ1fzZ4dxNS9xeDdzcldX81eHczUvc3g3c3J3V/N3h3C1L3D4N3tyR1/zR4dytSdyRfY3e3JnW7Gby7Danb3eDdbUndHgbvbkfqjmzw7vak7igG7+5A6vY0eHdHUndUg3d3InV7Gby7M6k7msG7u5C6vQ3e3ZXUHd3g3d1I3TEM3t2d1B3T4N09SN2xDN7dk9TtY/DuXqTu2Abv7k3qjmPw7j6kbl9gt2fEOH/vo+sNfp53x+236/7G9f3N/qN2mgXhutOoceP5At/UI3U79xF8jP6aDF4u++v8d35E/Hf8CGfn/R4uf+e8v0fEdj1dtk/gsv3vxkvosv/Om/svLf/WHXkME/liHwfohTf5w0+ORXxw4xWOGA99wk0MfqJhOBYFOxYlOCYRcCwGdixGcEwq4Fgc7Fic4JhMwLEE2LEEwTG5gGNJsGNJgmMKAcdSYMdSBMeUAo6lwY6lCY6pBBzLAB0Lho9VmOCY+g9zLBwxHtoxjYBjWbBjWYJjWgHHcmDHcgTHdAKO5cGO5QmO6QUcK4AdKxAcMwg4VgQ7ViQ4ZhRwrAR2rERwzCTgWBnsWJngmFnAsQrYsQrBMYuAY1WwY1WCY1YBx2pgx2oEx2wCjtXBjtUJjtkFHGuAHWsQHHMIONYEO9YkOOYUcKwFdqxFcPQTcKwNdqxNcPQXcKwDdqxDcAwQcKwLdqxLcDQJONYDO9YjOJoFHOuDHesTHC0Cjg3Ajg0IjlYBRzvY0U5wDBRwdIAdHQRHm4BjMNgxmOAYJOAYAnYMITjmMvgXFgqR1j/k/sPWP3R15zjmMfoXGEndecHdf9/cwfvZ3w03Vj7XZn+r3Wzys9stNqvNYnfYw8f0DzCb7UGBJrvJEWyy2GyWoBC7zRpoMztCLf5+QWaT1RZqC3NYwwID/tMv+eQDHivX/c2v9iUfJ0R+wpd8Chj8Sz5/TYD/4Es+/dz+96Wcgi5f2nH/5X7X7Qr95ss9rvcX/s2XhQpHfFmof8R2A1y2L0L+MhDyWBcFfxmI1bwIeBIt5mvsc4TzmBTzxT9hFjf4BVfD8IuElsALrmbhY02JjXcsYfALLudjpShh/pQUmD+twfNnKmH+lBJwbAN2nEZwLC3g2BbsOJ3gWEbAsR3YcQbBsayAY3uw40yCYzkBxw5gx1kEx/ICjh3BjrMJjhUEHDuBHecQHCsKOHYGO84lOFb6Ax3nERwrCzh2ATuuIDhWEXDsCnZcSXCsKuDYDey4iuBYTcCxO9hxNcGxuoBjD7DjGoJjDQHHnmDHtQTHmgKOvcCO6wiOtQQce4Md1xMcaws49gE7biA41jH45ynO7o2E7roC86cveP5cJzjWE3DsB3a8QXCsL+DYH+x4k+DYQMBxANjxFsHRLuA4EOx4m+DoEHAcBHa8Q3AMFnAcDHa8S3AMEXAcAna8R3AMFXAcCna8T3AME3AcBnZ8QHBsKOA4HOz4kODYSMBxBNjxEcGxsYDjSLDjY4JjEwHHUWDHJwTHpgKOo8GOTwmOzQQcx4AdnxEcmws4jgU7Pic4thBwHAd2fEFwbCngOB7s+JLg2ErAcQLY8RXBsbWA40Sw42uCYxsBx0lgxzcEx7YCjpPBjm8Jju0EHKeAHd8RHNsLOE4FO74nOHYQcJwGdvxAcOwo4Dgd7PiR4NhJwHEG2PETwbGzgONMsONngmMXAcdZYMcvBMeuAo6zwY5fCY7dBBzngB2/ERy7CzjOBTt+Jzj2EHCcB3b8QXDsKeA4H+z4k+DYS8BxAdgxUhy8Y28Bx4VgRzeCYx8Bx0VgR3eCY18Bx8VgRw+CYz8BxyVgx8gEx/4CjkvBjlEIjgMEHJeBHT0JjgMFHJeDHaMSHAcJOK4AO3oRHAcLOK4EO0YjOA4RcFwFdvQmOA4VcFwNdoxOcBwm4LgG7BiD4DhcwHEt2DEmwXGEgOM6sGMsguNIAcf1YEcfguMoAccNYMfYBMfRAo4bwY5xCI5jBBw3gR19CY5jBRw3gx3jEhzHCThuATvGIziOF3DcCnaMT3CcIOC4DeyYgOA4UcBxO9gxIcFxkoDjDrBjIoLjZAHHnWDHxATHKQKOu8COSQiOUwUcd4MdkxIcpwk47gE7JiM4Thdw3At2TE5wnCHguA/smILgOFPAcT/YMSXBcZaA4wGwYyqC42wBx4Ngx9QExzkCjofAjmkIjnMFHA+DHdMSHOcJOB4BO6YjOM4XcDwKdkxPcFwg4HgM7JiB4LhQwPE42DEjwXGRgOMJsGMmguNiAceTYMfMBMclAo6nwI5ZCI5LBRxPgx2zEhyXCTieATtmIzguF3A8C3bMTnBcIeB4DuyYg+C4UsDxPNgxJ8FxlYDjBbCjH8FxtYDjRbCjP8FxjYDjJbBjAMFxrYDjZbCjieC4TsDxCtjRTHBcL+B4FexoIThuEHC8Bna0Ehw3CjheBzsGEhw3CTjeADvaCI6bBRxvgh2DCI5bBBxvgR1zERy3CjjeBjvmJjhuE3C8A3bMQ3DcLuB4F+yYl+C4Q8DxHtgxH8Fxp4DjfbBjfoLjLgHHB2DHAgTH3QKOD8GOBQmOewQcH4EdCxEc9wo4PgY7FiY47hNwfAJ2LEJw3C/g+BTsWJTgeEDA8RnYsRjB8aCA43OwY3GC4yEBxxdgxxIEx8MCji/BjiUJjkcEHF+BHUsRHI8KOL4GO5YmOB4TcHwDdixDcDwu4PgW7FiW4HhCwPEd2LEcwfGkgON7sGN5guMpAccPYMcKBMfTAo4fwY4VCY5nBBw/gR0rERzPCjh+BjtWJjieE3D8AnasQnA8L+D4FexYleB4QcDxG9ixGsHxooDjd7BjdYLjJQHHH2DHGgTHywKOP8GONQmOVwQcI8XGOtYiOF4VcHQDO9YmOF4TcHQHO9YhOF4XcPQAO9YlON4QcIwMdqxHcLwp4BgF7Fif4HhLwNET7NiA4HhbwDEq2NFOcLwj4OgFdnQQHO8KOEYDOwYTHO8JOHqDHUMIjvcFHKODHUMJjg8EHGOAHcMIjg8FHGOCHRsSHB8JOMYCOzYiOD4WcPQBOzYmOD4RcIwNdmxCcHwq4BgH7NiU4PhMwNEX7NiM4PhcwDEu2LE5wfGFgGM8sGMLguNLAcf4YMeWBMdXAo4JwI6tCI6vBRwTgh1bExzfCDgmAju2ITi+FXBMDHZsS3B8J+CYBOzYjuD4XsAxKdixPcHxg4BjMrBjB4LjRwHH5GDHjgTHTwKOKcCOnQiOnwUcU4IdOxMcvwg4pgI7diE4fhVwTA127Epw/CbgmAbs2I3g+F3AMS3YsTvB8YeAYzqwYw+C408Bx/Rgx54Ex0hxje+YAezYi+DoJuCYEezYm+DoLuCYCezYh+DoIeCYGezYl+AYWcAxC9ixH8ExioBjVrBjf4Kjp4BjNrDjAIJjVAHH7GDHgQRHLwHHHGDHQQTHaAKOOcGOgwmO3gKOfmDHIQTH6AKO/mDHoQTHGAKOAWDHYQTHmAKOJrDjcIJjLAFHM9hxBMHRR8DRAnYcSXCMLeBoBTuOIjjGEXAMBDuOJjj6CjjawI5jCI5xBRyDwI5jCY7xBBxzgR3HERzjCzjmBjuOJzgmEHDMA3acQHBMKOCYF+w4keCYSMAxH9hxEsExsYBjfrDjZIJjEgHHAmDHKQTHpAKOBcGOUwmOyQQcC4EdpxEckws4FgY7Tic4phBwLAJ2nEFwTCngWBTsOJPgmErAsRjYcRbBMbWAY3Gw42yCYxoBxxJgxzkEx7QCjiXBjnMJjukEHEuBHecRHNMLOJYGO84nOGYQcCwDdlxAcMwo4FgW7LiQ4JhJwLEc2HERwTGzgGN5sONigmMWAccKYMclBMesAo4VwY5LCY7ZBBwrgR2XERyzCzhWBjsuJzjmEHCsAnZcQXDMKeBYFey4kuDoJ+BYDey4iuDoL+BYHey4muAYIOBYA+y4huBoEnCsCXZcS3A0CzjWAjuuIzhaBBxrgx3XExytAo51wI4bCI6BAo51wY4bCY42Acd6YMdNBMcgAcf6YMfNBMdcAo4NwI5bCI65BRztYMetBMc8Ao4OsOM2gmNeAcdgsON2gmM+AccQsOMOgmN+AcdQsONOgmMBAccwsOMugmNBAceGYMfdBMdCAo6NwI57CI6FBRwbgx33EhyLCDg2ATvuIzgWFXBsCnbcT3AsJuDYDOx4gOBYXMCxOdjxIMGxhIBjC7DjIYJjSQHHlmDHwwTHUgKOrcCORwiOpQUcW4MdjxIcywg4tgE7HiM4lhVwbAt2PE5wLCfg2A7seILgWF7AsT3Y8STBsYKAYwew4ymCY0UBx45gx9MEx0oCjp3AjmcIjpUFHDuDHc8SHKsIOHYBO54jOFYVcOwKdjxPcKwm4NgN7HiB4FhdwLE72PEiwbGGgGMPsOMlgmNNAceeYMfLBMdaAo69wI5XCI61BRx7gx2vEhzrCDj2ATteIzjWFXDsC3a8TnCsJ+DYD+x4g+BYX8CxP9jxJsGxgYDjALDjLYKjXcBxINjxNsHRIeA4COx4h+AYLOA4GOx4l+AYIuA4BOx4j+AYKuA4FOx4n+AYJuA4DOz4gODYUMBxONjxIcGxkYDjCLDjI4JjYwHHkWDHxwTHJgKOo8COTwiOTQUcR4MdnxIcmwk4jgE7PiM4NhdwHAt2fE5wbCHgOA7s+ILg2FLAcTzY8SXBsZWA4wSw4yuCY2sBx4lgx9cExzYCjpPAjm8Ijm0FHCeDHd8SHNuBHd3Ajs7ud4Tu9gLd7wndHQS6PxC6Owp0fyR0dxLo/kTo7izQ/ZnQ3UWg+wuhu6tA91dCdzeB7m+E7u4C3d8J3T0Eun8QunsKdP8kdPcS6I7ki+/uLdDtRujuI9DtTujuK9DtQejuJ9AdmdDdX6A7CqF7gEC3J6F7oEB3VEL3IIFuL0L3YIHuaITuIQLd3oTuoQLd0QndwwS6YxC6hwt0xyR0jxDojkXoHinQ7UPoHiXQHZvQPVqgOw6he4xAty+he6zBP08vHt5cwhc3nnOskgTHcQKOpYCOJSPGQzuOF3AsDXYsTXCcIOBYBuxYhuA4UcCxLNixLMFxkoBjObBjOYLjZAHH8mDH8gTHKQKOFcCOFQiOUwUcK4IdKxIcpwk4VgI7ViI4Tjf467giEa8//nF8/K12s8nPbrfYrDaL3WEP7/cPMJvtQYEmu8kRbLLYbJagELvNGmgzO0It/n5BZpPVFmoLc1jDAgP8ivviDGcIzMXK4LlYmTAXZwqsVZ8fG/sehXM8tOMsAccFYMcFBMfZAo4LwY4LCY5zBBwXgR0XERznCjguBjsuJjjOE3BcAnZcQnCcL+C4FOy4lOC4QMBxGdhxGcFxoYDjcrDjcoLjIoO/JqwfPuBf64rB3YsFXsdVAb+Oq0J4HbdEwLEq2LEqwXGpgGM1sGM1guMyAcfqYMfqBMflAo41wI41CI4rBBxrgh1rEhxXCjjWAjvWIjiuEnCsDXasTXBcLeBYB+xYh+C4RsCxLtixLsFxrcFfxw0KH7A4oXudwPsAm8DvA2wivA+wXsBxM9hxM8Fxg4DjFrDjFoLjRgHHrWDHrQTHTQKO28CO2wiOmwUct4MdtxMctwg47gA77iA4bhVw3Al23Elw3CbguAvsuIvguF3AcTfYcTfBcYeA4x6w4x6C404Bx71gx70Ex10CjvvAjvsIjrsFHPeDHfcTHPcIOB4AOx4gOO4VcDwIdjxIcNwn4HgI7HiI4LhfwPEw2PEwwfGAgOMRsOMRguNBAcejYMejBMdDAo7HwI7HCI6HBRyPgx2PExyPCDieADueIDgeFXA8CXY8SXA8JuB4Cux4iuB4XMDxNNjxNMHxhIDjGbDjGYLjSYOvx2nkw/lexSmB+XMWOH8akL6fctrg88dO6j7zh82fZhHjoR3PCjieAzueIzieE3A8D3Y8T3A8L+B4Aex4geB4QcDxItjxIsHxooDjJbDjJYLjJQHHy2DHywTHywKOV8COVwiOVwQcr4IdrxIcrwo4XgM7XiM4XvvDXs80Jr2vcF3ge2L1wN8Tq0f4vtQNAcf6YMf6BMebAo4NwI4NCI63BBztYEc7wfG2gKMD7OggON4RcAwGOwYTHO8KOIaAHUMIjvcEHEPBjqEEx/sCjmFgxzCC4wMBx4Zgx4YEx4cCjo3Ajo0Ijo8EHBuDHRsTHB8LODYBOzYhOD4RcGwKdmxKcHwq4NgM7NiM4PhMwLE52LE5wfG5gGMLsGMLguMLAceWYMeWBMeXAo6twI6tCI6vBBxbgx1bExxfCzi2ATu2ITi+EXBsC3ZsS3B8K+DYDuzYjuD4TsCxPdixPcHxvYBjB7BjB4LjBwHHjmDHjgTHjwKOncCOnQiOnwQcO4MdOxMcPws4dgE7diE4fhFw7Ap27Epw/Crg2A3s2I3g+E3AsTvYsTvB8buAYw+wYw+C4w8Bx55gx54Ex58Cjr3Ajr0IjpHiGd+xN9ixN8HRTcCxD9ixD8HRXcCxL9ixL8HRQ8CxH9ixH8ExsoBjf7Bjf4JjFAHHAWDHAQRHTwHHgWDHgQTHqAKOg8COgwiOXgKOg8GOgwmO0QQch4AdhxAcvQUch4IdhxIcows4DgM7DiM4xhBwHA52HE5wjCngOALsOILgGEvAcSTYcSTB0UfAcRTYcRTBMbaA42iw42iCYxwBxzFgxzEER18Bx7Fgx7EEx7gCjuPAjuMIjvEEHMeDHccTHOMLOE4AO04gOCYQcJwIdpxIcEwo4DgJ7DiJ4JhIwHEy2HEywTGxgOMUsOMUgmMSAcepYMepBMekAo7TwI7TCI7JBByngx2nExyTCzjOADvOIDimEHCcCXacSXBMKeA4C+w4i+CYSsBxNthxNsExtYDjHLDjHIJjGgHHuWDHuQTHtAKO88CO8wiO6QQc54Md5xMc0ws4LgA7LiA4ZhBwXAh2XEhwzCjguAjsuIjgmEnAcTHYcTHBMbOA4xKw4xKCYxYBx6Vgx6UEx6wCjsvAjssIjtkEHJeDHZcTHLMLOK4AO64gOOYQcFwJdlxJcMwp4LgK7LiK4Ogn4Lga7Lia4Ogv4LgG7LiG4Bgg4LgW7LiW4GgScFwHdlxHcDQLOK4HO64nOFoEHDeAHTcQHK0CjhvBjhsJjoECjpvAjpsIjjYBx81gx80ExyABxy1gxy0Ex1wCjlvBjlsJjrkFHLeBHbcRHPMIOG4HO24nOOYVcNwBdtxBcMwn4LgT7LiT4JhfwHEX2HEXwbGAgONusONugmNBAcc9YMc9BMdCAo57wY57CY6FBRz3gR33ERyLCDjuBzvuJzgWFXA8AHY8QHAsJuB4EOx4kOBYXMDxENjxEMGxhIDjYbDjYYJjSQHHI2DHIwTHUgKOR8GORwmOpQUcj4EdjxEcywg4Hgc7Hic4lhVwPAF2PEFwLCfgeBLseJLgWF7A8RTY8RTBsYKA42mw42mCY0UBxzNgxzMEx0oCjmfBjmcJjpUFHM+BHc8RHKsIOJ4HO54nOFYVcLwAdrxAcKwm4HgR7HiR4FhdwPES2PESwbGGgONlsONlgmNNAccrYMcrBMdaAo5XwY5XCY61BRyvgR2vERzrCDheBzteJzjWFXC8AXa8QXCsJ+B4E+x4k+BYX8DxFtjxFsGxgYDjbbDjbYKjXcDxDtjxDsHRIeB4F+x4l+AYLOB4D+x4j+AYIuB4H+x4n+AYKuD4AOz4gOAYJuD4EOz4kODYUMDxEdjxEcGxkYDjY7DjY4JjYwHHJ2DHJwTHJgKOT8GOTwmOTQUcn4EdnxEcmwk4Pgc7Pic4NhdwfAF2fEFwbCHg+BLs+JLg2FLA8RXY8RXBsZWA42uw42uCY2sBxzdgxzcExzYCjm/Bjm8Jjm0FHN+BHd8RHNsJOL4HO74nOLYXcPwAdvxAcOwg4PgR7PiR4NhRwPET2PETwbGTgONnsONngmNnAccvYMcvBMcuAo5fwY5fCY5dBRy/gR2/ERy7CTh+Bzt+Jzh2F3D8AXb8QXDsIeD4E+z4k+DYU8AxUlyso3M8tGMvAUc3sKMbwbG3gKM72NGd4NhHwNED7OhBcOwr4BgZ7BiZ4NhPwDEK2DEKwbG/gKMn2NGT4DhAwDEq2DEqwXGggKMX2NGL4DhIwDEa2DEawXGwgKM32NGb4DhEwDE62DE6wXGogGMMsGMMguMwAceYYMeYBMfhAo6xwI6xCI4jBBx9wI4+BMeRAo6xwY6xCY6jBBzjgB3jEBxHCzj6gh19CY5jBBzjgh3jEhzHCjjGAzvGIziOE3CMD3aMT3AcL+CYAOyYgOA4QcAxIdgxIcFxooBjIrBjIoLjJAHHxGDHxATHyQKOScCOSQiOUwQck4IdkxIcpwo4JgM7JiM4ThNwTA52TE5wnC7gmALsmILgOEPAMSXYMSXBcaaAYyqwYyqC4ywBx9Rgx9QEx9kCjmnAjmkIjnMEHNOCHdMSHOcKOKYDO6YjOM4TcEwPdkxPcJwv4JgB7JiB4LhAwDEj2DEjwXGhgGMmsGMmguMiAcfMYMfMBMfFAo5ZwI5ZCI5LBByzgh2zEhyXCjhmAztmIzguE3DMDnbMTnBcLuCYA+yYg+C4QsAxJ9gxJ8FxpYCjH9jRj+C4SsDRH+zoT3BcLeAYAHYMIDiuEXA0gR1NBMe1Ao5msKOZ4LhOwNECdrQQHNcLOFrBjlaC4wYBx0CwYyDBcaOAow3saCM4bhJwDAI7BhEcNws45gI75iI4bhFwzA12zE1w3CrgmAfsmIfguE3AMS/YMS/BcbuAYz6wYz6C4w4Bx/xgx/wEx50CjgXAjgUIjrsEHAuCHQsSHHcLOBYCOxYiOO4RcCwMdixMcNwr4FgE7FiE4LhPwLEo2LEowXG/gGMxsGMxguMBAcfiYMfiBMeDAo4lwI4lCI6HBBxLgh1LEhwPCziWAjuWIjgeEXAsDXYsTXA8KuBYBuxYhuB4TMCxLNixLMHxuIBjObBjOYLjCQHH8mDH8gTHkwKOFcCOFQiOpwQcK4IdKxIcTws4VgI7ViI4nhFwrAx2rExwPCvgWAXsWIXgeE7AsSrYsSrB8byAYzWwYzWC4wUBx+pgx+oEx4sCjjXAjjUIjpcEHGuCHWsSHC8LONYCO9YiOF4RcKwNdqxNcLwq4FgH7FiH4HhNwLEu2LEuwfG6gGM9sGM9guMNAcf6YMf6BMebAo4NwI4NCI63BBztYEc7wfG2gKMD7OggON4RcAwGOwYTHO8KOIaAHUMIjvcEHEPBjqEEx/sCjmFgxzCC4wMBx4Zgx4YEx4cCjo3Ajo0Ijo8EHBuDHRsTHB8LODYBOzYhOD4RcGwKdmxKcHwq4NgM7NiM4PhMwLE52LE5wfG5gGMLsGMLguMLAceWYMeWBMeXAo6twI6tCI6vBBxbgx1bExxfCzi2ATu2ITi+EXBsC3ZsS3B8K+DYDuzYjuD4TsCxPdixPcHxvYBjB7BjB4LjBwHHjmDHjgTHjwKOncCOnQiOnwQcO4MdOxMcPws4dgE7diE4fhFw7Ap27Epw/Crg2A3s2I3g+E3AsTvYsTvB8buAYw+wYw+C4w8Bx55gx54Ex58Cjr3Ajr0IjpHiG9+xN9ixN8HRTcCxD9ixD8HRXcCxL9ixL8HRQ8CxH9ixH8ExsoBjf7Bjf4JjFAHHAWDHAQRHTwHHgWDHgQTHqAKOg8COgwiOXgKOg8GOgwmO0QQch4AdhxAcvQUch4IdhxIcows4DgM7DiM4xhBwHA52HE5wjCngOALsOILgGEvAcSTYcSTB0UfAcRTYcRTBMbaA42iw42iCYxwBxzFgxzEER18Bx7Fgx7EEx7hgRzew4+DwAZ2W6O54Bu8eQuqOb/DuoaTuBAbvHkbqTmjw7uGk7kQG7x5B6k5s8O6RpO4kBu8eRepOavDu0aTuZAbvHkPqTm7w7rGk7hQG7x5H6k5p8O7xpO5UBu+eQOpObfDuiaTuNAbvnkTqTmvw7smk7nQG755C6k5v8O6ppO4MBu+eRurOaPDu6aTuTAbvnkHqzmzw7pmk7iwG755F6s5q8O7ZpO5sBu+eQ+rObvDuuaTuHAbvnkfqzmnw7vmkbj+Ddy8gdfsbvHshqTsA2O0ZMc7f++h6Q3v0csftt+v+muL/Zv9RO82CcN1p1Ljm+LhJxup27iP4GP01Gbxc9tf57/yI+G9LhLPzfg+Xv3Pe3ztiuz4u21tdtv/deIEu+++8uf/S8m/dkcfQFh/7OEAvvIkXfnJM7IsbL1HEeOgTbpDBFzA5HZOAHZMQHHMJOCYFOyYlOOYWcEwGdkxGcMwj4Jgc7Jic4JhXwDEF2DEFwTGfgGNKsGNKgmN+AcdUYMdUBMcCAo6pwY6pCY4FBRzTAB0ThI+ViOBY6A9zTBQxHtqxsIBjWrBjWoJjEQHHdGDHdATHogKO6cGO6QmOxQQcM4AdMxAciws4ZgQ7ZiQ4lhBwzAR2zERwLCngmBnsmJngWErAMQvYMQvBsbSAY1awY1aCYxkBx2xgx2wEx7ICjtnBjtkJjuUEHHOAHXMQHMsLOOYEO+YkOFYQcPQDO/oRHCsKOPqDHf0JjpUEHAPAjgEEx8oCjiawo4ngWEXA0Qx2NBMcqwo4WsCOFoJjNQFHK9jRSnCsLuAYCHYMJDjWEHC0gR1tBMeaAo5BYMcggmMtAcdcYMdcBMfaAo65wY65CY51BBzzgB3zEBzrCjjmBTvmJTjWM/gXuhKS1jXV/8PWNfVw5zg2MPj86UnqtoO7/765g/dziRtuLIdrs7/Vbjb52e0Wm9VmsTvs4WP6B5jN9qBAk93kCDZZbDZLUIjdZg20mR2hFn+/ILPJagu1hTmsYYEB/+mXIB3AY+W6v8FqX4J0QgQTvgQZYvAvQTq7Q/6DL0EudvvflxZDXb7U6P7L/a7bhf3my4+u9zf8zZcpG0Z8mXJJxHZLXbZvRP6yJPJYNwZ/WZLVfBx4Em0S39jnCOcxaRIf/4TZ1OAXXAXCLxJKAC+4ioaPNY7wE+mbGfyCy/lYaUyYP80F5k8p8PwZT5g/LQQcS4MdJxAcWwo4lgE7TiQ4thJwLAt2nERwbC3gWA7sOJng2EbAsTzYcQrBsa2AYwWw41SCYzsBx4pgx2kEx/YCjpXAjtMJjh0EHCuDHWcQHDv+gY4zCY6dBByrgB2XEBw7CzhWBTsuJTh2EXCsBnZcRnDsKuBYHey4nODYTcCxBthxBcGxu4BjTbDjSoJjDwHHWmDHVQTHngKOtcGOqwmOvQQc64Ad1xAcews41gU7riU49jH453vO7nWE7r4C86ceeP7cIDj2E3CsD3a8SXDsL+DYAOx4i+A4QMDRDna8TXAcKODoADveITgOEnAMBjveJTgOFnAMATveIzgOEXAMBTveJzgOFXAMAzs+IDgOE3BsCHZ8SHAcLuDYCOz4iOA4QsCxMdjxMcFxpIBjE7DjE4LjKAHHpmDHpwTH0QKOzcCOzwiOYwQcm4MdnxMcxwo4tgA7viA4jhNwbAl2fElwHC/g2Ars+IrgOEHAsTXY8TXBcaKAYxuw4xuC4yQBx7Zgx7cEx8kCju3Aju8IjlMEHNuDHd8THKcKOHYAO34gOE4TcOwIdvxIcJwu4NgJ7PiJ4DhDwLEz2PEzwXGmgGMXsOMXguMsAceuYMevBMfZAo7dwI7fCI5zBBy7gx2/ExznCjj2ADv+IDjOE3DsCXb8SXCcL+DYC+wYKR7ecYGAY2+woxvBcaGAYx+wozvBcZGAY1+wowfBcbGAYz+wY2SC4xIBx/5gxygEx6UCjgPAjp4Ex2UCjgPBjlEJjssFHAeBHb0IjisEHAeDHaMRHFcKOA4BO3oTHFcJOA4FO0YnOK4WcBwGdoxBcFwj4Dgc7BiT4LhWwHEE2DEWwXGdgONIsKMPwXG9gOMosGNsguMGAcfRYMc4BMeNAo5jwI6+BMdNAo5jwY5xCY6bBRzHgR3jERy3CDiOBzvGJzhuFXCcAHZMQHDcJuA4EeyYkOC4XcBxEtgxEcFxh4DjZLBjYoLjTgHHKWDHJATHXQKOU8GOSQmOuwUcp4EdkxEc9wg4Tgc7Jic47hVwnAF2TEFw3CfgOBPsmJLguF/AcRbYMRXB8YCA42ywY2qC40EBxzlgxzQEx0MCjnPBjmkJjocFHOeBHdMRHI8IOM4HO6YnOB4VcFwAdsxAcDwm4LgQ7JiR4HhcwHER2DETwfGEgONisGNmguNJAcclYMcsBMdTAo5LwY5ZCY6nBRyXgR2zERzPCDguBztmJzieFXBcAXbMQXA8J+C4EuyYk+B4XsBxFdjRj+B4QcBxNdjRn+B4UcBxDdgxgOB4ScBxLdjRRHC8LOC4DuxoJjheEXBcD3a0EByvCjhuADtaCY7XBBw3gh0DCY7XBRw3gR1tBMcbAo6bwY5BBMebAo5bwI65CI63BBy3gh1zExxvCzhuAzvmITjeEXDcDnbMS3C8K+C4A+yYj+B4T8BxJ9gxP8HxvoDjLrBjAYLjAwHH3WDHggTHhwKOe8COhQiOjwQc94IdCxMcHws47gM7FiE4PhFw3A92LEpwfCrgeADsWIzg+EzA8SDYsTjB8bmA4yGwYwmC4wsBx8Ngx5IEx5cCjkfAjqUIjq8EHI+CHUsTHF8LOB4DO5YhOL4RcDwOdixLcHwr4HgC7FiO4PhOwPEk2LE8wfG9gOMpsGMFguMHAcfTYMeKBMePAo5nwI6VCI6fBBzPgh0rExw/CzieAztWITh+EXA8D3asSnD8KuB4AexYjeD4TcDxItixOsHxu4DjJbBjDYLjDwHHy2DHmgTHnwKOV8COtQiOkRIY3/Eq2LE2wdFNwPEa2LEOwdFdwPE62LEuwdFDwPEG2LEewTGygONNsGN9gmMUAcdbYMcGBEdPAcfbYEc7wTGqgOMdsKOD4Ogl4HgX7BhMcIwm4HgP7BhCcPQWcLwPdgwlOEYXcHwAdgwjOMYQcHwIdmxIcIwp4PgI7NiI4BhLwPEx2LExwdFHwPEJ2LEJwTG2gONTsGNTgmMcAcdnYMdmBEdfAcfnYMfmBMe4Ao4vwI4tCI7xBBxfgh1bEhzjCzi+Aju2IjgmEHB8DXZsTXBMKOD4BuzYhuCYSMDxLdixLcExsYDjO7BjO4JjEgHH92DH9gTHpAKOH8COHQiOyQQcP4IdOxIckws4fgI7diI4phBw/Ax27ExwTCng+AXs2IXgmErA8SvYsSvBMbWA4zewYzeCYxoBx+9gx+4Ex7QCjj/Ajj0IjukEHH+CHXsSHNMLOEaKi3XsRXDMIODoBnbsTXDMKODoDnbsQ3DMJODoAXbsS3DMLOAYGezYj+CYRcAxCtixP8Exq4CjJ9hxAMExm4BjVLDjQIJjdgFHL7DjIIJjDgHHaGDHwQTHnAKO3mDHIQRHPwHH6GDHoQRHfwHHGGDHYQTHAAHHmGDH4QRHk4BjLLDjCIKjWcDRB+w4kuBoEXCMDXYcRXC0CjjGATuOJjgGCjj6gh3HEBxtAo5xwY5jCY5BAo7xwI7jCI65BBzjgx3HExxzCzgmADtOIDjmEXBMCHacSHDMK+CYCOw4ieCYT8AxMdhxMsExv4BjErDjFIJjAQHHpGDHqQTHggKOycCO0wiOhQQck4MdpxMcCws4pgA7ziA4FhFwTAl2nElwLCrgmArsOIvgWEzAMTXYcTbBsbiAYxqw4xyCYwkBx7Rgx7kEx5ICjunAjvMIjqUEHNODHecTHEsLOGYAOy4gOJYRcMwIdlxIcCwr4JgJ7LiI4FhOwDEz2HExwbG8gGMWsOMSgmMFAcesYMelBMeKAo7ZwI7LCI6VBByzgx2XExwrCzjmADuuIDhWEXDMCXZcSXCsKuDoB3ZcRXCsJuDoD3ZcTXCsLuAYAHZcQ3CsIeBoAjuuJTjWFHA0gx3XERxrCThawI7rCY61BRytYMcNBMc6Ao6BYMeNBMe6Ao42sOMmgmM9AccgsONmgmN9AcdcYMctBMcGAo65wY5bCY52Acc8YMdtBEeHgGNesON2gmOwgGM+sOMOgmOIgGN+sONOgmOogGMBsOMugmOYgGNBsONugmNDAcdCYMc9BMdGAo6FwY57CY6NBRyLgB33ERybCDgWBTvuJzg2FXAsBnY8QHBsJuBYHOx4kODYXMCxBNjxEMGxhYBjSbDjYYJjSwHHUmDHIwTHVgKOpcGORwmOrQUcy4AdjxEc2wg4lgU7Hic4thVwLAd2PEFwbCfgWB7seJLg2F7AsQLY8RTBsYOAY0Ww42mCY0cBx0pgxzMEx04CjpXBjmcJjp0FHKuAHc8RHLsIOFYFO54nOHYVcKwGdrxAcOwm4Fgd7HiR4NhdwLEG2PESwbGHgGNNsONlgmNPAcdaYMcrBMdeAo61wY5XCY69BRzrgB2vERz7CDjWBTteJzj2FXCsB3a8QXDsJ+BYH+x4k+DYX8CxAdjxFsFxgICjHex4m+A4UMDRAXa8Q3AcJOAYDHa8S3AcLOAYAna8R3AcIuAYCna8T3AcKuAYBnZ8QHAcJuDYEOz4kOA4XMCxEdjxEcFxhIBjY7DjY4LjSAHHJmDHJwTHUQKOTcGOTwmOowUcm4EdnxEcxwg4Ngc7Pic4jhVwbAF2fEFwHCfg2BLs+JLgOF7AsRXY8RXBcYKAY2uw42uC40QBxzZgxzcEx0kCjm3Bjm8JjpMFHNuBHd8RHKcIOLYHO74nOE4VcOwAdvxAcJwm4NgR7PiR4DhdwLET2PETwXGGgGNnsONnguNMAccuYMcvBMdZAo5dwY5fCY6zBRy7gR2/ERznCDh2Bzt+JzjOFXDsAXb8QXCcJ+DYE+z4k+A4X8CxF9gxUny84wIBx95gRzeC40IBxz5gR3eC4yIBx75gRw+C42IBx35gx8gExyUCjv3BjlEIjksFHAeAHT0JjssEHAeCHaMSHJcLOA4CO3oRHFcIOA4GO0YjOK4UcBwCdvQmOK4ScBwKdoxOcFwt4DgM7BiD4LhGwHE42DEmwXGtgOMIsGMsguM6AceRYEcfguN6AcdRYMfYBMcNAo6jwY5xCI4bBRzHgB19CY6bBBzHgh3jEhw3gx3dwI7O7niE7i0C3fEJ3VsFuhMQurcJdCckdG8X6E5E6N4h0J2Y0L1ToDsJoXuXQHdSQvduge5khO49At3JCd17BbpTELr3CXSnJHTvF+hOReg+INCdmtB9UKA7DaH7kEB3WkL3YYHudITuIwLd6QndRwW6MxC6jwl0ZyR0HxfozkToPiHQnZnQfVKgOwuh+5RAd1ZC92mB7myE7jMC3dkJ3WcFunMQus8JdOckdJ8X6PYjdF8Q6PYndF8U6A4gdF8y+OfpTcObm8XHjeccqznB8bKAYwugY/OI8dCOVwQcW4IdWxIcrwo4tgI7tiI4XhNwbA12bE1wvC7g2Abs2IbgeEPAsS3YsS3B8aaAYzuwYzuC4y0Bx/Zgx/YEx9sCjh3Ajh0IjncEHDuCHTsSHO8a/PVwo4jXcf84Pv5Wu9nkZ7dbbFabxe6wh/f7B5jN9qBAk93kCDZZbDZLUIjdZg20mR2hFn+/ILPJagu1hTmsYYEBfk3j4wzvCczFTuC52IkwF+8LrPmfBV7z7xwP7fhAwHE22HE2wfGhgOMcsOMcguMjAce5YMe5BMfHAo7zwI7zCI5PBBzngx3nExyfCjguADsuIDg+E3BcCHZcSHB8LuC4COy4iOD4QsBxMdhxMcHxpcFfW/cLH/Cvn8MJ7n4l8Hq4M/j1cGfC6+HXAo5dwI5dCI5vBBy7gh27EhzfCjh2Azt2Izi+E3DsDnbsTnB8L+DYA+zYg+D4QcCxJ9ixJ8Hxo4BjL7BjL4LjJwHH3mDH3gTHzwKOfcCOfQiOXwQc+4Id+xIcvxr89fDy8AGbErq/Cbyfsh78fsp6wvsp3wUcN4AdNxAcfwg4bgQ7biQ4/hRw3AR23ERwjJTQ+I6bwY6bCY5uAo5bwI5bCI7uAo5bwY5bCY4eAo7bwI7bCI6RBRy3gx23ExyjCDjuADvuIDh6CjjuBDvuJDhGFXDcBXbcRXD0EnDcDXbcTXCMJuC4B+y4h+DoLeC4F+y4l+AYXcBxH9hxH8ExhoDjfrDjfoJjTAHHA2DHAwTHWAKOB8GOBwmOPgKOh8COhwiOsQUcD4MdDxMc4wg4HgE7HiE4+go4HgU7HiU4xhVwPAZ2PEZwjCfgeBzseJzgGF/A8QTY8QTBMYGA40mw40mCY0IBx1Ngx1MEx0QCjqfBjqcJjokFHM+AHc8QHJOAHdHr7Ar6cr53llRg/pwFzp/+pO/vJTP4/BlA6k7+h82fohHjoR1TCDieAzueIzimFHA8D3Y8T3BMJeB4Aex4geCYWsDxItjxIsExjYDjJbDjJYJjWgHHy2DHywTHdAKOV8COVwiO6QUcr4IdrxIcMwg4XgM7XiM4ZhRwvA52vE5wzPSHvS4sRHp/JrPBHZ3f/ewH/h5tP8L3SbMIOPYHO/YnOGYVcBwAdhxAcMwm4DgQ7DiQ4JhdwHEQ2HEQwTGHgONgsONggmNOAcchYMchBMf/R95dAEeVrlsDJsHdIUCAAEGSIHHB3d0dori7u7u7a3D3CO4J7u7uLuHfuX/m3tx95pwzc2atW71qUvXW8NJdH3s9/aXT7570bmcBx3Fgx3EERxcBx/Fgx/EER1cBxwlgxwkERzcBx4lgx4kER3cBx0lgx0kERw8Bx8lgx8kER08BxylgxykERy8Bx6lgx6kER28Bx2lgx2kERx8Bx+lgx+kEx8ICjjPAjjMIjkUEHGeCHWcSHIsKOM4CO84iOBYTcJwNdpxNcCwu4DgH7DiH4FhCwHEu2HEuwbGkgOM8sOM8gmMpAcf5YMf5BMfSAo4LwI4LCI5lBBwXgh0XEhzLCjguAjsuIjiWE3BcDHZcTHAsL+C4BOy4hOBYQcBxKdhxKcGxooDjMrDjMoJjJQHH5WDH5QTHygKOK8COKwiOVQQcV4IdVxIcqwo4rgI7riI4VhNwXA12XE1wrC7gGAx2DCY41hBwXAN2XENwrCnguBbsuJbgWEvAcR3YcR3BsbaA43qw43qCYx0Bxw1gxw0Ex7oCjhvBjhsJjvUEHDeBHTcRHOsLOG4GO24mODYQcNwCdtxCcGwo4LgV7LiV4NhIwHEb2HEbwbGxgON2sON2gmMTAccdYMcdBMemAo47wY47CY7NBBx3gR13ERybCzjuBjvuJji2EHDcA3bcQ3BsKeC4F+y4l+DoK+C4D+y4j+DoJ+AYAnYMITj6CziGgh1DCY4BAo5hYMcwgmOggGM42DGc4Bgk4Lgf7Lif4NhKwPEA2PEAwbG1gONBsONBgmMbAcdDYMdDBMe2Ao6HwY6HCY7tBByPgB2PEBzbCzgeBTseJTh2EHA8BnY8RnDsKOB4HOx4nODYScDxBNjxBMGxs4DjSbDjSYJjFwHHU2DHUwTHrgKOp8GOpwmO3QQcI8COEQTH7gKOkWDHSIJjDwHHM2DHMwTHngKOZ8GOZwmOvQQcz4EdzxEcews4ngc7nic49hFwvAB2vEBw7CvgeBHseJHg2E/A8RLY8RLBsb+A42Ww42WC4wABxytgxysEx4ECjlfBjlcJjoMEHK+BHa8RHAcLOF4HO14nOA4RcLwBdrxBcBwq4HgT7HiT4DhMwPEW2PEWwXG4gONtsONtguMIAcc7YMc7BMeRAo53wY53CY6jBBzvgR3vERxHCzjeBzveJziOEXB8AHZ8QHAcK+D4EOz4kOA4TsDxEdjxEcFxvIDjY7DjY4LjBAHHJ2DHJwTHiQKOT8GOTwmOkwQcn4EdnxEcJws4Pgc7Pic4ThFwfAF2fEFwnCrg+BLs+JLgOE3A8RXY8RXBcbqA42uw42uC4wwBxzdgxzcEx5kCjm/Bjm8JjrMEHN+BHd8RHGcLOL4HO74nOM4RcPwAdvxAcJwr4PgR7PiR4DhPwPET2PETwXG+gONnsONnguMCAccvYMcvBMeFAo5fwY5fCY6LBBy/gR2/ERwXCzh+Bzt+JzguEXD8AXb8QXBcKuD4E+z4k+C4TMAxCuwYRXBcLuD4C+z4i+C4QsAxTgasY/R6aMeVAo5WYEcrguMqAUdrsKM1wXG1gGNcsGNcgmOwgGM8sGM8guMaAcf4YMf4BMe1Ao4JwI4JCI7rBBwTgh0TEhzXCzgmAjsmIjhuEHBMDHZMTHDcKOCYBOyYhOC4ScAxKdgxKcFxs4BjMrBjMoLjFgHH5GDH5ATHrQKOKcCOKQiO2wQcU4IdUxIctws4pgI7piI47hBwTA12TE1w3CngmAbsmIbguEvAMS3YMS3BcbeAYzqwYzqC4x4Bx/Rgx/QEx70CjhnAjhkIjvsEHDOCHTMSHEMEHG3AjjYEx1ABx0xgx0wExzABx8xgx8wEx3ABxyxgxywEx/0CjrZgR1uC4wEBx6xgx6wEx4MCjtnAjtkIjocEHLODHbMTHA8LONqBHe0IjkcEHHOAHXMQHI8KOOYEO+YkOB4TcMwFdsxFcDwu4GgPdrQnOJ4QcMwNdsxNcDwp4JgH7JiH4HhKwDEv2DEvwfG0gGM+sGM+gmOEgKMD2NGB4Bgp4OgIdnQkOJ4RcHQCOzoRHM8KOOYHO+YnOJ4TcCwAdixAcDwv4FgQ7FiQ4HhBwLEQ2LEQwfGigKMz2NGZ4HhJwNEF7OhCcLws4OgKdnQlOF4RcHQDO7oRHK8KOLqDHd0JjtcEHD3Ajh4Ex+sCjp5gR0+C4w0BRy+woxfB8aaAozfY0ZvgeEvA0Qfs6ENwvC3gWBjsWJjgeEfAsQjYsQjB8a6AY1GwY1GC4z0Bx2Jgx2IEx/sCjsXBjsUJjg8EHEuAHUsQHB8KOJYEO5YkOD4ScCwFdixFcHws4Fga7Fia4PhEwLEM2LEMwfGpgGNZsGNZguMzAcdyYMdyBMfnAo7lwY7lCY4vBBwrgB0rEBxfCjhWBDtWJDi+EnCsBHasRHB8LeBYGexYmeD4RsCxCtixCsHxrYBjVbBjVYLjOwHHamDHagTH9wKO1cGO1QmOHwQca4AdaxAcPwo41gQ71iQ4fhJwrAV2rEVw/CzgWBvsWJvg+EXAsQ7YsQ7B8auAY12wY12C4zcBx3pgx3oEx+8CjvXBjvUJjj8EHBuAHRsQHH8KODYEOzYkOEYJODYCOzYiOP4ScGwMdmxMcIxjY/mOTcCOTQiOVgKOTcGOTQmO1gKOzcCOzQiOcQUcm4MdmxMc4wk4tgA7tiA4xhdwbAl2bElwTCDg6At29CU4JhRw9AM7+hEcEwk4+oMd/QmOiQUcA8COAQTHJAKOgWDHQIJjUgHHILBjEMExmYBjK7BjK4JjcgHH1mDH1gTHFAKObcCObQiOKQUc24Id2xIcUwk4tgM7tiM4phZwbA92bE9wTCPg2AHs2IHgmFbAsSPYsSPBMZ2AYyewYyeCY3oBx85gx84ExwwCjl3Ajl0IjhkFHLuCHbsSHG0EHLuBHbsRHDMJOHYHO3YnOGYWcOwBduxBcMwi4NgT7NiT4Ggr4NgL7NiL4JhVwLE32LE3wTGbgGMfsGMfgmN2Ace+YMe+BEc7Acd+YMd+BMccAo79wY79CY45BRwHgB0HEBxzCTgOBDsOJDjaCzgOAjsOIjjmFnAcDHYcTHDMI+A4BOw4hOCYV8BxKNhxKMExn4DjMLDjMIKjg4DjcLDjcIKjo4DjCLDjCIKjk4DjSLDjSIJjfgHHUWDHUQTHAgKOo8GOowmOBQUcx4AdxxAcCwk4jgU7jiU4Ogs4jgM7jiM4ugg4jgc7jic4ugo4TgA7TiA4ugk4TgQ7TiQ4ugs4TgI7TiI4egg4TgY7TiY4ego4TgE7TiE4egk4TgU7TiU4egs4TgM7TiM4+gg4Tgc7Tic4FhZwnAF2nEFwLCLgOBPsOJPgWFTAcRbYcRbBsZiA42yw42yCY3EBxzlgxzkExxICjnPBjnMJjiUFHOeBHecRHEsJOM4HO84nOJYWcFwAdlxAcCwj4LgQ7LiQ4FhWwHER2HERwbGcgONisONigmN5AcclYMclBMcKAo5LwY5LCY4VBRyXgR2XERwrCTguBzsuJzhWFnBcAXZcQXCsIuC4Euy4kuBYVcBxFdhxFcGxmoDjarDjaoJjdQHHYLBjMMGxhoDjGrDjGoJjTQHHtWDHtQTHWgKO68CO6wiOtQUc14Md1xMc6wg4bgA7biA41hVw3Ah23EhwrCfguAnsuIngWF/AcTPYcTPBsYGA4xaw4xaCY0MBx61gx60Ex0YCjtvAjtsIjo0FHLeDHbcTHJsIOO4AO+4gODYVcNwJdtxJcGwm4LgL7LiL4NhcwHE32HE3wbGFgOMesOMegmNLAce9YMe9BEdfAcd9YMd9BEc/AccQsGMIwdFfwDEU7BhKcAwQcAwDO4YRHAMFHMPBjuEExyABx/1gx/0Ex1YCjgfAjgcIjq0FHA+CHQ8SHNsIOB4COx4iOLYVcDwMdjxMcGwn4HgE7HiE4NhewPEo2PEowbGDgOMxsOMxgmNHAcfjYMfjBMdOAo4nwI4nCI6dBRxPgh1PEhy7CDieAjueIjh2FXA8DXY8TXDsJuAYAXaMIDh2F3CMBDtGEhx7CDieATueITj2FHA8C3Y8S3DsJeB4Dux4juDYW8DxPNjxPMGxj4DjBbDjBYJjXwHHi2DHiwTHfgKOl8COlwiO/QUcL4MdLxMcBwg4XgE7XiE4DgQ7WoEdNxgLRluicw+y8NwbSbkHW3juTaTcQyw892ZS7qEWnnsLKfcwC8+9lZR7uIXn3kbKPcLCc28n5R5p4bl3kHKPsvDcO0m5R1t47l2k3GMsPPduUu6xFp57Dyn3OAvPvZeUe7yF595Hyj3BwnOHkHJPtPDcoaTckyw8dxgp92QLzx1Oyj3FwnPvJ+WeauG5D5ByT7Pw3AdJuadbeO5DpNwzLDz3YVLumRae+wgp9ywLz32UlHu2hec+Rso9x8JzHyflnmvhuU+Qcs+z8NwnSbnnW3juU6TcC4C5E8Ss89sxxv5Cewyzxh137ONdaPM7x486aBZE7INGrbvIBrfJWLmjjxH8GP3XZkgU63ij/52omD8vjnGOvj1urL+Lvn14zP1GxLr/klj3/731lsY6/ugva1OWv+qOfAyX2WC/D9C/eONuPDn6pMet5x2zHvoJd7mF/wJTtGNhsGNhguMKAcciYMciBMeVAo5FwY5FCY6rBByLgR2LERxXCzgWBzsWJzgGCziWADuWIDiuEXAsCXYsSXBcK+BYCuxYiuC4TsCxNNixNMFxvYBjGaCjp7GWN8Fxw9/M0TtmPbTjRgHHsmDHsgTHTQKO5cCO5QiOmwUcy4MdyxMctwg4VgA7ViA4bhVwrAh2rEhw3CbgWAnsWInguF3AsTLYsTLBcYeAYxWwYxWC404Bx6pgx6oEx10CjtXAjtUIjrsFHKuDHasTHPcIONYAO9YgOO4VcKwJdqxJcNwn4FgL7FiL4Bgi4Fgb7Fib4Bgq4FgH7FiH4Bgm4FgX7FiX4Bgu4FgP7FiP4LhfwLE+2LE+wfGAgGMDsGMDguNBAceGYMeGBMdDAo6NwI6NCI6HBRwbgx0bExyPCDg2ATs2ITgeFXBsCnZsSnA8JuDYDOzYjOB4XMCxOdixOcHxhIBjC7BjC4LjSQHHlmDHlgTHUwKOvmBHX4LjaQt/w6sX6fcVI/5mv684xJrjGGnh+2coKfcZcO7fvqzRj48Vbq2zsTO7ePq6uzn7+np4e3p7+Pr5Gmu6uLq7+/p4ufm6+fm7eXh7e/gE+Hp7enm7+wV6uDj7uLt5egd6B/l5Bnm5/p++Sfws8LGKfbzn1N4kHg1xjvAm8fMW/ibx6Nzn/w/eJB5h9T9v6r4Q603f1qbbY9/v4u+8OTz27Zd+583ml2LebB4Zc78zse5/mfxmcuRjfQX8ZnJW5nfAJ9GrNpb9HBH9mFy1wf/AvGbhL7gCjBcJ7YEvuNoYa10lfGLHdQt/wRX9vXKFsH9uCOyfjuD9c42wf24KOHYCO14nON4ScOwMdrxBcLwt4NgF7HiT4HhHwLEr2PEWwfGugGM3sONtguM9AcfuYMc7BMf7Ao49wI53CY4PBBx7gh3vERwfCjj2AjveJzg+EnDsDXZ8QHB8/Dd0fEhwfCLg2Afs+Jbg+FTAsS/Y8R3B8ZmAYz+w43uC43MBx/5gxw8ExxcCjgPAjh8Jji8FHAeCHT8RHF8JOA4CO34mOL4WcBwMdvxCcHwj4DgE7PiV4PhWwHEo2PEbwfGdgOMwsON3guN7C///zdG5fxByfxDYP8PB+8cxI97xo4DjCLCjE8Hxk4DjSLBjfoLjZwHHUWDHAgTHLwKOo8GOBQmOXwUcx4AdCxEcvwk4jgU7OhMcvws4jgM7uhAcfwg4jgc7uhIcfwo4TgA7uhEcowQcJ4Id3QmOvwQcJ4EdPQiOcTJZvuNksKMnwdFKwHEK2NGL4Ggt4DgV7OhNcIwr4DgN7OhDcIwn4Dgd7FiY4BhfwHEG2LEIwTGBgONMsGNRgmNCAcdZYMdiBMdEAo6zwY7FCY6JBRzngB1LEByTCDjOBTuWJDgmFXCcB3YsRXBMJuA4H+xYmuCYXMBxAdixDMExhYDjQrBjWYJjSgHHRWDHcgTHVAKOi8GO5QmOqQUcl4AdKxAc0wg4LgU7ViQ4phVwXAZ2rERwTCfguBzsWJngmF7AcQXYsQrBMYOA40qwY1WCY0YBx1Vgx2oERxsBx9Vgx+oEx0wCjsFgxxoEx8wCjmvAjjUJjlkEHNeCHWsRHG0FHNeBHWsTHLMKOK4HO9YhOGYTcNwAdqxLcMwu4LgR7FiP4Ggn4LgJ7Fif4JhDwHEz2LEBwTGngOMWsGNDgmMuAcetYMdGBEd7AcdtYMfGBMfcAo7bwY5NCI55BBx3gB2bEhzzCjjuBDs2IzjmE3DcBXZsTnB0EHDcDXZsQXB0FHDcA3ZsSXB0EnDcC3b0JTjmF3DcB3b0IzgWEHAMATv6ExwLCjiGgh0DCI6FBBzDwI6BBEdnAcdwsGMQwdFFwHE/2LEVwdFVwPEA2LE1wdFNwPEg2LENwdFdwPEQ2LEtwdFDwPEw2LEdwdFTwPEI2LE9wdFLwPEo2LEDwdFbwPEY2LEjwdFHwPE42LETwbGwgOMJsGNngmMRAceTYMcuBMeiAo6nwI5dCY7FBBxPgx27ERyLCzhGgB27ExxLCDhGgh17EBxLCjieATv2JDiWEnA8C3bsRXAsLeB4DuzYm+BYRsDxPNixD8GxrIDjBbBjX4JjOQHHi2DHfgTH8gKOl8CO/QmOFQQcL4MdBxAcKwo4XgE7DiQ4VhJwvAp2HERwrCzgeA3sOJjgWEXA8TrYcQjBsaqA4w2w41CCYzUBx5tgx2EEx+oCjrfAjsMJjjUEHG+DHUcQHGsKON4BO44kONYScLwLdhxFcKwt4HgP7Dia4FhHwPE+2HEMwbGugOMDsONYgmM9AceHYMdxBMf6Ao6PwI7jCY4NBBwfgx0nEBwbCjg+ATtOJDg2EnB8CnacRHBsLOD4DOw4meDYRMDxOdhxCsGxqYDjC7DjVIJjMwHHl2DHaQTH5gKOr8CO0wmOLQQcX4MdZxAcWwo4vgE7ziQ4+go4vgU7ziI4+gk4vgM7ziY4+gs4vgc7ziE4Bgg4fgA7ziU4Bgo4fgQ7ziM4Bgk4fgI7zic4thJw/Ax2XEBwbC3g+AXsuJDg2EbA8SvYcRHBsa2A4zew42KCYzsBx+9gxyUEx/YCjj/AjksJjh0EHH+CHZcRHDsKOEaBHZcTHDsJOP4CO64gOHYWcIyTAeu4kuDYRcDRCuy4iuDYVcDRGuy4muDYTcAxLtgxmODYXcAxHthxDcGxh4BjfLDjWoJjTwHHBGDHdQTHXgKOCcGO6wmOvQUcE4EdNxAc+wg4JgY7biQ49hVwTAJ23ERw7CfgmBTsuJng2F/AMRnYcQvBcYCAY3Kw41aC40ABxxRgx20Ex0ECjinBjtsJjoMFHFOBHXcQHIcIOKYGO+4kOA4VcEwDdtxFcBwm4JgW7Lib4DhcwDEd2HEPwXGEgGN6sONeguNIAccMYMd9BMdRAo4ZwY4hBMfRAo42YMdQguMYAcdMYMcwguNYAcfMYMdwguM4AccsYMf9BMfxAo62YMcDBMcJAo5ZwY4HCY4TBRyzgR0PERwnCThmBzseJjhOFnC0AzseIThOEXDMAXY8SnCcKuCYE+x4jOA4TcAxF9jxOMFxuoCjPdjxBMFxhoBjbrDjSYLjTAHHPGDHUwTHWQKOecGOpwmOswUc84EdIwiOcwQcHcCOkQTHuQKOjmDHMwTHeQKOTmDHswTH+QKO+cGO5wiOCwQcC4AdzxMcFwo4FgQ7XiA4LhJwLAR2vEhwXCzg6Ax2vERwXCLg6AJ2vExwXCrg6Ap2vEJwXCbg6AZ2vEpwXC7g6A52vEZwXCHg6AF2vE5wXCng6Al2vEFwXCXg6AV2vElwXC3g6A12vEVwDBZw9AE73iY4rhFwLAx2vENwXCvgWATseJfguE7AsSjY8R7Bcb2AYzGw432C4wYBx+JgxwcEx40CjiXAjg8JjpsEHEuCHR8RHDcLOJYCOz4mOG4RcCwNdnxCcNwq4FgG7PiU4LhNwLEs2PEZwXG7gGM5sONzguMOAcfyYMcXBMedAo4VwI4vCY67BBwrgh1fERx3CzhWAju+JjjuEXCsDHZ8Q3DcK+BYBez4luC4T8CxKtjxHcExRMCxGtjxPcExVMCxOtjxA8ExTMCxBtjxI8ExXMCxJtjxE8Fxv4BjLbDjZ4LjAQHH2mDHLwTHgwKOdcCOXwmOhwQc64IdvxEcDws41gM7fic4HhFwrA92/EFwPCrg2ADs+JPgeEzAsSHYMYrgeFzAsRHY8RfB8YSAY2OwYxwbvONJAccmYEcrguMpAcemYEdrguNpAcdmYMe4BMcIAcfmYMd4BMdIAccWYMf4BMczAo4twY4JCI5nBRx9wY4JCY7nBBz9wI6JCI7nBRz9wY6JCY4XBBwDwI5JCI4XBRwDwY5JCY6XBByDwI7JCI6XBRxbgR2TExyvCDi2BjumIDheFXBsA3ZMSXC8JuDYFuyYiuB4XcCxHdgxNcHxhoBje7BjGoLjTQHHDmDHtATHWwKOHcGO6QiOtwUcO4Ed0xMc7wg4dgY7ZiA43hVw7AJ2zEhwvCfg2BXsaENwvC/g2A3smIng+EDAsTvYMTPB8aGAYw+wYxaC4yMBx55gR1uC42MBx15gx6wExycCjr3BjtkIjk8FHPuAHbMTHJ8JOPYFO9oRHJ8LOPYDO+YgOL4QcOwPdsxJcHwp4DgA7JiL4PhKwHEg2NGe4PhawHEQ2DE3wfGNgONgsGMeguNbAcchYMe8BMd3Ao5DwY75CI7vBRyHgR0dCI4fBByHgx0dCY4fBRxHgB2dCI6fBBxHgh3zExw/CziOAjsWIDh+EXAcDXYsSHD8KuA4BuxYiOD4TcBxLNjRmeD4XcBxHNjRheD4Q8BxPNjRleD4U8BxAtjRjeAYJeA4EezoTnD8JeA4CezoQXCMk9nyHSeDHT0JjlYCjlPAjl4ER2sBx6lgR2+CY1wBx2lgRx+CYzwBx+lgx8IEx/gCjjPAjkUIjgkEHGeCHYsSHBMKOM4COxYjOCYScJwNdixOcEws4DgH7FiC4JhEwHEu2LEkwTGpgOM8sGMpgmMyAcf5YMfSBMfkAo4LwI5lCI4pBBwXgh3LEhxTCjguAjuWIzimEnBcDHYsT3BMLeC4BOxYgeCYRsBxKdixIsExrYDjMrBjJYJjOgHH5WDHygTH9AKOK8COVQiOGQQcV4IdqxIcMwo4rgI7ViM42gg4rgY7Vic4ZhJwDAY71iA4ZhZwXAN2rElwzCLguBbsWIvgaCvguA7sWJvgmFXAcT3YsQ7BMZuA4wawY12CY3YBx41gx3oERzsBx01gx/oExxwCjpvBjg0IjjkFHLeAHRsSHHMJOG4FOzYiONoLOG4DOzYmOOYWcNwOdmxCcMwj4LgD7NiU4JhXwHEn2LEZwTGfgOMusGNzgqODgONusGMLgqOjgOMesGNLgqOTgONesKMvwTG/gOM+sKMfwbGAgGMI2NGf4FhQwDEU7BhAcCwk4BgGdgwkODoLOIaDHYMIji4CjvvBjq0Ijq4CjgfAjq0Jjm4CjgfBjm0Iju4CjofAjm0Jjh4CjofBju0Ijp4CjkfAju0Jjl4CjkfBjh0Ijt4CjsfAjh0Jjj4CjsfBjp0IjoUFHE+AHTsTHIsIOJ4EO3YhOBYVcDwFduxKcCwm4Hga7NiN4FhcwDEC7Nid4FhCwDES7NiD4FhSwPEM2LEnwbGUgONZsGMvgmNpAcdzYMfeBMcyAo7nwY59CI5lBRwvgB37EhzLCTheBDv2IziWF3C8BHbsT3CsIOB4Gew4gOBYUcDxCthxIMGxEtjRCuwYnXsQIXdlgdyDCbmrCOQeQshdVSD3UELuagK5hxFyVxfIPZyQu4ZA7hGE3DUFco8k5K4lkHsUIXdtgdyjCbnrCOQeQ8hdVyD3WELuegK5xxFy1xfIPZ6Qu4FA7gmE3A0Fck8k5G4kkHsSIXdjgdyTCbmbCOSeQsjdVCD3VELuZgK5pxFyNxfIPZ2Qu4VA7hmE3C0Fcs8k5PYVyD2LkNtPIPdsQm5/gdxzCLkDBHLPJeQOFMg9j5A7SCD3fELuVgK5FxByt7bw/59+zch83Qa3XvRaNwiObQQcbwIdb8Ssh3ZsK+B4C+x4i+DYTsDxNtjxNsGxvYDjHbDjHYJjBwHHu2DHuwTHjgKO98CO9wiOnQQc74Md7xMcOws4PgA7PiA4dhFwfAh2fEhw7Crg+Ajs+Ijg2E3A8THY8THBsbuFn1e4HDMP/8Pj4+Lp6+7m7Ovr4e3p7eHr52vkd3F1d/f18XLzdfPzd/Pw9vbwCfD19vTydvcL9HBx9nF38/QO9A7y8wzycnW+ZoMz7CGwF5+A9+ITwl7sKfDeiUfg905Er4d27CXg+Bjs+Jjg2FvA8QnY8QnBsY+A41Ow41OCY18Bx2dgx2cEx34Cjs/Bjs8Jjv0FHF+AHV8QHAcIOL4EO74kOA4UcHwFdnxFcBwk4Pga7Pia4DhYwPEN2PENwXGIhZ+jCDYWjM6Ozj1U4LzCU/B5haeE8wrDBByfgR2fERyHCzg+Bzs+JziOEHB8AXZ8QXAcKeD4Euz4kuA4SsDxFdjxFcFxtIDja7Dja4LjGAHHN2DHNwTHsQKOb8GObwmO4wQc34Ed3xEcxws4vgc7vic4ThBw/AB2/EBwnGjh5xXOGQteI+SeJHBe6if4vNRPwnmpyQKOUWDHKILjFAHHX2DHXwTHqQKOcTJiHaPXQztOE3C0AjtaERynCzhagx2tCY4zBBzjgh3jEhxnCjjGAzvGIzjOEnCMD3aMT3CcLeCYAOyYgOA4R8AxIdgxIcFxroBjIrBjIoLjPAHHxGDHxATH+QKOScCOSQiOCwQck4IdkxIcFwo4JgM7JiM4LhJwTA52TE5wXCzgmALsmILguETAMSXYMSXBcamAYyqwYyqC4zIBx9Rgx9QEx+UCjmnAjmkIjisEHNOCHdMSHFcKOKYDO6YjOK4ScEwPdkxPcFwt4JgB7JiB4Bgs4JgR7JiR4LhGwNEG7GhDcFwr4JgJ7JiJ4LhOwDEz2DEzwXG9gGMWsGMWguMGAUdbsKMtwXGjgGNWsGNWguMmC//92cD0nPflbhbYP9mA+2cN6f3NWyx8/6wl5d76N9s/bWLWQztuE3DMDnbMTnDcLuBoB3a0IzjuEHDMAXbMQXDcKeCYE+yYk+C4S8AxF9gxF8Fxt4CjPdjRnuC4R8AxN9gxN8Fxr4BjHrBjHoLjPgHHvGDHvATHEAHHfGDHfATHUAFHB7CjA8Ex7G82XweRznOFC1xn4CP4OgMfCe+33y/g+Ans+IngeEDA8TPY8TPB8aCA4xew4xeC4yEBx69gx68Ex8MCjt/Ajt8IjkcEHL+DHb8THI8KOP4AO/4gOB4TcPwJdvxJcDwu4BgFdowiOJ4QcPwFdvxFcDwp4BgnE9Yxej204ykBRyuwoxXB8bSAozXY0ZrgGCHgGBfsGJfgGCngGA/sGI/geEbAMT7YMT7B8ayAYwKwYwKC4zkBx4Rgx4QEx/MCjonAjokIjhcEHBODHRMTHC8KOCYBOyYhOF4ScEwKdkxKcLws4JgM7JiM4HhFwDE52DE5wfGqgGMKsGMKguM1AceUYMeUBMfrAo6pwI6pCI43BBxTgx1TExxvCjimATumITjeEnBMC3ZMS3C8LeCYDuyYjuB4R8AxPdgxPcHxroBjBrBjBoLjPQHHjGDHjATH+wKONmBHG4LjAwHHTGDHTATHhwKOmcGOmQmOjwQcs4AdsxAcHws42oIdbQmOTwQcs4IdsxIcnwo4ZgM7ZiM4PhNwzA52zE5wfC7gaAd2tCM4vhBwzAF2zEFwfCngmBPsmJPg+ErAMRfYMRfB8bWAoz3Y0Z7g+EbAMTfYMTfB8a2AYx6wYx6C4zsBx7xgx7wEx/cCjvnAjvkIjh8EHB3Ajg4Ex48Cjo5gR0eC4ycBRyewoxPB8bOAY36wY36C4xcBxwJgxwIEx68CjgXBjgUJjt8EHAuBHQsRHL8LODqDHZ0Jjj8EHF3Aji4Ex58Cjq5gR1eCY5SAoxvY0Y3g+EvA0R3s6E5wjJPF8h09wI4eBEcrAUdPsKMnwdFawNEL7OhFcIwr4OgNdvQmOMYTcPQBO/oQHOMLOBYGOxYmOCYQcCwCdixCcEwo4FgU7FiU4JhIwLEY2LEYwTGxgGNxsGNxgmMSAccSYMcSBMekAo4lwY4lCY7JBBxLgR1LERyTCziWBjuWJjimEHAsA3YsQ3BMKeBYFuxYluCYSsCxHNixHMExtYBjebBjeYJjGgHHCmDHCgTHtAKOFcGOFQmO6QQcK4EdKxEc0ws4VgY7ViY4ZhBwrAJ2rEJwzCjgWBXsWJXgaCPgWA3sWI3gmEnAsTrYsTrBMbOAYw2wYw2CYxYBx5pgx5oER1sBx1pgx1oEx6wCjrXBjrUJjtkEHOuAHesQHLMLONYFO9YlONoJONYDO9YjOOYQcKwPdqxPcMwp4NgA7NiA4JhLwLEh2LEhwdFewLER2LERwTG3gGNjsGNjgmMeAccmYMcmBMe8Ao5NwY5NCY75BBybgR2bERwdBBybgx2bExwdBRxbgB1bEBydBBxbgh1bEhzzCzj6gh19CY4FBBz9wI5+BMeCAo7+YEd/gmMhAccAsGMAwdFZwDEQ7BhIcHQRcAwCOwYRHF0FHFuBHVsRHN0EHFuDHVsTHN0FHNuAHdsQHD0EHNuCHdsSHD0FHNuBHdsRHL0EHNuDHdsTHL0FHDuAHTsQHH0EHDuCHTsSHAsLOHYCO3YiOBYRcOwMduxMcCwq4NgF7NiF4FhMwLEr2LErwbG4gGM3sGM3gmMJAcfuYMfuBMeSAo49wI49CI6lBBx7gh17EhxLCzj2Ajv2IjiWEXDsDXbsTXAsK+DYB+zYh+BYTsCxL9ixL8GxvIBjP7BjP4JjBQHH/mDH/gTHigKOA8COAwiOlQQcB4IdBxIcKws4DgI7DiI4VhFwHAx2HExwrCrgOATsOITgWE3AcSjYcSjBsbqA4zCw4zCCYw0Bx+Fgx+EEx5oCjiPAjiMIjrUEHEeCHUcSHGsLOI4CO44iONYRcBwNdhxNcKwr4DgG7DiG4FhPwHEs2HEswbG+gOM4sOM4gmMDAcfxYMfxBMeGAo4TwI4TCI6NBBwngh0nEhwbCzhOAjtOIjg2EXCcDHacTHBsKuA4Bew4heDYTMBxKthxKsGxuYDjNLDjNIJjCwHH6WDH6QTHlgKOM8COMwiOvgKOM8GOMwmOfgKOs8COswiO/gKOs8GOswmOAQKOc8COcwiOgQKOc8GOcwmOQQKO88CO8wiOrQQc54Md5xMcWws4LgA7LiA4thFwXAh2XEhwbCvguAjsuIjg2E7AcTHYcTHBsb2A4xKw4xKCYwcBx6Vgx6UEx44CjsvAjssIjp0EHJeDHZcTHDsLOK4AO64gOHYRcFwJdlxJcOwq4LgK7LiK4NhNwHE12HE1wbG7gGMw2DGY4NhDwHEN2HENwbGngONasONagmMvAcd1YMd1BMfeAo7rwY7rCY59BBw3gB03EBz7CjhuBDtuJDj2E3DcBHbcRHDsL+C4Gey4meA4QMBxC9hxC8FxoIDjVrDjVoLjIAHHbWDHbQTHwQKO28GO2wmOQwQcd4AddxAchwo47gQ77iQ4DhNw3AV23EVwHC7guBvsuJvgOELAcQ/YcQ/BcaSA416w416C4ygBx31gx30Ex9ECjiFgxxCC4xgBx1CwYyjBcayAYxjYMYzgOE7AMRzsGE5wHC/guB/suJ/gOEHA8QDY8QDBcaKA40Gw40GC4yQBx0Ngx0MEx8kCjofBjocJjlMEHI+AHY8QHKcKOB4FOx4lOE4TcDwGdjxGcJwu4Hgc7Hic4DhDwPEE2PEEwXGmgONJsONJguMsAcdTYMdTBMfZAo6nwY6nCY5zBBwjwI4RBMe5Ao6RYMdIguM8AcczYMczBMf5Ao5nwY5nCY4LBBzPgR3PERwXCjieBzueJzguEnC8AHa8QHBcLOB4Eex4keC4RMDxEtjxEsFxqYDjZbDjZYLjMgHHK2DHKwTH5QKOV8GOVwmOKwQcr4EdrxEcVwo4Xgc7Xic4rhJwvAF2vEFwXC3geBPseJPgGCzgeAvseIvguEbA8TbY8TbBca2A4x2w4x2C4zoBx7tgx7sEx/UCjvfAjvcIjhsEHO+DHe8THDcKOD4AOz4gOG4ScHwIdnxIcNws4PgI7PiI4LhFwPEx2PExwXGrgOMTsOMTguM2AcenYMenBMftAo7PwI7PCI47BByfgx2fExx3Cji+ADu+IDjuEnB8CXZ8SXDcLeD4Cuz4iuC4R8DxNdjxNcFxr4DjG7DjG4LjPgHHt2DHtwTHEAHHd2DHdwTHUAHH92DH9wTHMAHHD2DHDwTHcAHHj2DHjwTH/QKOn8COnwiOBwQcP4MdPxMcDwo4fgE7fiE4HhJw/Ap2/EpwPCzg+A3s+I3geETA8TvY8TvB8aiA4w+w4w+C4zEBx59gx58Ex+MCjlFgxyiC4wkBx19gx18Ex5MCjnEyYx2j10M7nhJwtAI7WhEcTws4WoMdrQmOEQKOccGOcQmOkQKO8cCO8QiOZwQc44Md4xMczwo4JgA7JiA4nhNwTAh2TEhwPC/gmAjsmIjgeEHAMTHYMTHB8aKAYxKwYxKC4yUBx6Rgx6QEx8sCjsnAjskIjlcEHJODHZMTHK8KOKYAO6YgOF4TcEwJdkxJcLwu4JgK7JiK4HhDwDE12DE1wfGmgGMasGMaguMtAce0YMe0BMfbAo7pwI7pCI53BBzTgx3TExzvCjhmADtmIDjeE3DMCHbMSHC8L+BoA3a0ITg+EHDMBHbMRHB8KOCYGeyYmeD4SMAxC9gxC8HxsYCjLdjRluD4RMAxK9gxK8HxqYBjNrBjNoLjMwHH7GDH7ATH5wKOdmBHO4LjCwHHHGDHHATHlwKOOcGOOQmOrwQcc4EdcxEcXws42oMd7QmObwQcc4MdcxMc3wo45gE75iE4vhNwzAt2zEtwfC/gmA/smI/g+EHA0QHs6EBw/Cjg6Ah2dCQ4fhJwdAI7OhEcPws45gc75ic4fhFwLAB2LEBw/CrgWBDsWJDg+E3AsRDYsRDB8buAozPY0Zng+EPA0QXs6EJw/Cng6Ap2dCU4Rgk4uoEd3QiOvwQc3cGO7gTHOLaW7+gBdvQgOFoJOHqCHT0JjtYCjl5gRy+CY1wBR2+wozfBMZ6Aow/Y0YfgGF/AsTDYsTDBMYGAYxGwYxGCY0IBx6Jgx6IEx0QCjsXAjsUIjokFHIuDHYsTHJMIOJYAO5YgOCYVcCwJdixJcEwm4FgK7FiK4JhcwLE02LE0wTGFgGMZsGMZgmNKAceyYMeyBMdUAo7lwI7lCI6pBRzLgx3LExzTCDhWADtWIDimFXCsCHasSHBMJ+BYCexYieCYXsCxMtixMsExg4BjFbBjFYJjRgHHqmDHqgRHGwHHamDHagTHTAKO1cGO1QmOmQUca4AdaxAcswg41gQ71iQ42go41gI71iI4ZhVwrA12rE1wzCbgWAfsWIfgmF3AsS7YsS7B0U7AsR7YsR7BMYeAY32wY32CY04BxwZgxwYEx1wCjg3Bjg0JjvYCjo3Ajo0IjrkFHBuDHRsTHPMIODYBOzYhOOYVcGwKdmxKcMwn4NgM7NiM4Ogg4Ngc7Nic4Ogo4NgC7NiC4Ogk4NgS7NiS4JhfwNEX7OhLcCwg4OgHdvQjOBYUcPQHO/oTHAsJOAaAHQMIjs4CjoFgx0CCo4uAYxDYMYjg6Crg2Ars2Irg6Cbg2Brs2Jrg6A52tAI7njcWjLZE5/aw8NwXSLk9LTz3RVJuLwvPfYmU29vCc18m5fax8NxXSLkLW3juq6TcRSw89zVS7qIWnvs6KXcxC899g5S7uIXnvknKXcLCc98i5S5p4blvk3KXsvDcd0i5S1t47ruk3GUsPPc9Uu6yFp77Pil3OQvP/YCUu7yF535Iyl3BwnM/IuWuaOG5H5NyV7Lw3E9IuStbeO6npNxVLDz3M1Luqhae+zkpdzULz/2ClLu6hed+Scpdw8JzvyLlrmnhuV+Tctey8NxvSLlrW3jut6TcdYC5E8Ss89sxxv5Ce4y0xh137OOta/s7x486aBZE7INGrVvPFrfJWLmjjxH8GP3XZkgU63ij/52omD/Xj3GOvj1urL+Lvn1UzP1Gx7p/g1j3/731GsY6/ugva1OWv+qOfAwb2WK/D9C/eLPIeHJcboNbb1nMeugn3MYW/gtM0Y4rwI4rCI5NBBxXgh1XEhybCjiuAjuuIjg2E3BcDXZcTXBsLuAYDHYMJji2EHBcA3ZcQ3BsKeC4Fuy4luDoK+C4Duy4juDoJ+C4Huy4nuDoL+C4Aey4geAYIOC4Eei4xFhrGcEx8G/muCxmPbRjkIDjJrDjJoJjKwHHzWDHzQTH1gKOW8COWwiObQQct4IdtxIc2wo4bgM7biM4thNw3A523E5wbC/guAPsuIPg2EHAcSfYcSfBsaOA4y6w4y6CYycBx91gx90Ex84CjnvAjnsIjl0EHPeCHfcSHLsKOO4DO+4jOHYTcAwBO4YQHLsLOIaCHUMJjj0EHMPAjmEEx54CjuFgx3CCYy8Bx/1gx/0Ex94CjgfAjgcIjn0EHA+CHQ8SHPsKOB4COx4iOPYTcDwMdjxMcOwv4HgE7HiE4DhAwPEo2PEowXGggOMxsOMxguMgAcfjYMfjBMfBAo4nwI4nCI5DBBxPgh1PEhyHCjieAjueIjgOE3A8DXY8TXAcLuAYAXaMIDiOEHCMBDtGEhxHCjieATueITiOsvALAiy14fwe8ui/2e8hD7fmOI6x8P0zgpR7LDj3b1/W4OP8YIVba1zszC6evu5uzr6+Ht6e3h6+fr7Gmi6u7u6+Pl5uvm5+/m4e3t4ePgG+3p5e3u5+gR4uzj7ubp7egd5Bfp5BXq7/pxfRGAd8rGIf73i1i2hEQ4wnXERjgoVfRCM694T/g4tovLf6n4teTIx1UQxr0+2x7zfpdy6eEfv2yb9zMY7JMRfj+BBzv4+x7j+FfLEN5GM9FXyxDVbmjNa4tabZWvZzRPRjMs0W/wNzuoW/4DpvvEi4DnzBdcVYqw3hE41mWPgLrujvlamE/TNTYP/cBO+ftoT9M0vA8RbYsR3BcbaA422wY3uC4xwBxztgxw4Ex7kCjnfBjh0JjvMEHO+BHTsRHOcLON4HO3YmOC4QcHwAduxCcFwo4PgQ7NiV4LhIwPER2LEbwXGxgONjsGN3guMSAccnYMceBMelf0PHngTHZQKOT8GOwwiOywUcn4EdhxMcVwg4Pgc7jiA4rhRwfAF2HElwXCXg+BLsOIrguFrA8RXYcTTBMVjA8TXYcQzBcY2A4xuw41iC41oBx7dgx3EEx3UCju/AjuMJjusFHN+DHScQHDcIOH4AO04kOG608N9/iM49iZB7k8D++QjeP/sJjpsFHD+BHQ8QHLcIOH4GOx4kOG4VcPwCdjxEcNwm4PgV7HiY4LhdwPEb2PEIwXGHgON3sONRguNOAccfYMdjBMddAo4/wY7HCY67BRyjwI4nCI57BBx/gR1PEhz3CjjGyYR1PEVw3CfgaAV2PE1wDBFwtAY7RhAcQwUc44IdIwmOYQKO8cCOZwiO4QKO8cGOZwmO+wUcE4AdzxEcDwg4JgQ7nic4HhRwTAR2vEBwPCTgmBjseJHgeFjAMQnY8RLB8YiAY1Kw42WC41EBx2RgxysEx2MCjsnBjlcJjscFHFOAHa8RHE8IOKYEO14nOJ4UcEwFdrxBcDwl4Jga7HiT4HhawDEN2PEWwTFCwDEt2PE2wTFSwDEd2PEOwfGMgGN6sONdguNZAccMYMd7BMdzAo4ZwY73CY7nBRxtwI4PCI4XBBwzgR0fEhwvCjhmBjs+IjheEnDMAnZ8THC8LOBoC3Z8QnC8IuCYFez4lOB4VcAxG9jxGcHxmoBjdrDjc4LjdQFHO7DjC4LjDQHHHGDHlwTHmwKOOcGOrwiOtwQcc4EdXxMcbws42oMd3xAc7wg45gY7viU43hVwzAN2fEdwvCfgmBfs+J7geF/AMR/Y8QPB8YGAowPY8SPB8aGAoyPY8RPB8ZGAoxPY8TPB8bGAY36w4xeC4xMBxwJgx68Ex6cCjgXBjt8Ijs8EHAuBHb8THJ8LODqDHX8QHF8IOLqAHX8SHF8KOLqCHaMIjq8EHN3Ajr8Ijq8FHN3BjnGy4B3fCDh6gB2tCI5vBRw9wY7WBMd3Ao5eYMe4BMf3Ao7eYMd4BMcPAo4+YMf4BMePAo6FwY4JCI6fBByLgB0TEhw/CzgWBTsmIjh+EXAsBnZMTHD8KuBYHOyYhOD4TcCxBNgxKcHxu4BjSbBjMoLjDwHHUmDH5ATHnwKOpcGOKQiOUQKOZcCOKQmOvwQcy4IdUxEc42S1fMdyYMfUBEcrAcfyYMc0BEdrAccKYMe0BMe4Ao4VwY7pCI7xBBwrgR3TExzjCzhWBjtmIDgmEHCsAnbMSHBMKOBYFexoQ3BMJOBYDeyYieCYWMCxOtgxM8ExiYBjDbBjFoJjUgHHmmBHW4JjMgHHWmDHrATH5AKOtcGO2QiOKQQc64AdsxMcUwo41gU72hEcUwk41gM75iA4phZwrA92zElwTCPg2ADsmIvgmFbAsSHY0Z7gmE7AsRHYMTfBMb2AY2OwYx6CYwYBxyZgx7wEx4wCjk3BjvkIjjYCjs3Ajg4Ex0wCjs3Bjo4Ex8wCji3Ajk4ExywCji3BjvkJjrYCjr5gxwIEx6wCjn5gx4IEx2wCjv5gx0IEx+wCjgFgR2eCo52AYyDY0YXgmEPAMQjs6EpwzCng2Ars6EZwzCXg2Brs6E5wtBdwbAN29CA45hZwbAt29CQ45hFwbAd29CI45hVwbA929CY45hNw7AB29CE4Ogg4dgQ7FiY4Ogo4dgI7FiE4Ogk4dgY7FiU45hdw7AJ2LEZwLCDg2BXsWJzgWFDAsRvYsQTBsZCAY3ewY0mCo7OAYw+wYymCo4uAY0+wY2mCo6uAYy+wYxmCo5uAY2+wY1mCo7uAYx+wYzmCo4eAY1+wY3mCo6eAYz+wYwWCo5eAY3+wY0WCo7eA4wCwYyWCo4+A40CwY2WCY2EBx0FgxyoExyICjoPBjlUJjkUFHIeAHasRHIsJOA4FO1YnOBYXcBwGdqxBcCwh4Dgc7FiT4FhSwHEE2LEWwbGUgONIsGNtgmNpAcdRYMc6BMcyAo6jwY51CY5lBRzHgB3rERzLCTiOBTvWJziWF3AcB3ZsQHCsIOA4HuzYkOBYUcBxAtixEcGxkoDjRLBjY4JjZQHHSWDHJgTHKgKOk8GOTQmOVQUcp4AdmxEcqwk4TgU7Nic4VhdwnAZ2bEFwrCHgOB3s2JLgWFPAcQbY0ZfgWEvAcSbY0Y/gWFvAcRbY0Z/gWEfAcTbYMYDgWFfAcQ7YMZDgWE/AcS7YMYjgWF/AcR7YsRXBsYGA43ywY2uCY0MBxwVgxzYEx0YCjgvBjm0Jjo0FHBeBHdsRHJsIOC4GO7YnODYVcFwCduxAcGwm4LgU7NiR4NhcwHEZ2LETwbGFgONysGNngmNLAccVYMcuBEdfAceVYMeuBEc/AcdVYMduBEd/AcfVYMfuBMcAAcdgsGMPgmOggOMasGNPgmOQgONasGMvgmMrAcd1YMfeBMfWAo7rwY59CI5tBBw3gB37EhzbCjhuBDv2Izi2E3DcBHbsT3BsL+C4Gew4gODYQcBxC9hxIMGxo4DjVrDjIIJjJwHHbWDHwQTHzgKO28GOQwiOXQQcd4AdhxIcuwo47gQ7DiM4dhNw3AV2HE5w7C7guBvsOILg2EPAcQ/YcSTBsaeA416w4yiCYy8Bx31gx9EEx94CjiFgxzEExz4CjqFgx7EEx74CjmFgx3EEx34CjuFgx/EEx/4CjvvBjhMIjgMEHA+AHScSHAcKOB4EO04iOA4ScDwEdpxMcBws4HgY7DiF4DhEwPEI2HEqwXGogONRsOM0guMwAcdjYMfpBMfhAo7HwY4zCI4jBBxPgB1nEhxHCjieBDvOIjiOEnA8BXacTXAcLeB4Guw4h+A4RsAxAuw4l+A4VsAxEuw4j+A4TsDxDNhxPsFxvIDjWbDjAoLjBAHHc2DHhQTHiQKO58GOiwiOkwQcL4AdFxMcJws4XgQ7LiE4ThFwvAR2XEpwnCrgeBnsuIzgOE3A8QrYcTnBcbqA41Ww4wqC4wwBx2tgx5UEx5kCjtfBjqsIjrMEHG+AHVcTHGcLON4EOwYTHOcION4CO64hOM4VcLwNdlxLcJwn4HgH7LiO4DhfwPEu2HE9wXGBgOM9sOMGguNCAcf7YMeNBMdFAo4PwI6bCI6LBRwfgh03ExyXCDg+AjtuITguFXB8DHbcSnBcJuD4BOy4jeC4XMDxKdhxO8FxhYDjM7DjDoLjSgHH52DHnQTHVQKOL8COuwiOqwUcX4IddxMcgwUcX4Ed9xAc1wg4vgY77iU4rhVwfAN23EdwXCfg+BbsGEJwXC/g+A7sGEpw3CDg+B7sGEZw3Cjg+AHsGE5w3CTg+BHsuJ/guFnA8RPY8QDBcYuA42ew40GC41YBxy9gx0MEx20Cjl/BjocJjtsFHL+BHY8QHHcIOH4HOx4lOO4UcPwBdjxGcNwl4PgT7Hic4LhbwDEK7HiC4LhHwPEX2PEkwXGvgGOczFjHUwTHfQKOVmDH0wTHEAFHa7BjBMExVMAxLtgxkuAYJuAYD+x4huAYLuAYH+x4luC4X8AxAdjxHMHxgIBjQrDjeYLjQQHHRGDHCwTHQwKOicGOFwmOhwUck4AdLxEcjwg4JgU7XiY4HhVwTAZ2vEJwPCbgmBzseJXgeFzAMQXY8RrB8YSAY0qw43WC40kBx1RgxxsEx1MCjqnBjjcJjqcFHNOAHW8RHCMEHNOCHW8THCMFHNOBHe8QHM8IOKYHO94lOJ4VcMwAdrxHcDwn4JgR7Hif4HhewNEG7PiA4HhBwDET2PEhwfGigGNmsOMjguMlAccsYMfHBMfLAo62YMcnBMcrAo5ZwY5PCY5XBRyzgR2fERyvCThmBzs+JzheF3C0Azu+IDjeEHDMAXZ8SXC8KeCYE+z4iuB4S8AxF9jxNcHxtoCjPdjxDcHxjoBjbrDjW4LjXQHHPGDHdwTHewKOecGO7wmO9wUc84EdPxAcHwg4OoAdPxIcHwo4OoIdPxEcHwk4OoEdPxMcHws45gc7fiE4PhFwLAB2/EpwfCrgWBDs+I3g+EzAsRDY8TvB8bmAozPY8QfB8YWAowvY8SfB8aWAoyvYMYrg+ErA0Q3s+Ivg+FrA0R3sGMcW7/hGwNED7GhFcHwr4OgJdrQmOL4TcPQCO8YlOL4XcPQGO8YjOH4QcPQBO8YnOH4UcCwMdkxAcPwk4FgE7JiQ4PhZwLEo2DERwfGLgGMxsGNiguNXAcfiYMckBMdvAo4lwI5JCY7fBRxLgh2TERx/CDiWAjsmJzj+FHAsDXZMQXCMEnAsA3ZMSXD8JeBYFuyYiuAYJ5vlO5YDO6YmOFoJOJYHO6YhOFoLOFYAO6YlOMYVcKwIdkxHcIwn4FgJ7Jie4BhfwLEy2DEDwTGBgGMVsGNGgmNCAceqYEcbgmMiAcdqYMdMBMfEAo7VwY6ZCY5JBBxrgB2zEByTCjjWBDvaEhyTCTjWAjtmJTgmF3CsDXbMRnBMIeBYB+yYneCYUsCxLtjRjuCYSsCxHtgxB8ExtYBjfbBjToJjGgHHBmDHXATHtAKODcGO9gTHdAKOjcCOuQmO6QUcG4Md8xAcMwg4NgE75iU4ZhRwbAp2zEdwtBFwbAZ2dCA4ZhJwbA52dCQ4ZhZwbAF2dCI4ZhFwbAl2zE9wtBVw9AU7FiA4ZhVw9AM7FiQ4ZhNw9Ac7FiI4ZhdwDAA7OhMc7QQcA8GOLgTHHAKOQWBHV4JjTgHHVmBHN4JjLgHH1mBHd4KjPdjRCuwYnduDkDu3QG5PQu48Arm9CLnzCuT2JuTOJ5Dbh5DbQSB3YUJuR4HcRQi5nQRyFyXkzi+QuxghdwGB3MUJuQsK5C5ByF1IIHdJQm5ngdylCLldBHKXJuR2FchdhpDbTSB3WUJud4Hc5Qi5PQRylyfk9hTIXYGQ20sgd0VCbm+B3JUIuX0Eclcm5C4skLsKIXcRgdxVCbmLCuSuRshdTCB3dULu4gK5axBylxDIXZOQu6RA7lqE3KUEctcm5C4tkLsOIXcZC///6dONzDNscetFrzWT4FhWwHEW0HFmzHpox3ICjrPBjrMJjuUFHOeAHecQHCsIOM4FO84lOFYUcJwHdpxHcKwk4Dgf7Dif4FhZwHEB2HEBwbGKgONCsONCgmNVAcdFYMdFBMdqAo6LwY6LCY7VBRyXgB2XEBxrCDguBTsuJTjWtPDzM1Niziv8w+Pj4unr7ubs6+vh7ent4evna+R3cXV39/XxcvN18/N38/D29vAJ8PX29PJ29wv0cHH2cXfz9A70DvLzDPJydZ5uizOsJbAXl4H34jLCXqwt8B6UXuD3oESvh3asI+DYG+zYm+BYV8CxD9ixD8GxnoBjX7BjX4JjfQHHfmDHfgTHBgKO/cGO/QmODQUcB4AdBxAcGwk4DgQ7DiQ4NhZwHAR2HERwbCLgOBjsOJjg2FTAcQjYcQjBsZmA41Cw41CCY3MLP9cTYSwYnR2du4XA+Znl4PMzywnnZ1oKOK4AO64gOPoKOK4EO64kOPoJOK4CO64iOPoLOK4GO64mOAYIOAaDHYMJjoECjmvAjmsIjkECjmvBjmsJjq0EHNeBHdcRHFsLOK4HO64nOLYRcNwAdtxAcGwr4LgR7LiR4NhOwHET2HETwbG9hZ+f+WwsOJ2Qu4PA+b3J4PN7kwnn9zoKOE4BO04hOHYScJwKdpxKcOws4DgN7DiN4NhFwHE62HE6wbGrgOMMsOMMgmM3AceZYMeZBMfuAo6zwI6zCI49BBxngx1nExx7CjjOATvOITj2EnCcC3acS3DsLeA4D+w4j+DYR8BxPthxPsGxr4DjArDjAoJjPwHHhWDHhQTH/gKOi8COiwiOAwQcF4MdFxMcBwo4LgE7LiE4DhJwXAp2XEpwHCzguAzsuIzgOETAcTnYcTnBcaiA4wqw4wqC4zABx5Vgx5UEx+ECjqvAjqsIjiMEHFeDHVcTHEcKOAaDHYMJjqMEHNeAHdcQHEcLOK4FO64lOI4RcFwHdlxHcBwr4Lge7Lie4DhOwHED2HEDwXG8gONGsONGguMEAcdNYMdNBMeJAo6bwY6bCY6TBBy3gB23EBwnCzhuBTtuJThOsfDfi79gw7luwVSB/bMNuH8iSdd/mGbh++cMKff0v9n+uRKzHtpxhoDjdrDjdoLjTAHHHWDHHQTHWQKOO8GOOwmOswUcd4EddxEc5wg47gY77iY4zhVw3AN23ENwnCfguBfsuJfgOF/AcR/YcR/BcYGAYwjYMYTguFDAMRTsGEpwXCTgGAZ2DCM4LhZwDAc7hhMcl/zNzlNcJJ0vXCpwHZbN4OuwbCZcj2SZgOMWsOMWguNyAcetYMetBMcVAo7bwI7bCI4rBRy3gx23ExxXCTjuADvuIDiuFnDcCXbcSXAMFnDcBXbcRXBcI+C4G+y4m+C4VsBxD9hxD8FxnYDjXrDjXoLjegHHfWDHfQTHDQKOIWDHEILjRgHHULBjKMFxk4BjGNgxjOC4WcAxHOwYTnDcIuC4H+y4n+C4VcDxANjxAMFxm4DjQbDjQYLjdgHHQ2DHQwTHHQKOh8GOhwmOOwUcj4AdjxAcdwk4HgU7HiU47hZwPAZ2PEZw3CPgeBzseJzguFfA8QTY8QTBcZ+A40mw40mCY4iA4ymw4ymCY6iA42mw42mCY5iAYwTYMYLgGC7gGAl2jCQ47hdwPAN2PENwPCDgeBbseJbgeFDA8RzY8RzB8ZCA43mw43mC42EBxwtgxwsExyMCjhfBjhcJjkcFHC+BHS8RHI8JOF4GO14mOB4XcLwCdrxCcDwh4HgV7HiV4HhSwPEa2PEawfGUgON1sON1guNpAccbYMcbBMcIAcebYMebBMdIAcdbYMdbBMczAo63wY63CY5nBRzvgB3vEBzPCTjeBTveJTieF3C8B3a8R3C8IOB4H+x4n+B4UcDxAdjxAcHxkoDjQ7DjQ4LjZQHHR2DHRwTHKwKOj8GOjwmOVwUcn4AdnxAcrwk4PgU7PiU4XhdwfAZ2fEZwvCHg+Bzs+JzgeFPA8QXY8QXB8ZaA40uw40uC420Bx1dgx1cExzsCjq/Bjq8JjncFHN+AHd8QHO8JOL4FO74lON4XcHwHdnxHcHwg4Pge7Pie4PhQwPED2PEDwfGRgONHsONHguNjAcdPYMdPBMcnAo6fwY6fCY5PBRy/gB2/EByfCTh+BTt+JTg+F3D8Bnb8RnB8IeD4Hez4neD4UsDxB9jxB8HxlYDjT7DjT4LjawHHKLBjFMHxjYDjL7DjL4LjWwHHOFmxjtHroR3fCThagR2tCI7vBRytwY7WBMcPAo5xwY5xCY4fBRzjgR3jERw/CTjGBzvGJzh+FnBMAHZMQHD8IuCYEOyYkOD4VcAxEdgxEcHxm4BjYrBjYoLjdwHHJGDHJATHHwKOScGOSQmOPwUck4EdkxEcowQck4MdkxMcfwk4pgA7piA4xslu+Y4pwY4pCY5WAo6pwI6pCI7WAo6pwY6pCY5xBRzTgB3TEBzjCTimBTumJTjGF3BMB3ZMR3BMIOCYHuyYnuCYUMAxA9gxA8ExkYBjRrBjRoJjYgFHG7CjDcExiYBjJrBjJoJjUgHHzGDHzATHZAKOWcCOWQiOyQUcbcGOtgTHFAKOWcGOWQmOKQUcs4EdsxEcUwk4Zgc7Zic4phZwtAM72hEc0wg45gA75iA4phVwzAl2zElwTCfgmAvsmIvgmF7A0R7saE9wzCDgmBvsmJvgmFHAMQ/YMQ/B0UbAMS/YMS/BMZOAYz6wYz6CY2YBRwewowPBMYuAoyPY0ZHgaCvg6AR2dCI4ZhVwzA92zE9wzCbgWADsWIDgmF3AsSDYsSDB0U7AsRDYsRDBMYeAozPY0ZngmFPA0QXs6EJwzCXg6Ap2dCU42gs4uoEd3QiOuQUc3cGO7gTHPAKOHmBHD4JjXgFHT7CjJ8Exn4CjF9jRi+DoIODoDXb0Jjg6Cjj6gB19CI5OAo6FwY6FCY75BRyLgB2LEBwLCDgWBTsWJTgWFHAsBnYsRnAsJOBYHOxYnODoLOBYAuxYguDoIuBYEuxYkuDoKuBYCuxYiuDoJuBYGuxYmuDoLuBYBuxYhuDoIeBYFuxYluDoKeBYDuxYjuDoJeBYHuxYnuDoLeBYAexYgeDoI+BYEexYkeBYWMCxEtixEsGxiIBjZbBjZYJjUQHHKmDHKgTHYgKOVcGOVQmOxQUcq4EdqxEcSwg4Vgc7Vic4lhRwrAF2rEFwLCXgWBPsWJPgWFrAsRbYsRbBsYyAY22wY22CY1kBxzpgxzoEx3ICjnXBjnUJjuUFHOuBHesRHCsIONYHO9YnOFYUcGwAdmxAcKwk4NgQ7NiQ4FhZwLER2LERwbGKgGNjsGNjgmNVAccmYMcmBMdqAo5NwY5NCY7VBRybgR2bERxrCDg2Bzs2JzjWFHBsAXZsQXCsJeDYEuzYkuBYW8DRF+zoS3CsI+DoB3b0IzjWFXD0Bzv6ExzrCTgGgB0DCI71BRwDwY6BBMcGAo5BYMcggmNDAcdWYMdWBMdGAo6twY6tCY6NBRzbgB3bEBybCDi2BTu2JTg2FXBsB3ZsR3BsJuDYHuzYnuDYXMCxA9ixA8GxhYBjR7BjR4JjSwHHTmDHTgRHXwHHzmDHzgRHPwHHLmDHLgRHfwHHrmDHrgTHAAHHbmDHbgTHQAHH7mDH7gTHIAHHHmDHHgTHVgKOPcGOPQmOrQUce4EdexEc2wg49gY79iY4thVw7AN27ENwbCfg2Bfs2Jfg2F7AsR/YsR/BsYOAY3+wY3+CY0cBxwFgxwEEx04CjgPBjgMJjp0FHAeBHQcRHLsIOA4GOw4mOHYVcBwCdhxCcOwm4DgU7DiU4NhdwHEY2HEYwbGHgONwsONwgmNPAccRYMcRBMdeAo4jwY4jCY69BRxHgR1HERz7CDiOBjuOJjj2FXAcA3YcQ3DsJ+A4Fuw4luDYX8BxHNhxHMFxgIDjeLDjeILjQAHHCWDHCQTHQQKOE8GOEwmOgwUcJ4EdJxEchwg4TgY7TiY4DhVwnAJ2nEJwHCbgOBXsOJXgOFzAcRrYcRrBcYSA43Sw43SC40gBxxlgxxkEx1ECjjPBjjMJjqMFHGeBHWcRHMcIOM4GO84mOI4VcJwDdpxDcBwn4DgX7DiX4DhewHEe2HEewXGCgON8sON8guNEAccFYMcFBMdJAo4LwY4LCY6TBRwXgR0XERynCDguBjsuJjhOFXBcAnZcQnCcJuC4FOy4lOA4XcBxGdhxGcFxhoDjcrDjcoLjTAHHFWDHFQTHWQKOK8GOKwmOswUcV4EdVxEc5wg4rgY7riY4zhVwDAY7BhMc5wk4rgE7riE4zhdwXAt2XEtwXCDguA7suI7guFDAcT3YcT3BcZGA4waw4waC42IBx41gx40ExyUCjpvAjpsIjksFHDeDHTcTHJcJOG4BO24hOC4XcNwKdtxKcFwh4LgN7LiN4LhSwHE72HE7wXGVgOMOsOMOguNqAcedYMedBMdgAcddYMddBMc1Ao67wY67CY5rBRz3gB33EBzXCTjuBTvuJTiuF3DcB3bcR3DcIOAYAnYMIThuFHAMBTuGEhw3CTiGgR3DCI6bBRzDwY7hBMctAo77wY77CY5bBRwPgB0PEBy3CTgeBDseJDhuF3A8BHY8RHDcIeB4GOx4mOC4U8DxCNjxCMFxl4DjUbDjUYLjbgHHY2DHYwTHPQKOx8GOxwmOewUcT4AdTxAc9wk4ngQ7niQ4hgg4ngI7niI4hgo4ngY7niY4hgk4RoAdIwiO4QKOkWDHSILjfgHHM2DHMwTHAwKOZ8GOZwmOBwUcz4EdzxEcDwk4ngc7nic4HhZwvAB2vEBwPCLgeBHseJHgeFTA8RLY8RLB8ZiA42Ww42WC43EBxytgxysExxMCjlfBjlcJjicFHK+BHa8RHE8JOF4HO14nOJ4WcLwBdrxBcIwQcLwJdrxJcIwUcLwFdrxFcDwj4Hgb7Hib4HhWwPEO2PEOwfGcgONdsONdguN5Acd7YMd7BMcLAo73wY73CY4XBRwfgB0fEBwvCTg+BDs+JDheFnB8BHZ8RHC8IuD4GOz4mOB4VcDxCdjxCcHxmoDjU7DjU4LjdQHHZ2DHZwTHGwKOz8GOzwmONwUcX4AdXxAcbwk4vgQ7viQ43hZwfAV2fEVwvCPg+Brs+JrgeFfA8Q3Y8Q3B8Z6A41uw41uC430Bx3dgx3cExwcCju/Bju8Jjg8FHD+AHT8QHB8JOH4EO34kOD4WcPwEdvxEcHwi4PgZ7PiZ4PhUwPEL2PELwfGZgONXsONXguNzAcdvYMdvBMcXAo7fwY7fCY4vBRx/gB1/EBxfCTj+BDv+JDi+FnCMAjtGERzfCDj+Ajv+Iji+FXCMkw3rGL0e2vGdgKMV2NGK4PhewNEa7GhNcPwg4BgX7BiX4PhRwDEe2DEewfGTgGN8sGN8guNnAccEYMcEBMcvAo4JwY4JCY5fBRwTgR0TERy/CTgmBjsmJjh+F3BMAnZMQnD8IeCYFOyYlOD4U8AxGdgxGcExSsAxOdgxOcHxl4BjCrBjCoJjHDvLd0wJdkxJcLQScEwFdkxFcLQWcEwNdkxNcIwr4JgG7JiG4BhPwDEt2DEtwTG+gGM6sGM6gmMCAcf0YMf0BMeEAo4ZwI4ZCI6JBBwzgh0zEhwTCzjagB1tCI5JBBwzgR0zERyTCjhmBjtmJjgmE3DMAnbMQnBMLuBoC3a0JTimEHDMCnbMSnBMKeCYDeyYjeCYSsAxO9gxO8ExtYCjHdjRjuCYRsAxB9gxB8ExrYBjTrBjToJjOgHHXGDHXATH9AKO9mBHe4JjBgHH3GDH3ATHjAKOecCOeQiONgKOecGOeQmOmQQc84Ed8xEcMws4OoAdHQiOWQQcHcGOjgRHWwFHJ7CjE8Exq4BjfrBjfoJjNgHHAmDHAgTH7AKOBcGOBQmOdgKOhcCOhQiOOQQcncGOzgTHnAKOLmBHF4JjLgFHV7CjK8HRXsDRDezoRnDMLeDoDnZ0JzjmEXD0ADt6EBzzCjh6gh09CY75BBy9wI5eBEcHAUdvsKM3wdFRwNEH7OhDcHQScCwMdixMcMwv4FgE7FiE4FhAwLEo2LEowbGggGMxsGMxgmMhAcfiYMfiBEdnAccSYMcSBEcXAceSYMeSBEdXAcdSYMdSBEc3AcfSYMfSBEd3AccyYMcyBEcPsKMV2PGLseB/XdsVnNvTwnN/JeX2svDc30i5vS0893dSbh8Lz/2DlLuwhef+ScpdxMJzR5FyF7Xw3L9IuYtZeO7oF1aM3MUtPLcVKXcJC89tTcpd0sJzxyXlLmXhueORcpe28NzxSbnLWHjuBKTcZS08d0JS7nIWnjsRKXd5C8+dmJS7goXnTkLKXdHCcycl5a5k4bmTkXJXtvDcyUm5q1h47hSk3FUtPHdKUu5qFp47FSl3dQvPnZqUu4aF505Dyl3TwnOnJeWuZeG505Fy17bw3OlJuetYeO4MpNx1gbkTxKzz2zHG/kJ7jLHGHXfs461n9zvHjzpoFkTsg0atW98Ot8lYuaOPEfwY/ddmSBTreKP/naiYPzeIcY6+PW6sv4u+fWzM/cbFun/DWPf/vfUa2cX5X1/Wpix/1R35GDa2w34fWGMfN5d6xpNjY1vceo1i1kM/4Taxw/6gYTg2ATs2ITg2FXBsCnZsSnBsJuDYDOzYjODYXMCxOdixOcGxhYBjC7BjC4JjSwHHlmDHlgRHXwFHX7CjL8HRT8DRD+zoR3D0F3D0Bzv6ExwDBBwDwI4BBMdAAcdAsGMgwTFIwDEI6NjAWKsRwbHV38yxUcx6aMfWAo6twI6tCI5tBBxbgx1bExzbCji2ATu2ITi2E3BsC3ZsS3BsL+DYDuzYjuDYQcCxPdixPcGxo4BjB7BjB4JjJwHHjmDHjgTHzgKOncCOnQiOXQQcO4MdOxMcuwo4dgE7diE4dhNw7Ap27Epw7C7g2A3s2I3g2EPAsTvYsTvBsaeAYw+wYw+CYy8Bx55gx54Ex94Cjr3Ajr0Ijn0EHHuDHXsTHPsKOPYBO/YhOPYTcOwLduxLcOwv4NgP7NiP4DhAwLE/2LE/wXGggOMAsOMAguMgAceBYMeBBMfBAo6DwI6DCI5DBBwHgx0HExyHCjgOATsOITgOE3AcCnYcSnAcLuA4DOw4jOA4QsBxONhxOMFxpIDjCLDjCILjKAHHkWDHkQTH0QKOo8COowiOYwQcR4MdRxMcxwo4jgE7jiE4jhNwHAt2HEtwHA92RF8foqEt5/0FE+wsf/8g318wyprjONHOsvfPaFLuSeDcv31Zg48zkzVurcmxM7t4+rq7Ofv6enh7env4+vkaa7q4urv7+ni5+br5+bt5eHt7+AT4ent6ebv7BXq4OPu4u3l6B3oH+XkGebn+n15kaDLwsYp9vFPsxC4yFA0R+6BR6061w20yVu7oYwQ/Rv9wkSEb6/+5KNA0u/+5aJC16fbY95tu948XF4p9+wy7f7xYUfTfRd+eKeZ+mWPdf6ZdnP/1hX5CQT7Ws+yw3y+szEWBT6Kz7Sz7OSL6MZlth/+BOccO+wMT/YJrgvEiYQbwBddUY62yhE98mwt2RO+f6O+VWYT9M09g/8wC759yhP0zX8BxNtixPMFxgYDjHLBjBYLjQgHHuWDHigTHRQKO88COlQiOiwUc54MdKxMclwg4LgA7ViE4LhVwXAh2rEpwXCbguAjsWI3guFzAcTHYsTrBcYWA4xKwYw2C40oBx6Vgx5oEx1UCjsvAjrUIjqv/ho61CY7BAo7LwY4tCY5rBBxXgB19CY5rBRxXgh39CI7rBBxXgR39CY7rBRxXgx0DCI4bBByDwY6BBMeNAo5rwI5BBMdNAo5rwY6tCI6bBRzXgR1bExy3CDiuBzu2IThuFXDcAHZsS3DcJuC4EezYjuC4XcBxE9ixPcFxB9gR/ruZRu4OhNw77Sx//2wG759lBMddAo5bwI7LCY67BRy3gh1XEBz3CDhuAzuuJDjuFXDcDnZcRXDcJ+C4A+y4muAYIuC4E+wYTHAMFXDcBXZcQ3AME3DcDXZcS3AMF3DcA3ZcR3DcL+C4F+y4nuB4QMBxH9hxA8HxoIBjCNhxI8HxkIBjKNhxE8HxsIBjGNhxM8HxiIBjONhxC8HxqIDjfrDjVoLjMQHHA2DHbQTH4wKOB8GO2wmOJwQcD4EddxAcTwo4HgY77iQ4nhJwPAJ23EVwPC3geBTsuJvgGCHgeAzsuIfgGCngeBzsuJfgeEbA8QTYcR/B8ayA40mwYwjB8ZyA4ymwYyjB8byA42mwYxjB8YKAYwTYMZzgeFHAMRLsuJ/geEnA8QzY8QDB8bKA41mw40GC4xUBx3Ngx0MEx6sCjufBjocJjtcEHC+AHY8QHK8LOF4EOx4lON4QcLwEdjxGcLwp4HgZ7Hic4HhLwPEK2PEEwfG2gONVsONJguMdAcdrYMdTBMe7Ao7XwY6nCY73BBxvgB0jCI73BRxvgh0jCY4PBBxvgR3PEBwfCjjeBjueJTg+EnC8A3Y8R3B8LOB4F+x4nuD4RMDxHtjxAsHxqYDjfbDjRYLjMwHHB2DHSwTH5wKOD8GOlwmOLwQcH4EdrxAcXwo4PgY7XiU4vhJwfAJ2vEZwfC3g+BTseJ3g+EbA8RnY8QbB8a2A43Ow402C4zsBxxdgx1sEx/cCji/BjrcJjh8EHF+BHe8QHD8KOL4GO94lOH4ScHwDdrxHcPws4PgW7Hif4PhFwPEd2PEBwfGrgON7sONDguM3AccPYMdHBMfvAo4fwY6PCY4/BBw/gR2fEBx/Cjh+Bjs+JThGCTh+ATs+Izj+EnD8CnZ8TnCMk8PyHb+BHV8QHK0EHL+DHV8SHK0FHH+AHV8RHOMKOP4EO74mOMYTcIwCO74hOMYXcPwFdnxLcEwg4BgnK9bxHcExoYCjFdjxPcExkYCjNdjxA8ExsYBjXLDjR4JjEgHHeGDHTwTHpAKO8cGOnwmOyQQcE4AdvxAckws4JgQ7fiU4phBwTAR2/EZwTCngmBjs+J3gmErAMQnY8QfBMbWAY1Kw40+CYxoBx2RgxyiCY1oBx+Rgx18Ex3QCjinAjnGy4x3TCzimBDtaERwzCDimAjtaExwzCjimBjvGJTjaCDimATvGIzhmEnBMC3aMT3DMLOCYDuyYgOCYRcAxPdgxIcHRVsAxA9gxEcExq4BjRrBjYoJjNgFHG7BjEoJjdgHHTGDHpARHOwHHzGDHZATHHAKOWcCOyQmOOQUcbcGOKQiOuQQcs4IdUxIc7QUcs4EdUxEccws4Zgc7piY45hFwtAM7piE45hVwzAF2TEtwzCfgmBPsmI7g6CDgmAvsmJ7g6CjgaA92zEBwdBJwzA12zEhwzC/gmAfsaENwLCDgmBfsmIngWFDAMR/YMTPBsZCAowPYMQvB0VnA0RHsaEtwdBFwdAI7ZiU4ugo45gc7ZiM4ugk4FgA7Zic4ugs4FgQ72hEcPQQcC4EdcxAcPQUcncGOOQmOXgKOLmDHXARHbwFHV7CjPcHRR8DRDeyYm+BYWMDRHeyYh+BYRMDRA+yYl+BYVMDRE+yYj+BYTMDRC+zoQHAsLuDoDXZ0JDiWEHD0ATs6ERxLCjgWBjvmJziWEnAsAnYsQHAsLeBYFOxYkOBYRsCxGNixEMGxrIBjcbCjM8GxnIBjCbCjC8GxvIBjSbCjK8GxgoBjKbCjG8GxooBjabCjO8GxkoBjGbCjB8GxsoBjWbCjJ8GxioBjObCjF8GxqoBjebCjN8GxmoBjBbCjD8GxuoBjRbBjYYJjDQHHSmDHIgTHmgKOlcGORQmOtQQcq4AdixEcaws4VgU7Fic41hFwrAZ2LEFwrCvgWB3sWJLgWE/AsQbYsRTBsb6AY02wY2mCYwMBx1pgxzIEx4YCjrXBjmUJjo0EHOuAHcsRHBsLONYFO5YnODYRcKwHdqxAcGwq4Fgf7FiR4NhMwLEB2LESwbG5gGNDsGNlgmMLAcdGYMcqBMeWAo6NwY5VCY6+Ao5NwI7VCI5+Ao5NwY7VCY7+Ao7NwI41CI4BAo7NwY41CY6BAo4twI61CI5BAo4twY61CY6tBBx9wY51CI6tBRz9wI51CY5tBBz9wY71CI5tBRwDwI71CY7tBBwDwY4NCI7tBRyDwI4NCY4dBBxbgR0bERw7Cji2Bjs2Jjh2EnBsA3ZsQnDsLODYFuzYlODYRcCxHdixGcGxq4Bje7Bjc4JjNwHHDmDHFgTH7gKOHcGOLQmOPQQcO4EdfQmOPQUcO4Md/QiOvQQcu4Ad/QmOvQUcu4IdAwiOfQQcu4EdAwmOfQUcu4MdgwiO/QQce4AdWxEc+ws49gQ7tiY4DhBw7AV2bENwHCjg2Bvs2JbgOEjAsQ/YsR3BcbCAY1+wY3uC4xABx35gxw4Ex6ECjv3Bjh0JjsMEHAeAHTsRHIcLOA4EO3YmOI4QcBwEduxCcBwp4DgY7NiV4DhKwHEI2LEbwXG0gONQsGN3guMYAcdhYMceBMexAo7DwY49CY7jBBxHgB17ERzHCziOBDv2JjhOEHAcBXbsQ3CcKOA4GuzYl+A4ScBxDNixH8FxsoDjWLBjf4LjFAHHcWDHAQTHqQKO48GOAwmO0wQcJ4AdBxEcpws4TgQ7DiY4zhBwnAR2HEJwnCngOBnsOJTgOEvAcQrYcRjBcbaA41Sw43CC4xwBx2lgxxEEx7kCjtPBjiMJjvMEHGeAHUcRHOcLOM4EO44mOC4QcJwFdhxDcFwo4Dgb7DiW4LhIwHEO2HEcwXGxgONcsON4guMSAcd5YMcJBMelAo7zwY4TCY7LBBwXgB0nERyXCzguBDtOJjiuEHBcBHacQnBcKeC4GOw4leC4SsBxCdhxGsFxtYDjUrDjdIJjsIDjMrDjDILjGgHH5WDHmQTHtQKOK8COswiO6wQcV4IdZxMc1ws4rgI7ziE4bhBwXA12nEtw3CjgGAx2nEdw3CTguAbsOJ/guFnAcS3YcQHBcYuA4zqw40KC41YBx/Vgx0UEx20CjhvAjosJjtsFHDeCHZcQHHcIOG4COy4lOO4UcNwMdlxGcNwl4LgF7Lic4LhbwHEr2HEFwXGPgOM2sONKguNeAcftYMdVBMd9Ao47wI6rCY4hAo47wY7BBMdQAcddYMc1BMcwAcfdYMe1BMdwAcc9YMd1BMf9Ao57wY7rCY4HBBz3gR03EBwPCjiGgB03EhwPCTiGgh03ERwPCziGgR03ExyPCDiGgx23EByPCjjuBztuJTgeE3A8AHbcRnA8LuB4EOy4neB4QsDxENhxB8HxpIDjYbDjToLjKQHHI2DHXQTH0wKOR8GOuwmOEQKOx8COewiOkQKOx8GOewmOZwQcT4Ad9xEczwo4ngQ7hhAczwk4ngI7hhIczws4ngY7hhEcLwg4RoAdwwmOFwUcI8GO+wmOlwQcz4AdDxAcLws4ngU7HiQ4XhFwPAd2PERwvCrgeB7seJjgeE3A8QLY8QjB8bqA40Ww41GC4w0Bx0tgx2MEx5sCjpfBjscJjrcEHK+AHU8QHG8LOF4FO54kON4RcLwGdjxFcLwr4Hgd7Hia4HhPwPEG2DGC4HhfwPEm2DGS4PhAwPEW2PEMwfGhgONtsONZguMjAcc7YMdzBMfHAo53wY7nCY5PBBzvgR0vEByfCjjeBzteJDg+E3B8AHa8RHB8LuD4EOx4meD4QsDxEdjxCsHxpYDjY7DjVYLjKwHHJ2DHawTH1wKOT8GO1wmObwQcn4EdbxAc3wo4Pgc73iQ4vhNwfAF2vEVwfC/g+BLseJvg+EHA8RXY8Q7B8aOA42uw412C4ycBxzdgx3sEx88Cjm/BjvcJjl8EHN+BHR8QHL8KOL4HOz4kOH4TcPwAdnxEcPwu4PgR7PiY4PhDwPET2PEJwfGngONnsONTgmOUgOMXsOMzguMvAcevYMfnBMc4OS3f8RvY8QXB0UrA8TvY8SXB0VrA8QfY8RXBMa6A40+w42uCYzwBxyiw4xuCY3wBx19gx7cExwQCjnGyYR3fERwTCjhagR3fExwTCThagx0/EBwTCzjGBTt+JDgmEXCMB3b8RHBMKuAYH+z4meCYTMAxAdjxC8ExuYBjQrDjV4JjCgHHRGDHbwTHlAKOicGO3wmOqQQck4AdfxAcUws4JgU7/iQ4phFwTAZ2jCI4phVwTA52/EVwTCfgmALsGMcO75hewDEl2NGK4JhBwDEV2NGa4JhRwDE12DEuwdFGwDEN2DEewTGTgGNasGN8gmNmAcd0YMcEBMcsAo7pwY4JCY62Ao4ZwI6JCI5ZBRwzgh0TExyzCTjagB2TEByzCzhmAjsmJTjaCThmBjsmIzjmEHDMAnZMTnDMKeBoC3ZMQXDMJeCYFeyYkuBoL+CYDeyYiuCYW8AxO9gxNcExj4CjHdgxDcExr4BjDrBjWoJjPgHHnGDHdARHBwHHXGDH9ARHRwFHe7BjBoKjk4BjbrBjRoJjfgHHPGBHG4JjAQHHvGDHTATHggKO+cCOmQmOhQQcHcCOWQiOzgKOjmBHW4Kji4CjE9gxK8HRVcAxP9gxG8HRTcCxANgxO8HRXcCxINjRjuDoIeBYCOyYg+DoKeDoDHbMSXD0EnB0ATvmIjh6Czi6gh3tCY4+Ao5uYMfcBMfCAo7uYMc8BMciAo4eYMe8BMeiAo6eYMd8BMdiAo5eYEcHgmNxAUdvsKMjwbGEgKMP2NGJ4FhSwLEw2DE/wbGUgGMRsGMBgmNpAceiYMeCBMcyAo7FwI6FCI5lBRyLgx2dCY7lBBxLgB1dCI7lBRxLgh1dCY4VBBxLgR3dCI4VBRxLgx3dCY6VBBzLgB09CI6VwY5WYMfo3J6E3FUEcnsRclcVyO1NyF1NILcPIXd1gdyFCblrCOQuQshdUyB3UULuWgK5ixFy1xbIXZyQu45A7hKE3HUFcpck5K4nkLsUIXd9gdylCbkbCOQuQ8jdUCB3WULuRgK5yxFyNxbIXZ6Qu4lA7gqE3E0Fclck5G4mkLsSIXdzgdyVCblbCOSuQsjdUiB3VUJuX4Hc1Qi5/QRyVyfk9hfIXYOQO0Agd01C7kCB3LUIuYMEctcm5G4lkLsOIXdrgdx1CbnbgHNbg3PPMTLPtcOtF73WPIJjWwHH+UDHeTHroR3bCTguADsuIDi2F3BcCHZcSHDsIOC4COy4iODYUcBxMdhxMcGxk4DjErDjEoJjZwHHpWDHpQTHLgKOy8COywiOXQUcl4MdlxMcuwk4rgA7riA4dhdwXAl2XElw7CHguArsuIrg2FPAcTXYcTXBsZeFn+eaaff/z8/8w+Pj4unr7ubs6+vh7ent4evna+R3cXV39/XxcvN18/N38/D29vAJ8PX29PJ29wv0cHH2cXfz9A70DvLzDPJydZ5jhzPsLbAXg8F7MZiwF/tYuGP0e3nqgN/LE70e2rGvgGNdsGNdgmM/Acd6YMd6BMf+Ao71wY71CY4DBBwbgB0bEBwHCjg2BDs2JDgOEnBsBHZsRHAcLODYGOzYmOA4RMCxCdixCcFxqIBjU7BjU4LjMAHHZmDHZgTH4QKOzcGOzQmOIwQcW4AdWxAcR1r4ObP3xoLR2dG5Rwmc51pjhz3PFb0e2nG0gONasONaguMYAcd1YMd1BMexAo7rwY7rCY7jBBw3gB03EBzHCzhuBDtuJDhOEHDcBHbcRHCcKOC4Gey4meA4ScBxC9hxC8FxsoDjVrDjVoLjFAHHbWDHbQTHqQKO28GO2wmO0wQcd4AddxAcpws47gQ77iQ4zrDw81y2xgMzh5B7psB50o7g86QdCedJZwk4dgI7diI4zhZw7Ax27ExwnCPg2AXs2IXgOFfAsSvYsSvBcZ6AYzewYzeC43wBx+5gx+4ExwUCjj3Ajj0IjgsFHHuCHXsSHBcJOPYCO/YiOC4WcOwNduxNcFwi4NgH7NiH4LhUwLEv2LEvwXGZgGM/sGM/guNyAcf+YMf+BMcVAo4DwI4DCI4rBRwHgh0HEhxXCTgOAjsOIjiuFnAcDHYcTHAMFnAcAnYcQnBcI+A4FOw4lOC4VsBxGNhxGMFxnYDjcLDjcILjegHHEWDHEQTHDQKOI8GOIwmOGwUcR4EdRxEcNwk4jgY7jiY4bhZwHAN2HENw3CLgOBbsOJbguFXAcRzYcRzBcZuA43iw43iC43YBxwlgxwkExx0CjhPBjhMJjjsFHCeBHScRHHcJOE4GO04mOO4WcJwCdpxCcNwj4DgV7DiV4LhXwHEa2HEawXGfgON0sON0gmMI2BH9fpeJtpzruoQK7J8ZwP3zgXR9nDAL3z8fSbnD/2b7Z2rMemjH/QKOM8GOMwmOBwQcZ4EdZxEcDwo4zgY7ziY4HhJwnAN2nENwPCzgOBfsOJfgeETAcR7YcR7B8aiA43yw43yC4zEBxwVgxwUEx+MCjgvBjgsJjicEHBeBHRcRHE8KOC4GOy4mOJ4ScFwCdlxCcDwt4LgU7LiU4BjxNzvfM4l03jXSwh2jr620yw633ryY9dCOZwQcd4MddxMczwo47gE77iE4nhNw3At23EtwPC/guA/suI/geEHAMQTsGEJwvCjgGAp2DCU4XhJwDAM7hhEcLws4hoMdwwmOVwQc94Md9xMcrwo4HgA7HiA4XhNwPAh2PEhwvC7geAjseIjgeEPA8TDY8TDB8aaA4xGw4xGC4y0Bx6Ngx6MEx9sCjsfAjscIjncEHI+DHY8THO8KOJ4AO54gON4TcDwJdjxJcLwv4HgK7HiK4PhAwPE02PE0wfGhgGME2DGC4PhIwDES7BhJcHws4HgG7HiG4PhEwPEs2PEswfGpgOM5sOM5guMzAcfzYMfzBMfnAo4XwI4XCI4vBBwvgh0vEhxfCjheAjteIji+EnC8DHa8THB8LeB4Bex4heD4RsDxKtjxKsHxrYDjNbDjNYLjOwHH62DH6wTH9wKON8CONwiOHwQcb4IdbxIcPwo43gI73iI4fhJwvA12vE1w/CzgeAfseIfg+EXA8S7Y8S7B8auA4z2w4z2C4zcBx/tgx/sEx+8Cjg/Ajg8Ijj8EHB+CHR8SHH8KOD4COz4iOEYJOD4GOz4mOP4ScHwCdnxCcIyTy/Idn4IdnxIcrQQcn4EdnxEcrQUcn4MdnxMc4wo4vgA7viA4xhNwfAl2fElwjC/g+Ars+IrgmEDA8TXY8TXBMaGA4xuw4xuCYyIBx7dgx7cEx8QCju/Aju8IjkkEHN+DHd8THJMKOH4AO34gOCYTcPwIdvxIcEwu4PgJ7PiJ4JhCwPEz2PEzwTGlgOMXsOMXgmMqAcevYMevBMfUAo7fwI7fCI5pBBy/gx2/ExzTCjj+ADv+IDimE3D8CXb8SXBML+AYBXaMIjhmEHD8BXb8RXDMKOAYJwfWMXo9tKONgKMV2NGK4JhJwNEa7GhNcMws4BgX7BiX4JhFwDEe2DEewdFWwDE+2DE+wTGrgGMCsGMCgmM2AceEYMeEBMfsAo6JwI6JCI52Ao6JwY6JCY45BByTgB2TEBxzCjgmBTsmJTjmEnBMBnZMRnC0F3BMDnZMTnDMLeCYAuyYguCYR8AxJdgxJcExr4BjKrBjKoJjPgHH1GDH1ARHBwHHNGDHNARHRwHHtGDHtARHJwHHdGDHdATH/AKO6cGO6QmOBQQcM4AdMxAcCwo4ZgQ7ZiQ4FhJwtAE72hAcnQUcM4EdMxEcXQQcM4MdMxMcXQUcs4AdsxAc3QQcbcGOtgRHdwHHrGDHrARHDwHHbGDHbARHTwHH7GDH7ARHLwFHO7CjHcHRW8AxB9gxB8HRR8AxJ9gxJ8GxsIBjLrBjLoJjEQFHe7CjPcGxqIBjbrBjboJjMQHHPGDHPATH4gKOecGOeQmOJQQc84Ed8xEcSwo4OoAdHQiOpQQcHcGOjgTH0gKOTmBHJ4JjGQHH/GDH/ATHsgKOBcCOBQiO5QQcC4IdCxIcyws4FgI7FiI4VhBwdAY7OhMcKwo4uoAdXQiOlQQcXcGOrgTHygKObmBHN4JjFQFHd7CjO8GxqoCjB9jRg+BYTcDRE+zoSXCsLuDoBXb0IjjWEHD0Bjt6ExxrCjj6gB19CI61BBwLgx0LExxrCzgWATsWITjWEXAsCnYsSnCsK+BYDOxYjOBYT8CxONixOMGxvoBjCbBjCYJjAwHHkmDHkgTHhgKOpcCOpQiOjQQcS4MdSxMcGws4lgE7liE4NhFwLAt2LEtwbCrgWA7sWI7g2EzAsTzYsTzBsbmAYwWwYwWCYwsBx4pgx4oEx5YCjpXAjpUIjr4CjpXBjpUJjn4CjlXAjlUIjv4CjlXBjlUJjgECjtXAjtUIjoECjtXBjtUJjkECjjXAjjUIjq0EHGuCHWsSHFsLONYCO9YiOLYRcKwNdqxNcGwr4FgH7FiH4NhOwLEu2LEuwbG9gGM9sGM9gmMHAcf6YMf6BMeOAo4NwI4NCI6dBBwbgh0bEhw7Czg2Ajs2Ijh2EXBsDHZsTHDsKuDYBOzYhODYTcCxKdixKcGxu4BjM7BjM4JjDwHH5mDH5gTHngKOLcCOLQiOvQQcW4IdWxIcews4+oIdfQmOfQQc/cCOfgTHvgKO/mBHf4JjPwHHALBjAMGxv4BjINgxkOA4QMAxCOwYRHAcKODYCuzYiuA4SMCxNdixNcFxsIBjG7BjG4LjEAHHtmDHtgTHoQKO7cCO7QiOwwQc24Md2xMchws4dgA7diA4jhBw7Ah27EhwHCng2Ans2IngOErAsTPYsTPBcbSAYxewYxeC4xgBx65gx64Ex7ECjt3Ajt0IjuMEHLuDHbsTHMcLOPYAO/YgOE4QcOwJduxJcJwo4NgL7NiL4DhJwLE32LE3wXGygGMfsGMfguMUAce+YMe+BMepAo79wI79CI7TBBz7gx37ExynCzgOADsOIDjOEHAcCHYcSHCcKeA4COw4iOA4S8BxMNhxMMFxtoDjELDjEILjHAHHoWDHoQTHuQKOw8COwwiO8wQch4MdhxMc5ws4jgA7jiA4LhBwHAl2HElwXCjgOArsOIrguEjAcTTYcTTBcbGA4xiw4xiC4xIBx7Fgx7EEx6UCjuPAjuMIjssEHMeDHccTHJcLOE4AO04gOK4QcJwIdpxIcFwp4DgJ7DiJ4LhKwHEy2HEywXG1gOMUsOMUgmOwgONUsONUguMaAcdpYMdpBMe1Ao7TwY7TCY7rBBxngB1nEBzXCzjOBDvOJDhuEHCcBXacRXDcKOA4G+w4m+C4ScBxDthxDsFxs4DjXLDjXILjFgHHeWDHeQTHrQKO88GO8wmO2wQcF4AdFxActws4LgQ7LiQ47hBwXAR2XERw3CnguBjsuJjguEvAcQnYcQnBcbeA41Kw41KC4x4Bx2Vgx2UEx70CjsvBjssJjvsEHFeAHVcQHEMEHFeCHVcSHEMFHFeBHVcRHMMEHFeDHVcTHMMFHIPBjsEEx/0CjmvAjmsIjgcEHNeCHdcSHA8KOK4DO64jOB4ScFwPdlxPcDws4LgB7LiB4HhEwHEj2HEjwfGogOMmsOMmguMxAcfNYMfNBMfjAo5bwI5bCI4nBBy3gh23EhxPCjhuAztuIzieEnDcDnbcTnA8LeC4A+y4g+AYIeC4E+y4k+AYKeC4C+y4i+B4RsBxN9hxN8HxrIDjHrDjHoLjOQHHvWDHvQTH8wKO+8CO+wiOFwQcQ8COIQTHiwKOoWDHUILjJQHHMLBjGMHxsoBjONgxnOB4RcBxP9hxP8HxqoDjAbDjAYLjNQHHg2DHgwTH6wKOh8COhwiONwQcD4MdDxMcbwo4HgE7HiE43hJwPAp2PEpwvC3geAzseIzgeEfA8TjY8TjB8a6A4wmw4wmC4z0Bx5Ngx5MEx/sCjqfAjqcIjg8EHE+DHU8THB8KOEaAHSMIjo8EHCPBjpEEx8cCjmfAjmcIjk8EHM+CHc8SHJ8KOJ4DO54jOD4TcDwPdjxPcHwu4HgB7HiB4PhCwPEi2PEiwfGlgOMlsOMlguMrAcfLYMfLBMfXAo5XwI5XCI5vBByvgh2vEhzfCjheAzteIzi+E3C8Dna8TnB8L+B4A+x4g+D4QcDxJtjxJsHxo4DjLbDjLYLjJwHH22DH2wTHzwKOd8COdwiOXwQc74Id7xIcvwo43gM73iM4fhNwvA92vE9w/C7g+ADs+IDg+EPA8SHY8SHB8aeA4yOw4yOCY5SA42Ow42OC4y8BxydgxycExzj2lu/4FOz4lOBoJeD4DOz4jOBoLeD4HOz4nOAYV8DxBdjxBcExnoDjS7DjS4JjfAHHV2DHVwTHBAKOr8GOrwmOCQUc34Ad3xAcEwk4vgU7viU4JhZwfAd2fEdwTCLg+B7s+J7gmFTA8QPY8QPBMZmA40ew40eCY3IBx09gx08ExxQCjp/Bjp8JjikFHL+AHb8QHFMJOH4FO34lOKYWcPwGdvxGcEwj4Pgd7Pid4JhWwPEH2PEHwTGdgONPsONPgmN6AccosGMUwTGDgOMvsOMvgmNGAcc4ObGO0euhHW0EHK3AjlYEx0wCjtZgR2uCY2YBx7hgx7gExywCjvHAjvEIjrYCjvHBjvEJjlkFHBOAHRMQHLMJOCYEOyYkOGYXcEwEdkxEcLQTcEwMdkxMcMwh4JgE7JiE4JhTwDEp2DEpwTGXgGMysGMygqO9gGNysGNygmNuAccUYMcUBMc8Ao4pwY4pCY55BRxTgR1TERzzCTimBjumJjg6CDimATumITg6CjimBTumJTg6CTimAzumIzjmF3BMD3ZMT3AsIOCYAeyYgeBYUMAxI9gxI8GxkICjDdjRhuDoLOCYCeyYieDoIuCYGeyYmeDoKuCYBeyYheDoJuBoC3a0JTi6CzhmBTtmJTh6CDhmAztmIzh6CjhmBztmJzh6CTjagR3tCI7eAo45wI45CI4+Ao45wY45CY6FBRxzgR1zERyLCDjagx3tCY5FBRxzgx1zExyLCTjmATvmITgWF3DMC3bMS3AsIeCYD+yYj+BYUsDRAezoQHAsJeDoCHZ0JDiWFnB0Ajs6ERzLCDjmBzvmJziWFXAsAHYsQHAsJ+BYEOxYkOBYXsCxENixEMGxgoCjM9jRmeBYUcDRBezoQnCsJODoCnZ0JThWFnB0Azu6ERyrCDi6gx3dCY5VBRw9wI4eBMdqAo6eYEdPgmN1AUcvsKMXwbGGgKM32NGb4FhTwNEH7OhDcKwl4FgY7FiY4FhbwLEI2LEIwbGOgGNRsGNRgmNdAcdiYMdiBMd6Ao7FwY7FCY71BRxLgB1LEBwbCDiWBDuWJDg2FHAsBXYsRXBsJOBYGuxYmuDYWMCxDNixDMGxiYBjWbBjWYJjUwHHcmDHcgTHZgKO5cGO5QmOzQUcK4AdKxAcWwg4VgQ7ViQ4thRwrAR2rERw9BVwrAx2rExw9BNwrAJ2rEJw9BdwrAp2rEpwDBBwrAZ2rEZwDBRwrA52rE5wDBJwrAF2rEFwbCXgWBPsWJPg2FrAsRbYsRbBsY2AY22wY22CY1sBxzpgxzoEx3YCjnXBjnUJju0FHOuBHesRHDsIONYHO9YnOHYUcGwAdmxAcOwk4NgQ7NiQ4NhZwLER2LERwbGLgGNjsGNjgmNXAccmYMcmBMduAo5NwY5NCY7dBRybgR2bERx7CDg2Bzs2Jzj2FHBsAXZsQXDsJeDYEuzYkuDYW8DRF+zoS3DsI+DoB3b0Izj2FXD0Bzv6Exz7CTgGgB0DCI79BRwDwY6BBMcBAo5BYMcgguNAAcdWYMdWBMdBAo6twY6tCY6DBRzbgB3bEByHgB2twI5ZjQcm2hKde6iF585Gyj3MwnNnJ+UebuG57Ui5R1h47hyk3CMtPHdOUu5RFp47Fyn3aAvPbU/KPcbCc+cm5R5r4bnzkHKPs/DceUm5x1t47nyk3BMsPLcDKfdEC8/tSMo9ycJzO5FyT7bw3PlJuadYeO4CpNxTLTx3QVLuaRaeuxAp93QLz+1Myj3DwnO7kHLPtPDcrqTcsyw8txsp92wLz+1Oyj3HwnN7kHLPtfDcnqTc8yw8txcp93wLz+1Nyr3AwnP7kHIvtPDchUm5F1l47iKk3IuBuRPErPPbMcb+QnuMt8Ydd+zjXWL/O8ePOmgWROyDRq271B63yVi5o48R/Bj912ZIFOt4o/+dqJg/L4txjr49bqy/i759Qsz9Jsa6//JY9/+99VbEOv7oL2tTlr/qjnwMV9pjvw+ssY+bS327OHGa2OHWaxyzHvoJd5WF/wJTtGNTsGNTguNqAcdmYMdmBMdgAcfmYMfmBMc1Ao4twI4tCI5rBRxbgh1bEhzXCTj6gh19CY7rBRz9wI5+BMcNAo7+YEd/guNGAccAsGMAwXGTgGMg2DGQ4LhZwDEI7BhEcNwi4NgK7NiK4LhVwLE10LGhsVZjguO2v5lj45j10I7bBRzbgB3bEBx3CDi2BTu2JTjuFHBsB3ZsR3DcJeDYHuzYnuC4W8CxA9ixA8Fxj4BjR7BjR4LjXgHHTmDHTgTHfQKOncGOnQmOIQKOXcCOXQiOoQKOXcGOXQmOYQKO3cCO3QiO4QKO3cGO3QmO+wUce4AdexAcDwg49gQ79iQ4HhRw7AV27EVwPCTg2Bvs2JvgeFjAsQ/YsQ/B8YiAY1+wY1+C41EBx35gx34Ex2MCjv3Bjv0JjscFHAeAHQcQHE8IOA4EOw4kOJ4UcBwEdhxEcDwl4DgY7DiY4HhawHEI2HEIwTFCwHEo2HEowTFSwHEY2HEYwfGMgONwsONwguNZAccRYMcRBMdzAo4jwY4jCY7nBRxHgR1HERwvCDiOBjuOJjheFHAcA3YcQ3C8JOA4Fuw4luB4WcBxHNhxHMHxioDjeLDjeILjVQHHCWDHCQTHawKOE8GOEwmO1wUcJ4EdJxEcb1j4BaUa2XHeN3Tzb/a+obHWHMdbFr5/xpFy3wbn/u3LGnycxa1xa92JndnF09fdzdnX18Pb09vD18/XWNPF1d3d18fLzdfNz9/Nw9vbwyfA19vTy9vdL9DDxdnH3c3TO9A7yM8zyMv1//QibHeAj1Xs472rdhG2aIi7hIuw3bPwi7BF5773f3ARtmLW/3PRtPuxLqpmbbo99v0e/M7F12Lf/vB3Lub2MOZibsVj7lci1v0fkS/WhnysH4Mv1sbK7At8En1ib9nPEdGPyRN7/A/Mpxb+gmuqXZw4c+1w680y1mqbE+/4zMJfcEV/rzwm7J/nAvtnPnj/tCPsnxcCjgvAju0Jji8FHBeCHTsQHF8JOC4CO3YkOL4WcFwMduxEcHwj4LgE7NiZ4PhWwHEp2LELwfGdgOMysGNXguN7AcflYMduBMcPAo4rwI7dCY4fBRxXgh17EBw/CTiuAjv2JDh+FnBcDXbsRXD8IuAYDHbsTXD8KuC4Buw4muD4TcBxLdhxDMHxu4DjOrDjWILjDwHH9WDHcQTHnwKOG8CO4wmOUQKOG8GOEwiOvwQcN4EdJxIc4+S2fMfNYMdJBEcrAcctYMfJBEdrAcetYMcpBMe4Ao7bwI5TCY7xBBy3gx2nERzjCzjuADtOJzgmEHDcCXacQXBMCHZE/15TdO6ZhNyJBPbPLvD+OUNwTCzguBvseJbgmETAcQ/Y8RzBMamA416w43mCYzIBx31gxwsEx+QCjiFgx4sExxQCjqFgx0sEx5QCjmFgx8sEx1QCjuFgxysEx9QCjvvBjlcJjmkEHA+AHa8RHNMKOB4EO14nOKYTcDwEdrxBcEwv4HgY7HiT4JhBwPEI2PEWwTGjgONRsONtgqONgOMxsOMdgmMmAcfjYMe7BMfMAo4nwI73CI5ZBBxPgh3vExxtBRxPgR0fEByzCjieBjs+JDhmE3CMADs+IjhmF3CMBDs+JjjaCTieATs+ITjmEHA8C3Z8SnDMKeB4Duz4jOCYS8DxPNjxOcHRXsDxAtjxBcExt4DjRbDjS4JjHgHHS2DHVwTHvAKOl8GOrwmO+QQcr4Ad3xAcHQQcr4Id3xIcHQUcr4Ed3xEcnQQcr4Md3xMc8ws43gA7fiA4FhBwvAl2/EhwLCjgeAvs+IngWEjA8TbY8TPB0VnA8Q7Y8QvB0UXA8S7Y8SvB0VXA8R7Y8RvB0U3A8T7Y8TvB0V3A8QHY8QfB0UPA8SHY8SfB0VPA8RHYMYrg6CXg+Bjs+Ivg6C3g+ATsGCcX3tFHwPEp2NGK4FhYwPEZ2NGa4FhEwPE52DEuwbGogOMLsGM8gmMxAceXYMf4BMfiAo6vwI4JCI4lBBxfgx0TEhxLCji+ATsmIjiWEnB8C3ZMTHAsLeD4DuyYhOBYRsDxPdgxKcGxrIDjB7BjMoJjOQHHj2DH5ATH8gKOn8COKQiOFQQcP4MdUxIcKwo4fgE7piI4VhJw/Ap2TE1wrCzg+A3smIbgWEXA8TvYMS3BsaqA4w+wYzqCYzUBx59gx/QEx+oCjlFgxwwExxoCjr/AjhkJjjUFHOPkwDraEBxrCThagR0zERxrCzhagx0zExzrCDjGBTtmITjWFXCMB3a0JTjWE3CMD3bMSnCsL+CYAOyYjeDYQMAxIdgxO8GxoYBjIrCjHcGxkYBjYrBjDoJjYwHHJGDHnATHJgKOScGOuQiOTQUck4Ed7QmOzQQck4MdcxMcmws4pgA75iE4thBwTAl2zEtwbCngmArsmI/g6CvgmBrs6EBw9BNwTAN2dCQ4+gs4pgU7OhEcAwQc04Ed8xMcAwUc04MdCxAcgwQcM4AdCxIcWwk4ZgQ7FiI4thZwtAE7OhMc2wg4ZgI7uhAc2wo4ZgY7uhIc2wk4ZgE7uhEc2ws42oId3QmOHQQcs4IdPQiOHQUcs4EdPQmOnQQcs4MdvQiOnQUc7cCO3gTHLgKOOcCOPgTHrgKOOcGOhQmO3QQcc4EdixAcuws42oMdixIcewg45gY7FiM49hRwzAN2LE5w7CXgmBfsWILg2FvAMR/YsSTBsY+AowPYsRTBsa+AoyPYsTTBsZ+AoxPYsQzBsb+AY36wY1mC4wABxwJgx3IEx4ECjgXBjuUJjoMEHAuBHSsQHAcLODqDHSsSHIcIOLqAHSsRHIcKOLqCHSsTHIcJOLqBHasQHIcLOLqDHasSHEcIOHqAHasRHEcKOHqCHasTHEcJOHqBHWsQHEcLOHqDHWsSHMcIOPqAHWsRHMcKOBYGO9YmOI4TcCwCdqxDcBwv4FgU7FiX4DhBwLEY2LEewXGigGNxsGN9guMkAccSYMcGBMfJAo4lwY4NCY5TBBxLgR0bERynCjiWBjs2JjhOE3AsA3ZsQnCcLuBYFuzYlOA4Q8CxHNixGcFxpoBjebBjc4LjLAHHCmDHFgTH2QKOFcGOLQmOcwQcK4EdfQmOcwUcK4Md/QiO8wQcq4Ad/QmO8wUcq4IdAwiOCwQcq4EdAwmOCwUcq4MdgwiOiwQca4AdWxEcFws41gQ7tiY4LhFwrAV2bENwXCrgWBvs2JbguEzAsQ7YsR3BcbmAY12wY3uC4woBx3pgxw4Ex5UCjvXBjh0JjqsEHBuAHTsRHFcLODYEO3YmOAYLODYCO3YhOK4RcGwMduxKcFwr4NgE7NiN4LhOwLEp2LE7wXG9gGMzsGMPguMGAcfmYMeeBMeNAo4twI69CI6bBBxbgh17Exw3Czj6gh37EBy3CDj6gR37Ehy3Cjj6gx37ERy3CTgGgB37Exy3CzgGgh0HEBx3CDgGgR0HEhx3Cji2AjsOIjjuEnBsDXYcTHDcLeDYBuw4hOC4R8CxLdhxKMFxr4BjO7DjMILjPgHH9mDH4QTHEAHHDmDHEQTHUAHHjmDHkQTHMAHHTmDHUQTHcAHHzmDH0QTH/QKOXcCOYwiOBwQcu4IdxxIcDwo4dgM7jiM4HhJw7A52HE9wPCzg2APsOIHgeETAsSfYcSLB8aiAYy+w4ySC4zEBx95gx8kEx+MCjn3AjlMIjicEHPuCHacSHE8KOPYDO04jOJ4ScOwPdpxOcDwt4DgA7DiD4Bgh4DgQ7DiT4Bgp4DgI7DiL4HhGwHEw2HE2wfGsgOMQsOMcguM5AcehYMe5BMfzAo7DwI7zCI4XBByHgx3nExwvCjiOADsuIDheEnAcCXZcSHC8LOA4Cuy4iOB4RcBxNNhxMcHxqoDjGLDjEoLjNQHHsWDHpQTH6wKO48COywiONwQcx4MdlxMcbwo4TgA7riA43hJwnAh2XElwvC3gOAnsuIrgeEfAcTLYcTXB8a6A4xSwYzDB8Z6A41Sw4xqC430Bx2lgx7UExwcCjtPBjusIjg8FHGeAHdcTHB8JOM4EO24gOD4WcJwFdtxIcHwi4Dgb7LiJ4PhUwHEO2HEzwfGZgONcsOMWguNzAcd5YMetBMcXAo7zwY7bCI4vBRwXgB23ExxfCTguBDvuIDi+FnBcBHbcSXB8I+C4GOy4i+D4VsBxCdhxN8HxnYDjUrDjHoLjewHHZWDHvQTHDwKOy8GO+wiOHwUcV4AdQwiOnwQcV4IdQwmOnwUcV4EdwwiOXwQcV4MdwwmOXwUcg8GO+wmO3wQc14AdDxAcvws4rgU7HiQ4/hBwXAd2PERw/CnguB7seJjgGCXguAHseITg+EvAcSPY8SjBMU4ey3fcBHY8RnC0EnDcDHY8TnC0FnDcAnY8QXCMK+C4Fex4kuAYT8BxG9jxFMExvoDjdrDjaYJjAgHHHWDHCIJjQgHHnWDHSIJjIgHHXWDHMwTHxAKOu8GOZwmOSQQc94AdzxEckwo47gU7nic4JhNw3Ad2vEBwTC7gGAJ2vEhwTCHgGAp2vERwTCngGAZ2vExwTCXgGA52vEJwTC3guB/seJXgmEbA8QDY8RrBMa2A40Gw43WCYzoBx0NgxxsEx/QCjofBjjcJjhkEHI+AHW8RHDMKOB4FO94mONoIOB4DO94hOGYScDwOdrxLcMws4HgC7HiP4JhFwPEk2PE+wdFWwPEU2PEBwTGrgONpsONDgmM2AccIsOMjgmN2AcdIsONjgqOdgOMZsOMTgmMOAcezYMenBMecAo7nwI7PCI65BBzPgx2fExztBRwvgB1fEBxzCzheBDu+JDjmEXC8BHZ8RXDMK+B4Gez4muCYT8DxCtjxDcHRQcDxKtjxLcHRUcDxGtjxHcHRScDxOtjxPcExv4DjDbDjB4JjAQHHm2DHjwTHggKOt8COnwiOhQQcb4MdPxMcnQUc74AdvxAcXQQc74IdvxIcXQUc74EdvxEc3QQc74MdvxMc3QUcH4AdfxAcPQQcH4IdfxIcPQUcH4EdowiOXgKOj8GOvwiO3gKOT8COcezxjj4Cjk/BjlYEx8ICjs/AjtYExyICjs/BjnEJjkUFHF+AHeMRHIsJOL4EO8YnOBYXcHwFdkxAcCwh4Pga7JiQ4FhSwPEN2DERwbGUgONbsGNigmNpAcd3YMckBMcyAo7vwY5JCY5lBRw/gB2TERzLCTh+BDsmJziWF3D8BHZMQXCsIOD4GeyYkuBYUcDxC9gxFcGxkoDjV7BjaoJjZQHHb2DHNATHKgKO38GOaQmOVQUcf4Ad0xEcqwk4/gQ7pic4VhdwjAI7ZiA41hBw/AV2zEhwrCngGCcn1tGG4FhLwNEK7JiJ4FhbwNEa7JiZ4FhHwDEu2DELwbGugGM8sKMtwbGegGN8sGNWgmN9AccEYMdsBMcGAo4JwY7ZCY4NBRwTgR3tCI6NBBwTgx1zEBwbCzgmATvmJDg2EXBMCnbMRXBsKuCYDOxoT3BsJuCYHOyYm+DYXMAxBdgxD8GxhYBjSrBjXoJjSwHHVGDHfARHXwHH1GBHB4Kjn4BjGrCjI8HRX8AxLdjRieAYIOCYDuyYn+AYKOCYHuxYgOAYJOCYAexYkODYSsAxI9ixEMGxtYCjDdjRmeDYRsAxE9jRheDYVsAxM9jRleDYTsAxC9jRjeDYXsDRFuzoTnDsIOCYFezoQXDsKOCYDezoSXDsJOCYHezoRXDsLOBoB3b0Jjh2EXDMAXb0ITh2FXDMCXYsTHDsJuCYC+xYhODYXcDRHuxYlODYQ8AxN9ixGMGxp4BjHrBjcYJjLwHHvGDHEgTH3gKO+cCOJQmOfQQcHcCOpQiOfQUcHcGOpQmO/QQcncCOZQiO/QUc84MdyxIcBwg4FgA7liM4DhRwLAh2LE9wHCTgWAjsWIHgOFjA0RnsWJHgOETA0QXsWIngOFTA0RXsWJngOEzA0Q3sWIXgOFzA0R3sWJXgOELA0QPsWI3gOFLA0RPsWJ3gOErA0QvsWIPgOFrA0RvsWJPgOEbA0QfsWIvgOFbAsTDYsTbBcZyAYxGwYx2C43gBx6Jgx7oExwkCjsXAjvUIjhMFHIuDHesTHCcJOJYAOzYgOE4WcCwJdmxIcJwi4FgK7NiI4DhVwLE02LExwXGagGMZsGMTguN0AceyYMemBMcZAo7lwI7NCI4zBRzLgx2bExxnCThWADu2IDjOFnCsCHZsSXCcI+BYCezoS3CcK+BYGezoR3CcJ+BYBezoT3CcL+BYFewYQHBcIOBYDewYSHBcKOBYHewYRHBcJOBYA+zYiuC4WMCxJtixNcFxiYBjLbBjG4LjUgHH2mDHtgTHZQKOdcCO7QiOywUc64Id2xMcVwg41gM7diA4rhRwrA927EhwXCXg2ADs2InguFrAsSHYsTPBMVjAsRHYsQvBcY2AY2OwY1eC41oBxyZgx24Ex3UCjk3Bjt0JjusFHJuBHXsQHDcIODYHO/YkOG4UcGwBduxFcNwk4NgS7Nib4LhZwNEX7NiH4LhFwNEP7NiX4LhVwNEf7NiP4LhNwDEA7Nif4LhdwDEQ7DiA4LhDwDEI7DiQ4LhTwLEV2HEQwXGXgGNrsONgguNuAcc2YMchBMc9YEcrsGN07qGE3HsFcg8j5N4nkHs4IXeIQO4RhNyhArlHEnKHCeQeRcgdLpB7NCH3foHcYwi5DwjkHkvIfVAg9zhC7kMCuccTch8WyD2BkPuIQO6JhNxHBXJPIuQ+JpB7MiH3cYHcUwi5TwjknkrIfVIg9zRC7lMCuacTcp8WyD2DkDtCIPdMQu5IgdyzCLnPCOSeTch9ViD3HELucwK55xJynxfIPY+Q+4JA7vmE3BcFci8g5L4kkHshIfdlgdyLCLmvCOReTMh91cL/f/pTI/Mze9x60Ws9JzheE3B8AXR8HrMe2vG6gONLsONLguMNAcdXYMdXBMebAo6vwY6vCY63BBzfgB3fEBxvCzi+BTu+JTjeEXB8B3Z8R3C8K+D4Huz4nuB4T8DxA9jxA8HxvoDjR7DjR4LjAwHHT2DHTwTHhwKOn8GOnwmOjwQcv4AdvxAcHws4fgU7fiU4PrHw84WPYs5z/cPj4+Lp6+7m7Ovr4e3p7eHr52vkd3F1d/f18XLzdfPzd/Pw9vbwCfD19vTydvcL9HBx9nF38/QO9A7y8wzycnV+ao8zfCrwXp5gO+w53D458XvxmYBj35xYx74Ex+cCjv3Ajv0Iji8EHPuDHfsTHF8KOA4AOw4gOL4ScBwIdhxIcHwt4DgI7DiI4PhGwHEw2HEwwfGtgOMQsOMQguM7AcehYMehBMf3Ao7DwI7DCI4fBByHgx2HExw/CjiOADuOIDh+EnAcCXYcSXD8LOA4Cuw4iuD4xcLPPdoYD0x0dnTurwLnrr+Bz11/I5y7/ibg+B3s+J3g+F3A8QfY8QfB8YeA40+w40+C408BxyiwYxTBMUrA8RfY8RfB8ZeAY5zcWMfo9dCOcfJavqMV2NGK4Ggl4GgNdrQmOFoLOMYFO8YlOMYVcIwHdoxHcIwn4Bgf7Bif4BhfwDEB2DEBwTGBgGNCsGNCgmNCAcdEYMdEBMdEYEf0+cJSxgPzlDB/JLbw/RN9vnkW+HzzLML55iQCjrPBjrMJjkkFHOeAHecQHJMJOM4FO84lOCYXcJwHdpxHcEwh4Dgf7Dif4JhSwHEB2HEBwTGVgONCsONCgmNqAcdFYMdFBMc0Ao6LwY6LCY5pBRyXgB2XEBzTCTguBTsuJTimF3BcBnZcRnDMIOC4HOy4nOCYUcBxBdhxBcHRRsBxJdhxJcExk4DjKrDjKoJjZgHH1WDH1QTHLAKOwWDHYIKjrYDjGrDjGoJjVgHHtWDHtQTHbAKO68CO6wiO2QUc14Md1xMc7QQcN4AdNxAccwg4bgQ7biQ45hRw3AR23ERwzCXguBnsuJngaC/guAXsuIXgmFvAcSvYcSvBMY+A4zaw4zaCY14Bx+1gx+0Ex3wCjjvAjjsIjg4CjjvBjjsJjo4CjrvAjrsIjk4CjrvBjrsJjvkFHPeAHfcQHAsIOO4FO+4lOBYUcNwHdtxHcCwk4BgCdgwhODoLOIaCHUMJji4CjmFgxzCCo6uAYzjYMZzg6Gbh72ObZse57pW7wP7ZD9w/maw5jh4Wvn8yk3J7/s32z6yY9dCOXgKOB8COBwiO3gKOB8GOBwmOPgKOh8COhwiOhQUcD4MdDxMciwg4HgE7HiE4FhVwPAp2PEpwLCbgeAzseIzgWFzA8TjY8TjBsYSA4wmw4wmCY0kBx5Ngx5MEx1ICjqfAjqcIjqUFHE+DHU8THMsIOEaAHSMIjmUFHCPBjpEEx3J/s/Nm0+045x/LC1zHLzH4On6JCdfxqyDgmATsmITgWFHAMSnYMSnBsZKAYzKwYzKCY2UBx+Rgx+QExyoCjinAjikIjlUFHFOCHVMSHKsJOKYCO6YiOFYXcEwNdkxNcKwh4JgG7JiG4FhTwDEt2DEtwbGWgGM6sGM6gmNtAcf0YMf0BMc6Ao4ZwI4ZCI51BRwzgh0zEhzrCTjagB1tCI71BRwzgR0zERwbCDhmBjtmJjg2FHDMAnbMQnBsJOBoC3a0JTg2FnDMCnbMSnBsIuCYDeyYjeDYVMAxO9gxO8GxmYCjHdjRjuDYXMAxB9gxB8GxhYBjTrBjToJjSwHHXGDHXARHXwFHe7CjPcHRT8AxN9gxN8HRX8AxD9gxD8ExQMAxL9gxL8ExUMAxH9gxH8ExSMDRAezoQHBsJeDoCHZ0JDi2FnB0Ajs6ERzbCDjmBzvmJzi2FXAsAHYsQHBsJ+BYEOxYkODYXsCxENixEMGxg4CjM9jRmeDYUcDRBezoQnDsJODoCnZ0JTh2FnB0Azu6ERy7CDi6gx3dCY5dBRw9wI4eBMduAo6eYEdPgmN3AUcvsKMXwbGHgKM32NGb4NhTwNEH7OhDcOwl4FgY7FiY4NhbwLEI2LEIwbGPgGNRsGNRgmNfAcdiYMdiBMd+Ao7FwY7FCY79BRxLgB1LEBwHCDiWBDuWJDgOFHAsBXYsRXAcJOBYGuxYmuA4WMCxDNixDMFxiIBjWbBjWYLjUAHHcmDHcgTHYQKO5cGO5QmOwwUcK4AdKxAcRwg4VgQ7ViQ4jhRwrAR2rERwHCXgWBnsWJngOFrAsQrYsQrBcYyAY1WwY1WC41gBx2pgx2oEx3ECjtXBjtUJjuMFHGuAHWsQHCcIONYEO9YkOE4UcKwFdqxFcJwk4Fgb7Fib4DhZwLEO2LEOwXGKgGNdsGNdguNUAcd6YMd6BMdpAo71wY71CY7TBRwbgB0bEBxnCDg2BDs2JDjOFHBsBHZsRHCcJeDYGOzYmOA4W8CxCdixCcFxjoBjU7BjU4LjXAHHZmDHZgTHeQKOzcGOzQmO8wUcW4AdWxAcFwg4tgQ7tiQ4LhRw9AU7+hIcFwk4+oEd/QiOiwUc/cGO/gTHJQKOAWDHAILjUgHHQLBjIMFxmYBjENgxiOC4XMCxFdixFcFxhYBja7Bja4LjSgHHNmDHNgTHVQKObcGObQmOqwUc24Ed2xEcgwUc24Md2xMc1wg4dgA7diA4rhVw7Ah27EhwXCfg2Ans2InguF7AsTPYsTPBcYOAYxewYxeC40YBx65gx64Ex00Cjt3Ajt0IjpsFHLuDHbsTHLcIOPYAO/YgOG4VcOwJduxJcNwm4NgL7NiL4LhdwLE32LE3wXGHgGMfsGMfguNOAce+YMe+BMddAo79wI79CI67BRz7gx37Exz3CDgOADsOIDjuFXAcCHYcSHDcJ+A4COw4iOAYIuA4GOw4mOAYKuA4BOw4hOAYJuA4FOw4lOAYLuA4DOw4jOC4X8BxONhxOMHxgIDjCLDjCILjQQHHkWDHkQTHQwKOo8COowiOhwUcR4MdRxMcjwg4jgE7jiE4HhVwHAt2HEtwPCbgOA7sOI7geFzAcTzYcTzB8YSA4wSw4wSC40kBx4lgx4kEx1MCjpPAjpMIjqcFHCeDHScTHCMEHKeAHacQHCMFHKeCHacSHM8IOE4DO04jOJ4VcJwOdpxOcDwn4DgD7DiD4HhewHEm2HEmwfGCgOMssOMsguNFAcfZYMfZBMdLAo5zwI5zCI6XBRzngh3nEhyvCDjOAzvOIzheFXCcD3acT3C8JuC4AOy4gOB4XcBxIdhxIcHxhoDjIrDjIoLjTQHHxWDHxQTHWwKOS8COSwiOtwUcl4IdlxIc7wg4LgM7LiM43hVwXA52XE5wvCfguALsuILgeF/AcSXYcSXB8YGA4yqw4yqC40MBx9Vgx9UEx0cCjsFgx2CC42MBxzVgxzUExycCjmvBjmsJjk8FHNeBHdcRHJ8JOK4HO64nOD4XcNwAdtxAcHwh4LgR7LiR4PhSwHET2HETwfGVgONmsONmguNrAcctYMctBMc3Ao5bwY5bCY5vBRy3gR23ERzfCThuBztuJzi+F3DcAXbcQXD8IOC4E+y4k+D4UcBxF9hxF8Hxk4DjbrDjboLjZwHHPWDHPQTHLwKOe8GOewmOXwUc94Ed9xEcvwk4hoAdQwiO3wUcQ8GOoQTHHwKOYWDHMILjTwHHcLBjOMExSsBxP9hxP8Hxl4DjAbDjAYJjnHyW73gQ7HiQ4Ggl4HgI7HiI4Ggt4HgY7HiY4BhXwPEI2PEIwTGegONRsONRgmN8AcdjYMdjBMcEAo7HwY7HCY4JBRxPgB1PEBwTCTieBDueJDgmFnA8BXY8RXBMIuB4Gux4muCYVMAxAuwYQXBMJuAYCXaMJDgmF3A8A3Y8Q3BMIeB4Fux4luCYUsDxHNjxHMExlYDjebDjeYJjagHHC2DHCwTHNAKOF8GOFwmOaQUcL4EdLxEc0wk4XgY7XiY4phdwvAJ2vEJwzCDgeBXseJXgmFHA8RrY8RrB0UbA8TrY8TrBMZOA4w2w4w2CY2YBx5tgx5sExywCjrfAjrcIjrYCjrfBjrcJjlkFHO+AHe8QHLMJON4FO94lOGYXcLwHdrxHcLQTcLwPdrxPcMwh4PgA7PiA4JhTwPEh2PEhwTGXgOMjsOMjgqO9gONjsONjgmNuAccnYMcnBMc8Ao5PwY5PCY55BRyfgR2fERzzCTg+Bzs+Jzg6CDi+ADu+IDg6Cji+BDu+JDg6CTi+Aju+IjjmF3B8DXZ8TXAsIOD4Buz4huBYUMDxLdjxLcGxkIDjO7DjO4Kjs4Dje7Dje4Kji4DjB7DjB4Kjq4DjR7DjR4Kjm4DjJ7DjJ4Kju4DjZ7DjZ4Kjh4DjF7DjF4Kjp4DjV7DjV4Kjl4DjN7DjN4Kjt4Djd7Djd4Kjj4DjD7DjD4JjYQHHn2DHnwTHIgKOUWDHKIJjUQHHX2DHXwTHYgKOcfJgHaPXQzsWF3C0AjtaERxLCDhagx2tCY4lBRzjgh3jEhxLCTjGAzvGIziWFnCMD3aMT3AsI+CYAOyYgOBYVsAxIdgxIcGxnIBjIrBjIoJjeQHHxGDHxATHCgKOScCOSQiOFQUck4IdkxIcKwk4JgM7JiM4VhZwTA52TE5wrCLgmALsmILgWFXAMSXYMSXBsZqAYyqwYyqCY3UBx9Rgx9QExxoCjmnAjmkIjjUFHNOCHdMSHGsJOKYDO6YjONYWcEwPdkxPcKwj4JgB7JiB4FhXwDEj2DEjwbGegKMN2NGG4FhfwDET2DETwbGBgGNmsGNmgmNDAccsYMcsBMdGAo62YEdbgmNjAcesYMesBMcmAo7ZwI7ZCI5NBRyzgx2zExybCTjagR3tCI7NBRxzgB1zEBxbCDjmBDvmJDi2FHDMBXbMRXD0FXC0BzvaExz9BBxzgx1zExz9BRzzgB3zEBwDBBzzgh3zEhwDBRzzgR3zERyDBBwdwI4OBMdWAo6OYEdHgmNrAUcnsKMTwbGNgGN+sGN+gmNbAccCYMcCBMd2Ao4FwY4FCY7tBRwLgR0LERw7CDg6gx2dCY4dBRxdwI4uBMdOAo6uYEdXgmNnAUc3sKMbwbGLgKM72NGd4NhVwNED7OhBcOwm4OgJdvQkOHYXcPQCO3oRHHsIOHqDHb0Jjj0FHH3Ajj4Ex14CjoXBjoUJjr0FHIuAHYsQHPsIOBYFOxYlOPYVcCwGdixGcOwn4Fgc7Fic4NhfwLEE2LEEwXGAgGNJsGNJguNAAcdSYMdSBMdBAo6lwY6lCY6DBRzLgB3LEByHCDiWBTuWJTgOFXAsB3YsR3AcJuBYHuxYnuA4XMCxAtixAsFxhIBjRbBjRYLjSAHHSmDHSgTHUQKOlcGOlQmOowUcq4AdqxAcxwg4VgU7ViU4jhVwrAZ2rEZwHCfgWB3sWJ3gOF7AsQbYsQbBcYKAY02wY02C40QBx1pgx1oEx0kCjrXBjrUJjpMFHOuAHesQHKcIONYFO9YlOE4VcKwHdqxHcJwm4Fgf7Fif4DhdwLEB2LEBwXGGgGNDsGNDguNMAcdGYMdGBMdZAo6NwY6NCY6zBRybgB2bEBznCDg2BTs2JTjOFXBsBnZsRnCcJ+DYHOzYnOA4X8CxBdixBcFxgYBjS7BjS4LjQgFHX7CjL8FxkYCjH9jRj+C4WMDRH+zoT3BcIuAYAHYMIDguFXAMBDsGEhyXCTgGgR2DCI7LBRxbgR1bERxXCDi2Bju2JjiuFHBsA3ZsQ3BcJeDYFuzYluC4WsCxHdixHcExWMCxPdixPcFxjYBjB7BjB4LjWgHHjmDHjgTHdQKOncCOnQiO6wUcO4MdOxMcNwg4dgE7diE4bhRw7Ap27Epw3CTg2A3s2I3guFnAsTvYsTvBcYuAYw+wYw+C41YBx55gx54Ex20Cjr3Ajr0IjtsFHHuDHXsTHHcIOPYBO/YhOO4UcOwLduxLcNwl4NgP7NiP4LhbwLE/2LE/wXGPgOMAsOMAguNeAceBYMeBBMd9Ao6DwI6DCI4hAo6DwY6DCY6hAo5DwI5DCI5hAo5DwY5DCY7hAo7DwI7DCI77BRyHgx2HExwPCDiOADuOIDgeFHAcCXYcSXA8JOA4Cuw4iuB4WMBxNNhxNMHxiIDjGLDjGILjUQHHsWDHsQTHYwKO48CO4wiOxwUcx4MdxxMcTwg4TgA7TiA4nhRwnAh2nEhwPCXgOAnsOIngeFrAcTLYcTLBMULAcQrYcQrBMVLAcSrYcSrB8YyA4zSw4zSC41kBx+lgx+kEx3MCjjPAjjMIjucFHGeCHWcSHC8IOM4CO84iOF4UcJwNdpxNcLwk4DgH7DiH4HhZwHEu2HEuwfGKgOM8sOM8guNVAcf5YMf5BMdrAo4LwI4LCI7XBRwXgh0XEhxvCDguAjsuIjjeFHBcDHZcTHC8JeC4BOy4hOB4W8BxKdhxKcHxjoDjMrDjMoLjXQHH5WDH5QTHewKOK8COKwiO9wUcV4IdVxIcHwg4rgI7riI4PhRwXA12XE1wfCTgGAx2DCY4PhZwXAN2XENwfCLguBbsuJbg+FTAcR3YcR3B8ZmA43qw43qC43MBxw1gxw0ExxcCjhvBjhsJji8FHDeBHTcRHF8JOG4GO24mOL4WcNwCdtxCcHwj4LgV7LiV4PhWwHEb2HEbwfGdgON2sON2guN7AccdYMcdBMcPAo47wY47CY4fBRx3gR13ERw/CTjuBjvuJjh+FnDcA3bcQ3D8IuC4F+y4l+D4VcBxH9hxH8Hxm4BjCNgxhOD4XcAxFOwYSnD8IeAYBnYMIzj+FHAMBzuGExyjBBz3gx33Exx/CTgeADseIDjGcbB8x4Ngx4MERysBx0Ngx0MER2sBx8Ngx8MEx7gCjkfAjkcIjvEEHI+CHY8SHOMLOB4DOx4jOCYQcDwOdjxOcEwo4HgC7HiC4JhIwPEk2PEkwTGxgOMpsOMpgmMSAcfTYMfTBMekAo4RYMcIgmMyAcdIsGMkwTG5gOMZsOMZgmMKAcezYMezBMeUAo7nwI7nCI6pBBzPgx3PExxTCzheADteIDimEXC8CHa8SHBMK+B4Cex4ieCYTsDxMtjxMsExvYDjFbDjFYJjBgHHq2DHqwTHjGBHK7BjaeOBibZE57ax8NxlSLkzWXjusqTcmS08dzlS7iwWnrs8KbetheeuQMqd1cJzVyTlzmbhuSuRcme38NyVSbntLDx3FVLuHBaeuyopd04Lz12NlDuXheeuTsptb+G5a5By57bw3DVJufNYeO5apNx5LTx3bVLufBaeuw4pt4OF565Lyu1o4bnrkXI7WXju+qTc+S08dwNS7gIWnrshKXdBC8/diJS7kIXnbkzK7WzhuZuQcrtYeO6mpNyuFp67GSm3m4Xnbk7K7W7huVuQcntYeO6WpNyewNwJYtb57Rhjf6E9Jlnjjjv28Xo5/M7xow6aBRH7oFHrejvgNhkrd/Qxgh+j/9oMiWIdb/S/ExXzZ58Y5+jb48b6u+jbJ8fcb0qs+xeOdf/fW69IrOOP/rI2Zfmr7sjHsKgD9vvAGvu4uSw1nhxX2ePWWxmzHvoJt5iF/wJTtONqsONqgmNxAcdgsGMwwbGEgOMasOMagmNJAce1YMe1BMdSAo7rwI7rCI6lBRzXgx3XExzLCDhuADtuIDiWFXDcCHbcSHAsJ+C4Cey4ieBYXsBxM9hxM8GxgoDjFrDjFoJjRQHHrWDHrQTHSgKO28CO2wiOlQUctwMdlxtrrSQ4VvmbOa6MWQ/tWFXAcQfYcQfBsZqA406w406CY3UBx11gx10ExxoCjrvBjrsJjjUFHPeAHfcQHGsJOO4FO+4lONYWcNwHdtxHcKwj4BgCdgwhONYVcAwFO4YSHOsJOIaBHcMIjvUFHMPBjuEExwYCjvvBjvsJjg0FHA+AHQ8QHBsJOB4EOx4kODYWcDwEdjxEcGwi4HgY7HiY4NhUwPEI2PEIwbGZgONRsONRgmNzAcdjYMdjBMcWAo7HwY7HCY4tBRxPgB1PEBx9BRxPgh1PEhz9BBxPgR1PERz9BRxPgx1PExwDBBwjwI4RBMdAAcdIsGMkwTFIwPEM2PEMwbGVgONZsONZgmNrAcdzYMdzBMc2Ao7nwY7nCY5tBRwvgB0vEBzbCTheBDteJDi2F3C8BHa8RHDsIOB4Gex4meDYUcDxCtjxCsGxk4DjVbDjVYJjZwHHa2DHawTHLgKO18GO1wmOXQUcb4AdbxAcuwk43gQ73iQ4dhdwvAV2vEVw7CHgeBvseJvg2NPCL7i3wp7zfsBef7P3A06w5jj2tvD9M5GUu4+F75/oa84Br3HmUjRmPbRjXwHH4mDH4gTHfkDH366V+Jtl35hrK/Zz+J9rJvaPuWYiw7sE2LsEwXuAwL4tCXYsSXAcSNy3A2L268BY+3YQcd+WAnuXIngPFti3pcGOpQmOQ4j7dnDMfh0Sa98OJe7bMmDvMgTvYQL7tizYsSzBcThx3w6L2a/DY+3bEcR9Ww7sXY7gPVJg35YHO5YnOI4i7tuRMft1VKx9O5q4byuAvSsQvMcI7NuKYMeKBMexxH07Jma/jo21b8cR920lsHclgvd4gX1bGexYmeA4gbhvx8fs1wmx9u1E4r6tAvauQvCeJLBvgdd+c4n+TI6iBMfJxH07KWa/To61b6c4/M9ni/x2v/4xtw+Kdb+pv3O/oTG3j4h1v2m/c7/RMbePi3W/6b9zv4kxt0+Jdb8Zv3O/qTG3T4t1v5m/c7/pMbfPiHW/Wb9zv5kxt8+Kdb/ZDv9z+29f6HP7U61xj7VdzDpzjOOea9Q8o+YbtcCohUYtMmqxUUuMWmrUMqOWG7XCqJVGrTJqtVHBRq0xaq1R64xab9QGozYatcmozUZtMWqrUduM2m7UDqN2GrXL4f8jWcXYRh/Lb59ZE93PNfXzTP18U7/A1C809YtM/WJTv8TULzX1y0z9clO/wtSvNPWrTP1qUx9s6teY+rWmfp2pX2/qN5j6jaZ+k6nfbOq3mPqtpn6bqd9u6neY+p2mfldMH/srR8x/S8b81/mvff2v75m/+lw7x+GvrxUYFP3l7DIXtFZ0xnmQtf6/1/y/vpZrjJfLgr+6lvt/27ss/GtrOcd6HF0W/ZW1XP/XnnBZ/J+v5WzaXy5L/sO1PIP+Ya+6LP3P1vL+nX3vsuw/Wcv7d7+HXJb/+bW8/sn3o8uKP7uW1z/93nZZ+efWcv0XzxMuq/7MWl7/8jnHZfUfX8v/3zx/uQT/0bW8/u1zocuaP7aW8x94XnVZ+0fWcv5Dz9Eu6/79Wh5/8PneZf2/W8v9D//scNnwL9dyD/oTP4dcNv6rtbz+1M80l03/fC3vP/nz0WXzP1nLJ+hP/6x12fL7azn/Bz+3Xbb+3lrO/9FrAJdt/7iWy3/4esJlu3mtgP/4tYnLjv+9lttfeJ3jsjPWWq5Bf+k1k8su4HzKnq+mEear3Ub+PUbtNWqfUSFGhRoVZlS4UfuNOmDUQaMOGXXYqCNGHTXqmFHHjTph1EmjThl12qgIoyKNOmPUWaPOGXXeqAtGXTTqklGXjbpimq92m15/7zH1e039PlMfYupDTX2YqQ839ftN/QFTf9DUHzL1h039EVN/1NQfM/XHTf0JU3/S1J8y9adNfYSpjzT1Z0z9WVN/ztSfN/UXTP1FU3/J1F829Vcc+PPVNOB8tdvhr6/123y1Bzhf7QXOV/uA81UIcL4KBc5XYcD5Khw4X+0HzlcHgPPVQeB8dQg4Xx0GzldHgPPVUeB8dQw4Xx0HzlcngPPVSeB8dQo4X50GzlcRwPkqEjhfnQHOV2eB89U54Hx1HjhfXQDOVxeB89Ul4Hx1GThfXRGar6YT5qurRv5rRl036oZRN426ZdRto+4Yddeoe0bdN+qBUQ+NemTUY6OeGPXUqGdGPTfqhVEvjXpl1Guj3hj11qh3Rr036oNRH436ZNRno76Y5qurptff10z9dVN/w9TfNPW3TP1tU3/H1N819fdM/X1T/8DUPzT1j0z9Y1P/xNQ/NfXPTP1zU//C1L809a9M/WtT/8bUvzX170z9e1P/wdR/NPWfTP1nU//FgT9fTQfOV1cd/vpav81X14Dz1XXgfHUDOF/dBM5Xt4Dz1W3gfHUHOF/dBc5X94Dz1X3gfPUAOF89BM5Xj4Dz1WPgfPUEOF89Bc5Xz4Dz1XPgfPUCOF+9BM5Xr4Dz1WvgfPUGOF+9Bc5X74Dz1XvgfPUBOF99BM5Xn4Dz1WfgfPVFaL6aQZivvhr5vxn13agfRv00KsqoX9Gzj6ORwShro+IaFc+o+EYlMCqhUYmMSmxUEqOSGpXMqORGpTAqpVGpjEptVBqj0hqVzqj0RmUwKqNRNo5x/td89dX0+vubqf9u6n+Y+p+mPsrU/zL10fli91am3trUxzX18Ux9fFOfwNQnNPWJTH1iU5/E1Cc19clMfXJTn8LUpzT1qUx9alOfxtSnNfXpTH16U5/B1Gc09TaO/PlqBnC++gqcr74B56vvwPnqB3C++gmcr6KA89Uv4HwV/RzyH671D/OV1X+41u/NV9b/2Vq/O1/F/U/W+ifzVbw/v9Y/na/i/9m1/sV8leDPrfUv56uEf2atfzNfJfrja/3b+SrxH13rD8xXSf7YWn9ovkr6R9b6g/NVsn+/1h+er5L/u7X+xHyVwhE3X6V0xM1XqRxx81VqR9x8lcYRN1+ldcTNV+kccfNVekfcfJXBETdfZXTEzVc2jjrz1UzCfJXJyJ/ZqCxG2RqV1ahsRmU3ys6oHEblNCqXUfZG5TYqj1F5jcpnlINRjkY5GZXfqAJGFTSqkFHORrkY5WqUm1HuRnkY5WmUl1Hepvkqk+n1d2ZTn8XU25r6rKY+m6nPburtTH0OU5/T1Ocy9famPrepz2Pq85r6fKbewdQ7mnonU5/f1Bcw9QVNfSFT72zqXUy9q6l3M/Xupt7D1Huaei9T7+3In69mAuerTI5/fa3f5qvMoLWiM2aBrPX/vWz/+lr/PV9l/atrxZqvsv21tf7XfJX9r6xlmq/sgPNVDuB8lRM4X+UCzlf2wPkqN3C+ygOcr/IC56t8wPnKAThfOQLnKyfgfJUfOF8VAM5XBYHzVSHgfOUMnK9cgPOVK3C+cgPOV+7A+coDOF95AucrL+B85S00X80izFc+Rv7CRhUxqqhRxYwqblSJaBejShlV2qgyRpU1qpxR5Y2qYFRFoyoZVdmoKkZVNaqaUdWNqmFUTaNqGVXbqDpG1TWqnlH1jWpgVEPTfOVjev1d2NQXMfVFTX0xU1/c1Jcw9SVNfSlTX9rUlzH1ZU19OVNf3tRXMPUVTX0lU1/Z1Fcx9VVNfTVTX93U1zD1NU19LVNf29TXMfV1TX09U1/f1Dcw9Q0d+fPVLOB85eP419f6bb4qDJyvigDnq6LA+aoYcL4qDpyvSgDnq5LA+aoUcL4qDZyvygDnq7LA+aoccL4qD5yvKgDnq4rA+aoScL6qDJyvqgDnq6rA+aoacL6qDpyvagDnq5rA+aoWcL6qDZyv6gDnq7rA+aoecL6qD5yvGgDnq4ZC89VswnzVyMjf2KgmRjU1qplRzY1qYVRLo3yN8jPK36gAowKNCjKqlVGtjWpjVFuj2hnV3qgORnU0qpNRnY3qYlRXo7oZ1d2oHkb1NKqXUb1N81Uj0+vvxqa+ialvauqbmfrmpr6FqW9p6n1NvZ+p9zf1AaY+0NQHmfpWpr61qW9j6tua+namvr2p72DqO5r6Tqa+s6nvYuq7mvpupr67qe9h6nua+l6mvrcjf76aDZyvGjn+9bV+m68aA+erJsD5qilwvmoGnK+aA+erFsD5qiVwvvIFzld+wPnKHzhfBQDnq0DgfBUEnK9aAeer1sD5qg1wvmoLnK/aAeer9sD5qgNwvuoInK86AeerzsD5qgtwvuoKnK+6Aeer7sD5qgdwvuoJnK96Aeer3kLz1RzCfNXHyN/XqH5G9TdqgFEDjRpk1GCjhhg11KhhRg03aoRRI40aZdRoo8YYNdaocUaNN2qCURONmmTUZKOmGDXVqGlGTTdqhlEzjZpl1GzTfNXH9Pq7r6nvZ+r7m/oBpn6gqR9k6geb+iGmfqipH2bqh5v6EaZ+pKkfZepHm/oxpn6sqR9n6seb+gmmfqKpn2TqJ5v6KaZ+qqmfZuqnm/oZpn6mqZ9l6mc78uerOcD5qo/jX1/rt/mqL3C+6gecr/oD56sBwPlqIHC+GgScrwYD56shwPlqKHC+Ggacr4YD56sRwPlqJHC+GgWcr0YD56sxwPlqLHC+Ggecr8YD56sJwPlqInC+mgScryYD56spwPlqKnC+mgacr6YD56sZwPlqJnC+mgWcr2YLzVdzCfPVHCP/XKPmGTXfqAVGLTRqkVGLjVpi1FKjlhm13KgVRq00apVRq40KNmqNUWuNWmfUeqM2GLXRqE1GbTZqi1Fbjdpm1Hajdhi106hdpvlqjun191xTP8/Uzzf1C0z9QlO/yNQvNvVLTP1SU7/M1C839StM/UpTv8rUrzb1waZ+jalfa+rXmfr1pn6Dqd9o6jeZ+s2mfoup32rqt5n67aZ+h6nfaep3OfLnq7nA+WqO419f678//wo4X80DzlfzgfPVAuB8tRA4Xy0CzleLgfPVEuB8tRQ4Xy0DzlfLgfPVCuB8tRI4X60CzlergfNVMHC+WgOcr9YC56t1wPlqPXC+2gCcrzYC56tNwPlqM3C+2gKcr7YC56ttwPlqO3C+2gGcr3YC56tdQvPVPMJ8tdvIv8eovUbtMyrEqFCjwowKN2q/UQeMOmjUIaMOG3XEqKNGHTPquFEnjDpp1CmjThsVYVSkUWeMOmvUOaPOG3XBqItGXTLqslFXTPPVbtPr7z2mfq+p32fqQ0x9qKkPM/Xhpn6/qT9g6g+a+kOm/rCpP2Lqj5r6Y6b+uKk/YepPmvpTpv60qY8w9ZGm/oypP2vqz5n686b+gqm/aOovmfrLpv6KI3++mgecr3Y7/vW1/vvzr4Dz1V7gfLUPOF+FAOerUOB8FQacr8KB89V+4Hx1ADhfHQTOV4eA89Vh4Hx1BDhfHQXOV8eA89Vx4Hx1AjhfnQTOV6eA89Vp4HwVAZyvIoHz1RngfHUWOF+dA85X54Hz1QXgfHUROF9dAs5Xl4Hz1RWh+Wo+Yb66auS/ZtR1o24YddOoW0bdNuqOUXeNumfUfaMeGPXQqEdGPTbqiVFPjXpm1HOjXhj10qhXRr026o1Rb416Z9R7oz4Y9dGoT0Z9NuqLab66anr9fc3UXzf1N0z9TVN/y9TfNvV3TP1dU3/P1N839Q9M/UNT/8jUPzb1T0z9U1P/zNQ/N/UvTP1LU//K1L829W9M/VtT/87Uvzf1H0z9R1P/ydR/NvVfHPnz1XzgfHXV8a+v9d+ffwWcr64D56sbwPnqJnC+ugWcr24D56s7wPnqLnC+ugecr+4D56sHwPnqIXC+egScrx4D56snwPnqKXC+egacr54D56sXwPnqJXC+egWcr14D56s3wPnqLXC+egecr94D56sPwPnqI3C++gScrz4D56svQvPVAsJ89dXI/82o70b9MOqnUVFG/YqefZyMDEZZGxXXqHhGxTcqgVEJjUpkVGKjkhiV1KhkRiU3KoVRKY1KZVRqo9IYldaodEalNyqDURmNsnGK87/mq6+m19/fTP13U//D1P809VGm/pepj84Xu7cy9damPq6pj2fq45v6BKY+oalPZOoTm/okpj6pqU9m6pOb+hSmPqWpT2XqU5v6NKY+ralPZ+rTm/oMpj6jqbdx4s9XC4Dz1VfgfPUNOF99B85XP4Dz1U/gfBUFnK9+Aeer6OeQ/3Ctf/z8q/9wrd/9/Kv/bK3f//yr/2Stf/b5V39+rX/++Vd/dq1/9flXf26tf/35V39mrX/3+Vd/fK1///lXf3StP/L5V39srT/2+Vd/ZK0/+vlX/36tP/75V/9urT/z+VdOuPkqpRNuvkrlhJuvUjvh5qs0Trj5Kq0Tbr5K54Sbr9I74earDE64+SqjE26+snHSma8WEuarTEb+zEZlMcrWqKxGZTMqu1F2RuUwKqdRuYyyNyq3UXmMymtUPqMcjHI0ysmo/EYVMKqgUYWMcjbK5f9R9w7Agl77s3YycTK2bdu2bdu2bdu2bdu2bdv4er70zD/5nSSzZ3avqvum6qnndt3KqrP6TCZvn3v3LJAYJAFJQTKQHKQAKc2+CmW+v0ObHMbksCaHMzm8yRFMjmhyJJMjmxzF5KgmRzM5uskxTI5pciyTY5scx+S4JsczOb7JCUxOaHIikxObnMTkpCYnMzm5ySlMThnH/b4aL9xXoeL4/qzP71+Jzvp4xzCSs/7sK6zvz/q/9698e9Zf37/y3Vl/f//KN2eZfRVRuK8iCfdVZOG+iiLcV1GF+yqacF9FF+6rGMJ9FVO4r2IJ91Vs4b6KI9xXcYX7Kp5wX8UX7qsEwn2VULivEgn3VWLhvkoi3FdJhfsqmXBfJRfuqxTCfZXSQ/tqgoN9lQr3Tw3SgLQgHUgPMnzsBWQCmUEWkBVkA9lBDpAT5AK5QR6QF+QD+UEBUBAUAoVBEVAUFAPFQQlQ0uyrVOb7O7XJaUxOa3I6k9ObnMHkjCZnMjmzyVlMzmpyNpOzm5zD5Jwm5zI5t8l5TM5rcj6T85tcwOSCJhcyubDJRUwuanIxk4ubXMLkknHc76sJwn2VKo7vz/r8/pVwX6UR7qu0wn2VTriv0gv3VQbhvsoo3FeZhPsqs3BfZRHuq6zCfZVNuK+yC/dVDuG+yincV7mE+yq3cF/lEe6rvMJ9lU+4r/IL91UB4b4qKNxXhYT7qrBwXxUR7quiwn1VTLivigv3VQnhvirpoX010cG+KoX7lwZlQFlQDpQHFUBFUAlUBlVAVVANVAc1QE1QC9QGdUBdUA/UBw1AQ9AINAZNQFPQDDQHLUBLs69Kme/v0iaXMbmsyeVMLm9yBZMrmlzJ5MomVzG5qsnVTK5ucg2Ta5pcy+TaJtcxua7J9Uyub3IDkxua3MjkxiY3Mbmpyc1Mbm5yC5NbxnG/ryYK91WpOL4/6/P7V8J9VUa4r8oK91U54b4qL9xXFYT7qqJwX1US7qvKwn1VRbivqgr3VTXhvqou3Fc1hPuqpnBf1RLuq9rCfVVHuK/qCvdVPeG+qi/cVw2E+6qhcF81Eu6rxsJ91US4r5oK91Uz4b5qLtxXLYT7qqWH9tUkB/uqFe7fGrQBbUE70B50AB1BJ9AZdAFdQTfQHfQAPUEv0Bv0AX1BP9AfDAADwSAwGAwBQ8EwMByMACPNvmplvr9bm9zG5LYmtzO5vckdTO5ocieTO5vcxeSuJnczubvJPUzuaXIvk3ub3Mfkvib3M7m/yQNMHmjyIJMHmzzE5KEmDzN5uMkjTB4Zx/2+miTcV63i+P6sz+9fCfdVG+G+aivcV+2E+6q9cF91EO6rjsJ91Um4rzoL91UX4b7qKtxX3YT7qrtwX/UQ7quewn3VS7ivegv3VR/hvuor3Ff9hPuqv3BfDRDuq4HCfTVIuK8GC/fVEOG+GircV8OE+2q4cF+NEO6rkR7aV5Md7KtRuP9oMAaMBePAeDABTASTwGQwBUwF08B0MAPMBLPAbDAHzAXzwHywACwEi8BisAQsBcvAcrACrDT7apT5/h5t8hiTx5o8zuTxJk8weaLJk0yebPIUk6eaPM3k6SbPMHmmybNMnm3yHJPnmjzP5PkmLzB5ocmLTF5s8hKTl5q8zOTlJq8weWUc9/tqsnBfjYrj+7M+v38l3FdjhPtqrHBfjRPuq/HCfTVBuK8mCvfVJOG+mizcV1OE+2qqcF9NE+6r6cJ9NUO4r2YK99Us4b6aLdxXc4T7aq5wX80T7qv5wn21QLivFgr31SLhvlos3FdLhPtqqXBfLRPuq+XCfbVCuK9WemhfTXGwr1bh/qvBGrAWrAPrwQawEWwCm8EWsBVsA9vBDrAT7AK7wR6wF+wD+8EBcBAcAofBEXAUHAPHwQlw0uyrVeb7e7XJa0xea/I6k9ebvMHkjSZvMnmzyVtM3mryNpO3m7zD5J0m7zJ5t8l7TN5r8j6T95t8wOSDJh8y+bDJR0w+avIxk4+bfMLkk3Hc76spwn21Ko7vz/r8/pVwX60R7qu1wn21Triv1gv31Qbhvtoo3FebhPtqs3BfbRHuq63CfbVNuK+2C/fVDuG+2incV7uE+2q3cF/tEe6rvcJ9tU+4r/YL99UB4b46KNxXh4T76rBwXx0R7qujwn11TLivjgv31QnhvjrpoX011cG+OoX7nwZnwFlwDpwHF8BFcAlcBlfAVXANXAc3wE1wC9wGd8BdcA/cBw/AQ/AIPAZPwFPwDDwHL8BLs69Ome/v0yafMfmsyedMPm/yBZMvmnzJ5MsmXzH5qsnXTL5u8g2Tb5p8y+TbJt8x+a7J90y+b/IDkx+a/MjkxyY/Mfmpyc9Mfm7yC5NfxnG/r6YK99WpOL4/6/P7V8J9dUa4r84K99U54b46L9xXF4T76qJwX10S7qvLwn11Rbivrgr31TXhvrou3Fc3hPvqpnBf3RLuq9vCfXVHuK/uCvfVPeG+ui/cVw+E++qhcF89Eu6rx8J99US4r54K99Uz4b56LtxXL4T76qWH9tU0B/vqFe7/GrwBb8E78B58+Lh94uIOwA/4AfwIfgI/g1/Ar+A38Dv4A/gF/oB/EAAEBIFAYBAEBAXBQHAQAoSM+93f9tUr8/392uQ3Jr81+Z3J703+YPLH+/01f2+yH5N/MPlHk38y+WeTfzH5V5N/M/l3k/8w2a/J/kz2b3IAkwOaHMjkwCYHMTmoycFMDm5yCJNDxnW/r6YJ99Ur4b56LdxXb4T76q1wX70T7qv3wn31QbivPv4e8o1n/e/7V9941j++f/VtZ/3z+1ffcta/vX/19Wf9+/tXX3vWf71/9XVn/ff7V19z1pfev/L5WV9+/8qnZ/nk/SufneWz9698cpZP37/68lk+f//qS2d9zftXcXX7KkBc3b4KGFe3rwLF1e2rwHF1+ypIXN2+ChpXt6+CxdXtq+BxdfsqRFzdvgoZ1zv7arqDfRUK9w8NwoCwIBwIDyKAiCASiAyigKggGogOYoCYIBaIDeKAuCAeiA8SgIQgEUgMkoCkIBlIDlKAlGZfhTLf36FNDmNyWJPDmRze5AgmRzQ5ksmRTY5iclSTo5kc3eQYJsc0OZbJsU2OY3Jck+OZHN/kBCYnNDmRyYlNTmJyUpOTmZzc5BQmp4zrfl9NF+6rUHF9f9bn969EZ328YxjJWX/2Fdb3Z/3f+1e+Peuv71/57qy/v3/lm7PMvooo3FeRhPsqsnBfRRHuq6jCfRVNuK+iC/dVDOG+iincV7GE+yq2cF/FEe6ruMJ9FU+4r+IL91UC4b5KKNxXiYT7KrFwXyUR7qukwn2VTLivkgv3VQrhvkrpoX01w8G+SoX7pwZpQFqQDqQHGT72AjKBzCALyAqygewgB8gJcoHcIA/IC/KB/KAAKAgKgcKgCCgKioHioAQoafZVKvP9ndrkNCanNTmdyelNzmByRpMzmZzZ5CwmZzU5m8nZTc5hck6Tc5mc2+Q8Juc1OZ/J+U0uYHJBkwuZXNjkIiYXNbmYycVNLmFyybju99UM4b5KFdf3Z31+/0q4r9II91Va4b5KJ9xX6YX7KoNwX2UU7qtMwn2VWbivsgj3VVbhvsom3FfZhfsqh3Bf5RTuq1zCfZVbuK/yCPdVXuG+yifcV/mF+6qAcF8VFO6rQsJ9VVi4r4oI91VR4b4qJtxXxYX7qoRwX5X00L6a6WBflcL9S4MyoCwoB8qDCqAiqAQqgyqgKqgGqoMaoCaoBWqDOqAuqAfqgwagIWgEGoMmoCloBpqDFqCl2VelzPd3aZPLmFzW5HImlze5gskVTa5kcmWTq5hc1eRqJlc3uYbJNU2uZXJtk+uYXNfkeibXN7mByQ1NbmRyY5ObmNzU5GYmNze5hckt47rfVzOF+6pUXN+f9fn9K+G+KiPcV2WF+6qccF+VF+6rCsJ9VVG4ryoJ91Vl4b6qItxXVYX7qppwX1UX7qsawn1VU7ivagn3VW3hvqoj3Fd1hfuqnnBf1RfuqwbCfdVQuK8aCfdVY+G+aiLcV02F+6qZcF81F+6rFsJ91dJD+2qWg33VCvdvDdqAtqAdaA86gI6gE+gMuoCuoBvoDnqAnqAX6A36gL6gH+gPBoCBYBAYDIaAoWAYGA5GgJFmX7Uy39+tTW5jcluT25nc3uQOJnc0uZPJnU3uYnJXk7uZ3N3kHib3NLmXyb1N7mNyX5P7mdzf5AEmDzR5kMmDTR5i8lCTh5k83OQRJo+M635fzRLuq1ZxfX/W5/evhPuqjXBftRXuq3bCfdVeuK86CPdVR+G+6iTcV52F+6qLcF91Fe6rbsJ91V24r3oI91VP4b7qJdxXvYX7qo9wX/UV7qt+wn3VX7ivBgj31UDhvhok3FeDhftqiHBfDRXuq2HCfTVcuK9GCPfVSA/tq9kO9tUo3H80GAPGgnFgPJgAJoJJYDKYAqaCaWA6mAFmgllgNpgD5oJ5YD5YABaCRWAxWAKWgmVgOVgBVpp9Ncp8f482eYzJY00eZ/J4kyeYPNHkSSZPNnmKyVNNnmbydJNnmDzT5FkmzzZ5jslzTZ5n8nyTF5i80ORFJi82eYnJS01eZvJyk1eYvDKu+301W7ivRsX1/Vmf378S7qsxwn01Vrivxgn31Xjhvpog3FcThftqknBfTRbuqynCfTVVuK+mCffVdOG+miHcVzOF+2qWcF/NFu6rOcJ9NVe4r+YJ99V84b5aINxXC4X7apFwXy0W7qslwn21VLivlgn31XLhvloh3FcrPbSv5jjYV6tw/9VgDVgL1oH1YAPYCDaBzWAL2Aq2ge1gB9gJdoHdYA/YC/aB/eAAOAgOgcPgCDgKjoHj4AQ4afbVKvP9vdrkNSavNXmdyetN3mDyRpM3mbzZ5C0mbzV5m8nbTd5h8k6Td5m82+Q9Ju81eZ/J+00+YPJBkw+ZfNjkIyYfNfmYycdNPmHyybju99Uc4b5aFdf3Z31+/0q4r9YI99Va4b5aJ9xX64X7aoNwX20U7qtNwn21Wbivtgj31Vbhvtom3Ffbhftqh3Bf7RTuq13CfbVbuK/2CPfVXuG+2ifcV/uF++qAcF8dFO6rQ8J9dVi4r44I99VR4b46JtxXx4X76oRwX5300L6a62BfncL9T4Mz4Cw4B86DC+AiuAQugyvgKrgGroMb4Ca4BW6DO+AuuAfugwfgIXgEHoMn4Cl4Bp6DF+Cl2VenzPf3aZPPmHzW5HMmnzf5gskXTb5k8mWTr5h81eRrJl83+YbJN02+ZfJtk++YfNfkeybfN/mByQ9NfmTyY5OfmPzU5GcmPzf5hckv47rfV3OF++pUXN+f9fn9K+G+OiPcV2eF++qccF+dF+6rC8J9dVG4ry4J99Vl4b66ItxXV4X76ppwX10X7qsbwn11U7ivbgn31W3hvroj3Fd3hfvqnnBf3RfuqwfCffVQuK8eCffVY+G+eiLcV0+F++qZcF89F+6rF8J99dJD+2qeg331Cvd/Dd6At+AdeA8+fNw+8XAH4Af8AH4EP4GfwS/gV/Ab+B38AfwCf8A/CAACgkAgMAgCgoJgIDgIAULG++5v++qV+f5+bfIbk9+a/M7k9yZ/MPnj/f6avzfZj8k/mPyjyT+Z/LPJv5j8q8m/mfy7yX+Y7Ndkfyb7NzmAyQFNDmRyYJODmBzU5GAmBzc5hMkh47nfV/OE++qVcF+9Fu6rN8J99Va4r94J99V74b76INxXH38P+caz/vf9q2886x/fv/q2s/75/atvOevf3r/6+rP+/f2rrz3rv96/+rqz/vv9q68560vvX/n8rC+/f+XTs3zy/pXPzvLZ+1c+Ocun7199+Syfv3/1pbO+5v2reLp9FSCebl8FjKfbV4Hi6fZV4Hi6fRUknm5fBY2n21fB4un2VfB4un0VIp5uX4WM5519Nd/BvgqF+4cGYUBYEA6EBxFARBAJRAZRQFQQDUQHMUBMEAvEBnFAXBAPxAcJQEKQCCQGSUBSkAwkBylASrOvQpnv79AmhzE5rMnhTA5vcgSTI5ocyeTIJkcxOarJ0UyObnIMk2OaHMvk2CbHMTmuyfFMjm9yApMTmpzI5MQmJzE5qcnJTE5ucgqTU8Zzv6/mC/dVqHi+P+vz+1eisz7eMYzkrD/7Cuv7s/7v/SvfnvXX9698d9bf37/yzVlmX0UU7qtIwn0VWbivogj3VVThvoom3FfRhfsqhnBfxRTuq1jCfRVbuK/iCPdVXOG+iifcV/GF+yqBcF8lFO6rRMJ9lVi4r5II91VS4b5KJtxXyYX7KoVwX6X00L5a4GBfpcL9U4M0IC1IB9KDDB97AZlAZpAFZAXZQHaQA+QEuUBukAfkBflAflAAFASFQGFQBBQFxUBxUAKUNPsqlfn+Tm1yGpPTmpzO5PQmZzA5o8mZTM5schaTs5qczeTsJucwOafJuUzObXIek/OanM/k/CYXMLmgyYVMLmxyEZOLmlzM5OImlzC5ZDz3+2qBcF+liuf7sz6/fyXcV2mE+yqtcF+lE+6r9MJ9lUG4rzIK91Um4b7KLNxXWYT7KqtwX2UT7qvswn2VQ7ivcgr3VS7hvsot3Fd5hPsqr3Bf5RPuq/zCfVVAuK8KCvdVIeG+KizcV0WE+6qocF8VE+6r4sJ9VUK4r0p6aF8tdLCvSuH+pUEZUBaUA+VBBVARVAKVQRVQFVQD1UENUBPUArVBHVAX1AP1QQPQEDQCjUET0BQ0A81BC9DS7KtS5vu7tMllTC5rcjmTy5tcweSKJlcyubLJVUyuanI1k6ubXMPkmibXMrm2yXVMrmtyPZPrm9zA5IYmNzK5sclNTG5qcjOTm5vcwuSW8dzvq4XCfVUqnu/P+vz+lXBflRHuq7LCfVVOuK/KC/dVBeG+qijcV5WE+6qycF9VEe6rqsJ9VU24r6oL91UN4b6qKdxXtYT7qrZwX9UR7qu6wn1VT7iv6gv3VQPhvmoo3FeNhPuqsXBfNRHuq6bCfdVMuK+aC/dVC+G+aumhfbXIwb5qhfu3Bm1AW9AOtAcdQEfQCXQGXUBX0A10Bz1AT9AL9AZ9QF/QD/QHA8BAMAgMBkPAUDAMDAcjwEizr1qZ7+/WJrcxua3J7Uxub3IHkzua3MnkziZ3Mbmryd1M7m5yD5N7mtzL5N4m9zG5r8n9TO5v8gCTB5o8yOTBJg8xeajJw0webvIIk0fGc7+vFgn3Vat4vj/r8/tXwn3VRriv2gr3VTvhvmov3FcdhPuqo3BfdRLuq87CfdVFuK+6CvdVN+G+6i7cVz2E+6qncF/1Eu6r3sJ91Ue4r/oK91U/4b7qL9xXA4T7aqBwXw0S7qvBwn01RLivhgr31TDhvhou3FcjhPtqpIf21WIH+2oU7j8ajAFjwTgwHkwAE8EkMBlMAVPBNDAdzAAzwSwwG8wBc8E8MB8sAAvBIrAYLAFLwTKwHKwAK82+GmW+v0ebPMbksSaPM3m8yRNMnmjyJJMnmzzF5KkmTzN5uskzTJ5p8iyTZ5s8x+S5Js8zeb7JC0xeaPIikxebvMTkpSYvM3m5yStMXhnP/b5aLNxXo+L5/qzP718J99UY4b4aK9xX44T7arxwX00Q7quJwn01SbivJgv31RThvpoq3FfThPtqunBfzRDuq5nCfTVLuK9mC/fVHOG+mivcV/OE+2q+cF8tEO6rhcJ9tUi4rxYL99US4b5aKtxXy4T7arlwX60Q7quVHtpXSxzsq1W4/2qwBqwF68B6sAFsBJvAZrAFbAXbwHawA+wEu8BusAfsBfvAfnAAHASHwGFwBBwFx8BxcAKcNPtqlfn+Xm3yGpPXmrzO5PUmbzB5o8mbTN5s8haTt5q8zeTtJu8weafJu0zebfIek/eavM/k/SYfMPmgyYdMPmzyEZOPmnzM5OMmnzD5ZDz3+2qJcF+tiuf7sz6/fyXcV2uE+2qtcF+tE+6r9cJ9tUG4rzYK99Um4b7aLNxXW4T7aqtwX20T7qvtwn21Q7ivdgr31S7hvtot3Fd7hPtqr3Bf7RPuq/3CfXVAuK8OCvfVIeG+OizcV0eE++qocF8dE+6r48J9dUK4r056aF8tdbCvTuH+p8EZcBacA+fBBXARXAKXwRVwFVwD18ENcBPcArfBHXAX3AP3wQPwEDwCj8ET8BQ8A8/BC/DS7KtT5vv7tMlnTD5r8jmTz5t8weSLJl8y+bLJV0y+avI1k6+bfMPkmybfMvm2yXdMvmvyPZPvm/zA5IcmPzL5sclPTH5q8jOTn5v8wuSX8dzvq6XCfXUqnu/P+vz+lXBfnRHuq7PCfXVOuK/OC/fVBeG+uijcV5eE++qycF9dEe6rq8J9dU24r64L99UN4b66KdxXt4T76rZwX90R7qu7wn11T7iv7gv31QPhvnoo3FePhPvqsXBfPRHuq6fCffVMuK+eC/fVC+G+eumhfbXMwb56hfu/Bm/AW/AOvAcfPm6f+LgD8AN+AD+Cn8DP4BfwK/gN/A7+AH6BP+AfBAABQSAQGAQBQUEwEByEACHjf/e3ffXKfH+/NvmNyW9Nfmfye5M/mPzxfn/N35vsx+QfTP7R5J9M/tnkX0z+1eTfTP7d5D9M9muyP5P9mxzA5IAmBzI5sMlBTA5qcjCTg5scwuSQ8d3vq2XCffVKuK9eC/fVG+G+eivcV++E++q9cF99EO6rj7+HfONZ//v+1Tee9Y/vX33bWf/8/tW3nPVv7199/Vn//v7V1571X+9ffd1Z//3+1dec9aX3r3x+1pffv/LpWT55/8pnZ/ns/SufnOXT96++fJbP37/60llf8/5VfN2+ChBft68Cxtftq0DxdfsqcHzdvgoSX7evgsbX7atg8XX7Knh83b4KEV+3r0LG986+Wu5gX4XC/UODMCAsCAfCgwggIogEIoMoICqIBqKDGCAmiAVigzggLogH4oMEICFIBBKDJCApSAaSgxQgpdlXocz3d2iTw5gc1uRwJoc3OYLJEU2OZHJkk6OYHNXkaCZHNzmGyTFNjmVybJPjmBzX5Hgmxzc5gckJTU5kcmKTk5ic1ORkJic3OYXJKeO731fLhfsqVHzfn/X5/SvRWR/vGEZy1p99hfX9Wf/3/pVvz/rr+1e+O+vv71/55iyzryIK91Uk4b6KLNxXUYT7KqpwX0UT7qvown0VQ7ivYgr3VSzhvoot3FdxhPsqrnBfxRPuq/jCfZVAuK8SCvdVIuG+SizcV0mE+yqpcF8lE+6r5MJ9lUK4r1J6aF+tcLCvUuH+qUEakBakA+lBho+9gEwgM8gCsoJsIDvIAXKCXCA3yAPygnwgPygACoJCoDAoAoqCYqA4KAFKmn2Vynx/pzY5jclpTU5ncnqTM5ic0eRMJmc2OYvJWU3OZnJ2k3OYnNPkXCbnNjmPyXlNzmdyfpMLmFzQ5EImFza5iMlFTS5mcnGTS5hcMr77fbVCuK9Sxff9WZ/fvxLuqzTCfZVWuK/SCfdVeuG+yiDcVxmF+yqTcF9lFu6rLMJ9lVW4r7IJ91V24b7KIdxXOYX7KpdwX+UW7qs8wn2VV7iv8gn3VX7hviog3FcFhfuqkHBfFRbuqyLCfVVUuK+KCfdVceG+KiHcVyU9tK9WOthXpXD/0qAMKAvKgfKgAqgIKoHKoAqoCqqB6qAGqAlqgdqgDqgL6oH6oAFoCBqBxqAJaAqageagBWhp9lUp8/1d2uQyJpc1uZzJ5U2uYHJFkyuZXNnkKiZXNbmaydVNrmFyTZNrmVzb5Dom1zW5nsn1TW5gckOTG5nc2OQmJjc1uZnJzU1uYXLL+O731UrhvioV3/dnfX7/Srivygj3VVnhvion3FflhfuqgnBfVRTuq0rCfVVZuK+qCPdVVeG+qibcV9WF+6qGcF/VFO6rWsJ9VVu4r+oI91Vd4b6qJ9xX9YX7qoFwXzUU7qtGwn3VWLivmgj3VVPhvmom3FfNhfuqhXBftfTQvlrlYF+1wv1bgzagLWgH2oMOoCPoBDqDLqAr6Aa6gx6gJ+gFeoM+oC/oB/qDAWAgGAQGgyFgKBgGhoMRYKTZV63M93drk9uY3Nbkdia3N7mDyR1N7mRyZ5O7mNzV5G4mdze5h8k9Te5lcm+T+5jc1+R+Jvc3eYDJA00eZPJgk4eYPNTkYSYPN3mEySPju99Xq4T7qlV835/1+f0r4b5qI9xXbYX7qp1wX7UX7qsOwn3VUbivOgn3VWfhvuoi3Fddhfuqm3BfdRfuqx7CfdVTuK96CfdVb+G+6iPcV32F+6qfcF/1F+6rAcJ9NVC4rwYJ99Vg4b4aItxXQ4X7aphwXw0X7qsRwn010kP7arWDfTUK9x8NxoCxYBwYDyaAiWASmAymgKlgGpgOZoCZYBaYDeaAuWAemA8WgIVgEVgMloClYBlYDlaAlWZfjTLf36NNHmPyWJPHmTze5AkmTzR5ksmTTZ5i8lSTp5k83eQZJs80eZbJs02eY/Jck+eZPN/kBSYvNHmRyYtNXmLyUpOXmbzc5BUmr4zvfl+tFu6rUfF9f9bn96+E+2qMcF+NFe6rccJ9NV64ryYI99VE4b6aJNxXk4X7aopwX00V7qtpwn01XbivZgj31Uzhvpol3FezhftqjnBfzRXuq3nCfTVfuK8WCPfVQuG+WiTcV4uF+2qJcF8tFe6rZcJ9tVy4r1YI99VKD+2rNQ721SrcfzVYA9aCdWA92AA2gk1gM9gCtoJtYDvYAXaCXWA32AP2gn1gPzgADoJD4DA4Ao6CY+A4OAFOmn21ynx/rzZ5jclrTV5n8nqTN5i80eRNJm82eYvJW03eZvJ2k3eYvNPkXSbvNnmPyXtN3mfyfpMPmHzQ5EMmHzb5iMlHTT5m8nGTT5h8Mr77fbVGuK9Wxff9WZ/fvxLuqzXCfbVWuK/WCffVeuG+2iDcVxuF+2qTcF9tFu6rLcJ9tVW4r7YJ99V24b7aIdxXO4X7apdwX+0W7qs9wn21V7iv9gn31X7hvjog3FcHhfvqkHBfHRbuqyPCfXVUuK+OCffVceG+OiHcVyc9tK/WOthXp3D/0+AMOAvOgfPgArgILoHL4Aq4Cq6B6+AGuAlugdvgDrgL7oH74AF4CB6Bx+AJeAqegefgBXhp9tUp8/192uQzJp81+ZzJ502+YPJFky+ZfNnkKyZfNfmayddNvmHyTZNvmXzb5Dsm3zX5nsn3TX5g8kOTH5n82OQnJj81+ZnJz01+YfLL+O731VrhvjoV3/dnfX7/Srivzgj31Vnhvjon3FfnhfvqgnBfXRTuq0vCfXVZuK+uCPfVVeG+uibcV9eF++qGcF/dFO6rW8J9dVu4r+4I99Vd4b66J9xX94X76oFwXz0U7qtHwn31WLivngj31VPhvnom3FfPhfvqhXBfvfTQvlrnYF+9wv1fgzfgLXgH3oMPH7dPAtwB+AE/gB/BT+Bn8Av4FfwGfgd/AL/AH/APAoCAIBAIDIKAoCAYCA5CgJAJvvvbvnplvr9fm/zG5LcmvzP5vckfTP54v7/m7032Y/IPJv9o8k8m/2zyLyb/avJvJv9u8h8m+zXZn8n+TQ5gckCTA5kc2OQgJgc1OZjJwU0OYXLIBO731Trhvnol3FevhfvqjXBfvRXuq3fCffVeuK8+CPfVx99DvvGs/33/6hvP+sf3r77trH9+/+pbzvq396++/qx/f//qa8/6r/evvu6s/37/6mvO+tL7Vz4/68vvX/n0LJ+8f+Wzs3z2/pVPzvLp+1dfPsvn71996ayvef8qgW5fBUig21cBE+j2VaAEun0VOIFuXwVJoNtXQRPo9lWwBLp9FTyBbl+FSKDbVyETeGdfrXewr0Lh/qFBGBAWhAPhQQQQEUQCkUEUEBVEA9FBDBATxAKxQRwQF8QD8UECkBAkAolBEpAUJAPJQQqQ0uyrUOb7O7TJYUwOa3I4k8ObHMHkiCZHMjmyyVFMjmpyNJOjmxzD5JgmxzI5tslxTI5rcjyT45ucwOSEJicyObHJSUxOanIyk5ObnMLklAnc76v1wn0VKoHvz/r8/pXorI93DCM568++wvr+rP97/8q3Z/31/SvfnfX39698c5bZVxGF+yqScF9FFu6rKMJ9FVW4r6IJ91V04b6KIdxXMYX7KpZwX8UW7qs4wn0VV7iv4gn3VXzhvkog3FcJhfsqkXBfJRbuqyTCfZVUuK+SCfdVcuG+SiHcVyk9tK82ONhXqXD/1CANSAvSgfQgw8deQCaQGWQBWUE2kB3kADlBLpAb5AF5QT6QHxQABUEhUBgUAUVBMVAclAAlzb5KZb6/U5ucxuS0JqczOb3JGUzOaHImkzObnMXkrCZnMzm7yTlMzmlyLpNzm5zH5Lwm5zM5v8kFTC5ociGTC5tcxOSiJhczubjJJUwumcD9vtog3FepEvj+rM/vXwn3VRrhvkor3FfphPsqvXBfZRDuq4zCfZVJuK8yC/dVFuG+yircV9mE+yq7cF/lEO6rnMJ9lUu4r3IL91Ue4b7KK9xX+YT7Kr9wXxUQ7quCwn1VSLivCgv3VRHhvioq3FfFhPuquHBflRDuq5Ie2lcbHeyrUrh/aVAGlAXlQHlQAVQElUBlUAVUBdVAdVAD1AS1QG1QB9QF9UB90AA0BI1AY9AENAXNQHPQArQ0+6qU+f4ubXIZk8uaXM7k8iZXMLmiyZVMrmxyFZOrmlzN5Oom1zC5psm1TK5tch2T65pcz+T6JjcwuaHJjUxubHITk5ua3Mzk5ia3MLllAvf7aqNwX5VK4PuzPr9/JdxXZYT7qqxwX5UT7qvywn1VQbivKgr3VSXhvqos3FdVhPuqqnBfVRPuq+rCfVVDuK9qCvdVLeG+qi3cV3WE+6qucF/VE+6r+sJ91UC4rxoK91Uj4b5qLNxXTYT7qqlwXzUT7qvmwn3VQrivWnpoX21ysK9a4f6tQRvQFrQD7UEH0BF0Ap1BF9AVdAPdQQ/QE/QCvUEf0Bf0A/3BADAQDAKDwRAwFAwDw8EIMNLsq1bm+7u1yW1MbmtyO5Pbm9zB5I4mdzK5s8ldTO5qcjeTu5vcw+SeJvcyubfJfUzua3I/k/ubPMDkgSYPMnmwyUNMHmryMJOHmzzC5JEJ3O+rTcJ91SqB78/6/P6VcF+1Ee6rtsJ91U64r9oL91UH4b7qKNxXnYT7qrNwX3UR7quuwn3VTbivugv3VQ/hvuop3Fe9hPuqt3Bf9RHuq77CfdVPuK/6C/fVAOG+GijcV4OE+2qwcF8NEe6rocJ9NUy4r4YL99UI4b4a6aF9tdnBvhqF+48GY8BYMA6MBxPARDAJTAZTwFQwDUwHM8BMMAvMBnPAXDAPzAcLwEKwCCwGS8BSsAwsByvASrOvRpnv79EmjzF5rMnjTB5v8gSTJ5o8yeTJJk8xearJ00yebvIMk2eaPMvk2SbPMXmuyfNMnm/yApMXmrzI5MUmLzF5qcnLTF5u8gqTVyZwv682C/fVqAS+P+vz+1fCfTVGuK/GCvfVOOG+Gi/cVxOE+2qicF9NEu6rycJ9NUW4r6YK99U04b6aLtxXM4T7aqZwX80S7qvZwn01R7iv5gr31Tzhvpov3FcLhPtqoXBfLRLuq8XCfbVEuK+WCvfVMuG+Wi7cVyuE+2qlh/bVFgf7ahXuvxqsAWvBOrAebAAbwSawGWwBW8E2sB3sADvBLrAb7AF7wT6wHxwAB8EhcBgcAUfBMXAcnAAnzb5aZb6/V5u8xuS1Jq8zeb3JG0zeaPImkzebvMXkrSZvM3m7yTtM3mnyLpN3m7zH5L0m7zN5v8kHTD5o8iGTD5t8xOSjJh8z+bjJJ0w+mcD9vtoi3FerEvj+rM/vXwn31Rrhvlor3FfrhPtqvXBfbRDuq43CfbVJuK82C/fVFuG+2ircV9uE+2q7cF/tEO6rncJ9tUu4r3YL99Ue4b7aK9xX+4T7ar9wXx0Q7quDwn11SLivDgv31RHhvjoq3FfHhPvquHBfnRDuq5Me2ldbHeyrU7j/aXAGnAXnwHlwAVwEl8BlcAVcBdfAdXAD3AS3wG1wB9wF98B98AA8BI/AY/AEPAXPwHPwArw0++qU+f4+bfIZk8+afM7k8yZfMPmiyZdMvmzyFZOvmnzN5Osm3zD5psm3TL5t8h2T75p8z+T7Jj8w+aHJj0x+bPITk5+a/Mzk5ya/MPllAvf7aqtwX51K4PuzPr9/JdxXZ4T76qxwX50T7qvzwn11QbivLgr31SXhvros3FdXhPvqqnBfXRPuq+vCfXVDuK9uCvfVLeG+ui3cV3eE++qucF/dE+6r+8J99UC4rx4K99Uj4b56LNxXT4T76qlwXz0T7qvnwn31QrivXnpoX21zsK9e4f6vwRvwFrwD78GHj9snIe4A/IAfwI/gJ/Az+AX8Cn4Dv4M/gF/gD/gHAUBAEAgEBkFAUBAMBAchQMiE3/1tX70y39+vTX5j8luT35n83uQPJn+831/z9yb7MfkHk380+SeTfzb5F5N/Nfk3k383+Q+T/Zrsz2T/JgcwOaDJgUwObHIQk4OaHMzk4CaHMDlkQvf7aptwX70S7qvXwn31Rriv3gr31Tvhvnov3FcfhPvq4+8h33jW/75/9Y1n/eP7V9921j+/f/UtZ/3b+1dff9a/v3/1tWf91/tXX3fWf79/9TVnfen9K5+f9eX3r3x6lk/ev/LZWT57/8onZ/n0/asvn+Xz96++dNbXvH+VULevAiTU7auACXX7KlBC3b4KnFC3r4Ik1O2roAl1+ypYQt2+Cp5Qt69CJNTtq5AJvbOvtjvYV6Fw/9AgDAgLwoHwIAKICCKByCAKiAqigeggBogJYoHYIA6IC+KB+CBBwo//Gb/7LhFInPDjf+fffZcUJAPJQQqQ0uyrUOb7O7TJYUwOa3I4k8ObHMHkiCZHMjmyyVFMjmpyNJOjmxzD5JgmxzI5tslxTI5rcjyT45ucwOSEJicyObHJSUxOanIyk5ObnMLklAnd76vtwn0VKqHvz/r8/pXorI93DCM568++wvr+rP97/8q3Z/31/SvfnfX39698c5bZVxGF+yqScF9FFu6rKMJ9FVW4r6IJ91V04b6KIdxXMYX7KpZwX8UW7qs4wn0VV7iv4gn3VXzhvkog3FcJhfsqkXBfJRbuqyTCfZVUuK+SCfdVcuG+SiHcVyk9tK92ONhXqXD/1CANSAvSgfQgw8deQCaQGWQBWUE2kB3kADlBLpAb5AF5QT6QHxQABUEhUBgUAUVBMVAclAAlzb5KZb6/U5ucxuS0JqczOb3JGUzOaHImkzObnMXkrCZnMzm7yTlMzmlyLpNzm5zH5Lwm5zM5v8kFTC5ociGTC5tcxOSiJhczubjJJUwumdD9vtoh3FepEvr+rM/vXwn3VRrhvkor3FfphPsqvXBfZRDuq4zCfZVJuK8yC/dVFuG+yircV9mE+yq7cF/lEO6rnMJ9lUu4r3IL91Ue4b7KK9xX+YT7Kr9wXxUQ7quCwn1VSLivCgv3VRHhvioq3FfFhPuquHBflRDuq5Ie2lc7HeyrUrh/aVAGlAXlQHlQAVQElUBlUAVUBdVAdVAD1AS1QG1QB9QF9UB90AA0BI1AY9AENAXNQHPQArQ0+6qU+f4ubXIZk8uaXM7k8iZXMLmiyZVMrmxyFZOrmlzN5Oom1zC5psm1TK5tch2T65pcz+T6JjcwuaHJjUxubHITk5ua3Mzk5ia3MLllQvf7aqdwX5VK6PuzPr9/JdxXZYT7qqxwX5UT7qvywn1VQbivKgr3VSXhvqos3FdVhPuqqnBfVRPuq+rCfVVDuK9qCvdVLeG+qi3cV3WE+6qucF/VE+6r+sJ91UC4rxoK91Uj4b5qLNxXTYT7qqlwXzUT7qvmwn3VQrivWnpoX+1ysK9a4f6tQRvQFrQD7UEH0BF0Ap1BF9AVdAPdQQ/QE/QCvUEf0Bf0A/3BADAQDAKDwRAwFAwDw8EIMNLsq1bm+7u1yW1MbmtyO5Pbm9zB5I4mdzK5s8ldTO5qcjeTu5vcw+SeJvcyubfJfUzua3I/k/ubPMDkgSYPMnmwyUNMHmryMJOHmzzC5JEJ3e+rXcJ91Sqh78/6/P6VcF+1Ee6rtsJ91U64r9oL91UH4b7qKNxXnYT7qrNwX3UR7quuwn3VTbivugv3VQ/hvuop3Fe9hPuqt3Bf9RHuq77CfdVPuK/6C/fVAOG+GijcV4OE+2qwcF8NEe6rocJ9NUy4r4YL99UI4b4a6aF9tdvBvhqF+48GY8BYMA6MBxPARDAJTAZTwFQwDUwHM8BMMAvMBnPAXDAPzAcLwEKwCCwGS8BSsAwsByvASrOvRpnv79EmjzF5rMnjTB5v8gSTJ5o8yeTJJk8xearJ00yebvIMk2eaPMvk2SbPMXmuyfNMnm/yApMXmrzI5MUmLzF5qcnLTF5u8gqTVyZ0v692C/fVqIS+P+vz+1fCfTVGuK/GCvfVOOG+Gi/cVxOE+2qicF9NEu6rycJ9NUW4r6YK99U04b6aLtxXM4T7aqZwX80S7qvZwn01R7iv5gr31Tzhvpov3FcLhPtqoXBfLRLuq8XCfbVEuK+WCvfVMuG+Wi7cVyuE+2qlh/bVHgf7ahXuvxqsAWvBOrAebAAbwSawGWwBW8E2sB3sADvBLrAb7AF7wT6wHxwAB8EhcBgcAUfBMXAcnAAnzb5aZb6/V5u8xuS1Jq8zeb3JG0zeaPImkzebvMXkrSZvM3m7yTtM3mnyLpN3m7zH5L0m7zN5v8kHTD5o8iGTD5t8xOSjJh8z+bjJJ0w+mdD9vtoj3FerEvr+rM/vXwn31Rrhvlor3FfrhPtqvXBfbRDuq43CfbVJuK82C/fVFuG+2ircV9uE+2q7cF/tEO6rncJ9tUu4r3YL99Ue4b7aK9xX+4T7ar9wXx0Q7quDwn11SLivDgv31RHhvjoq3FfHhPvquHBfnRDuq5Me2ld7HeyrU7j/aXAGnAXnwHlwAVwEl8BlcAVcBdfAdXAD3AS3wG1wB9wF98B98AA8BI/AY/AEPAXPwHPwArw0++qU+f4+bfIZk8+afM7k8yZfMPmiyZdMvmzyFZOvmnzN5Osm3zD5psm3TL5t8h2T75p8z+T7Jj8w+aHJj0x+bPITk5+a/Mzk5ya/MPllQvf7aq9wX51K6PuzPr9/JdxXZ4T76qxwX50T7qvzwn11QbivLgr31SXhvros3FdXhPvqqnBfXRPuq+vCfXVDuK9uCvfVLeG+ui3cV3eE++qucF/dE+6r+8J99UC4rx4K99Uj4b56LNxXT4T76qlwXz0T7qvnwn31QrivXnpoX+1zsK9e4f6vwRvwFrwD78GHj9snEe4A/IAfwI/gJ/Az+AX8Cn4Dv4M/gF/gD/gHAUBAEAgEBkFAUBAMBAchQMhE3/1tX70y39+vTX5j8luT35n83uQPJn+831/z9yb7MfkHk380+SeTfzb5F5N/Nfk3k383+Q+T/Zrsz2T/JgcwOaDJgUwObHIQk4OaHMzk4CaHMDlkIvf7ap9wX70S7qvXwn31Rriv3gr31Tvhvnov3FcfhPvq4+8h33jW/75/9Y1n/eP7V9921j+/f/UtZ/3b+1dff9a/v3/1tWf91/tXX3fWf79/9TVnfen9K5+f9eX3r3x6lk/ev/LZWT57/8onZ/n0/asvn+Xz96++dNbXvH+VSLevAiTS7auAiXT7KlAi3b4KnEi3r4Ik0u2roIl0+ypYIt2+Cp5It69CJNLtq5CJvLOv9jvYV6Fw/9AgDAgLwoHwIAKICCKByCAKiAqigeggBogJYoHYIA6IC+KB+CABwNfHd4lAYpAEJAXJQHKQAqQ0+yqU+f4ObXIYk8OaHM7k8CZHMDmiyZFMjmxyFJOjmhzN5OgmxzA5psmxTI5tchyT45ocz+T4JicwOaHJiUxObHISk5OanMzk5CanMDllIvf7ar9wX4VK5PuzPr9/JTrr4x3DSM76s6+wvj/r/96/8u1Zf33/yndn/f39K9+cZfZVROG+iiTcV5GF+yqKcF9FFe6raMJ9FV24r2II91VM4b6KJdxXsYX7Ko5wX8UV7qt4wn0VX7ivEgj3VULhvkok3FeJhfsqiXBfJRXuq2TCfZVcuK9SCPdVSg/tqwMO9lUq3D81SAPSgnQgPcjwsReQCWQGWUBWkA1kBzlATpAL5AZ5QF6QD+QHBUBBUAgUBkVAUVAMFAclQEmzr1KZ7+/UJqcxOa3J6UxOb3IGkzOanMnkzCZnMTmrydlMzm5yDpNzmpzL5Nwm5zE5r8n5TM5vcgGTC5pcyOTCJhcxuajJxUwubnIJk0smcr+vDgj3VapEvj/r8/tXwn2VRriv0gr3VTrhvkov3FcZhPsqo3BfZRLuq8zCfZVFuK+yCvdVNuG+yi7cVzmE+yqncF/lEu6r3MJ9lUe4r/IK91U+4b7KL9xXBYT7qqBwXxUS7qvCwn1VRLivigr3VTHhviou3FclhPuqpIf21UEH+6oU7l8alAFlQTlQHlQAFUElUBlUAVVBNVAd1AA1QS1QG9QBdUE9UB80AA1BI9AYNAFNQTPQHLQALc2+KmW+v0ubXMbksiaXM7m8yRVMrmhyJZMrm1zF5KomVzO5usk1TK5pci2Ta5tcx+S6Jtczub7JDUxuaHIjkxub3MTkpiY3M7m5yS1MbpnI/b46KNxXpRL5/qzP718J91UZ4b4qK9xX5YT7qrxwX1UQ7quKwn1VSbivKgv3VRXhvqoq3FfVhPuqunBf1RDuq5rCfVVLuK9qC/dVHeG+qivcV/WE+6q+cF81EO6rhsJ91Ui4rxoL91UT4b5qKtxXzYT7qrlwX7UQ7quWHtpXhxzsq1a4f2vQBrQF7UB70AF0BJ1AZ9AFdAXdQHfQA/QEvUBv0Af0Bf1AfzAADASDwGAwBAwFw8BwMAKMNPuqlfn+bm1yG5PbmtzO5PYmdzC5o8mdTO5scheTu5rczeTuJvcwuafJvUzubXIfk/ua3M/k/iYPMHmgyYNMHmzyEJOHmjzM5OEmjzB5ZCL3++qQcF+1SuT7sz6/fyXcV22E+6qtcF+1E+6r9sJ91UG4rzoK91Un4b7qLNxXXYT7qqtwX3UT7qvuwn3VQ7ivegr3VS/hvuot3Fd9hPuqr3Bf9RPuq/7CfTVAuK8GCvfVIOG+GizcV0OE+2qocF8NE+6r4cJ9NUK4r0Z6aF8ddrCvRuH+o8EYMBaMA+PBBDARTAKTwRQwFUwD08EMMBPMArPBHDAXzAPzwQKwECwCi8ESsBQsA8vBCrDS7KtR5vt7tMljTB5r8jiTx5s8weSJJk8yebLJU0yeavI0k6ebPMPkmSbPMnm2yXNMnmvyPJPnm7zA5IUmLzJ5sclLTF5q8jKTl5u8wuSVidzvq8PCfTUqke/P+vz+lXBfjRHuq7HCfTVOuK/GC/fVBOG+mijcV5OE+2qycF9NEe6rqcJ9NU24r6YL99UM4b6aKdxXs4T7arZwX80R7qu5wn01T7iv5gv31QLhvloo3FeLhPtqsXBfLRHuq6XCfbVMuK+WC/fVCuG+WumhfXXEwb5ahfuvBmvAWrAOrAcbwEawCWwGW8BWsA1sBzvATrAL7AZ7wF6wD+wHB8BBcAgcBkfAUXAMHAcnwEmzr1aZ7+/VJq8xea3J60xeb/IGkzeavMnkzSZvMXmrydtM3m7yDpN3mrzL5N0m7zF5r8n7TN5v8gGTD5p8yOTDJh8x+ajJx0w+bvIJk08mcr+vjgj31apEvj/r8/tXwn21Rriv1gr31Trhvlov3FcbhPtqo3BfbRLuq83CfbVFuK+2CvfVNuG+2i7cVzuE+2qncF/tEu6r3cJ9tUe4r/YK99U+4b7aL9xXB4T76qBwXx0S7qvDwn11RLivjgr31THhvjou3FcnhPvqpIf21VEH++oU7n8anAFnwTlwHlwAF8ElcBlcAVfBNXAd3AA3wS1wG9wBd8E9cB88AA/BI/AYPAFPwTPwHLwAL82+OmW+v0+bfMbksyafM/m8yRdMvmjyJZMvm3zF5KsmXzP5usk3TL5p8i2Tb5t8x+S7Jt8z+b7JD0x+aPIjkx+b/MTkpyY/M/m5yS9MfpnI/b766z8zvt1XpxL5/qzP718J99UZ4b46K9xX54T76rxwX10Q7quLwn11SbivLgv31RXhvroq3FfXhPvqunBf3RDuq5vCfXVLuK9uC/fVHeG+uivcV/eE++q+cF89EO6rh8J99Ui4rx4L99UT4b56KtxXz4T76rlwX70Q7quXHtpXx/zo99Ur3P81eAPegnfgPfjwcfskxh2AH/AD+BH8BH4Gv4BfwW/gd/AH8Av8Af8gAAgIAoHAIAgICoKB4CAECJn4u7/tq1fm+/u1yW9MfmvyO5Pfm/zB5I/3+2v+3mQ/Jv9g8o8m/2Tyzyb/YvKvJv9m8u8m/2GyX5P9mezf5AAmBzQ5kMmBTQ5iclCTg5kc3OQQJodM7H5fHRPuq1fCffVauK/eCPfVW+G+eifcV++F++qDcF99/D3kG8/63/evvvGsf3z/6tvO+uf3r77lrH97/+rrz/r396++9qz/ev/q68767/evvuasL71/5fOzvvz+lU/P8sn7Vz47y2fvX/nkLJ++f/Xls3z+/tWXzvqa968S6/ZVgMS6fRUwsW5fBUqs21eBE+v2VZDEun0VNLFuXwVLrNtXwRPr9lWIxLp9FTKxd/bVcQf7KhTuHxqEAWFBOBAeRAARQSQQGUQBUUE0EB3EADFBLBAbxAFxQTwQHyQACUEikBgkAUlBMpAcpAApzb4KZb6/Q5scxuSwJoczObzJEUyOaHIkkyObHMXkqCZHMzm6yTFMjmlyLJNjmxzH5LgmxzM5vskJTE5ociKTE5ucxOSkJiczObnJKUxOmdj9vjou3FehEvv+rM/vX4nO+njHMJKz/uwrrO/P+r/3r3x71l/fv/LdWX9//8o3Z5l9FVG4ryIJ91Vk4b6KItxXUYX7KppwX0UX7qsYwn0VU7ivYgn3VWzhvooj3FdxhfsqnnBfxRfuqwTCfZVQuK8SCfdVYuG+SiLcV0mF+yqZcF8lF+6rFMJ9ldJD++qEg32VCvdPDdKAtCAdSA8yfOwFZAKZQRaQFWQD2UEOkBPkArlBHpAX5AP5QQFQEBQChUERUBQUA8VBCVDS7KtU5vs7tclpTE5rcjqT05ucweSMJmcyObPJWUzOanI2k7ObnMPknCbnMjm3yXlMzmtyPpPzm1zA5IImFzK5sMlFTC5qcjGTi5tcwuSSid3vqxPCfZUqse/P+vz+lXBfpRHuq7TCfZVOuK/SC/dVBuG+yijcV5mE+yqzcF9lEe6rrMJ9lU24r7IL91UO4b7KKdxXuYT7KrdwX+UR7qu8wn2VT7iv8gv3VQHhvioo3FeFhPuqsHBfFRHuq6LCfVVMuK+KC/dVCeG+KumhfXXSwb4qhfuXBmVAWVAOlAcVQEVQCVQGVUBVUA1UBzVATVAL1AZ1QF1QD9QHDUBD0Ag0Bk1AU9AMNActQEuzr0qZ7+/SJpcxuazJ5Uwub3IFkyuaXMnkyiZXMbmqydVMrm5yDZNrmlzL5Nom1zG5rsn1TK5vcgOTG5rcyOTGJjcxuanJzUxubnILk1smdr+vTgr3VanEvj/r8/tXwn1VRrivygr3VTnhviov3FcVhPuqonBfVRLuq8rCfVVFuK+qCvdVNeG+qi7cVzWE+6qmcF/VEu6r2sJ9VUe4r+oK91U94b6qL9xXDYT7qqFwXzUS7qvGwn3VRLivmgr3VTPhvmou3FcthPuqpYf21SkH+6oV7t8atAFtQTvQHnQAHUEn0Bl0AV1BN9Ad9AA9QS/QG/QBfUE/0B8MAAPBIDAYDAFDwTAwHIwAI82+amW+v1ub3Mbktia3M7m9yR1M7mhyJ5M7m9zF5K4mdzO5u8k9TO5pci+Te5vcx+S+Jvczub/JA0weaPIgkwebPMTkoSYPM3m4ySNMHpnY/b46JdxXrRL7/qzP718J91Ub4b5qK9xX7YT7qr1wX3UQ7quOwn3VSbivOgv3VRfhvuoq3FfdhPuqu3Bf9RDuq57CfdVLuK96C/dVH+G+6ivcV/2E+6q/cF8NEO6rgcJ9NUi4rwYL99UQ4b4aKtxXw4T7arhwX40Q7quRHtpXpx3sq1G4/2gwBowF48B4MAFMBJPAZDAFTAXTwHQwA8wEs8BsMAfMBfPAfLAALASLwGKwBCwFy8BysAKsNPtqlPn+Hm3yGJPHmjzO5PEmTzB5osmTTJ5s8hSTp5o8zeTpJs8weabJs0yebfIck+eaPM/k+SYvMHmhyYtMXmzyEpOXmrzM5OUmrzB5ZWL3++q0cF+NSuz7sz6/fyXcV2OE+2qscF+NE+6r8cJ9NUG4ryYK99Uk4b6aLNxXU4T7aqpwX00T7qvpwn01Q7ivZgr31Szhvpot3FdzhPtqrnBfzRPuq/nCfbVAuK8WCvfVIuG+WizcV0uE+2qpcF8tE+6r5cJ9tUK4r1Z6aF+dcbCvVuH+q8EasBasA+vBBrARbAKbwRawFWwD28EOsBPsArvBHrAX7AP7wQFwEBwCh8ERcBQcA8fBCXDS7KtV5vt7tclrTF5r8jqT15u8weSNJm8yebPJW0zeavI2k7ebvMPknSbvMnm3yXtM3mvyPpP3m3zA5IMmHzL5sMlHTD5q8jGTj5t8wuSTid3vqzPCfbUqse/P+vz+lXBfrRHuq7XCfbVOuK/WC/fVBuG+2ijcV5uE+2qzcF9tEe6rrcJ9tU24r7YL99UO4b7aKdxXu4T7ardwX+0R7qu9wn21T7iv9gv31QHhvjoo3FeHhPvqsHBfHRHuq6PCfXVMuK+OC/fVCeG+OumhfXXWwb46hfufBmfAWXAOnAcXwEVwCVwGV8BVcA1cBzfATXAL3AZ3wF1wD9wHD8BD8Ag8Bk/AU/AMPAcvwEuzr06Z7+/TJp8x+azJ50w+b/IFky+afMnkyyZfMfmqyddMvm7yDZNvmnzL5Nsm3zH5rsn3TL5v8gOTH5r8yOTHJj8x+anJz0x+bvILk18mdr+vzgr31anEvj/r8/tXwn11Rrivzgr31Tnhvjov3FcXhPvqonBfXRLuq8vCfXVFuK+uCvfVNeG+ui7cVzeE++qmcF/dEu6r28J9dUe4r+4K99U94b66L9xXD4T76qFwXz0S7qvHwn31RLivngr31TPhvnou3FcvhPvqpYf21TkH++oV7v8avAFvwTvwHnz4uH2S4A7AD/gB/Ah+Aj+DX8Cv4DfwO/gD+AX+gH8QAAQEgUBgEAQEBcFAcBAChEzy3d/21Svz/f3a5DcmvzX5ncnvTf5g8sf7/TV/b7Ifk38w+UeTfzL5Z5N/MflXk38z+XeT/zDZr8n+TPZvcgCTA5ocyOTAJgcxOajJwUwObnIIk0Mmcb+vzgn31Svhvnot3FdvhPvqrXBfvRPuq/fCffVBuK8+/h7yjWf97/tX33jWP75/9W1n/fP7V99y1r+9f/X1Z/37+1dfe9Z/vX/1dWf99/tXX3PWl96/8vlZX37/yqdn+eT9K5+d5bP3r3xylk/fv/ryWT5//+pLZ33N+1dJdPsqQBLdvgqYRLevAiXR7avASXT7KkgS3b4KmkS3r4Il0e2r4El0+ypEEt2+CpnEO/vqvIN9FQr3Dw3CgLAgHAgPIoCIIBKIDKKAqCAaiA5igJggFogN4oC4IB6IDxKAhCARSAySgKQgGUgOUoCUZl+FMt/foU0OY3JYk8OZHN7kCCZHNDmSyZFNjmJyVJOjmRzd5BgmxzQ5lsmxTY5jclyT45kc3+QEJic0OZHJiU1OYnJSk5OZnNzkFCanTOJ+X50X7qtQSXx/1uf3r0RnfbxjGMlZf/YV1vdn/d/7V74966/vX/nurL+/f+Wbs8y+iijcV5GE+yqycF9FEe6rqMJ9FU24r6IL91UM4b6KKdxXsYT7KrZwX8UR7qu4wn0VT7iv4gv3VQLhvkoo3FeJhPsqsXBfJRHuq6TCfZVMuK+SC/dVCuG+SumhfXXBwb5KhfunBmlAWpAOpAcZPvYCMoHMIAvICrKB7CAHyAlygdwgD8gL8oH8oAAoCAqBwqAIKAqKgeKgBChp9lUq8/2d2uQ0Jqc1OZ3J6U3OYHJGkzOZnNnkLCZnNTmbydlNzmFyTpNzmZzb5Dwm5zU5n8n5TS5gckGTC5lc2OQiJhc1uZjJxU0uYXLJJO731QXhvkqVxPdnfX7/Sriv0gj3VVrhvkon3Ffphfsqg3BfZRTuq0zCfZVZuK+yCPdVVuG+yibcV9mF+yqHcF/lFO6rXMJ9lVu4r/II91Ve4b7KJ9xX+YX7qoBwXxUU7qtCwn1VWLivigj3VVHhviom3FfFhfuqhHBflfTQvrroYF+Vwv1LgzKgLCgHyoMKoCKoBCqDKqAqqAaqgxqgJqgFaoM6oC6oB+qDBqAhaAQagyagKWgGmoMWoKXZV6XM93dpk8uYXNbkciaXN7mCyRVNrmRyZZOrmFzV5GomVze5hsk1Ta5lcm2T65hc1+R6Jtc3uYHJDU1uZHJjk5uY3NTkZiY3N7mFyS2TuN9XF4X7qlQS35/1+f0r4b4qI9xXZYX7qpxwX5UX7qsKwn1VUbivKgn3VWXhvqoi3FdVhfuqmnBfVRfuqxrCfVVTuK9qCfdVbeG+qiPcV3WF+6qecF/VF+6rBsJ91VC4rxoJ91Vj4b5qItxXTYX7qplwXzUX7qsWwn3V0kP76pKDfdUK928N2oC2oB1oDzqAjqAT6Ay6gK6gG+gOeoCeoBfoDfqAvqAf6A8GgIFgEBgMhoChYBgYDkaAkWZftTLf361NbmNyW5Pbmdze5A4mdzS5k8mdTe5icleTu5nc3eQeJvc0uZfJvU3uY3Jfk/uZ3N/kASYPNHmQyYNNHmLyUJOHmTzc5BEmj0zifl9dEu6rVkl8f9bn96+E+6qNcF+1Fe6rdsJ91V64rzoI91VH4b7qJNxXnYX7qotwX3UV7qtuwn3VXbivegj3VU/hvuol3Fe9hfuqj3Bf9RXuq37CfdVfuK8GCPfVQOG+GiTcV4OF+2qIcF8NFe6rYcJ9NVy4r0YI99VID+2ryw721SjcfzQYA8aCcWA8mAAmgklgMpgCpoJpYDqYAWaCWWA2mAPmgnlgPlgAFoJFYDFYApaCZWA5WAFWmn01ynx/jzZ5jMljTR5n8niTJ5g80eRJJk82eYrJU02eZvJ0k2eYPNPkWSbPNnmOyXNNnmfyfJMXmLzQ5EUmLzZ5iclLTV5m8nKTV5i8Mon7fXVZuK9GJfH9WZ/fvxLuqzHCfTVWuK/GCffVeOG+miDcVxOF+2qScF9NFu6rKcJ9NVW4r6YJ99V04b6aIdxXM4X7apZwX80W7qs5wn01V7iv5gn31Xzhvlog3FcLhftqkXBfLRbuqyXCfbVUuK+WCffVcuG+WiHcVys9tK+uONhXq3D/1WANWAvWgfVgA9gINoHNYAvYCraB7WAH2Al2gd1gD9gL9oH94AA4CA6Bw+AIOAqOgePgBDhp9tUq8/292uQ1Jq81eZ3J603eYPJGkzeZvNnkLSZvNXmbydtN3mHyTpN3mbzb5D0m7zV5n8n7TT5g8kGTD5l82OQjJh81+ZjJx00+YfLJJO731RXhvlqVxPdnfX7/Sriv1gj31Vrhvlon3Ffrhftqg3BfbRTuq03CfbVZuK+2CPfVVuG+2ibcV9uF+2qHcF/tFO6rXcJ9tVu4r/YI99Ve4b7aJ9xX+4X76oBwXx0U7qtDwn11WLivjgj31VHhvjom3FfHhfvqhHBfnfTQvrrqYF+dwv1PgzPgLDgHzoML4CK4BC6DK+AquAaugxvgJrgFboM74C64B+6DB+AheAQegyfgKXgGnoMX4KXZV6fM9/dpk8+YfNbkcyafN/mCyRdNvmTyZZOvmHzV5GsmXzf5hsk3Tb5l8m2T75h81+R7Jt83+YHJD01+ZPJjk5+Y/NTkZyY/N/mFyS+TuN9XV4X76lQS35/1+f0r4b46I9xXZ4X76pxwX50X7qsLwn11UbivLgn31WXhvroi3FdXhfvqmnBfXRfuqxvCfXVTuK9uCffVbeG+uiPcV3eF++qecF/dF+6rB8J99VC4rx4J99Vj4b56ItxXT4X76plwXz0X7qsXwn310kP76pqDffUK938N3oC34B14Dz583D5JcQfgB/wAfgQ/gZ/BL+BX8Bv4HfwB/AJ/wD8IAAKCQCAwCAKCgmAgOAgBQib97m/76pX5/n5t8huT35r8zuT3Jn8w+eP9/pq/N9mPyT+Y/KPJP5n8s8m/mPyryb+Z/LvJf5js12R/Jvs3OYDJAU0OZHJgk4OYHNTkYCYHNzmEySGTut9X14T76pVwX70W7qs3wn31Vriv3gn31Xvhvvog3Fcffw/5xrP+9/2rbzzrH9+/+raz/vn9q28569/ev/r6s/79/auvPeu/3r/6urP++/2rrznrS+9f+fysL79/5dOzfPL+lc/O8tn7Vz45y6fvX335LJ+/f/Wls77m/aukun0VIKluXwVMqttXgZLq9lXgpLp9FSSpbl8FTarbV8GS6vZV8KS6fRUiqW5fhUzqnX113cG+CoX7hwZhQFgQDoQHEUBEEAlEBlFAVBANRAcxQEwQC8QGcUBcEA/EBwlAQpAIJAZJQFKQDCQHKUBKs69Cme/v0CaHMTmsyeFMDm9yBJMjmhzJ5MgmRzE5qsnRTI5ucgyTY5ocy+TYJscxOa7J8UyOb3ICkxOanMjkxCYnMTmpyclMTm5yCpNTJnW/r64L91WopL4/6/P7V6KzPt4xjOSsP/sK6/uz/u/9K9+e9df3r3x31t/fv/LNWWZfRRTuq0jCfRVZuK+iCPdVVOG+iibcV9GF+yqGcF/FFO6rWMJ9FVu4r+II91Vc4b6KJ9xX8YX7KoFwXyUU7qtEwn2VWLivkgj3VVLhvkom3FfJhfsqhXBfpfTQvrrhYF+lwv1TgzQgLUgH0oMMH3sBmUBmkAVkBdlAdpAD5AS5QG6QB+QF+UB+UAAUBIVAYVAEFAXFQHFQApQ0+yqV+f5ObXIak9OanM7k9CZnMDmjyZlMzmxyFpOzmpzN5Owm5zA5p8m5TM5tch6T85qcz+T8JhcwuaDJhUwubHIRk4uaXMzk4iaXMLlkUvf76oZwX6VK6vuzPr9/JdxXaYT7Kq1wX6UT7qv0wn2VQbivMgr3VSbhvsos3FdZhPsqq3BfZRPuq+zCfZVDuK9yCvdVLuG+yi3cV3mE+yqvcF/lE+6r/MJ9VUC4rwoK91Uh4b4qLNxXRYT7qqhwXxUT7qviwn1VQrivSnpoX910sK9K4f6lQRlQFpQD5UEFUBFUApVBFVAVVAPVQQ1QE9QCtUEdUBfUA/VBA9AQNAKNQRPQFDQDzUEL0NLsq1Lm+7u0yWVMLmtyOZPLm1zB5IomVzK5sslVTK5qcjWTq5tcw+SaJtcyubbJdUyua3I9k+ub3MDkhiY3MrmxyU1MbmpyM5Obm9zC5JZJ3e+rm8J9VSqp78/6/P6VcF+VEe6rssJ9VU64r8oL91UF4b6qKNxXlYT7qrJwX1UR7quqwn1VTbivqgv3VQ3hvqop3Fe1hPuqtnBf1RHuq7rCfVVPuK/qC/dVA+G+aijcV42E+6qxcF81Ee6rpsJ91Uy4r5oL91UL4b5q6aF9dcvBvmqF+7cGbUBb0A60Bx1AR9AJdAZdQFfQDXQHPUBP0Av0Bn1AX9AP9AcDwEAwCAwGQ8BQMAwMByPASLOvWpnv79YmtzG5rcntTG5vcgeTO5rcyeTOJncxuavJ3UzubnIPk3ua3Mvk3ib3Mbmvyf1M7m/yAJMHmjzI5MEmDzF5qMnDTB5u8giTRyZ1v69uCfdVq6S+P+vz+1fCfdVGuK/aCvdVO+G+ai/cVx2E+6qjcF91Eu6rzsJ91UW4r7oK91U34b7qLtxXPYT7qqdwX/US7qvewn3VR7iv+gr3VT/hvuov3FcDhPtqoHBfDRLuq8HCfTVEuK+GCvfVMOG+Gi7cVyOE+2qkh/bVbQf7ahTuPxqMAWPBODAeTAATwSQwGUwBU8E0MB3MADPBLDAbzAFzwTwwHywAC8EisBgsAUvBMrAcrAArzb4aZb6/R5s8xuSxJo8zebzJE0yeaPIkkyebPMXkqSZPM3m6yTNMnmnyLJNnmzzH5LkmzzN5vskLTF5o8iKTF5u8xOSlJi8zebnJK0xemdT9vrot3Fejkvr+rM/vXwn31Rjhvhor3FfjhPtqvHBfTRDuq4nCfTVJuK8mC/fVFOG+mircV9OE+2q6cF/NEO6rmcJ9NUu4r2YL99Uc4b6aK9xX84T7ar5wXy0Q7quFwn21SLivFgv31RLhvloq3FfLhPtquXBfrRDuq5Ue2ld3HOyrVbj/arAGrAXrwHqwAWwEm8BmsAVsBdvAdrAD7AS7wG6wB+wF+8B+cAAcBIfAYXAEHAXHwHFwApw0+2qV+f5ebfIak9eavM7k9SZvMHmjyZtM3mzyFpO3mrzN5O0m7zB5p8m7TN5t8h6T95q8z+T9Jh8w+aDJh0w+bPIRk4+afMzk4yafMPlkUvf76o5wX61K6vuzPr9/JdxXa4T7aq1wX60T7qv1wn21QbivNgr31Sbhvtos3FdbhPtqq3BfbRPuq+3CfbVDuK92CvfVLuG+2i3cV3uE+2qvcF/tE+6r/cJ9dUC4rw4K99Uh4b46LNxXR4T76qhwXx0T7qvjwn11QrivTnpoX911sK9O4f6nwRlwFpwD58EFcBFcApfBFXAVXAPXwQ1wE9wCt8EdcBfcA/fBA/AQPAKPwRPwFDwDz8EL8NLsq1Pm+/u0yWdMPmvyOZPPm3zB5IsmXzL5sslXTL5q8jWTr5t8w+SbJt8y+bbJd0y+a/I9k++b/MDkhyY/MvmxyU9MfmryM5Ofm/zC5JdJ3e+ru8J9dSqp78/6/P6VcF+dEe6rs8J9dU64r84L99UF4b66KNxXl4T76rJwX10R7qurwn11Tbivrgv31Q3hvrop3Fe3hPvqtnBf3RHuq7vCfXVPuK/uC/fVA+G+eijcV4+E++qxcF89Ee6rp8J99Uy4r54L99UL4b566aF9dc/BvnqF+78Gb8Bb8A68Bx8+bp9kuAPwA34AP4KfwM/gF/Ar+A38Dv4AfoE/4B8EAAFBIBAYBAFBQTAQHIQAIZN997d99cp8f782+Y3Jb01+Z/J7kz+Y/PF+f83fm+zH5B9M/tHkn0z+2eRfTP7V5N9M/t3kP0z2a7I/k/2bHMDkgCYHMjmwyUFMDmpyMJODmxzC5JDJ3O+re8J99Uq4r14L99Ub4b56K9xX74T76r1wX30Q7quPv4d841n/+/7VN571j+9ffdtZ//z+1bec9W/vX339Wf/+/tXXnvVf71993Vn//f7V15z1pfevfH7Wl9+/8ulZPnn/ymdn+ez9K5+c5dP3r758ls/fv/rSWV/z/lUy3b4KkEy3rwIm0+2rQMl0+ypwMt2+CpJMt6+CJtPtq2DJdPsqeDLdvgqRTLevQibzzr6672BfhcL9Q4MwICwIB8KDCCAiiAQigyggKogGooMYICaIBWKDOCAuiAfigwQgIUgEEoMkIClIBpKDFCCl2VehzPd3aJPDmBzW5HAmhzc5gskRTY5kcmSTo5gc1eRoJkc3OYbJMU2OZXJsk+OYHNfkeCbHNzmByQlNTmRyYpOTmJzU5GQmJzc5hckpk7nfV/eF+ypUMt+f9fn9K9FZH+8YRnLWn32F9f1Z//f+lW/P+uv7V7476+/vX/nmLLOvIgr3VSThvoos3FdRhPsqqnBfRRPuq+jCfRVDuK9iCvdVLOG+ii3cV3GE+yqucF/FE+6r+MJ9lUC4rxIK91Ui4b5KLNxXSYT7KqlwXyUT7qvkwn2VQrivUnpoXz1wsK9S4f6pQRqQFqQD6UGGj72ATCAzyAKygmwgO8gBcoJcIDfIA/KCfCA/KAAKgkKgMCgCioJioDgoAUqafZXKfH+nNjmNyWlNTmdyepMzmJzR5EwmZzY5i8lZTc5mcnaTc5ic0+RcJuc2OY/JeU3OZ3J+kwuYXNDkQiYXNrmIyUVNLmZycZNLmFwymft99UC4r1Il8/1Zn9+/Eu6rNMJ9lVa4r9IJ91V64b7KINxXGYX7KpNwX2UW7qsswn2VVbivsgn3VXbhvsoh3Fc5hfsql3Bf5RbuqzzCfZVXuK/yCfdVfuG+KiDcVwWF+6qQcF8VFu6rIsJ9VVS4r4oJ91Vx4b4qIdxXJT20rx462FelcP/SoAwoC8qB8qACqAgqgcqgCqgKqoHqoAaoCWqB2qAOqAvqgfqgAWgIGoHGoAloCpqB5qAFaGn2VSnz/V3a5DImlzW5nMnlTa5gckWTK5lc2eQqJlc1uZrJ1U2uYXJNk2uZXNvkOibXNbmeyfVNbmByQ5MbmdzY5CYmNzW5mcnNTW5hcstk7vfVQ+G+KpXM92d9fv9KuK/KCPdVWeG+KifcV+WF+6qCcF9VFO6rSsJ9VVm4r6oI91VV4b6qJtxX1YX7qoZwX9UU7qtawn1VW7iv6gj3VV3hvqon3Ff1hfuqgXBfNRTuq0bCfdVYuK+aCPdVU+G+aibcV82F+6qFcF+19NC+euRgX7XC/VuDNqAtaAfagw6gI+gEOoMuoCvoBrqDHqAn6AV6gz6gL+gH+oMBYCAYBAaDIWAoGAaGgxFgpNlXrcz3d2uT25jc1uR2Jrc3uYPJHU3uZHJnk7uY3NXkbiZ3N7mHyT1N7mVyb5P7mNzX5H4m9zd5gMkDTR5k8mCTh5g81ORhJg83eYTJI5O531ePhPuqVTLfn/X5/Svhvmoj3FdthfuqnXBftRfuqw7CfdVRuK86CfdVZ+G+6iLcV12F+6qbcF91F+6rHsJ91VO4r3oJ91Vv4b7qI9xXfYX7qp9wX/UX7qsBwn01ULivBgn31WDhvhoi3FdDhftqmHBfDRfuqxHCfTXSQ/vqsYN9NQr3Hw3GgLFgHBgPJoCJYBKYDKaAqWAamA5mgJlgFpgN5oC5YB6YDxaAhWARWAyWgKVgGVgOVoCVZl+NMt/fo00eY/JYk8eZPN7kCSZPNHmSyZNNnmLyVJOnmTzd5BkmzzR5lsmzTZ5j8lyT55k83+QFJi80eZHJi01eYvJSk5eZvNzkFSavTOZ+Xz0W7qtRyXx/1uf3r4T7aoxwX40V7qtxwn01XrivJgj31UThvpok3FeThftqinBfTRXuq2nCfTVduK9mCPfVTOG+miXcV7OF+2qOcF/NFe6recJ9NV+4rxYI99VC4b5aJNxXi4X7aolwXy0V7qtlwn21XLivVgj31UoP7asnDvbVKtx/NVgD1oJ1YD3YADaCTWAz2AK2gm1gO9gBdoJdYDfYA/aCfWA/OAAOgkPgMDgCjoJj4Dg4AU6afbXKfH+vNnmNyWtNXmfyepM3mLzR5E0mbzZ5i8lbTd5m8naTd5i80+RdJu82eY/Je03eZ/J+kw+YfNDkQyYfNvmIyUdNPmbycZNPmHwymft99US4r1Yl8/1Zn9+/Eu6rNcJ9tVa4r9YJ99V64b7aINxXG4X7apNwX20W7qstwn21Vbivtgn31Xbhvtoh3Fc7hftql3Bf7Rbuqz3CfbVXuK/2CffVfuG+OiDcVweF++qQcF8dFu6rI8J9dVS4r44J99Vx4b46IdxXJz20r5462FencP/T4Aw4C86B8+ACuAgugcvgCrgKroHr4Aa4CW6B2+AOuAvugfvgAXgIHoHH4Al4Cp6B5+AFeGn21Snz/X3a5DMmnzX5nMnnTb5g8kWTL5l82eQrJl81+ZrJ102+YfJNk2+ZfNvkOybfNfmeyfdNfmDyQ5MfmfzY5CcmPzX5mcnPTX5h8stk7vfVU+G+OpXM92d9fv9KuK/OCPfVWeG+OifcV+eF++qCcF9dFO6rS8J9dVm4r64I99VV4b66JtxX14X76oZwX90U7qtbwn11W7iv7gj31V3hvron3Ff3hfvqgXBfPRTuq0fCffVYuK+eCPfVU+G+eibcV8+F++qFcF+99NC+euZgX73C/V+DN+AteAfegw8ft09y3AH4AT+AH8FP4GfwC/gV/AZ+B38Av8Af8A8CgIAgEAgMgoCgIBgIDkKAkMm/+9u+emW+v1+b/Mbktya/M/m9yR9M/ni/v+bvTfZj8g8m/2jyTyb/bPIvJv9q8m8m/27yHyb7Ndmfyf5NDmByQJMDmRzY5CAmBzU5mMnBTQ5hcsjk7vfVM+G+eiXcV6+F++qNcF+9Fe6rd8J99V64rz4I99XH30O+8az/ff/qG8/6x/evvu2sf37/6lvO+rf3r77+rH9//+prz/qv96++7qz/fv/qa8760vtXPj/ry+9f+fQsn7x/5bOzfPb+lU/O8un7V18+y+fvX33prK95/yq5bl8FSK7bVwGT6/ZVoOS6fRU4uW5fBUmu21dBk+v2VbDkun0VPLluX4VIrttXIZPrNst3f/nLbivfftuFUv3nrJIy4cf/bP5AR79/nrcy1p/fuSvo5fQyeim9hF5ML6IX0gvo+fQ8ei49h55Nz6Jn0jPo6fQ0eio9hZ5MT6In0hPo8fQ4eiw9hh5Nj6JP0ifo4/Qx+ih9hD5MH6IP0gfo/fQ+ei+9h95N76J30jvo7fQ2eiu9hd5Mb6I30hvo9fQ6ei29hl5Nr6Jf0i/o5/Qz+in9hH5MP6If0g/o+/Q9+i59h75N36Jv0jfo6/Q1+ip9hb5MX6Iv0hfo8/Q5+ix9hj5Nn6JDxv7TIejgdDA6KB2EDkwHogPSAWj/tD/aL/0H/Tv9G/0r/Qv9M/0T/SP9A+2H/p7+jv7A+7yn39Fv6Tf0a/oVnZJ/fwo6OZ2MTkonoRPTieiEdAI6Ph2PjkvHoWPTseiYdAw6Oh2NjkpHoSPTkeiIdAQ6PB2ODkuHoUPToeiSdAm6OF2MLkoXoQvTheiCdAE6P52PzkvnoXPTueicdA46O52NzkpnoTPTmeiMdAY6PZ2OTkunoVPTqeiWdAu6Od2Mbko3oRvTjeiGdAO6Pl2PrkvXoWvTteiadA26Ol2NrkpXoSvTleiKdAW6PF2OLkuXoUvTpeiR9Ah6OD2MHkoPoQfTg+iB9AC6P92P7kv3oXvTveiedA+6O92N7kp3oTvTneiOdAe6Pd2Obku3oVvTreiV9Ap6Ob2MXkovoRfTi+iF9AJ6Pj2PnkvPoWfTs+iZ9Ax6Oj2NnkpPoSfTk+iJ9AR6PD2OHkuPoUfTo+iT9An6OH2MPkofoQ/Th+iD9AF6P72P3kvvoXfTu+id9A56O72N3kpvoTfTm+iN9AZ6Pb2OXkuvoVfTq+iX9Av6Of2Mfko/oR/Tj+iH9AP6Pn2PvkvfoW/Tt+ib9A36On2NvkpfoS/Tl+iL9AX6PH2OPkufoU/Tp+iQcf50CDo4HYwOSgehA9OB6IB0ANo/7Y/2S/9B/07/Rv9K/0L/TP9E/0j/QPuhv6e/oz/wPu/pd/Rb+g39mn5Fp+Tfn4JOTiejk9JJ6MR0IjohnYCOT8ej49Jx6Nh0LDomHYOOTkejo9JR6Mh0JDoiHYEOT4ejw9Jh6NB0KLokXYIuTheji9JF6MJ0IbogXYDOT+ej89J56Nx0LjonnYPOTmejs9JZ6Mx0JjojnYFOT6ej09Jp6NR0Krol3YJuTjejm9JN6MZ0I7oh3YCuT9ej69J16Np0LbomXYOuTlejq9JV6Mp0JboiXYEuT5ejy9Jl6NJ0KXokPYIeTg+jh9JD6MH0IHogPYDuT/ej+9J96N50L7on3YPuTneju9Jd6M50J7oj3YFuT7ej29Jt6NZ0K3olvYJeTi+jl9JL6MX0InohvYCeT8+j59Jz6Nn0LHomPYOeTk+jp9JT6Mn0JHoiPYEeT4+jx9Jj6NH0KPokfYI+Th+jj9JH6MP0IfogfYDeT++j99J76N30LnonvYPeTm+jt9Jb6M30JnojvYFeT6+j19Jr6NX0Kvol/YJ+Tj+jn9JP6Mf0I/oh/YC+T9+j79J36Nv0LfomfYO+Tl+jr9JX6Mv0JfoifYE+T5+jz9Jn6NP0KTpk3D8dgg5OB6OD0kHowHQgOiAdgPZP+6P90n/Qv9O/0b/Sv9A/0z/RP9I/0H7o7+nv6A+8z3v6Hf2WfkO/pl/RKfn3p6CT08nopHQSOjGdiE5IJ6Dj0/HouHQcOjYdi45Jx6Cj09HoqHQUOjIdiY5IR6DD0+HosHQYOjQdii5Jl6CL08XoonQRujBdiC5IF6Dz0/novHQeOjedi85J56Cz09norHQWOjOdic5IZ6DT0+notHQaOjWdim5Jt6Cb083opnQTujHdiG5IN6Dr0/XounQdujZdi65J16Cr09XoqnQVujJdia5IV6DL0+XosnQZujRdih5Jj6CH08PoofQQejA9iB5ID6D70/3ovnQfujfdi+5J96C7093ornQXujPdie5Id6Db0+3otnQbujXdil5Jr6CX08vopfQSejG9iF5IL6Dn0/PoufQcejY9i55Jz6Cn09PoqfQUejI9iZ5IT6DH0+PosfQYejQ9ij5Jn6CP08foo/QR+jB9iD5IH6D30/vovfQeeje9i95J76C309vorfQWejO9id5Ib6DX0+votfQaejW9in5Jv6Cf08/op/QT+jH9iH5IP6Dv0/fou/Qd+jZ9i75J36Cv09foq/QV+jJ9ib5IX6DP0+fos/QZ+jR9ig4Z70+HoIPTweigdBA6MB2IDkgHoP3T/mi/9B/07/Rv9K/0L/TP9E/0j/QPtB/6e/o7+gPv855+R7+l39Cv6Vd0Sv79KejkdDI6KZ2ETkwnohPSCej4dDw6Lh2Hjk3HomPSMejodDQ6Kh2FjkxHoiPSEejwdDg6LB2GDk2HokvSJejidDG6KF2ELkwXogvSBej8dD46L52Hzk3nonPSOejsdDY6K52FzkxnojPSGej0dDo6LZ2GTk2nolvSLejmdDO6Kd2Ebkw3ohvSDej6dD26Ll2Hrk3XomvSNejqdDW6Kl2FrkxXoivSFejydDm6LF2GLk2XokfSI+jh9DB6KD2EHkwPogfSA+j+dD+6L92H7k33onvSPejudDe6K92F7kx3ojvSHej2dDu6Ld2Gbk23olfSK+jl9DJ6Kb2EXkwvohfSC+j59Dx6Lj2Hnk3PomfSM+jp9DR6Kj2FnkxPoifSE+jx9Dh6LD2GHk2Pok/SJ+jj9DH6KH2EPkwfog/SB+j99D56L72H3k3vonfSO+jt9DZ6K72F3kxvojfSG+j19Dp6Lb2GXk2vol/SL+jn9DP6Kf2Efkw/oh/SD+j79D36Ln2Hvk3fom/SN+jr9DX6Kn2Fvkxfoi/SF+jz9Dn6LH2GPk2fokPG/9Mh6OB0MDooHYQOTAeiA9IBaP+0P9ov/Qf9O/0b/Sv9C/0z/RP9I/0D7Yf+nv6O/sD7vKff0W/pN/Rr+hWdkn9/Cjo5nYxOSiehE9OJ6IR0Ajo+HY+OS8ehY9Ox6Jh0DDo6HY2OSkehI9OR6Ih0BDo8HY4OS4ehQ9Oh6JJ0Cbo4XYwuShehC9OF6IJ0ATo/nY/OS+ehc9O56Jx0Djo7nY3OSmehM9OZ6Ix0Bjo9nY5OS6ehU9Op6JZ0C7o53YxuSjehG9ON6IZ0A7o+XY+uS9eha9O16Jp0Dbo6XY2uSlehK9OV6Ip0Bbo8XY4uS5ehS9Ol6JH0CHo4PYweSg+hB9OD6IH0ALo/3Y/uS/ehe9O96J50D7o73Y3uSnehO9Od6I50B7o93Y5uS7ehW9Ot6JX0Cno5vYxeSi+hF9OL6IX0Ano+PY+eS8+hZ9Oz6Jn0DHo6PY2eSk+hJ9OT6In0BHo8PY4eS4+hR9Oj6JP0Cfo4fYw+Sh+hD9OH6IP0AXo/vY/eS++hd9O76J30Dno7vY3eSm+hN9Ob6I30Bno9vY5eS6+hV9Or6Jf0C/o5/Yx+Sj+hH9OP6If0A/o+fY++S9+hb9O36Jv0Dfo6fY2+Sl+hL9OX6Iv0Bfo8fY4+S5+hT9On6JAJ/nQIOjgdjA5KB6ED04HogHQA2j/tj/ZL/0H/Tv9G/0r/Qv9M/0T/SP9A+6G/p7+jP/A+7+l39Fv6Df2afkWn5N+fgk5OJ6OT0knoxHQiOiGdgI5Px6Pj0nHo2HQsOiYdg45OR6Oj0lHoyHQkOiIdgQ5Ph6PD0mHo0HQouiRdgi5OF6OL0kXownQhuiBdgM5P56Pz0nno3HQuOiedg85OZ6Oz0lnozHQmOiOdgU5Pp6PT0mno1HQquiXdgm5ON6Ob0k3oxnQjuiHdgK5P16Pr0nXo2nQtuiZdg65OV6Or0lXoynQluiJdgS5Pl6PL0mXo0nQpeiQ9gh5OD6OH0kPowfQgeiA9gO5P96P70n3o3nQvuifdg+5Od6O70l3oznQnuiPdgW5Pt6Pb0m3o1nQreiW9gl5OL6OX0kvoxfQieiG9gJ5Pz6Pn0nPo2fQseiY9g55OT6On0lPoyfQkeiI9gR5Pj6PH0mPo0fQo+iR9gj5OH6OP0kfow/Qh+iB9gN5P76P30nvo3fQueie9g95Ob6O30lvozfQmeiO9gV5Pr6PX0mvo1fQq+iX9gn5OP6Of0k/ox/Qj+iH9gL5P36Pv0nfo2/Qt+iZ9g75OX6Ov0lfoy/Ql+iJ9gT5Pn6PP0mfo0/QpOmTCPx2CDk4Ho4PSQejAdCA6IB2A9k/7o/3Sf9C/07/Rv9K/0D/TP9E/0j/Qfujv6e/oD7zPe/od/ZZ+Q7+mX9Ep+fenoJPTyeikdBI6MZ2ITkgnoOPT8ei4dBw6Nh2LjknHoKPT0eiodBQ6Mh2JjkhHoMPT4eiwdBg6NB2KLkmXoIvTxeiidBG6MF2ILkgXoPPT+ei8dB46N52LzknnoLPT2eisdBY6M52JzkhnoNPT6ei0dBo6NZ2Kbkm3oJvTzeimdBO6Md2Ibkg3oOvT9ei6dB26Nl2LrknXoKvT1eiqdBW6Ml2JrkhXoMvT5eiydBm6NF2KHkmPoIfTw+ih9BB6MD2IHkgPoPvT/ei+dB+6N92L7kn3oLvT3eiudBe6M92J7kh3oNvT7ei2dBu6Nd2KXkmvoJfTy+il9BJ6Mb2IXkgvoOfT8+i59Bx6Nj2LnknPoKfT0+ip9BR6Mj2JnkhPoMfT4+ix9Bh6ND2KPkmfoI/Tx+ij9BH6MH2IPkgfoPfT++i99B56N72L3knvoLfT2+it9BZ6M72J3khvoNfT6+i19Bp6Nb2Kfkm/oJ/Tz+in9BP6Mf2Ifkg/oO/T9+i79B36Nn2LvknfoK/T1+ir9BX6Mn2JvkhfoM/T5+iz9Bn6NH2KDpnoT4egg9PB6KB0EDowHYgOSAeg/dP+aL/0H/Tv9G/0r/Qv9M/0T/SP9A+0H/p7+jv6A+/znn5Hv6Xf0K/pV3RK/v0p6OR0MjopnYROTCeiE9IJ6Ph0PDouHYeOTceiY9Ix6Oh0NDoqHYWOTEeiI9IR6PB0ODosHYYOTYeiS9Il6OJ0MbooXYQuTBeiC9IF6Px0PjovnYfOTeeic9I56Ox0NjornYXOTGeiM9IZ6PR0OjotnYZOTaeiW9It6OZ0M7op3YRuTDeiG9IN6Pp0PbouXYeuTdeia9I16Op0NboqXYWuTFeiK9IV6PJ0ObosXYYuTZeiR9Ij6OH0MHooPYQeTA+iB9ID6P50P7ov3YfuTfeie9I96O50N7or3YXuTHeiO9Id6PZ0O7ot3YZuTbeiV9Ir6OX0MnopvYReTC+iF9IL6Pn0PHouPYeeTc+iZ9Iz6On0NHoqPYWeTE+iJ9IT6PH0OHosPYYeTY+iT9In6OP0MfoofYQ+TB+iD9IH6P30PnovvYfeTe+id9I76O30NnorvYXeTG+iN9Ib6PX0OnotvYZeTa+iX9Iv6Of0M/op/YR+TD+iH9IP6Pv0PfoufYe+Td+ib9I36Ov0NfoqfYW+TF+iL9IX6PP0OfosfYY+TZ+iQyb+0yHo4HQwOigdhA5MB6ID0gFo/7Q/2i/9B/07/Rv9K/0L/TP9E/0j/QPth/6e/o7+wPu8p9/Rb+k39Gv6FZ2Sf38KOjmdjE5KJ6ET04nohHQCOj4dj45Lx6Fj07HomHQMOjodjY5KR6Ej05HoiHQEOjwdjg5Lh6FD06HoknQJujhdjC5KF6EL04XognQBOj+dj85L56Fz07nonHQOOjudjc5KZ6Ez05nojHQGOj2djk5Lp6FT06nolnQLujndjG5KN6Eb043ohnQDuj5dj65L16Fr07XomnQNujpdja5KV6Er05XoinQFujxdji5Ll6FL06XokfQIejg9jB5KD6EH04PogfQAuj/dj+5L96F7073onnQPujvdje5Kd6E7053ojnQHuj3djm5Lt6Fb063olfQKejm9jF5KL6EX04vohfQCej49j55Lz6Fn07PomfQMejo9jZ5KT6En05PoifQEejw9jh5Lj6FH06Pok/QJ+jh9jD5KH6EP04fog/QBej+9j95L76F307vonfQOeju9jd5Kb6E305vojfQGej29jl5Lr6FX06vol/QL+jn9jH5KP6Ef04/oh/QD+j59j75L36Fv07fom/QN+jp9jb5KX6Ev05foi/QF+jx9jj5Ln6FP06fokEn+dAg6OB2MDkoHoQPTgeiAdADaP+2P9kv/Qf9O/0b/Sv9C/0z/RP9I/0D7ob+nv6M/8D7v6Xf0W/oN/Zp+Rafk35+CTk4no5PSSejEdCI6IZ2Ajk/Ho+PScejYdCw6Jh2Djk5Ho6PSUejIdCQ6Ih2BDk+Ho8PSYejQdCi6JF2CLk4Xo4vSRejCdCG6IF2Azk/no/PSeejcdC46J52Dzk5no7PSWejMdCY6I52BTk+no9PSaejUdCq6Jd2Cbk43o5vSTejGdCO6Id2Ark/Xo+vSdejadC26Jl2Drk5Xo6vSVejKdCW6Il2BLk+Xo8vSZejSdCl6JD2CHk4Po4fSQ+jB9CB6ID2A7k/3o/vSfejedC+6J92D7k53o7vSXejOdCe6I92Bbk+3o9vSbejWdCt6Jb2CXk4vo5fSS+jF9CJ6Ib2Ank/Po+fSc+jZ9Cx6Jj2Dnk5Po6fSU+jJ9CR6Ij2BHk+Po8fSY+jR9Cj6JH2CPk4fo4/SR+jD9CH6IH2A3k/vo/fSe+jd9C56J72D3k5vo7fSW+jN9CZ6I72BXk+vo9fSa+jV9Cr6Jf2Cfk4/o5/ST+jH9CP6If2Avk/fo+/Sd+jb9C36Jn2Dvk5fo6/SV+jL9CX6In2BPk+fo8/SZ+jT9Ck6ZNI/HYIOTgejg9JB6MB0IDogHYD2T/uj/dJ/0L/Tv9G/0r/QP9M/0T/SP9B+6O/p7+gPvM97+h39ln5Dv6Zf0Sn596egk9PJ6KR0EjoxnYhOSCeg49Px6Lh0HDo2HYuOScego9PR6Kh0FDoyHYmOSEegw9Ph6LB0GDo0HYouSZegi9PF6KJ0EbowXYguSBeg89P56Lx0Hjo3nYvOSeegs9PZ6Kx0FjoznYnOSGeg09Pp6LR0Gjo1nYpuSbegm9PN6KZ0E7ox3YhuSDeg69P16Lp0Hbo2XYuuSdegq9PV6Kp0FboyXYmuSFegy9Pl6LJ0Gbo0XYoeSY+gh9PD6KH0EHowPYgeSA+g+9P96L50H7o33YvuSfegu9Pd6K50F7oz3YnuSHeg29Pt6LZ0G7o13YpeSa+gl9PL6KX0EnoxvYheSC+g59Pz6Ln0HHo2PYueSc+gp9PT6Kn0FHoyPYmeSE+gx9Pj6LH0GHo0PYo+SZ+gj9PH6KP0EfowfYg+SB+g99P76L30Hno3vYveSe+gt9Pb6K30FnozvYneSG+g19Pr6LX0Gno1vYp+Sb+gn9PP6Kf0E/ox/Yh+SD+g79P36Lv0Hfo2fYu+Sd+gr9PX6Kv0FfoyfYm+SF+gz9Pn6LP0Gfo0fYoOyXd3QtDB6WB0UDoIHZgORAekA9D+aX+0X/oP+nf6N/pX+hf6Z/on+kf6B9rPp3eC6O/oD7zPe/od/ZZ+Q7+mX9Ep+fenoJPTyeikdBI6MZ2ITkgnoOPT8ei4dBw6Nh2LjknHoKPT0eiodBQ6Mh2JjkhHoMPT4eiwdBg6NB2KLkmXoIvTxeiidBG6MF2ILkgXoPPT+ei8dB46N52LzknnoLPT2eisdBY6M52JzkhnoNPT6ei0dBo6NZ2Kbkm3oJvTzeimdBO6Md2Ibkg3oOvT9ei6dB26Nl2LrknXoKvT1eiqdBW6Ml2JrkhXoMvT5eiydBm6NF2KHkmPoIfTw+ih9BB6MD2IHkgPoPvT/ei+dB+6N92L7kn3oLvT3eiudBe6M92J7kh3oNvT7ei2dBu6Nd2KXkmvoJfTy+il9BJ6Mb2IXkgvoOfT8+i59Bx6Nj2LnknPoKfT0+ip9BR6Mj2JnkhPoMfT4+ix9Bh6ND2KPkmfoI/Tx+ij9BH6MH2IPkgfoPfT++i99B56N72L3knvoLfT2+it9BZ6M72J3khvoNfT6+i19Bp6Nb2K/vSO9Kf3pT+9O/3pPepP71R/er/607vWn967/vQO9qf3sT+9m/3pPe1P72x/en/707vcn97r/vSO96f3vT+9+/3pPfBP74R/ej/807vin94b//QO+af3yT+9W/7pPfNP75x/ev/807von95L//TO26f33z69C/fpvbhP78h9el/u07tzn96j+/RO3af36z69a/fpvbtP7+B9eh/v07t5n97T+/TO3qf39z69y/fpvb5P7/h9et/v87t/n96noz+9H/jpXcFP7w1+eofw0/uEn94t/PSe4ce3RSLCoeEwICwIB8KDCB//70AkEBlEAVFBNBAdxAAxQSwQG8QBcUE8EB8kAAlBIpAYJAFJQTKQHKQAKUGqj28t/uWvQHRGOqHv/krkR3jWD8KzfhSe9ZPwrJ+FZ/0iPOtX4Vm/Cc/6XXjWH8Kz/ArP8ic8y7/wrADCswIKzwr0ne79p9Tid6r88CzVXS9Hxb/Xo+rOu4GzTkfXv6OVxgM93hX3eMZBj2k90OM9cY9nHfSYzgM93hf3eM5Bj+k90OMDcY/nHfSYwQM9PhT3eMFBjxk90OMjcY8XHfSYyQM9Phb3eMlBj5k90OMTcY+XHfSYxQM9PhX3eMVBj1k90OMzcY9XHfSYzQM9Phf3eM1Bj9k90OMLcY/XHfSYwwM9vhT3eMNBjzk90OMrcY83HfSYywv/u1l0bY+3HPSY2wM9poyh7fHjeeoe83igx1TiHlM56DGvB3pMLe4xtYMe83mgxzTiHtM46DG/B3pMK+4xrYMeC3igx3TiHtM56LGgB3pML+4xvYMeC3mgxwziHjM46LGwB3rMKO4xo4Mei3igx0ziHjM56LGoB3rMLO4xs4Mei3mgxyziHrM46LG4B3rMKu4xq4MeS3igx2ziHrM56LGkB3rMLu4xu4MeS3mgxxTCHq9+/N/Do+p7LC3u8dNfkWyfiRL66q/Qf//P6avTwtg7++K0sP/b3zefFu6f/rv4xtPC//N/r990WoR/+zXyDadF/Pdfb199WqT/+rX7ladF/u9/Dr7qtChf+mfqK06L+uV/Pn18WjSf/LPuw9Oi++z3DR+dFsOnvwf54LSYPv/97Iunxfqa3xu/cFrsr/t99j9Pi/O1v2f/x2lxv/73/389Ld63/LvkX06L/23/XvrH0xJ867/j/um0b//35f+clsg3/+41pyX23b/H/3ZaEt9+E/zltKS+/774fFoyxbcKT0uu+e75/09LofqGwmkpdd9jiVIl130nlhF+J378hv3482bJvvu/v96DkbH+9PfMH38256PT0GnpdHR6OgOdkc5EZ6az0FnpbHR2Ogedk85F56Zb8z9XG7od3Z7uSHeiu9Bd6e50D7oX3ZvuS/ejB9AD6Tz8z5GXzkfnpwvQBelCdGG6CF2ULkYXp0vQJelSdGm6DP3xr7Lm50nVe6TcX3+dJUpeKWmShJUqJUuZPGWySpUr4cxEiZMmrZQqRZJKSSpXSZIsZcpkqapWSpk8RcqklaslS5QwVdIkyVNWS1m9cvLqKRI723Wvxf//c147+P9XUt4D+/iNuMc3Dnqs4IEe34p7fOugx4oe6PGduMd3Dnqs5IEe34t7fO+gx8oe6PGDuMcPDnqs4oEev4um7fE7B/97dlUP9Pi9uMfvHfRYzQM9+hH36MdBj9U90OMP4h5/cNBjDQ/0+KO4xx8d9FjTAz3+JO7xJwc91vJAjz+Le/zZQY+1PdDjL+Ief3HQYx0P9PiruMdfHfRYV9zj9+IeP977Nwf3rueBXz93xD+HdsfBjqvvhT+/SdzjXQc9NvDCn98k7vGegx4beuHPbxL3eN9Bj4288Oc3iXt84KDHxl7485vEPT500GMTL/z5TeIeHznosakX/vwmcY+PHfTYzAt/fpO4xycOemzuhT+/SdzjUwc9tvDCn98k7vGZgx5beuHPbxL3+NxBj6288Oc3iXt84aDH1l7485vEPb500GMbL/z5TeIeXznose3/4/97YTo/bn7eqZ0Hfv38Lv75u98d/O+u7T3Q4x/iHv9w0GMHD/ToV9yjXwc9dvRAj/7EPfpz0GMnD/ToX9yjfwc9dvZAjwHEPQZw0GMXD/QYUNxjQAc9dvVAj4HEPQZy0GM3D/QYWNxjYAc9dvdAj0HEPQZx0GMPD/QYVNxjUAc99vRAj8HEPQZz0GMvD/QYXNxjcAc99vZAjyHEPYZw0GMfD/QYUtxjSAc99vVAj6HEPYZy0GM/D/QYWtxjaAc99vdAj2HEPYZx0OMAD/QYVtxjWAc9DvRAj+HEPYZz0OMgD/QYXtxjeAc9DvZAjxHEPUZw0OMQD/QYUdxjRAc9DvVAj5HEPUZy0OMwD/QYWdxjZAc9DvdAj1HEPUZx0OMID/QYVdxjVAc9jvRAj9HEPUZz0OMoD/QYXdxjdAc9jvZAjzHEPcZw0OMYD/QYU9xjTAc9jvVAj7HEPcZy0OM4D/QYW9xjbAc9jvdAj3HEPcZx0OMED/QYV9xjXAc9TvRAj/HEPcZz0OMkD/QYX9xjfAc9TvZAjwnEPSZw0OMUD/SYUNxjQgc9TvVAj4nEPSZy0OM0D/SYWNxjYgc9TvdAj0nEPSZx0OMMD/SYVNxjUgc9zvRAj8nEPSZz0OMsD/SYXNxjcgc9zv5//OdTr0R18/Opczzw60f5rmF6P256nPv/+K+fDI7uPc8Dv35+E/95mjkc/P4z3ws/Jy7uMaeDHhd44efExT3mctDjQi/8nLi4x9wOelzkhZ8TF/eYx0GPi73wc+LiHvM66HGJF35OXNxjPgc9LvXCz4mLe8zvoMdlXvg5cXGPBRz0uNwLPycu7rGggx5XeOHnxMU9FnLQ40ov/Jy4uMfCDnpc5YWfExf3WMRBj6u98HPi4h6LOuhxjRd+TlzcYzEHPa71ws+Ji3ss7qDHdV74OXFxjyUc9LjeCz8nLu6xpIMeN3jh58TFPZZy0ONGL/ycuLjH0g563OSFnxMX91jGQY+bvfBz4uIeyzrocYsXfk5c3GM5Bz1u9cLPiYt7LO+gx21e+DlxcY8VHPS43Qs/Jy7usaKDHnd44efExT1WctDjTi/8nLi4x8oOetzlhZ8TF/dYxUGPu73wc+LiHqs66HGPF35OXNxjNQc97vXCz4mLe6zuoMd9Xvg5cXGPNRz0uN8LPycu7rGmgx4PeOHnxMU91nLQ40Ev/Jy4uMfaDno85IWfExf3WMdBj4e98HPi4h7rOujxiBd+TlzcYz0HPR71ws+Ji3us76DHY174OXFxjw0c9HjcCz8nLu6xoYMeT3jh58TFPTZy0ONJL/ycuLjHxg56POWFnxMX99jEQY+nvfBz4uIemzro8YwXfl5a3GMzBz2e9UCPKcU9NnfQ4zkP9JhK3GMLBz2e90CPqcU9tnTQ4wUP9JhG3GMrBz1e9ECPacU9tnbQ4yUP9JhO3GMbBz1e9kCP6cU9tnXQ4xUP9JhB3GM7Bz1e9UCPGcU9tnfQ4zUP9JhJ3GMHBz1e90CPmcU9dnTQ4w0P9JhF3GMnBz3e9ECPWcU9dnbQ4y0P9JhN3GMXBz3e9kCP2cU9dnXQ4x0P9JhD3GM3Bz3e9UCPOcU9dnfQ4z0P9JhL3GMPBz3e90CPucU99nTQ4wMP9JhH3GMvBz0+9ECPecU99nbQ4yMP9JhP3GMfBz0+9kCP+cU99nXQ4xMP9FhA3GM/Bz0+9UCPBcU99nfQ4zMP9FhI3OMABz0+90CPhcU9DnTQ4wsP9FhE3OMgBz2+9ECPRcU9DnbQ4ysP9FhM3OMQBz2+9kCPxcU9DnXQ4xsP9FhC3OMwBz2+9UCPJcU9DnfQ4zsP9FhK3OMIBz2+90CPpcU9jnTQ4wcP9FhG3OMoBz1+l+L//R7Linsc7aDH7z3QYzlxj2Mc9OjHAz2WF/c41kGPP3igxwriHsc56PFHD/RYUdzjeAc9/uSBHiuJe5zgoMefPdBjZXGPEx30+IsHeqwi7nGSgx5/9UCPVcU9TnbQ428e6LGauMcpDnr83QM9Vhf3ONVBj394oMca4h6nOejRrwd6rCnucbqDHv15oMda4h5nOOjRvwd6rC3ucaaDHgN4oMc64h5nOegxoAd6rCvucbaDHgN5oMd64h7nOOgxsAd6rC/uca6DHoN4oMcG4h7nOegxqAd6bCjucb6DHoN5oMdG4h4XOOgxuAd6bCzucaGDHkN4oMcm4h4XOegxpAd6bCrucbGDHkN5oMdm4h6XOOgxtAd6bC7ucamDHsN4oMcW4h6XOegxrAd6bCnucbmDHsN5oMdW4h5XOOgxvAd6bC3ucaWDHiN4oMc24h5XOegxogd6bCvucbWDHiN5oMd24h7XOOgxsgd6bC/uca2DHqN4oMcO4h7XOegxqgd67Cjucb2DHqN5oMdO4h43OOgxugd67CzucaODHmN4oMcu4h43Oegxpgd67CrucbODHmN5oMdu4h63OOgxtgd67C7ucauDHuN4oMce4h63Oegxrgd67CnucbuDHuN5oMde4h53OOgxvgd67C3ucaeDHhN4oMc+4h53OegxoQd67CvucbeDHhN5oMd+4h73OOgxsQd67C/uca+DHpN4oMcB4h73OegxqQd6HCjucb+DHpN5oMdB4h4POOgxuQd6HCzu8aCDHlN4oMch4h4POegxpQd6HCru8bCDHlN5oMdh4h6POOgxtQd6HC7u8aiDHtN4oMcR4h6POegxrQd6HCnu8biDHtN5oMdR4h5POOgxvQd6HC3u8aSDHjN4oMcx4h5POegxowd6HCvu8bSDHjN5oMdx4h7POOgxswd6HC/u8ayDHrN4oMcJ4h7POegxqwd6nCju8byDHrN5oMdJ4h4vOOgxuwd6nCzu8aKDHnN4oMcp4h4vOegxpwd6nCru8bKDHnN5oMdp4h6vOOgxtwd6nC7u8aqDHvN4oMcZ4h6vOegxrwd6nCnu8bqDHvN5oMdZ4h5vOOgxvwd6nC3u8aaDHgt4oMc54h5vOeixoAd6nCvu8baDHgt5oMd54h7vOOixsAd6nC/u8a6DHot4oMcF4h7vOeixqAd6XCju8b6DHot5oMdF4h4fOOixuAd6XCzu8aGDHkt4oMcl4h4fOeixpAd6XCru8bGDHkt5oMdl4h6fOOixtAd6XC7u8amDHst4oMcV4h6fOeixrAd6XCnu8bmDHst5oMdV4h5fOOixvAd6XC3u8aWDHit4oMc14h5fOeixogd6XCvu8bWDHit5oMd14h7fOOixsgd6XC/u8a2DHqt4oMcN4h7fOeixqgd63Cju8b2DHqt5oMdN4h4/OOixugd63Czu8buY+h5reKDHLeIev3fQY00P9LhV3KMfBz3W8kCP28Q9/uCgx9oe6HG7uMcfHfRYxwM97hD3+JODHut6oMed4h5/dtBjPQ/0uEvc4y8OeqzvgR53i3v81UGPDTzQ4x5xj7856LGhB3rcK+7xdwc9NvJAj/vEPf7hoMfGHuhxv7hHvw56bOKBHg+Ie/TnoMemHujxoLhH/w56bOaBHg+JewzgoMfmHujxsLjHgA56bOGBHo+IewzkoMeWHujxqLjHwA56bOWBHo+JewzioMfWHujxuLjHoA56bOOBHk+IewzmoMe2HujxpLjH4A56bOeBHk+JewzhoMf2HujxtLjHkA567OCBHs+IewzloMeOHujxrLjH0A567OSBHs+JewzjoMfOHujxvLjHsA567OKBHi+IewznoMeuHujxorjH8A567OaBHi+Je4zgoMfuHujxsrjHiA567OGBHq+Ie4zkoMeeHujxqrjHyA567OWBHq+Je4zioMfeHujxurjHqA567OOBHm+Ie4zmoMe+HujxprjH6A567OeBHm+Je4zhoMf+HujxtrjHmA56HOCBHu+Ie4zloMeBHujxrrjH2A56HOSBHu+Je4zjoMfBHujxvrjHuA56HOKBHh+Ie4znoMehHujxobjH+A56HOaBHh+Je0zgoMfhHujxsbjHhA56HOGBHp+Ie0zkoMeRHujxqbjHxA56HOWBHp+Je0zioMfRHujxubjHpA56HOOBHl+Ie0zmoMexHujxpbjH5A56HOeBHl+Je0zhoMfxHujxtbjHlA56nOCBHt+Ie0zloMeJHujxrbjH1A56nOSBHt+Je0zjoMfJHujxvbjHtA56nOKBHj+Ie0znoMepHujxu+jaHtM76HGaB3r8XtxjBgc9TvdAj37EPWZ00OMMD/T4g7jHTA56nOmBHn8U95jZQY+zPNDjT+IeszjocbYHevxZ3GNWBz3O8UCPv4h7zOagx7ke6PFXcY/ZHfQ4zwM9/ibuMYeDHud7oMffxT3mdNDjAg/0+Ie4x1wOelzogR79invM7aDHRR7o0Z+4xzwOelzsgR79i3vM66DHJR7oMYC4x3wOelzqgR4DinvM76DHZR7oMZC4xwIOelzugR4Di3ss6KDHFR7oMYi4x0IOelzpgR6Dinss7KDHVR7oMZi4xyIOelztgR6Di3ss6qDHNR7oMYS4x2IOelzrgR5Dinss7qDHdR7oMZS4xxIOelzvgR5Di3ss6aDHDR7oMYy4x1IOetzogR7Dinss7aDHTR7oMZy4xzIOetzsgR7Di3ss66DHLR7oMYK4x3IOetzqgR4jinss76DHbR7oMZK4xwoOetzugR4ji3us6KDHHR7oMYq4x0oOetzpgR6jinus7KDHXR7oMZq4xyoOetztgR6ji3us6qDHPR7oMYa4x2oOetzrgR5jinus7qDHfR7oMZa4xxoOetzvgR5ji3us6aDHAx7oMY64x1oOejzogR7jinus7aDHQx7oMZ64xzoOejzsgR7ji3us66DHIx7oMYG4x3oOejzqgR4Tinus76DHYx7oMZG4xwYOejzugR4Ti3ts6KDHEx7oMYm4x0YOejzpgR6Tints7KDHUx7oMZm4xyYOejztgR6Ti3ts6qDHMx7oMYW4x2YOejzrgR5Tints7qDHcx7oMZW4xxYOejzvgR5Ti3ts6aDHCx7oMY24x1YOerzogR7Tints7aDHSx7oMZ24xzYOerzsgR7Ti3ts66DHKx7oMYO4x3YOerzqgR4zints76DHax7oMZO4xw4OerzugR4zi3vs6KDHGx7oMYu4x04OerzpgR6zinvs7KDHWx7oMZu4xy4OerztgR6zi3vs6qDHOx7oMYe4x24OerzrgR5zinvs7qDHex7oMZe4xx4OerzvgR5zi3vs6aDHBx7oMY+4x14OenzogR7zinvs7aDHRx7oMZ+4xz4OenzsgR7zi3vs66DHJx7osYC4x34OenzqgR4Linvs76DHZx7osZC4xwEOenzugR4Li3sc6KDHFx7osYi4x0EOenzpgR6Linsc7KDHVx7osZi4xyEOenztgR6Li3sc6qDHNx7osYS4x2EOenzrgR5Linsc7qDHdx7osZS4xxEOenzvgR5Li3sc6aDHDx7osYy4x1EOevwu5f/7PZYV9zjaQY/fe6DHcuIexzjo0Y8Heiwv7nGsgx5/8ECPFcQ9jnPQ448e6LGiuMfxDnr8yQM9VhL3OMFBjz97oMfK4h4nOujxFw/0WEXc4yQHPf7qgR6rinuc7KDH3zzQYzVxj1Mc9Pi7B3qsLu5xqoMe//BAjzXEPU5z0KNfD/RYU9zjdAc9+vNAj7XEPc5w0KN/D/RYW9zjTAc9BvBAj3XEPc5y0GNAD/RYV9zjbAc9BvJAj/XEPc5x0GNgD/RYX9zjXAc9BvFAjw3EPc5z0GNQD/TYUNzjfAc9BvNAj43EPS5w0GNwD/TYWNzjQgc9hvBAj03EPS5y0GNID/TYVNzjYgc9hvJAj83EPS5x0GNoD/TYXNzjUgc9hvFAjy3EPS5z0GNYD/TYUtzjcgc9hvNAj63EPa5w0GN4D/TYWtzjSgc9RvBAj23EPa5y0GNED/TYVtzjagc9RvJAj+3EPa5x0GNkD/TYXtzjWgc9RvFAjx3EPa5z0GNUD/TYUdzjegc9RvNAj53EPW5w0GN0D/TYWdzjRgc9xvBAj13EPW5y0GNMD/TYVdzjZgc9xvJAj93EPW5x0GNsD/TYXdzjVgc9xvFAjz3EPW5z0GNcD/TYU9zjdgc9xvNAj73EPe5w0GN8D/TYW9zjTgc9JvBAj33EPe5y0GNCD/TYV9zjbgc9JvJAj/3EPe5x0GNiD/TYX9zjXgc9JvFAjwPEPe5z0GNSD/Q4UNzjfgc9JvNAj4PEPR5w0GNyD/Q4WNzjQQc9pvBAj0PEPR5y0GNKD/Q4VNzjYQc9pvJAj8PEPR5x0GNqD/Q4XNzjUQc9pvFAjyPEPR5z0GNaD/Q4UtzjcQc9pvNAj6PEPZ5w0GN6D/Q4WtzjSQc9ZvBAj2PEPZ5y0GNGD/Q4VtzjaQc9ZvJAj+PEPZ5x0GNmD/Q4XtzjWQc9ZvFAjxPEPZ5z0GNWD/Q4UdzjeQc9ZvNAj5PEPV5w0GN2D/Q4WdzjRQc95vBAj1PEPV5y0GNOD/Q4VdzjZQc95vJAj9PEPV5x0GNuD/Q4XdzjVQc95vFAjzPEPV5z0GNeD/Q4U9zjdQc95vNAj7PEPd5w0GN+D/Q4W9zjTQc9FvBAj3PEPd5y0GNBD/Q4V9zjbQc9FvJAj/PEPd5x0GNhD/Q4X9zjXQc9FvFAjwvEPd5z0GNRD/S4UNzjfQc9FvNAj4vEPT5w0GNxD/S4WNzjQwc9lvBAj0vEPT5y0GNJD/S4VNzjYwc9lvJAj8vEPT5x0GNpD/S4XNzjUwc9lvFAjyvEPT5z0GNZD/S4Utzjcwc9lvNAj6vEPb5w0GN5D/S4WtzjSwc9VvBAj2vEPb5y0GNFD/S4Vtzjawc9VvJAj+vEPb5x0GNlD/S4XtzjWwc9VvFAjxvEPb5z0GNVD/S4Udzjewc9VvNAj5vEPX5w0GN1D/S4Wdzjd7H0PdbwQI9bxD1+76DHmh7ocau4Rz8OeqzlgR63iXv8wUGPtT3Q43Zxjz866LGOB3rcIe7xJwc91vVAjzvFPf7soMd6Huhxl7jHXxz0WN8DPe4W9/irgx4beKDHPeIef3PQY0MP9LhX3OPvDnps5IEe94l7/MNBj4090ON+cY9+HfTYxAM9HhD36M9Bj0090ONBcY/+HfTYzAM9HhL3GMBBj8090ONhcY8BHfTYwgM9HhH3GMhBjy090ONRcY+BHfTYygM9HhP3GMRBj6090ONxcY9BHfTYxgM9nhD3GMxBj2090ONJcY/BHfTYzgM9nhL3GMJBj+3FPX4v7vHjvUM6uHcHD9w7lIN7d/TAvUM7uHcnD9w7jIN7d/bAvcM6uHcXD9w7nIN7d/XAvcM7uHc3D9w7goN7d/fAvSM6uHcPD9w7koN79/TAvSM7uHcvD9w7ioN79/bAvaM6uHcfD9w7moN79/XAvaM7uHc/D9w7hoN79/fAvWM6uPcAD9w7loN7D/TAvWM7uPcgD9w7joN7D/bAveM6uPcQD9w7noN7D/XAveM7uPcwD9w7gYN7D/fAvRM6uPcID9w7kYN7j/TAvRM7uPcoD9w7iYN7j/bAvZM6uPcYD9w7mYN7j/XAvZM7uPe4/8f/39NT4s75YunOS8vz1D2O90CP+cU95nfQ4wQP9FhA3GMBBz1O9ECPBcU9FnTQ4yQP9FhI3GMhBz1O9kCPhcU9FnbQ4xQP9FhE3GMRBz1O9UCPRcU9FnXQ4zQP9FhM3GMxBz1O90CPxcU9FnfQ4wwP9FhC3GMJBz3O9ECPJcU9lnTQ4ywP9FhK3GMpBz3O9kCPpcU9lnbQ4xwP9FhG3GMZBz3O9UCPZcU9lnXQ4zwP9FhO3GM5Bz3O90CP5cU9lnfQ4wIP9FhB3GMFBz0u9ECPFcU9VnTQ4yIP9FhJ3GMlBz0u9kCPlcU9VnbQ4xIP9FhF3GMVBz0u9UCPVcU9VnXQ4zIP9FhN3GM1Bz0u90CP1cU9VnfQ4woP9FhD3GMNBz2u9ECPNcU91nTQ4yoP9FhL3GMtBz2u9kCPtcU91nbQ4xoP9FhH3GMdBz2u9UCPdcU91nXQ4zoP9FhP3GM9Bz2u90CP9cU91nfQ4wYP9NhA3GMDBz1u9ECPDcU9NnTQ4yYP9NhI3GMjBz1u9kCPjcU9NnbQ4xYP9NhE3GMTBz1u9UCPTcU9NnXQ4zYP9NhM3GMzBz1u90CPzcU9NnfQ4w4P9NhC3GMLBz3u9ECPLcU9tnTQ4y4P9NhK3GMrBz3u/n/851PT4M5pHdx7jwd+/eQV/voZ6MdNj3v/H//1M8jRvfeJ7/380y8gdvAx/gB+BD+Bn8Ev4FfwG/gd/AH8An/APwgAAoJAIDAIAoKCYCA4CAFCglAgNAgDwoJwIDyIACKCSCAyiAI+Ps8cDUQHMUDM7/7/55q/iw3igLggHogPEnzsAiQCiT92DJKCZCA5SAFQ23epQGqQBqQF6UB6kIH//WQCmUEWkBVkA9lBDpAT5AK5QR6QF+QD+UEBUBAUAoVBEVAUFAPFQQlQEpQCpUEZUBaUA+VBBVARVAKVQRVQFVQD1UENUBPUArVBHVAX1AP1QQPQEDQCjUET0BQ0A81BC9AStAKtQRvQFrQD7UEH0BF0Ap1BF9AVdAPdQQ/QE/QCvUEf0Bf0A/3BADAQDAKDwRAwFAwDw8EIMBKMAqPBGDAWjAPjwQQwEUwCk8EUMBVMA9PBDDATzAKzwRwwF8wD88ECsBAsAovBErAULAPLwQqwEqwCq8EasBasA+vBBrARbAKbwRawFWwD28EOsBPsArvBHrAX7AP7wQFwEBwCh8ERcBQcA8fBCXASnAKnwRlwFpwD58EFcBFcApfBFXAVXAPXwQ1wE9wCt8EdcBfcA/fBA/AQPAKPwRPwFDwDz8EL8BK8Aq/BG/AWvAPvwQfw8R/+74Ef8AP4EfwEfga/gF/Bb+B38AfwC/wB/yAACAgCgcAgCAgKgoHgIAQICUKB0CAMCAvCgfAgAogIIoHIIAqICqKB6CAGiAligdggDogL4oH4IAFICBKBxCAJSAqSgeQgBUgJUoHUIA1IC9KB9CADyAgygcwgC8gKsoHsIAfICXKB3CAPyAvygfygACgICoHCoAgoCoqB4qAEKAlKgdKgDCgLyoHyoAKoCCqByqAKqAqqgeqgBqgJaoHaoA6oC+qB+qABaAgagcagCWgKmoHmoAVoCVqB1qANaAvagfagA+gIOoHOoAvoCrqB7qAH6Al6gd6gD+gL+oH+YAAYCAaBwWAIGAqGgeFgBBgJRoHRYAwYC8aB8WACmAgmgclgCpgKpoHpYAaYCWaB2WAOmAvmgflgAVgIFoHFYAlYCpaB5WAFWAlWgdVgDVgL1oH1YAPYCDaBzWAL2Aq2ge1gB9gJdoHdYA/YC/aB/eAAOAgOgcPgCDgKjoHj4AQ4CU6B0+AMOAvOgfPgArgILoHL4Aq4Cq6B6+AGuAlugdvgDrgL7oH74AF4CB6Bx+AJeAqegefgBXgJXoHX4A14C96B9+AD+Pgv/u+BH/AD+BH8BH4Gv4BfwW/gd/AH8Av8Af8gAAgIAoHAIAgICoKB4CAECAlCgdAgDAgLwoHwIAKICCKByCAKiAqigeggBogJYoHYIA6IC+KB+CABSAgSgcQgCUgKkoHkIAVICVKB1CDNx28zkA6kBxlARpAJZAZZQFaQDWQHOUBOkAvkBnlAXpAP5AcFQEFQCBQGRUBRUAwUByVASVAKlAZlQFlQDpQHFUBFUAlUBlVAVVANVAc1QE1QC9QGdUBdUA/UBw1AQ9AINAZNQFPQDDQHLUBL0Aq0Bm1AW9AOtAcdQEfQCXQGXUBX0A10Bz1AT9AL9AZ9QF/QD/QHA8DH7/yP37yDwRAwFAwDw8EIMBKMAqPBGDAWjAPjwQQwEUwCk8EUMBVMA9PBDDATzAKzwRwwF8wD88ECsBAsAovBErAULAPLwQqwEqwCq8EasBasA+vBBrARbAKbwRawFWwD28EOsBPsArvBHrAX7AP7wQFwEBwCh8ERcBQcA8fBCXASnAKnwRlwFpwD58EFcBFcApfBFXAVXAPXwQ1wE9wCt8EdcBfcA/fBA/AQPAKPwRPwFDzz893nv2b85f/88R/31viYbgPagfagI+gEuoCuoDvoAXqB3qAv6AcGgIFgJEiNj+s0IC1IB9KDDCAjyAQygywgK8gGsoMcICfIBXKDPCAvyAfygwKgICgECoMioCgoBoqDEqAkKAVKgzKgLCgHyoMKoCKoBCqDKqAqqAaqgxqgJqgFaoM6oC6oB+qDBqAhaAQagyagKWgGmoMWoCVoBVqDNqAtaAfagw6gI+gEOoMuoCvoBrqDHqAn6AV6gz6gL+gH+oMBYCAYBAaDIWAoGAaGgxFgJBgFRoMxYCwYB8aDCWAimAQmgylgKpgGpoMZYCaYBWaDOWAumAfmgwVgIVgEFoMlYClYBpaDFWAlWAVWgzVgLVgH1oMNYCPYBDaDLWAr2Aa2gx1gJ9gFdoM9YC/YB/aDA+AgOAQOgyPgKDgGjoMT4CQ4BU6DM+AsOAfOgwvgIrgELoMr4Cq4Bq6DG+AmuAVugzvgLrgH7oMH4CF4BB6DJ+ApeAaegxfgJXgFXoM34C14B96DD+Dj4Pwe+AE/gB/BT+Bn8Av4FfwGfgd/AL/AH/APAoCAIBAIDIKAoCAYCA5CgJAgFAgNwoCwIBwIDyKAiCASiAyigKggGogOYoCYIBaIDeKAuCAeiA8SgIQgEUgMkoCkIBlIDlKAlCAVSA3SgLQgHUgPMoCMIBPIDLKArCAbyA5ygJwgF8gN8oC8IB/IDwqAgqAQKAyKgKKgGCgOSoCSoBQoDcqAsqAcKA8qgIqgEqgMqoCqoBqoDmqAmqAWqA3qgLqgHqgPGoCGoBFoDJqApqAZaA5agJagFWgN2oC2oB1oDzqAjqAT6Ay6gK6gG+gOeoCeoBfoDfqAvqAf6A8GgIFgEBgMhoChYBgYDkaAkWAUGA3GgLFgHBgPJoCJYBKYDKaAqWAamA5mgJlgFpgN5oC5YB6YDxaAhWARWAyWgKVgGVgOVoCVYBVYDdaAtWAdWA82gI1gE9gMtoCtYBvYDnaAnWAX2A32gL1gH9gPDoCD4BA4DI6Ao+AYOA5OgJPgFDgNzoCz4Bw4Dy6Ai+ASuAyugKvgGrgOboCb4Ba4De6Au+AeuA8egIfgEXgMnoCn4Bl4Dl6Al+AVeA3egLfgHXgPPoCP/2PT98AP+AH8CH4CP4NfwK/gN/A7+AP4Bf6AfxAABASBQGAQBAQFwUBwEAKEBKFAaBAGhAXhQHgQAUQEkUBkEAVEBdFAdBADxASxQGwQB8QF/19r97GTUBhFURiDolMfRAV77733rvTeef8BayWXcAnM4CZfNCGhjcj9z9l7AYtYQhwJLGMFq1jDOjawiS1sYwe72MM+Drw/iSMc4wSnOMM5LnCJK1zjBre4wz0e8IgnPOMFr3jDOz7wiS984we/+MM/kkghjQyyyCGPAooooYwKqqihjgaaaKGNDuybtyvdnm87qu1XthvYXls7We0TtQvTHkc7CO3js5vOnjY7y+zvssvKXic7juz7sfvGHhg7UewHsSvD3gg7FOwTMFvfnHkz180fN4vbXGozms0rNrvXHFszXc03NevT3EszG80bNCvPnDczyszXMhvKXCMzecyTMQvFHA8zKMxPcPffvXV3rt0XdtfVPU13DN2Pc7fLvSR3atwHcZfBOXxnyJ1/dnbXuVNnJp33c1bNOStnhJxvcTbDuQLPxD3P9SzSczTPgDwP8V6+97UHfqB6zQZ/YyMe611zkf4hiDezDoP/42NePkc0eK6Z0Ov1Xms69Hgs9F6mJv9eEuHPG40MfwfzI76fLgn9+nlZkTgA"};
+
+export async function create_transaction(current_root: Field, deposit_amount: Field, withdrawals: Field[], utxo_spendable: UTXO_Spendable[], utxo_new: UTXO_New[], contract_only_inputs: ContractOnlyInputs, foreignCallHandler?: ForeignCallHandler): Promise<TransactionInputs> {
+  const program = new Noir(create_transaction_circuit);
+  const args: InputMap = { current_root, deposit_amount, withdrawals, utxo_spendable, utxo_new, contract_only_inputs };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as TransactionInputs;
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/keccak_contract_only_inputs.ts b/momiji-helpers/circuits/helpers/codegen/keccak_contract_only_inputs.ts
new file mode 100644
index 0000000000000000000000000000000000000000..76e77b081a98dfe62a62f2b2b004097d95444864
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/keccak_contract_only_inputs.ts
@@ -0,0 +1,36 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+export type EncryptedUTXO = {
+  secret: Field;
+  amount: Field;
+  data: Field;
+};
+
+export type ContractOnlyInputs = {
+  timestamp: Field;
+  deadline: Field;
+  signature_hash: Field;
+  price_limit: Field;
+  recipients: Field[];
+  swap_amounts: Field[];
+  uids: Field[];
+  encrypted_utxo: EncryptedUTXO[];
+};
+
+
+export const keccak_contract_only_inputs_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"contract_only_inputs","type":{"kind":"struct","path":"structs::ContractOnlyInputs","fields":[{"name":"timestamp","type":{"kind":"field"}},{"name":"deadline","type":{"kind":"field"}},{"name":"signature_hash","type":{"kind":"field"}},{"name":"price_limit","type":{"kind":"field"}},{"name":"recipients","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"swap_amounts","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"uids","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"encrypted_utxo","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::EncryptedUTXO","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"data","type":{"kind":"field"}}]}}}]},"visibility":"private"}],"param_witnesses":{"contract_only_inputs":[{"start":0,"end":100}]},"return_type":{"abi_type":{"kind":"field"},"visibility":"private"},"return_witnesses":[3333]},"bytecode":"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"};
+
+export async function keccak_contract_only_inputs(contract_only_inputs: ContractOnlyInputs, foreignCallHandler?: ForeignCallHandler): Promise<Field> {
+  const program = new Noir(keccak_contract_only_inputs_circuit);
+  const args: InputMap = { contract_only_inputs };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as Field;
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/keccak_contract_only_inputs_without_deposit.ts b/momiji-helpers/circuits/helpers/codegen/keccak_contract_only_inputs_without_deposit.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ec262ee45777774d156872a4745f04684f990a3a
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/keccak_contract_only_inputs_without_deposit.ts
@@ -0,0 +1,36 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+export type EncryptedUTXO = {
+  secret: Field;
+  amount: Field;
+  data: Field;
+};
+
+export type ContractOnlyInputs = {
+  timestamp: Field;
+  deadline: Field;
+  signature_hash: Field;
+  price_limit: Field;
+  recipients: Field[];
+  swap_amounts: Field[];
+  uids: Field[];
+  encrypted_utxo: EncryptedUTXO[];
+};
+
+
+export const keccak_contract_only_inputs_without_deposit_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"contract_only_inputs","type":{"kind":"struct","path":"structs::ContractOnlyInputs","fields":[{"name":"timestamp","type":{"kind":"field"}},{"name":"deadline","type":{"kind":"field"}},{"name":"signature_hash","type":{"kind":"field"}},{"name":"price_limit","type":{"kind":"field"}},{"name":"recipients","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"swap_amounts","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"uids","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"encrypted_utxo","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::EncryptedUTXO","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"data","type":{"kind":"field"}}]}}}]},"visibility":"private"}],"param_witnesses":{"contract_only_inputs":[{"start":0,"end":100}]},"return_type":{"abi_type":{"kind":"field"},"visibility":"private"},"return_witnesses":[3301]},"bytecode":"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Li9dQbqidCXpytJVpKtKV/MO/n31q4fdvvrN2/ktv/evjG75fsacJrfe/r1yOb/l//6V01sB379yduv996+c3JJ9lS/ot/77/lUQb33w/aug3frw+1dBufWx96/cv/Xx96/cvfWp96/cu/Xp96/cuRXY+1eu3wr8/StXb7ny/pVrt1x7/8qVW66+fxX4LdffvwrsljvvX3nb7auy3nb7qpy33b4q7223ryp42+2rit52+6qSt92+quxtt6+qeNvtq6redvuqmnfI2VfZ7G75v3+Fz18D1AS1QG1QB9QF9UB90AA0BI1AY9AENAXNQHPQArQErUBr0Aa0Be1Ae9ABdASdQGfQBXQF3fhj+93v7ery+7uGdE3pWtK1petI15WuJ11fuoF0Q+lG0o2lm0g3lW4m3Vy6hXRL6VbSraXbSLeVbifdXrqDdEfpTtKdpbtId5Xu5h38+yrgd8bpvqru7fyW3/tXRrd8P2NNk1tv/161nN/yf//K6a2A7185u/X++1dObsm+qhf0W/99/yqItz74/lXQbn34/aug3PrY+1fu3/r4+1fu3vrU+1fu3fr0+1fu3Ars/SvXbwX+/pWrt1x5/8q1W669f+XKLVffvwr8luvvXwV2y533r7zt9lVbb7t91c7bbl+197bbVx287fZVR2+7fdXJ225fdfa221ddvO32VVdvu33VzTvk7Kvsdrf837/C5+8OeoCeoBfoDfqAvqAf6A8GgIFgEBgMhoChYBgYDkaAkWAUGA3GgLFgHBgPJoCJYBKYDKaAqfyx/e739h/y+7u7dA/pntK9pHtL95HuK91Pur/0AOmB0oOkB0sPkR4qPUx6uPQI6ZHSo6RHS4+RHis9Tnq89ATpidKTpCdLT5Ge6h38+yrgd8bpvvrD2/ktv/evjG75fsYeJrfe/r16Or/l//6V01sB379yduv996+c3JJ91Tfot/77/lUQb33w/aug3frw+1dBufWx96/cv/Xx96/cvfWp96/cu/Xp96/cuRXY+1eu3wr8/StXb7ny/pVrt1x7/8qVW66+fxX4LdffvwrsljvvX3nb7asx3nb7aqy33b4a5223r8Z72+2rCd52+2qit92+muRtt68me9vtqynedvtqqnfI2Vc57G75v3+Fzz8NTAczwEwwC8wGc8BcMA/MBwvAQrAILAZLwFKwDCwHK8BKsAqsBmvA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"};
+
+export async function keccak_contract_only_inputs_without_deposit(contract_only_inputs: ContractOnlyInputs, foreignCallHandler?: ForeignCallHandler): Promise<Field> {
+  const program = new Noir(keccak_contract_only_inputs_without_deposit_circuit);
+  const args: InputMap = { contract_only_inputs };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as Field;
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/keccak_tx.ts b/momiji-helpers/circuits/helpers/codegen/keccak_tx.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e509b315bed4c25ae7d8d1fb7fb36463580ac029
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/keccak_tx.ts
@@ -0,0 +1,30 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+export type PublicInputs = {
+  current_root: Field;
+  utxo_root: Field;
+  deposit_amount: Field;
+  withdrawals: Field;
+  commitment_in: Field[];
+  commitment_out: Field[];
+  nullifier_hashes: Field[];
+  contract_only_inputs: Field;
+};
+
+
+export const keccak_tx_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"tx","type":{"kind":"struct","path":"structs::PublicInputs","fields":[{"name":"current_root","type":{"kind":"field"}},{"name":"utxo_root","type":{"kind":"field"}},{"name":"deposit_amount","type":{"kind":"field"}},{"name":"withdrawals","type":{"kind":"field"}},{"name":"commitment_in","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"commitment_out","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"nullifier_hashes","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"contract_only_inputs","type":{"kind":"field"}}]},"visibility":"private"}],"param_witnesses":{"tx":[{"start":0,"end":53}]},"return_type":{"abi_type":{"kind":"field"},"visibility":"private"},"return_witnesses":[1782]},"bytecode":"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"};
+
+export async function keccak_tx(tx: PublicInputs, foreignCallHandler?: ForeignCallHandler): Promise<Field> {
+  const program = new Noir(keccak_tx_circuit);
+  const args: InputMap = { tx };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as Field;
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/keccak_tx_no_deposit.ts b/momiji-helpers/circuits/helpers/codegen/keccak_tx_no_deposit.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7c507e8f38514d8d23bbd101038c74014b3a78d1
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/keccak_tx_no_deposit.ts
@@ -0,0 +1,61 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+export type MerkleProof = {
+  path_utxo: Field[];
+  path_tx: Field[];
+  path_historic: Field[];
+  index_utxo: Field;
+  index_tx: Field;
+  index_historic: Field;
+};
+
+export type UTXO_Spendable = {
+  secret: Field;
+  amount: Field;
+  asset_type: Field;
+  oracle: Field;
+  old_root_proof: Field;
+  merkle_proof: MerkleProof;
+  spend_in_same_batch: boolean;
+};
+
+export type UTXO_New = {
+  secret: Field;
+  amount: Field;
+  asset_type: Field;
+};
+
+export type EncryptedUTXO = {
+  secret: Field;
+  amount: Field;
+  data: Field;
+};
+
+export type ContractOnlyInputs = {
+  timestamp: Field;
+  deadline: Field;
+  signature_hash: Field;
+  price_limit: Field;
+  recipients: Field[];
+  swap_amounts: Field[];
+  uids: Field[];
+  encrypted_utxo: EncryptedUTXO[];
+};
+
+
+export const keccak_tx_no_deposit_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"current_root","type":{"kind":"field"},"visibility":"private"},{"name":"deposit_amount","type":{"kind":"field"},"visibility":"private"},{"name":"withdrawals","type":{"kind":"array","length":16,"type":{"kind":"field"}},"visibility":"private"},{"name":"utxo_spendable","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::UTXO_Spendable","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"asset_type","type":{"kind":"field"}},{"name":"oracle","type":{"kind":"field"}},{"name":"old_root_proof","type":{"kind":"field"}},{"name":"merkle_proof","type":{"kind":"struct","path":"structs::MerkleProof","fields":[{"name":"path_utxo","type":{"kind":"array","length":4,"type":{"kind":"field"}}},{"name":"path_tx","type":{"kind":"array","length":4,"type":{"kind":"field"}}},{"name":"path_historic","type":{"kind":"array","length":20,"type":{"kind":"field"}}},{"name":"index_utxo","type":{"kind":"field"}},{"name":"index_tx","type":{"kind":"field"}},{"name":"index_historic","type":{"kind":"field"}}]}},{"name":"spend_in_same_batch","type":{"kind":"boolean"}}]}},"visibility":"private"},{"name":"utxo_new","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::UTXO_New","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"asset_type","type":{"kind":"field"}}]}},"visibility":"private"},{"name":"contract_only_inputs","type":{"kind":"struct","path":"structs::ContractOnlyInputs","fields":[{"name":"timestamp","type":{"kind":"field"}},{"name":"deadline","type":{"kind":"field"}},{"name":"signature_hash","type":{"kind":"field"}},{"name":"price_limit","type":{"kind":"field"}},{"name":"recipients","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"swap_amounts","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"uids","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"encrypted_utxo","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::EncryptedUTXO","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"data","type":{"kind":"field"}}]}}}]},"visibility":"private"}],"param_witnesses":{"contract_only_inputs":[{"start":658,"end":758}],"current_root":[{"start":0,"end":1}],"deposit_amount":[{"start":1,"end":2}],"utxo_new":[{"start":610,"end":658}],"utxo_spendable":[{"start":18,"end":610}],"withdrawals":[{"start":2,"end":18}]},"return_type":{"abi_type":{"kind":"field"},"visibility":"private"},"return_witnesses":[6514]},"bytecode":"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W+jN9CZ6I72BXk+vo9fSa+jV9Cp6Jb2CXk4vo5fSS+jF9CP6If2Avk/fo+/Sd+jb9C36Jn2Dvk5fo6/SV+jL9CX6In2BPk+fo8/SZ+jT9Cn6JH2CPk4fo4/SR+jDdFjecxSGDk2HokPSIejgdDA6KB2EDkwHogPSAZz7lZx7lehPfBwf6Q/0e/od/ZZ+Q7+mX9Ev6Rf0c/oZ/ZR+Qj+mk/FxJKWT0InpRHRCOgEdn45Hx6Xj0LHpWHRMOgbtQ/9KR6ej0b/QUekodGTam/aiI9ERaU/ag45Ah6fD0cXoonQRujBdiC5IF6Dz0/novHQeOjedi85J56Cz09norHQWOjOdic5IZ6DT0+notHQaOjWdik5Jp6CT0849ys79ys69y859zM49zc79zc69zs59z8490M790M690c590s49087908691M591c491s791s6918592M492c792c692s5928493M793M693c593s49387938694M594c49Z879Z869aM59ac49as79as69a859bM49bc79bc69bs59b849cM79cM69cc59cs49c879c869dM59dc49ds79ds69d859eM49ec79ec69es59e849fM79fM69fc59fr53a/jAQ+E/wTAwHIwAI8EoMBqMAWPBODAeTAATwSQwGUwBU8E0MB3MADPBLDAbzAFzwTwwHywAC8EisDjCX3fOffnH+n5Gw7OS+/CcJXjcS8EysBysACvBKrAarAFrwTqwHmwAG8EmsBlsAVvBNrAd7AA7wS6wG+wBe8E+sB8cAAfBIXA4wk9/u59xCf99Onup7GWyl8teIXul7FWyV8teI3ut7HWy18veIHuj7E2yN8veInur7G2yt8veIXun7F2yd8veI3uv7H2y98s+IPug7EOyD3N/+cf6fsYvz3L1Dh/f//909SznfsalRmf5fo3LTM766/la7vpZn+9nXOHqWV/cz7jStbP+dj/jKlfOkvsZV3//Wf91P+Oa7zzra/czrv2+s756P+O67znrH+5nXO//s/7xfsYN/j3rX+5n3Oi/s/71fsZN/jnrG/czbvb7Wd+8n3GLX8/yw/2MW/12lp/uZ9zml7P8eD/j9m+f5ef7GXd86yx/3M+4M4Ld/Yy7Itjdz7g7gt39jHsi2N3PuDeC3f2M+yLY3c+4P4Ld/YwHItjdz3gwgt39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"};
+
+export async function keccak_tx_no_deposit(current_root: Field, deposit_amount: Field, withdrawals: Field[], utxo_spendable: UTXO_Spendable[], utxo_new: UTXO_New[], contract_only_inputs: ContractOnlyInputs, foreignCallHandler?: ForeignCallHandler): Promise<Field> {
+  const program = new Noir(keccak_tx_no_deposit_circuit);
+  const args: InputMap = { current_root, deposit_amount, withdrawals, utxo_spendable, utxo_new, contract_only_inputs };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as Field;
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/keccak_tx_with_deposit.ts b/momiji-helpers/circuits/helpers/codegen/keccak_tx_with_deposit.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e416ed8807502d2f3698cb81eeeb6a000a18fea6
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/keccak_tx_with_deposit.ts
@@ -0,0 +1,61 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+export type MerkleProof = {
+  path_utxo: Field[];
+  path_tx: Field[];
+  path_historic: Field[];
+  index_utxo: Field;
+  index_tx: Field;
+  index_historic: Field;
+};
+
+export type UTXO_Spendable = {
+  secret: Field;
+  amount: Field;
+  asset_type: Field;
+  oracle: Field;
+  old_root_proof: Field;
+  merkle_proof: MerkleProof;
+  spend_in_same_batch: boolean;
+};
+
+export type UTXO_New = {
+  secret: Field;
+  amount: Field;
+  asset_type: Field;
+};
+
+export type EncryptedUTXO = {
+  secret: Field;
+  amount: Field;
+  data: Field;
+};
+
+export type ContractOnlyInputs = {
+  timestamp: Field;
+  deadline: Field;
+  signature_hash: Field;
+  price_limit: Field;
+  recipients: Field[];
+  swap_amounts: Field[];
+  uids: Field[];
+  encrypted_utxo: EncryptedUTXO[];
+};
+
+
+export const keccak_tx_with_deposit_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"current_root","type":{"kind":"field"},"visibility":"private"},{"name":"deposit_amount","type":{"kind":"field"},"visibility":"private"},{"name":"withdrawals","type":{"kind":"array","length":16,"type":{"kind":"field"}},"visibility":"private"},{"name":"utxo_spendable","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::UTXO_Spendable","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"asset_type","type":{"kind":"field"}},{"name":"oracle","type":{"kind":"field"}},{"name":"old_root_proof","type":{"kind":"field"}},{"name":"merkle_proof","type":{"kind":"struct","path":"structs::MerkleProof","fields":[{"name":"path_utxo","type":{"kind":"array","length":4,"type":{"kind":"field"}}},{"name":"path_tx","type":{"kind":"array","length":4,"type":{"kind":"field"}}},{"name":"path_historic","type":{"kind":"array","length":20,"type":{"kind":"field"}}},{"name":"index_utxo","type":{"kind":"field"}},{"name":"index_tx","type":{"kind":"field"}},{"name":"index_historic","type":{"kind":"field"}}]}},{"name":"spend_in_same_batch","type":{"kind":"boolean"}}]}},"visibility":"private"},{"name":"utxo_new","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::UTXO_New","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"asset_type","type":{"kind":"field"}}]}},"visibility":"private"},{"name":"contract_only_inputs","type":{"kind":"struct","path":"structs::ContractOnlyInputs","fields":[{"name":"timestamp","type":{"kind":"field"}},{"name":"deadline","type":{"kind":"field"}},{"name":"signature_hash","type":{"kind":"field"}},{"name":"price_limit","type":{"kind":"field"}},{"name":"recipients","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"swap_amounts","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"uids","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"encrypted_utxo","type":{"kind":"array","length":16,"type":{"kind":"struct","path":"structs::EncryptedUTXO","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"data","type":{"kind":"field"}}]}}}]},"visibility":"private"}],"param_witnesses":{"contract_only_inputs":[{"start":658,"end":758}],"current_root":[{"start":0,"end":1}],"deposit_amount":[{"start":1,"end":2}],"utxo_new":[{"start":610,"end":658}],"utxo_spendable":[{"start":18,"end":610}],"withdrawals":[{"start":2,"end":18}]},"return_type":{"abi_type":{"kind":"field"},"visibility":"private"},"return_witnesses":[6546]},"bytecode":"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"};
+
+export async function keccak_tx_with_deposit(current_root: Field, deposit_amount: Field, withdrawals: Field[], utxo_spendable: UTXO_Spendable[], utxo_new: UTXO_New[], contract_only_inputs: ContractOnlyInputs, foreignCallHandler?: ForeignCallHandler): Promise<Field> {
+  const program = new Noir(keccak_tx_with_deposit_circuit);
+  const args: InputMap = { current_root, deposit_amount, withdrawals, utxo_spendable, utxo_new, contract_only_inputs };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as Field;
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/pedersen_left_right.ts b/momiji-helpers/circuits/helpers/codegen/pedersen_left_right.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3aa9a5bf53fd2bb24736f992823ef9e4192427f9
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/pedersen_left_right.ts
@@ -0,0 +1,19 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+
+export const pedersen_left_right_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"left","type":{"kind":"field"},"visibility":"private"},{"name":"right","type":{"kind":"field"},"visibility":"private"}],"param_witnesses":{"left":[{"start":0,"end":1}],"right":[{"start":1,"end":2}]},"return_type":{"abi_type":{"kind":"field"},"visibility":"private"},"return_witnesses":[2]},"bytecode":"H4sIAAAAAAAA/22KQQoAQAgCc0/7/wdHRRYRDYiiQpLnAnP4Z1coex1/WR8cee6NAftGOOF1AAAA"};
+
+export async function pedersen_left_right(left: Field, right: Field, foreignCallHandler?: ForeignCallHandler): Promise<Field> {
+  const program = new Noir(pedersen_left_right_circuit);
+  const args: InputMap = { left, right };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as Field;
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/publish_batch.ts b/momiji-helpers/circuits/helpers/codegen/publish_batch.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e7362b79870fe00e41685731c1d78baf34b6f79d
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/publish_batch.ts
@@ -0,0 +1,65 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+export type HistoricTreeInput = {
+  root: Field;
+  leaf: Field;
+  index: Field;
+  path: Field[];
+  utxo_roots: Field[];
+};
+
+export type VerifierTx = {
+  key_hash: Field;
+  verification_key: Field[];
+  proof: Field[];
+};
+
+export type Verifier = {
+  key_hash: Field;
+  verification_key: Field[];
+  proof: Field[];
+  aggregation_object: Field[];
+};
+
+export type HistoricTree = {
+  root: Field;
+  new_root: Field;
+  leaf: Field;
+  index: Field;
+  old_path: Field[];
+  new_path: Field[];
+};
+
+export type Batch = {
+  hist_tree: HistoricTree;
+  old_state_root: Field;
+  new_state_root: Field;
+  batch_oracle: Field;
+  utxo_roots: Field[];
+};
+
+export type PublishInputs = {
+  pi_contract_hash: Field;
+  accumulator: Field;
+  batch: Batch;
+  tx_verifier: VerifierTx;
+  recursion_verifier: Verifier;
+};
+
+
+export const publish_batch_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"accumulator","type":{"kind":"field"},"visibility":"private"},{"name":"hist_tree_input","type":{"kind":"struct","path":"structs::HistoricTreeInput","fields":[{"name":"root","type":{"kind":"field"}},{"name":"leaf","type":{"kind":"field"}},{"name":"index","type":{"kind":"field"}},{"name":"path","type":{"kind":"array","length":20,"type":{"kind":"field"}}},{"name":"utxo_roots","type":{"kind":"array","length":16,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"tx_verifier","type":{"kind":"struct","path":"structs::VerifierTx","fields":[{"name":"key_hash","type":{"kind":"field"}},{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}}},{"name":"proof","type":{"kind":"array","length":93,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"recursion_verifier","type":{"kind":"struct","path":"structs::Verifier","fields":[{"name":"key_hash","type":{"kind":"field"}},{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}}},{"name":"proof","type":{"kind":"array","length":109,"type":{"kind":"field"}}},{"name":"aggregation_object","type":{"kind":"array","length":16,"type":{"kind":"field"}}}]},"visibility":"private"}],"param_witnesses":{"accumulator":[{"start":0,"end":1}],"hist_tree_input":[{"start":1,"end":40}],"recursion_verifier":[{"start":248,"end":488}],"tx_verifier":[{"start":40,"end":248}]},"return_type":{"abi_type":{"kind":"struct","path":"structs::PublishInputs","fields":[{"name":"pi_contract_hash","type":{"kind":"field"}},{"name":"accumulator","type":{"kind":"field"}},{"name":"batch","type":{"kind":"struct","path":"structs::Batch","fields":[{"name":"hist_tree","type":{"kind":"struct","path":"structs::HistoricTree","fields":[{"name":"root","type":{"kind":"field"}},{"name":"new_root","type":{"kind":"field"}},{"name":"leaf","type":{"kind":"field"}},{"name":"index","type":{"kind":"field"}},{"name":"old_path","type":{"kind":"array","length":20,"type":{"kind":"field"}}},{"name":"new_path","type":{"kind":"array","length":20,"type":{"kind":"field"}}}]}},{"name":"old_state_root","type":{"kind":"field"}},{"name":"new_state_root","type":{"kind":"field"}},{"name":"batch_oracle","type":{"kind":"field"}},{"name":"utxo_roots","type":{"kind":"array","length":16,"type":{"kind":"field"}}}]}},{"name":"tx_verifier","type":{"kind":"struct","path":"structs::VerifierTx","fields":[{"name":"key_hash","type":{"kind":"field"}},{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}}},{"name":"proof","type":{"kind":"array","length":93,"type":{"kind":"field"}}}]}},{"name":"recursion_verifier","type":{"kind":"struct","path":"structs::Verifier","fields":[{"name":"key_hash","type":{"kind":"field"}},{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}}},{"name":"proof","type":{"kind":"array","length":109,"type":{"kind":"field"}}},{"name":"aggregation_object","type":{"kind":"array","length":16,"type":{"kind":"field"}}}]}}]},"visibility":"public"},"return_witnesses":[27871,0,1,1213,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,1114,1119,1124,1129,1134,1139,1144,1149,1154,1159,1164,1169,1174,1179,1184,1189,1194,1199,1204,1209,2,505,503,24,25,26,27,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,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487]},"bytecode":"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"};
+
+export async function publish_batch(accumulator: Field, hist_tree_input: HistoricTreeInput, tx_verifier: VerifierTx, recursion_verifier: Verifier, foreignCallHandler?: ForeignCallHandler): Promise<PublishInputs> {
+  const program = new Noir(publish_batch_circuit);
+  const args: InputMap = { accumulator, hist_tree_input, tx_verifier, recursion_verifier };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as PublishInputs;
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/rollup_transaction.ts b/momiji-helpers/circuits/helpers/codegen/rollup_transaction.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4e6748c7a0af832349bdde370dfe43f61b582476
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/rollup_transaction.ts
@@ -0,0 +1,51 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+export type VerifierTx = {
+  key_hash: Field;
+  verification_key: Field[];
+  proof: Field[];
+};
+
+export type Verifier = {
+  key_hash: Field;
+  verification_key: Field[];
+  proof: Field[];
+  aggregation_object: Field[];
+};
+
+export type PublicInputs = {
+  current_root: Field;
+  utxo_root: Field;
+  deposit_amount: Field;
+  withdrawals: Field;
+  commitment_in: Field[];
+  commitment_out: Field[];
+  nullifier_hashes: Field[];
+  contract_only_inputs: Field;
+};
+
+export type RecursionInputs = {
+  accumulator: Field;
+  tx_verifier: VerifierTx;
+  recursion_verifier: Verifier;
+  previous_accumulator: Field;
+  tx: PublicInputs;
+};
+
+
+export const rollup_transaction_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"tx_verifier","type":{"kind":"struct","path":"structs::VerifierTx","fields":[{"name":"key_hash","type":{"kind":"field"}},{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}}},{"name":"proof","type":{"kind":"array","length":93,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"recursion_verifier","type":{"kind":"struct","path":"structs::Verifier","fields":[{"name":"key_hash","type":{"kind":"field"}},{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}}},{"name":"proof","type":{"kind":"array","length":109,"type":{"kind":"field"}}},{"name":"aggregation_object","type":{"kind":"array","length":16,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"previous_accumulator","type":{"kind":"field"},"visibility":"private"},{"name":"tx","type":{"kind":"struct","path":"structs::PublicInputs","fields":[{"name":"current_root","type":{"kind":"field"}},{"name":"utxo_root","type":{"kind":"field"}},{"name":"deposit_amount","type":{"kind":"field"}},{"name":"withdrawals","type":{"kind":"field"}},{"name":"commitment_in","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"commitment_out","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"nullifier_hashes","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"contract_only_inputs","type":{"kind":"field"}}]},"visibility":"private"}],"param_witnesses":{"previous_accumulator":[{"start":448,"end":449}],"recursion_verifier":[{"start":208,"end":448}],"tx":[{"start":449,"end":502}],"tx_verifier":[{"start":0,"end":208}]},"return_type":{"abi_type":{"kind":"struct","path":"structs::RecursionInputs","fields":[{"name":"accumulator","type":{"kind":"field"}},{"name":"tx_verifier","type":{"kind":"struct","path":"structs::VerifierTx","fields":[{"name":"key_hash","type":{"kind":"field"}},{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}}},{"name":"proof","type":{"kind":"array","length":93,"type":{"kind":"field"}}}]}},{"name":"recursion_verifier","type":{"kind":"struct","path":"structs::Verifier","fields":[{"name":"key_hash","type":{"kind":"field"}},{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}}},{"name":"proof","type":{"kind":"array","length":109,"type":{"kind":"field"}}},{"name":"aggregation_object","type":{"kind":"array","length":16,"type":{"kind":"field"}}}]}},{"name":"previous_accumulator","type":{"kind":"field"}},{"name":"tx","type":{"kind":"struct","path":"structs::PublicInputs","fields":[{"name":"current_root","type":{"kind":"field"}},{"name":"utxo_root","type":{"kind":"field"}},{"name":"deposit_amount","type":{"kind":"field"}},{"name":"withdrawals","type":{"kind":"field"}},{"name":"commitment_in","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"commitment_out","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"nullifier_hashes","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"contract_only_inputs","type":{"kind":"field"}}]}}]},"visibility":"public"},"return_witnesses":[6360,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,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,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501]},"bytecode":"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"};
+
+export async function rollup_transaction(tx_verifier: VerifierTx, recursion_verifier: Verifier, previous_accumulator: Field, tx: PublicInputs, foreignCallHandler?: ForeignCallHandler): Promise<RecursionInputs> {
+  const program = new Noir(rollup_transaction_circuit);
+  const args: InputMap = { tx_verifier, recursion_verifier, previous_accumulator, tx };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as RecursionInputs;
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/tx_as_hash.ts b/momiji-helpers/circuits/helpers/codegen/tx_as_hash.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1ca401c9518475a25e7a9ea0f039910aa2118924
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/tx_as_hash.ts
@@ -0,0 +1,30 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+export type PublicInputs = {
+  current_root: Field;
+  utxo_root: Field;
+  deposit_amount: Field;
+  withdrawals: Field;
+  commitment_in: Field[];
+  commitment_out: Field[];
+  nullifier_hashes: Field[];
+  contract_only_inputs: Field;
+};
+
+
+export const tx_as_hash_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"tx","type":{"kind":"struct","path":"structs::PublicInputs","fields":[{"name":"current_root","type":{"kind":"field"}},{"name":"utxo_root","type":{"kind":"field"}},{"name":"deposit_amount","type":{"kind":"field"}},{"name":"withdrawals","type":{"kind":"field"}},{"name":"commitment_in","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"commitment_out","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"nullifier_hashes","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"contract_only_inputs","type":{"kind":"field"}}]},"visibility":"private"}],"param_witnesses":{"tx":[{"start":0,"end":53}]},"return_type":{"abi_type":{"kind":"field"},"visibility":"private"},"return_witnesses":[53]},"bytecode":"H4sIAAAAAAAA/13R1QpCURRFUdtrd3d36///mag4FPGADLlve65w6P1uz1/Y/5eBb5939/1lhFHGGGeCSQZMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuv/Oz4a8huEXvF7JSwT2CXtD2ydsjrX9S9rHdV57q+TV3benZ17Os31G2s11SnuT5LXdZ6bHXYu//o7rN7r393/d/6fQ/p5LXj2QIAAA=="};
+
+export async function tx_as_hash(tx: PublicInputs, foreignCallHandler?: ForeignCallHandler): Promise<Field> {
+  const program = new Noir(tx_as_hash_circuit);
+  const args: InputMap = { tx };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as Field;
+}
diff --git a/momiji-helpers/circuits/helpers/codegen/utxo_to_commitment.ts b/momiji-helpers/circuits/helpers/codegen/utxo_to_commitment.ts
new file mode 100644
index 0000000000000000000000000000000000000000..853b3fdf3ce547cc04df8780b17d3079222e63a0
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/codegen/utxo_to_commitment.ts
@@ -0,0 +1,25 @@
+/* Autogenerated file, do not edit! */
+
+/* eslint-disable */
+
+import { Noir, InputMap, CompiledCircuit, ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type { ForeignCallHandler } from "@noir-lang/noir_js"
+
+export type Field = string;
+
+export type UTXO_New = {
+  secret: Field;
+  amount: Field;
+  asset_type: Field;
+};
+
+
+export const utxo_to_commitment_circuit: CompiledCircuit = {"abi":{"parameters":[{"name":"utxo","type":{"kind":"struct","path":"structs::UTXO_New","fields":[{"name":"secret","type":{"kind":"field"}},{"name":"amount","type":{"kind":"field"}},{"name":"asset_type","type":{"kind":"field"}}]},"visibility":"private"}],"param_witnesses":{"utxo":[{"start":0,"end":3}]},"return_type":{"abi_type":{"kind":"field"},"visibility":"private"},"return_witnesses":[4]},"bytecode":"H4sIAAAAAAAA/11MWwoAMAjqsY/d/8CyYAaWIJaKbh+nGLy9eKkNUFPyFA/0wR3Irkm392P92h14YkM2CqEAAAA="};
+
+export async function utxo_to_commitment(utxo: UTXO_New, foreignCallHandler?: ForeignCallHandler): Promise<Field> {
+  const program = new Noir(utxo_to_commitment_circuit);
+  const args: InputMap = { utxo };
+  const { returnValue } = await program.execute(args, foreignCallHandler);
+  return returnValue as Field;
+}
diff --git a/momiji-helpers/circuits/helpers/src/hash.nr b/momiji-helpers/circuits/helpers/src/hash.nr
new file mode 100644
index 0000000000000000000000000000000000000000..7196acf2969d338d6cc917bbb82385fa0735a2f6
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/src/hash.nr
@@ -0,0 +1,267 @@
+use dep::std;
+use crate::structs;
+
+fn field_to_u8(_value: Field) -> [u8; 32] {
+    let _array = _value.to_be_bytes(32);
+    let mut array: [u8; 32] = [0; 32];
+
+    for i in 0 .. 32 {
+        array[i] = _array[i];
+    }
+
+    array
+}
+
+fn hash<N>(data: [Field; N]) -> Field {
+    std::hash::pedersen_hash(data)
+}
+
+#[export]
+fn utxo_to_commitment(utxo: structs::UTXO_New) -> Field {
+    utxo.to_commitment()
+}
+
+#[export]
+fn pedersen_left_right(left: Field, right: Field) -> Field {
+    std::hash::pedersen_hash([left, right])
+}
+
+#[export]
+fn keccak_tx(tx: structs::PublicInputs) -> Field {
+    let mut hash_array: [Field; 53] = [0; 53];
+    hash_array[0] = tx.current_root;
+    hash_array[1] = tx.utxo_root;
+    hash_array[2] = tx.deposit_amount;
+    hash_array[3] = tx.contract_only_inputs;
+    hash_array[4] = tx.withdrawals;
+    for i in 0..16 {
+        hash_array[5 + i] = tx.commitment_in[i];
+        hash_array[21 + i] = tx.commitment_out[i];
+        hash_array[37 + i] = tx.nullifier_hashes[i];
+    }
+    let u8_array = tx_to_u8(hash_array);
+    hash_to_field(std::hash::keccak256(u8_array, u8_array.len() as u32))
+}
+
+fn bytes_tx_without_deposit(tx: structs::PublicInputs) -> [u8; 1696] {
+    let mut hash_array: [Field; 53] = [0; 53];
+    hash_array[0] = tx.current_root;
+    hash_array[1] = tx.utxo_root;
+    hash_array[2] = tx.deposit_amount;
+    hash_array[3] = tx.contract_only_inputs;
+    hash_array[4] = tx.withdrawals;
+    for i in 0..16 {
+        hash_array[5 + i] = tx.commitment_in[i];
+        hash_array[21 + i] = tx.commitment_out[i];
+        hash_array[37 + i] = tx.nullifier_hashes[i];
+    }
+    tx_to_u8(hash_array)
+}
+
+#[export]
+fn keccak_contract_only_inputs(contract_only_inputs: structs::ContractOnlyInputs) -> Field {
+    let mut hash_array: [Field; 100] = [0; 100];
+    hash_array[0] = contract_only_inputs.timestamp;
+    hash_array[1] = contract_only_inputs.deadline;
+    hash_array[2] = contract_only_inputs.signature_hash;
+    hash_array[3] = contract_only_inputs.price_limit;
+    for i in 0..16 {
+        hash_array[4 + i] = contract_only_inputs.recipients[i];
+        hash_array[20 + i] = contract_only_inputs.swap_amounts[i];
+        hash_array[36 + i] = contract_only_inputs.uids[i];
+        hash_array[52 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].secret;
+        hash_array[53 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].amount;
+        hash_array[54 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].data;
+    }
+    let u8_array = contract_only_to_u8(hash_array);
+    hash_to_field(std::hash::keccak256(u8_array, u8_array.len() as u32))
+}
+
+#[export]
+fn keccak_contract_only_inputs_without_deposit(contract_only_inputs: structs::ContractOnlyInputs) -> Field {
+    let mut hash_array: [Field; 99] = [0; 99];
+    hash_array[0] = contract_only_inputs.timestamp;
+    hash_array[1] = contract_only_inputs.deadline;
+    hash_array[2] = contract_only_inputs.price_limit;
+    for i in 0..16 {
+        hash_array[3 + i] = contract_only_inputs.recipients[i];
+        hash_array[19 + i] = contract_only_inputs.swap_amounts[i];
+        hash_array[35 + i] = contract_only_inputs.uids[i];
+        hash_array[51 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].secret;
+        hash_array[52 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].amount;
+        hash_array[53 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].data;
+    }
+    let u8_array = contract_only_without_deposit_to_u8(hash_array);
+    hash_to_field(std::hash::keccak256(u8_array, u8_array.len() as u32))
+}
+
+fn bytes_contract_only_inputs_without_deposit(contract_only_inputs: structs::ContractOnlyInputs) -> [u8; 3168] {
+    let mut hash_array: [Field; 99] = [0; 99];
+    hash_array[0] = contract_only_inputs.timestamp;
+    hash_array[1] = contract_only_inputs.deadline;
+    hash_array[2] = contract_only_inputs.price_limit;
+    for i in 0..16 {
+        hash_array[3 + i] = contract_only_inputs.recipients[i];
+        hash_array[19 + i] = contract_only_inputs.swap_amounts[i];
+        hash_array[35 + i] = contract_only_inputs.uids[i];
+        hash_array[51 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].secret;
+        hash_array[52 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].amount;
+        hash_array[53 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].data;
+    }
+    contract_only_without_deposit_to_u8(hash_array)
+}
+
+#[export]
+fn contract_only_inputs_with_signature_hash(contract_only_inputs: structs::ContractOnlyInputs) -> structs::ContractOnlyInputs {
+    let mut hash_array: [Field; 99] = [0; 99];
+    hash_array[0] = contract_only_inputs.timestamp;
+    hash_array[1] = contract_only_inputs.deadline;
+    hash_array[2] = contract_only_inputs.price_limit;
+    for i in 0..16 {
+        hash_array[3 + i] = contract_only_inputs.recipients[i];
+        hash_array[19 + i] = contract_only_inputs.swap_amounts[i];
+        hash_array[35 + i] = contract_only_inputs.uids[i];
+        hash_array[51 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].secret;
+        hash_array[52 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].amount;
+        hash_array[53 + (i * 3)] = contract_only_inputs.encrypted_utxo[i].data;
+    }
+    let u8_array = contract_only_without_deposit_to_u8(hash_array);
+    let contract_only_inputs_with_hash = structs::ContractOnlyInputs {
+        timestamp: contract_only_inputs.timestamp,
+        deadline: contract_only_inputs.deadline,
+        signature_hash: hash_to_field(std::hash::keccak256(u8_array, u8_array.len() as u32)),
+        price_limit: contract_only_inputs.price_limit,
+        recipients: contract_only_inputs.recipients,
+        swap_amounts: contract_only_inputs.swap_amounts,
+        uids: contract_only_inputs.uids,
+        encrypted_utxo: contract_only_inputs.encrypted_utxo
+    };
+    contract_only_inputs_with_hash
+}
+
+fn hash_tx(tx: structs::PublicInputs) -> Field {
+    let mut hash_array: [Field; 53] = [0; 53];
+    hash_array[0] = tx.current_root;
+    hash_array[1] = tx.utxo_root;
+    hash_array[2] = tx.deposit_amount;
+    hash_array[3] = tx.withdrawals;
+    for i in 0..16 {
+        hash_array[4 + i] = tx.commitment_in[i];
+        hash_array[20 + i] = tx.commitment_out[i];
+        hash_array[36 + i] = tx.nullifier_hashes[i];
+    }
+    hash_array[52] = tx.contract_only_inputs;
+    hash(hash_array)
+}
+
+fn hash_to_field(hash: [u8; 32]) -> Field {
+    let mut keccak_field: Field = 0;    
+    for p in 0..32 {
+        let bytes_field: Field = hash[31 - p] as Field;
+        keccak_field += bytes_field * 256.pow_32(p as Field);
+    }
+
+    keccak_field
+}
+
+
+fn tx_to_u8(pi_fields: [Field; 53]) -> [u8; 1696] {
+    let mut keccak_array: [u8; 1696] = [0; 1696];
+    for i in 0..pi_fields.len() {
+        let mut byte_slice = pi_fields[i].to_be_bytes(32);
+        for j in 0..32 {
+            keccak_array[32*i + j] = byte_slice[j];
+        }
+    }
+
+    keccak_array
+}
+
+fn contract_only_to_u8(pi_fields: [Field; 100]) -> [u8; 3200] {
+    let mut keccak_array: [u8; 3200] = [0; 3200];
+    for i in 0..pi_fields.len() {
+        let mut byte_slice = pi_fields[i].to_be_bytes(32);
+        for j in 0..32 {
+            keccak_array[32*i + j] = byte_slice[j];
+        }
+    }
+
+    keccak_array
+}
+
+fn contract_only_without_deposit_to_u8(pi_fields: [Field; 99]) -> [u8; 3168] {
+    let mut keccak_array: [u8; 3168] = [0; 3168];
+    for i in 0..pi_fields.len() {
+        let mut byte_slice = pi_fields[i].to_be_bytes(32);
+        for j in 0..32 {
+            keccak_array[32*i + j] = byte_slice[j];
+        }
+    }
+
+    keccak_array
+}
+
+fn batch_to_u8(pi_fields: [Field; 19]) -> [u8; 608] {
+    let mut keccak_array: [u8; 608] = [0; 608];
+    for i in 0..pi_fields.len() {
+        let mut byte_slice = pi_fields[i].to_be_bytes(32);
+        for j in 0..32 {
+            keccak_array[32*i + j] = byte_slice[j];
+        }
+    }
+
+    keccak_array
+}
+
+fn hash_tree_four(leaves: [Field; 16]) -> Field {
+    let mut tx_tree: [Field; 16] = leaves;
+    for l in 0..8 { tx_tree[l] = hash([tx_tree[2*l], tx_tree[2*l + 1]]); }
+    for l in 0..4 { tx_tree[l] = hash([tx_tree[2*l], tx_tree[2*l + 1]]); }
+    for l in 0..2 { tx_tree[l] = hash([tx_tree[2*l], tx_tree[2*l + 1]]); }
+    hash([tx_tree[0], tx_tree[1]])
+}
+
+fn compute_merkle_root<N>(leaf: Field, index: Field, hash_path: [Field; N]) -> Field {
+    let n = hash_path.len();
+    let index_bits = index.to_le_bits(n as u32);
+    let mut current = leaf;
+    for i in 0..n {
+        let path_bit = index_bits[i] as bool;
+        let (hash_left, hash_right) = if path_bit {
+            (hash_path[i], current)
+        } else {
+            (current, hash_path[i])
+        };
+        current = hash([hash_left, hash_right]);
+    }
+    current
+}
+
+fn compute_sibling_path<N>(sibling_path: [Field; N], new_leaf: Field, insertion_index: Field) -> [Field; N] {
+    let index_bits: [u1] = insertion_index.to_le_bits(N as u32);
+    let mut new_sibling_path: [Field; N] = [0; N];
+    let mut current_hash: Field = new_leaf; 
+    let mut zero_found: bool = false;
+
+    for i in 0..N {
+        let path_bit = index_bits[i] as bool;
+        if (!zero_found) {
+            if (!path_bit) {
+                zero_found = true;
+                new_sibling_path[i] = current_hash;
+            } else {
+                new_sibling_path[i] = structs::zero_hashes[i];
+            }
+        } else {
+            new_sibling_path[i] = sibling_path[i];
+        }
+
+        if (path_bit) {
+            current_hash = hash([sibling_path[i], current_hash]);
+        } else {
+            current_hash = hash([current_hash, sibling_path[i]]);
+        }
+    }
+    new_sibling_path
+
+}
\ No newline at end of file
diff --git a/momiji-helpers/circuits/helpers/src/lib.nr b/momiji-helpers/circuits/helpers/src/lib.nr
new file mode 100644
index 0000000000000000000000000000000000000000..ef0976645853fa0d496a615b4f54272fbaf61e72
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/src/lib.nr
@@ -0,0 +1,363 @@
+use dep::std;
+mod structs;
+mod hash;
+
+global utxo_depth = 4;
+global batch_depth = 4;
+global state_depth = 20;
+global ZERO_VALUE = 0x016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720;
+
+// Levels of an empty pedersen Merkle tree with zero_leaf = sha256("Momiji") % Field Modulus
+global zero_hashes: [Field; 20] = [
+    0x016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720, 
+    0x018d39625c19fa2cfbebdb940a66d7040bb0ef1b59ff6afd92a13a6b9b2d9865, 
+    0x096c00ebc0c52478316b6b9fd16d0cd94c5f45bbe45bbfa8c606197c6119d41f, 
+    0x2eaefd3bdd1bfbddd8fc5d972ded58617f752b3e88bd17b791e85e7b8eaacb47, 
+    0x11d25ff6aa8a431fbce8e8d9a87a2d7986adf38e724fbe47f15752d0931f14d8, 
+    0x01e8677aa02546bd7105a7a9fd31c4ef16b69d1bde90f36e97585d7cc31d50e4, 
+    0x2520a755a532994c78f35b89938fbc864ec31ec4fc00363f83f9b12f04980c6a, 
+    0x21a666842842d5323e51fdda10300c763d6b07e1b797ef3b0bd3690d667445bc, 
+    0x1ce681d6f42b70668c369e7f786166e421dc840f0529bbd065d6b02d14ae0fe8, 
+    0x1819b90a43ee28f652735708b2ef01428e21b84872bb3c7576de6e35d107c8ed, 
+    0x063d7001431110a5949f5946a501fd28f64159f36ab4b80601ca305ac107b3db, 
+    0x09aeef7a06f7daf368d797c2e686c7e9884f000de0bd9d8e73392378b0b1be38, 
+    0x137121fd5d795eeecc61ec6a6de66abc589d241540139178cd5408b6ccb32a6e, 
+    0x01a93f70a1b7482e0b32e76ce49a1e3c1fc2b5cd4789b6af749d78c42791c21a, 
+    0x217bf2cc1f1b505a29b162a7889866af2728f5c6708560c9cc5e987b194c9c81, 
+    0x1461dae57d7df7e580279637e5d94e0d734b908dc22aec5c52ed00187050a030, 
+    0x295933dd65294cbf4b2c64d8a0daa6983d35d1f64d5adc2c44bd9d370086d7dc, 
+    0x24650084f0db0fa4e8234fb251ad046b3ddcb7d6f59160b35cc4086e9e196b80, 
+    0x15086d0394bd68847e3e36241cc7b3966f96efdd30a37e9e1e85027a6dacbed2, 
+    0x1f87a17564f06581c1e1b2d716120990f898893ecc0e076363c56c5e3b56ef7b
+    ];
+
+global zero_root: Field = 0x06f93f503e77fcdcacfe622e66adc639b63e8c0083f5cab5d71d461aa4562c92;
+
+#[export]
+fn keccak_tx_with_deposit(
+    current_root: Field,
+    deposit_amount: Field,
+    withdrawals: [Field; 16],
+    utxo_spendable: [structs::UTXO_Spendable; 16],
+    utxo_new: [structs::UTXO_New; 16],
+    contract_only_inputs: structs::ContractOnlyInputs
+    
+) -> Field {
+    let withdrawal_amount: Field = withdrawals.reduce(|a,b| a + b);
+    let mut commitment_in: [Field; 16] = [ZERO_VALUE; 16];
+    let mut commitment_out: [Field; 16] = [ZERO_VALUE; 16];
+    let mut utxo_root: Field = 0;
+    let empty_utxo = structs::UTXO {owner: 0, amount: ZERO_VALUE, asset_type: 0};
+    let mut utxo_out: [structs::UTXO; 16] = [empty_utxo; 16];
+
+    let mut secrets: [Field; 16] = [0; 16];
+    let mut oracle: [Field; 16] = [ZERO_VALUE; 16];
+    let mut old_root_proof: [Field; 16] = [0; 16];
+
+    let mut utxo_in: [structs::UTXO; 16] = [empty_utxo; 16];
+    let mut nullifier_hashes: [Field; 16] = [ZERO_VALUE; 16];
+    let empty_merkle_proofs = structs::MerkleProof {
+        path_utxo: [0; utxo_depth],
+        path_tx: [0; batch_depth],
+        path_historic: [0; state_depth],
+        index_utxo: 0,
+        index_tx: 0,
+        index_historic: 0
+    };
+    let mut merkle_proofs: [structs::MerkleProof; 16] = [empty_merkle_proofs; 16];
+
+    for i in 0..16 {
+        if (utxo_spendable[i].amount != ZERO_VALUE) {
+            utxo_in[i] = structs::UTXO {owner: utxo_spendable[i].owner(), amount: utxo_spendable[i].amount, asset_type: utxo_spendable[i].asset_type};
+            secrets[i] = utxo_spendable[i].secret;
+            nullifier_hashes[i] = utxo_spendable[i].nullifier_hash();
+            commitment_in[i] = utxo_spendable[i].to_commitment();
+            if (utxo_spendable[i].spend_in_same_batch == false) {
+                commitment_in[i] = ZERO_VALUE;
+                old_root_proof[i] = utxo_spendable[i].old_root_proof;
+                merkle_proofs[i] = utxo_spendable[i].merkle_proof;
+            }
+            
+        }
+
+        if (utxo_new[i].secret != 0) {
+            commitment_out[i] = utxo_new[i].to_commitment();
+            utxo_out[i] = structs::UTXO { owner: utxo_new[i].owner(), amount: utxo_new[i].amount, asset_type: utxo_new[i].asset_type };
+        }
+    }
+    utxo_root = hash::hash_tree_four(commitment_out);
+    let public_inputs = structs::PublicInputs {
+        current_root: current_root,
+        utxo_root: utxo_root,
+        deposit_amount: deposit_amount,
+        withdrawals: withdrawal_amount,
+        commitment_in: commitment_in,
+        commitment_out: commitment_out,
+        nullifier_hashes: nullifier_hashes,
+        contract_only_inputs: contract_only_inputs.as_keccak()
+    };
+
+    public_inputs.as_keccak()
+
+}
+
+#[export]
+fn keccak_tx_no_deposit(
+    current_root: Field,
+    deposit_amount: Field,
+    withdrawals: [Field; 16],
+    utxo_spendable: [structs::UTXO_Spendable; 16],
+    utxo_new: [structs::UTXO_New; 16],
+    contract_only_inputs: structs::ContractOnlyInputs
+    
+) -> Field {
+    let withdrawal_amount: Field = withdrawals.reduce(|a,b| a + b);
+    let mut commitment_in: [Field; 16] = [ZERO_VALUE; 16];
+    let mut commitment_out: [Field; 16] = [ZERO_VALUE; 16];
+    let mut utxo_root: Field = 0;
+    let empty_utxo = structs::UTXO {owner: 0, amount: ZERO_VALUE, asset_type: 0};
+    let mut utxo_out: [structs::UTXO; 16] = [empty_utxo; 16];
+
+    let mut secrets: [Field; 16] = [0; 16];
+    let mut oracle: [Field; 16] = [ZERO_VALUE; 16];
+    let mut old_root_proof: [Field; 16] = [0; 16];
+
+    let mut utxo_in: [structs::UTXO; 16] = [empty_utxo; 16];
+    let mut nullifier_hashes: [Field; 16] = [ZERO_VALUE; 16];
+    let empty_merkle_proofs = structs::MerkleProof {
+        path_utxo: [0; utxo_depth],
+        path_tx: [0; batch_depth],
+        path_historic: [0; state_depth],
+        index_utxo: 0,
+        index_tx: 0,
+        index_historic: 0
+    };
+    let mut merkle_proofs: [structs::MerkleProof; 16] = [empty_merkle_proofs; 16];
+
+    for i in 0..16 {
+        if (utxo_spendable[i].amount != ZERO_VALUE) {
+            utxo_in[i] = structs::UTXO {owner: utxo_spendable[i].owner(), amount: utxo_spendable[i].amount, asset_type: utxo_spendable[i].asset_type};
+            secrets[i] = utxo_spendable[i].secret;
+            nullifier_hashes[i] = utxo_spendable[i].nullifier_hash();
+            commitment_in[i] = utxo_spendable[i].to_commitment();
+            if (utxo_spendable[i].spend_in_same_batch == false) {
+                commitment_in[i] = ZERO_VALUE;
+                old_root_proof[i] = utxo_spendable[i].old_root_proof;
+                merkle_proofs[i] = utxo_spendable[i].merkle_proof;
+            }
+            
+        }
+
+        if (utxo_new[i].secret != 0) {
+            commitment_out[i] = utxo_new[i].to_commitment();
+            utxo_out[i] = structs::UTXO { owner: utxo_new[i].owner(), amount: utxo_new[i].amount, asset_type: utxo_new[i].asset_type };
+        }
+    }
+    utxo_root = hash::hash_tree_four(commitment_out);
+    let public_inputs = structs::PublicInputs {
+        current_root: current_root,
+        utxo_root: utxo_root,
+        deposit_amount: deposit_amount,
+        withdrawals: withdrawal_amount,
+        commitment_in: commitment_in,
+        commitment_out: commitment_out,
+        nullifier_hashes: nullifier_hashes,
+        contract_only_inputs: contract_only_inputs.as_keccak_without_deposit()
+    };
+
+    public_inputs.as_keccak()
+
+}
+
+#[export]
+fn create_transaction(
+    current_root: Field,
+    deposit_amount: Field,
+    withdrawals: [Field; 16],
+    utxo_spendable: [structs::UTXO_Spendable; 16],
+    utxo_new: [structs::UTXO_New; 16],
+    contract_only_inputs: structs::ContractOnlyInputs
+
+) -> pub structs::TransactionInputs {
+    let withdrawal_amount: Field = withdrawals.reduce(|a,b| a + b);
+    let mut commitment_in: [Field; 16] = [ZERO_VALUE; 16];
+    let mut commitment_out: [Field; 16] = [ZERO_VALUE; 16];
+    let mut utxo_root: Field = 0;
+    let empty_utxo = structs::UTXO {owner: 0, amount: ZERO_VALUE, asset_type: 0};
+    let mut utxo_out: [structs::UTXO; 16] = [empty_utxo; 16];
+
+    let mut secrets: [Field; 16] = [0; 16];
+    let mut oracle: [Field; 16] = [ZERO_VALUE; 16];
+    let mut old_root_proof: [Field; 16] = [0; 16];
+
+    let mut utxo_in: [structs::UTXO; 16] = [empty_utxo; 16];
+    let mut nullifier_hashes: [Field; 16] = [ZERO_VALUE; 16];
+    let empty_merkle_proofs = structs::MerkleProof {
+        path_utxo: [0; utxo_depth],
+        path_tx: [0; batch_depth],
+        path_historic: [0; state_depth],
+        index_utxo: 0,
+        index_tx: 0,
+        index_historic: 0
+    };
+    let mut merkle_proofs: [structs::MerkleProof; 16] = [empty_merkle_proofs; 16];
+
+    for i in 0..16 {
+        if (utxo_spendable[i].amount != ZERO_VALUE) {
+            utxo_in[i] = structs::UTXO {owner: utxo_spendable[i].owner(), amount: utxo_spendable[i].amount, asset_type: utxo_spendable[i].asset_type};
+            secrets[i] = utxo_spendable[i].secret;
+            nullifier_hashes[i] = utxo_spendable[i].nullifier_hash();
+            commitment_in[i] = utxo_spendable[i].to_commitment();
+            if (utxo_spendable[i].spend_in_same_batch == false) {
+                commitment_in[i] = ZERO_VALUE;
+                old_root_proof[i] = utxo_spendable[i].old_root_proof;
+                merkle_proofs[i] = utxo_spendable[i].merkle_proof;
+            }
+            
+        }
+
+        if (utxo_new[i].secret != 0) {
+            commitment_out[i] = utxo_new[i].to_commitment();
+            utxo_out[i] = structs::UTXO { owner: utxo_new[i].owner(), amount: utxo_new[i].amount, asset_type: utxo_new[i].asset_type };
+        }
+    }
+    utxo_root = hash::hash_tree_four(commitment_out);
+    let public_inputs = structs::PublicInputs {
+        current_root: current_root,
+        utxo_root: utxo_root,
+        deposit_amount: deposit_amount,
+        withdrawals: withdrawal_amount,
+        commitment_in: commitment_in,
+        commitment_out: commitment_out,
+        nullifier_hashes: nullifier_hashes,
+        contract_only_inputs: contract_only_inputs.as_keccak()
+    };
+
+    let private_inputs = structs::PrivateInputs {
+        oracle: oracle,
+        old_root_proof: old_root_proof,
+        secrets: secrets,
+        utxo_in: utxo_in,
+        merkle_proofs: merkle_proofs,
+        utxo_out: utxo_out
+    };
+
+    let public_inputs_hash: Field = hash::hash_tx(public_inputs);
+
+    let transaction_inputs = structs::TransactionInputs {
+        public_inputs_hash: public_inputs_hash,
+        public_inputs: public_inputs,
+        private_inputs: private_inputs
+    };
+
+    transaction_inputs
+
+}
+
+#[export]
+fn tx_as_hash(
+    tx: structs::PublicInputs
+) -> Field {
+    tx.as_hash()
+}
+
+
+#[export]
+fn rollup_transaction(
+    tx_verifier: structs::VerifierTx,
+    recursion_verifier: structs::Verifier,
+    previous_accumulator: Field,
+    tx: structs::PublicInputs
+) -> pub structs::RecursionInputs {
+
+    let tx_as_keccak: Field = tx.as_keccak();
+
+    let mut accumulator_preimage: [u8; 128] = [0; 128];
+    for i in 0..32 {
+        accumulator_preimage[i] = hash::field_to_u8(previous_accumulator)[i];
+        accumulator_preimage[i + 32] = hash::field_to_u8(tx_as_keccak)[i];
+        accumulator_preimage[i + 64] = hash::field_to_u8(tx_verifier.key_hash)[i];
+        accumulator_preimage[i + 96] = hash::field_to_u8(recursion_verifier.key_hash)[i];
+    }
+
+    let accumulator: Field = hash::hash_to_field(std::hash::keccak256(accumulator_preimage, accumulator_preimage.len() as u32));
+
+    let recursion_inputs = structs::RecursionInputs {
+        accumulator: accumulator,
+        tx_verifier: tx_verifier,
+        recursion_verifier: recursion_verifier,
+        previous_accumulator: previous_accumulator,
+        tx: tx
+    };
+
+    recursion_inputs
+}
+
+
+#[export]
+fn publish_batch(
+    accumulator: Field,
+    hist_tree_input: structs::HistoricTreeInput,
+    tx_verifier: structs::VerifierTx,
+    recursion_verifier: structs::Verifier
+) -> pub structs::PublishInputs {
+
+    let old_state_root: Field = hist_tree_input.leaf;
+    let tx_root: Field = hash::hash_tree_four(hist_tree_input.utxo_roots);
+    let batch_oracle: Field = ZERO_VALUE;
+    let batch_root: Field = hash::hash([tx_root, batch_oracle]);
+    let new_state_root: Field = hash::hash([batch_root, old_state_root]);
+    let new_historic_path: [Field; state_depth] = hash::compute_sibling_path(
+        hist_tree_input.path, 
+        hist_tree_input.leaf, 
+        hist_tree_input.index
+    );
+
+    let new_historic_root: Field = hash::compute_merkle_root(
+        new_state_root,
+        hist_tree_input.index + 1,
+        new_historic_path
+    );
+
+    let hist_tree = structs::HistoricTree {
+        root: hist_tree_input.root,
+        new_root: new_historic_root,
+        leaf: hist_tree_input.leaf,
+        index: hist_tree_input.index,
+        old_path: hist_tree_input.path,
+        new_path: new_historic_path
+    };
+
+    let batch = structs::Batch {
+        hist_tree: hist_tree,
+        old_state_root: old_state_root,
+        new_state_root: new_state_root,
+        batch_oracle: batch_oracle,
+        utxo_roots: hist_tree_input.utxo_roots
+    };
+
+    let mut hash_validation: [u8; 832] = [0; 832];
+    for i in 0..32 {
+        hash_validation[i] = hash::field_to_u8(batch.new_state_root)[i];
+        hash_validation[i + 32] = hash::field_to_u8(batch.hist_tree.root)[i];
+        hash_validation[i + 64] = hash::field_to_u8(batch.hist_tree.new_root)[i];
+        hash_validation[i + 96] = hash::field_to_u8(accumulator)[i];
+        hash_validation[i + 128] = hash::field_to_u8(tx_verifier.key_hash)[i];
+        hash_validation[i + 160] = hash::field_to_u8(recursion_verifier.key_hash)[i];
+        for j in 0..20 {
+            hash_validation[i + 192 + (32 * j)] = hash::field_to_u8(batch.hist_tree.new_path[j])[i];
+        }
+    }
+
+    let pi_contract_hash: Field = hash::hash_to_field(std::hash::keccak256(hash_validation, hash_validation.len() as u32));
+
+    let publish_inputs = structs::PublishInputs {
+        pi_contract_hash: pi_contract_hash,
+        accumulator: accumulator,
+        batch: batch,
+        tx_verifier: tx_verifier,
+        recursion_verifier: recursion_verifier
+    };
+    publish_inputs
+
+}
\ No newline at end of file
diff --git a/momiji-helpers/circuits/helpers/src/structs.nr b/momiji-helpers/circuits/helpers/src/structs.nr
new file mode 100644
index 0000000000000000000000000000000000000000..081f466d42ed28463893fcf03d6449df7cf49453
--- /dev/null
+++ b/momiji-helpers/circuits/helpers/src/structs.nr
@@ -0,0 +1,253 @@
+use crate::hash;
+
+global utxo_depth = 4;
+global batch_depth = 4;
+global state_depth = 20;
+global ZERO_VALUE = 0x016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720;
+
+// Levels of an empty pedersen Merkle tree with zero_leaf = sha256("Momiji") % Field Modulus
+global zero_hashes: [Field; 20] = [
+    0x016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720, 
+    0x018d39625c19fa2cfbebdb940a66d7040bb0ef1b59ff6afd92a13a6b9b2d9865, 
+    0x096c00ebc0c52478316b6b9fd16d0cd94c5f45bbe45bbfa8c606197c6119d41f, 
+    0x2eaefd3bdd1bfbddd8fc5d972ded58617f752b3e88bd17b791e85e7b8eaacb47, 
+    0x11d25ff6aa8a431fbce8e8d9a87a2d7986adf38e724fbe47f15752d0931f14d8, 
+    0x01e8677aa02546bd7105a7a9fd31c4ef16b69d1bde90f36e97585d7cc31d50e4, 
+    0x2520a755a532994c78f35b89938fbc864ec31ec4fc00363f83f9b12f04980c6a, 
+    0x21a666842842d5323e51fdda10300c763d6b07e1b797ef3b0bd3690d667445bc, 
+    0x1ce681d6f42b70668c369e7f786166e421dc840f0529bbd065d6b02d14ae0fe8, 
+    0x1819b90a43ee28f652735708b2ef01428e21b84872bb3c7576de6e35d107c8ed, 
+    0x063d7001431110a5949f5946a501fd28f64159f36ab4b80601ca305ac107b3db, 
+    0x09aeef7a06f7daf368d797c2e686c7e9884f000de0bd9d8e73392378b0b1be38, 
+    0x137121fd5d795eeecc61ec6a6de66abc589d241540139178cd5408b6ccb32a6e, 
+    0x01a93f70a1b7482e0b32e76ce49a1e3c1fc2b5cd4789b6af749d78c42791c21a, 
+    0x217bf2cc1f1b505a29b162a7889866af2728f5c6708560c9cc5e987b194c9c81, 
+    0x1461dae57d7df7e580279637e5d94e0d734b908dc22aec5c52ed00187050a030, 
+    0x295933dd65294cbf4b2c64d8a0daa6983d35d1f64d5adc2c44bd9d370086d7dc, 
+    0x24650084f0db0fa4e8234fb251ad046b3ddcb7d6f59160b35cc4086e9e196b80, 
+    0x15086d0394bd68847e3e36241cc7b3966f96efdd30a37e9e1e85027a6dacbed2, 
+    0x1f87a17564f06581c1e1b2d716120990f898893ecc0e076363c56c5e3b56ef7b
+    ];
+
+//  sha256("Momiji") % Field Modulus
+global zero_root: Field = 0x06f93f503e77fcdcacfe622e66adc639b63e8c0083f5cab5d71d461aa4562c92;
+
+struct Verifier {
+    key_hash: Field,
+    verification_key: [Field; 114],
+    proof: [Field; 109],
+    aggregation_object: [Field; 16]
+}
+
+struct VerifierTx {
+    key_hash: Field,
+    verification_key: [Field; 114],
+    proof: [Field; 93]
+}
+
+impl Verifier {
+    fn as_fields(self) -> [Field; 208] {
+        let mut verifier_as_fields: [Field; 208] = [0; 208];
+        verifier_as_fields[0] = self.key_hash;
+        for i in 0..114 {
+            verifier_as_fields[i + 1] = self.verification_key[i];
+        }
+        for j in 0..93 {
+            verifier_as_fields[j + 115] = self.proof[j];
+        }
+        verifier_as_fields
+    }
+
+    fn concatenate(self) -> [Field; 109] {
+        let mut proof_with_agg: [Field; 109] = [0; 109];
+        for i in 0..16 {
+            proof_with_agg[i] = self.aggregation_object[i];
+        }
+        for j in 0..93 {
+            proof_with_agg[j + 16] = self.proof[j];
+        }
+        proof_with_agg
+    }
+}
+
+struct UTXO {
+    owner: Field,
+    amount: Field,
+    asset_type: Field
+}
+
+struct UTXO_New {
+    secret: Field,
+    amount: Field,
+    asset_type: Field
+}
+
+impl UTXO_New {
+    fn owner(self) -> Field {
+        hash::hash([self.secret])
+    }
+
+    fn nullifier_hash(self) -> Field {
+        hash::hash([self.secret, self.secret])
+    }
+
+    fn to_commitment(self) -> Field {
+        hash::hash([self.owner(), self.amount, self.asset_type])
+    }
+}
+
+struct UTXO_Spendable {
+    secret: Field,
+    amount: Field,
+    asset_type: Field,
+    oracle: Field,
+    old_root_proof: Field,
+    merkle_proof: MerkleProof,
+    spend_in_same_batch: bool
+}
+
+impl UTXO_Spendable {
+    fn owner(self) -> Field {
+        hash::hash([self.secret])
+    }
+
+    fn nullifier_hash(self) -> Field {
+        hash::hash([self.secret, self.secret])
+    }
+
+    fn to_commitment(self) -> Field {
+        hash::hash([self.owner(), self.amount, self.asset_type])
+    }
+}
+
+struct PublicInputs {
+    current_root: Field, 
+    utxo_root: Field,
+    deposit_amount: Field,
+    withdrawals: Field,
+    commitment_in: [Field; 16],
+    commitment_out: [Field; 16],
+    nullifier_hashes: [Field; 16],
+    contract_only_inputs: Field 
+}
+
+impl PublicInputs {
+    fn as_fields(self) -> [Field; 53] {
+        let mut public_fields: [Field; 53] = [0; 53];
+        public_fields[0] = self.current_root;
+        public_fields[1] = self.utxo_root;
+        public_fields[2] = self.deposit_amount;
+        public_fields[3] = self.withdrawals;
+        for i in 0..16 {        
+            public_fields[4 + i] = self.commitment_in[i];
+            public_fields[20 + i] = self.commitment_out[i];
+            public_fields[36 + i] = self.nullifier_hashes[i];
+        }
+        public_fields[50] = self.contract_only_inputs;
+        public_fields
+    }
+    fn as_hash(self) -> Field {
+        hash::hash_tx(self)
+    }
+    fn as_keccak(self) -> Field {
+        hash::keccak_tx(self)
+    }
+    fn as_u8(self) -> [u8; 1696] {
+        hash::tx_to_u8(self.as_fields())
+    }
+}
+
+struct PrivateInputs {
+    oracle: [Field; 16],
+    old_root_proof: [Field; 16],
+    secrets: [Field; 16],
+    utxo_in: [UTXO; 16], 
+    merkle_proofs: [MerkleProof; 16],
+    utxo_out: [UTXO; 16],
+}
+
+
+struct TransactionInputs {
+    public_inputs_hash: Field,
+    public_inputs: PublicInputs,
+    private_inputs: PrivateInputs
+}
+
+
+struct RecursionInputs {
+    accumulator: Field,
+    tx_verifier: VerifierTx,
+    recursion_verifier: Verifier,
+    previous_accumulator: Field,
+    tx: PublicInputs
+}
+
+
+struct PublishInputs {
+    pi_contract_hash: Field,
+    accumulator: Field,
+    batch: Batch,
+    tx_verifier: VerifierTx,
+    recursion_verifier: Verifier
+}
+
+struct Batch {
+    hist_tree: HistoricTree,
+    old_state_root: Field, 
+    new_state_root: Field, 
+    batch_oracle: Field, 
+    utxo_roots: [Field; 16]
+}
+
+struct EncryptedUTXO {
+    secret: Field,
+    amount: Field,
+    data: Field
+}
+
+struct ContractOnlyInputs {
+    timestamp: Field,
+    deadline: Field,
+    signature_hash: Field,
+    price_limit: Field,
+    recipients: [Field; 16],
+    swap_amounts: [Field; 16],
+    uids: [Field; 16],
+    encrypted_utxo: [EncryptedUTXO; 16]
+}
+
+impl ContractOnlyInputs {
+    fn as_keccak_without_deposit(self) -> Field {
+        hash::keccak_contract_only_inputs_without_deposit(self)
+    }
+
+    fn as_keccak(self) -> Field {
+        hash::keccak_contract_only_inputs(self)
+    }
+}
+
+struct MerkleProof {
+    path_utxo: [Field; utxo_depth],
+    path_tx: [Field; batch_depth],
+    path_historic: [Field; state_depth],
+    index_utxo: Field,
+    index_tx: Field,
+    index_historic: Field
+}
+
+struct HistoricTree {
+    root: Field,
+    new_root: Field,
+    leaf: Field,
+    index: Field,
+    old_path: [Field; state_depth],
+    new_path: [Field; state_depth],
+}
+
+struct HistoricTreeInput {
+    root: Field,
+    leaf: Field,
+    index: Field,
+    path: [Field; state_depth],
+    utxo_roots: [Field; 16],
+}
\ No newline at end of file
diff --git a/momiji-helpers/circuits/publish/Nargo.toml b/momiji-helpers/circuits/publish/Nargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..9a5819617af743f0dc2457f753b36c323d63f6ab
--- /dev/null
+++ b/momiji-helpers/circuits/publish/Nargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "publish"
+type = "bin"
+authors = [""]
+compiler_version = ">=0.19.2"
+
+[dependencies]
+helpers = { path = "../helpers" }
\ No newline at end of file
diff --git a/momiji-helpers/circuits/publish/Prover.toml b/momiji-helpers/circuits/publish/Prover.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/momiji-helpers/circuits/publish/Verifier.toml b/momiji-helpers/circuits/publish/Verifier.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/momiji-helpers/circuits/publish/contract/publish/plonk_vk.sol b/momiji-helpers/circuits/publish/contract/publish/plonk_vk.sol
new file mode 100644
index 0000000000000000000000000000000000000000..93cc63fd259d6e3e8d9dd238d94ef1cb8869a357
--- /dev/null
+++ b/momiji-helpers/circuits/publish/contract/publish/plonk_vk.sol
@@ -0,0 +1,2777 @@
+// Verification Key Hash: 066e0b06b13ec4c45dbeb0b625dbfab874ecdc411cdb43bae4346e880b09e16c
+// SPDX-License-Identifier: Apache-2.0
+// Copyright 2022 Aztec
+pragma solidity >=0.8.4;
+
+library UltraVerificationKey {
+    function verificationKeyHash() internal pure returns(bytes32) {
+        return 0x066e0b06b13ec4c45dbeb0b625dbfab874ecdc411cdb43bae4346e880b09e16c;
+    }
+
+    function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {
+        assembly {
+            mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000080000) // vk.circuit_size
+            mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000011) // vk.num_inputs
+            mstore(add(_vk, 0x40), 0x2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd) // vk.work_root
+            mstore(add(_vk, 0x60), 0x3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201) // vk.domain_inverse
+            mstore(add(_vk, 0x80), 0x174c5c19a31444028bb6368ff05acd095502e7d022af18c746a364dab4c7346e) // vk.Q1.x
+            mstore(add(_vk, 0xa0), 0x2e6d6b74f09bdcf37e2be6f0a05552f34840f8693d1c73edce05639d0698ea36) // vk.Q1.y
+            mstore(add(_vk, 0xc0), 0x243678b1fa4062f90887453567ef78c256421a5907513427b5c52aa3cb1e6a17) // vk.Q2.x
+            mstore(add(_vk, 0xe0), 0x10425e273dc8dd43dbb983a295f7f990b9475fca570f56f1d7f972166e5bf0d8) // vk.Q2.y
+            mstore(add(_vk, 0x100), 0x23b6836088c547e90ddfdb8146a5f7b3608aad75f4d0d5a050f119e6eea92c22) // vk.Q3.x
+            mstore(add(_vk, 0x120), 0x0cafbde5fed53b2d75343797c5718363f54c3b391730f7b49a8ae09cd79b8b20) // vk.Q3.y
+            mstore(add(_vk, 0x140), 0x06acf52ef347e83eae253c24631c08d66d76669d97c0cce87b0320363e0188bd) // vk.Q4.x
+            mstore(add(_vk, 0x160), 0x1f8257e9bfac704d9b0171c74f4f35ec94c608ae5ff55962db5bc4fd9e1aba89) // vk.Q4.y
+            mstore(add(_vk, 0x180), 0x11931c54c38fba5131f7a317e782a12a8e3e3726dc2eaa490049ce2ca8ca1cbb) // vk.Q_M.x
+            mstore(add(_vk, 0x1a0), 0x0565f2552174d90b7b0e9645969affd0015d483dffec9d93ede1b63be6dc3c16) // vk.Q_M.y
+            mstore(add(_vk, 0x1c0), 0x0bca92d0bac2e3d19be0265337ec7f4574f8195e313af04d651f342bb3159fb8) // vk.Q_C.x
+            mstore(add(_vk, 0x1e0), 0x1ecb4bbed3bfe4b4e91afe37b7871694eda583ff1d1111be20aa9eb8edf50a77) // vk.Q_C.y
+            mstore(add(_vk, 0x200), 0x0c1be01afc0073d9a1f1e23184a1d005a89d087265ea3a85f523ecd062212260) // vk.Q_ARITHMETIC.x
+            mstore(add(_vk, 0x220), 0x25a9e732ab54e2ebe8d031c166997a26a5d5dc143dc246b4b046b170406da4f1) // vk.Q_ARITHMETIC.y
+            mstore(add(_vk, 0x240), 0x2498b2e14394f700cac156f42ef63ba194ed99764e03f2e433cb0be94d0fc89f) // vk.QSORT.x
+            mstore(add(_vk, 0x260), 0x206103c2ff58564c9a4746efd3fff7637a46052eb129af96844c2d850d11d8f3) // vk.QSORT.y
+            mstore(add(_vk, 0x280), 0x212dfe13df5b9cfb846570ecf8269ed3648c24827e7dceafdeca6235e1dd5e38) // vk.Q_ELLIPTIC.x
+            mstore(add(_vk, 0x2a0), 0x284d15304c372e9c33d76628c66bd6c48ef526d08146e9b401dc7d1e373ccd3a) // vk.Q_ELLIPTIC.y
+            mstore(add(_vk, 0x2c0), 0x126a3a8e4c678d476c3c864cde50f9776d880443976f62a438b9db897b433ffa) // vk.Q_AUX.x
+            mstore(add(_vk, 0x2e0), 0x2866186a79faf6dde910250342628d6a7a1c6d32f88b1991b276852874bd73dc) // vk.Q_AUX.y
+            mstore(add(_vk, 0x300), 0x2bd3d50520f90ab39921a0f2ce6c8f5d5cc8a989720e939dbb4a8951d878f579) // vk.SIGMA1.x
+            mstore(add(_vk, 0x320), 0x0b5652d8de0be47d4a6496260931f15984d6cc0eb21e61c15991554eee8bfe91) // vk.SIGMA1.y
+            mstore(add(_vk, 0x340), 0x135cdf64147af6820b82eff62e1e62efb848f20c81dffc2ed36cc4d3ef9d6ee3) // vk.SIGMA2.x
+            mstore(add(_vk, 0x360), 0x16ce92a14e25ca8f353781ad6bf4c105139a2029c682b0e62606b721e9d8c848) // vk.SIGMA2.y
+            mstore(add(_vk, 0x380), 0x0c9177240c1a64d39bbdc9113347b71c8ad5899a9a617b70450e43ca0f08c0b9) // vk.SIGMA3.x
+            mstore(add(_vk, 0x3a0), 0x26486bfd9b1989300948793829dda7ebd3c783b85ef797363b15bdf9932d624f) // vk.SIGMA3.y
+            mstore(add(_vk, 0x3c0), 0x0933b476f487753e6b6a6c07579f099b3bd03e1d4fad080cdf864233e378e6f7) // vk.SIGMA4.x
+            mstore(add(_vk, 0x3e0), 0x19fa964521f482600ad8f48f2d74204aa35665cefec49c73255bcd7bb9cf1d2e) // vk.SIGMA4.y
+            mstore(add(_vk, 0x400), 0x1cadeb85ec1d913dbbebd04a2e9c216fffb782a908252de688cb3f87a9960239) // vk.TABLE1.x
+            mstore(add(_vk, 0x420), 0x140ce35846522600428e89cedfc30ef4f906e759e4b262f982f41b11e232bef0) // vk.TABLE1.y
+            mstore(add(_vk, 0x440), 0x186c47255bd1cac8572abe17f302a4a778dc042d05b5ad10ec72ccf87db72cbd) // vk.TABLE2.x
+            mstore(add(_vk, 0x460), 0x2696b8ea9abe2e21817826ff8ffdd70455306100f722aee5047d7b61d23be470) // vk.TABLE2.y
+            mstore(add(_vk, 0x480), 0x203c78601f28e6739d2031447af9f5015f00e4a92298c8e0af4906929ce4aa23) // vk.TABLE3.x
+            mstore(add(_vk, 0x4a0), 0x0b82d8af3657b8dacf80c03e267415e27c1b22c5b110041433f5f7a0077d6163) // vk.TABLE3.y
+            mstore(add(_vk, 0x4c0), 0x1ca5d2fc76408b3d82cd070612b1f00b2910e92b606943f0a66d4064ac05d6f3) // vk.TABLE4.x
+            mstore(add(_vk, 0x4e0), 0x12889680e44151655a6fb88176f0eb0e09e60039ec5cbc978bcb081ca4d41c1e) // vk.TABLE4.y
+            mstore(add(_vk, 0x500), 0x269c3c1e6be15df4cd6e18678103fb6a22fc4e79890d0e7d18259353640bf580) // vk.TABLE_TYPE.x
+            mstore(add(_vk, 0x520), 0x073ef16b8836c3c34ac6e02937c25aaf47728e8aaa50eea7a2a7e2d87b2a051c) // vk.TABLE_TYPE.y
+            mstore(add(_vk, 0x540), 0x0642a0979a2c84f7f2c1ae9c5285e8b54bc1a57e51ec50588ec003e5ccaa1ef0) // vk.ID1.x
+            mstore(add(_vk, 0x560), 0x10759f71ebeb64070c9bde2e55126711646725544ef4273f9a391b9b9b0af13d) // vk.ID1.y
+            mstore(add(_vk, 0x580), 0x05107532383658086d131205993b32158da27ddcf4a41708cf50e4e6ca986205) // vk.ID2.x
+            mstore(add(_vk, 0x5a0), 0x1c67ba6b417eddf6928c56e1fece6ba9c73c4579c446ff0bd86e794121b4957c) // vk.ID2.y
+            mstore(add(_vk, 0x5c0), 0x030c58a082fe2a8a256a3c7596ca585a024396e2377db7e854bf7f14514759b8) // vk.ID3.x
+            mstore(add(_vk, 0x5e0), 0x1606bd0cae6fbb354de28025f6deb12a003c43b7dafa272c94b35c752ceaa696) // vk.ID3.y
+            mstore(add(_vk, 0x600), 0x1e1a0bd62a0746fb76e5d6727d5db536662c58d163cf29375fff76b669856e5f) // vk.ID4.x
+            mstore(add(_vk, 0x620), 0x0f786242d4fd388fd0e83bc4074cef1a36162d3403af146af654e72acb72e4c6) // vk.ID4.y
+            mstore(add(_vk, 0x640), 0x01) // vk.contains_recursive_proof
+            mstore(add(_vk, 0x660), 1) // vk.recursive_proof_public_input_indices
+            mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 
+            mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 
+            mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 
+            mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 
+            mstore(_omegaInverseLoc, 0x06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321) // vk.work_root_inverse
+        }
+    }
+}
+
+/**
+ * @title Ultra Plonk proof verification contract
+ * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified
+ */
+abstract contract BaseUltraVerifier {
+    // VERIFICATION KEY MEMORY LOCATIONS
+    uint256 internal constant N_LOC = 0x380;
+    uint256 internal constant NUM_INPUTS_LOC = 0x3a0;
+    uint256 internal constant OMEGA_LOC = 0x3c0;
+    uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;
+    uint256 internal constant Q1_X_LOC = 0x400;
+    uint256 internal constant Q1_Y_LOC = 0x420;
+    uint256 internal constant Q2_X_LOC = 0x440;
+    uint256 internal constant Q2_Y_LOC = 0x460;
+    uint256 internal constant Q3_X_LOC = 0x480;
+    uint256 internal constant Q3_Y_LOC = 0x4a0;
+    uint256 internal constant Q4_X_LOC = 0x4c0;
+    uint256 internal constant Q4_Y_LOC = 0x4e0;
+    uint256 internal constant QM_X_LOC = 0x500;
+    uint256 internal constant QM_Y_LOC = 0x520;
+    uint256 internal constant QC_X_LOC = 0x540;
+    uint256 internal constant QC_Y_LOC = 0x560;
+    uint256 internal constant QARITH_X_LOC = 0x580;
+    uint256 internal constant QARITH_Y_LOC = 0x5a0;
+    uint256 internal constant QSORT_X_LOC = 0x5c0;
+    uint256 internal constant QSORT_Y_LOC = 0x5e0;
+    uint256 internal constant QELLIPTIC_X_LOC = 0x600;
+    uint256 internal constant QELLIPTIC_Y_LOC = 0x620;
+    uint256 internal constant QAUX_X_LOC = 0x640;
+    uint256 internal constant QAUX_Y_LOC = 0x660;
+    uint256 internal constant SIGMA1_X_LOC = 0x680;
+    uint256 internal constant SIGMA1_Y_LOC = 0x6a0;
+    uint256 internal constant SIGMA2_X_LOC = 0x6c0;
+    uint256 internal constant SIGMA2_Y_LOC = 0x6e0;
+    uint256 internal constant SIGMA3_X_LOC = 0x700;
+    uint256 internal constant SIGMA3_Y_LOC = 0x720;
+    uint256 internal constant SIGMA4_X_LOC = 0x740;
+    uint256 internal constant SIGMA4_Y_LOC = 0x760;
+    uint256 internal constant TABLE1_X_LOC = 0x780;
+    uint256 internal constant TABLE1_Y_LOC = 0x7a0;
+    uint256 internal constant TABLE2_X_LOC = 0x7c0;
+    uint256 internal constant TABLE2_Y_LOC = 0x7e0;
+    uint256 internal constant TABLE3_X_LOC = 0x800;
+    uint256 internal constant TABLE3_Y_LOC = 0x820;
+    uint256 internal constant TABLE4_X_LOC = 0x840;
+    uint256 internal constant TABLE4_Y_LOC = 0x860;
+    uint256 internal constant TABLE_TYPE_X_LOC = 0x880;
+    uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;
+    uint256 internal constant ID1_X_LOC = 0x8c0;
+    uint256 internal constant ID1_Y_LOC = 0x8e0;
+    uint256 internal constant ID2_X_LOC = 0x900;
+    uint256 internal constant ID2_Y_LOC = 0x920;
+    uint256 internal constant ID3_X_LOC = 0x940;
+    uint256 internal constant ID3_Y_LOC = 0x960;
+    uint256 internal constant ID4_X_LOC = 0x980;
+    uint256 internal constant ID4_Y_LOC = 0x9a0;
+    uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;
+    uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;
+    uint256 internal constant G2X_X0_LOC = 0xa00;
+    uint256 internal constant G2X_X1_LOC = 0xa20;
+    uint256 internal constant G2X_Y0_LOC = 0xa40;
+    uint256 internal constant G2X_Y1_LOC = 0xa60;
+
+    // ### PROOF DATA MEMORY LOCATIONS
+    uint256 internal constant W1_X_LOC = 0x1200;
+    uint256 internal constant W1_Y_LOC = 0x1220;
+    uint256 internal constant W2_X_LOC = 0x1240;
+    uint256 internal constant W2_Y_LOC = 0x1260;
+    uint256 internal constant W3_X_LOC = 0x1280;
+    uint256 internal constant W3_Y_LOC = 0x12a0;
+    uint256 internal constant W4_X_LOC = 0x12c0;
+    uint256 internal constant W4_Y_LOC = 0x12e0;
+    uint256 internal constant S_X_LOC = 0x1300;
+    uint256 internal constant S_Y_LOC = 0x1320;
+    uint256 internal constant Z_X_LOC = 0x1340;
+    uint256 internal constant Z_Y_LOC = 0x1360;
+    uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;
+    uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;
+    uint256 internal constant T1_X_LOC = 0x13c0;
+    uint256 internal constant T1_Y_LOC = 0x13e0;
+    uint256 internal constant T2_X_LOC = 0x1400;
+    uint256 internal constant T2_Y_LOC = 0x1420;
+    uint256 internal constant T3_X_LOC = 0x1440;
+    uint256 internal constant T3_Y_LOC = 0x1460;
+    uint256 internal constant T4_X_LOC = 0x1480;
+    uint256 internal constant T4_Y_LOC = 0x14a0;
+
+    uint256 internal constant W1_EVAL_LOC = 0x1600;
+    uint256 internal constant W2_EVAL_LOC = 0x1620;
+    uint256 internal constant W3_EVAL_LOC = 0x1640;
+    uint256 internal constant W4_EVAL_LOC = 0x1660;
+    uint256 internal constant S_EVAL_LOC = 0x1680;
+    uint256 internal constant Z_EVAL_LOC = 0x16a0;
+    uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;
+    uint256 internal constant Q1_EVAL_LOC = 0x16e0;
+    uint256 internal constant Q2_EVAL_LOC = 0x1700;
+    uint256 internal constant Q3_EVAL_LOC = 0x1720;
+    uint256 internal constant Q4_EVAL_LOC = 0x1740;
+    uint256 internal constant QM_EVAL_LOC = 0x1760;
+    uint256 internal constant QC_EVAL_LOC = 0x1780;
+    uint256 internal constant QARITH_EVAL_LOC = 0x17a0;
+    uint256 internal constant QSORT_EVAL_LOC = 0x17c0;
+    uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;
+    uint256 internal constant QAUX_EVAL_LOC = 0x1800;
+    uint256 internal constant TABLE1_EVAL_LOC = 0x1840;
+    uint256 internal constant TABLE2_EVAL_LOC = 0x1860;
+    uint256 internal constant TABLE3_EVAL_LOC = 0x1880;
+    uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;
+    uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;
+    uint256 internal constant ID1_EVAL_LOC = 0x18e0;
+    uint256 internal constant ID2_EVAL_LOC = 0x1900;
+    uint256 internal constant ID3_EVAL_LOC = 0x1920;
+    uint256 internal constant ID4_EVAL_LOC = 0x1940;
+    uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;
+    uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;
+    uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;
+    uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;
+    uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;
+    uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;
+    uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;
+    uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;
+    uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;
+    uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;
+    uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;
+    uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;
+    uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;
+    uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;
+    uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;
+
+    uint256 internal constant PI_Z_X_LOC = 0x2300;
+    uint256 internal constant PI_Z_Y_LOC = 0x2320;
+    uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;
+    uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;
+
+    // Used for elliptic widget. These are alias names for wire + shifted wire evaluations
+    uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;
+    uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;
+    uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;
+    uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;
+    uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;
+    uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;
+    uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;
+    uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;
+    uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;
+
+    // ### CHALLENGES MEMORY OFFSETS
+
+    uint256 internal constant C_BETA_LOC = 0x2600;
+    uint256 internal constant C_GAMMA_LOC = 0x2620;
+    uint256 internal constant C_ALPHA_LOC = 0x2640;
+    uint256 internal constant C_ETA_LOC = 0x2660;
+    uint256 internal constant C_ETA_SQR_LOC = 0x2680;
+    uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;
+
+    uint256 internal constant C_ZETA_LOC = 0x26c0;
+    uint256 internal constant C_CURRENT_LOC = 0x26e0;
+    uint256 internal constant C_V0_LOC = 0x2700;
+    uint256 internal constant C_V1_LOC = 0x2720;
+    uint256 internal constant C_V2_LOC = 0x2740;
+    uint256 internal constant C_V3_LOC = 0x2760;
+    uint256 internal constant C_V4_LOC = 0x2780;
+    uint256 internal constant C_V5_LOC = 0x27a0;
+    uint256 internal constant C_V6_LOC = 0x27c0;
+    uint256 internal constant C_V7_LOC = 0x27e0;
+    uint256 internal constant C_V8_LOC = 0x2800;
+    uint256 internal constant C_V9_LOC = 0x2820;
+    uint256 internal constant C_V10_LOC = 0x2840;
+    uint256 internal constant C_V11_LOC = 0x2860;
+    uint256 internal constant C_V12_LOC = 0x2880;
+    uint256 internal constant C_V13_LOC = 0x28a0;
+    uint256 internal constant C_V14_LOC = 0x28c0;
+    uint256 internal constant C_V15_LOC = 0x28e0;
+    uint256 internal constant C_V16_LOC = 0x2900;
+    uint256 internal constant C_V17_LOC = 0x2920;
+    uint256 internal constant C_V18_LOC = 0x2940;
+    uint256 internal constant C_V19_LOC = 0x2960;
+    uint256 internal constant C_V20_LOC = 0x2980;
+    uint256 internal constant C_V21_LOC = 0x29a0;
+    uint256 internal constant C_V22_LOC = 0x29c0;
+    uint256 internal constant C_V23_LOC = 0x29e0;
+    uint256 internal constant C_V24_LOC = 0x2a00;
+    uint256 internal constant C_V25_LOC = 0x2a20;
+    uint256 internal constant C_V26_LOC = 0x2a40;
+    uint256 internal constant C_V27_LOC = 0x2a60;
+    uint256 internal constant C_V28_LOC = 0x2a80;
+    uint256 internal constant C_V29_LOC = 0x2aa0;
+    uint256 internal constant C_V30_LOC = 0x2ac0;
+
+    uint256 internal constant C_U_LOC = 0x2b00;
+
+    // ### LOCAL VARIABLES MEMORY OFFSETS
+    uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;
+    uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;
+    uint256 internal constant ZETA_POW_N_LOC = 0x3040;
+    uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;
+    uint256 internal constant ZERO_POLY_LOC = 0x3080;
+    uint256 internal constant L_START_LOC = 0x30a0;
+    uint256 internal constant L_END_LOC = 0x30c0;
+    uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;
+
+    uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;
+    uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;
+    uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;
+
+    uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;
+    uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;
+    uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;
+    uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;
+    uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;
+    uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;
+    uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;
+    uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;
+
+    // misc stuff
+    uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;
+    uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;
+    uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;
+    uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;
+    uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;
+
+    // ### RECURSION VARIABLE MEMORY LOCATIONS
+    uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;
+    uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;
+    uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;
+    uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;
+    uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;
+
+    // sub-identity storage
+    uint256 internal constant PERMUTATION_IDENTITY = 0x3500;
+    uint256 internal constant PLOOKUP_IDENTITY = 0x3520;
+    uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;
+    uint256 internal constant SORT_IDENTITY = 0x3560;
+    uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;
+    uint256 internal constant AUX_IDENTITY = 0x35a0;
+    uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;
+    uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;
+    uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;
+    uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;
+    uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;
+
+    uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;
+    uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;
+
+    // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time
+    uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;
+    uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;
+    uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;
+
+    bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;
+    bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;
+    bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;
+    bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;
+    bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;
+    bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;
+    bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;
+    bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;
+
+    uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes
+
+    // We need to hash 41 field elements when generating the NU challenge
+    // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)
+    // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)
+    // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)
+    // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)
+    // table1_omega, table2_omega, table3_omega, table4_omega (4)
+    uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20
+
+    // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over
+    // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4
+    uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0
+
+    uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =
+        0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;
+    uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68
+    uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14
+
+    // y^2 = x^3 + ax + b
+    // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic
+    uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;
+
+    error INVALID_VERIFICATION_KEY();
+    error POINT_NOT_ON_CURVE();
+    error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);
+    error PUBLIC_INPUT_INVALID_BN128_G1_POINT();
+    error PUBLIC_INPUT_GE_P();
+    error MOD_EXP_FAILURE();
+    error PAIRING_PREAMBLE_FAILED();
+    error OPENING_COMMITMENT_FAILED();
+    error PAIRING_FAILED();
+
+    function getVerificationKeyHash() public pure virtual returns (bytes32);
+
+    /**
+     * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment
+     */
+    function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;
+
+    constructor() { 
+        loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);
+
+        // We verify that all of the EC points in the verification key lie on the bn128 curve. 
+        assembly {
+            let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order
+
+            let success := 1
+
+            // VALIDATE Q1
+            {
+                let x := mload(Q1_X_LOC)
+                let y := mload(Q1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE Q2
+            {
+                let x := mload(Q2_X_LOC)
+                let y := mload(Q2_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE Q3
+            {
+                let x := mload(Q3_X_LOC)
+                let y := mload(Q3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE Q4
+            {
+                let x := mload(Q4_X_LOC)
+                let y := mload(Q4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            // VALIDATE QM
+            {
+                let x := mload(QM_X_LOC)
+                let y := mload(QM_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE QC
+            {
+                let x := mload(QC_X_LOC)
+                let y := mload(QC_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE QARITH
+            {
+                let x := mload(QARITH_X_LOC)
+                let y := mload(QARITH_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE QSORT
+            {
+                let x := mload(QSORT_X_LOC)
+                let y := mload(QSORT_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE QELLIPTIC
+            {
+                let x := mload(QELLIPTIC_X_LOC)
+                let y := mload(QELLIPTIC_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE QAUX
+            {
+                let x := mload(QAUX_X_LOC)
+                let y := mload(QAUX_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE SIGMA1
+            {
+                let x := mload(SIGMA1_X_LOC)
+                let y := mload(SIGMA1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE SIGMA2
+            {
+                let x := mload(SIGMA2_X_LOC)
+                let y := mload(SIGMA2_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE SIGMA3
+            {
+                let x := mload(SIGMA3_X_LOC)
+                let y := mload(SIGMA3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE SIGMA4
+            {
+                let x := mload(SIGMA4_X_LOC)
+                let y := mload(SIGMA4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE TABLE1
+            {
+                let x := mload(TABLE1_X_LOC)
+                let y := mload(TABLE1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            } 
+            // VALIDATE TABLE2
+            {
+                let x := mload(TABLE2_X_LOC)
+                let y := mload(TABLE2_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            } 
+            // VALIDATE TABLE3
+            {
+                let x := mload(TABLE3_X_LOC)
+                let y := mload(TABLE3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            } 
+            // VALIDATE TABLE4
+            {
+                let x := mload(TABLE4_X_LOC)
+                let y := mload(TABLE4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            } 
+            // VALIDATE TABLE_TYPE
+            {
+                let x := mload(TABLE_TYPE_X_LOC)
+                let y := mload(TABLE_TYPE_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE ID1
+            {
+                let x := mload(ID1_X_LOC)
+                let y := mload(ID1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE ID2
+            {
+                let x := mload(ID2_X_LOC)
+                let y := mload(ID2_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE ID3
+            {
+                let x := mload(ID3_X_LOC)
+                let y := mload(ID3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE ID4
+            {
+                let x := mload(ID4_X_LOC)
+                let y := mload(ID4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+
+            if iszero(success) {
+                mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)
+                revert(0x00, 0x04)
+            }
+        }
+    }
+
+    /**
+     * @notice Verify a Ultra Plonk proof
+     * @param _proof - The serialized proof
+     * @param _publicInputs - An array of the public inputs
+     * @return True if proof is valid, reverts otherwise
+     */
+    function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {
+        loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);
+
+        uint256 requiredPublicInputCount;
+        assembly {
+            requiredPublicInputCount := mload(NUM_INPUTS_LOC)
+        }
+        if (requiredPublicInputCount != _publicInputs.length) {
+            revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);
+        }
+
+        assembly {
+            let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order
+            let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order
+
+            /**
+             * LOAD PROOF FROM CALLDATA
+             */
+            {
+                let data_ptr := add(calldataload(0x04), 0x24)
+
+                mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))
+                mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))
+
+                mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))
+                mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))
+
+                mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))
+                mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))
+
+                mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))
+                mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))
+
+                mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))
+                mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))
+                mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))
+                mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))
+                mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))
+                mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))
+                mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))
+                mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))
+
+                mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))
+                mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))
+
+                mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))
+                mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))
+
+                mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))
+                mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))
+
+                mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))
+                mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))
+                mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))
+                mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))
+                mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))
+                mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))
+                mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))
+                mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))
+                mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))
+                mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))
+                mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))
+                mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))
+                mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))
+                mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))
+                mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))
+                mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))
+                mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))
+
+                mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))
+                mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))
+
+                mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))
+                mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))
+
+                mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))
+                mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))
+                mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))
+                mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))
+                mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))
+
+                mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))
+                mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))
+                mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))
+                mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))
+
+                mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))
+                mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))
+                mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))
+                mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))
+                mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))
+
+                mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))
+
+                mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))
+                mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))
+                mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))
+                mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))
+                mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))
+
+                mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))
+                mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))
+
+                mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))
+                mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))
+            }
+
+            /**
+             * LOAD RECURSIVE PROOF INTO MEMORY
+             */
+            {
+                if mload(CONTAINS_RECURSIVE_PROOF_LOC) {
+                    let public_inputs_ptr := add(calldataload(0x24), 0x24)
+                    let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)
+
+                    let x0 := calldataload(index_counter)
+                    x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))
+                    x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))
+                    x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))
+                    let y0 := calldataload(add(index_counter, 0x80))
+                    y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))
+                    y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))
+                    y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))
+                    let x1 := calldataload(add(index_counter, 0x100))
+                    x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))
+                    x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))
+                    x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))
+                    let y1 := calldataload(add(index_counter, 0x180))
+                    y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))
+                    y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))
+                    y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))
+                    mstore(RECURSIVE_P1_X_LOC, x0)
+                    mstore(RECURSIVE_P1_Y_LOC, y0)
+                    mstore(RECURSIVE_P2_X_LOC, x1)
+                    mstore(RECURSIVE_P2_Y_LOC, y1)
+
+                    // validate these are valid bn128 G1 points
+                    if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {
+                        mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)
+                        revert(0x00, 0x04)
+                    }
+                }
+            }
+
+            {
+                /**
+                 * Generate initial challenge
+                 */
+                mstore(0x00, shl(224, mload(N_LOC)))
+                mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))
+                let challenge := keccak256(0x00, 0x08)
+
+                /**
+                 * Generate eta challenge
+                 */
+                mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)
+                // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs
+                let public_inputs_start := add(calldataload(0x24), 0x24)
+                // copy the public inputs over
+                let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)
+                calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)
+
+                // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)
+                let w_start := add(calldataload(0x04), 0x24)
+                calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)
+
+                // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)
+                let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))
+
+                challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)
+                {
+                    let eta := mod(challenge, p)
+                    mstore(C_ETA_LOC, eta)
+                    mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))
+                    mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))
+                }
+
+                /**
+                 * Generate beta challenge
+                 */
+                mstore(0x00, challenge)
+                mstore(0x20, mload(W4_Y_LOC))
+                mstore(0x40, mload(W4_X_LOC))
+                mstore(0x60, mload(S_Y_LOC))
+                mstore(0x80, mload(S_X_LOC))
+                challenge := keccak256(0x00, 0xa0)
+                mstore(C_BETA_LOC, mod(challenge, p))
+
+                /**
+                 * Generate gamma challenge
+                 */
+                mstore(0x00, challenge)
+                mstore8(0x20, 0x01)
+                challenge := keccak256(0x00, 0x21)
+                mstore(C_GAMMA_LOC, mod(challenge, p))
+
+                /**
+                 * Generate alpha challenge
+                 */
+                mstore(0x00, challenge)
+                mstore(0x20, mload(Z_Y_LOC))
+                mstore(0x40, mload(Z_X_LOC))
+                mstore(0x60, mload(Z_LOOKUP_Y_LOC))
+                mstore(0x80, mload(Z_LOOKUP_X_LOC))
+                challenge := keccak256(0x00, 0xa0)
+                mstore(C_ALPHA_LOC, mod(challenge, p))
+
+                /**
+                 * Compute and store some powers of alpha for future computations
+                 */
+                let alpha := mload(C_ALPHA_LOC)
+                mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))
+                mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))
+                mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))
+                mstore(C_ALPHA_BASE_LOC, alpha)
+
+                /**
+                 * Generate zeta challenge
+                 */
+                mstore(0x00, challenge)
+                mstore(0x20, mload(T1_Y_LOC))
+                mstore(0x40, mload(T1_X_LOC))
+                mstore(0x60, mload(T2_Y_LOC))
+                mstore(0x80, mload(T2_X_LOC))
+                mstore(0xa0, mload(T3_Y_LOC))
+                mstore(0xc0, mload(T3_X_LOC))
+                mstore(0xe0, mload(T4_Y_LOC))
+                mstore(0x100, mload(T4_X_LOC))
+
+                challenge := keccak256(0x00, 0x120)
+
+                mstore(C_ZETA_LOC, mod(challenge, p))
+                mstore(C_CURRENT_LOC, challenge)
+            }
+
+            /**
+             * EVALUATE FIELD OPERATIONS
+             */
+
+            /**
+             * COMPUTE PUBLIC INPUT DELTA
+             * ΔPI = ∏ᵢ∈ℓ(wᵢ + β σ(i) + γ) / ∏ᵢ∈ℓ(wᵢ + β σ'(i) + γ)
+             */
+            {
+                let beta := mload(C_BETA_LOC) // β
+                let gamma := mload(C_GAMMA_LOC) // γ
+                let work_root := mload(OMEGA_LOC) // ω
+                let numerator_value := 1
+                let denominator_value := 1
+
+                let p_clone := p // move p to the front of the stack
+                let valid_inputs := true
+
+                // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])
+                let public_inputs_ptr := add(calldataload(0x24), 0x24)
+
+                // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes
+                let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))
+
+                // root_1 = β * 0x05
+                let root_1 := mulmod(beta, 0x05, p_clone) // k1.β
+                // root_2 = β * 0x0c
+                let root_2 := mulmod(beta, 0x0c, p_clone)
+                // @note 0x05 + 0x07 == 0x0c == external coset generator
+
+                for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {
+                    /**
+                     * input = public_input[i]
+                     * valid_inputs &= input < p
+                     * temp = input + gamma
+                     * numerator_value *= (β.σ(i) + wᵢ + γ)  // σ(i) = 0x05.ωⁱ
+                     * denominator_value *= (β.σ'(i) + wᵢ + γ) // σ'(i) = 0x0c.ωⁱ
+                     * root_1 *= ω
+                     * root_2 *= ω
+                     */
+
+                    let input := calldataload(public_inputs_ptr)
+                    valid_inputs := and(valid_inputs, lt(input, p_clone))
+                    let temp := addmod(input, gamma, p_clone)
+
+                    numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)
+                    denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)
+
+                    root_1 := mulmod(root_1, work_root, p_clone)
+                    root_2 := mulmod(root_2, work_root, p_clone)
+                }
+
+                // Revert if not all public inputs are field elements (i.e. < p)
+                if iszero(valid_inputs) {
+                    mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+
+                mstore(DELTA_NUMERATOR_LOC, numerator_value)
+                mstore(DELTA_DENOMINATOR_LOC, denominator_value)
+            }
+
+            /**
+             * Compute Plookup delta factor [γ(1 + β)]^{n-k}
+             * k = num roots cut out of Z_H = 4
+             */
+            {
+                let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)
+                let delta_numerator := delta_base
+                {
+                    let exponent := mload(N_LOC)
+                    let count := 1
+                    for {} lt(count, exponent) { count := add(count, count) } {
+                        delta_numerator := mulmod(delta_numerator, delta_numerator, p)
+                    }
+                }
+                mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)
+
+                let delta_denominator := mulmod(delta_base, delta_base, p)
+                delta_denominator := mulmod(delta_denominator, delta_denominator, p)
+                mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)
+            }
+            /**
+             * Compute lagrange poly and vanishing poly fractions
+             */
+            {
+                /**
+                 * vanishing_numerator = zeta
+                 * ZETA_POW_N = zeta^n
+                 * vanishing_numerator -= 1
+                 * accumulating_root = omega_inverse
+                 * work_root = p - accumulating_root
+                 * domain_inverse = domain_inverse
+                 * vanishing_denominator = zeta + work_root
+                 * work_root *= accumulating_root
+                 * vanishing_denominator *= (zeta + work_root)
+                 * work_root *= accumulating_root
+                 * vanishing_denominator *= (zeta + work_root)
+                 * vanishing_denominator *= (zeta + (zeta + accumulating_root))
+                 * work_root = omega
+                 * lagrange_numerator = vanishing_numerator * domain_inverse
+                 * l_start_denominator = zeta - 1
+                 * accumulating_root = work_root^2
+                 * l_end_denominator = accumulating_root^2 * work_root * zeta - 1
+                 * Note: l_end_denominator term contains a term \omega^5 to cut out 5 roots of unity from vanishing poly
+                 */
+
+                let zeta := mload(C_ZETA_LOC)
+
+                // compute zeta^n, where n is a power of 2
+                let vanishing_numerator := zeta
+                {
+                    // pow_small
+                    let exponent := mload(N_LOC)
+                    let count := 1
+                    for {} lt(count, exponent) { count := add(count, count) } {
+                        vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)
+                    }
+                }
+                mstore(ZETA_POW_N_LOC, vanishing_numerator)
+                vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)
+
+                let accumulating_root := mload(OMEGA_INVERSE_LOC)
+                let work_root := sub(p, accumulating_root)
+                let domain_inverse := mload(DOMAIN_INVERSE_LOC)
+
+                let vanishing_denominator := addmod(zeta, work_root, p)
+                work_root := mulmod(work_root, accumulating_root, p)
+                vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)
+                work_root := mulmod(work_root, accumulating_root, p)
+                vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)
+                vanishing_denominator :=
+                    mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)
+
+                work_root := mload(OMEGA_LOC)
+
+                let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)
+                let l_start_denominator := addmod(zeta, sub(p, 1), p)
+
+                accumulating_root := mulmod(work_root, work_root, p)
+
+                let l_end_denominator :=
+                    addmod(
+                        mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p
+                    )
+
+                /**
+                 * Compute inversions using Montgomery's batch inversion trick
+                 */
+                let accumulator := mload(DELTA_DENOMINATOR_LOC)
+                let t0 := accumulator
+                accumulator := mulmod(accumulator, vanishing_denominator, p)
+                let t1 := accumulator
+                accumulator := mulmod(accumulator, vanishing_numerator, p)
+                let t2 := accumulator
+                accumulator := mulmod(accumulator, l_start_denominator, p)
+                let t3 := accumulator
+                accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)
+                let t4 := accumulator
+                {
+                    mstore(0, 0x20)
+                    mstore(0x20, 0x20)
+                    mstore(0x40, 0x20)
+                    mstore(0x60, mulmod(accumulator, l_end_denominator, p))
+                    mstore(0x80, sub(p, 2))
+                    mstore(0xa0, p)
+                    if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {
+                        mstore(0x0, MOD_EXP_FAILURE_SELECTOR)
+                        revert(0x00, 0x04)
+                    }
+                    accumulator := mload(0x00)
+                }
+
+                t4 := mulmod(accumulator, t4, p)
+                accumulator := mulmod(accumulator, l_end_denominator, p)
+
+                t3 := mulmod(accumulator, t3, p)
+                accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)
+
+                t2 := mulmod(accumulator, t2, p)
+                accumulator := mulmod(accumulator, l_start_denominator, p)
+
+                t1 := mulmod(accumulator, t1, p)
+                accumulator := mulmod(accumulator, vanishing_numerator, p)
+
+                t0 := mulmod(accumulator, t0, p)
+                accumulator := mulmod(accumulator, vanishing_denominator, p)
+
+                accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)
+
+                mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))
+                mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))
+                mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))
+                mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))
+                mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))
+                mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))
+            }
+
+            /**
+             * UltraPlonk Widget Ordering:
+             *
+             * 1. Permutation widget
+             * 2. Plookup widget
+             * 3. Arithmetic widget
+             * 4. Fixed base widget (?)
+             * 5. GenPermSort widget
+             * 6. Elliptic widget
+             * 7. Auxiliary widget
+             */
+
+            /**
+             * COMPUTE PERMUTATION WIDGET EVALUATION
+             */
+            {
+                let alpha := mload(C_ALPHA_LOC)
+                let beta := mload(C_BETA_LOC)
+                let gamma := mload(C_GAMMA_LOC)
+
+                /**
+                 * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)
+                 * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)
+                 * result = alpha_base * z_eval * t1 * t2
+                 * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)
+                 * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)
+                 * result -= (alpha_base * z_omega_eval * t1 * t2)
+                 */
+                let t1 :=
+                    mulmod(
+                        add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),
+                        add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),
+                        p
+                    )
+                let t2 :=
+                    mulmod(
+                        add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),
+                        add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),
+                        p
+                    )
+                let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)
+                t1 :=
+                    mulmod(
+                        add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),
+                        add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),
+                        p
+                    )
+                t2 :=
+                    mulmod(
+                        add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),
+                        add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),
+                        p
+                    )
+                result :=
+                    addmod(
+                        result,
+                        sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),
+                        p
+                    )
+
+                /**
+                 * alpha_base *= alpha
+                 * result += alpha_base . (L_{n-k}(ʓ) . (z(ʓ.ω) - ∆_{PI}))
+                 * alpha_base *= alpha
+                 * result += alpha_base . (L_1(Ê“)(Z(Ê“) - 1))
+                 * alpha_Base *= alpha
+                 */
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))
+                result :=
+                    addmod(
+                        result,
+                        mulmod(
+                            mload(C_ALPHA_BASE_LOC),
+                            mulmod(
+                                mload(L_END_LOC),
+                                addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),
+                                p
+                            ),
+                            p
+                        ),
+                        p
+                    )
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))
+                mstore(
+                    PERMUTATION_IDENTITY,
+                    addmod(
+                        result,
+                        mulmod(
+                            mload(C_ALPHA_BASE_LOC),
+                            mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),
+                            p
+                        ),
+                        p
+                    )
+                )
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))
+            }
+
+            /**
+             * COMPUTE PLOOKUP WIDGET EVALUATION
+             */
+            {
+                /**
+                 * Goal: f = (w1(z) + q2.w1(zω)) + η(w2(z) + qm.w2(zω)) + η²(w3(z) + qc.w_3(zω)) + q3(z).η³
+                 * f = η.q3(z)
+                 * f += (w3(z) + qc.w_3(zω))
+                 * f *= η
+                 * f += (w2(z) + qm.w2(zω))
+                 * f *= η
+                 * f += (w1(z) + q2.w1(zω))
+                 */
+                let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)
+                f :=
+                    addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)
+                f := mulmod(f, mload(C_ETA_LOC), p)
+                f :=
+                    addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)
+                f := mulmod(f, mload(C_ETA_LOC), p)
+                f :=
+                    addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)
+
+                // t(z) = table4(z).η³ + table3(z).η² + table2(z).η + table1(z)
+                let t :=
+                    addmod(
+                        addmod(
+                            addmod(
+                                mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),
+                                mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),
+                                p
+                            ),
+                            mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),
+                            p
+                        ),
+                        mload(TABLE1_EVAL_LOC),
+                        p
+                    )
+
+                // t(zw) = table4(zw).η³ + table3(zw).η² + table2(zw).η + table1(zw)
+                let t_omega :=
+                    addmod(
+                        addmod(
+                            addmod(
+                                mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),
+                                mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),
+                                p
+                            ),
+                            mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),
+                            p
+                        ),
+                        mload(TABLE1_OMEGA_EVAL_LOC),
+                        p
+                    )
+
+                /**
+                 * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + γ) * (t(z) + βt(zω) + γ(β + 1)) * (β + 1)
+                 * gamma_beta_constant = γ(β + 1)
+                 * numerator = f * TABLE_TYPE_EVAL + gamma
+                 * temp0 = t(z) + t(zω) * β + gamma_beta_constant
+                 * numerator *= temp0
+                 * numerator *= (β + 1)
+                 * temp0 = alpha * l_1
+                 * numerator += temp0
+                 * numerator *= z_lookup(z)
+                 * numerator -= temp0
+                 */
+                let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)
+                let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)
+                let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)
+                numerator := mulmod(numerator, temp0, p)
+                numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)
+                temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)
+                numerator := addmod(numerator, temp0, p)
+                numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)
+                numerator := addmod(numerator, sub(p, temp0), p)
+
+                /**
+                 * Goal: denominator = z_lookup(zω)*[s(z) + βs(zω) + γ(1 + β)] - [z_lookup(zω) - [γ(1 + β)]^{n-k}]*α²L_end(z)
+                 * note: delta_factor = [γ(1 + β)]^{n-k}
+                 * denominator = s(z) + βs(zω) + γ(β + 1)
+                 * temp1 = α²L_end(z)
+                 * denominator -= temp1
+                 * denominator *= z_lookup(zω)
+                 * denominator += temp1 * delta_factor
+                 * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base
+                 * alpha_base *= alpha^3
+                 */
+                let denominator :=
+                    addmod(
+                        addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),
+                        gamma_beta_constant,
+                        p
+                    )
+                let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)
+                denominator := addmod(denominator, sub(p, temp1), p)
+                denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)
+                denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)
+
+                mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))
+
+                // update alpha
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))
+            }
+
+            /**
+             * COMPUTE ARITHMETIC WIDGET EVALUATION
+             */
+            {
+                /**
+                 * The basic arithmetic gate identity in standard plonk is as follows.
+                 * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0
+                 * However, for Ultraplonk, we extend this to support "passing" wires between rows (shown without alpha scaling below):
+                 * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +
+                 * (q_arith - 1)*( α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0
+                 *
+                 * This formula results in several cases depending on q_arith:
+                 * 1. q_arith == 0: Arithmetic gate is completely disabled
+                 *
+                 * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation
+                 * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0
+                 *
+                 * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:
+                 * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0
+                 * It allows defining w_4 at next index (w_4_omega) in terms of current wire values
+                 *
+                 * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. α allows us to split
+                 * the equation into two:
+                 *
+                 * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0
+                 * and
+                 * w_1 + w_4 - w_1_omega + q_m = 0  (we are reusing q_m here)
+                 *
+                 * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).
+                 * The equation can be split into two:
+                 *
+                 * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0
+                 * and
+                 * w_1 + w_4 - w_1_omega + q_m = 0
+                 *
+                 * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at
+                 * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at
+                 * product.
+                 */
+
+                let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)
+                let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)
+                let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)
+                let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)
+
+                // @todo - Add a explicit test that hits QARITH == 3
+                // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2
+                let w1w2qm :=
+                    mulmod(
+                        mulmod(
+                            mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),
+                            addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),
+                            p
+                        ),
+                        NEGATIVE_INVERSE_OF_2_MODULO_P,
+                        p
+                    )
+
+                // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c
+                let identity :=
+                    addmod(
+                        mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p
+                    )
+
+                // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:
+                // w_1 + w_4 - w_1_omega + q_m = 0
+                // we use this gate to save an addition gate when adding or subtracting non-native field elements
+                // α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)
+                let extra_small_addition_gate_identity :=
+                    mulmod(
+                        mload(C_ALPHA_LOC),
+                        mulmod(
+                            addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),
+                            addmod(
+                                mload(QM_EVAL_LOC),
+                                addmod(
+                                    sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p
+                                ),
+                                p
+                            ),
+                            p
+                        ),
+                        p
+                    )
+
+                // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity
+                // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!
+                // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))
+                mstore(
+                    ARITHMETIC_IDENTITY,
+                    mulmod(
+                        mload(C_ALPHA_BASE_LOC),
+                        mulmod(
+                            mload(QARITH_EVAL_LOC),
+                            addmod(
+                                identity,
+                                mulmod(
+                                    addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),
+                                    addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),
+                                    p
+                                ),
+                                p
+                            ),
+                            p
+                        ),
+                        p
+                    )
+                )
+
+                // update alpha
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))
+            }
+
+            /**
+             * COMPUTE GENPERMSORT WIDGET EVALUATION
+             */
+            {
+                /**
+                 * D1 = (w2 - w1)
+                 * D2 = (w3 - w2)
+                 * D3 = (w4 - w3)
+                 * D4 = (w1_omega - w4)
+                 *
+                 * α_a = alpha_base
+                 * α_b = alpha_base * α
+                 * α_c = alpha_base * α^2
+                 * α_d = alpha_base * α^3
+                 *
+                 * range_accumulator = (
+                 *   D1(D1 - 1)(D1 - 2)(D1 - 3).α_a +
+                 *   D2(D2 - 1)(D2 - 2)(D2 - 3).α_b +
+                 *   D3(D3 - 1)(D3 - 2)(D3 - 3).α_c +
+                 *   D4(D4 - 1)(D4 - 2)(D4 - 3).α_d +
+                 * ) . q_sort
+                 */
+                let minus_two := sub(p, 2)
+                let minus_three := sub(p, 3)
+                let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)
+                let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)
+                let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)
+                let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)
+
+                let range_accumulator :=
+                    mulmod(
+                        mulmod(
+                            mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),
+                            addmod(d1, minus_three, p),
+                            p
+                        ),
+                        mload(C_ALPHA_BASE_LOC),
+                        p
+                    )
+                range_accumulator :=
+                    addmod(
+                        range_accumulator,
+                        mulmod(
+                            mulmod(
+                                mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),
+                                addmod(d2, minus_three, p),
+                                p
+                            ),
+                            mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                range_accumulator :=
+                    addmod(
+                        range_accumulator,
+                        mulmod(
+                            mulmod(
+                                mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),
+                                addmod(d3, minus_three, p),
+                                p
+                            ),
+                            mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                range_accumulator :=
+                    addmod(
+                        range_accumulator,
+                        mulmod(
+                            mulmod(
+                                mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),
+                                addmod(d4, minus_three, p),
+                                p
+                            ),
+                            mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)
+
+                mstore(SORT_IDENTITY, range_accumulator)
+
+                // update alpha
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))
+            }
+
+            /**
+             * COMPUTE ELLIPTIC WIDGET EVALUATION
+             */
+            {
+                /**
+                 * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta
+                 * endo_sqr_term = x_2^2
+                 * endo_sqr_term *= (x_3 - x_1)
+                 * endo_sqr_term *= q_beta^2
+                 * leftovers = x_2^2
+                 * leftovers *= x_2
+                 * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget
+                 * leftovers -= (y_2^2 + y_1^2)
+                 * sign_term = y_2 * y_1
+                 * sign_term += sign_term
+                 * sign_term *= q_sign
+                 */
+                // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0
+                let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)
+                let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)
+                let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)
+                let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)
+
+                let x_add_identity :=
+                    addmod(
+                        mulmod(
+                            addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),
+                            mulmod(x_diff, x_diff, p),
+                            p
+                        ),
+                        addmod(
+                            sub(
+                                p,
+                                addmod(y2_sqr, y1_sqr, p)
+                            ),
+                            addmod(y1y2, y1y2, p),
+                            p
+                        ),
+                        p
+                    )
+                x_add_identity :=
+                    mulmod(
+                        mulmod(
+                            x_add_identity,
+                            addmod(
+                                1,
+                                sub(p, mload(QM_EVAL_LOC)),
+                                p
+                            ),
+                            p
+                        ),
+                        mload(C_ALPHA_BASE_LOC),
+                        p
+                    )
+
+                // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0
+                let y1_plus_y3 := addmod(
+                    mload(Y1_EVAL_LOC),
+                    mload(Y3_EVAL_LOC),
+                    p
+                )
+                let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)
+                let y_add_identity :=
+                    addmod(
+                        mulmod(y1_plus_y3, x_diff, p),
+                        mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),
+                        p
+                    )
+                y_add_identity :=
+                    mulmod(
+                        mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),
+                        mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),
+                        p
+                    )
+
+                // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL
+                mstore(
+                    ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)
+                )
+            }
+            {
+                /**
+                 * x_pow_4 = (y_1_sqr - curve_b) * x_1;
+                 * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;
+                 * y_1_sqr_mul_4 += y_1_sqr_mul_4;
+                 * x_1_pow_4_mul_9 = x_pow_4;
+                 * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;
+                 * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;
+                 * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;
+                 * x_1_pow_4_mul_9 += x_pow_4;
+                 * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;
+                 * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;
+                 * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);
+                 */
+                // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0
+                let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)
+                let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)
+                let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)
+                let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)
+                let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)
+                let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)
+                let x_double_identity :=
+                    addmod(
+                        mulmod(
+                            addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),
+                            y1_sqr_mul_4,
+                            p
+                        ),
+                        sub(p, x1_pow_4_mul_9),
+                        p
+                    )
+                // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0
+                let y_double_identity :=
+                    addmod(
+                        mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),
+                        sub(
+                            p,
+                            mulmod(
+                                addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),
+                                addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),
+                                p
+                            )
+                        ),
+                        p
+                    )
+                x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)
+                y_double_identity :=
+                    mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)
+                x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)
+                y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)
+                // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL
+                mstore(
+                    ELLIPTIC_IDENTITY,
+                    addmod(
+                        mload(ELLIPTIC_IDENTITY),
+                        mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),
+                        p
+                    )
+                )
+
+                // update alpha
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))
+            }
+
+            /**
+             * COMPUTE AUXILIARY WIDGET EVALUATION
+             */
+            {
+                {
+                    /**
+                     * Non native field arithmetic gate 2
+                     *             _                                                                               _
+                     *            /   _                   _                               _       14                \
+                     * q_2 . q_4 |   (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2    - w_3 - w_4   |
+                     *            \_                                                                               _/
+                     *
+                     * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2
+                     * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega
+                     * non_native_field_gate_2 = non_native_field_gate_2 * limb_size
+                     * non_native_field_gate_2 -= w_4_omega
+                     * non_native_field_gate_2 += limb_subproduct
+                     * non_native_field_gate_2 *= q_4
+                     * limb_subproduct *= limb_size
+                     * limb_subproduct += w_1_omega * w_2_omega
+                     * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3
+                     * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m
+                     * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2
+                     */
+
+                    let limb_subproduct :=
+                        addmod(
+                            mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),
+                            mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),
+                            p
+                        )
+
+                    let non_native_field_gate_2 :=
+                        addmod(
+                            addmod(
+                                mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),
+                                mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),
+                                p
+                            ),
+                            sub(p, mload(W3_OMEGA_EVAL_LOC)),
+                            p
+                        )
+                    non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)
+                    non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)
+                    non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)
+                    non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)
+                    limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)
+                    limb_subproduct :=
+                        addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)
+                    let non_native_field_gate_1 :=
+                        mulmod(
+                            addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),
+                            mload(Q3_EVAL_LOC),
+                            p
+                        )
+                    let non_native_field_gate_3 :=
+                        mulmod(
+                            addmod(
+                                addmod(limb_subproduct, mload(W4_EVAL_LOC), p),
+                                sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),
+                                p
+                            ),
+                            mload(QM_EVAL_LOC),
+                            p
+                        )
+                    let non_native_field_identity :=
+                        mulmod(
+                            addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),
+                            mload(Q2_EVAL_LOC),
+                            p
+                        )
+
+                    mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)
+                }
+
+                {
+                    /**
+                     * limb_accumulator_1 = w_2_omega;
+                     * limb_accumulator_1 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_1 += w_1_omega;
+                     * limb_accumulator_1 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_1 += w_3;
+                     * limb_accumulator_1 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_1 += w_2;
+                     * limb_accumulator_1 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_1 += w_1;
+                     * limb_accumulator_1 -= w_4;
+                     * limb_accumulator_1 *= q_4;
+                     */
+                    let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)
+                    limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)
+                    limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)
+                    limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)
+                    limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)
+                    limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)
+                    limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)
+                    limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)
+                    limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)
+                    limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)
+
+                    /**
+                     * limb_accumulator_2 = w_3_omega;
+                     * limb_accumulator_2 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_2 += w_2_omega;
+                     * limb_accumulator_2 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_2 += w_1_omega;
+                     * limb_accumulator_2 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_2 += w_4;
+                     * limb_accumulator_2 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_2 += w_3;
+                     * limb_accumulator_2 -= w_4_omega;
+                     * limb_accumulator_2 *= q_m;
+                     */
+                    let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)
+                    limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)
+                    limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)
+                    limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)
+                    limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)
+                    limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)
+                    limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)
+                    limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)
+                    limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)
+                    limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)
+
+                    mstore(
+                        AUX_LIMB_ACCUMULATOR_EVALUATION,
+                        mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)
+                    )
+                }
+
+                {
+                    /**
+                     * memory_record_check = w_3;
+                     * memory_record_check *= eta;
+                     * memory_record_check += w_2;
+                     * memory_record_check *= eta;
+                     * memory_record_check += w_1;
+                     * memory_record_check *= eta;
+                     * memory_record_check += q_c;
+                     *
+                     * partial_record_check = memory_record_check;
+                     *
+                     * memory_record_check -= w_4;
+                     */
+
+                    let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)
+                    memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)
+                    memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)
+                    memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)
+                    memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)
+                    memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)
+
+                    let partial_record_check := memory_record_check
+                    memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)
+
+                    mstore(AUX_MEMORY_EVALUATION, memory_record_check)
+
+                    // index_delta = w_1_omega - w_1
+                    let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)
+                    // record_delta = w_4_omega - w_4
+                    let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)
+                    // index_is_monotonically_increasing = index_delta * (index_delta - 1)
+                    let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)
+
+                    // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)
+                    let adjacent_values_match_if_adjacent_indices_match :=
+                        mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)
+
+                    // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check
+                    mstore(
+                        AUX_ROM_CONSISTENCY_EVALUATION,
+                        addmod(
+                            mulmod(
+                                addmod(
+                                    mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),
+                                    index_is_monotonically_increasing,
+                                    p
+                                ),
+                                mload(C_ALPHA_LOC),
+                                p
+                            ),
+                            memory_record_check,
+                            p
+                        )
+                    )
+
+                    {
+                        /**
+                         * next_gate_access_type = w_3_omega;
+                         * next_gate_access_type *= eta;
+                         * next_gate_access_type += w_2_omega;
+                         * next_gate_access_type *= eta;
+                         * next_gate_access_type += w_1_omega;
+                         * next_gate_access_type *= eta;
+                         * next_gate_access_type = w_4_omega - next_gate_access_type;
+                         */
+                        let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)
+                        next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)
+                        next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)
+                        next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)
+                        next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)
+                        next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)
+
+                        // value_delta = w_3_omega - w_3
+                        let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)
+                        //  adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);
+
+                        let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=
+                            mulmod(
+                                addmod(1, sub(p, index_delta), p),
+                                mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),
+                                p
+                            )
+
+                        // AUX_RAM_CONSISTENCY_EVALUATION
+
+                        /**
+                         * access_type = w_4 - partial_record_check
+                         * access_check = access_type^2 - access_type
+                         * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type
+                         * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;
+                         * RAM_consistency_check_identity *= alpha;
+                         * RAM_consistency_check_identity += index_is_monotonically_increasing;
+                         * RAM_consistency_check_identity *= alpha;
+                         * RAM_consistency_check_identity += next_gate_access_type_is_boolean;
+                         * RAM_consistency_check_identity *= alpha;
+                         * RAM_consistency_check_identity += access_check;
+                         */
+
+                        let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)
+                        let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)
+                        let next_gate_access_type_is_boolean :=
+                            mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)
+                        let RAM_cci :=
+                            mulmod(
+                                adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,
+                                mload(C_ALPHA_LOC),
+                                p
+                            )
+                        RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)
+                        RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)
+                        RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)
+                        RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)
+                        RAM_cci := addmod(RAM_cci, access_check, p)
+
+                        mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)
+                    }
+
+                    {
+                        // timestamp_delta = w_2_omega - w_2
+                        let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)
+
+                        // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3
+                        let RAM_timestamp_check_identity :=
+                            addmod(
+                                mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p
+                            )
+
+                        /**
+                         * memory_identity = ROM_consistency_check_identity * q_2;
+                         * memory_identity += RAM_timestamp_check_identity * q_4;
+                         * memory_identity += memory_record_check * q_m;
+                         * memory_identity *= q_1;
+                         * memory_identity += (RAM_consistency_check_identity * q_arith);
+                         *
+                         * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;
+                         * auxiliary_identity *= q_aux;
+                         * auxiliary_identity *= alpha_base;
+                         */
+                        let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)
+                        memory_identity :=
+                            addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)
+                        memory_identity :=
+                            addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)
+                        memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)
+                        memory_identity :=
+                            addmod(
+                                memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p
+                            )
+
+                        let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)
+                        auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)
+                        auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)
+                        auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)
+
+                        mstore(AUX_IDENTITY, auxiliary_identity)
+
+                        // update alpha
+                        mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))
+                    }
+                }
+            }
+
+            {
+                /**
+                 * quotient = ARITHMETIC_IDENTITY
+                 * quotient += PERMUTATION_IDENTITY
+                 * quotient += PLOOKUP_IDENTITY
+                 * quotient += SORT_IDENTITY
+                 * quotient += ELLIPTIC_IDENTITY
+                 * quotient += AUX_IDENTITY
+                 * quotient *= ZERO_POLY_INVERSE
+                 */
+                mstore(
+                    QUOTIENT_EVAL_LOC,
+                    mulmod(
+                        addmod(
+                            addmod(
+                                addmod(
+                                    addmod(
+                                        addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),
+                                        mload(ARITHMETIC_IDENTITY),
+                                        p
+                                    ),
+                                    mload(SORT_IDENTITY),
+                                    p
+                                ),
+                                mload(ELLIPTIC_IDENTITY),
+                                p
+                            ),
+                            mload(AUX_IDENTITY),
+                            p
+                        ),
+                        mload(ZERO_POLY_INVERSE_LOC),
+                        p
+                    )
+                )
+            }
+
+            /**
+             * GENERATE NU AND SEPARATOR CHALLENGES
+             */
+            {
+                let current_challenge := mload(C_CURRENT_LOC)
+                // get a calldata pointer that points to the start of the data we want to copy
+                let calldata_ptr := add(calldataload(0x04), 0x24)
+
+                calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)
+
+                mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)
+                mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))
+                calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)
+
+                // hash length = (0x20 + num field elements), we include the previous challenge in the hash
+                let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))
+
+                mstore(C_V0_LOC, mod(challenge, p))
+                // We need THIRTY-ONE independent nu challenges!
+                mstore(0x00, challenge)
+                mstore8(0x20, 0x01)
+                mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x02)
+                mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x03)
+                mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x04)
+                mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x05)
+                mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x06)
+                mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x07)
+                mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x08)
+                mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x09)
+                mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0a)
+                mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0b)
+                mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0c)
+                mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0d)
+                mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0e)
+                mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0f)
+                mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x10)
+                mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x11)
+                mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x12)
+                mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x13)
+                mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x14)
+                mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x15)
+                mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x16)
+                mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x17)
+                mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x18)
+                mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x19)
+                mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x1a)
+                mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x1b)
+                mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x1c)
+                mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x1d)
+                mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))
+
+                // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?
+                mstore8(0x20, 0x1d)
+                challenge := keccak256(0x00, 0x21)
+                mstore(C_V30_LOC, mod(challenge, p))
+
+                // separator
+                mstore(0x00, challenge)
+                mstore(0x20, mload(PI_Z_Y_LOC))
+                mstore(0x40, mload(PI_Z_X_LOC))
+                mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))
+                mstore(0x80, mload(PI_Z_OMEGA_X_LOC))
+
+                mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))
+            }
+
+            let success := 0
+            // VALIDATE T1
+            {
+                let x := mload(T1_X_LOC)
+                let y := mload(T1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(ACCUMULATOR_X_LOC, x)
+                mstore(add(ACCUMULATOR_X_LOC, 0x20), y)
+            }
+            // VALIDATE T2
+            {
+                let x := mload(T2_X_LOC) // 0x1400
+                let y := mload(T2_Y_LOC) // 0x1420
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mload(ZETA_POW_N_LOC))
+            // accumulator_2 = [T2].zeta^n
+            success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)
+            // accumulator = [T1] + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE T3
+            {
+                let x := mload(T3_X_LOC)
+                let y := mload(T3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))
+            // accumulator_2 = [T3].zeta^{2n}
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE T4
+            {
+                let x := mload(T4_X_LOC)
+                let y := mload(T4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))
+            // accumulator_2 = [T4].zeta^{3n}
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE W1
+            {
+                let x := mload(W1_X_LOC)
+                let y := mload(W1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))
+            // accumulator_2 = v0.(u + 1).[W1]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE W2
+            {
+                let x := mload(W2_X_LOC)
+                let y := mload(W2_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))
+            // accumulator_2 = v1.(u + 1).[W2]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE W3
+            {
+                let x := mload(W3_X_LOC)
+                let y := mload(W3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))
+            // accumulator_2 = v2.(u + 1).[W3]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE W4
+            {
+                let x := mload(W4_X_LOC)
+                let y := mload(W4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))
+            // accumulator_2 = v3.(u + 1).[W4]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE S
+            {
+                let x := mload(S_X_LOC)
+                let y := mload(S_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))
+            // accumulator_2 = v4.(u + 1).[S]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE Z
+            {
+                let x := mload(Z_X_LOC)
+                let y := mload(Z_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))
+            // accumulator_2 = v5.(u + 1).[Z]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE Z_LOOKUP
+            {
+                let x := mload(Z_LOOKUP_X_LOC)
+                let y := mload(Z_LOOKUP_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))
+            // accumulator_2 = v6.(u + 1).[Z_LOOKUP]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE Q1
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(Q1_X_LOC))
+            mstore(0x20, mload(Q1_Y_LOC))
+            mstore(0x40, mload(C_V7_LOC))
+            // accumulator_2 = v7.[Q1]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE Q2
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(Q2_X_LOC))
+            mstore(0x20, mload(Q2_Y_LOC))
+            mstore(0x40, mload(C_V8_LOC))
+            // accumulator_2 = v8.[Q2]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE Q3
+            
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(Q3_X_LOC))
+            mstore(0x20, mload(Q3_Y_LOC))
+            mstore(0x40, mload(C_V9_LOC))
+            // accumulator_2 = v9.[Q3]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE Q4
+            
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(Q4_X_LOC))
+            mstore(0x20, mload(Q4_Y_LOC))
+            mstore(0x40, mload(C_V10_LOC))
+            // accumulator_2 = v10.[Q4]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QM
+            
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QM_X_LOC))
+            mstore(0x20, mload(QM_Y_LOC))
+            mstore(0x40, mload(C_V11_LOC))
+            // accumulator_2 = v11.[Q;]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QC
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QC_X_LOC))
+            mstore(0x20, mload(QC_Y_LOC))
+            mstore(0x40, mload(C_V12_LOC))
+            // accumulator_2 = v12.[QC]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QARITH
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QARITH_X_LOC))
+            mstore(0x20, mload(QARITH_Y_LOC))
+            mstore(0x40, mload(C_V13_LOC))
+            // accumulator_2 = v13.[QARITH]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QSORT
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QSORT_X_LOC))
+            mstore(0x20, mload(QSORT_Y_LOC))
+            mstore(0x40, mload(C_V14_LOC))
+            // accumulator_2 = v14.[QSORT]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QELLIPTIC
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QELLIPTIC_X_LOC))
+            mstore(0x20, mload(QELLIPTIC_Y_LOC))
+            mstore(0x40, mload(C_V15_LOC))
+            // accumulator_2 = v15.[QELLIPTIC]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QAUX
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QAUX_X_LOC))
+            mstore(0x20, mload(QAUX_Y_LOC))
+            mstore(0x40, mload(C_V16_LOC))
+            // accumulator_2 = v15.[Q_AUX]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE SIGMA1
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(SIGMA1_X_LOC))
+            mstore(0x20, mload(SIGMA1_Y_LOC))
+            mstore(0x40, mload(C_V17_LOC))
+            // accumulator_2 = v17.[sigma1]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE SIGMA2
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(SIGMA2_X_LOC))
+            mstore(0x20, mload(SIGMA2_Y_LOC))
+            mstore(0x40, mload(C_V18_LOC))
+            // accumulator_2 = v18.[sigma2]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE SIGMA3
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(SIGMA3_X_LOC))
+            mstore(0x20, mload(SIGMA3_Y_LOC))
+            mstore(0x40, mload(C_V19_LOC))
+            // accumulator_2 = v19.[sigma3]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE SIGMA4
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(SIGMA4_X_LOC))
+            mstore(0x20, mload(SIGMA4_Y_LOC))
+            mstore(0x40, mload(C_V20_LOC))
+            // accumulator_2 = v20.[sigma4]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE TABLE1
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(TABLE1_X_LOC))
+            mstore(0x20, mload(TABLE1_Y_LOC))
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))
+            // accumulator_2 = u.[table1]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE TABLE2
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(TABLE2_X_LOC))
+            mstore(0x20, mload(TABLE2_Y_LOC))
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))
+            // accumulator_2 = u.[table2]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE TABLE3
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(TABLE3_X_LOC))
+            mstore(0x20, mload(TABLE3_Y_LOC))
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))
+            // accumulator_2 = u.[table3]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE TABLE4
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(TABLE4_X_LOC))
+            mstore(0x20, mload(TABLE4_Y_LOC))
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))
+            // accumulator_2 = u.[table4]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE TABLE_TYPE
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(TABLE_TYPE_X_LOC))
+            mstore(0x20, mload(TABLE_TYPE_Y_LOC))
+            mstore(0x40, mload(C_V25_LOC))
+            // accumulator_2 = v25.[TableType]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE ID1
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(ID1_X_LOC))
+            mstore(0x20, mload(ID1_Y_LOC))
+            mstore(0x40, mload(C_V26_LOC))
+            // accumulator_2 = v26.[ID1]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE ID2
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(ID2_X_LOC))
+            mstore(0x20, mload(ID2_Y_LOC))
+            mstore(0x40, mload(C_V27_LOC))
+            // accumulator_2 = v27.[ID2]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE ID3
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(ID3_X_LOC))
+            mstore(0x20, mload(ID3_Y_LOC))
+            mstore(0x40, mload(C_V28_LOC))
+            // accumulator_2 = v28.[ID3]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE ID4
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(ID4_X_LOC))
+            mstore(0x20, mload(ID4_Y_LOC))
+            mstore(0x40, mload(C_V29_LOC))
+            // accumulator_2 = v29.[ID4]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            /**
+             * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER
+             */
+            {
+                /**
+                 * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)
+                 * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)
+                 * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)
+                 * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)
+                 * batch_evaluation += v4 * (s_omega_eval * u + s_eval)
+                 * batch_evaluation += v5 * (z_omega_eval * u + z_eval)
+                 * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)
+                 */
+                let batch_evaluation :=
+                    mulmod(
+                        mload(C_V0_LOC),
+                        addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V1_LOC),
+                            addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V2_LOC),
+                            addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V3_LOC),
+                            addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V4_LOC),
+                            addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V5_LOC),
+                            addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V6_LOC),
+                            addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+
+                /**
+                 * batch_evaluation += v7 * Q1_EVAL
+                 * batch_evaluation += v8 * Q2_EVAL
+                 * batch_evaluation += v9 * Q3_EVAL
+                 * batch_evaluation += v10 * Q4_EVAL
+                 * batch_evaluation += v11 * QM_EVAL
+                 * batch_evaluation += v12 * QC_EVAL
+                 * batch_evaluation += v13 * QARITH_EVAL
+                 * batch_evaluation += v14 * QSORT_EVAL_LOC
+                 * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC
+                 * batch_evaluation += v16 * QAUX_EVAL_LOC
+                 * batch_evaluation += v17 * SIGMA1_EVAL_LOC
+                 * batch_evaluation += v18 * SIGMA2_EVAL_LOC
+                 * batch_evaluation += v19 * SIGMA3_EVAL_LOC
+                 * batch_evaluation += v20 * SIGMA4_EVAL_LOC
+                 */
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)
+
+                /**
+                 * batch_evaluation += v21 * (table1(zw) * u + table1(z))
+                 * batch_evaluation += v22 * (table2(zw) * u + table2(z))
+                 * batch_evaluation += v23 * (table3(zw) * u + table3(z))
+                 * batch_evaluation += v24 * (table4(zw) * u + table4(z))
+                 * batch_evaluation += v25 * table_type_eval
+                 * batch_evaluation += v26 * id1_eval
+                 * batch_evaluation += v27 * id2_eval
+                 * batch_evaluation += v28 * id3_eval
+                 * batch_evaluation += v29 * id4_eval
+                 * batch_evaluation += quotient_eval
+                 */
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V21_LOC),
+                            addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V22_LOC),
+                            addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V23_LOC),
+                            addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V24_LOC),
+                            addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)
+
+                mstore(0x00, 0x01) // [1].x
+                mstore(0x20, 0x02) // [1].y
+                mstore(0x40, sub(p, batch_evaluation))
+                // accumulator_2 = -[1].(batch_evaluation)
+                success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+                // accumulator = accumulator + accumulator_2
+                success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+                if iszero(success) {
+                    mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+            }
+
+            /**
+             * PERFORM PAIRING PREAMBLE
+             */
+            {
+                let u := mload(C_U_LOC)
+                let zeta := mload(C_ZETA_LOC)
+                // VALIDATE PI_Z
+                {
+                    let x := mload(PI_Z_X_LOC)
+                    let y := mload(PI_Z_Y_LOC)
+                    let xx := mulmod(x, x, q)
+                    // validate on curve
+                    if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                        mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                        revert(0x00, 0x04)
+                    }
+                    mstore(0x00, x)
+                    mstore(0x20, y)
+                }
+                // compute zeta.[PI_Z] and add into accumulator
+                mstore(0x40, zeta)
+                success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)
+                // accumulator = accumulator + accumulator_2
+                success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+                // VALIDATE PI_Z_OMEGA
+                {
+                    let x := mload(PI_Z_OMEGA_X_LOC)
+                    let y := mload(PI_Z_OMEGA_Y_LOC)
+                    let xx := mulmod(x, x, q)
+                    // validate on curve
+                    if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                        mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                        revert(0x00, 0x04)
+                    }
+                    mstore(0x00, x)
+                    mstore(0x20, y)
+                }
+                mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))
+                // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]
+                success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+                // PAIRING_RHS = accumulator + accumulator_2
+                success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))
+
+                mstore(0x00, mload(PI_Z_X_LOC))
+                mstore(0x20, mload(PI_Z_Y_LOC))
+                mstore(0x40, mload(PI_Z_OMEGA_X_LOC))
+                mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))
+                mstore(0x80, u)
+                success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))
+                // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u
+                success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))
+                // negate lhs y-coordinate
+                mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))
+
+                if mload(CONTAINS_RECURSIVE_PROOF_LOC) {
+                    // VALIDATE RECURSIVE P1
+                    {
+                        let x := mload(RECURSIVE_P1_X_LOC)
+                        let y := mload(RECURSIVE_P1_Y_LOC)
+                        let xx := mulmod(x, x, q)
+                        // validate on curve
+                        if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                            mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                            revert(0x00, 0x04)
+                        }
+                        mstore(0x00, x)
+                        mstore(0x20, y)
+                    }
+
+                    // compute u.u.[recursive_p1] and write into 0x60
+                    mstore(0x40, mulmod(u, u, p))
+                    success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))
+                    // VALIDATE RECURSIVE P2
+                    {
+                        let x := mload(RECURSIVE_P2_X_LOC)
+                        let y := mload(RECURSIVE_P2_Y_LOC)
+                        let xx := mulmod(x, x, q)
+                        // validate on curve
+                        if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                            mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                            revert(0x00, 0x04)
+                        }
+                        mstore(0x00, x)
+                        mstore(0x20, y)
+                    }
+                    // compute u.u.[recursive_p2] and write into 0x00
+                    // 0x40 still contains u*u
+                    success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))
+
+                    // compute u.u.[recursiveP1] + rhs and write into rhs
+                    mstore(0xa0, mload(PAIRING_RHS_X_LOC))
+                    mstore(0xc0, mload(PAIRING_RHS_Y_LOC))
+                    success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))
+
+                    // compute u.u.[recursiveP2] + lhs and write into lhs
+                    mstore(0x40, mload(PAIRING_LHS_X_LOC))
+                    mstore(0x60, mload(PAIRING_LHS_Y_LOC))
+                    success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))
+                }
+
+                if iszero(success) {
+                    mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+            }
+
+            /**
+             * PERFORM PAIRING
+             */
+            {
+                // rhs paired with [1]_2
+                // lhs paired with [x]_2
+
+                mstore(0x00, mload(PAIRING_RHS_X_LOC))
+                mstore(0x20, mload(PAIRING_RHS_Y_LOC))
+                mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2
+                mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)
+                mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)
+                mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)
+
+                mstore(0xc0, mload(PAIRING_LHS_X_LOC))
+                mstore(0xe0, mload(PAIRING_LHS_Y_LOC))
+                mstore(0x100, mload(G2X_X0_LOC))
+                mstore(0x120, mload(G2X_X1_LOC))
+                mstore(0x140, mload(G2X_Y0_LOC))
+                mstore(0x160, mload(G2X_Y1_LOC))
+
+                success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)
+                if iszero(and(success, mload(0x00))) {
+                    mstore(0x0, PAIRING_FAILED_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+            }
+
+            {
+                mstore(0x00, 0x01)
+                return(0x00, 0x20) // Proof succeeded!
+            }
+        }
+    }
+}
+
+contract UltraVerifier is BaseUltraVerifier {
+    function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {
+        return UltraVerificationKey.verificationKeyHash();
+    }
+
+    function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {
+        UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);
+    }
+}
diff --git a/momiji-helpers/circuits/publish/proofs/publish.proof b/momiji-helpers/circuits/publish/proofs/publish.proof
new file mode 100644
index 0000000000000000000000000000000000000000..99e07d0f062d4576ddb676126b36989598b419f9
--- /dev/null
+++ b/momiji-helpers/circuits/publish/proofs/publish.proof
@@ -0,0 +1 @@
+0x
\ No newline at end of file
diff --git a/momiji-helpers/circuits/publish/src/main.nr b/momiji-helpers/circuits/publish/src/main.nr
new file mode 100644
index 0000000000000000000000000000000000000000..435d538b8109bcaba5b232c4ce81819fbac0c747
--- /dev/null
+++ b/momiji-helpers/circuits/publish/src/main.nr
@@ -0,0 +1,67 @@
+use dep::std;
+use dep::helpers;
+use dep::helpers::hash;
+use dep::helpers::structs;
+
+fn main(
+    pi_contract_hash: pub Field,
+
+    accumulator: Field,
+    batch: structs::Batch,
+    tx_verifier: structs::VerifierTx,
+    recursion_verifier: structs::Verifier
+) {
+
+    let tx_root_calc: Field = hash::hash_tree_four(batch.utxo_roots); 
+
+    assert(batch.batch_oracle == helpers::ZERO_VALUE); 
+    
+    let batch_root_calc: Field = hash::hash([tx_root_calc, batch.batch_oracle]);
+    let new_root_calc: Field = hash::hash([batch_root_calc, batch.old_state_root]);
+    let new_path_calc: [Field; 20] = hash::compute_sibling_path(
+        batch.hist_tree.old_path, 
+        batch.hist_tree.leaf,
+        batch.hist_tree.index
+    );
+    assert(batch.new_state_root == new_root_calc); 
+
+    let calc_hist_root = hash::compute_merkle_root(
+            batch.hist_tree.leaf,
+            batch.hist_tree.index,
+            batch.hist_tree.old_path
+    );
+
+    assert(calc_hist_root == batch.hist_tree.root);
+
+    let hist_root_calc = hash::compute_merkle_root(
+            new_root_calc,
+            batch.hist_tree.index + 1,
+            new_path_calc
+    );
+
+    assert(hist_root_calc == batch.hist_tree.new_root);
+
+    let mut hash_validation: [u8; 832] = [0; 832];
+    for i in 0..32 {
+        hash_validation[i] = hash::field_to_u8(batch.new_state_root)[i];
+        hash_validation[i + 32] = hash::field_to_u8(batch.hist_tree.root)[i];
+        hash_validation[i + 64] = hash::field_to_u8(batch.hist_tree.new_root)[i];
+        hash_validation[i + 96] = hash::field_to_u8(accumulator)[i];
+        hash_validation[i + 128] = hash::field_to_u8(tx_verifier.key_hash)[i];
+        hash_validation[i + 160] = hash::field_to_u8(recursion_verifier.key_hash)[i];
+        for j in 0..20 {
+            hash_validation[i + 192 + (32 * j)] = hash::field_to_u8(new_path_calc[j])[i];
+        }
+    }
+
+    let hash_generated: Field = hash::hash_to_field(std::hash::keccak256(hash_validation, hash_validation.len() as u32));
+    assert(pi_contract_hash == hash_generated);
+
+    std::verify_proof(
+        recursion_verifier.verification_key.as_slice(), 
+        recursion_verifier.proof.as_slice(), 
+        [accumulator].as_slice(), 
+        recursion_verifier.key_hash
+    )
+
+}
\ No newline at end of file
diff --git a/momiji-helpers/circuits/recursion/Nargo.toml b/momiji-helpers/circuits/recursion/Nargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..a682adbea01d47ad431cef98ed9d3e3abde6d0a2
--- /dev/null
+++ b/momiji-helpers/circuits/recursion/Nargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "recursion"
+type = "bin"
+authors = [""]
+compiler_version = ">=0.19.2"
+
+[dependencies]
+helpers = { path = "../helpers" }
diff --git a/momiji-helpers/circuits/recursion/Prover.toml b/momiji-helpers/circuits/recursion/Prover.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/momiji-helpers/circuits/recursion/Verifier.toml b/momiji-helpers/circuits/recursion/Verifier.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/momiji-helpers/circuits/recursion/proofs/proof b/momiji-helpers/circuits/recursion/proofs/proof
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/momiji-helpers/circuits/recursion/src/main.nr b/momiji-helpers/circuits/recursion/src/main.nr
new file mode 100644
index 0000000000000000000000000000000000000000..4cbd61e887137745560d0c6de28cdbe01f5d01c0
--- /dev/null
+++ b/momiji-helpers/circuits/recursion/src/main.nr
@@ -0,0 +1,49 @@
+use dep::std;
+use dep::helpers;
+use dep::helpers::structs;
+use dep::helpers::hash;
+
+#[recursive]
+fn main(
+    accumulator: pub Field,
+    tx_verifier: structs::VerifierTx,
+    recursion_verifier: structs::Verifier,
+
+    previous_accumulator: Field,
+    tx: structs::PublicInputs
+) {
+    let tx_as_keccak = tx.as_keccak();
+
+    let mut generated_accumulator_preimage: [u8; 128] = [0; 128];
+    for i in 0..32 {
+        generated_accumulator_preimage[i] = hash::field_to_u8(previous_accumulator)[i];
+        generated_accumulator_preimage[i + 32] = hash::field_to_u8(tx_as_keccak)[i];
+        generated_accumulator_preimage[i + 64] = hash::field_to_u8(tx_verifier.key_hash)[i];
+        generated_accumulator_preimage[i + 96] = hash::field_to_u8(recursion_verifier.key_hash)[i];
+    }
+
+    let generated_accumulator = hash::hash_to_field(std::hash::keccak256(generated_accumulator_preimage, generated_accumulator_preimage.len() as u32));
+    assert(accumulator == generated_accumulator);
+
+    let mut recursion_pi: Field = previous_accumulator;
+    let mut recursive_proof: [Field] = recursion_verifier.proof.as_slice();
+    
+    if (previous_accumulator == helpers::ZERO_VALUE) { 
+        assert(recursion_verifier.key_hash == 0x083764da4a71646a7c2d27cf8f17adc4f9e4f3d2c5a574b643f79864c280b4ce);
+        recursion_pi = tx.as_hash();
+    }
+    std::verify_proof(
+        recursion_verifier.verification_key.as_slice(), 
+        recursive_proof, 
+        [recursion_pi].as_slice(), 
+        recursion_verifier.key_hash 
+    );
+
+    std::verify_proof(
+        tx_verifier.verification_key.as_slice(), 
+        tx_verifier.proof.as_slice(), 
+        [tx.as_hash()].as_slice(), 
+        tx_verifier.key_hash 
+    );
+
+}
\ No newline at end of file
diff --git a/momiji-helpers/circuits/recursion/target/acir.gz b/momiji-helpers/circuits/recursion/target/acir.gz
new file mode 100644
index 0000000000000000000000000000000000000000..7f1b15787536ff32f41a4f5c96973b54da5836e7
Binary files /dev/null and b/momiji-helpers/circuits/recursion/target/acir.gz differ
diff --git a/momiji-helpers/circuits/recursion/target/vk b/momiji-helpers/circuits/recursion/target/vk
new file mode 100644
index 0000000000000000000000000000000000000000..a6f08feb97825d5af54333ef79f686a34971c674
Binary files /dev/null and b/momiji-helpers/circuits/recursion/target/vk differ
diff --git a/momiji-helpers/circuits/recursion/target/vk_fields.json b/momiji-helpers/circuits/recursion/target/vk_fields.json
new file mode 100644
index 0000000000000000000000000000000000000000..149ff4c022c5ad570c5405868640ce106e11751d
--- /dev/null
+++ b/momiji-helpers/circuits/recursion/target/vk_fields.json
@@ -0,0 +1 @@
+["0x1727d9cce8edf8b1d7228edf940be5ab221dc023f0e21785e634f5dcf9718007","0x26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da953337857","0x0000000000000000000000000000000000000000000000000000000000100000","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000100000","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000b","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000001ed8a02482426d263a4ecb0ef896ce89aa","0x00000000000000000000000000000000002dd82b96a445a3d48db46e78fd1fe5","0x0000000000000000000000000000001a810690ec0eb9e6cb49dd68aed57b9a2c","0x00000000000000000000000000000000002979d0f3b9cbc56e6a5eed0176979c","0x000000000000000000000000000000ece4843dd3e3cb41a29ffcc72d49376ac5","0x000000000000000000000000000000000013f586937d9e92ad01910eaf7267fe","0x000000000000000000000000000000832de083f2aea887e5b0b3e07195bf3369","0x0000000000000000000000000000000000020d7d6640cc6909b63450357223cd","0x0000000000000000000000000000001a1e30f8051c1e84c165acf80086e8dfca","0x00000000000000000000000000000000002c77a04e17e8644f9b7053b4bb08fa","0x000000000000000000000000000000accbe6a903bb7bfaf1909074da32f28e74","0x000000000000000000000000000000000010ef1c64b5aa796d3218d20cfdb0a4","0x000000000000000000000000000000cbc1cc027a33d219526471449d9049146a","0x00000000000000000000000000000000000735dd552cfe8a4cf17f17049626d0","0x000000000000000000000000000000f3576e636ff3ebaff43f0d1c8294b67a8c","0x00000000000000000000000000000000001bb99e027a879809200c2f3e9992da","0x00000000000000000000000000000004f1b4950d8b0919092c8b596a63e9396e","0x00000000000000000000000000000000001e031462c21a2937998d8ab726051a","0x000000000000000000000000000000618474ad492a93435a82a433a1ae1b5c04","0x00000000000000000000000000000000001beb3c3937fc9ff20499d59cc4665e","0x000000000000000000000000000000053a4799f326db1157b41ba75481ac65ce","0x00000000000000000000000000000000002a6cafad02233a289b5ee0dac52d24","0x00000000000000000000000000000029b0e33ec90e9b6e7c0c774b2a394f5c90","0x00000000000000000000000000000000000ff63c1bf54473c34651e117d63bbb","0x000000000000000000000000000000a0098ac613ba3629b0421d7894f0bc65d8","0x00000000000000000000000000000000001f58e2dbf833ed8c21a5ac822a390e","0x000000000000000000000000000000ad30140ddc344a8ac7a49d29b0b600d888","0x000000000000000000000000000000000000b0088164d522367583c90f73bcd7","0x0000000000000000000000000000004a05d497f585103d826b8a133761cc79ef","0x000000000000000000000000000000000011888c79e6b006e1a7d293898b9842","0x00000000000000000000000000000039b41a3dfe9e948d33fd4a759e9e8a7b30","0x00000000000000000000000000000000000427be5203eb43e160d9635925f64a","0x000000000000000000000000000000c0b125470d496d55ec3d8678b1efcc0b14","0x00000000000000000000000000000000000a346d061bfa2ad56a322a81a8be06","0x000000000000000000000000000000e36f8d9132dccbddbcbc4eca6bdb70583a","0x000000000000000000000000000000000006e53484e1a4f26129c00c5afdf4d4","0x000000000000000000000000000000d56ff07f6c8d054cf78d713a5f4399313b","0x000000000000000000000000000000000009fa75fa397a889177953777b32ad7","0x000000000000000000000000000000a9eba193f17a0cbcfd5cd786e8fc93e044","0x0000000000000000000000000000000000231e1180c41ca9fcad8207beb4aeb2","0x000000000000000000000000000000439f7eb6e39f8ef36735fde1563efc018c","0x0000000000000000000000000000000000131bb8b31246156eac5a9632b1c44c","0x000000000000000000000000000000ff14d910386a5d634a00deb8432bd230bd","0x0000000000000000000000000000000000032cf0e4f77b2c32b39804b2e836a1","0x00000000000000000000000000000059d45db08da921eb51ee629b37eaac3804","0x00000000000000000000000000000000001351c4d6ee97e5a13968cd8b575376","0x000000000000000000000000000000a1fef20a9e9baae03c66b387855786961c","0x00000000000000000000000000000000000087e919ca347c14bae58f2a007979","0x00000000000000000000000000000068c2dee24bf49f48ca91a9b31cf489100a","0x00000000000000000000000000000000002ebbec213fd5e638e763bf574db1dd","0x000000000000000000000000000000405686bb9661ab548fc6490de8273991c1","0x00000000000000000000000000000000000f55573e8cc6debc7e4ad36f55f0a3","0x00000000000000000000000000000016c8911d3abcc99956cfafd2469e57d352","0x000000000000000000000000000000000023987c17049de9e6e90534922b068d","0x000000000000000000000000000000310a00459798915e70bb5f6c0d93950c61","0x0000000000000000000000000000000000190404b6761da87bbb58c68adf9c07","0x0000000000000000000000000000007003780317cc6fecafa2529793ea4d856a","0x00000000000000000000000000000000000c49e1acc2e2a5ed2523a68e13bcc7","0x0000000000000000000000000000004564d9adecd904030f441c500bea3a54e8","0x0000000000000000000000000000000000118e887dc7827a303ae4efd884289f","0x00000000000000000000000000000055bcb8484f4bfca2d81c1a7a08f92dcc1e","0x0000000000000000000000000000000000192d66138ef5fb5cbd60d25910fa8b","0x0000000000000000000000000000006ce36390303806bf1667cac7fd3a0a911f","0x000000000000000000000000000000000025719fd7b4f27bd77387d4580c46ef","0x000000000000000000000000000000e15e5e8edb26147b877fd483a9be1ee557","0x00000000000000000000000000000000000d4744317ff703c20132134b9af145","0x00000000000000000000000000000097931bbb683b832edaedfb84ae020a3e6c","0x000000000000000000000000000000000024e913db937478f592ff958369c33b","0x000000000000000000000000000000aad0edb65a7896339ad92cb7bdda5bc0cb","0x00000000000000000000000000000000001f13f1759e514b1f053da73837b9bf","0x000000000000000000000000000000b5928facba6909a6cb9d3f99b451dbb0da","0x0000000000000000000000000000000000140e3a61cbd87e23e9f59c0c8a5f92","0x0000000000000000000000000000000c542c4e643211a206a43e3c82940ce012","0x0000000000000000000000000000000000073ab903217225282916b264ffbd6f","0x000000000000000000000000000000362a93230a711f6dff86b1a347c978b220","0x00000000000000000000000000000000001a14bd51e9dc0b4b973e46910d2b6f","0x000000000000000000000000000000e13a606550f2c61830bf9da814621581ee","0x00000000000000000000000000000000001297f1e111cc1ea7a2221affb5eecd","0x00000000000000000000000000000000aa60b3f6dc00be97871878c40d04a293","0x000000000000000000000000000000000007f762063f0123fba74c4cd66e7559","0x000000000000000000000000000000541c1db7e3c80a294ea50b24011999fe4e","0x00000000000000000000000000000000002e238e496f9533c8fe3a9342fcf1f6","0x000000000000000000000000000000f65f2ad1025c0ec713b29b2db4c57e83d6","0x000000000000000000000000000000000013ff20a10295d07fd0b16253a6775a","0x00000000000000000000000000000026d344ed7a87caa6087967171876052349","0x00000000000000000000000000000000002626bea2de7026dd6dd4e1df614a65","0x000000000000000000000000000000b264d3a3a6bb7a41d57f96e6877e5bb37d","0x0000000000000000000000000000000000275f1c996d71439acf76f03932c52c","0x000000000000000000000000000000c8b2af388b1f0b0832ca8f2a0154be54ce","0x00000000000000000000000000000000003020cfd271da8c447e2ccff6908c3a","0x00000000000000000000000000000008e8f770eef342595ebce4b42811af4966","0x000000000000000000000000000000000002ae8005a2c1cc97d4cdc896b54e70"]
\ No newline at end of file
diff --git a/momiji-helpers/circuits/transaction/Nargo.toml b/momiji-helpers/circuits/transaction/Nargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..cdd030485ef8303f812da7959b5d3cfddde98e18
--- /dev/null
+++ b/momiji-helpers/circuits/transaction/Nargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "transaction"
+type = "bin"
+authors = [""]
+compiler_version = ">=0.19.2"
+
+[dependencies]
+helpers = { path = "../helpers" }
\ No newline at end of file
diff --git a/momiji-helpers/circuits/transaction/Prover.toml b/momiji-helpers/circuits/transaction/Prover.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/momiji-helpers/circuits/transaction/Verifier.toml b/momiji-helpers/circuits/transaction/Verifier.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/momiji-helpers/circuits/transaction/src/main.nr b/momiji-helpers/circuits/transaction/src/main.nr
new file mode 100644
index 0000000000000000000000000000000000000000..b7ae11f98622bdc7ddf43ae683736da27057f3e2
--- /dev/null
+++ b/momiji-helpers/circuits/transaction/src/main.nr
@@ -0,0 +1,91 @@
+use dep::std;
+use dep::helpers;
+use dep::helpers::hash;
+use dep::helpers::structs;
+
+#[recursive]
+fn main(
+  public_inputs_hash: pub Field, 
+  public_inputs: structs::PublicInputs, 
+  private_inputs: structs::PrivateInputs
+) {
+
+    let tx_hash: Field = hash::hash_tx(public_inputs);
+
+    assert(tx_hash == public_inputs_hash);
+    
+    let mut sum_in: Field = public_inputs.deposit_amount;
+    let mut sum_out: Field = public_inputs.withdrawals;
+    
+    for i in 0..16 {
+    if (private_inputs.utxo_in[i].amount != helpers::ZERO_VALUE) {
+            let owner = hash::hash([private_inputs.secrets[i]]);
+            assert(owner == private_inputs.utxo_in[i].owner);
+
+            assert(public_inputs.nullifier_hashes[i] == hash::hash([private_inputs.secrets[i], private_inputs.secrets[i]]));
+
+            let commitment_in = hash::hash([private_inputs.utxo_in[i].owner, private_inputs.utxo_in[i].amount, private_inputs.utxo_in[i].asset_type]);
+
+            if (public_inputs.commitment_in[i] == helpers::ZERO_VALUE) {
+
+                let utxo_root = hash::compute_merkle_root(
+                    commitment_in,
+                    private_inputs.merkle_proofs[i].index_utxo,
+                    private_inputs.merkle_proofs[i].path_utxo
+                );
+
+                let tx_root = hash::compute_merkle_root(
+                    utxo_root,
+                    private_inputs.merkle_proofs[i].index_tx,
+                    private_inputs.merkle_proofs[i].path_tx
+                );
+
+                let leaf_batch = hash::hash([tx_root, private_inputs.oracle[i]]);
+
+                assert(private_inputs.oracle[i] == helpers::ZERO_VALUE); 
+
+                let leaf_historic = hash::hash([leaf_batch, private_inputs.old_root_proof[i]]);
+
+                let historic_root = hash::compute_merkle_root(
+                    leaf_historic, 
+                    private_inputs.merkle_proofs[i].index_historic,
+                    private_inputs.merkle_proofs[i].path_historic
+                );
+                assert(historic_root == public_inputs.current_root);
+
+            } else {
+                assert(commitment_in == public_inputs.commitment_in[i]);
+            }
+
+            let sum_in_old: Field = sum_in;
+            sum_in += private_inputs.utxo_in[i].amount;
+            if (sum_in_old != sum_in) {
+                assert(sum_in_old.lt(sum_in));
+            }
+        
+        }
+        
+    }
+
+    for k in 0..16 {
+        if (public_inputs.commitment_out[k] != ZERO_VALUE) {
+
+            assert(private_inputs.utxo_out[k].amount.lt(sum_in + 1));
+            
+            let sum_out_old: Field = sum_out;
+            sum_out += private_inputs.utxo_out[k].amount;
+            if (sum_out_old != sum_out) {
+                assert(sum_out_old.lt(sum_out));
+            }
+
+            let commitment_out_calc = hash::hash([private_inputs.utxo_out[k].owner, private_inputs.utxo_out[k].amount, private_inputs.utxo_out[k].asset_type]);
+            assert(commitment_out_calc == public_inputs.commitment_out[k]);
+        }
+    }
+    
+    assert(sum_in == sum_out);
+    
+    let utxo_root_calc: Field = hash::hash_tree_four(public_inputs.commitment_out);
+    assert(utxo_root_calc == public_inputs.utxo_root);
+
+}
\ No newline at end of file
diff --git a/momiji-helpers/circuits/transaction_wrapper/Nargo.toml b/momiji-helpers/circuits/transaction_wrapper/Nargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..038e469b78017d6831d1d1f355b4373a774c40c4
--- /dev/null
+++ b/momiji-helpers/circuits/transaction_wrapper/Nargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "transaction_wrapper"
+type = "bin"
+authors = [""]
+compiler_version = ">=0.19.2"
+
+[dependencies]
+helpers = { path = "../helpers" }
\ No newline at end of file
diff --git a/momiji-helpers/circuits/transaction_wrapper/Prover.toml b/momiji-helpers/circuits/transaction_wrapper/Prover.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/momiji-helpers/circuits/transaction_wrapper/Verifier.toml b/momiji-helpers/circuits/transaction_wrapper/Verifier.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/momiji-helpers/circuits/transaction_wrapper/src/main.nr b/momiji-helpers/circuits/transaction_wrapper/src/main.nr
new file mode 100644
index 0000000000000000000000000000000000000000..11937ffbb7cfcee2592311f63fd7850f306bf6ff
--- /dev/null
+++ b/momiji-helpers/circuits/transaction_wrapper/src/main.nr
@@ -0,0 +1,20 @@
+use dep::std;
+use dep::helpers;
+use dep::helpers::hash;
+use dep::helpers::structs;
+
+global tx_vkHash: Field = 0x2e592c2ade5527a4aaa1a68b75bdff97876a8bc89c8d41a704f1e2b23a82b698;
+
+#[recursive]
+fn main(
+  public_inputs_hash: pub Field, 
+  transaction_verifier: structs::VerifierTx
+) {
+    assert(transaction_verifier.key_hash == tx_vkHash);
+    std::verify_proof(
+        transaction_verifier.verification_key.as_slice(), 
+        transaction_verifier.proof.as_slice(), 
+        [public_inputs_hash].as_slice(), 
+        transaction_verifier.key_hash 
+    );
+}
\ No newline at end of file
diff --git a/momiji-helpers/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.sol b/momiji-helpers/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.sol
new file mode 100644
index 0000000000000000000000000000000000000000..fe0cef094ecaf2e63f0f096921d5b74927464e1d
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.sol
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+interface AggregatorInterface {
+  function latestAnswer() external view returns (int256);
+
+  function latestTimestamp() external view returns (uint256);
+
+  function latestRound() external view returns (uint256);
+
+  function getAnswer(uint256 roundId) external view returns (int256);
+
+  function getTimestamp(uint256 roundId) external view returns (uint256);
+
+  event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);
+
+  event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol b/momiji-helpers/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol
new file mode 100644
index 0000000000000000000000000000000000000000..4cb40c104e1d2cd81a8275262a893be4f1db193c
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import "./AggregatorInterface.sol";
+import "./AggregatorV3Interface.sol";
+
+interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface {}
diff --git a/momiji-helpers/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol b/momiji-helpers/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol
new file mode 100644
index 0000000000000000000000000000000000000000..d3eab7b3e06f256c9c9a89fb3513f398ec96b9f8
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+interface AggregatorV3Interface {
+  function decimals() external view returns (uint8);
+
+  function description() external view returns (string memory);
+
+  function version() external view returns (uint256);
+
+  function getRoundData(
+    uint80 _roundId
+  ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
+
+  function latestRoundData()
+    external
+    view
+    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol
new file mode 100644
index 0000000000000000000000000000000000000000..fae3fef4bdc9122bd6ea91c9657f38ac1205c3aa
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol
@@ -0,0 +1,119 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
+
+pragma solidity ^0.8.20;
+
+import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
+import {Initializable} from "../proxy/utils/Initializable.sol";
+
+/**
+ * @dev Contract module which provides a basic access control mechanism, where
+ * there is an account (an owner) that can be granted exclusive access to
+ * specific functions.
+ *
+ * The initial owner is set to the address provided by the deployer. This can
+ * later be changed with {transferOwnership}.
+ *
+ * This module is used through inheritance. It will make available the modifier
+ * `onlyOwner`, which can be applied to your functions to restrict their use to
+ * the owner.
+ */
+abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
+    /// @custom:storage-location erc7201:openzeppelin.storage.Ownable
+    struct OwnableStorage {
+        address _owner;
+    }
+
+    // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff))
+    bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;
+
+    function _getOwnableStorage() private pure returns (OwnableStorage storage $) {
+        assembly {
+            $.slot := OwnableStorageLocation
+        }
+    }
+
+    /**
+     * @dev The caller account is not authorized to perform an operation.
+     */
+    error OwnableUnauthorizedAccount(address account);
+
+    /**
+     * @dev The owner is not a valid owner account. (eg. `address(0)`)
+     */
+    error OwnableInvalidOwner(address owner);
+
+    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
+
+    /**
+     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
+     */
+    function __Ownable_init(address initialOwner) internal onlyInitializing {
+        __Ownable_init_unchained(initialOwner);
+    }
+
+    function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {
+        if (initialOwner == address(0)) {
+            revert OwnableInvalidOwner(address(0));
+        }
+        _transferOwnership(initialOwner);
+    }
+
+    /**
+     * @dev Throws if called by any account other than the owner.
+     */
+    modifier onlyOwner() {
+        _checkOwner();
+        _;
+    }
+
+    /**
+     * @dev Returns the address of the current owner.
+     */
+    function owner() public view virtual returns (address) {
+        OwnableStorage storage $ = _getOwnableStorage();
+        return $._owner;
+    }
+
+    /**
+     * @dev Throws if the sender is not the owner.
+     */
+    function _checkOwner() internal view virtual {
+        if (owner() != _msgSender()) {
+            revert OwnableUnauthorizedAccount(_msgSender());
+        }
+    }
+
+    /**
+     * @dev Leaves the contract without owner. It will not be possible to call
+     * `onlyOwner` functions. Can only be called by the current owner.
+     *
+     * NOTE: Renouncing ownership will leave the contract without an owner,
+     * thereby disabling any functionality that is only available to the owner.
+     */
+    function renounceOwnership() public virtual onlyOwner {
+        _transferOwnership(address(0));
+    }
+
+    /**
+     * @dev Transfers ownership of the contract to a new account (`newOwner`).
+     * Can only be called by the current owner.
+     */
+    function transferOwnership(address newOwner) public virtual onlyOwner {
+        if (newOwner == address(0)) {
+            revert OwnableInvalidOwner(address(0));
+        }
+        _transferOwnership(newOwner);
+    }
+
+    /**
+     * @dev Transfers ownership of the contract to a new account (`newOwner`).
+     * Internal function without access restriction.
+     */
+    function _transferOwnership(address newOwner) internal virtual {
+        OwnableStorage storage $ = _getOwnableStorage();
+        address oldOwner = $._owner;
+        $._owner = newOwner;
+        emit OwnershipTransferred(oldOwner, newOwner);
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol
new file mode 100644
index 0000000000000000000000000000000000000000..b3d82b586e2209f08e45f9b624aacc9517ad1083
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol
@@ -0,0 +1,228 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)
+
+pragma solidity ^0.8.20;
+
+/**
+ * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
+ * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
+ * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
+ * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
+ *
+ * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
+ * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
+ * case an upgrade adds a module that needs to be initialized.
+ *
+ * For example:
+ *
+ * [.hljs-theme-light.nopadding]
+ * ```solidity
+ * contract MyToken is ERC20Upgradeable {
+ *     function initialize() initializer public {
+ *         __ERC20_init("MyToken", "MTK");
+ *     }
+ * }
+ *
+ * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
+ *     function initializeV2() reinitializer(2) public {
+ *         __ERC20Permit_init("MyToken");
+ *     }
+ * }
+ * ```
+ *
+ * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
+ * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
+ *
+ * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
+ * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
+ *
+ * [CAUTION]
+ * ====
+ * Avoid leaving a contract uninitialized.
+ *
+ * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
+ * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
+ * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
+ *
+ * [.hljs-theme-light.nopadding]
+ * ```
+ * /// @custom:oz-upgrades-unsafe-allow constructor
+ * constructor() {
+ *     _disableInitializers();
+ * }
+ * ```
+ * ====
+ */
+abstract contract Initializable {
+    /**
+     * @dev Storage of the initializable contract.
+     *
+     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions
+     * when using with upgradeable contracts.
+     *
+     * @custom:storage-location erc7201:openzeppelin.storage.Initializable
+     */
+    struct InitializableStorage {
+        /**
+         * @dev Indicates that the contract has been initialized.
+         */
+        uint64 _initialized;
+        /**
+         * @dev Indicates that the contract is in the process of being initialized.
+         */
+        bool _initializing;
+    }
+
+    // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff))
+    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;
+
+    /**
+     * @dev The contract is already initialized.
+     */
+    error InvalidInitialization();
+
+    /**
+     * @dev The contract is not initializing.
+     */
+    error NotInitializing();
+
+    /**
+     * @dev Triggered when the contract has been initialized or reinitialized.
+     */
+    event Initialized(uint64 version);
+
+    /**
+     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
+     * `onlyInitializing` functions can be used to initialize parent contracts.
+     *
+     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any
+     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in
+     * production.
+     *
+     * Emits an {Initialized} event.
+     */
+    modifier initializer() {
+        // solhint-disable-next-line var-name-mixedcase
+        InitializableStorage storage $ = _getInitializableStorage();
+
+        // Cache values to avoid duplicated sloads
+        bool isTopLevelCall = !$._initializing;
+        uint64 initialized = $._initialized;
+
+        // Allowed calls:
+        // - initialSetup: the contract is not in the initializing state and no previous version was
+        //                 initialized
+        // - construction: the contract is initialized at version 1 (no reininitialization) and the
+        //                 current contract is just being deployed
+        bool initialSetup = initialized == 0 && isTopLevelCall;
+        bool construction = initialized == 1 && address(this).code.length == 0;
+
+        if (!initialSetup && !construction) {
+            revert InvalidInitialization();
+        }
+        $._initialized = 1;
+        if (isTopLevelCall) {
+            $._initializing = true;
+        }
+        _;
+        if (isTopLevelCall) {
+            $._initializing = false;
+            emit Initialized(1);
+        }
+    }
+
+    /**
+     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
+     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
+     * used to initialize parent contracts.
+     *
+     * A reinitializer may be used after the original initialization step. This is essential to configure modules that
+     * are added through upgrades and that require initialization.
+     *
+     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
+     * cannot be nested. If one is invoked in the context of another, execution will revert.
+     *
+     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
+     * a contract, executing them in the right order is up to the developer or operator.
+     *
+     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.
+     *
+     * Emits an {Initialized} event.
+     */
+    modifier reinitializer(uint64 version) {
+        // solhint-disable-next-line var-name-mixedcase
+        InitializableStorage storage $ = _getInitializableStorage();
+
+        if ($._initializing || $._initialized >= version) {
+            revert InvalidInitialization();
+        }
+        $._initialized = version;
+        $._initializing = true;
+        _;
+        $._initializing = false;
+        emit Initialized(version);
+    }
+
+    /**
+     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
+     * {initializer} and {reinitializer} modifiers, directly or indirectly.
+     */
+    modifier onlyInitializing() {
+        _checkInitializing();
+        _;
+    }
+
+    /**
+     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.
+     */
+    function _checkInitializing() internal view virtual {
+        if (!_isInitializing()) {
+            revert NotInitializing();
+        }
+    }
+
+    /**
+     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
+     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
+     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called
+     * through proxies.
+     *
+     * Emits an {Initialized} event the first time it is successfully executed.
+     */
+    function _disableInitializers() internal virtual {
+        // solhint-disable-next-line var-name-mixedcase
+        InitializableStorage storage $ = _getInitializableStorage();
+
+        if ($._initializing) {
+            revert InvalidInitialization();
+        }
+        if ($._initialized != type(uint64).max) {
+            $._initialized = type(uint64).max;
+            emit Initialized(type(uint64).max);
+        }
+    }
+
+    /**
+     * @dev Returns the highest version that has been initialized. See {reinitializer}.
+     */
+    function _getInitializedVersion() internal view returns (uint64) {
+        return _getInitializableStorage()._initialized;
+    }
+
+    /**
+     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
+     */
+    function _isInitializing() internal view returns (bool) {
+        return _getInitializableStorage()._initializing;
+    }
+
+    /**
+     * @dev Returns a pointer to the storage namespace.
+     */
+    // solhint-disable-next-line var-name-mixedcase
+    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
+        assembly {
+            $.slot := INITIALIZABLE_STORAGE
+        }
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol
new file mode 100644
index 0000000000000000000000000000000000000000..04d7ad8a30cd690be75b0d626bb042a7b141ded4
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol
@@ -0,0 +1,153 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/UUPSUpgradeable.sol)
+
+pragma solidity ^0.8.20;
+
+import {IERC1822Proxiable} from "@openzeppelin/contracts/interfaces/draft-IERC1822.sol";
+import {ERC1967Utils} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol";
+import {Initializable} from "./Initializable.sol";
+
+/**
+ * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
+ * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
+ *
+ * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
+ * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
+ * `UUPSUpgradeable` with a custom implementation of upgrades.
+ *
+ * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
+ */
+abstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {
+    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable
+    address private immutable __self = address(this);
+
+    /**
+     * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`
+     * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,
+     * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.
+     * If the getter returns `"5.0.0"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must
+     * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function
+     * during an upgrade.
+     */
+    string public constant UPGRADE_INTERFACE_VERSION = "5.0.0";
+
+    /**
+     * @dev The call is from an unauthorized context.
+     */
+    error UUPSUnauthorizedCallContext();
+
+    /**
+     * @dev The storage `slot` is unsupported as a UUID.
+     */
+    error UUPSUnsupportedProxiableUUID(bytes32 slot);
+
+    /**
+     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is
+     * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case
+     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a
+     * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to
+     * fail.
+     */
+    modifier onlyProxy() {
+        _checkProxy();
+        _;
+    }
+
+    /**
+     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
+     * callable on the implementing contract but not through proxies.
+     */
+    modifier notDelegated() {
+        _checkNotDelegated();
+        _;
+    }
+
+    function __UUPSUpgradeable_init() internal onlyInitializing {
+    }
+
+    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {
+    }
+    /**
+     * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the
+     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.
+     *
+     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
+     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
+     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.
+     */
+    function proxiableUUID() external view virtual notDelegated returns (bytes32) {
+        return ERC1967Utils.IMPLEMENTATION_SLOT;
+    }
+
+    /**
+     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call
+     * encoded in `data`.
+     *
+     * Calls {_authorizeUpgrade}.
+     *
+     * Emits an {Upgraded} event.
+     *
+     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall
+     */
+    function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {
+        _authorizeUpgrade(newImplementation);
+        _upgradeToAndCallUUPS(newImplementation, data);
+    }
+
+    /**
+     * @dev Reverts if the execution is not performed via delegatecall or the execution
+     * context is not of a proxy with an ERC1967-compliant implementation pointing to self.
+     * See {_onlyProxy}.
+     */
+    function _checkProxy() internal view virtual {
+        if (
+            address(this) == __self || // Must be called through delegatecall
+            ERC1967Utils.getImplementation() != __self // Must be called through an active proxy
+        ) {
+            revert UUPSUnauthorizedCallContext();
+        }
+    }
+
+    /**
+     * @dev Reverts if the execution is performed via delegatecall.
+     * See {notDelegated}.
+     */
+    function _checkNotDelegated() internal view virtual {
+        if (address(this) != __self) {
+            // Must not be called through delegatecall
+            revert UUPSUnauthorizedCallContext();
+        }
+    }
+
+    /**
+     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
+     * {upgradeToAndCall}.
+     *
+     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.
+     *
+     * ```solidity
+     * function _authorizeUpgrade(address) internal onlyOwner {}
+     * ```
+     */
+    function _authorizeUpgrade(address newImplementation) internal virtual;
+
+    /**
+     * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.
+     *
+     * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value
+     * is expected to be the implementation slot in ERC1967.
+     *
+     * Emits an {IERC1967-Upgraded} event.
+     */
+    function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {
+        try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
+            if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {
+                revert UUPSUnsupportedProxiableUUID(slot);
+            }
+            ERC1967Utils.upgradeToAndCall(newImplementation, data);
+        } catch {
+            // The implementation is not UUPS
+            revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);
+        }
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
new file mode 100644
index 0000000000000000000000000000000000000000..5aa9b48bb39754a0f8f89bb78b6656b72fafd97d
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
+
+pragma solidity ^0.8.20;
+import {Initializable} from "../proxy/utils/Initializable.sol";
+
+/**
+ * @dev Provides information about the current execution context, including the
+ * sender of the transaction and its data. While these are generally available
+ * via msg.sender and msg.data, they should not be accessed in such a direct
+ * manner, since when dealing with meta-transactions the account sending and
+ * paying for execution may not be the actual sender (as far as an application
+ * is concerned).
+ *
+ * This contract is only required for intermediate, library-like contracts.
+ */
+abstract contract ContextUpgradeable is Initializable {
+    function __Context_init() internal onlyInitializing {
+    }
+
+    function __Context_init_unchained() internal onlyInitializing {
+    }
+    function _msgSender() internal view virtual returns (address) {
+        return msg.sender;
+    }
+
+    function _msgData() internal view virtual returns (bytes calldata) {
+        return msg.data;
+    }
+
+    function _contextSuffixLength() internal view virtual returns (uint256) {
+        return 0;
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol
new file mode 100644
index 0000000000000000000000000000000000000000..c3aebbf9fc91e561be21cd91e5fb2874f527881d
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)
+
+pragma solidity ^0.8.20;
+
+import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
+import {Initializable} from "../proxy/utils/Initializable.sol";
+
+/**
+ * @dev Contract module which allows children to implement an emergency stop
+ * mechanism that can be triggered by an authorized account.
+ *
+ * This module is used through inheritance. It will make available the
+ * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
+ * the functions of your contract. Note that they will not be pausable by
+ * simply including this module, only once the modifiers are put in place.
+ */
+abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
+    /// @custom:storage-location erc7201:openzeppelin.storage.Pausable
+    struct PausableStorage {
+        bool _paused;
+    }
+
+    // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Pausable")) - 1)) & ~bytes32(uint256(0xff))
+    bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;
+
+    function _getPausableStorage() private pure returns (PausableStorage storage $) {
+        assembly {
+            $.slot := PausableStorageLocation
+        }
+    }
+
+    /**
+     * @dev Emitted when the pause is triggered by `account`.
+     */
+    event Paused(address account);
+
+    /**
+     * @dev Emitted when the pause is lifted by `account`.
+     */
+    event Unpaused(address account);
+
+    /**
+     * @dev The operation failed because the contract is paused.
+     */
+    error EnforcedPause();
+
+    /**
+     * @dev The operation failed because the contract is not paused.
+     */
+    error ExpectedPause();
+
+    /**
+     * @dev Initializes the contract in unpaused state.
+     */
+    function __Pausable_init() internal onlyInitializing {
+        __Pausable_init_unchained();
+    }
+
+    function __Pausable_init_unchained() internal onlyInitializing {
+        PausableStorage storage $ = _getPausableStorage();
+        $._paused = false;
+    }
+
+    /**
+     * @dev Modifier to make a function callable only when the contract is not paused.
+     *
+     * Requirements:
+     *
+     * - The contract must not be paused.
+     */
+    modifier whenNotPaused() {
+        _requireNotPaused();
+        _;
+    }
+
+    /**
+     * @dev Modifier to make a function callable only when the contract is paused.
+     *
+     * Requirements:
+     *
+     * - The contract must be paused.
+     */
+    modifier whenPaused() {
+        _requirePaused();
+        _;
+    }
+
+    /**
+     * @dev Returns true if the contract is paused, and false otherwise.
+     */
+    function paused() public view virtual returns (bool) {
+        PausableStorage storage $ = _getPausableStorage();
+        return $._paused;
+    }
+
+    /**
+     * @dev Throws if the contract is paused.
+     */
+    function _requireNotPaused() internal view virtual {
+        if (paused()) {
+            revert EnforcedPause();
+        }
+    }
+
+    /**
+     * @dev Throws if the contract is not paused.
+     */
+    function _requirePaused() internal view virtual {
+        if (!paused()) {
+            revert ExpectedPause();
+        }
+    }
+
+    /**
+     * @dev Triggers stopped state.
+     *
+     * Requirements:
+     *
+     * - The contract must not be paused.
+     */
+    function _pause() internal virtual whenNotPaused {
+        PausableStorage storage $ = _getPausableStorage();
+        $._paused = true;
+        emit Paused(_msgSender());
+    }
+
+    /**
+     * @dev Returns to normal state.
+     *
+     * Requirements:
+     *
+     * - The contract must be paused.
+     */
+    function _unpause() internal virtual whenPaused {
+        PausableStorage storage $ = _getPausableStorage();
+        $._paused = false;
+        emit Unpaused(_msgSender());
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol
new file mode 100644
index 0000000000000000000000000000000000000000..9a27f6b5ce7a37ea7bf2ec12b01e2f32ac7bcd02
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol
@@ -0,0 +1,210 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/EIP712.sol)
+
+pragma solidity ^0.8.20;
+
+import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
+import {IERC5267} from "@openzeppelin/contracts/interfaces/IERC5267.sol";
+import {Initializable} from "../../proxy/utils/Initializable.sol";
+
+/**
+ * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
+ *
+ * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose
+ * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract
+ * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to
+ * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.
+ *
+ * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
+ * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
+ * ({_hashTypedDataV4}).
+ *
+ * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
+ * the chain id to protect against replay attacks on an eventual fork of the chain.
+ *
+ * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
+ * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
+ *
+ * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain
+ * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the
+ * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.
+ */
+abstract contract EIP712Upgradeable is Initializable, IERC5267 {
+    bytes32 private constant TYPE_HASH =
+        keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
+
+    /// @custom:storage-location erc7201:openzeppelin.storage.EIP712
+    struct EIP712Storage {
+        /// @custom:oz-renamed-from _HASHED_NAME
+        bytes32 _hashedName;
+        /// @custom:oz-renamed-from _HASHED_VERSION
+        bytes32 _hashedVersion;
+
+        string _name;
+        string _version;
+    }
+
+    // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.EIP712")) - 1)) & ~bytes32(uint256(0xff))
+    bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;
+
+    function _getEIP712Storage() private pure returns (EIP712Storage storage $) {
+        assembly {
+            $.slot := EIP712StorageLocation
+        }
+    }
+
+    /**
+     * @dev Initializes the domain separator and parameter caches.
+     *
+     * The meaning of `name` and `version` is specified in
+     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
+     *
+     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
+     * - `version`: the current major version of the signing domain.
+     *
+     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
+     * contract upgrade].
+     */
+    function __EIP712_init(string memory name, string memory version) internal onlyInitializing {
+        __EIP712_init_unchained(name, version);
+    }
+
+    function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {
+        EIP712Storage storage $ = _getEIP712Storage();
+        $._name = name;
+        $._version = version;
+
+        // Reset prior values in storage if upgrading
+        $._hashedName = 0;
+        $._hashedVersion = 0;
+    }
+
+    /**
+     * @dev Returns the domain separator for the current chain.
+     */
+    function _domainSeparatorV4() internal view returns (bytes32) {
+        return _buildDomainSeparator();
+    }
+
+    function _buildDomainSeparator() private view returns (bytes32) {
+        return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));
+    }
+
+    /**
+     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
+     * function returns the hash of the fully encoded EIP712 message for this domain.
+     *
+     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
+     *
+     * ```solidity
+     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
+     *     keccak256("Mail(address to,string contents)"),
+     *     mailTo,
+     *     keccak256(bytes(mailContents))
+     * )));
+     * address signer = ECDSA.recover(digest, signature);
+     * ```
+     */
+    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
+        return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);
+    }
+
+    /**
+     * @dev See {IERC-5267}.
+     */
+    function eip712Domain()
+        public
+        view
+        virtual
+        returns (
+            bytes1 fields,
+            string memory name,
+            string memory version,
+            uint256 chainId,
+            address verifyingContract,
+            bytes32 salt,
+            uint256[] memory extensions
+        )
+    {
+        EIP712Storage storage $ = _getEIP712Storage();
+        // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized
+        // and the EIP712 domain is not reliable, as it will be missing name and version.
+        require($._hashedName == 0 && $._hashedVersion == 0, "EIP712: Uninitialized");
+
+        return (
+            hex"0f", // 01111
+            _EIP712Name(),
+            _EIP712Version(),
+            block.chainid,
+            address(this),
+            bytes32(0),
+            new uint256[](0)
+        );
+    }
+
+    /**
+     * @dev The name parameter for the EIP712 domain.
+     *
+     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
+     * are a concern.
+     */
+    function _EIP712Name() internal view virtual returns (string memory) {
+        EIP712Storage storage $ = _getEIP712Storage();
+        return $._name;
+    }
+
+    /**
+     * @dev The version parameter for the EIP712 domain.
+     *
+     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
+     * are a concern.
+     */
+    function _EIP712Version() internal view virtual returns (string memory) {
+        EIP712Storage storage $ = _getEIP712Storage();
+        return $._version;
+    }
+
+    /**
+     * @dev The hash of the name parameter for the EIP712 domain.
+     *
+     * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.
+     */
+    function _EIP712NameHash() internal view returns (bytes32) {
+        EIP712Storage storage $ = _getEIP712Storage();
+        string memory name = _EIP712Name();
+        if (bytes(name).length > 0) {
+            return keccak256(bytes(name));
+        } else {
+            // If the name is empty, the contract may have been upgraded without initializing the new storage.
+            // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.
+            bytes32 hashedName = $._hashedName;
+            if (hashedName != 0) {
+                return hashedName;
+            } else {
+                return keccak256("");
+            }
+        }
+    }
+
+    /**
+     * @dev The hash of the version parameter for the EIP712 domain.
+     *
+     * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.
+     */
+    function _EIP712VersionHash() internal view returns (bytes32) {
+        EIP712Storage storage $ = _getEIP712Storage();
+        string memory version = _EIP712Version();
+        if (bytes(version).length > 0) {
+            return keccak256(bytes(version));
+        } else {
+            // If the version is empty, the contract may have been upgraded without initializing the new storage.
+            // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.
+            bytes32 hashedVersion = $._hashedVersion;
+            if (hashedVersion != 0) {
+                return hashedVersion;
+            } else {
+                return keccak256("");
+            }
+        }
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/interfaces/IERC5267.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/interfaces/IERC5267.sol
new file mode 100644
index 0000000000000000000000000000000000000000..47a9fd5885563f1d65a77f0847bdd91bfed9d17a
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/interfaces/IERC5267.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)
+
+pragma solidity ^0.8.20;
+
+interface IERC5267 {
+    /**
+     * @dev MAY be emitted to signal that the domain could have changed.
+     */
+    event EIP712DomainChanged();
+
+    /**
+     * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712
+     * signature.
+     */
+    function eip712Domain()
+        external
+        view
+        returns (
+            bytes1 fields,
+            string memory name,
+            string memory version,
+            uint256 chainId,
+            address verifyingContract,
+            bytes32 salt,
+            uint256[] memory extensions
+        );
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol
new file mode 100644
index 0000000000000000000000000000000000000000..4d0f0f8852d52dcfa97a9c562264144d1740a29b
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol)
+
+pragma solidity ^0.8.20;
+
+/**
+ * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
+ * proxy whose upgrades are fully controlled by the current implementation.
+ */
+interface IERC1822Proxiable {
+    /**
+     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
+     * address.
+     *
+     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
+     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
+     * function revert if invoked through a proxy.
+     */
+    function proxiableUUID() external view returns (bytes32);
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol
new file mode 100644
index 0000000000000000000000000000000000000000..e55bae20c7261f837b1ebab7c53860beca664df1
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol
@@ -0,0 +1,193 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol)
+
+pragma solidity ^0.8.20;
+
+import {IBeacon} from "../beacon/IBeacon.sol";
+import {Address} from "../../utils/Address.sol";
+import {StorageSlot} from "../../utils/StorageSlot.sol";
+
+/**
+ * @dev This abstract contract provides getters and event emitting update functions for
+ * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
+ */
+library ERC1967Utils {
+    // We re-declare ERC-1967 events here because they can't be used directly from IERC1967.
+    // This will be fixed in Solidity 0.8.21. At that point we should remove these events.
+    /**
+     * @dev Emitted when the implementation is upgraded.
+     */
+    event Upgraded(address indexed implementation);
+
+    /**
+     * @dev Emitted when the admin account has changed.
+     */
+    event AdminChanged(address previousAdmin, address newAdmin);
+
+    /**
+     * @dev Emitted when the beacon is changed.
+     */
+    event BeaconUpgraded(address indexed beacon);
+
+    /**
+     * @dev Storage slot with the address of the current implementation.
+     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1.
+     */
+    // solhint-disable-next-line private-vars-leading-underscore
+    bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
+
+    /**
+     * @dev The `implementation` of the proxy is invalid.
+     */
+    error ERC1967InvalidImplementation(address implementation);
+
+    /**
+     * @dev The `admin` of the proxy is invalid.
+     */
+    error ERC1967InvalidAdmin(address admin);
+
+    /**
+     * @dev The `beacon` of the proxy is invalid.
+     */
+    error ERC1967InvalidBeacon(address beacon);
+
+    /**
+     * @dev An upgrade function sees `msg.value > 0` that may be lost.
+     */
+    error ERC1967NonPayable();
+
+    /**
+     * @dev Returns the current implementation address.
+     */
+    function getImplementation() internal view returns (address) {
+        return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;
+    }
+
+    /**
+     * @dev Stores a new address in the EIP1967 implementation slot.
+     */
+    function _setImplementation(address newImplementation) private {
+        if (newImplementation.code.length == 0) {
+            revert ERC1967InvalidImplementation(newImplementation);
+        }
+        StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;
+    }
+
+    /**
+     * @dev Performs implementation upgrade with additional setup call if data is nonempty.
+     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected
+     * to avoid stuck value in the contract.
+     *
+     * Emits an {IERC1967-Upgraded} event.
+     */
+    function upgradeToAndCall(address newImplementation, bytes memory data) internal {
+        _setImplementation(newImplementation);
+        emit Upgraded(newImplementation);
+
+        if (data.length > 0) {
+            Address.functionDelegateCall(newImplementation, data);
+        } else {
+            _checkNonPayable();
+        }
+    }
+
+    /**
+     * @dev Storage slot with the admin of the contract.
+     * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1.
+     */
+    // solhint-disable-next-line private-vars-leading-underscore
+    bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
+
+    /**
+     * @dev Returns the current admin.
+     *
+     * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using
+     * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
+     * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
+     */
+    function getAdmin() internal view returns (address) {
+        return StorageSlot.getAddressSlot(ADMIN_SLOT).value;
+    }
+
+    /**
+     * @dev Stores a new address in the EIP1967 admin slot.
+     */
+    function _setAdmin(address newAdmin) private {
+        if (newAdmin == address(0)) {
+            revert ERC1967InvalidAdmin(address(0));
+        }
+        StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;
+    }
+
+    /**
+     * @dev Changes the admin of the proxy.
+     *
+     * Emits an {IERC1967-AdminChanged} event.
+     */
+    function changeAdmin(address newAdmin) internal {
+        emit AdminChanged(getAdmin(), newAdmin);
+        _setAdmin(newAdmin);
+    }
+
+    /**
+     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
+     * This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1.
+     */
+    // solhint-disable-next-line private-vars-leading-underscore
+    bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
+
+    /**
+     * @dev Returns the current beacon.
+     */
+    function getBeacon() internal view returns (address) {
+        return StorageSlot.getAddressSlot(BEACON_SLOT).value;
+    }
+
+    /**
+     * @dev Stores a new beacon in the EIP1967 beacon slot.
+     */
+    function _setBeacon(address newBeacon) private {
+        if (newBeacon.code.length == 0) {
+            revert ERC1967InvalidBeacon(newBeacon);
+        }
+
+        StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;
+
+        address beaconImplementation = IBeacon(newBeacon).implementation();
+        if (beaconImplementation.code.length == 0) {
+            revert ERC1967InvalidImplementation(beaconImplementation);
+        }
+    }
+
+    /**
+     * @dev Change the beacon and trigger a setup call if data is nonempty.
+     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected
+     * to avoid stuck value in the contract.
+     *
+     * Emits an {IERC1967-BeaconUpgraded} event.
+     *
+     * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since
+     * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for
+     * efficiency.
+     */
+    function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {
+        _setBeacon(newBeacon);
+        emit BeaconUpgraded(newBeacon);
+
+        if (data.length > 0) {
+            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
+        } else {
+            _checkNonPayable();
+        }
+    }
+
+    /**
+     * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract
+     * if an upgrade doesn't perform an initialization call.
+     */
+    function _checkNonPayable() private {
+        if (msg.value > 0) {
+            revert ERC1967NonPayable();
+        }
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon.sol
new file mode 100644
index 0000000000000000000000000000000000000000..36a3c76e926c0ed5038a2cbe074cd26e09517548
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon.sol
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)
+
+pragma solidity ^0.8.20;
+
+/**
+ * @dev This is the interface that {BeaconProxy} expects of its beacon.
+ */
+interface IBeacon {
+    /**
+     * @dev Must return an address that can be used as a delegate call target.
+     *
+     * {UpgradeableBeacon} will check that this address is a contract.
+     */
+    function implementation() external view returns (address);
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/Address.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/Address.sol
new file mode 100644
index 0000000000000000000000000000000000000000..b7e3059529a8c92d7fcc9f50d4f4d635057cad07
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/Address.sol
@@ -0,0 +1,159 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
+
+pragma solidity ^0.8.20;
+
+/**
+ * @dev Collection of functions related to the address type
+ */
+library Address {
+    /**
+     * @dev The ETH balance of the account is not enough to perform the operation.
+     */
+    error AddressInsufficientBalance(address account);
+
+    /**
+     * @dev There's no code at `target` (it is not a contract).
+     */
+    error AddressEmptyCode(address target);
+
+    /**
+     * @dev A call to an address target failed. The target may have reverted.
+     */
+    error FailedInnerCall();
+
+    /**
+     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
+     * `recipient`, forwarding all available gas and reverting on errors.
+     *
+     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
+     * of certain opcodes, possibly making contracts go over the 2300 gas limit
+     * imposed by `transfer`, making them unable to receive funds via
+     * `transfer`. {sendValue} removes this limitation.
+     *
+     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
+     *
+     * IMPORTANT: because control is transferred to `recipient`, care must be
+     * taken to not create reentrancy vulnerabilities. Consider using
+     * {ReentrancyGuard} or the
+     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
+     */
+    function sendValue(address payable recipient, uint256 amount) internal {
+        if (address(this).balance < amount) {
+            revert AddressInsufficientBalance(address(this));
+        }
+
+        (bool success, ) = recipient.call{value: amount}("");
+        if (!success) {
+            revert FailedInnerCall();
+        }
+    }
+
+    /**
+     * @dev Performs a Solidity function call using a low level `call`. A
+     * plain `call` is an unsafe replacement for a function call: use this
+     * function instead.
+     *
+     * If `target` reverts with a revert reason or custom error, it is bubbled
+     * up by this function (like regular Solidity function calls). However, if
+     * the call reverted with no returned reason, this function reverts with a
+     * {FailedInnerCall} error.
+     *
+     * Returns the raw returned data. To convert to the expected return value,
+     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
+     *
+     * Requirements:
+     *
+     * - `target` must be a contract.
+     * - calling `target` with `data` must not revert.
+     */
+    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
+        return functionCallWithValue(target, data, 0);
+    }
+
+    /**
+     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
+     * but also transferring `value` wei to `target`.
+     *
+     * Requirements:
+     *
+     * - the calling contract must have an ETH balance of at least `value`.
+     * - the called Solidity function must be `payable`.
+     */
+    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
+        if (address(this).balance < value) {
+            revert AddressInsufficientBalance(address(this));
+        }
+        (bool success, bytes memory returndata) = target.call{value: value}(data);
+        return verifyCallResultFromTarget(target, success, returndata);
+    }
+
+    /**
+     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
+     * but performing a static call.
+     */
+    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
+        (bool success, bytes memory returndata) = target.staticcall(data);
+        return verifyCallResultFromTarget(target, success, returndata);
+    }
+
+    /**
+     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
+     * but performing a delegate call.
+     */
+    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
+        (bool success, bytes memory returndata) = target.delegatecall(data);
+        return verifyCallResultFromTarget(target, success, returndata);
+    }
+
+    /**
+     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
+     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
+     * unsuccessful call.
+     */
+    function verifyCallResultFromTarget(
+        address target,
+        bool success,
+        bytes memory returndata
+    ) internal view returns (bytes memory) {
+        if (!success) {
+            _revert(returndata);
+        } else {
+            // only check if target is a contract if the call was successful and the return data is empty
+            // otherwise we already know that it was a contract
+            if (returndata.length == 0 && target.code.length == 0) {
+                revert AddressEmptyCode(target);
+            }
+            return returndata;
+        }
+    }
+
+    /**
+     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
+     * revert reason or with a default {FailedInnerCall} error.
+     */
+    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
+        if (!success) {
+            _revert(returndata);
+        } else {
+            return returndata;
+        }
+    }
+
+    /**
+     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
+     */
+    function _revert(bytes memory returndata) private pure {
+        // Look for revert reason and bubble it up if present
+        if (returndata.length > 0) {
+            // The easiest way to bubble the revert reason is using memory via assembly
+            /// @solidity memory-safe-assembly
+            assembly {
+                let returndata_size := mload(returndata)
+                revert(add(32, returndata), returndata_size)
+            }
+        } else {
+            revert FailedInnerCall();
+        }
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/StorageSlot.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/StorageSlot.sol
new file mode 100644
index 0000000000000000000000000000000000000000..08418327a5976bc6e10550a2fd8162f97edeb049
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/StorageSlot.sol
@@ -0,0 +1,135 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)
+// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
+
+pragma solidity ^0.8.20;
+
+/**
+ * @dev Library for reading and writing primitive types to specific storage slots.
+ *
+ * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
+ * This library helps with reading and writing to such slots without the need for inline assembly.
+ *
+ * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
+ *
+ * Example usage to set ERC1967 implementation slot:
+ * ```solidity
+ * contract ERC1967 {
+ *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
+ *
+ *     function _getImplementation() internal view returns (address) {
+ *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
+ *     }
+ *
+ *     function _setImplementation(address newImplementation) internal {
+ *         require(newImplementation.code.length > 0);
+ *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
+ *     }
+ * }
+ * ```
+ */
+library StorageSlot {
+    struct AddressSlot {
+        address value;
+    }
+
+    struct BooleanSlot {
+        bool value;
+    }
+
+    struct Bytes32Slot {
+        bytes32 value;
+    }
+
+    struct Uint256Slot {
+        uint256 value;
+    }
+
+    struct StringSlot {
+        string value;
+    }
+
+    struct BytesSlot {
+        bytes value;
+    }
+
+    /**
+     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
+     */
+    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
+        /// @solidity memory-safe-assembly
+        assembly {
+            r.slot := slot
+        }
+    }
+
+    /**
+     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
+     */
+    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
+        /// @solidity memory-safe-assembly
+        assembly {
+            r.slot := slot
+        }
+    }
+
+    /**
+     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
+     */
+    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
+        /// @solidity memory-safe-assembly
+        assembly {
+            r.slot := slot
+        }
+    }
+
+    /**
+     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
+     */
+    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
+        /// @solidity memory-safe-assembly
+        assembly {
+            r.slot := slot
+        }
+    }
+
+    /**
+     * @dev Returns an `StringSlot` with member `value` located at `slot`.
+     */
+    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
+        /// @solidity memory-safe-assembly
+        assembly {
+            r.slot := slot
+        }
+    }
+
+    /**
+     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.
+     */
+    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
+        /// @solidity memory-safe-assembly
+        assembly {
+            r.slot := store.slot
+        }
+    }
+
+    /**
+     * @dev Returns an `BytesSlot` with member `value` located at `slot`.
+     */
+    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
+        /// @solidity memory-safe-assembly
+        assembly {
+            r.slot := slot
+        }
+    }
+
+    /**
+     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
+     */
+    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
+        /// @solidity memory-safe-assembly
+        assembly {
+            r.slot := store.slot
+        }
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/Strings.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/Strings.sol
new file mode 100644
index 0000000000000000000000000000000000000000..b2c0a40fb2a900056d77c4f84d4c121f188e61aa
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/Strings.sol
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)
+
+pragma solidity ^0.8.20;
+
+import {Math} from "./math/Math.sol";
+import {SignedMath} from "./math/SignedMath.sol";
+
+/**
+ * @dev String operations.
+ */
+library Strings {
+    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
+    uint8 private constant ADDRESS_LENGTH = 20;
+
+    /**
+     * @dev The `value` string doesn't fit in the specified `length`.
+     */
+    error StringsInsufficientHexLength(uint256 value, uint256 length);
+
+    /**
+     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
+     */
+    function toString(uint256 value) internal pure returns (string memory) {
+        unchecked {
+            uint256 length = Math.log10(value) + 1;
+            string memory buffer = new string(length);
+            uint256 ptr;
+            /// @solidity memory-safe-assembly
+            assembly {
+                ptr := add(buffer, add(32, length))
+            }
+            while (true) {
+                ptr--;
+                /// @solidity memory-safe-assembly
+                assembly {
+                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
+                }
+                value /= 10;
+                if (value == 0) break;
+            }
+            return buffer;
+        }
+    }
+
+    /**
+     * @dev Converts a `int256` to its ASCII `string` decimal representation.
+     */
+    function toStringSigned(int256 value) internal pure returns (string memory) {
+        return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
+    }
+
+    /**
+     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
+     */
+    function toHexString(uint256 value) internal pure returns (string memory) {
+        unchecked {
+            return toHexString(value, Math.log256(value) + 1);
+        }
+    }
+
+    /**
+     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
+     */
+    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
+        uint256 localValue = value;
+        bytes memory buffer = new bytes(2 * length + 2);
+        buffer[0] = "0";
+        buffer[1] = "x";
+        for (uint256 i = 2 * length + 1; i > 1; --i) {
+            buffer[i] = HEX_DIGITS[localValue & 0xf];
+            localValue >>= 4;
+        }
+        if (localValue != 0) {
+            revert StringsInsufficientHexLength(value, length);
+        }
+        return string(buffer);
+    }
+
+    /**
+     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
+     * representation.
+     */
+    function toHexString(address addr) internal pure returns (string memory) {
+        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
+    }
+
+    /**
+     * @dev Returns true if the two strings are equal.
+     */
+    function equal(string memory a, string memory b) internal pure returns (bool) {
+        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/ECDSA.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/ECDSA.sol
new file mode 100644
index 0000000000000000000000000000000000000000..04b3e5e06468b1727ec9bd695e16a46c2177051b
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/ECDSA.sol
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol)
+
+pragma solidity ^0.8.20;
+
+/**
+ * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
+ *
+ * These functions can be used to verify that a message was signed by the holder
+ * of the private keys of a given address.
+ */
+library ECDSA {
+    enum RecoverError {
+        NoError,
+        InvalidSignature,
+        InvalidSignatureLength,
+        InvalidSignatureS
+    }
+
+    /**
+     * @dev The signature derives the `address(0)`.
+     */
+    error ECDSAInvalidSignature();
+
+    /**
+     * @dev The signature has an invalid length.
+     */
+    error ECDSAInvalidSignatureLength(uint256 length);
+
+    /**
+     * @dev The signature has an S value that is in the upper half order.
+     */
+    error ECDSAInvalidSignatureS(bytes32 s);
+
+    /**
+     * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not
+     * return address(0) without also returning an error description. Errors are documented using an enum (error type)
+     * and a bytes32 providing additional information about the error.
+     *
+     * If no error is returned, then the address can be used for verification purposes.
+     *
+     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
+     * this function rejects them by requiring the `s` value to be in the lower
+     * half order, and the `v` value to be either 27 or 28.
+     *
+     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
+     * verification to be secure: it is possible to craft signatures that
+     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
+     * this is by receiving a hash of the original message (which may otherwise
+     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
+     *
+     * Documentation for signature generation:
+     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
+     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
+     */
+    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) {
+        if (signature.length == 65) {
+            bytes32 r;
+            bytes32 s;
+            uint8 v;
+            // ecrecover takes the signature parameters, and the only way to get them
+            // currently is to use assembly.
+            /// @solidity memory-safe-assembly
+            assembly {
+                r := mload(add(signature, 0x20))
+                s := mload(add(signature, 0x40))
+                v := byte(0, mload(add(signature, 0x60)))
+            }
+            return tryRecover(hash, v, r, s);
+        } else {
+            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));
+        }
+    }
+
+    /**
+     * @dev Returns the address that signed a hashed message (`hash`) with
+     * `signature`. This address can then be used for verification purposes.
+     *
+     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
+     * this function rejects them by requiring the `s` value to be in the lower
+     * half order, and the `v` value to be either 27 or 28.
+     *
+     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
+     * verification to be secure: it is possible to craft signatures that
+     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
+     * this is by receiving a hash of the original message (which may otherwise
+     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
+     */
+    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
+        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);
+        _throwError(error, errorArg);
+        return recovered;
+    }
+
+    /**
+     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
+     *
+     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
+     */
+    function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) {
+        unchecked {
+            bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
+            // We do not check for an overflow here since the shift operation results in 0 or 1.
+            uint8 v = uint8((uint256(vs) >> 255) + 27);
+            return tryRecover(hash, v, r, s);
+        }
+    }
+
+    /**
+     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
+     */
+    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
+        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);
+        _throwError(error, errorArg);
+        return recovered;
+    }
+
+    /**
+     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
+     * `r` and `s` signature fields separately.
+     */
+    function tryRecover(
+        bytes32 hash,
+        uint8 v,
+        bytes32 r,
+        bytes32 s
+    ) internal pure returns (address, RecoverError, bytes32) {
+        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
+        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
+        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
+        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
+        //
+        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
+        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
+        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
+        // these malleable signatures as well.
+        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
+            return (address(0), RecoverError.InvalidSignatureS, s);
+        }
+
+        // If the signature is valid (and not malleable), return the signer address
+        address signer = ecrecover(hash, v, r, s);
+        if (signer == address(0)) {
+            return (address(0), RecoverError.InvalidSignature, bytes32(0));
+        }
+
+        return (signer, RecoverError.NoError, bytes32(0));
+    }
+
+    /**
+     * @dev Overload of {ECDSA-recover} that receives the `v`,
+     * `r` and `s` signature fields separately.
+     */
+    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
+        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);
+        _throwError(error, errorArg);
+        return recovered;
+    }
+
+    /**
+     * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.
+     */
+    function _throwError(RecoverError error, bytes32 errorArg) private pure {
+        if (error == RecoverError.NoError) {
+            return; // no error: do nothing
+        } else if (error == RecoverError.InvalidSignature) {
+            revert ECDSAInvalidSignature();
+        } else if (error == RecoverError.InvalidSignatureLength) {
+            revert ECDSAInvalidSignatureLength(uint256(errorArg));
+        } else if (error == RecoverError.InvalidSignatureS) {
+            revert ECDSAInvalidSignatureS(errorArg);
+        }
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol
new file mode 100644
index 0000000000000000000000000000000000000000..8836693e79b181b04f2bf54d35f2aa1e693262c1
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol
@@ -0,0 +1,86 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MessageHashUtils.sol)
+
+pragma solidity ^0.8.20;
+
+import {Strings} from "../Strings.sol";
+
+/**
+ * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.
+ *
+ * The library provides methods for generating a hash of a message that conforms to the
+ * https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]
+ * specifications.
+ */
+library MessageHashUtils {
+    /**
+     * @dev Returns the keccak256 digest of an EIP-191 signed data with version
+     * `0x45` (`personal_sign` messages).
+     *
+     * The digest is calculated by prefixing a bytes32 `messageHash` with
+     * `"\x19Ethereum Signed Message:\n32"` and hashing the result. It corresponds with the
+     * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
+     *
+     * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with
+     * keccak256, although any bytes32 value can be safely used because the final digest will
+     * be re-hashed.
+     *
+     * See {ECDSA-recover}.
+     */
+    function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {
+        /// @solidity memory-safe-assembly
+        assembly {
+            mstore(0x00, "\x19Ethereum Signed Message:\n32") // 32 is the bytes-length of messageHash
+            mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix
+            digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)
+        }
+    }
+
+    /**
+     * @dev Returns the keccak256 digest of an EIP-191 signed data with version
+     * `0x45` (`personal_sign` messages).
+     *
+     * The digest is calculated by prefixing an arbitrary `message` with
+     * `"\x19Ethereum Signed Message:\n" + len(message)` and hashing the result. It corresponds with the
+     * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
+     *
+     * See {ECDSA-recover}.
+     */
+    function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {
+        return
+            keccak256(bytes.concat("\x19Ethereum Signed Message:\n", bytes(Strings.toString(message.length)), message));
+    }
+
+    /**
+     * @dev Returns the keccak256 digest of an EIP-191 signed data with version
+     * `0x00` (data with intended validator).
+     *
+     * The digest is calculated by prefixing an arbitrary `data` with `"\x19\x00"` and the intended
+     * `validator` address. Then hashing the result.
+     *
+     * See {ECDSA-recover}.
+     */
+    function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {
+        return keccak256(abi.encodePacked(hex"19_00", validator, data));
+    }
+
+    /**
+     * @dev Returns the keccak256 digest of an EIP-712 typed data (EIP-191 version `0x01`).
+     *
+     * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with
+     * `\x19\x01` and hashing the result. It corresponds to the hash signed by the
+     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.
+     *
+     * See {ECDSA-recover}.
+     */
+    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {
+        /// @solidity memory-safe-assembly
+        assembly {
+            let ptr := mload(0x40)
+            mstore(ptr, hex"19_01")
+            mstore(add(ptr, 0x02), domainSeparator)
+            mstore(add(ptr, 0x22), structHash)
+            digest := keccak256(ptr, 0x42)
+        }
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/math/Math.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/math/Math.sol
new file mode 100644
index 0000000000000000000000000000000000000000..9681524529b34f34033ae97064a2700bfc4eec00
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/math/Math.sol
@@ -0,0 +1,415 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)
+
+pragma solidity ^0.8.20;
+
+/**
+ * @dev Standard math utilities missing in the Solidity language.
+ */
+library Math {
+    /**
+     * @dev Muldiv operation overflow.
+     */
+    error MathOverflowedMulDiv();
+
+    enum Rounding {
+        Floor, // Toward negative infinity
+        Ceil, // Toward positive infinity
+        Trunc, // Toward zero
+        Expand // Away from zero
+    }
+
+    /**
+     * @dev Returns the addition of two unsigned integers, with an overflow flag.
+     */
+    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
+        unchecked {
+            uint256 c = a + b;
+            if (c < a) return (false, 0);
+            return (true, c);
+        }
+    }
+
+    /**
+     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
+     */
+    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
+        unchecked {
+            if (b > a) return (false, 0);
+            return (true, a - b);
+        }
+    }
+
+    /**
+     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
+     */
+    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
+        unchecked {
+            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
+            // benefit is lost if 'b' is also tested.
+            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
+            if (a == 0) return (true, 0);
+            uint256 c = a * b;
+            if (c / a != b) return (false, 0);
+            return (true, c);
+        }
+    }
+
+    /**
+     * @dev Returns the division of two unsigned integers, with a division by zero flag.
+     */
+    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
+        unchecked {
+            if (b == 0) return (false, 0);
+            return (true, a / b);
+        }
+    }
+
+    /**
+     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
+     */
+    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
+        unchecked {
+            if (b == 0) return (false, 0);
+            return (true, a % b);
+        }
+    }
+
+    /**
+     * @dev Returns the largest of two numbers.
+     */
+    function max(uint256 a, uint256 b) internal pure returns (uint256) {
+        return a > b ? a : b;
+    }
+
+    /**
+     * @dev Returns the smallest of two numbers.
+     */
+    function min(uint256 a, uint256 b) internal pure returns (uint256) {
+        return a < b ? a : b;
+    }
+
+    /**
+     * @dev Returns the average of two numbers. The result is rounded towards
+     * zero.
+     */
+    function average(uint256 a, uint256 b) internal pure returns (uint256) {
+        // (a + b) / 2 can overflow.
+        return (a & b) + (a ^ b) / 2;
+    }
+
+    /**
+     * @dev Returns the ceiling of the division of two numbers.
+     *
+     * This differs from standard division with `/` in that it rounds towards infinity instead
+     * of rounding towards zero.
+     */
+    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
+        if (b == 0) {
+            // Guarantee the same behavior as in a regular Solidity division.
+            return a / b;
+        }
+
+        // (a + b - 1) / b can overflow on addition, so we distribute.
+        return a == 0 ? 0 : (a - 1) / b + 1;
+    }
+
+    /**
+     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
+     * denominator == 0.
+     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
+     * Uniswap Labs also under MIT license.
+     */
+    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
+        unchecked {
+            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
+            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
+            // variables such that product = prod1 * 2^256 + prod0.
+            uint256 prod0 = x * y; // Least significant 256 bits of the product
+            uint256 prod1; // Most significant 256 bits of the product
+            assembly {
+                let mm := mulmod(x, y, not(0))
+                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
+            }
+
+            // Handle non-overflow cases, 256 by 256 division.
+            if (prod1 == 0) {
+                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
+                // The surrounding unchecked block does not change this fact.
+                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
+                return prod0 / denominator;
+            }
+
+            // Make sure the result is less than 2^256. Also prevents denominator == 0.
+            if (denominator <= prod1) {
+                revert MathOverflowedMulDiv();
+            }
+
+            ///////////////////////////////////////////////
+            // 512 by 256 division.
+            ///////////////////////////////////////////////
+
+            // Make division exact by subtracting the remainder from [prod1 prod0].
+            uint256 remainder;
+            assembly {
+                // Compute remainder using mulmod.
+                remainder := mulmod(x, y, denominator)
+
+                // Subtract 256 bit number from 512 bit number.
+                prod1 := sub(prod1, gt(remainder, prod0))
+                prod0 := sub(prod0, remainder)
+            }
+
+            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.
+            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.
+
+            uint256 twos = denominator & (0 - denominator);
+            assembly {
+                // Divide denominator by twos.
+                denominator := div(denominator, twos)
+
+                // Divide [prod1 prod0] by twos.
+                prod0 := div(prod0, twos)
+
+                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
+                twos := add(div(sub(0, twos), twos), 1)
+            }
+
+            // Shift in bits from prod1 into prod0.
+            prod0 |= prod1 * twos;
+
+            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
+            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
+            // four bits. That is, denominator * inv = 1 mod 2^4.
+            uint256 inverse = (3 * denominator) ^ 2;
+
+            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
+            // works in modular arithmetic, doubling the correct bits in each step.
+            inverse *= 2 - denominator * inverse; // inverse mod 2^8
+            inverse *= 2 - denominator * inverse; // inverse mod 2^16
+            inverse *= 2 - denominator * inverse; // inverse mod 2^32
+            inverse *= 2 - denominator * inverse; // inverse mod 2^64
+            inverse *= 2 - denominator * inverse; // inverse mod 2^128
+            inverse *= 2 - denominator * inverse; // inverse mod 2^256
+
+            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
+            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
+            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
+            // is no longer required.
+            result = prod0 * inverse;
+            return result;
+        }
+    }
+
+    /**
+     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
+     */
+    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
+        uint256 result = mulDiv(x, y, denominator);
+        if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
+            result += 1;
+        }
+        return result;
+    }
+
+    /**
+     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
+     * towards zero.
+     *
+     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
+     */
+    function sqrt(uint256 a) internal pure returns (uint256) {
+        if (a == 0) {
+            return 0;
+        }
+
+        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
+        //
+        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
+        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
+        //
+        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
+        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
+        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
+        //
+        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
+        uint256 result = 1 << (log2(a) >> 1);
+
+        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
+        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
+        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
+        // into the expected uint128 result.
+        unchecked {
+            result = (result + a / result) >> 1;
+            result = (result + a / result) >> 1;
+            result = (result + a / result) >> 1;
+            result = (result + a / result) >> 1;
+            result = (result + a / result) >> 1;
+            result = (result + a / result) >> 1;
+            result = (result + a / result) >> 1;
+            return min(result, a / result);
+        }
+    }
+
+    /**
+     * @notice Calculates sqrt(a), following the selected rounding direction.
+     */
+    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
+        unchecked {
+            uint256 result = sqrt(a);
+            return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
+        }
+    }
+
+    /**
+     * @dev Return the log in base 2 of a positive value rounded towards zero.
+     * Returns 0 if given 0.
+     */
+    function log2(uint256 value) internal pure returns (uint256) {
+        uint256 result = 0;
+        unchecked {
+            if (value >> 128 > 0) {
+                value >>= 128;
+                result += 128;
+            }
+            if (value >> 64 > 0) {
+                value >>= 64;
+                result += 64;
+            }
+            if (value >> 32 > 0) {
+                value >>= 32;
+                result += 32;
+            }
+            if (value >> 16 > 0) {
+                value >>= 16;
+                result += 16;
+            }
+            if (value >> 8 > 0) {
+                value >>= 8;
+                result += 8;
+            }
+            if (value >> 4 > 0) {
+                value >>= 4;
+                result += 4;
+            }
+            if (value >> 2 > 0) {
+                value >>= 2;
+                result += 2;
+            }
+            if (value >> 1 > 0) {
+                result += 1;
+            }
+        }
+        return result;
+    }
+
+    /**
+     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
+     * Returns 0 if given 0.
+     */
+    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
+        unchecked {
+            uint256 result = log2(value);
+            return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
+        }
+    }
+
+    /**
+     * @dev Return the log in base 10 of a positive value rounded towards zero.
+     * Returns 0 if given 0.
+     */
+    function log10(uint256 value) internal pure returns (uint256) {
+        uint256 result = 0;
+        unchecked {
+            if (value >= 10 ** 64) {
+                value /= 10 ** 64;
+                result += 64;
+            }
+            if (value >= 10 ** 32) {
+                value /= 10 ** 32;
+                result += 32;
+            }
+            if (value >= 10 ** 16) {
+                value /= 10 ** 16;
+                result += 16;
+            }
+            if (value >= 10 ** 8) {
+                value /= 10 ** 8;
+                result += 8;
+            }
+            if (value >= 10 ** 4) {
+                value /= 10 ** 4;
+                result += 4;
+            }
+            if (value >= 10 ** 2) {
+                value /= 10 ** 2;
+                result += 2;
+            }
+            if (value >= 10 ** 1) {
+                result += 1;
+            }
+        }
+        return result;
+    }
+
+    /**
+     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
+     * Returns 0 if given 0.
+     */
+    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
+        unchecked {
+            uint256 result = log10(value);
+            return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
+        }
+    }
+
+    /**
+     * @dev Return the log in base 256 of a positive value rounded towards zero.
+     * Returns 0 if given 0.
+     *
+     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
+     */
+    function log256(uint256 value) internal pure returns (uint256) {
+        uint256 result = 0;
+        unchecked {
+            if (value >> 128 > 0) {
+                value >>= 128;
+                result += 16;
+            }
+            if (value >> 64 > 0) {
+                value >>= 64;
+                result += 8;
+            }
+            if (value >> 32 > 0) {
+                value >>= 32;
+                result += 4;
+            }
+            if (value >> 16 > 0) {
+                value >>= 16;
+                result += 2;
+            }
+            if (value >> 8 > 0) {
+                result += 1;
+            }
+        }
+        return result;
+    }
+
+    /**
+     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
+     * Returns 0 if given 0.
+     */
+    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
+        unchecked {
+            uint256 result = log256(value);
+            return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
+        }
+    }
+
+    /**
+     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
+     */
+    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
+        return uint8(rounding) % 2 == 1;
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/math/SignedMath.sol b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/math/SignedMath.sol
new file mode 100644
index 0000000000000000000000000000000000000000..66a615162921b564204ebcc30037d4d806855b28
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@openzeppelin/contracts/utils/math/SignedMath.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)
+
+pragma solidity ^0.8.20;
+
+/**
+ * @dev Standard signed math utilities missing in the Solidity language.
+ */
+library SignedMath {
+    /**
+     * @dev Returns the largest of two signed numbers.
+     */
+    function max(int256 a, int256 b) internal pure returns (int256) {
+        return a > b ? a : b;
+    }
+
+    /**
+     * @dev Returns the smallest of two signed numbers.
+     */
+    function min(int256 a, int256 b) internal pure returns (int256) {
+        return a < b ? a : b;
+    }
+
+    /**
+     * @dev Returns the average of two signed numbers without overflow.
+     * The result is rounded towards zero.
+     */
+    function average(int256 a, int256 b) internal pure returns (int256) {
+        // Formula from the book "Hacker's Delight"
+        int256 x = (a & b) + ((a ^ b) >> 1);
+        return x + (int256(uint256(x) >> 255) & (a ^ b));
+    }
+
+    /**
+     * @dev Returns the absolute unsigned value of a signed value.
+     */
+    function abs(int256 n) internal pure returns (uint256) {
+        unchecked {
+            // must be unchecked in order to support `n = type(int256).min`
+            return uint256(n >= 0 ? n : -n);
+        }
+    }
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol b/momiji-helpers/contracts/.deps/npm/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol
new file mode 100644
index 0000000000000000000000000000000000000000..9f183b22a7016eae4d036db15077bc791cb8fb04
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+pragma solidity >=0.5.0;
+
+/// @title Callback for IUniswapV3PoolActions#swap
+/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
+interface IUniswapV3SwapCallback {
+    /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
+    /// @dev In the implementation you must pay the pool tokens owed for the swap.
+    /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
+    /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
+    /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
+    /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
+    /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
+    /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
+    /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
+    function uniswapV3SwapCallback(
+        int256 amount0Delta,
+        int256 amount1Delta,
+        bytes calldata data
+    ) external;
+}
diff --git a/momiji-helpers/contracts/.deps/npm/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol b/momiji-helpers/contracts/.deps/npm/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol
new file mode 100644
index 0000000000000000000000000000000000000000..35806a2a41323d3cd5c24b4ba1251bb2aa5f72ff
--- /dev/null
+++ b/momiji-helpers/contracts/.deps/npm/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+pragma solidity >=0.7.5;
+pragma abicoder v2;
+
+import '@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol';
+
+/// @title Router token swapping functionality
+/// @notice Functions for swapping tokens via Uniswap V3
+interface ISwapRouter is IUniswapV3SwapCallback {
+    struct ExactInputSingleParams {
+        address tokenIn;
+        address tokenOut;
+        uint24 fee;
+        address recipient;
+        uint256 deadline;
+        uint256 amountIn;
+        uint256 amountOutMinimum;
+        uint160 sqrtPriceLimitX96;
+    }
+
+    /// @notice Swaps `amountIn` of one token for as much as possible of another token
+    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
+    /// @return amountOut The amount of the received token
+    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
+
+    struct ExactInputParams {
+        bytes path;
+        address recipient;
+        uint256 deadline;
+        uint256 amountIn;
+        uint256 amountOutMinimum;
+    }
+
+    /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
+    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
+    /// @return amountOut The amount of the received token
+    function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
+
+    struct ExactOutputSingleParams {
+        address tokenIn;
+        address tokenOut;
+        uint24 fee;
+        address recipient;
+        uint256 deadline;
+        uint256 amountOut;
+        uint256 amountInMaximum;
+        uint160 sqrtPriceLimitX96;
+    }
+
+    /// @notice Swaps as little as possible of one token for `amountOut` of another token
+    /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
+    /// @return amountIn The amount of the input token
+    function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);
+
+    struct ExactOutputParams {
+        bytes path;
+        address recipient;
+        uint256 deadline;
+        uint256 amountOut;
+        uint256 amountInMaximum;
+    }
+
+    /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
+    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
+    /// @return amountIn The amount of the input token
+    function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
+}
diff --git a/momiji-helpers/contracts/Interfaces/IERC20.sol b/momiji-helpers/contracts/Interfaces/IERC20.sol
new file mode 100644
index 0000000000000000000000000000000000000000..4813ea77a0d2d779208b6b7ae529cbd01b5f6160
--- /dev/null
+++ b/momiji-helpers/contracts/Interfaces/IERC20.sol
@@ -0,0 +1,77 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity >=0.8.0;
+
+/**
+ * @dev Interface of the ERC20 standard as defined in the EIP.
+ */
+interface IERC20 {
+    /**
+     * @dev Returns the amount of tokens in existence.
+     */
+    function totalSupply() external view returns (uint256);
+
+    /**
+     * @dev Returns the amount of tokens owned by `account`.
+     */
+    function balanceOf(address account) external view returns (uint256);
+
+    /**
+     * @dev Moves `amount` tokens from the caller's account to `recipient`.
+     *
+     * Returns a boolean value indicating whether the operation succeeded.
+     *
+     * Emits a {Transfer} event.
+     */
+    function transfer(address recipient, uint256 amount) external returns (bool);
+
+    /**
+     * @dev Returns the remaining number of tokens that `spender` will be
+     * allowed to spend on behalf of `owner` through {transferFrom}. This is
+     * zero by default.
+     *
+     * This value changes when {approve} or {transferFrom} are called.
+     */
+    function allowance(address owner, address spender) external view returns (uint256);
+
+    /**
+     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
+     *
+     * Returns a boolean value indicating whether the operation succeeded.
+     *
+     * IMPORTANT: Beware that changing an allowance with this method brings the risk
+     * that someone may use both the old and the new allowance by unfortunate
+     * transaction ordering. One possible solution to mitigate this race
+     * condition is to first reduce the spender's allowance to 0 and set the
+     * desired value afterwards:
+     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
+     *
+     * Emits an {Approval} event.
+     */
+    function approve(address spender, uint256 amount) external returns (bool);
+
+    /**
+     * @dev Moves `amount` tokens from `sender` to `recipient` using the
+     * allowance mechanism. `amount` is then deducted from the caller's
+     * allowance.
+     *
+     * Returns a boolean value indicating whether the operation succeeded.
+     *
+     * Emits a {Transfer} event.
+     */
+    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
+
+    /**
+     * @dev Emitted when `value` tokens are moved from one account (`from`) to
+     * another (`to`).
+     *
+     * Note that `value` may be zero.
+     */
+    event Transfer(address indexed from, address indexed to, uint256 value);
+
+    /**
+     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
+     * a call to {approve}. `value` is the new allowance.
+     */
+    event Approval(address indexed owner, address indexed spender, uint256 value);
+}
diff --git a/momiji-helpers/contracts/Interfaces/IElasticERC20.sol b/momiji-helpers/contracts/Interfaces/IElasticERC20.sol
new file mode 100644
index 0000000000000000000000000000000000000000..f5ac3a1d00eab7f5f892a414d372d0dd4584dd9c
--- /dev/null
+++ b/momiji-helpers/contracts/Interfaces/IElasticERC20.sol
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity >=0.8.0;
+
+/**
+ * @dev Interface of the ERC20 standard as defined in the EIP.
+ */
+interface IElasticERC20 {
+    /**
+     * @dev Returns the amount of tokens in existence.
+     */
+    function totalSupply() external view returns (uint256);
+
+    /**
+     * @dev Returns the amount of tokens owned by `account`.
+     */
+    function balanceOf(address account) external view returns (uint256);
+
+    /**
+     * @dev Moves `amount` tokens from the caller's account to `recipient`.
+     *
+     * Returns a boolean value indicating whether the operation succeeded.
+     *
+     * Emits a {Transfer} event.
+     */
+    function transfer(address recipient, uint256 amount) external returns (bool);
+
+    /**
+     * @dev Returns the remaining number of tokens that `spender` will be
+     * allowed to spend on behalf of `owner` through {transferFrom}. This is
+     * zero by default.
+     *
+     * This value changes when {approve} or {transferFrom} are called.
+     */
+    function allowance(address owner, address spender) external view returns (uint256);
+
+    /**
+     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
+     *
+     * Returns a boolean value indicating whether the operation succeeded.
+     *
+     * IMPORTANT: Beware that changing an allowance with this method brings the risk
+     * that someone may use both the old and the new allowance by unfortunate
+     * transaction ordering. One possible solution to mitigate this race
+     * condition is to first reduce the spender's allowance to 0 and set the
+     * desired value afterwards:
+     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
+     *
+     * Emits an {Approval} event.
+     */
+    function approve(address spender, uint256 amount) external returns (bool);
+
+    /**
+     * @dev Moves `amount` tokens from `sender` to `recipient` using the
+     * allowance mechanism. `amount` is then deducted from the caller's
+     * allowance.
+     *
+     * Returns a boolean value indicating whether the operation succeeded.
+     *
+     * Emits a {Transfer} event.
+     */
+    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
+
+    // Additional mint and burn functions
+    function burn(address account, uint256 amount) external;
+    function mint(address account, uint256 amount) external;
+
+    /**
+     * @dev Emitted when `value` tokens are moved from one account (`from`) to
+     * another (`to`).
+     *
+     * Note that `value` may be zero.
+     */
+    event Transfer(address indexed from, address indexed to, uint256 value);
+
+    /**
+     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
+     * a call to {approve}. `value` is the new allowance.
+     */
+    event Approval(address indexed owner, address indexed spender, uint256 value);
+}
diff --git a/momiji-helpers/contracts/Interfaces/IUniswapV3Pool.sol b/momiji-helpers/contracts/Interfaces/IUniswapV3Pool.sol
new file mode 100644
index 0000000000000000000000000000000000000000..555a5b6acffb65ff7f5e458178ad4ff629c1c76a
--- /dev/null
+++ b/momiji-helpers/contracts/Interfaces/IUniswapV3Pool.sol
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+pragma solidity >=0.5.0;
+
+import '@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol';
+import '@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol';
+import '@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol';
+import '@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol';
+import '@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol';
+import '@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol';
+
+/// @title The interface for a Uniswap V3 Pool
+/// @notice A Uniswap pool facilitates swapping and automated market making between any two assets that strictly conform
+/// to the ERC20 specification
+/// @dev The pool interface is broken up into many smaller pieces
+interface IUniswapV3Pool is
+    IUniswapV3PoolImmutables,
+    IUniswapV3PoolState,
+    IUniswapV3PoolDerivedState,
+    IUniswapV3PoolActions,
+    IUniswapV3PoolOwnerActions,
+    IUniswapV3PoolEvents
+{
+
+}
diff --git a/momiji-helpers/contracts/Libraries/structs.sol b/momiji-helpers/contracts/Libraries/structs.sol
new file mode 100644
index 0000000000000000000000000000000000000000..e89bf5ef89157d3b7cba5de01aa6095229315fcf
--- /dev/null
+++ b/momiji-helpers/contracts/Libraries/structs.sol
@@ -0,0 +1,57 @@
+struct Payment {
+    bytes32 recipient;
+    uint256 withdrawalAmount;
+    uint256 swapAmount;
+    uint160 price_limit;
+}
+
+struct Deposit {
+    bytes signature;
+    bytes32 pi_hash;
+}
+
+struct DepositHash {
+    bytes32 pi_hash;
+}
+
+struct EncryptedUTXO {
+    bytes32 secret;
+    bytes32 amount;
+    bytes32 data;
+}
+
+struct Transaction {
+    bytes32 current_root;
+    bytes32 utxo_root;
+    bytes32 price_limit;
+    bytes32 timestamp;
+    bytes32 deadline;
+    bytes32 amount;
+    EncryptedUTXO[16] encrypted_utxo;
+    bytes32[16] withdrawals;
+    bytes32[16] commitments_in;
+    bytes32[16] commitments;
+    bytes32[16] recipients;
+    bytes32[16] nullifier_hashes;
+    bytes32[16] uids;
+    bytes32[16] swap_amounts;
+    Deposit deposit;
+}
+
+struct TransactionWithProof {
+    Transaction transaction;
+    bytes32[93] proof;
+    bytes proofU8;
+}
+
+struct Batch {
+    bytes32 tx_key_hash;
+    bytes32 recursive_key_hash;
+    bytes32 new_root;
+    bytes32 old_hist_root;
+    bytes32 new_hist_root;
+    bytes32 oracle;
+    bytes32[20] historic_path;
+    bytes32[16] aggregation_object;
+    Transaction[] transactions;
+}
\ No newline at end of file
diff --git a/momiji-helpers/contracts/XFTmock.sol b/momiji-helpers/contracts/XFTmock.sol
new file mode 100644
index 0000000000000000000000000000000000000000..2a02e599bd199035091864f66a4c2af62ca52dc4
--- /dev/null
+++ b/momiji-helpers/contracts/XFTmock.sol
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import "@openzeppelin/contracts/access/AccessControl.sol";
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+
+contract XFTMock is ERC20, AccessControl {
+    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
+    bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");
+
+    constructor(string memory _vk) ERC20(_vk, _vk) {
+        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
+    }
+
+    function mint(address to, uint256 amount) public {
+        require(hasRole(MINTER_ROLE, msg.sender), "Caller is not a minter");
+        _mint(to, amount);
+    }
+
+    function burn(address from, uint256 amount) public {
+        require(hasRole(BURNER_ROLE, msg.sender), "Caller is not a burner");
+        _burn(from, amount);
+    }
+
+    
+}
\ No newline at end of file
diff --git a/momiji-helpers/contracts/plonk_vk.sol b/momiji-helpers/contracts/plonk_vk.sol
new file mode 100644
index 0000000000000000000000000000000000000000..93cc63fd259d6e3e8d9dd238d94ef1cb8869a357
--- /dev/null
+++ b/momiji-helpers/contracts/plonk_vk.sol
@@ -0,0 +1,2777 @@
+// Verification Key Hash: 066e0b06b13ec4c45dbeb0b625dbfab874ecdc411cdb43bae4346e880b09e16c
+// SPDX-License-Identifier: Apache-2.0
+// Copyright 2022 Aztec
+pragma solidity >=0.8.4;
+
+library UltraVerificationKey {
+    function verificationKeyHash() internal pure returns(bytes32) {
+        return 0x066e0b06b13ec4c45dbeb0b625dbfab874ecdc411cdb43bae4346e880b09e16c;
+    }
+
+    function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure {
+        assembly {
+            mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000080000) // vk.circuit_size
+            mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000011) // vk.num_inputs
+            mstore(add(_vk, 0x40), 0x2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd) // vk.work_root
+            mstore(add(_vk, 0x60), 0x3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201) // vk.domain_inverse
+            mstore(add(_vk, 0x80), 0x174c5c19a31444028bb6368ff05acd095502e7d022af18c746a364dab4c7346e) // vk.Q1.x
+            mstore(add(_vk, 0xa0), 0x2e6d6b74f09bdcf37e2be6f0a05552f34840f8693d1c73edce05639d0698ea36) // vk.Q1.y
+            mstore(add(_vk, 0xc0), 0x243678b1fa4062f90887453567ef78c256421a5907513427b5c52aa3cb1e6a17) // vk.Q2.x
+            mstore(add(_vk, 0xe0), 0x10425e273dc8dd43dbb983a295f7f990b9475fca570f56f1d7f972166e5bf0d8) // vk.Q2.y
+            mstore(add(_vk, 0x100), 0x23b6836088c547e90ddfdb8146a5f7b3608aad75f4d0d5a050f119e6eea92c22) // vk.Q3.x
+            mstore(add(_vk, 0x120), 0x0cafbde5fed53b2d75343797c5718363f54c3b391730f7b49a8ae09cd79b8b20) // vk.Q3.y
+            mstore(add(_vk, 0x140), 0x06acf52ef347e83eae253c24631c08d66d76669d97c0cce87b0320363e0188bd) // vk.Q4.x
+            mstore(add(_vk, 0x160), 0x1f8257e9bfac704d9b0171c74f4f35ec94c608ae5ff55962db5bc4fd9e1aba89) // vk.Q4.y
+            mstore(add(_vk, 0x180), 0x11931c54c38fba5131f7a317e782a12a8e3e3726dc2eaa490049ce2ca8ca1cbb) // vk.Q_M.x
+            mstore(add(_vk, 0x1a0), 0x0565f2552174d90b7b0e9645969affd0015d483dffec9d93ede1b63be6dc3c16) // vk.Q_M.y
+            mstore(add(_vk, 0x1c0), 0x0bca92d0bac2e3d19be0265337ec7f4574f8195e313af04d651f342bb3159fb8) // vk.Q_C.x
+            mstore(add(_vk, 0x1e0), 0x1ecb4bbed3bfe4b4e91afe37b7871694eda583ff1d1111be20aa9eb8edf50a77) // vk.Q_C.y
+            mstore(add(_vk, 0x200), 0x0c1be01afc0073d9a1f1e23184a1d005a89d087265ea3a85f523ecd062212260) // vk.Q_ARITHMETIC.x
+            mstore(add(_vk, 0x220), 0x25a9e732ab54e2ebe8d031c166997a26a5d5dc143dc246b4b046b170406da4f1) // vk.Q_ARITHMETIC.y
+            mstore(add(_vk, 0x240), 0x2498b2e14394f700cac156f42ef63ba194ed99764e03f2e433cb0be94d0fc89f) // vk.QSORT.x
+            mstore(add(_vk, 0x260), 0x206103c2ff58564c9a4746efd3fff7637a46052eb129af96844c2d850d11d8f3) // vk.QSORT.y
+            mstore(add(_vk, 0x280), 0x212dfe13df5b9cfb846570ecf8269ed3648c24827e7dceafdeca6235e1dd5e38) // vk.Q_ELLIPTIC.x
+            mstore(add(_vk, 0x2a0), 0x284d15304c372e9c33d76628c66bd6c48ef526d08146e9b401dc7d1e373ccd3a) // vk.Q_ELLIPTIC.y
+            mstore(add(_vk, 0x2c0), 0x126a3a8e4c678d476c3c864cde50f9776d880443976f62a438b9db897b433ffa) // vk.Q_AUX.x
+            mstore(add(_vk, 0x2e0), 0x2866186a79faf6dde910250342628d6a7a1c6d32f88b1991b276852874bd73dc) // vk.Q_AUX.y
+            mstore(add(_vk, 0x300), 0x2bd3d50520f90ab39921a0f2ce6c8f5d5cc8a989720e939dbb4a8951d878f579) // vk.SIGMA1.x
+            mstore(add(_vk, 0x320), 0x0b5652d8de0be47d4a6496260931f15984d6cc0eb21e61c15991554eee8bfe91) // vk.SIGMA1.y
+            mstore(add(_vk, 0x340), 0x135cdf64147af6820b82eff62e1e62efb848f20c81dffc2ed36cc4d3ef9d6ee3) // vk.SIGMA2.x
+            mstore(add(_vk, 0x360), 0x16ce92a14e25ca8f353781ad6bf4c105139a2029c682b0e62606b721e9d8c848) // vk.SIGMA2.y
+            mstore(add(_vk, 0x380), 0x0c9177240c1a64d39bbdc9113347b71c8ad5899a9a617b70450e43ca0f08c0b9) // vk.SIGMA3.x
+            mstore(add(_vk, 0x3a0), 0x26486bfd9b1989300948793829dda7ebd3c783b85ef797363b15bdf9932d624f) // vk.SIGMA3.y
+            mstore(add(_vk, 0x3c0), 0x0933b476f487753e6b6a6c07579f099b3bd03e1d4fad080cdf864233e378e6f7) // vk.SIGMA4.x
+            mstore(add(_vk, 0x3e0), 0x19fa964521f482600ad8f48f2d74204aa35665cefec49c73255bcd7bb9cf1d2e) // vk.SIGMA4.y
+            mstore(add(_vk, 0x400), 0x1cadeb85ec1d913dbbebd04a2e9c216fffb782a908252de688cb3f87a9960239) // vk.TABLE1.x
+            mstore(add(_vk, 0x420), 0x140ce35846522600428e89cedfc30ef4f906e759e4b262f982f41b11e232bef0) // vk.TABLE1.y
+            mstore(add(_vk, 0x440), 0x186c47255bd1cac8572abe17f302a4a778dc042d05b5ad10ec72ccf87db72cbd) // vk.TABLE2.x
+            mstore(add(_vk, 0x460), 0x2696b8ea9abe2e21817826ff8ffdd70455306100f722aee5047d7b61d23be470) // vk.TABLE2.y
+            mstore(add(_vk, 0x480), 0x203c78601f28e6739d2031447af9f5015f00e4a92298c8e0af4906929ce4aa23) // vk.TABLE3.x
+            mstore(add(_vk, 0x4a0), 0x0b82d8af3657b8dacf80c03e267415e27c1b22c5b110041433f5f7a0077d6163) // vk.TABLE3.y
+            mstore(add(_vk, 0x4c0), 0x1ca5d2fc76408b3d82cd070612b1f00b2910e92b606943f0a66d4064ac05d6f3) // vk.TABLE4.x
+            mstore(add(_vk, 0x4e0), 0x12889680e44151655a6fb88176f0eb0e09e60039ec5cbc978bcb081ca4d41c1e) // vk.TABLE4.y
+            mstore(add(_vk, 0x500), 0x269c3c1e6be15df4cd6e18678103fb6a22fc4e79890d0e7d18259353640bf580) // vk.TABLE_TYPE.x
+            mstore(add(_vk, 0x520), 0x073ef16b8836c3c34ac6e02937c25aaf47728e8aaa50eea7a2a7e2d87b2a051c) // vk.TABLE_TYPE.y
+            mstore(add(_vk, 0x540), 0x0642a0979a2c84f7f2c1ae9c5285e8b54bc1a57e51ec50588ec003e5ccaa1ef0) // vk.ID1.x
+            mstore(add(_vk, 0x560), 0x10759f71ebeb64070c9bde2e55126711646725544ef4273f9a391b9b9b0af13d) // vk.ID1.y
+            mstore(add(_vk, 0x580), 0x05107532383658086d131205993b32158da27ddcf4a41708cf50e4e6ca986205) // vk.ID2.x
+            mstore(add(_vk, 0x5a0), 0x1c67ba6b417eddf6928c56e1fece6ba9c73c4579c446ff0bd86e794121b4957c) // vk.ID2.y
+            mstore(add(_vk, 0x5c0), 0x030c58a082fe2a8a256a3c7596ca585a024396e2377db7e854bf7f14514759b8) // vk.ID3.x
+            mstore(add(_vk, 0x5e0), 0x1606bd0cae6fbb354de28025f6deb12a003c43b7dafa272c94b35c752ceaa696) // vk.ID3.y
+            mstore(add(_vk, 0x600), 0x1e1a0bd62a0746fb76e5d6727d5db536662c58d163cf29375fff76b669856e5f) // vk.ID4.x
+            mstore(add(_vk, 0x620), 0x0f786242d4fd388fd0e83bc4074cef1a36162d3403af146af654e72acb72e4c6) // vk.ID4.y
+            mstore(add(_vk, 0x640), 0x01) // vk.contains_recursive_proof
+            mstore(add(_vk, 0x660), 1) // vk.recursive_proof_public_input_indices
+            mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 
+            mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 
+            mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 
+            mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 
+            mstore(_omegaInverseLoc, 0x06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321) // vk.work_root_inverse
+        }
+    }
+}
+
+/**
+ * @title Ultra Plonk proof verification contract
+ * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified
+ */
+abstract contract BaseUltraVerifier {
+    // VERIFICATION KEY MEMORY LOCATIONS
+    uint256 internal constant N_LOC = 0x380;
+    uint256 internal constant NUM_INPUTS_LOC = 0x3a0;
+    uint256 internal constant OMEGA_LOC = 0x3c0;
+    uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0;
+    uint256 internal constant Q1_X_LOC = 0x400;
+    uint256 internal constant Q1_Y_LOC = 0x420;
+    uint256 internal constant Q2_X_LOC = 0x440;
+    uint256 internal constant Q2_Y_LOC = 0x460;
+    uint256 internal constant Q3_X_LOC = 0x480;
+    uint256 internal constant Q3_Y_LOC = 0x4a0;
+    uint256 internal constant Q4_X_LOC = 0x4c0;
+    uint256 internal constant Q4_Y_LOC = 0x4e0;
+    uint256 internal constant QM_X_LOC = 0x500;
+    uint256 internal constant QM_Y_LOC = 0x520;
+    uint256 internal constant QC_X_LOC = 0x540;
+    uint256 internal constant QC_Y_LOC = 0x560;
+    uint256 internal constant QARITH_X_LOC = 0x580;
+    uint256 internal constant QARITH_Y_LOC = 0x5a0;
+    uint256 internal constant QSORT_X_LOC = 0x5c0;
+    uint256 internal constant QSORT_Y_LOC = 0x5e0;
+    uint256 internal constant QELLIPTIC_X_LOC = 0x600;
+    uint256 internal constant QELLIPTIC_Y_LOC = 0x620;
+    uint256 internal constant QAUX_X_LOC = 0x640;
+    uint256 internal constant QAUX_Y_LOC = 0x660;
+    uint256 internal constant SIGMA1_X_LOC = 0x680;
+    uint256 internal constant SIGMA1_Y_LOC = 0x6a0;
+    uint256 internal constant SIGMA2_X_LOC = 0x6c0;
+    uint256 internal constant SIGMA2_Y_LOC = 0x6e0;
+    uint256 internal constant SIGMA3_X_LOC = 0x700;
+    uint256 internal constant SIGMA3_Y_LOC = 0x720;
+    uint256 internal constant SIGMA4_X_LOC = 0x740;
+    uint256 internal constant SIGMA4_Y_LOC = 0x760;
+    uint256 internal constant TABLE1_X_LOC = 0x780;
+    uint256 internal constant TABLE1_Y_LOC = 0x7a0;
+    uint256 internal constant TABLE2_X_LOC = 0x7c0;
+    uint256 internal constant TABLE2_Y_LOC = 0x7e0;
+    uint256 internal constant TABLE3_X_LOC = 0x800;
+    uint256 internal constant TABLE3_Y_LOC = 0x820;
+    uint256 internal constant TABLE4_X_LOC = 0x840;
+    uint256 internal constant TABLE4_Y_LOC = 0x860;
+    uint256 internal constant TABLE_TYPE_X_LOC = 0x880;
+    uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0;
+    uint256 internal constant ID1_X_LOC = 0x8c0;
+    uint256 internal constant ID1_Y_LOC = 0x8e0;
+    uint256 internal constant ID2_X_LOC = 0x900;
+    uint256 internal constant ID2_Y_LOC = 0x920;
+    uint256 internal constant ID3_X_LOC = 0x940;
+    uint256 internal constant ID3_Y_LOC = 0x960;
+    uint256 internal constant ID4_X_LOC = 0x980;
+    uint256 internal constant ID4_Y_LOC = 0x9a0;
+    uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0;
+    uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0;
+    uint256 internal constant G2X_X0_LOC = 0xa00;
+    uint256 internal constant G2X_X1_LOC = 0xa20;
+    uint256 internal constant G2X_Y0_LOC = 0xa40;
+    uint256 internal constant G2X_Y1_LOC = 0xa60;
+
+    // ### PROOF DATA MEMORY LOCATIONS
+    uint256 internal constant W1_X_LOC = 0x1200;
+    uint256 internal constant W1_Y_LOC = 0x1220;
+    uint256 internal constant W2_X_LOC = 0x1240;
+    uint256 internal constant W2_Y_LOC = 0x1260;
+    uint256 internal constant W3_X_LOC = 0x1280;
+    uint256 internal constant W3_Y_LOC = 0x12a0;
+    uint256 internal constant W4_X_LOC = 0x12c0;
+    uint256 internal constant W4_Y_LOC = 0x12e0;
+    uint256 internal constant S_X_LOC = 0x1300;
+    uint256 internal constant S_Y_LOC = 0x1320;
+    uint256 internal constant Z_X_LOC = 0x1340;
+    uint256 internal constant Z_Y_LOC = 0x1360;
+    uint256 internal constant Z_LOOKUP_X_LOC = 0x1380;
+    uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0;
+    uint256 internal constant T1_X_LOC = 0x13c0;
+    uint256 internal constant T1_Y_LOC = 0x13e0;
+    uint256 internal constant T2_X_LOC = 0x1400;
+    uint256 internal constant T2_Y_LOC = 0x1420;
+    uint256 internal constant T3_X_LOC = 0x1440;
+    uint256 internal constant T3_Y_LOC = 0x1460;
+    uint256 internal constant T4_X_LOC = 0x1480;
+    uint256 internal constant T4_Y_LOC = 0x14a0;
+
+    uint256 internal constant W1_EVAL_LOC = 0x1600;
+    uint256 internal constant W2_EVAL_LOC = 0x1620;
+    uint256 internal constant W3_EVAL_LOC = 0x1640;
+    uint256 internal constant W4_EVAL_LOC = 0x1660;
+    uint256 internal constant S_EVAL_LOC = 0x1680;
+    uint256 internal constant Z_EVAL_LOC = 0x16a0;
+    uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0;
+    uint256 internal constant Q1_EVAL_LOC = 0x16e0;
+    uint256 internal constant Q2_EVAL_LOC = 0x1700;
+    uint256 internal constant Q3_EVAL_LOC = 0x1720;
+    uint256 internal constant Q4_EVAL_LOC = 0x1740;
+    uint256 internal constant QM_EVAL_LOC = 0x1760;
+    uint256 internal constant QC_EVAL_LOC = 0x1780;
+    uint256 internal constant QARITH_EVAL_LOC = 0x17a0;
+    uint256 internal constant QSORT_EVAL_LOC = 0x17c0;
+    uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0;
+    uint256 internal constant QAUX_EVAL_LOC = 0x1800;
+    uint256 internal constant TABLE1_EVAL_LOC = 0x1840;
+    uint256 internal constant TABLE2_EVAL_LOC = 0x1860;
+    uint256 internal constant TABLE3_EVAL_LOC = 0x1880;
+    uint256 internal constant TABLE4_EVAL_LOC = 0x18a0;
+    uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0;
+    uint256 internal constant ID1_EVAL_LOC = 0x18e0;
+    uint256 internal constant ID2_EVAL_LOC = 0x1900;
+    uint256 internal constant ID3_EVAL_LOC = 0x1920;
+    uint256 internal constant ID4_EVAL_LOC = 0x1940;
+    uint256 internal constant SIGMA1_EVAL_LOC = 0x1960;
+    uint256 internal constant SIGMA2_EVAL_LOC = 0x1980;
+    uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0;
+    uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0;
+    uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0;
+    uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000;
+    uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020;
+    uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040;
+    uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060;
+    uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080;
+    uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0;
+    uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0;
+    uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0;
+    uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100;
+    uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120;
+
+    uint256 internal constant PI_Z_X_LOC = 0x2300;
+    uint256 internal constant PI_Z_Y_LOC = 0x2320;
+    uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340;
+    uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360;
+
+    // Used for elliptic widget. These are alias names for wire + shifted wire evaluations
+    uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC;
+    uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC;
+    uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC;
+    uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC;
+    uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC;
+    uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC;
+    uint256 internal constant QBETA_LOC = Q3_EVAL_LOC;
+    uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC;
+    uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC;
+
+    // ### CHALLENGES MEMORY OFFSETS
+
+    uint256 internal constant C_BETA_LOC = 0x2600;
+    uint256 internal constant C_GAMMA_LOC = 0x2620;
+    uint256 internal constant C_ALPHA_LOC = 0x2640;
+    uint256 internal constant C_ETA_LOC = 0x2660;
+    uint256 internal constant C_ETA_SQR_LOC = 0x2680;
+    uint256 internal constant C_ETA_CUBE_LOC = 0x26a0;
+
+    uint256 internal constant C_ZETA_LOC = 0x26c0;
+    uint256 internal constant C_CURRENT_LOC = 0x26e0;
+    uint256 internal constant C_V0_LOC = 0x2700;
+    uint256 internal constant C_V1_LOC = 0x2720;
+    uint256 internal constant C_V2_LOC = 0x2740;
+    uint256 internal constant C_V3_LOC = 0x2760;
+    uint256 internal constant C_V4_LOC = 0x2780;
+    uint256 internal constant C_V5_LOC = 0x27a0;
+    uint256 internal constant C_V6_LOC = 0x27c0;
+    uint256 internal constant C_V7_LOC = 0x27e0;
+    uint256 internal constant C_V8_LOC = 0x2800;
+    uint256 internal constant C_V9_LOC = 0x2820;
+    uint256 internal constant C_V10_LOC = 0x2840;
+    uint256 internal constant C_V11_LOC = 0x2860;
+    uint256 internal constant C_V12_LOC = 0x2880;
+    uint256 internal constant C_V13_LOC = 0x28a0;
+    uint256 internal constant C_V14_LOC = 0x28c0;
+    uint256 internal constant C_V15_LOC = 0x28e0;
+    uint256 internal constant C_V16_LOC = 0x2900;
+    uint256 internal constant C_V17_LOC = 0x2920;
+    uint256 internal constant C_V18_LOC = 0x2940;
+    uint256 internal constant C_V19_LOC = 0x2960;
+    uint256 internal constant C_V20_LOC = 0x2980;
+    uint256 internal constant C_V21_LOC = 0x29a0;
+    uint256 internal constant C_V22_LOC = 0x29c0;
+    uint256 internal constant C_V23_LOC = 0x29e0;
+    uint256 internal constant C_V24_LOC = 0x2a00;
+    uint256 internal constant C_V25_LOC = 0x2a20;
+    uint256 internal constant C_V26_LOC = 0x2a40;
+    uint256 internal constant C_V27_LOC = 0x2a60;
+    uint256 internal constant C_V28_LOC = 0x2a80;
+    uint256 internal constant C_V29_LOC = 0x2aa0;
+    uint256 internal constant C_V30_LOC = 0x2ac0;
+
+    uint256 internal constant C_U_LOC = 0x2b00;
+
+    // ### LOCAL VARIABLES MEMORY OFFSETS
+    uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000;
+    uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020;
+    uint256 internal constant ZETA_POW_N_LOC = 0x3040;
+    uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060;
+    uint256 internal constant ZERO_POLY_LOC = 0x3080;
+    uint256 internal constant L_START_LOC = 0x30a0;
+    uint256 internal constant L_END_LOC = 0x30c0;
+    uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0;
+
+    uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100;
+    uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120;
+    uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140;
+
+    uint256 internal constant ACCUMULATOR_X_LOC = 0x3160;
+    uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180;
+    uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0;
+    uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0;
+    uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0;
+    uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200;
+    uint256 internal constant PAIRING_RHS_X_LOC = 0x3220;
+    uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240;
+
+    // misc stuff
+    uint256 internal constant OMEGA_INVERSE_LOC = 0x3300;
+    uint256 internal constant C_ALPHA_SQR_LOC = 0x3320;
+    uint256 internal constant C_ALPHA_CUBE_LOC = 0x3340;
+    uint256 internal constant C_ALPHA_QUAD_LOC = 0x3360;
+    uint256 internal constant C_ALPHA_BASE_LOC = 0x3380;
+
+    // ### RECURSION VARIABLE MEMORY LOCATIONS
+    uint256 internal constant RECURSIVE_P1_X_LOC = 0x3400;
+    uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3420;
+    uint256 internal constant RECURSIVE_P2_X_LOC = 0x3440;
+    uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3460;
+    uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3480;
+
+    // sub-identity storage
+    uint256 internal constant PERMUTATION_IDENTITY = 0x3500;
+    uint256 internal constant PLOOKUP_IDENTITY = 0x3520;
+    uint256 internal constant ARITHMETIC_IDENTITY = 0x3540;
+    uint256 internal constant SORT_IDENTITY = 0x3560;
+    uint256 internal constant ELLIPTIC_IDENTITY = 0x3580;
+    uint256 internal constant AUX_IDENTITY = 0x35a0;
+    uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x35c0;
+    uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x35e0;
+    uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3600;
+    uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3620;
+    uint256 internal constant AUX_MEMORY_EVALUATION = 0x3640;
+
+    uint256 internal constant QUOTIENT_EVAL_LOC = 0x3660;
+    uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3680;
+
+    // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time
+    uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x36a0;
+    uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x36c0;
+    uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x36e0;
+
+    bytes4 internal constant INVALID_VERIFICATION_KEY_SELECTOR = 0x7e5769bf;
+    bytes4 internal constant POINT_NOT_ON_CURVE_SELECTOR = 0xa3dad654;
+    bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6;
+    bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f;
+    bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc;
+    bytes4 internal constant PAIRING_PREAMBLE_FAILED_SELECTOR = 0x01882d81;
+    bytes4 internal constant OPENING_COMMITMENT_FAILED_SELECTOR = 0x4e719763;
+    bytes4 internal constant PAIRING_FAILED_SELECTOR = 0xd71fd263;
+
+    uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes
+
+    // We need to hash 41 field elements when generating the NU challenge
+    // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14)
+    // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7)
+    // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9)
+    // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7)
+    // table1_omega, table2_omega, table3_omega, table4_omega (4)
+    uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20
+
+    // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over
+    // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4
+    uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0
+
+    uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P =
+        0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000;
+    uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68
+    uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14
+
+    // y^2 = x^3 + ax + b
+    // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic
+    uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17;
+
+    error INVALID_VERIFICATION_KEY();
+    error POINT_NOT_ON_CURVE();
+    error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual);
+    error PUBLIC_INPUT_INVALID_BN128_G1_POINT();
+    error PUBLIC_INPUT_GE_P();
+    error MOD_EXP_FAILURE();
+    error PAIRING_PREAMBLE_FAILED();
+    error OPENING_COMMITMENT_FAILED();
+    error PAIRING_FAILED();
+
+    function getVerificationKeyHash() public pure virtual returns (bytes32);
+
+    /**
+     * @dev We assume that the verification key loaded by this function is constant as we only verify it on deployment
+     */
+    function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual;
+
+    constructor() { 
+        loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);
+
+        // We verify that all of the EC points in the verification key lie on the bn128 curve. 
+        assembly {
+            let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order
+
+            let success := 1
+
+            // VALIDATE Q1
+            {
+                let x := mload(Q1_X_LOC)
+                let y := mload(Q1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE Q2
+            {
+                let x := mload(Q2_X_LOC)
+                let y := mload(Q2_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE Q3
+            {
+                let x := mload(Q3_X_LOC)
+                let y := mload(Q3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE Q4
+            {
+                let x := mload(Q4_X_LOC)
+                let y := mload(Q4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            // VALIDATE QM
+            {
+                let x := mload(QM_X_LOC)
+                let y := mload(QM_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE QC
+            {
+                let x := mload(QC_X_LOC)
+                let y := mload(QC_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE QARITH
+            {
+                let x := mload(QARITH_X_LOC)
+                let y := mload(QARITH_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE QSORT
+            {
+                let x := mload(QSORT_X_LOC)
+                let y := mload(QSORT_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE QELLIPTIC
+            {
+                let x := mload(QELLIPTIC_X_LOC)
+                let y := mload(QELLIPTIC_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE QAUX
+            {
+                let x := mload(QAUX_X_LOC)
+                let y := mload(QAUX_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE SIGMA1
+            {
+                let x := mload(SIGMA1_X_LOC)
+                let y := mload(SIGMA1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE SIGMA2
+            {
+                let x := mload(SIGMA2_X_LOC)
+                let y := mload(SIGMA2_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE SIGMA3
+            {
+                let x := mload(SIGMA3_X_LOC)
+                let y := mload(SIGMA3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE SIGMA4
+            {
+                let x := mload(SIGMA4_X_LOC)
+                let y := mload(SIGMA4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE TABLE1
+            {
+                let x := mload(TABLE1_X_LOC)
+                let y := mload(TABLE1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            } 
+            // VALIDATE TABLE2
+            {
+                let x := mload(TABLE2_X_LOC)
+                let y := mload(TABLE2_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            } 
+            // VALIDATE TABLE3
+            {
+                let x := mload(TABLE3_X_LOC)
+                let y := mload(TABLE3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            } 
+            // VALIDATE TABLE4
+            {
+                let x := mload(TABLE4_X_LOC)
+                let y := mload(TABLE4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            } 
+            // VALIDATE TABLE_TYPE
+            {
+                let x := mload(TABLE_TYPE_X_LOC)
+                let y := mload(TABLE_TYPE_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE ID1
+            {
+                let x := mload(ID1_X_LOC)
+                let y := mload(ID1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE ID2
+            {
+                let x := mload(ID2_X_LOC)
+                let y := mload(ID2_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE ID3
+            {
+                let x := mload(ID3_X_LOC)
+                let y := mload(ID3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+            // VALIDATE ID4
+            {
+                let x := mload(ID4_X_LOC)
+                let y := mload(ID4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)))
+            }
+
+            if iszero(success) {
+                mstore(0x0, INVALID_VERIFICATION_KEY_SELECTOR)
+                revert(0x00, 0x04)
+            }
+        }
+    }
+
+    /**
+     * @notice Verify a Ultra Plonk proof
+     * @param _proof - The serialized proof
+     * @param _publicInputs - An array of the public inputs
+     * @return True if proof is valid, reverts otherwise
+     */
+    function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) {
+        loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC);
+
+        uint256 requiredPublicInputCount;
+        assembly {
+            requiredPublicInputCount := mload(NUM_INPUTS_LOC)
+        }
+        if (requiredPublicInputCount != _publicInputs.length) {
+            revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length);
+        }
+
+        assembly {
+            let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order
+            let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order
+
+            /**
+             * LOAD PROOF FROM CALLDATA
+             */
+            {
+                let data_ptr := add(calldataload(0x04), 0x24)
+
+                mstore(W1_Y_LOC, mod(calldataload(data_ptr), q))
+                mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q))
+
+                mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q))
+                mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q))
+
+                mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q))
+                mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q))
+
+                mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q))
+                mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q))
+
+                mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q))
+                mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q))
+                mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q))
+                mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q))
+                mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q))
+                mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q))
+                mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q))
+                mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q))
+
+                mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q))
+                mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q))
+
+                mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q))
+                mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q))
+
+                mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q))
+                mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q))
+
+                mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p))
+                mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p))
+                mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p))
+                mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p))
+                mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p))
+                mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p))
+                mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p))
+                mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p))
+                mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p))
+                mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p))
+                mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p))
+                mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p))
+                mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p))
+                mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p))
+                mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p))
+                mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p))
+                mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p))
+
+                mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p))
+                mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p))
+
+                mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p))
+                mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p))
+
+                mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p))
+                mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p))
+                mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p))
+                mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p))
+                mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p))
+
+                mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p))
+                mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p))
+                mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p))
+                mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p))
+
+                mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p))
+                mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p))
+                mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p))
+                mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p))
+                mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p))
+
+                mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p))
+
+                mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p))
+                mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p))
+                mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p))
+                mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p))
+                mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p))
+
+                mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q))
+                mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q))
+
+                mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q))
+                mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q))
+            }
+
+            /**
+             * LOAD RECURSIVE PROOF INTO MEMORY
+             */
+            {
+                if mload(CONTAINS_RECURSIVE_PROOF_LOC) {
+                    let public_inputs_ptr := add(calldataload(0x24), 0x24)
+                    let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr)
+
+                    let x0 := calldataload(index_counter)
+                    x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20))))
+                    x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40))))
+                    x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60))))
+                    let y0 := calldataload(add(index_counter, 0x80))
+                    y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0))))
+                    y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0))))
+                    y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0))))
+                    let x1 := calldataload(add(index_counter, 0x100))
+                    x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120))))
+                    x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140))))
+                    x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160))))
+                    let y1 := calldataload(add(index_counter, 0x180))
+                    y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0))))
+                    y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0))))
+                    y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0))))
+                    mstore(RECURSIVE_P1_X_LOC, x0)
+                    mstore(RECURSIVE_P1_Y_LOC, y0)
+                    mstore(RECURSIVE_P2_X_LOC, x1)
+                    mstore(RECURSIVE_P2_Y_LOC, y1)
+
+                    // validate these are valid bn128 G1 points
+                    if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) {
+                        mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR)
+                        revert(0x00, 0x04)
+                    }
+                }
+            }
+
+            {
+                /**
+                 * Generate initial challenge
+                 */
+                mstore(0x00, shl(224, mload(N_LOC)))
+                mstore(0x04, shl(224, mload(NUM_INPUTS_LOC)))
+                let challenge := keccak256(0x00, 0x08)
+
+                /**
+                 * Generate eta challenge
+                 */
+                mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge)
+                // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs
+                let public_inputs_start := add(calldataload(0x24), 0x24)
+                // copy the public inputs over
+                let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20)
+                calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size)
+
+                // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length)
+                let w_start := add(calldataload(0x04), 0x24)
+                calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH)
+
+                // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0)
+                let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH))
+
+                challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size)
+                {
+                    let eta := mod(challenge, p)
+                    mstore(C_ETA_LOC, eta)
+                    mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p))
+                    mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p))
+                }
+
+                /**
+                 * Generate beta challenge
+                 */
+                mstore(0x00, challenge)
+                mstore(0x20, mload(W4_Y_LOC))
+                mstore(0x40, mload(W4_X_LOC))
+                mstore(0x60, mload(S_Y_LOC))
+                mstore(0x80, mload(S_X_LOC))
+                challenge := keccak256(0x00, 0xa0)
+                mstore(C_BETA_LOC, mod(challenge, p))
+
+                /**
+                 * Generate gamma challenge
+                 */
+                mstore(0x00, challenge)
+                mstore8(0x20, 0x01)
+                challenge := keccak256(0x00, 0x21)
+                mstore(C_GAMMA_LOC, mod(challenge, p))
+
+                /**
+                 * Generate alpha challenge
+                 */
+                mstore(0x00, challenge)
+                mstore(0x20, mload(Z_Y_LOC))
+                mstore(0x40, mload(Z_X_LOC))
+                mstore(0x60, mload(Z_LOOKUP_Y_LOC))
+                mstore(0x80, mload(Z_LOOKUP_X_LOC))
+                challenge := keccak256(0x00, 0xa0)
+                mstore(C_ALPHA_LOC, mod(challenge, p))
+
+                /**
+                 * Compute and store some powers of alpha for future computations
+                 */
+                let alpha := mload(C_ALPHA_LOC)
+                mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p))
+                mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p))
+                mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p))
+                mstore(C_ALPHA_BASE_LOC, alpha)
+
+                /**
+                 * Generate zeta challenge
+                 */
+                mstore(0x00, challenge)
+                mstore(0x20, mload(T1_Y_LOC))
+                mstore(0x40, mload(T1_X_LOC))
+                mstore(0x60, mload(T2_Y_LOC))
+                mstore(0x80, mload(T2_X_LOC))
+                mstore(0xa0, mload(T3_Y_LOC))
+                mstore(0xc0, mload(T3_X_LOC))
+                mstore(0xe0, mload(T4_Y_LOC))
+                mstore(0x100, mload(T4_X_LOC))
+
+                challenge := keccak256(0x00, 0x120)
+
+                mstore(C_ZETA_LOC, mod(challenge, p))
+                mstore(C_CURRENT_LOC, challenge)
+            }
+
+            /**
+             * EVALUATE FIELD OPERATIONS
+             */
+
+            /**
+             * COMPUTE PUBLIC INPUT DELTA
+             * ΔPI = ∏ᵢ∈ℓ(wᵢ + β σ(i) + γ) / ∏ᵢ∈ℓ(wᵢ + β σ'(i) + γ)
+             */
+            {
+                let beta := mload(C_BETA_LOC) // β
+                let gamma := mload(C_GAMMA_LOC) // γ
+                let work_root := mload(OMEGA_LOC) // ω
+                let numerator_value := 1
+                let denominator_value := 1
+
+                let p_clone := p // move p to the front of the stack
+                let valid_inputs := true
+
+                // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24])
+                let public_inputs_ptr := add(calldataload(0x24), 0x24)
+
+                // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes
+                let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20))
+
+                // root_1 = β * 0x05
+                let root_1 := mulmod(beta, 0x05, p_clone) // k1.β
+                // root_2 = β * 0x0c
+                let root_2 := mulmod(beta, 0x0c, p_clone)
+                // @note 0x05 + 0x07 == 0x0c == external coset generator
+
+                for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } {
+                    /**
+                     * input = public_input[i]
+                     * valid_inputs &= input < p
+                     * temp = input + gamma
+                     * numerator_value *= (β.σ(i) + wᵢ + γ)  // σ(i) = 0x05.ωⁱ
+                     * denominator_value *= (β.σ'(i) + wᵢ + γ) // σ'(i) = 0x0c.ωⁱ
+                     * root_1 *= ω
+                     * root_2 *= ω
+                     */
+
+                    let input := calldataload(public_inputs_ptr)
+                    valid_inputs := and(valid_inputs, lt(input, p_clone))
+                    let temp := addmod(input, gamma, p_clone)
+
+                    numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone)
+                    denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone)
+
+                    root_1 := mulmod(root_1, work_root, p_clone)
+                    root_2 := mulmod(root_2, work_root, p_clone)
+                }
+
+                // Revert if not all public inputs are field elements (i.e. < p)
+                if iszero(valid_inputs) {
+                    mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+
+                mstore(DELTA_NUMERATOR_LOC, numerator_value)
+                mstore(DELTA_DENOMINATOR_LOC, denominator_value)
+            }
+
+            /**
+             * Compute Plookup delta factor [γ(1 + β)]^{n-k}
+             * k = num roots cut out of Z_H = 4
+             */
+            {
+                let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)
+                let delta_numerator := delta_base
+                {
+                    let exponent := mload(N_LOC)
+                    let count := 1
+                    for {} lt(count, exponent) { count := add(count, count) } {
+                        delta_numerator := mulmod(delta_numerator, delta_numerator, p)
+                    }
+                }
+                mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator)
+
+                let delta_denominator := mulmod(delta_base, delta_base, p)
+                delta_denominator := mulmod(delta_denominator, delta_denominator, p)
+                mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator)
+            }
+            /**
+             * Compute lagrange poly and vanishing poly fractions
+             */
+            {
+                /**
+                 * vanishing_numerator = zeta
+                 * ZETA_POW_N = zeta^n
+                 * vanishing_numerator -= 1
+                 * accumulating_root = omega_inverse
+                 * work_root = p - accumulating_root
+                 * domain_inverse = domain_inverse
+                 * vanishing_denominator = zeta + work_root
+                 * work_root *= accumulating_root
+                 * vanishing_denominator *= (zeta + work_root)
+                 * work_root *= accumulating_root
+                 * vanishing_denominator *= (zeta + work_root)
+                 * vanishing_denominator *= (zeta + (zeta + accumulating_root))
+                 * work_root = omega
+                 * lagrange_numerator = vanishing_numerator * domain_inverse
+                 * l_start_denominator = zeta - 1
+                 * accumulating_root = work_root^2
+                 * l_end_denominator = accumulating_root^2 * work_root * zeta - 1
+                 * Note: l_end_denominator term contains a term \omega^5 to cut out 5 roots of unity from vanishing poly
+                 */
+
+                let zeta := mload(C_ZETA_LOC)
+
+                // compute zeta^n, where n is a power of 2
+                let vanishing_numerator := zeta
+                {
+                    // pow_small
+                    let exponent := mload(N_LOC)
+                    let count := 1
+                    for {} lt(count, exponent) { count := add(count, count) } {
+                        vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p)
+                    }
+                }
+                mstore(ZETA_POW_N_LOC, vanishing_numerator)
+                vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p)
+
+                let accumulating_root := mload(OMEGA_INVERSE_LOC)
+                let work_root := sub(p, accumulating_root)
+                let domain_inverse := mload(DOMAIN_INVERSE_LOC)
+
+                let vanishing_denominator := addmod(zeta, work_root, p)
+                work_root := mulmod(work_root, accumulating_root, p)
+                vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)
+                work_root := mulmod(work_root, accumulating_root, p)
+                vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p)
+                vanishing_denominator :=
+                    mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p)
+
+                work_root := mload(OMEGA_LOC)
+
+                let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p)
+                let l_start_denominator := addmod(zeta, sub(p, 1), p)
+
+                accumulating_root := mulmod(work_root, work_root, p)
+
+                let l_end_denominator :=
+                    addmod(
+                        mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p
+                    )
+
+                /**
+                 * Compute inversions using Montgomery's batch inversion trick
+                 */
+                let accumulator := mload(DELTA_DENOMINATOR_LOC)
+                let t0 := accumulator
+                accumulator := mulmod(accumulator, vanishing_denominator, p)
+                let t1 := accumulator
+                accumulator := mulmod(accumulator, vanishing_numerator, p)
+                let t2 := accumulator
+                accumulator := mulmod(accumulator, l_start_denominator, p)
+                let t3 := accumulator
+                accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)
+                let t4 := accumulator
+                {
+                    mstore(0, 0x20)
+                    mstore(0x20, 0x20)
+                    mstore(0x40, 0x20)
+                    mstore(0x60, mulmod(accumulator, l_end_denominator, p))
+                    mstore(0x80, sub(p, 2))
+                    mstore(0xa0, p)
+                    if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) {
+                        mstore(0x0, MOD_EXP_FAILURE_SELECTOR)
+                        revert(0x00, 0x04)
+                    }
+                    accumulator := mload(0x00)
+                }
+
+                t4 := mulmod(accumulator, t4, p)
+                accumulator := mulmod(accumulator, l_end_denominator, p)
+
+                t3 := mulmod(accumulator, t3, p)
+                accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p)
+
+                t2 := mulmod(accumulator, t2, p)
+                accumulator := mulmod(accumulator, l_start_denominator, p)
+
+                t1 := mulmod(accumulator, t1, p)
+                accumulator := mulmod(accumulator, vanishing_numerator, p)
+
+                t0 := mulmod(accumulator, t0, p)
+                accumulator := mulmod(accumulator, vanishing_denominator, p)
+
+                accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p)
+
+                mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p))
+                mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p))
+                mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p))
+                mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p))
+                mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p))
+                mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p))
+            }
+
+            /**
+             * UltraPlonk Widget Ordering:
+             *
+             * 1. Permutation widget
+             * 2. Plookup widget
+             * 3. Arithmetic widget
+             * 4. Fixed base widget (?)
+             * 5. GenPermSort widget
+             * 6. Elliptic widget
+             * 7. Auxiliary widget
+             */
+
+            /**
+             * COMPUTE PERMUTATION WIDGET EVALUATION
+             */
+            {
+                let alpha := mload(C_ALPHA_LOC)
+                let beta := mload(C_BETA_LOC)
+                let gamma := mload(C_GAMMA_LOC)
+
+                /**
+                 * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2)
+                 * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4)
+                 * result = alpha_base * z_eval * t1 * t2
+                 * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval)
+                 * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval)
+                 * result -= (alpha_base * z_omega_eval * t1 * t2)
+                 */
+                let t1 :=
+                    mulmod(
+                        add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)),
+                        add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)),
+                        p
+                    )
+                let t2 :=
+                    mulmod(
+                        add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)),
+                        add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)),
+                        p
+                    )
+                let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p)
+                t1 :=
+                    mulmod(
+                        add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)),
+                        add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)),
+                        p
+                    )
+                t2 :=
+                    mulmod(
+                        add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)),
+                        add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)),
+                        p
+                    )
+                result :=
+                    addmod(
+                        result,
+                        sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)),
+                        p
+                    )
+
+                /**
+                 * alpha_base *= alpha
+                 * result += alpha_base . (L_{n-k}(ʓ) . (z(ʓ.ω) - ∆_{PI}))
+                 * alpha_base *= alpha
+                 * result += alpha_base . (L_1(Ê“)(Z(Ê“) - 1))
+                 * alpha_Base *= alpha
+                 */
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))
+                result :=
+                    addmod(
+                        result,
+                        mulmod(
+                            mload(C_ALPHA_BASE_LOC),
+                            mulmod(
+                                mload(L_END_LOC),
+                                addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p),
+                                p
+                            ),
+                            p
+                        ),
+                        p
+                    )
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))
+                mstore(
+                    PERMUTATION_IDENTITY,
+                    addmod(
+                        result,
+                        mulmod(
+                            mload(C_ALPHA_BASE_LOC),
+                            mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p),
+                            p
+                        ),
+                        p
+                    )
+                )
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p))
+            }
+
+            /**
+             * COMPUTE PLOOKUP WIDGET EVALUATION
+             */
+            {
+                /**
+                 * Goal: f = (w1(z) + q2.w1(zω)) + η(w2(z) + qm.w2(zω)) + η²(w3(z) + qc.w_3(zω)) + q3(z).η³
+                 * f = η.q3(z)
+                 * f += (w3(z) + qc.w_3(zω))
+                 * f *= η
+                 * f += (w2(z) + qm.w2(zω))
+                 * f *= η
+                 * f += (w1(z) + q2.w1(zω))
+                 */
+                let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p)
+                f :=
+                    addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p)
+                f := mulmod(f, mload(C_ETA_LOC), p)
+                f :=
+                    addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p)
+                f := mulmod(f, mload(C_ETA_LOC), p)
+                f :=
+                    addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p)
+
+                // t(z) = table4(z).η³ + table3(z).η² + table2(z).η + table1(z)
+                let t :=
+                    addmod(
+                        addmod(
+                            addmod(
+                                mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),
+                                mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p),
+                                p
+                            ),
+                            mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p),
+                            p
+                        ),
+                        mload(TABLE1_EVAL_LOC),
+                        p
+                    )
+
+                // t(zw) = table4(zw).η³ + table3(zw).η² + table2(zw).η + table1(zw)
+                let t_omega :=
+                    addmod(
+                        addmod(
+                            addmod(
+                                mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p),
+                                mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p),
+                                p
+                            ),
+                            mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p),
+                            p
+                        ),
+                        mload(TABLE1_OMEGA_EVAL_LOC),
+                        p
+                    )
+
+                /**
+                 * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + γ) * (t(z) + βt(zω) + γ(β + 1)) * (β + 1)
+                 * gamma_beta_constant = γ(β + 1)
+                 * numerator = f * TABLE_TYPE_EVAL + gamma
+                 * temp0 = t(z) + t(zω) * β + gamma_beta_constant
+                 * numerator *= temp0
+                 * numerator *= (β + 1)
+                 * temp0 = alpha * l_1
+                 * numerator += temp0
+                 * numerator *= z_lookup(z)
+                 * numerator -= temp0
+                 */
+                let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p)
+                let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p)
+                let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p)
+                numerator := mulmod(numerator, temp0, p)
+                numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p)
+                temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p)
+                numerator := addmod(numerator, temp0, p)
+                numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p)
+                numerator := addmod(numerator, sub(p, temp0), p)
+
+                /**
+                 * Goal: denominator = z_lookup(zω)*[s(z) + βs(zω) + γ(1 + β)] - [z_lookup(zω) - [γ(1 + β)]^{n-k}]*α²L_end(z)
+                 * note: delta_factor = [γ(1 + β)]^{n-k}
+                 * denominator = s(z) + βs(zω) + γ(β + 1)
+                 * temp1 = α²L_end(z)
+                 * denominator -= temp1
+                 * denominator *= z_lookup(zω)
+                 * denominator += temp1 * delta_factor
+                 * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base
+                 * alpha_base *= alpha^3
+                 */
+                let denominator :=
+                    addmod(
+                        addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p),
+                        gamma_beta_constant,
+                        p
+                    )
+                let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p)
+                denominator := addmod(denominator, sub(p, temp1), p)
+                denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p)
+                denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p)
+
+                mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p))
+
+                // update alpha
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))
+            }
+
+            /**
+             * COMPUTE ARITHMETIC WIDGET EVALUATION
+             */
+            {
+                /**
+                 * The basic arithmetic gate identity in standard plonk is as follows.
+                 * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0
+                 * However, for Ultraplonk, we extend this to support "passing" wires between rows (shown without alpha scaling below):
+                 * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) +
+                 * (q_arith - 1)*( α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0
+                 *
+                 * This formula results in several cases depending on q_arith:
+                 * 1. q_arith == 0: Arithmetic gate is completely disabled
+                 *
+                 * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation
+                 * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0
+                 *
+                 * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is:
+                 * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0
+                 * It allows defining w_4 at next index (w_4_omega) in terms of current wire values
+                 *
+                 * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. α allows us to split
+                 * the equation into two:
+                 *
+                 * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0
+                 * and
+                 * w_1 + w_4 - w_1_omega + q_m = 0  (we are reusing q_m here)
+                 *
+                 * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1).
+                 * The equation can be split into two:
+                 *
+                 * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0
+                 * and
+                 * w_1 + w_4 - w_1_omega + q_m = 0
+                 *
+                 * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at
+                 * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at
+                 * product.
+                 */
+
+                let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p)
+                let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p)
+                let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p)
+                let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p)
+
+                // @todo - Add a explicit test that hits QARITH == 3
+                // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2
+                let w1w2qm :=
+                    mulmod(
+                        mulmod(
+                            mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p),
+                            addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p),
+                            p
+                        ),
+                        NEGATIVE_INVERSE_OF_2_MODULO_P,
+                        p
+                    )
+
+                // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c
+                let identity :=
+                    addmod(
+                        mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p
+                    )
+
+                // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where:
+                // w_1 + w_4 - w_1_omega + q_m = 0
+                // we use this gate to save an addition gate when adding or subtracting non-native field elements
+                // α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m)
+                let extra_small_addition_gate_identity :=
+                    mulmod(
+                        mload(C_ALPHA_LOC),
+                        mulmod(
+                            addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p),
+                            addmod(
+                                mload(QM_EVAL_LOC),
+                                addmod(
+                                    sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p
+                                ),
+                                p
+                            ),
+                            p
+                        ),
+                        p
+                    )
+
+                // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity
+                // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires!
+                // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity))
+                mstore(
+                    ARITHMETIC_IDENTITY,
+                    mulmod(
+                        mload(C_ALPHA_BASE_LOC),
+                        mulmod(
+                            mload(QARITH_EVAL_LOC),
+                            addmod(
+                                identity,
+                                mulmod(
+                                    addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p),
+                                    addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p),
+                                    p
+                                ),
+                                p
+                            ),
+                            p
+                        ),
+                        p
+                    )
+                )
+
+                // update alpha
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p))
+            }
+
+            /**
+             * COMPUTE GENPERMSORT WIDGET EVALUATION
+             */
+            {
+                /**
+                 * D1 = (w2 - w1)
+                 * D2 = (w3 - w2)
+                 * D3 = (w4 - w3)
+                 * D4 = (w1_omega - w4)
+                 *
+                 * α_a = alpha_base
+                 * α_b = alpha_base * α
+                 * α_c = alpha_base * α^2
+                 * α_d = alpha_base * α^3
+                 *
+                 * range_accumulator = (
+                 *   D1(D1 - 1)(D1 - 2)(D1 - 3).α_a +
+                 *   D2(D2 - 1)(D2 - 2)(D2 - 3).α_b +
+                 *   D3(D3 - 1)(D3 - 2)(D3 - 3).α_c +
+                 *   D4(D4 - 1)(D4 - 2)(D4 - 3).α_d +
+                 * ) . q_sort
+                 */
+                let minus_two := sub(p, 2)
+                let minus_three := sub(p, 3)
+                let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)
+                let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)
+                let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)
+                let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)
+
+                let range_accumulator :=
+                    mulmod(
+                        mulmod(
+                            mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p),
+                            addmod(d1, minus_three, p),
+                            p
+                        ),
+                        mload(C_ALPHA_BASE_LOC),
+                        p
+                    )
+                range_accumulator :=
+                    addmod(
+                        range_accumulator,
+                        mulmod(
+                            mulmod(
+                                mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p),
+                                addmod(d2, minus_three, p),
+                                p
+                            ),
+                            mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                range_accumulator :=
+                    addmod(
+                        range_accumulator,
+                        mulmod(
+                            mulmod(
+                                mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p),
+                                addmod(d3, minus_three, p),
+                                p
+                            ),
+                            mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                range_accumulator :=
+                    addmod(
+                        range_accumulator,
+                        mulmod(
+                            mulmod(
+                                mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p),
+                                addmod(d4, minus_three, p),
+                                p
+                            ),
+                            mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p)
+
+                mstore(SORT_IDENTITY, range_accumulator)
+
+                // update alpha
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))
+            }
+
+            /**
+             * COMPUTE ELLIPTIC WIDGET EVALUATION
+             */
+            {
+                /**
+                 * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta
+                 * endo_sqr_term = x_2^2
+                 * endo_sqr_term *= (x_3 - x_1)
+                 * endo_sqr_term *= q_beta^2
+                 * leftovers = x_2^2
+                 * leftovers *= x_2
+                 * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget
+                 * leftovers -= (y_2^2 + y_1^2)
+                 * sign_term = y_2 * y_1
+                 * sign_term += sign_term
+                 * sign_term *= q_sign
+                 */
+                // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0
+                let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p)
+                let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p)
+                let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)
+                let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p)
+
+                let x_add_identity :=
+                    addmod(
+                        mulmod(
+                            addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p),
+                            mulmod(x_diff, x_diff, p),
+                            p
+                        ),
+                        addmod(
+                            sub(
+                                p,
+                                addmod(y2_sqr, y1_sqr, p)
+                            ),
+                            addmod(y1y2, y1y2, p),
+                            p
+                        ),
+                        p
+                    )
+                x_add_identity :=
+                    mulmod(
+                        mulmod(
+                            x_add_identity,
+                            addmod(
+                                1,
+                                sub(p, mload(QM_EVAL_LOC)),
+                                p
+                            ),
+                            p
+                        ),
+                        mload(C_ALPHA_BASE_LOC),
+                        p
+                    )
+
+                // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0
+                let y1_plus_y3 := addmod(
+                    mload(Y1_EVAL_LOC),
+                    mload(Y3_EVAL_LOC),
+                    p
+                )
+                let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p)
+                let y_add_identity :=
+                    addmod(
+                        mulmod(y1_plus_y3, x_diff, p),
+                        mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p),
+                        p
+                    )
+                y_add_identity :=
+                    mulmod(
+                        mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p),
+                        mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p),
+                        p
+                    )
+
+                // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL
+                mstore(
+                    ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p)
+                )
+            }
+            {
+                /**
+                 * x_pow_4 = (y_1_sqr - curve_b) * x_1;
+                 * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr;
+                 * y_1_sqr_mul_4 += y_1_sqr_mul_4;
+                 * x_1_pow_4_mul_9 = x_pow_4;
+                 * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;
+                 * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;
+                 * x_1_pow_4_mul_9 += x_1_pow_4_mul_9;
+                 * x_1_pow_4_mul_9 += x_pow_4;
+                 * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr;
+                 * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9;
+                 * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3);
+                 */
+                // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0
+                let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p)
+                let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p)
+                let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p)
+                let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p)
+                let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p)
+                let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p)
+                let x_double_identity :=
+                    addmod(
+                        mulmod(
+                            addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p),
+                            y1_sqr_mul_4,
+                            p
+                        ),
+                        sub(p, x1_pow_4_mul_9),
+                        p
+                    )
+                // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0
+                let y_double_identity :=
+                    addmod(
+                        mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p),
+                        sub(
+                            p,
+                            mulmod(
+                                addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p),
+                                addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p),
+                                p
+                            )
+                        ),
+                        p
+                    )
+                x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p)
+                y_double_identity :=
+                    mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p)
+                x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p)
+                y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p)
+                // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL
+                mstore(
+                    ELLIPTIC_IDENTITY,
+                    addmod(
+                        mload(ELLIPTIC_IDENTITY),
+                        mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p),
+                        p
+                    )
+                )
+
+                // update alpha
+                mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p))
+            }
+
+            /**
+             * COMPUTE AUXILIARY WIDGET EVALUATION
+             */
+            {
+                {
+                    /**
+                     * Non native field arithmetic gate 2
+                     *             _                                                                               _
+                     *            /   _                   _                               _       14                \
+                     * q_2 . q_4 |   (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2    - w_3 - w_4   |
+                     *            \_                                                                               _/
+                     *
+                     * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2
+                     * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega
+                     * non_native_field_gate_2 = non_native_field_gate_2 * limb_size
+                     * non_native_field_gate_2 -= w_4_omega
+                     * non_native_field_gate_2 += limb_subproduct
+                     * non_native_field_gate_2 *= q_4
+                     * limb_subproduct *= limb_size
+                     * limb_subproduct += w_1_omega * w_2_omega
+                     * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3
+                     * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m
+                     * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2
+                     */
+
+                    let limb_subproduct :=
+                        addmod(
+                            mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p),
+                            mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p),
+                            p
+                        )
+
+                    let non_native_field_gate_2 :=
+                        addmod(
+                            addmod(
+                                mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p),
+                                mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p),
+                                p
+                            ),
+                            sub(p, mload(W3_OMEGA_EVAL_LOC)),
+                            p
+                        )
+                    non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p)
+                    non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)
+                    non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p)
+                    non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p)
+                    limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p)
+                    limb_subproduct :=
+                        addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p)
+                    let non_native_field_gate_1 :=
+                        mulmod(
+                            addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p),
+                            mload(Q3_EVAL_LOC),
+                            p
+                        )
+                    let non_native_field_gate_3 :=
+                        mulmod(
+                            addmod(
+                                addmod(limb_subproduct, mload(W4_EVAL_LOC), p),
+                                sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)),
+                                p
+                            ),
+                            mload(QM_EVAL_LOC),
+                            p
+                        )
+                    let non_native_field_identity :=
+                        mulmod(
+                            addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p),
+                            mload(Q2_EVAL_LOC),
+                            p
+                        )
+
+                    mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity)
+                }
+
+                {
+                    /**
+                     * limb_accumulator_1 = w_2_omega;
+                     * limb_accumulator_1 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_1 += w_1_omega;
+                     * limb_accumulator_1 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_1 += w_3;
+                     * limb_accumulator_1 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_1 += w_2;
+                     * limb_accumulator_1 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_1 += w_1;
+                     * limb_accumulator_1 -= w_4;
+                     * limb_accumulator_1 *= q_4;
+                     */
+                    let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)
+                    limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p)
+                    limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)
+                    limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p)
+                    limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)
+                    limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p)
+                    limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p)
+                    limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p)
+                    limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p)
+                    limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p)
+
+                    /**
+                     * limb_accumulator_2 = w_3_omega;
+                     * limb_accumulator_2 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_2 += w_2_omega;
+                     * limb_accumulator_2 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_2 += w_1_omega;
+                     * limb_accumulator_2 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_2 += w_4;
+                     * limb_accumulator_2 *= SUBLIMB_SHIFT;
+                     * limb_accumulator_2 += w_3;
+                     * limb_accumulator_2 -= w_4_omega;
+                     * limb_accumulator_2 *= q_m;
+                     */
+                    let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p)
+                    limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p)
+                    limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)
+                    limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p)
+                    limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)
+                    limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p)
+                    limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p)
+                    limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p)
+                    limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p)
+                    limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p)
+
+                    mstore(
+                        AUX_LIMB_ACCUMULATOR_EVALUATION,
+                        mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p)
+                    )
+                }
+
+                {
+                    /**
+                     * memory_record_check = w_3;
+                     * memory_record_check *= eta;
+                     * memory_record_check += w_2;
+                     * memory_record_check *= eta;
+                     * memory_record_check += w_1;
+                     * memory_record_check *= eta;
+                     * memory_record_check += q_c;
+                     *
+                     * partial_record_check = memory_record_check;
+                     *
+                     * memory_record_check -= w_4;
+                     */
+
+                    let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p)
+                    memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p)
+                    memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)
+                    memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p)
+                    memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p)
+                    memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p)
+
+                    let partial_record_check := memory_record_check
+                    memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p)
+
+                    mstore(AUX_MEMORY_EVALUATION, memory_record_check)
+
+                    // index_delta = w_1_omega - w_1
+                    let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p)
+                    // record_delta = w_4_omega - w_4
+                    let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p)
+                    // index_is_monotonically_increasing = index_delta * (index_delta - 1)
+                    let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p)
+
+                    // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta)
+                    let adjacent_values_match_if_adjacent_indices_match :=
+                        mulmod(record_delta, addmod(1, sub(p, index_delta), p), p)
+
+                    // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check
+                    mstore(
+                        AUX_ROM_CONSISTENCY_EVALUATION,
+                        addmod(
+                            mulmod(
+                                addmod(
+                                    mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p),
+                                    index_is_monotonically_increasing,
+                                    p
+                                ),
+                                mload(C_ALPHA_LOC),
+                                p
+                            ),
+                            memory_record_check,
+                            p
+                        )
+                    )
+
+                    {
+                        /**
+                         * next_gate_access_type = w_3_omega;
+                         * next_gate_access_type *= eta;
+                         * next_gate_access_type += w_2_omega;
+                         * next_gate_access_type *= eta;
+                         * next_gate_access_type += w_1_omega;
+                         * next_gate_access_type *= eta;
+                         * next_gate_access_type = w_4_omega - next_gate_access_type;
+                         */
+                        let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p)
+                        next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p)
+                        next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)
+                        next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p)
+                        next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p)
+                        next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p)
+
+                        // value_delta = w_3_omega - w_3
+                        let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p)
+                        //  adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type);
+
+                        let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation :=
+                            mulmod(
+                                addmod(1, sub(p, index_delta), p),
+                                mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p),
+                                p
+                            )
+
+                        // AUX_RAM_CONSISTENCY_EVALUATION
+
+                        /**
+                         * access_type = w_4 - partial_record_check
+                         * access_check = access_type^2 - access_type
+                         * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type
+                         * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation;
+                         * RAM_consistency_check_identity *= alpha;
+                         * RAM_consistency_check_identity += index_is_monotonically_increasing;
+                         * RAM_consistency_check_identity *= alpha;
+                         * RAM_consistency_check_identity += next_gate_access_type_is_boolean;
+                         * RAM_consistency_check_identity *= alpha;
+                         * RAM_consistency_check_identity += access_check;
+                         */
+
+                        let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p)
+                        let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p)
+                        let next_gate_access_type_is_boolean :=
+                            mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p)
+                        let RAM_cci :=
+                            mulmod(
+                                adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation,
+                                mload(C_ALPHA_LOC),
+                                p
+                            )
+                        RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p)
+                        RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)
+                        RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p)
+                        RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p)
+                        RAM_cci := addmod(RAM_cci, access_check, p)
+
+                        mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci)
+                    }
+
+                    {
+                        // timestamp_delta = w_2_omega - w_2
+                        let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p)
+
+                        // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3
+                        let RAM_timestamp_check_identity :=
+                            addmod(
+                                mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p
+                            )
+
+                        /**
+                         * memory_identity = ROM_consistency_check_identity * q_2;
+                         * memory_identity += RAM_timestamp_check_identity * q_4;
+                         * memory_identity += memory_record_check * q_m;
+                         * memory_identity *= q_1;
+                         * memory_identity += (RAM_consistency_check_identity * q_arith);
+                         *
+                         * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity;
+                         * auxiliary_identity *= q_aux;
+                         * auxiliary_identity *= alpha_base;
+                         */
+                        let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p)
+                        memory_identity :=
+                            addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p)
+                        memory_identity :=
+                            addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p)
+                        memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p)
+                        memory_identity :=
+                            addmod(
+                                memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p
+                            )
+
+                        let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p)
+                        auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p)
+                        auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p)
+                        auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p)
+
+                        mstore(AUX_IDENTITY, auxiliary_identity)
+
+                        // update alpha
+                        mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p))
+                    }
+                }
+            }
+
+            {
+                /**
+                 * quotient = ARITHMETIC_IDENTITY
+                 * quotient += PERMUTATION_IDENTITY
+                 * quotient += PLOOKUP_IDENTITY
+                 * quotient += SORT_IDENTITY
+                 * quotient += ELLIPTIC_IDENTITY
+                 * quotient += AUX_IDENTITY
+                 * quotient *= ZERO_POLY_INVERSE
+                 */
+                mstore(
+                    QUOTIENT_EVAL_LOC,
+                    mulmod(
+                        addmod(
+                            addmod(
+                                addmod(
+                                    addmod(
+                                        addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p),
+                                        mload(ARITHMETIC_IDENTITY),
+                                        p
+                                    ),
+                                    mload(SORT_IDENTITY),
+                                    p
+                                ),
+                                mload(ELLIPTIC_IDENTITY),
+                                p
+                            ),
+                            mload(AUX_IDENTITY),
+                            p
+                        ),
+                        mload(ZERO_POLY_INVERSE_LOC),
+                        p
+                    )
+                )
+            }
+
+            /**
+             * GENERATE NU AND SEPARATOR CHALLENGES
+             */
+            {
+                let current_challenge := mload(C_CURRENT_LOC)
+                // get a calldata pointer that points to the start of the data we want to copy
+                let calldata_ptr := add(calldataload(0x04), 0x24)
+
+                calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH)
+
+                mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge)
+                mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC))
+                calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH)
+
+                // hash length = (0x20 + num field elements), we include the previous challenge in the hash
+                let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40))
+
+                mstore(C_V0_LOC, mod(challenge, p))
+                // We need THIRTY-ONE independent nu challenges!
+                mstore(0x00, challenge)
+                mstore8(0x20, 0x01)
+                mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x02)
+                mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x03)
+                mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x04)
+                mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x05)
+                mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x06)
+                mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x07)
+                mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x08)
+                mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x09)
+                mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0a)
+                mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0b)
+                mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0c)
+                mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0d)
+                mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0e)
+                mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x0f)
+                mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x10)
+                mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x11)
+                mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x12)
+                mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x13)
+                mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x14)
+                mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x15)
+                mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x16)
+                mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x17)
+                mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x18)
+                mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x19)
+                mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x1a)
+                mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x1b)
+                mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x1c)
+                mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p))
+                mstore8(0x20, 0x1d)
+                mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p))
+
+                // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change?
+                mstore8(0x20, 0x1d)
+                challenge := keccak256(0x00, 0x21)
+                mstore(C_V30_LOC, mod(challenge, p))
+
+                // separator
+                mstore(0x00, challenge)
+                mstore(0x20, mload(PI_Z_Y_LOC))
+                mstore(0x40, mload(PI_Z_X_LOC))
+                mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))
+                mstore(0x80, mload(PI_Z_OMEGA_X_LOC))
+
+                mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p))
+            }
+
+            let success := 0
+            // VALIDATE T1
+            {
+                let x := mload(T1_X_LOC)
+                let y := mload(T1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(ACCUMULATOR_X_LOC, x)
+                mstore(add(ACCUMULATOR_X_LOC, 0x20), y)
+            }
+            // VALIDATE T2
+            {
+                let x := mload(T2_X_LOC) // 0x1400
+                let y := mload(T2_Y_LOC) // 0x1420
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mload(ZETA_POW_N_LOC))
+            // accumulator_2 = [T2].zeta^n
+            success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)
+            // accumulator = [T1] + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE T3
+            {
+                let x := mload(T3_X_LOC)
+                let y := mload(T3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p))
+            // accumulator_2 = [T3].zeta^{2n}
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE T4
+            {
+                let x := mload(T4_X_LOC)
+                let y := mload(T4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p))
+            // accumulator_2 = [T4].zeta^{3n}
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE W1
+            {
+                let x := mload(W1_X_LOC)
+                let y := mload(W1_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p))
+            // accumulator_2 = v0.(u + 1).[W1]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE W2
+            {
+                let x := mload(W2_X_LOC)
+                let y := mload(W2_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p))
+            // accumulator_2 = v1.(u + 1).[W2]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE W3
+            {
+                let x := mload(W3_X_LOC)
+                let y := mload(W3_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p))
+            // accumulator_2 = v2.(u + 1).[W3]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE W4
+            {
+                let x := mload(W4_X_LOC)
+                let y := mload(W4_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p))
+            // accumulator_2 = v3.(u + 1).[W4]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE S
+            {
+                let x := mload(S_X_LOC)
+                let y := mload(S_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p))
+            // accumulator_2 = v4.(u + 1).[S]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE Z
+            {
+                let x := mload(Z_X_LOC)
+                let y := mload(Z_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p))
+            // accumulator_2 = v5.(u + 1).[Z]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // VALIDATE Z_LOOKUP
+            {
+                let x := mload(Z_LOOKUP_X_LOC)
+                let y := mload(Z_LOOKUP_Y_LOC)
+                let xx := mulmod(x, x, q)
+                // validate on curve
+                if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                    mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+                mstore(0x00, x)
+                mstore(0x20, y)
+            }
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p))
+            // accumulator_2 = v6.(u + 1).[Z_LOOKUP]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE Q1
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(Q1_X_LOC))
+            mstore(0x20, mload(Q1_Y_LOC))
+            mstore(0x40, mload(C_V7_LOC))
+            // accumulator_2 = v7.[Q1]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE Q2
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(Q2_X_LOC))
+            mstore(0x20, mload(Q2_Y_LOC))
+            mstore(0x40, mload(C_V8_LOC))
+            // accumulator_2 = v8.[Q2]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE Q3
+            
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(Q3_X_LOC))
+            mstore(0x20, mload(Q3_Y_LOC))
+            mstore(0x40, mload(C_V9_LOC))
+            // accumulator_2 = v9.[Q3]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE Q4
+            
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(Q4_X_LOC))
+            mstore(0x20, mload(Q4_Y_LOC))
+            mstore(0x40, mload(C_V10_LOC))
+            // accumulator_2 = v10.[Q4]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QM
+            
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QM_X_LOC))
+            mstore(0x20, mload(QM_Y_LOC))
+            mstore(0x40, mload(C_V11_LOC))
+            // accumulator_2 = v11.[Q;]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QC
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QC_X_LOC))
+            mstore(0x20, mload(QC_Y_LOC))
+            mstore(0x40, mload(C_V12_LOC))
+            // accumulator_2 = v12.[QC]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QARITH
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QARITH_X_LOC))
+            mstore(0x20, mload(QARITH_Y_LOC))
+            mstore(0x40, mload(C_V13_LOC))
+            // accumulator_2 = v13.[QARITH]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QSORT
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QSORT_X_LOC))
+            mstore(0x20, mload(QSORT_Y_LOC))
+            mstore(0x40, mload(C_V14_LOC))
+            // accumulator_2 = v14.[QSORT]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QELLIPTIC
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QELLIPTIC_X_LOC))
+            mstore(0x20, mload(QELLIPTIC_Y_LOC))
+            mstore(0x40, mload(C_V15_LOC))
+            // accumulator_2 = v15.[QELLIPTIC]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE QAUX
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(QAUX_X_LOC))
+            mstore(0x20, mload(QAUX_Y_LOC))
+            mstore(0x40, mload(C_V16_LOC))
+            // accumulator_2 = v15.[Q_AUX]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE SIGMA1
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(SIGMA1_X_LOC))
+            mstore(0x20, mload(SIGMA1_Y_LOC))
+            mstore(0x40, mload(C_V17_LOC))
+            // accumulator_2 = v17.[sigma1]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE SIGMA2
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(SIGMA2_X_LOC))
+            mstore(0x20, mload(SIGMA2_Y_LOC))
+            mstore(0x40, mload(C_V18_LOC))
+            // accumulator_2 = v18.[sigma2]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE SIGMA3
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(SIGMA3_X_LOC))
+            mstore(0x20, mload(SIGMA3_Y_LOC))
+            mstore(0x40, mload(C_V19_LOC))
+            // accumulator_2 = v19.[sigma3]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE SIGMA4
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(SIGMA4_X_LOC))
+            mstore(0x20, mload(SIGMA4_Y_LOC))
+            mstore(0x40, mload(C_V20_LOC))
+            // accumulator_2 = v20.[sigma4]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE TABLE1
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(TABLE1_X_LOC))
+            mstore(0x20, mload(TABLE1_Y_LOC))
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p))
+            // accumulator_2 = u.[table1]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE TABLE2
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(TABLE2_X_LOC))
+            mstore(0x20, mload(TABLE2_Y_LOC))
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p))
+            // accumulator_2 = u.[table2]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE TABLE3
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(TABLE3_X_LOC))
+            mstore(0x20, mload(TABLE3_Y_LOC))
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p))
+            // accumulator_2 = u.[table3]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE TABLE4
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(TABLE4_X_LOC))
+            mstore(0x20, mload(TABLE4_Y_LOC))
+            mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p))
+            // accumulator_2 = u.[table4]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE TABLE_TYPE
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(TABLE_TYPE_X_LOC))
+            mstore(0x20, mload(TABLE_TYPE_Y_LOC))
+            mstore(0x40, mload(C_V25_LOC))
+            // accumulator_2 = v25.[TableType]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE ID1
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(ID1_X_LOC))
+            mstore(0x20, mload(ID1_Y_LOC))
+            mstore(0x40, mload(C_V26_LOC))
+            // accumulator_2 = v26.[ID1]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE ID2
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(ID2_X_LOC))
+            mstore(0x20, mload(ID2_Y_LOC))
+            mstore(0x40, mload(C_V27_LOC))
+            // accumulator_2 = v27.[ID2]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE ID3
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(ID3_X_LOC))
+            mstore(0x20, mload(ID3_Y_LOC))
+            mstore(0x40, mload(C_V28_LOC))
+            // accumulator_2 = v28.[ID3]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            // ACCUMULATE ID4
+
+            // Verification key fields verified to be on curve at contract deployment
+            mstore(0x00, mload(ID4_X_LOC))
+            mstore(0x20, mload(ID4_Y_LOC))
+            mstore(0x40, mload(C_V29_LOC))
+            // accumulator_2 = v29.[ID4]
+            success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+            // accumulator = accumulator + accumulator_2
+            success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+            /**
+             * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER
+             */
+            {
+                /**
+                 * batch_evaluation = v0 * (w_1_omega * u + w_1_eval)
+                 * batch_evaluation += v1 * (w_2_omega * u + w_2_eval)
+                 * batch_evaluation += v2 * (w_3_omega * u + w_3_eval)
+                 * batch_evaluation += v3 * (w_4_omega * u + w_4_eval)
+                 * batch_evaluation += v4 * (s_omega_eval * u + s_eval)
+                 * batch_evaluation += v5 * (z_omega_eval * u + z_eval)
+                 * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval)
+                 */
+                let batch_evaluation :=
+                    mulmod(
+                        mload(C_V0_LOC),
+                        addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V1_LOC),
+                            addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V2_LOC),
+                            addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V3_LOC),
+                            addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V4_LOC),
+                            addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V5_LOC),
+                            addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V6_LOC),
+                            addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+
+                /**
+                 * batch_evaluation += v7 * Q1_EVAL
+                 * batch_evaluation += v8 * Q2_EVAL
+                 * batch_evaluation += v9 * Q3_EVAL
+                 * batch_evaluation += v10 * Q4_EVAL
+                 * batch_evaluation += v11 * QM_EVAL
+                 * batch_evaluation += v12 * QC_EVAL
+                 * batch_evaluation += v13 * QARITH_EVAL
+                 * batch_evaluation += v14 * QSORT_EVAL_LOC
+                 * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC
+                 * batch_evaluation += v16 * QAUX_EVAL_LOC
+                 * batch_evaluation += v17 * SIGMA1_EVAL_LOC
+                 * batch_evaluation += v18 * SIGMA2_EVAL_LOC
+                 * batch_evaluation += v19 * SIGMA3_EVAL_LOC
+                 * batch_evaluation += v20 * SIGMA4_EVAL_LOC
+                 */
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p)
+
+                /**
+                 * batch_evaluation += v21 * (table1(zw) * u + table1(z))
+                 * batch_evaluation += v22 * (table2(zw) * u + table2(z))
+                 * batch_evaluation += v23 * (table3(zw) * u + table3(z))
+                 * batch_evaluation += v24 * (table4(zw) * u + table4(z))
+                 * batch_evaluation += v25 * table_type_eval
+                 * batch_evaluation += v26 * id1_eval
+                 * batch_evaluation += v27 * id2_eval
+                 * batch_evaluation += v28 * id3_eval
+                 * batch_evaluation += v29 * id4_eval
+                 * batch_evaluation += quotient_eval
+                 */
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V21_LOC),
+                            addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V22_LOC),
+                            addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V23_LOC),
+                            addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation :=
+                    addmod(
+                        batch_evaluation,
+                        mulmod(
+                            mload(C_V24_LOC),
+                            addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p),
+                            p
+                        ),
+                        p
+                    )
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p)
+                batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p)
+
+                mstore(0x00, 0x01) // [1].x
+                mstore(0x20, 0x02) // [1].y
+                mstore(0x40, sub(p, batch_evaluation))
+                // accumulator_2 = -[1].(batch_evaluation)
+                success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+                // accumulator = accumulator + accumulator_2
+                success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+                if iszero(success) {
+                    mstore(0x0, OPENING_COMMITMENT_FAILED_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+            }
+
+            /**
+             * PERFORM PAIRING PREAMBLE
+             */
+            {
+                let u := mload(C_U_LOC)
+                let zeta := mload(C_ZETA_LOC)
+                // VALIDATE PI_Z
+                {
+                    let x := mload(PI_Z_X_LOC)
+                    let y := mload(PI_Z_Y_LOC)
+                    let xx := mulmod(x, x, q)
+                    // validate on curve
+                    if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                        mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                        revert(0x00, 0x04)
+                    }
+                    mstore(0x00, x)
+                    mstore(0x20, y)
+                }
+                // compute zeta.[PI_Z] and add into accumulator
+                mstore(0x40, zeta)
+                success := staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)
+                // accumulator = accumulator + accumulator_2
+                success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40))
+
+                // VALIDATE PI_Z_OMEGA
+                {
+                    let x := mload(PI_Z_OMEGA_X_LOC)
+                    let y := mload(PI_Z_OMEGA_Y_LOC)
+                    let xx := mulmod(x, x, q)
+                    // validate on curve
+                    if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                        mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                        revert(0x00, 0x04)
+                    }
+                    mstore(0x00, x)
+                    mstore(0x20, y)
+                }
+                mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p))
+                // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA]
+                success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40))
+                // PAIRING_RHS = accumulator + accumulator_2
+                success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40))
+
+                mstore(0x00, mload(PI_Z_X_LOC))
+                mstore(0x20, mload(PI_Z_Y_LOC))
+                mstore(0x40, mload(PI_Z_OMEGA_X_LOC))
+                mstore(0x60, mload(PI_Z_OMEGA_Y_LOC))
+                mstore(0x80, u)
+                success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40))
+                // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u
+                success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))
+                // negate lhs y-coordinate
+                mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC)))
+
+                if mload(CONTAINS_RECURSIVE_PROOF_LOC) {
+                    // VALIDATE RECURSIVE P1
+                    {
+                        let x := mload(RECURSIVE_P1_X_LOC)
+                        let y := mload(RECURSIVE_P1_Y_LOC)
+                        let xx := mulmod(x, x, q)
+                        // validate on curve
+                        if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                            mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                            revert(0x00, 0x04)
+                        }
+                        mstore(0x00, x)
+                        mstore(0x20, y)
+                    }
+
+                    // compute u.u.[recursive_p1] and write into 0x60
+                    mstore(0x40, mulmod(u, u, p))
+                    success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40))
+                    // VALIDATE RECURSIVE P2
+                    {
+                        let x := mload(RECURSIVE_P2_X_LOC)
+                        let y := mload(RECURSIVE_P2_Y_LOC)
+                        let xx := mulmod(x, x, q)
+                        // validate on curve
+                        if iszero(eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) {
+                            mstore(0x0, POINT_NOT_ON_CURVE_SELECTOR)
+                            revert(0x00, 0x04)
+                        }
+                        mstore(0x00, x)
+                        mstore(0x20, y)
+                    }
+                    // compute u.u.[recursive_p2] and write into 0x00
+                    // 0x40 still contains u*u
+                    success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40))
+
+                    // compute u.u.[recursiveP1] + rhs and write into rhs
+                    mstore(0xa0, mload(PAIRING_RHS_X_LOC))
+                    mstore(0xc0, mload(PAIRING_RHS_Y_LOC))
+                    success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40))
+
+                    // compute u.u.[recursiveP2] + lhs and write into lhs
+                    mstore(0x40, mload(PAIRING_LHS_X_LOC))
+                    mstore(0x60, mload(PAIRING_LHS_Y_LOC))
+                    success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40))
+                }
+
+                if iszero(success) {
+                    mstore(0x0, PAIRING_PREAMBLE_FAILED_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+            }
+
+            /**
+             * PERFORM PAIRING
+             */
+            {
+                // rhs paired with [1]_2
+                // lhs paired with [x]_2
+
+                mstore(0x00, mload(PAIRING_RHS_X_LOC))
+                mstore(0x20, mload(PAIRING_RHS_Y_LOC))
+                mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2
+                mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed)
+                mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b)
+                mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)
+
+                mstore(0xc0, mload(PAIRING_LHS_X_LOC))
+                mstore(0xe0, mload(PAIRING_LHS_Y_LOC))
+                mstore(0x100, mload(G2X_X0_LOC))
+                mstore(0x120, mload(G2X_X1_LOC))
+                mstore(0x140, mload(G2X_Y0_LOC))
+                mstore(0x160, mload(G2X_Y1_LOC))
+
+                success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20)
+                if iszero(and(success, mload(0x00))) {
+                    mstore(0x0, PAIRING_FAILED_SELECTOR)
+                    revert(0x00, 0x04)
+                }
+            }
+
+            {
+                mstore(0x00, 0x01)
+                return(0x00, 0x20) // Proof succeeded!
+            }
+        }
+    }
+}
+
+contract UltraVerifier is BaseUltraVerifier {
+    function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) {
+        return UltraVerificationKey.verificationKeyHash();
+    }
+
+    function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) {
+        UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc);
+    }
+}
diff --git a/momiji-helpers/contracts/state.sol b/momiji-helpers/contracts/state.sol
new file mode 100644
index 0000000000000000000000000000000000000000..9c55dfaa7cd9d6ac939c4e4d3643c3dfa380bd21
--- /dev/null
+++ b/momiji-helpers/contracts/state.sol
@@ -0,0 +1,632 @@
+pragma solidity ^0.8.26;
+pragma experimental ABIEncoderV2;
+import "./Interfaces/IERC20.sol";
+import "./Interfaces/IElasticERC20.sol";
+import "./Libraries/structs.sol";
+import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol";
+import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol";
+import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
+
+
+// Upgradeable
+import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
+import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
+import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol";
+import "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";
+
+interface IVerifier {
+    function verify(bytes calldata, bytes32[] calldata) external view returns (bool);
+    function getVerificationKeyHash() external pure returns (bytes32);
+}
+
+interface IOracle {
+    function getCost(
+        uint256 _amount,
+        address _chainlinkFeed,
+        address _xftPool
+    ) external view returns (uint256);
+
+    function chainlinkPrice(address _chainlinkFeed) external view returns (uint256);
+}
+
+interface IWETH9 is IERC20{ 
+    function deposit() external payable;
+    function withdraw(uint256 _amount) external;
+}
+
+interface IMomiji {
+    function publish(bytes calldata _proof, Batch calldata _batch) external;
+}
+
+contract Momiji is Initializable, UUPSUpgradeable, OwnableUpgradeable, PausableUpgradeable, EIP712Upgradeable {
+
+    address constant _weth9 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
+    uint256 constant MAX_FIELD_VALUE = 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000;
+    uint256 constant FIELD_MODULUS = MAX_FIELD_VALUE + 1;
+    bytes32 constant ZERO_VALUE = 0x016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720;
+    bytes32 constant ZERO_UTXO_ROOT = 0x11d25ff6aa8a431fbce8e8d9a87a2d7986adf38e724fbe47f15752d0931f14d8;
+    bytes32 constant INITIAL_STATE = 0x06f93f503e77fcdcacfe622e66adc639b63e8c0083f5cab5d71d461aa4562c92;
+    bytes32 constant COINBASE_PAYMENT = 0x0000000000000000000000000000000000000000000000000000000000000003;
+    bytes32 constant BROADCASTER_PAYMENT = 0x0000000000000000000000000000000000000000000000000000000000000002;
+    bytes32 constant PROVER_PAYMENT = 0x0000000000000000000000000000000000000000000000000000000000000001;
+    bytes32 constant NO_PAYMENT = 0x0000000000000000000000000000000000000000000000000000000000000000;
+
+    IWETH9 constant weth9 = IWETH9(_weth9);
+    IVerifier public verifier;
+    IElasticERC20 public token;
+    IOracle public oracle;
+    ISwapRouter public swapRouter;
+
+    bytes32[] public validRoots;
+    bytes32 public txKeyHash;
+    bytes32 public txWrapperKeyHash;
+    bytes32 public recursiveKeyHash;
+    uint256 public STATE_DEPTH;
+    uint256 public MAX_ITEMS;
+    uint256 public MAX_UTXOS;
+    bytes32 public merkleRoot;
+    bytes32 public histRoot;
+    
+    // Training Wheels
+    uint256 public dailyCap;
+    uint256 public dailyMint;
+    uint256 public lastCapReset;
+    uint256 public burnPercentageSwap;
+
+    event EncryptedUTXOBroadcast(bytes32 indexed _oldRoot, bytes32 indexed _utxoId, EncryptedUTXO _encryptedUTXO);
+    event TransactionBroadcast(TransactionWithProof _tx, bytes32 indexed _merkleRoot, bytes32 indexed _txId);
+    event TransactionPublish(Transaction _tx, bytes32 indexed _merkleRoot, bytes32 indexed _txId);
+    event BatchPublish(uint256 indexed _batchNumber, bytes32 _oldRoot, bytes32 indexed _newRoot, bytes32 indexed _oracle, bytes32[20] _historicPath);
+    event BroadcastAddress(bytes32 indexed _merkleRoot, string indexed _address); // _address is a libp2p address
+
+    // Training Wheels
+    event DailyCapChanged(uint256 indexed _oldCap, uint256 indexed _newCap);
+    event BurnPercentageChanged(uint256 indexed _oldPercentage, uint256 indexed _newPercentage);
+    
+    mapping(bytes32 => bool) public nullifierHashes;
+    mapping(bytes32 => bytes32) public utxoPrevRoots;
+    mapping(bytes32 => bytes32) public relay;
+
+    uint256 public batchNumber;
+    address public xftPool;
+
+    address public xft;
+    uint24 public fee;
+
+    /// @custom:oz-upgrades-unsafe-allow constructor
+    constructor() {
+        _disableInitializers();
+    }
+    function initialize(
+        IVerifier _verifier, 
+        address _token, 
+        bytes32 _txKeyHash, 
+        bytes32 _txWrapperKeyHash, 
+        bytes32 _recursiveKeyHash, 
+        address _xftPool
+    ) public initializer {
+        __Pausable_init();
+        __Ownable_init(msg.sender);
+        __UUPSUpgradeable_init();
+        verifier = _verifier;
+        token = IElasticERC20(_token);
+        xft = _token;
+        txKeyHash = _txKeyHash;
+        txWrapperKeyHash = _txWrapperKeyHash;
+        recursiveKeyHash = _recursiveKeyHash;
+        xftPool = _xftPool;
+
+        swapRouter = ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564);
+        STATE_DEPTH = 20;
+        MAX_ITEMS = 16;
+        MAX_UTXOS = 16;
+        merkleRoot = ZERO_VALUE;
+        validRoots.push(merkleRoot);
+        histRoot = INITIAL_STATE;
+        fee = 3000;
+        burnPercentageSwap = 5;
+        dailyCap = 1;
+        __EIP712_init("Momiji", "1");
+    }
+
+    
+    function _authorizeUpgrade(address newImplementation)
+        internal
+        onlyOwner
+        override
+    {}
+
+    modifier nonreentrant() {
+        assembly {
+            if tload(0) { revert(0, 0) }
+            tstore(0, 1)
+        }
+        _;
+        assembly {
+            tstore(0, 0)
+        }
+    }
+
+    receive() external payable {
+        if (msg.sender != _weth9) {
+            msg.sender.call{value: msg.value}("");
+        }
+    }
+
+    fallback() external payable {
+        if (msg.sender != _weth9) {
+            msg.sender.call{value: msg.value}("");
+        }
+    }
+    
+    // Training Wheels
+    function updateCircuits(bytes32[] calldata _circuits) public onlyOwner {
+        txKeyHash = _circuits[0];
+        txWrapperKeyHash = _circuits[1];
+        recursiveKeyHash = _circuits[2];
+        verifier = IVerifier(_toAddress(_circuits[3]));
+    }
+
+    // Training Wheels
+    function emergencyPause() public onlyOwner {
+        _pause();
+    }
+
+    // Training Wheels
+    function emergencyUnpause() public onlyOwner {
+        _unpause();
+    }
+
+    // Training Wheels
+    function changeCap(uint256 _cap) public onlyOwner {
+        require(_cap < 1000, "momiji.changeCap: Cannot exceed 1000 bps");
+        emit DailyCapChanged(dailyCap, _cap);
+        dailyCap = _cap;
+    }
+
+    // Training Wheels
+    function changeBurnPercentage(uint256 _percentage) public onlyOwner {
+        require(_percentage < 100, "momiji.changeBurnPercentage: Cannot exceed 100%");
+        emit BurnPercentageChanged(burnPercentageSwap, _percentage);
+        burnPercentageSwap = _percentage;
+    }
+
+    // Training Wheels
+    function changePools(address[] calldata _addrs) public onlyOwner {
+        swapRouter = ISwapRouter(_addrs[0]);
+        xftPool = _addrs[1];
+        xft = _addrs[2];
+        token = IElasticERC20(_addrs[2]);
+    }
+
+
+    function getSpentNullifiers(bytes32[] calldata _nullifierHashes) external view returns (bool[] memory spent) {
+        uint256 nullifierHashesLength = _nullifierHashes.length;
+        spent = new bool[](nullifierHashesLength);
+        for (uint256 i; i < nullifierHashesLength; i++) {
+            if (isSpent(_nullifierHashes[i])) {
+                spent[i] = true;
+            }
+        }
+    }
+
+    function getValidRoots() public view returns (bytes32[] memory) {
+        return validRoots;
+    }
+
+    function getValidRootAtIndex(uint256 _index) public view returns (bytes32) {
+        return validRoots[_index];
+    }
+
+    function getValidRootsPaginated(uint256 _start, uint256 _end) public view returns (bytes32[] memory) {
+            require(_start < _end, "Invalid range");
+            require(_end < validRoots.length, "Invalid end index");
+
+            bytes32[] memory paginatedRoots = new bytes32[](_end - _start);
+            uint256 paginatedIndex = 0;
+            
+            for (uint256 i = _start; i <= _end; i++) {
+                paginatedRoots[paginatedIndex] = validRoots[i];
+                paginatedIndex++;
+            }
+
+            return paginatedRoots;
+    }
+
+    function isSpent(bytes32 _nullifierHash) public view returns (bool) {
+        return nullifierHashes[_nullifierHash];
+    }
+
+    function ecRecover(bytes32 _hash, bytes calldata _signature) public pure returns (address) {
+        return ECDSA.recover(_hash, _signature);
+    }
+
+    function _toAddress(bytes32 _address) internal pure returns (address) {
+        return address(uint160(uint256(_address)));
+    }
+
+    function _fromAddress(address _address) internal pure returns (bytes32) {
+        return bytes32(uint256(uint160(_address)));
+    }
+
+    function hashTypedDataV4(Deposit calldata _deposit) public view returns (bytes32) {
+        return _hashTypedDataV4(keccak256(abi.encode(
+                keccak256("DepositHash(bytes32 pi_hash)"),
+                _deposit.pi_hash
+            )));
+    }
+
+    function broadcastTransaction(TransactionWithProof calldata _tx, bytes32 _recipient) public nonreentrant {
+        bytes32 _signatureHash;
+        if (_tx.transaction.amount > 0) {
+            _signatureHash = _hashTypedDataV4(keccak256(abi.encode(
+                keccak256("DepositHash(bytes32 pi_hash)"),
+                _tx.transaction.deposit.pi_hash
+            )));
+        } else {
+            _signatureHash = 0;
+        }
+        bytes32 _piHash = hashCircuitInputsForTx(_tx.transaction, _signatureHash);
+        require(relay[_piHash] == 0, "momiji.broadcast: already broadcasted");
+        for (uint256 i = 0; i < 16; i++) {
+            if (_tx.transaction.recipients[i] == BROADCASTER_PAYMENT)
+                relay[_piHash] = _recipient;
+        }
+        emit TransactionBroadcast(_tx, merkleRoot, _piHash);
+    }
+
+    function broadcastAddress(string calldata _address) public nonreentrant {
+        emit BroadcastAddress(merkleRoot, _address);
+    }
+
+    function _swapForETH(uint256 _swapAmount, uint160 _priceLimit) internal returns (uint256 _amountOut) {
+        token.approve(address(swapRouter), _swapAmount);
+        _amountOut = swapRouter.exactInputSingle(
+            ISwapRouter.ExactInputSingleParams({
+                tokenIn: xft,
+                tokenOut: _weth9,
+                fee: fee,
+                recipient: address(this),
+                deadline: block.timestamp,
+                amountIn: _swapAmount,
+                amountOutMinimum: 0,
+                sqrtPriceLimitX96: _priceLimit
+            })
+        );
+        weth9.withdraw(_amountOut);
+        return _amountOut;
+    }
+
+    function verifyProof(
+        bytes calldata _proof,
+        Batch calldata _batch,
+        bytes32 _accumulator
+    ) public view returns (bool) {
+        bytes32[] memory publicInputs = new bytes32[](17);
+        publicInputs[0] = prepareBatchPublicInputs(_batch, _accumulator);
+        for (uint256 i = 0; i < 16; i++) publicInputs[i + 1] = _batch.aggregation_object[i];
+        return verifier.verify(_proof, publicInputs);
+    }
+
+    function _publishDeposit(
+        Transaction calldata _tx,
+        bytes32 _signatureHash
+    ) internal {
+
+        address depositor = ecRecover(_signatureHash, _tx.deposit.signature);
+
+        require(token.balanceOf(depositor) >= uint256(_tx.amount), "momiji._publishDeposit: insufficient balance");
+        token.burn(depositor, uint256(_tx.amount));
+    }
+
+    function _handleUTXOs(Transaction calldata _tx) internal {
+        
+        for (uint256 j = 0; j < 16; j++) {
+            if (_tx.nullifier_hashes[j] != ZERO_VALUE) {
+                require(!nullifierHashes[_tx.nullifier_hashes[j]], 'momiji._publishWithdraw: nullifier spent');
+                nullifierHashes[_tx.nullifier_hashes[j]] = true;
+            }
+
+            if (_tx.commitments[j] != ZERO_VALUE) {
+                require(utxoPrevRoots[_tx.commitments[j]] == 0, 'momiji._publishWithdraw: utxo exists');
+                utxoPrevRoots[_tx.commitments[j]] = merkleRoot;
+                
+                emit EncryptedUTXOBroadcast(
+                    merkleRoot,
+                    _tx.uids[j],
+                    _tx.encrypted_utxo[j]
+                );
+            }
+            
+            if (_tx.commitments_in[j] != ZERO_VALUE) require(utxoPrevRoots[_tx.commitments_in[j]] != 0, "momiji.publish: commitment doesn't exist");
+        
+        }
+
+    }
+
+    function _createPayments(
+        Transaction calldata _tx,
+        Payment[] memory _payments,
+        bytes32 _piHash,
+        uint256 _txIndex
+    ) internal {
+
+        for (uint256 j = 0; j < MAX_UTXOS; j++) {
+            bytes32 _recipient = ZERO_VALUE;
+
+            if (_tx.recipients[j] != ZERO_VALUE) {
+
+                if (_tx.recipients[j] == BROADCASTER_PAYMENT) {
+                    _recipient = relay[_piHash];
+                } else {
+                    _recipient = _tx.recipients[j];
+                }
+                
+                uint256 _swapAmount = uint256(_tx.swap_amounts[j]);
+                uint256 _withdrawalAmount = uint256(_tx.withdrawals[j]) - _swapAmount;
+
+                _swapAmount = _swapAmount * (100 - burnPercentageSwap) / 100;
+
+                uint160 _priceLimit = (_tx.price_limit == ZERO_VALUE) ? 0 : uint160(uint256(_tx.price_limit));
+
+                _payments[(_txIndex * MAX_UTXOS) + j] = Payment(_recipient, _withdrawalAmount, _swapAmount, _priceLimit);
+            }
+        }
+    }
+
+    function _handlePayments(Payment[] memory _payments, uint256 _txCount) internal {
+
+        uint256 _paymentsCount = 1;
+        uint256 _xftForSwap;
+        uint160 _priceLimit;
+
+        bytes32[] memory _recipients = new bytes32[](_txCount * MAX_UTXOS + 1);
+        Payment memory _payment;
+
+        for (uint256 i = 0; i < _txCount; i++) {
+            for (uint256 j = 0; j < MAX_UTXOS; j++) {
+                _payment = _payments[i * MAX_UTXOS + j];
+
+                if (_payment.recipient != ZERO_VALUE && _payment.recipient != NO_PAYMENT) {
+
+                    if (_payment.recipient == COINBASE_PAYMENT) _payment.recipient = _fromAddress(block.coinbase);
+                    if (_payment.recipient == PROVER_PAYMENT) _payment.recipient = _fromAddress(msg.sender);
+
+                    if (_priceLimit < _payment.price_limit) _priceLimit = _payment.price_limit;
+
+                    uint256 _recipientIndex;
+                    bytes32 _thisRecipient = _payment.recipient;
+
+                    assembly {
+                        _recipientIndex := tload(_thisRecipient)
+                    }
+                    
+                    if (_recipientIndex == 0) {
+                        _recipients[_paymentsCount] = _payment.recipient;
+                        _recipientIndex = i * MAX_UTXOS + j;
+                        assembly {
+                            tstore(_thisRecipient, _recipientIndex)
+                        }
+                        _paymentsCount++;
+                    } else {
+                        if (_payment.withdrawalAmount > 0) _payments[_recipientIndex].withdrawalAmount += _payment.withdrawalAmount;
+                        if (_payment.swapAmount > 0) _payments[_recipientIndex].swapAmount += _payment.swapAmount;
+                        _payments[i * MAX_UTXOS + j] = Payment(NO_PAYMENT, 0, 0, 0);
+                    }
+
+                    _xftForSwap += _payment.swapAmount;
+                    
+                }
+
+            }
+        }
+
+        // Training Wheels
+        uint256 _now = block.timestamp;
+        if (_now - lastCapReset > 86400) {
+            lastCapReset = _now;
+            dailyMint = 0;
+        }
+
+        uint256 _amountOut = 0;
+        if (_xftForSwap > 0) {
+
+            // Training Wheels
+            require(_xftForSwap + dailyMint <= (dailyCap * token.totalSupply() / 1000), "momiji._handlePayments: daily cap exceeded");
+            dailyMint += _xftForSwap;
+
+            token.mint(address(this), _xftForSwap);
+            _amountOut = _swapForETH(_xftForSwap, _priceLimit);
+            for (uint256 i = 1; i < _paymentsCount; i++) {
+                if (_recipients[i] != NO_PAYMENT) {
+                    uint256 _thisPaymentIndex;
+                    bytes32 _thisRecipient = _recipients[i];
+                    assembly {
+                        _thisPaymentIndex := tload(_thisRecipient)
+                    }
+                    _payment = _payments[uint256(_thisPaymentIndex)];
+                    uint256 _amountOutShare;
+                    if (_payment.swapAmount > 0) {
+                        _amountOutShare = _payment.swapAmount * _amountOut / _xftForSwap;
+                        payable(_toAddress(_recipients[i])).transfer(_amountOutShare);
+                    }
+                    
+                    uint256 _xftAmountOut = _payment.withdrawalAmount;
+                    if (_xftAmountOut > 0) {
+
+                        // Training Wheels
+                        require(_xftAmountOut + dailyMint <= (dailyCap * token.totalSupply() / 1000), "momiji._handlePayments: daily cap exceeded");
+                        dailyMint += _xftAmountOut;
+
+                        token.mint(_toAddress(_recipients[i]), _xftAmountOut);
+                    }
+                }
+            }
+
+        }
+    }
+
+    function _getSignatureHash(Transaction calldata _transaction) public view returns (bytes32 _signatureHash) {
+        if (_transaction.amount > 0) {
+            _signatureHash = _hashTypedDataV4(keccak256(abi.encode(
+                keccak256("DepositHash(bytes32 pi_hash)"),
+                hashCircuitInputsForTxWithoutDeposit(_transaction)
+            )));
+        } else {
+            _signatureHash = 0;
+        }
+        return _signatureHash;
+    }
+
+    function _accumulatePublicInputs(
+        bytes32 _previousAccumulator,
+        bytes32 _publicInputsHash
+    ) public view returns (bytes32) {
+        bytes32[] memory _hash = new bytes32[](4);
+        _hash[0] = _previousAccumulator;
+        _hash[1] = _publicInputsHash;
+        _hash[2] = txKeyHash;
+        _hash[3] = (_previousAccumulator == ZERO_VALUE) ? txWrapperKeyHash : recursiveKeyHash;
+        return _hashAndMod(_hash);
+    }
+
+    function _updateState(Batch memory _batch) internal {
+        validRoots.push(_batch.new_root);
+        merkleRoot = _batch.new_root;
+        histRoot = _batch.new_hist_root;
+        batchNumber++;
+    }
+
+    // This should always revert before the verify step
+    function simulatePublish(Batch calldata _batch) public returns (bytes memory returnData) {
+        (bool success, returnData) = address(this).call(abi.encodeWithSelector(IMomiji.publish.selector, "0x", _batch));
+    }
+
+    function publish(bytes calldata _proof, Batch calldata _batch) public nonreentrant whenNotPaused {
+
+        require(batchNumber < 2 ** STATE_DEPTH, "momiji.publish: state depth reached");
+        require(_batch.tx_key_hash == txKeyHash, 'momiji.publish: invalid tx keyHash');
+        require(_batch.recursive_key_hash == recursiveKeyHash, 'momiji.publish: invalid recursive keyHash');
+        require(_batch.old_hist_root == histRoot, 'momiji.publish: invalid historic root');
+
+        uint256 _txCount = _batch.transactions.length;
+
+        bytes32 _accumulator = ZERO_VALUE;
+
+        Payment[] memory _payments = new Payment[](MAX_ITEMS * MAX_UTXOS);
+
+        for (uint256 i = 0; i < _txCount; i++) {
+
+            require(_batch.transactions[i].utxo_root != ZERO_VALUE, 'momiji.publish: tx must not be empty');
+            require(_batch.transactions[i].utxo_root != ZERO_UTXO_ROOT, 'momiji.publish: tx utxos must not be empty');
+            require(uint256(_batch.transactions[i].timestamp) % 60 == 0, 'momiji.publish: timestamp must be divisible by 60');
+            require(_batch.transactions[i].timestamp < bytes32(block.timestamp), 'momiji.publish: tx not yet valid');
+            require(uint256(_batch.transactions[i].deadline) % 60 == 0, 'momiji.publish: deadline must be divisible by 60');
+            require(_batch.transactions[i].deadline > bytes32(block.timestamp), 'momiji.publish: tx has expired');
+            
+            bytes32 _signatureHash = _getSignatureHash(_batch.transactions[i]);
+            bytes32 _publicInputsHash = hashCircuitInputsForTx(_batch.transactions[i], _signatureHash);
+            _accumulator = _accumulatePublicInputs(_accumulator, _publicInputsHash);
+            if (_signatureHash > 0) _publishDeposit(_batch.transactions[i], _signatureHash);
+            _handleUTXOs(_batch.transactions[i]);
+            _createPayments(_batch.transactions[i], _payments, _publicInputsHash, i);
+
+            emit TransactionPublish(_batch.transactions[i], merkleRoot, _publicInputsHash);
+        }
+
+        _handlePayments(_payments, _txCount);
+
+        _updateState(_batch);
+
+        emit BatchPublish(batchNumber, merkleRoot, _batch.new_root, _batch.oracle, _batch.historic_path);
+
+        require(_proof.length > 0, 'momiji.publish: no proof');
+        require(verifyProof(_proof, _batch, _accumulator), 'momiji.publish: invalid proof');
+    }
+
+    function prepareBatchPublicInputs(
+        Batch calldata _batch,
+        bytes32 _accumulator
+    ) public view returns (bytes32) {
+        bytes32[] memory _hash = new bytes32[](26);
+        _hash[0] = _batch.new_root;
+        _hash[1] = _batch.old_hist_root;
+        _hash[2] = _batch.new_hist_root;
+        _hash[3] = _accumulator;
+        _hash[4] = _batch.tx_key_hash;
+        _hash[5] = _batch.recursive_key_hash;
+        for (uint256 i = 0; i < 20; i++) {
+            _hash[6 + i] = _batch.historic_path[i];
+        }
+        return _hashAndMod(_hash);
+    }
+
+    function hashCircuitInputsForTx(Transaction calldata _tx, bytes32 _signatureHash) public view returns (bytes32) {
+        bytes32[] memory _hashInputs = new bytes32[](53);
+        _hashInputs[0] = _tx.current_root;
+        _hashInputs[1] = _tx.utxo_root;
+        _hashInputs[2] = _tx.amount;
+        _hashInputs[3] = hashContractOnlyInputsForTx(_tx, _signatureHash);
+        for (uint256 i = 0; i < 16; i++) {
+            _hashInputs[4] = bytes32(uint256(_hashInputs[4]) + uint256(_tx.withdrawals[i])); 
+            _hashInputs[5 + i] = _tx.commitments_in[i];
+            _hashInputs[21 + i] = _tx.commitments[i];
+            _hashInputs[37 + i] = _tx.nullifier_hashes[i];
+        }
+        return _hashAndMod(_hashInputs);
+    }
+
+    function hashContractOnlyInputsForTx(Transaction calldata _tx, bytes32 _signatureHash) public view returns (bytes32) {
+        bytes32[] memory _hashInputs = new bytes32[](100);
+        _hashInputs[0] = _tx.timestamp;
+        _hashInputs[1] = _tx.deadline;
+        _hashInputs[2] = bytes32(uint256(_signatureHash) % FIELD_MODULUS);
+        _hashInputs[3] = _tx.price_limit;
+        for (uint256 i = 0; i < 16; i++) {
+            _hashInputs[4 + i] = _tx.recipients[i];
+            _hashInputs[20 + i] = _tx.swap_amounts[i];
+            _hashInputs[36 + i] = _tx.uids[i];
+            _hashInputs[52 + (i * 3)] = _tx.encrypted_utxo[i].secret;
+            _hashInputs[53 + (i * 3)] = _tx.encrypted_utxo[i].amount;
+            _hashInputs[54 + (i * 3)] = _tx.encrypted_utxo[i].data;
+        }
+        return _hashAndMod(_hashInputs);
+    }
+
+    function hashCircuitInputsForTxWithoutDeposit(Transaction calldata _tx) public view returns (bytes32) {
+        bytes32[] memory _hashInputs = new bytes32[](53);
+        _hashInputs[0] = _tx.current_root;
+        _hashInputs[1] = _tx.utxo_root;
+        _hashInputs[2] = _tx.amount;
+        _hashInputs[3] = hashContractOnlyInputsForTxWithoutDeposit(_tx);
+        for (uint256 i = 0; i < 16; i++) {
+            _hashInputs[4] = bytes32(uint256(_hashInputs[4]) + uint256(_tx.withdrawals[i])); 
+            _hashInputs[5 + i] = _tx.commitments_in[i];
+            _hashInputs[21 + i] = _tx.commitments[i];
+            _hashInputs[37 + i] = _tx.nullifier_hashes[i];
+        }
+        return _hashAndMod(_hashInputs);
+    }
+
+    function hashContractOnlyInputsForTxWithoutDeposit(Transaction calldata _tx) public view returns (bytes32) {
+        bytes32[] memory _hashInputs = new bytes32[](99);
+        _hashInputs[0] = _tx.timestamp;
+        _hashInputs[1] = _tx.deadline;
+        _hashInputs[2] = _tx.price_limit;
+        for (uint256 i = 0; i < 16; i++) {
+            _hashInputs[3 + i] = _tx.recipients[i];
+            _hashInputs[19 + i] = _tx.swap_amounts[i];
+            _hashInputs[35 + i] = _tx.uids[i];
+            _hashInputs[51 + (i * 3)] = _tx.encrypted_utxo[i].secret;
+            _hashInputs[52 + (i * 3)] = _tx.encrypted_utxo[i].amount;
+            _hashInputs[53 + (i * 3)] = _tx.encrypted_utxo[i].data;
+        }
+        return _hashAndMod(_hashInputs);
+    }
+
+    function _hashAndMod(bytes32[] memory _hashes) internal view returns (bytes32) {
+        bytes32 _hash = keccak256(abi.encodePacked(_hashes));
+        return bytes32(uint256(_hash) % FIELD_MODULUS);
+    }
+
+}
\ No newline at end of file
diff --git a/momiji-helpers/crs/g1.dat b/momiji-helpers/crs/g1.dat
new file mode 100644
index 0000000000000000000000000000000000000000..380c55c88be8c429105e2072e4d53b7660d54fbf
Binary files /dev/null and b/momiji-helpers/crs/g1.dat differ
diff --git a/momiji-helpers/crs/g2.dat b/momiji-helpers/crs/g2.dat
new file mode 100644
index 0000000000000000000000000000000000000000..22bc78828b30dd85591538ac59cc3d88ebf049b6
--- /dev/null
+++ b/momiji-helpers/crs/g2.dat
@@ -0,0 +1 @@
+~#쓈ƒ°ŸYD;2‹¼‰µ³˜µ—NÄÕ¸7¼ÂNþ0úÀ“ƒÁêQØz5Ž‹çÿNX‘Þè&²QöñÇ…J‡ÔÚÌ^UæÝ?–æÎ¢VG[Båa^"þ½£ÀÀc*îA<€Új_äœò FAù›¤ÒQVÁ»šr…üci÷ã
\ No newline at end of file
diff --git a/momiji-helpers/crs/size b/momiji-helpers/crs/size
new file mode 100644
index 0000000000000000000000000000000000000000..f3e06ce264a234c08d7484c69f00e5261a7be6f8
--- /dev/null
+++ b/momiji-helpers/crs/size
@@ -0,0 +1 @@
+524289
\ No newline at end of file
diff --git a/momiji-helpers/package.json b/momiji-helpers/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..1080b1c9e24a5d0d872051b7198222d23ce48ba4
--- /dev/null
+++ b/momiji-helpers/package.json
@@ -0,0 +1,40 @@
+{
+  "name": "hardhat-project",
+  "type": "module",
+  "devDependencies": {
+    "@aztec/bb.js": "^0.45.1"
+  },
+  "dependencies": {
+    "@chainlink/contracts": "^0.8.0",
+    "@chainsafe/libp2p-gossipsub": "^11.0.0",
+    "@chainsafe/libp2p-noise": "^14.0.0",
+    "@chainsafe/libp2p-yamux": "^6.0.1",
+    "@libp2p/bootstrap": "^10.1.0",
+    "@libp2p/circuit-relay-v2": "^1.0.4",
+    "@libp2p/dcutr": "^1.0.3",
+    "@libp2p/identify": "^2.1.2",
+    "@libp2p/mplex": "^10.0.4",
+    "@libp2p/pubsub-peer-discovery": "^10.0.2",
+    "@libp2p/webrtc": "^4.0.5",
+    "@libp2p/websockets": "^8.0.4",
+    "@multiformats/multiaddr": "^12.1.11",
+    "@noir-lang/acvm_js": "^0.29.0",
+    "@noir-lang/backend_barretenberg": "0.28.0",
+    "@noir-lang/noir_codegen": "^0.28.0",
+    "@noir-lang/noir_js": "0.28.0",
+    "@noir-lang/noir_wasm": "0.28.0",
+    "@noir-lang/noirc_abi": "^0.22.0",
+    "@nomicfoundation/hardhat-toolbox": "^5.0.0",
+    "@openzeppelin/contracts": "^4.7.1",
+    "@types/node": "^20.14.10",
+    "dexie": "^4.0.8",
+    "ethers": "^6.13.0",
+    "hardhat": "^2.22.6",
+    "indexeddbshim": "^15.0.0",
+    "json2toml": "^6.1.0",
+    "libp2p": "^1.0.8",
+    "nostr-tools": "^2.7.1",
+    "sequelize": "^6.37.3",
+    "ws": "^8.18.0"
+  }
+}
diff --git a/momiji-helpers/tsconfig.json b/momiji-helpers/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..87e6d72d9713d3233db636f2916eb74c1ecf38d8
--- /dev/null
+++ b/momiji-helpers/tsconfig.json
@@ -0,0 +1,12 @@
+{
+  "compilerOptions": {
+    "target": "es2021",
+    "module": "ESNext",
+    "esModuleInterop": true,
+    "forceConsistentCasingInFileNames": true,
+    "strict": true,
+    "skipLibCheck": true,
+    "resolveJsonModule": true,
+    "moduleResolution": "bundler"
+  }
+}
diff --git a/momiji-helpers/utils/MerkleTree.ts b/momiji-helpers/utils/MerkleTree.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ff604607fe31b44f41453c8a0801f6fd517727ac
--- /dev/null
+++ b/momiji-helpers/utils/MerkleTree.ts
@@ -0,0 +1,168 @@
+// @ts-ignore
+import { NoirFr, BarretenbergApi, _Barretenberg } from "./types"
+// @ts-ignore -- no types
+
+
+export class MerkleTree  {
+  zeroValue = "0x016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720"; // sha256("Momiji") % Fr.MODULUS
+  levels: number;
+  defaultLeaves: string[]
+  storage: Map<string, string>;
+  zeros: string[];
+  totalLeaves: number;
+  barretenberg: any;
+
+  constructor(
+    levels: number, 
+    defaultLeaves: string[] = [],   ) {
+    this.levels = levels;
+    this.storage = new Map();
+    this.zeros = [];
+    this.totalLeaves = 0;
+    this.defaultLeaves = defaultLeaves
+  }
+
+  async hashLeftRight(left: string, right: string): Promise<string> {
+    const leftFr = NoirFr.fromString(left);
+    const rightFr = NoirFr.fromString(right);
+    const hash = await this.barretenberg.pedersenHash([leftFr, rightFr], 0)
+    return hash.toString();
+  }
+  async init() {
+    this.barretenberg = await BarretenbergApi.new()
+    let currentZero = this.zeroValue;
+    this.zeros.push(currentZero);
+    for (let i = 0; i < this.levels; i++) {
+      currentZero = await this.hashLeftRight(currentZero, currentZero);
+      this.zeros.push(currentZero);
+    }
+
+    if (this.defaultLeaves.length > 0) {
+      this.totalLeaves = this.defaultLeaves.length;
+
+      let level = 0;
+      this.defaultLeaves.forEach((leaf, index) => {
+        this.storage.set(MerkleTree.indexToKey(level, index), leaf);
+      });
+
+      level++;
+      let numberOfNodesInLevel = Math.ceil(this.totalLeaves / 2);
+      for (level; level <= this.levels; level++) {
+        for (let i = 0; i < numberOfNodesInLevel; i++) {
+          const leftKey = MerkleTree.indexToKey(level - 1, 2 * i);
+          const rightKey = MerkleTree.indexToKey(level - 1, 2 * i + 1);
+
+          const left = this.storage.get(leftKey);
+          const right = this.storage.get(rightKey) || this.zeros[level - 1];
+          if (!left) throw new Error("leftKey not found");
+
+          const node = await this.hashLeftRight(left, right);
+          this.storage.set(MerkleTree.indexToKey(level, i), node);
+        }
+        numberOfNodesInLevel = Math.ceil(numberOfNodesInLevel / 2);
+      }
+    }
+  }
+
+  static indexToKey(level: number, index: number) {
+    return `${level}-${index}`;
+  }
+
+  getIndex(leaf: string) {
+    for (const [key, value] of this.storage) {
+      if (value === leaf) {
+        return Number(key.split("-")[1]);
+      }
+    }
+    return -1;
+  }
+
+  root() {
+    return this.storage.get(MerkleTree.indexToKey(this.levels, 0)) || this.zeros[this.levels];
+  }
+
+  async proof(indexOfLeaf: number) {
+    let pathElements: string[] = [];
+    let pathIndices: number[] = [];
+
+    const leaf = this.storage.get(MerkleTree.indexToKey(0, indexOfLeaf));
+    if (!leaf) throw new Error("leaf not found");
+
+    const handleIndex = (level: number, currentIndex: number, siblingIndex: number) => {
+      const siblingValue = this.storage.get(MerkleTree.indexToKey(level, siblingIndex)) || this.zeros[level];
+      pathElements.push(siblingValue);
+      pathIndices.push(currentIndex % 2);
+    };
+
+    await this.traverse(indexOfLeaf, handleIndex);
+
+    return {
+      root: this.root(),
+      pathElements,
+      pathIndices,
+      leaf: leaf,
+    };
+  }
+
+  async insert(leaf: string) {
+    const index = this.totalLeaves;
+    await this.update(index, leaf, true);
+    this.totalLeaves++;
+  }
+
+  async update(index: number, newLeaf: string, isInsert = false) {
+    if (!isInsert && index >= this.totalLeaves) {
+      throw Error("Use insert method for new elements.");
+    } else if (isInsert && index < this.totalLeaves) {
+      throw Error("Use update method for existing elements.");
+    }
+
+    let keyValueToStore: any[] = [];
+    let currentElement = newLeaf;
+
+    const handleIndex = async (level: number, currentIndex: number, siblingIndex: number) => {
+      const siblingElement = this.storage.get(MerkleTree.indexToKey(level, siblingIndex)) || this.zeros[level];
+  
+      let left;
+      let right;
+      if (currentIndex % 2 === 0) {
+        left = currentElement;
+        right = siblingElement;
+      } else {
+        left = siblingElement;
+        right = currentElement;
+      }
+  
+      keyValueToStore.push({
+        key: MerkleTree.indexToKey(level, currentIndex),
+        value: currentElement,
+      });
+      currentElement = await this.hashLeftRight(left, right);
+    };
+    await this.traverse(index, handleIndex);
+
+    keyValueToStore.push({
+      key: MerkleTree.indexToKey(this.levels, 0),
+      value: currentElement,
+    });
+
+    keyValueToStore.forEach(o => {
+      this.storage.set(o.key, o.value);
+    });
+  }
+
+  async traverse(indexOfLeaf: number, handler: any) {
+    let currentIndex = indexOfLeaf;
+    for (let i = 0; i < this.levels; i++) {
+      let siblingIndex;
+      if (currentIndex % 2 === 0) {
+        siblingIndex = currentIndex + 1;
+      } else {
+        siblingIndex = currentIndex - 1;
+      }
+
+      await handler(i, currentIndex, siblingIndex);
+      currentIndex = Math.floor(currentIndex / 2);
+    }
+  }
+}
\ No newline at end of file
diff --git a/momiji-helpers/utils/batchBuilder.ts b/momiji-helpers/utils/batchBuilder.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b8603d6b29b75ab0bef49a3461d7c4eec8175597
--- /dev/null
+++ b/momiji-helpers/utils/batchBuilder.ts
@@ -0,0 +1,178 @@
+import { zeroPadValue } from 'ethers';
+import { InputMap } from '@noir-lang/noir_js';
+import fs from "fs"
+import json2toml from "json2toml"
+import { execSync } from 'child_process';
+import { Verifier, rollup_transaction } from '../circuits/helpers/codegen/rollup_transaction';
+import { publish_batch } from '../circuits/helpers/codegen/publish_batch';
+import { tx_as_hash } from '../circuits/helpers/codegen/tx_as_hash';
+import { Peering } from './peering';
+import * as types from './types';
+
+
+export class BatchBuilder extends Peering {
+  owner: types.EthersSigner | undefined;
+  anonRPC: string | undefined;
+
+  constructor(_config: types.GlobalConfig) {
+    if (typeof global !== 'object') throw new Error("BatchBuilder is not available in the browser.");
+    super(_config);
+  }
+
+  async initializeBatchBuilder(callback: Function): Promise<void> {
+    // // Uncomment below to recompile recursion circuit
+    // execSync(`cd ./momiji-helpers/circuits/recursion && nargo compile --only-acir --silence-warnings && ${this.config.nargo} write_vk --silence-warnings && ${this.config.nargo} vk_as_fields --silence-warnings`);
+    await this.initializePeering(callback);
+  }
+
+  async getHistoricPath(root: string): Promise<string[]> {
+    if (root === types.ZERO_VALUE) return types.default_historic_path
+    const path: string[] = await this.contracts.state.queryFilter(
+      this.contracts.state.filters.BatchPublish(undefined, undefined, root, undefined, undefined))
+      .then((event: any) => ((event.length !== 0) ? event[0].args[4] : Promise.reject("No historic path for this root")))
+    return path
+  }
+
+  async wrapTransaction(transaction: types.Transaction, txProofArtifacts: types.ProofArtifacts): Promise<Verifier> {
+    const public_inputs_hash: string = await tx_as_hash(transaction.public_inputs)
+    const wrapperInputs: InputMap = {
+      public_inputs_hash: public_inputs_hash,
+      transaction_verifier: {
+        key_hash: txProofArtifacts.vkHash,
+        verification_key: txProofArtifacts.vkAsFields,
+        proof: txProofArtifacts.proofAsFields,
+      }
+    }
+    let tx_aggregation_object: string[]
+    let wrapperArtifacts: types.ProofArtifacts;
+    let wrapper_proof = await this.noirs.transaction_wrapper.execute(wrapperInputs)
+      .then((wrapper_witness: any) => this.backends.transaction_wrapper.generateProof(wrapper_witness.witness));
+
+    tx_aggregation_object = wrapper_proof.publicInputs.slice(1);
+    let artifacts = await this.backends.transaction_wrapper.generateRecursiveProofArtifacts(wrapper_proof, 17);
+    wrapperArtifacts = {
+      proofData: wrapper_proof,
+      proofAsFields: artifacts.proofAsFields,
+      vkAsFields: artifacts.vkAsFields,
+      vkHash: artifacts.vkHash
+    }
+
+    const txWrapperVerifier: Verifier = {
+      key_hash: wrapperArtifacts.vkHash,
+      proof: wrapperArtifacts.proofAsFields,
+      verification_key: wrapperArtifacts.vkAsFields,
+      aggregation_object: tx_aggregation_object
+    }
+    txWrapperVerifier.proof = tx_aggregation_object.concat(txWrapperVerifier.proof)
+    return txWrapperVerifier
+  }
+
+  async recursiveProof(toml: string, transaction: types.Transaction): Promise<types.RecursionInputs> {
+    fs.writeFileSync('./momiji-helpers/circuits/recursion/Prover.toml', toml)
+    execSync(`cd ./momiji-helpers/circuits/recursion && nargo execute witness --silence-warnings && ${this.config.nargo} prove --silence-warnings && ${this.config.nargo} proof_as_fields --silence-warnings`);
+    const proofAsFields = JSON.parse(fs.readFileSync('./momiji-helpers/circuits/recursion/proofs/proof_fields.json', 'utf8'));
+    const vkAsFields = JSON.parse(fs.readFileSync('./momiji-helpers/circuits/recursion/target/vk_fields.json', 'utf8'));
+    const rollup: types.RecursionInputs = {
+      transaction: transaction,
+      accumulator: proofAsFields[0], 
+      recursion_verifier: {
+        proof: proofAsFields.slice(1),
+        verification_key: vkAsFields.slice(1), 
+        key_hash: vkAsFields[0],
+        aggregation_object: proofAsFields.slice(1, 17)
+      }
+    }
+    return rollup
+  }
+
+  async rollupTransaction(
+    currentRollup: types.RecursionInputs[],
+    transaction: types.Transaction
+  ): Promise<types.RecursionInputs[]> {
+
+    const tx_verifier = {
+      key_hash: transaction.proof_artifacts.vkHash,
+      verification_key: transaction.proof_artifacts.vkAsFields,
+      proof: transaction.proof_artifacts.proofAsFields
+    }
+
+    const idx: number = currentRollup.length > 0 ? currentRollup.length - 1 : 0;
+    const recursion_verifier = (currentRollup.length === 0) ? await this.wrapTransaction(transaction, transaction.proof_artifacts) : currentRollup[idx].recursion_verifier;
+    const previous_accumulator: string = (currentRollup.length === 0) ? types.ZERO_VALUE : currentRollup[idx].accumulator
+    
+    const toml: string = await rollup_transaction(
+      tx_verifier,
+      recursion_verifier!,
+      previous_accumulator,
+      transaction.public_inputs
+    ).then((rollupInputs: any) => json2toml(rollupInputs))
+
+    const newTx = await this.recursiveProof(toml, transaction)
+    currentRollup.push(newTx);
+    return currentRollup
+  }
+
+  async preparePublish(rollup: types.RecursionInputs[]): Promise<types.ContractPublish> {
+    if (rollup.length == 0) return Promise.reject("❌ Empty rollup cannot be published");
+    const finalRollup: types.RecursionInputs = rollup[rollup.length - 1];
+    const validRoots: string[] = await this.contracts.state.getValidRoots()
+    const merkleRoot: string = await this.contracts.state.merkleRoot()
+    const index: number = validRoots.indexOf(merkleRoot)
+    const txVerifier: types.ProofArtifacts = finalRollup.transaction!.proof_artifacts;
+    const publisherHelperInputs: types.PublishInputs = {
+      accumulator: finalRollup.accumulator,
+      hist_tree_input: {
+        root: await this.contracts.state.histRoot(),
+        leaf: merkleRoot,
+        index: types.toFixedHex(index, true),
+        path: await this.getHistoricPath(merkleRoot),
+        utxo_roots: new Array(16).fill("0x").map((_, i, __) => {
+          if (rollup[i] !== undefined && rollup[i].transaction !== undefined) return rollup[i]!.transaction!.public_inputs.utxo_root;
+          else return types.ZERO_VALUE;
+        })
+      },
+      tx_verifier: {
+        proof: txVerifier.proofAsFields,
+        verification_key: txVerifier.vkAsFields,
+        key_hash: txVerifier.vkHash
+      },
+      recursion_verifier: finalRollup.recursion_verifier!
+    }
+
+    if (this.verbose) fs.writeFileSync("./test_files/publisherHelperInputs.json", JSON.stringify(publisherHelperInputs))
+
+    const formattedPublishInputs = await publish_batch(
+      publisherHelperInputs.accumulator,
+      publisherHelperInputs.hist_tree_input,
+      publisherHelperInputs.tx_verifier,
+      publisherHelperInputs.recursion_verifier
+    )
+    if (this.verbose) fs.writeFileSync("./test_files/formattedPublishInputs.json", JSON.stringify(formattedPublishInputs))
+    const toml = json2toml(formattedPublishInputs as InputMap)
+    fs.writeFileSync('./momiji-helpers/circuits/publish/Prover.toml', toml)
+    execSync(`cd ./momiji-helpers/circuits/publish && nargo prove --silence-warnings && nargo verify --silence-warnings`);
+    const verifierInputs = {
+      proof: fs.readFileSync('./momiji-helpers/circuits/publish/proofs/publish.proof', 'utf-8'),
+      pi: formattedPublishInputs.pi_contract_hash
+    }
+
+    const batch_publish: types.ContractBatch = {
+      tx_key_hash: zeroPadValue(formattedPublishInputs.tx_verifier.key_hash, 32),
+      recursive_key_hash: zeroPadValue(formattedPublishInputs.recursion_verifier.key_hash, 32),
+      new_root: zeroPadValue(formattedPublishInputs.batch.new_state_root, 32),
+      old_hist_root: zeroPadValue(formattedPublishInputs.batch.hist_tree.root, 32),
+      new_hist_root: zeroPadValue(formattedPublishInputs.batch.hist_tree.new_root, 32),
+      oracle: zeroPadValue(formattedPublishInputs.batch.batch_oracle, 32),
+      historic_path: formattedPublishInputs.batch.hist_tree.new_path.map((p: any) => zeroPadValue(p, 32)),
+      aggregation_object: new Array(16).fill("0x")
+        .map((_, i, __) => "0x" + verifierInputs.proof.slice(i * 64, (i + 1) * 64)),
+      transactions: rollup.map(r => r.transaction).map(tx => tx!.contract_inputs)
+    }
+    if (this.verbose) fs.writeFileSync("./test_files/batch_publish_deposit.json", JSON.stringify(batch_publish))
+    return {
+      proof: "0x" + verifierInputs.proof.slice(1024),
+      batch: batch_publish
+    } as types.ContractPublish
+  }
+
+}
\ No newline at end of file
diff --git a/momiji-helpers/utils/database.ts b/momiji-helpers/utils/database.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d78c5e0acc065768eebe22ea16cd0405594f2ea2
--- /dev/null
+++ b/momiji-helpers/utils/database.ts
@@ -0,0 +1,51 @@
+import setGlobalVars from 'indexeddbshim';
+if (typeof global === 'object') setGlobalVars();
+import Dexie, { Table } from 'dexie';
+
+export interface UTXO_DB {
+    id?: number;
+    commitment: string;
+    secret: string;
+    amount: bigint;
+    assetType: string;
+    siblings?: string[];
+    timestamp: number;
+    status: string;
+    txHash?: string;
+    chainStatus: string;
+}
+
+export interface Hash {
+    id?: number;
+    hash: string;
+}
+
+export class UTXOStorage extends Dexie {
+
+    utxo!: Table<UTXO_DB>;
+
+    constructor() {
+        super('UTXOStorage');
+        this.version(1).stores({
+            utxo: '++commitment, secret, amount, assetType, siblings, timestamp, status, chainStatus'
+        });
+        this.utxo = this.table('utxo');
+    }
+}
+
+export class HashDB extends Dexie {
+
+    hash!: Table<Hash>;
+
+    constructor() {
+        super('HashDB');
+        this.version(1).stores({
+            hash: '++id, hash'
+        })
+        this.hash = this.table('hash');
+    }
+}
+
+export const db = new UTXOStorage();
+
+export const hashDB = new HashDB();
diff --git a/momiji-helpers/utils/peering.ts b/momiji-helpers/utils/peering.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c1445f288cf4a7287f8a06169121fea4bd8c0b21
--- /dev/null
+++ b/momiji-helpers/utils/peering.ts
@@ -0,0 +1,208 @@
+// @ts-ignore
+import * as types from './types';
+import { TransactionBuilder } from "./transactionBuilder";
+import { createLibp2p } from 'libp2p'
+import { webSockets } from '@libp2p/websockets'
+import * as filters from '@libp2p/websockets/filters'
+import { finalizeEvent, verifyEvent, setNostrWasm, VerifiedEvent, Event } from 'nostr-tools/wasm'
+import { SimplePool } from 'nostr-tools/pool'
+import { gossipsub } from '@chainsafe/libp2p-gossipsub'
+import { noise } from '@chainsafe/libp2p-noise'
+import { yamux } from '@chainsafe/libp2p-yamux'
+import { mplex } from '@libp2p/mplex'
+import { identify } from "@libp2p/identify"
+import { dcutr } from "@libp2p/dcutr"
+import { getPublicKey } from 'nostr-tools/pure';
+import { initNostrWasm } from 'nostr-wasm'
+import { multiaddr } from '@multiformats/multiaddr'
+import { useWebSocketImplementation } from 'nostr-tools/pool'
+import { pubsubPeerDiscovery } from '@libp2p/pubsub-peer-discovery'
+import WebSocket from 'ws'
+
+if (typeof global === "object") useWebSocketImplementation(WebSocket);
+
+
+export class Peering extends TransactionBuilder {
+
+    p2p: any | undefined; 
+    pool: SimplePool = new SimplePool(); 
+    relays: string[];
+    seeds: string[];
+    rebroadcast: any | undefined;
+    callback: Function;
+
+    constructor(_config: types.GlobalConfig) {
+        super(_config);
+        if (!this.config.gossip) throw new Error("Gossip config not found");
+        this.pool = new SimplePool();
+        this.relays = this.config.gossip!.relays;
+        this.seeds = this.config.gossip!.seeds;
+        this.callback = () => true;
+    }
+
+    postEvent = async (_sk: Uint8Array, _timestamp: number) => Promise.any(this.pool.publish(this.relays, finalizeEvent({
+        kind: 1,
+        created_at: _timestamp,
+        tags: [],
+        content: this.p2p.getMultiaddrs().map((addr: any) => multiaddr(addr).toString()).join(',')
+    }, _sk)))
+    postTransaction = async (_tx: types.Transaction) => {
+        const hexString = (await this.contracts.state.getAddress()).slice(2).padStart(64, '0');
+        const matches = hexString.match(/.{1,2}/g);
+        const skUint8Array = matches ? new Uint8Array(matches.map(byte => parseInt(byte, 16))) : new Uint8Array();
+        const _pk: string = getPublicKey(skUint8Array);
+
+        if (this.p2p.services.pubsub.getSubscribers(_pk).length > 0) {
+            await this.p2p.services.pubsub.publish(_pk, new TextEncoder().encode(JSON.stringify(_tx)))
+        } else {
+            setTimeout(async () => await this.postTransaction(_tx), 10_000);
+        }
+    };
+    initializePeering = async (callback?: Function): Promise<void> => {
+        await this.initializeTransactionBuilder();
+        const hexString = (await this.contracts.state.getAddress()).slice(2).padStart(64, '0');
+        const matches = hexString.match(/.{1,2}/g);
+        const skUint8Array = matches ? new Uint8Array(matches.map(byte => parseInt(byte, 16))) : new Uint8Array();
+        let _pk = getPublicKey(skUint8Array);
+
+        await this.fetchRelays();
+        await initNostrWasm().then(setNostrWasm);
+
+        const latestBlock = await this.config.provider.getBlock("latest");
+
+        let multiAddrs: string[] = [];
+
+        this.p2p = await createLibp2p({
+            addresses: {
+                listen: (typeof global === "object") ? ['/ip4/0.0.0.0/tcp/5150/ws'] : []
+            },
+            transports: [webSockets({
+                filter: filters.all
+            })],
+            connectionEncryption: [noise()],
+            streamMuxers: [yamux(), mplex()],
+            services: {
+                pubsub: gossipsub(),
+                identify: identify(),
+                dcutr: dcutr()
+            },
+            connectionGater: {
+                denyDialMultiaddr: () => {
+                    return false
+                }
+            },
+            peerDiscovery: [
+                pubsubPeerDiscovery({
+                    interval: 10_000 
+                })
+            ]
+        });
+
+        await this.p2p.start()
+        this.p2p.services.pubsub.subscribe(_pk)
+        await this.p2p.services.pubsub.start()
+
+        this.p2p.addEventListener('connection:open', async (event: CustomEvent) => {
+            console.log("peering.ts - connection open", event.detail.id.toString())
+        })
+        this.p2p.addEventListener('connection:close', () => {
+            console.log("peering.ts - connection closed")
+        })
+        this.p2p.addEventListener("peer:connect", async (event: CustomEvent) => {
+            console.log("peering.ts - peer connect")
+        })
+        this.p2p.addEventListener("peer:discovery", (event: CustomEvent) => {
+            console.log("peering.ts - peer discovered:", event.detail.id.toString())
+        })
+
+        if (typeof global === "object") {
+            try {
+                this.pool.subscribeMany(
+                    this.relays.slice(0, this.config.gossip!.maxRelays),
+                    [
+                        {
+                            kinds: [1],
+                            authors: [_pk],
+                            since: latestBlock!.timestamp
+                        },
+                    ],
+                    {
+                        onevent: async (event) => event.content.split(',')
+                            .filter(addr => {
+                                try {
+                                    multiaddr(addr);
+                                    return true;
+                                } catch (error) {
+                                    return false;
+                                }
+                            })
+                            .forEach(async (addr) => this.addPeer(addr)),
+                        oneose: async () => true,
+                        onclose: async () => true,
+                    }
+                )
+            } catch (error) {
+            }
+        } else {
+            try {
+                const events: Event[] = await this.pool.querySync(this.relays.slice(0, this.config.gossip!.maxRelays),
+                    {
+                        kinds: [1],
+                        authors: [_pk],
+                        since: latestBlock!.timestamp - (typeof global === 'object' ? 0 : 86400)
+                    }
+                )
+                console.log("peering.ts - nostr events", events)
+                multiAddrs = events.map(event => event.content.split(","))
+                    .flat(1)
+                    .filter(addr => {
+                        try {
+                            multiaddr(addr);
+                            return true;
+                        } catch (error) {
+                            return false;
+                        }
+                    })
+
+                for (let addr in multiAddrs) await this.addPeer(multiAddrs[addr]);
+
+            } catch (error) {
+                console.log("error, peering.ts - initializePeering(), pool.querySync()", error)
+            }
+        }
+
+        if (typeof global === 'object') {
+            this.rebroadcast = setInterval(async () => await this.postEvent(skUint8Array, latestBlock!.timestamp), 60 * 60 * 1000);
+            await this.postEvent(skUint8Array, latestBlock!.timestamp);
+            this.p2p.services.pubsub.addEventListener('message', (message: CustomEvent) => {
+                if (!(message.detail.topic == _pk) || !callback) return;
+                callback(JSON.parse(new TextDecoder().decode(message.detail.data)));
+            })
+
+        }
+
+    }
+
+    addPeer = async (peerMultiaddr: string): Promise<void> => {
+        if (!this.p2p) {
+            throw new Error('P2P is not initialized');
+        }
+        try {
+            await this.p2p.dial(multiaddr(peerMultiaddr));
+            console.log(`Successfully connected to peer: ${peerMultiaddr}`);
+        } catch (error) {
+        }
+    };
+
+    fetchRelays = async (refresh: boolean = false): Promise<string[]> => {
+        if (this.seeds.length == 0 || refresh) return this.relays;
+        for (const seed of this.seeds) {
+            const relaysFromSeed: string[] = (await (await fetch(seed)).json()) as string[];
+            this.relays = this.relays.concat(relaysFromSeed);
+        }
+        return this.relays;
+    }
+}
+
+/* eslint-disable no-console */
+
diff --git a/momiji-helpers/utils/transactionBuilder.ts b/momiji-helpers/utils/transactionBuilder.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a11fa1bd0fdf84634304633ca4b55fd3c32749fe
--- /dev/null
+++ b/momiji-helpers/utils/transactionBuilder.ts
@@ -0,0 +1,859 @@
+import "crypto"
+import { BarretenbergBackend } from '@noir-lang/backend_barretenberg';
+import { Noir, InputMap } from '@noir-lang/noir_js';
+import { zeroPadValue, TypedDataEncoder } from 'ethers';
+import json2toml from "json2toml"
+import * as types from './types.js';
+import { TransactionInputs, create_transaction } from '../circuits/helpers/codegen/create_transaction';
+import { UTXO_New } from '../circuits/helpers/codegen/utxo_to_commitment';
+import { MerkleTree } from './MerkleTree';
+import { keccak_tx_no_deposit } from '../circuits/helpers/codegen/keccak_tx_no_deposit';
+import { tx_as_hash } from '../circuits/helpers/codegen/tx_as_hash';
+import { Momiji__factory, XFTMock__factory, UltraVerifier__factory, IUniswapV3Pool__factory } from './typechain-types';
+import { transaction, transaction_wrapper } from './transaction_circuits';
+import { Fr, Barretenberg } from "@aztec/bb.js"
+import { Buffer } from "buffer"
+import { rollup_transaction, RecursionInputs, Verifier } from "../circuits/helpers/codegen/rollup_transaction";
+import './database';
+
+const MAX_FIELD_VALUE: string = (new types.NoirFr(types.NoirFr.MAX_VALUE)).toString();
+
+export class TransactionBuilder {
+  initialized: boolean = false;
+  circuits: types.Circuits;
+  backends: types.Backends;
+  noirs: types.Noirs;
+  contracts!: types.Contracts;
+  sendRpc: string | undefined;
+  verbose: boolean = false;
+  config: types.GlobalConfig;
+
+  constructor(config: types.GlobalConfig) {
+    this.config = config;
+    this.verbose = (config.verbose) ? config.verbose : false;
+    const circuits: types.Circuits = {
+      transaction: transaction,
+      transaction_wrapper: transaction_wrapper,
+    };
+    let backendOptions: types.NoirBackendOptions | undefined = (this.config.threads) ? { threads: this.config.threads } : undefined;
+    const backends: types.Backends = {
+      transaction: new BarretenbergBackend(circuits.transaction, backendOptions),
+      transaction_wrapper: new BarretenbergBackend(circuits.transaction_wrapper, backendOptions),
+    };
+    const noirs: types.Noirs = {
+      transaction: new Noir(circuits.transaction, backends.transaction),
+      transaction_wrapper: new Noir(circuits.transaction_wrapper, backends.transaction_wrapper),
+    };
+    this.circuits = circuits;
+    this.backends = backends;
+    this.noirs = noirs;
+  }
+
+  async initializeTransactionBuilder(): Promise<void> {
+    let _runner = this.config.signer ? this.config.signer : this.config.provider
+    let _state = Momiji__factory.connect("0xd66E7B1B008a560ad8be69494ce101DE188FbCd3", _runner) 
+    this.contracts = {
+      state: _state,
+      verifier: UltraVerifier__factory.connect(await _state.verifier(), _runner),
+      token: XFTMock__factory.connect(await _state.xft(), _runner),
+      pool: IUniswapV3Pool__factory.connect(await _state.xftPool(), _runner)
+    }
+    this.initialized = true;
+  }
+
+  emptyTransaction = async (): Promise<types.Transaction> => {
+    return { 
+      proof_artifacts: {
+        proofData: {
+          proof: Uint8Array.from(new Array(2144).fill(255)),
+          publicInputs: [MAX_FIELD_VALUE]
+        },
+        proofAsFields: new Array(93).fill(MAX_FIELD_VALUE),
+        vkAsFields: new Array(114).fill(MAX_FIELD_VALUE),
+        vkHash: await this.contracts.state.txKeyHash()
+      },
+      contract_inputs: {
+        current_root: await this.contracts.state.merkleRoot(),
+        utxo_root: MAX_FIELD_VALUE,
+        price_limit: MAX_FIELD_VALUE,
+        timestamp: await this.config.provider.getBlock("latest")
+          .then(res => types.toFixedHex(res!.timestamp - (res!.timestamp % 60), true)),
+        deadline: await this.config.provider!.getBlock("latest")
+          .then(res => types.toFixedHex(res!.timestamp - (res!.timestamp % 60) + (60 * 60 * 24 * 7), true)),
+        amount: MAX_FIELD_VALUE,
+        encrypted_utxo: new Array(16).fill({
+          secret: MAX_FIELD_VALUE,
+          amount: MAX_FIELD_VALUE,
+          data: MAX_FIELD_VALUE
+        }),
+        withdrawals: new Array(16).fill(types.ZERO_HEX),
+        commitments_in: new Array(16).fill(types.ZERO_VALUE),
+        commitments: new Array(16).fill(types.NoirFr.random().toString()),
+        recipients: new Array(16).fill(types.ZERO_HEX),
+        nullifier_hashes: new Array(16).fill(types.ZERO_VALUE),
+        uids: new Array(16).fill(types.ZERO_HEX),
+        swap_amounts: new Array(16).fill(types.ZERO_HEX),
+        deposit: {
+          signature: "0x00",
+          pi_hash: MAX_FIELD_VALUE
+        }
+      },
+      public_inputs: {
+        current_root: await this.contracts.state.merkleRoot(),
+        utxo_root: MAX_FIELD_VALUE,
+        deposit_amount: types.ZERO_HEX,
+        withdrawals: types.ZERO_HEX,
+        commitment_in: new Array(16).fill(types.ZERO_VALUE),
+        commitment_out: new Array(16).fill(types.ZERO_VALUE),
+        nullifier_hashes: new Array(16).fill(types.ZERO_VALUE),
+        contract_only_inputs: MAX_FIELD_VALUE
+      }
+  }
+  };
+
+  async _padBatch(tx: types.Transaction[]): Promise<types.Batch> {
+    const txContractInputs = tx.map(_tx => _tx.contract_inputs)
+    const _fill = new Array(16 - tx.length).fill((await this.emptyTransaction()).contract_inputs)
+    const txFill = txContractInputs.concat(_fill)
+    let _batch: types.Batch = {
+      tx_key_hash: await this.contracts.state.txKeyHash(),
+      recursive_key_hash: await this.contracts.state.recursiveKeyHash(),
+      new_root: MAX_FIELD_VALUE,
+      old_hist_root: await this.contracts.state.histRoot(),
+      new_hist_root: MAX_FIELD_VALUE,
+      oracle: MAX_FIELD_VALUE,
+      historic_path: new Array(20).fill(MAX_FIELD_VALUE),
+      aggregation_object: new Array(16).fill(MAX_FIELD_VALUE),
+      transactions: txFill
+    }
+    console.log(_batch.transactions)
+    return _batch
+  }
+
+  async getTransactionsGas(tx: types.Transaction[] | types.Transaction): Promise<bigint> {
+    const SUBSIDY_FACTOR = 16n 
+    const _verifyCost = 430_000n; 
+    if (!Array.isArray(tx)) tx = [tx]
+    console.log("pad now")
+    const _batch = await this._padBatch(tx)
+    console.log(_batch)
+    let _batchSim = _batch;
+    let _emptySim = _batch;
+    try {
+      _batchSim.transactions = _batch.transactions.slice(tx.length);
+      _emptySim.transactions = _batch.transactions = [];
+      let _fullGas = (await this.contracts.state.simulatePublish.estimateGas(_batch));
+      let _stubGas = (await this.contracts.state.simulatePublish.estimateGas(_batchSim));
+      let _emptyGas = (await this.contracts.state.simulatePublish.estimateGas(_emptySim));
+      console.log(_fullGas, _stubGas, _emptyGas);
+      return (_fullGas - _stubGas) + ((_verifyCost + _emptyGas) / SUBSIDY_FACTOR);
+    } catch (e) {
+      console.log(e);
+      return 0n;
+    }
+  }
+
+  async _generateUTXOEncrypted(utxo_input: types.UTXO_Input[]): Promise<types.UTXO_Encrypted[]> {
+    const utxos: types.UTXO_Encrypted[] = utxo_input.map((utxo) => {
+      return {
+        secret: utxo.secret ? utxo.secret : Fr.random().toString(),
+        amount: utxo.amount,
+        asset_type: utxo.asset_type ? utxo.asset_type : types.ZERO_VALUE,
+        secret_encrypted: types.ZERO_VALUE,
+        amount_encrypted: types.ZERO_VALUE,
+        asset_type_encrypted: types.ZERO_VALUE,
+        uid: types.ZERO_VALUE
+      }
+    })
+    return utxos
+  }
+
+  async utxo_to_commitment(utxo: UTXO_New): Promise<string> {
+    const barretenberg: types._Barretenberg = await Barretenberg.new()
+    const hash: string = await barretenberg.pedersenHash([Fr.fromString(utxo.secret)], 0)
+      .then((owner: types._NoirFr) => barretenberg.pedersenHash([owner, Fr.fromString(utxo.amount), Fr.fromString(utxo.asset_type)], 0))
+      .then((hashFr: types._NoirFr) => hashFr.toString())
+    await barretenberg.destroy()
+    return hash
+  }
+
+  async pedersen_left_right(left: string, right: string): Promise<string> {
+    const barretenberg: types._Barretenberg = await Barretenberg.new()
+    const hash: string = await barretenberg.pedersenHash([Fr.fromString(left), Fr.fromString(right)], 0)
+      .then(hashFr => hashFr.toString())
+    await barretenberg.destroy()
+    return hash
+  }
+
+  _calculateDepositAmount(utxo_commitments?: types.UTXO_Commitment[], utxo_new?: types.UTXO_Encrypted[], withdrawals?: types.WithdrawalSwap[]): string {
+    const utxo_in_total: bigint = utxo_commitments ? utxo_commitments.map(utxo => (utxo.amount === types.ZERO_VALUE ? BigInt(0) : BigInt(utxo.amount))).reduce((prev, curr) => BigInt(prev) + BigInt(curr)) : BigInt(0)
+    const utxo_out_total: bigint = utxo_new ? utxo_new.map(utxo => (utxo.amount === types.ZERO_VALUE ? BigInt(0) : BigInt(utxo.amount))).reduce((prev, curr) => BigInt(prev) + BigInt(curr)) : BigInt(0)
+    const withdrawal_total: bigint = withdrawals ? withdrawals.map(w => BigInt(w.amount)).reduce((prev, curr) => BigInt(prev) + BigInt(curr)) : BigInt(0)
+    let total: string = ((utxo_out_total + withdrawal_total) > utxo_in_total)
+      ? (new Fr(utxo_out_total + withdrawal_total - utxo_in_total)).toString()
+      : (new Fr(BigInt(0))).toString();
+    return total
+  }
+
+  async _getPriceLimitX96(slippage_percentage: number): Promise<string> {
+    if (slippage_percentage > 24) return Promise.reject("Slippage too high");
+    if (slippage_percentage < 0) return Promise.reject("Slippage cannot be less than zero")
+    const _sqrtPriceX96: bigint = await this.contracts.pool.slot0().then(slot0 => slot0.sqrtPriceX96)
+    const _sqrtPriceLimitX96: bigint = _sqrtPriceX96 * BigInt(100_000 - Math.floor(slippage_percentage * 1_000)) / BigInt(100_000)
+    return (new Fr(_sqrtPriceLimitX96)).toString()
+  }
+
+  async _getTransactionFeeInXFT(gasUsed: bigint): Promise<bigint> {
+    const _sqrtPriceX96: bigint = await this.contracts.pool.slot0().then(slot0 => slot0.sqrtPriceX96)
+    const _xftPerEth: bigint = BigInt(2**192 * 1e18) / (_sqrtPriceX96 * _sqrtPriceX96)
+    const _feeData = await this.config.provider.getFeeData()
+    if (!_feeData.maxFeePerGas || !_feeData.maxPriorityFeePerGas) return Promise.reject("Fee data cannot be fetched")
+    const _transactionFeeInXft: bigint = BigInt(gasUsed) * (_feeData.maxFeePerGas! + _feeData.maxPriorityFeePerGas!) * _xftPerEth / BigInt(1e18)
+    return _transactionFeeInXft
+  }
+
+  async _getEtherFromXFT(xft: bigint): Promise<bigint> {
+    const sqrtPriceX96: bigint = await this.contracts.pool.slot0().then(slot0 => slot0.sqrtPriceX96)
+    const xftToEther: bigint = xft * sqrtPriceX96 * sqrtPriceX96 / BigInt(2**192)
+    return xftToEther
+  }
+
+  async _generateWithdrawals(_withdrawals: types.Withdrawal[], slippage_percentage: number): Promise<types.WithdrawalSwap[]> {
+    const priceLimitX96: string = await this._getPriceLimitX96(slippage_percentage)
+    const withdrawals: types.WithdrawalSwap[] = _withdrawals.map(
+      (withdrawal) => {
+        const _amount: string = (withdrawal.amount === types.ZERO_VALUE) ? types.ZERO_HEX : withdrawal.amount;
+        return {
+          amount: _amount,
+          recipient: zeroPadValue(withdrawal.recipient, 32),
+          swap_amount: (new Fr(BigInt(_amount) * BigInt(Math.floor(withdrawal.swap_percentage * 1_000)) / BigInt(100_000))).toString(),
+          price_limit: priceLimitX96
+        } as types.WithdrawalSwap
+      }
+    )
+    return withdrawals
+  }
+
+  async _generateRawTransactionInputs(utxo_commitments?: types.UTXO_Commitment[], utxo_encrypted?: types.UTXO_Encrypted[], withdrawals?: types.WithdrawalSwap[]): Promise<types.TransactionInputsRaw> {
+    const inputs: types.TransactionInputsRaw = {
+      current_root: await this.contracts.state.histRoot(),
+      deposit_amount: this._calculateDepositAmount(utxo_commitments, utxo_encrypted, withdrawals),
+      withdrawals: (withdrawals)
+        ? new Array(16).fill("0x").map((_, i, __) => (withdrawals[i]) ? withdrawals[i].amount : types.ZERO_HEX)
+        : new Array(16).fill(types.ZERO_HEX),
+      utxo_spendable: await this._generateUTXOSpendable(utxo_commitments),
+      utxo_new: (utxo_encrypted)
+        ? new Array(16).fill({
+          secret: types.ZERO_VALUE,
+          amount: types.ZERO_VALUE,
+          asset_type: types.ZERO_VALUE
+        })
+          .map((_, i, __) => {
+            if (utxo_encrypted[i]) {
+              return {
+                secret: utxo_encrypted[i].secret,
+                amount: utxo_encrypted[i].amount,
+                asset_type: utxo_encrypted[i].asset_type
+              }
+            } else {
+              return {
+                secret: types.ZERO_HEX,
+                amount: types.ZERO_VALUE,
+                asset_type: types.ZERO_VALUE
+              }
+            }
+          })
+        : new Array(16).fill({
+          secret: types.ZERO_VALUE,
+          amount: types.ZERO_VALUE,
+          asset_type: types.ZERO_VALUE
+        }),
+      contract_only_inputs: {
+        timestamp: await this.config.provider.getBlock("latest")
+          .then(res => types.toFixedHex(res!.timestamp - (res!.timestamp % 60), true)),
+        deadline: await this.config.provider!.getBlock("latest")
+          .then(res => types.toFixedHex(res!.timestamp - (res!.timestamp % 60) + (60 * 60 * 24 * 7), true)), 
+        signature_hash: types.ZERO_HEX,
+        price_limit: (withdrawals)
+          ? withdrawals.reduce((prev, curr) => ((BigInt(curr.price_limit) > BigInt(prev.price_limit)) ? curr : prev)).price_limit
+          : types.ZERO_HEX,
+        recipients: (withdrawals)
+          ? new Array(16).fill("0x").map((_, i, __) => ((withdrawals[i]) ? withdrawals[i].recipient : types.ZERO_HEX))
+          : new Array(16).fill(types.ZERO_HEX),
+        swap_amounts: (withdrawals)
+          ? new Array(16).fill("0x").map((_, i, __) => ((withdrawals[i]) ? withdrawals[i].swap_amount : types.ZERO_HEX))
+          : new Array(16).fill(types.ZERO_HEX),
+        uids: (utxo_encrypted)
+          ? new Array(16).fill("0x").map((_, i, __) => ((utxo_encrypted[i]) ? utxo_encrypted[i].uid : types.ZERO_VALUE))
+          : new Array(16).fill(types.ZERO_VALUE),
+        encrypted_utxo: (utxo_encrypted)
+          ? new Array(16).fill("0x")
+            .map((_, i, __) => {
+              if (utxo_encrypted[i]) {
+                return {
+                  secret: utxo_encrypted[i].secret_encrypted,
+                  amount: utxo_encrypted[i].amount_encrypted,
+                  data: utxo_encrypted[i].asset_type_encrypted
+                }
+              } else {
+                return {
+                  secret: types.ZERO_VALUE,
+                  amount: types.ZERO_VALUE,
+                  data: types.ZERO_VALUE
+                }
+              }
+            })
+          : new Array(16).fill({
+            secret: types.ZERO_VALUE,
+            amount: types.ZERO_VALUE,
+            data: types.ZERO_VALUE
+          })
+      }
+    }
+    const _domain: types.TypedDataDomain = {
+      name: "Momiji",
+      version: "1",
+      chainId: BigInt(1),
+      verifyingContract: await this.contracts.state.getAddress()
+    }
+    const _types: types.TypedDataTypes = {
+      DepositHash: [
+        { name: "pi_hash", type: "bytes32" }
+      ]
+    }
+    const _values: types.TypedDataValues = {
+      pi_hash: types.ZERO_HEX
+    }
+    inputs.contract_only_inputs.signature_hash = await keccak_tx_no_deposit(
+      inputs.current_root,
+      inputs.deposit_amount,
+      inputs.withdrawals,
+      inputs.utxo_spendable,
+      inputs.utxo_new,
+      inputs.contract_only_inputs
+    ).then(hash => {
+      _values.pi_hash = zeroPadValue(hash, 32)
+      if (inputs.deposit_amount === types.toFixedHex(0, true)) return types.toFixedHex(0, true);
+      else return zeroPadValue(
+        Fr.fromBufferReduce(
+          Buffer.from(
+            TypedDataEncoder.hash(_domain, _types, _values).slice(2),
+            "hex"
+          )
+        ).toString(),
+        32
+      );
+    })
+    return inputs
+  }
+
+  async _generateRawTransactionInputsExpert(deposit?: bigint, utxo_commitments?: types.UTXO_Commitment[], utxo_encrypted?: types.UTXO_Encrypted[], withdrawals?: types.WithdrawalSwap[]): Promise<types.TransactionInputsRaw> {
+    const inputs: types.TransactionInputsRaw = {
+      current_root: await this.contracts.state.histRoot(),
+      deposit_amount: (deposit) 
+      ? (new types.NoirFr(deposit)).toString()
+      : types.toFixedHex(0, true),
+      withdrawals: (withdrawals)
+        ? new Array(16).fill("0x").map((_, i, __) => (withdrawals[i]) ? withdrawals[i].amount : types.ZERO_HEX)
+        : new Array(16).fill(types.ZERO_HEX),
+      utxo_spendable: await this._generateUTXOSpendable(utxo_commitments),
+      utxo_new: (utxo_encrypted)
+        ? new Array(16).fill({
+          secret: types.ZERO_VALUE,
+          amount: types.ZERO_VALUE,
+          asset_type: types.ZERO_VALUE
+        })
+          .map((_, i, __) => {
+            if (utxo_encrypted[i]) {
+              return {
+                secret: utxo_encrypted[i].secret,
+                amount: utxo_encrypted[i].amount,
+                asset_type: utxo_encrypted[i].asset_type
+              }
+            } else {
+              return {
+                secret: types.ZERO_HEX,
+                amount: types.ZERO_VALUE,
+                asset_type: types.ZERO_VALUE
+              }
+            }
+          })
+        : new Array(16).fill({
+          secret: types.ZERO_VALUE,
+          amount: types.ZERO_VALUE,
+          asset_type: types.ZERO_VALUE
+        }),
+      contract_only_inputs: {
+        timestamp: await this.config.provider.getBlock("latest")
+          .then(res => types.toFixedHex(res!.timestamp - (res!.timestamp % 60), true)),
+        deadline: await this.config.provider!.getBlock("latest")
+          .then(res => types.toFixedHex(res!.timestamp - (res!.timestamp % 60) + (60 * 60 * 24 * 7), true)), 
+        signature_hash: types.ZERO_HEX,
+        price_limit: (withdrawals)
+          ? withdrawals.reduce((prev, curr) => ((BigInt(curr.price_limit) > BigInt(prev.price_limit)) ? curr : prev)).price_limit
+          : types.ZERO_HEX,
+        recipients: (withdrawals)
+          ? new Array(16).fill("0x").map((_, i, __) => ((withdrawals[i]) ? withdrawals[i].recipient : types.ZERO_HEX))
+          : new Array(16).fill(types.ZERO_HEX),
+        swap_amounts: (withdrawals)
+          ? new Array(16).fill("0x").map((_, i, __) => ((withdrawals[i]) ? withdrawals[i].swap_amount : types.ZERO_HEX))
+          : new Array(16).fill(types.ZERO_HEX),
+        uids: (utxo_encrypted)
+          ? new Array(16).fill("0x").map((_, i, __) => ((utxo_encrypted[i]) ? utxo_encrypted[i].uid : types.ZERO_VALUE))
+          : new Array(16).fill(types.ZERO_VALUE),
+        encrypted_utxo: (utxo_encrypted)
+          ? new Array(16).fill("0x")
+            .map((_, i, __) => {
+              if (utxo_encrypted[i]) {
+                return {
+                  secret: utxo_encrypted[i].secret_encrypted,
+                  amount: utxo_encrypted[i].amount_encrypted,
+                  data: utxo_encrypted[i].asset_type_encrypted
+                }
+              } else {
+                return {
+                  secret: types.ZERO_VALUE,
+                  amount: types.ZERO_VALUE,
+                  data: types.ZERO_VALUE
+                }
+              }
+            })
+          : new Array(16).fill({
+            secret: types.ZERO_VALUE,
+            amount: types.ZERO_VALUE,
+            data: types.ZERO_VALUE
+          })
+      }
+    }
+    const _domain: types.TypedDataDomain = {
+      name: "Momiji",
+      version: "1",
+      chainId: BigInt(1),
+      verifyingContract: await this.contracts.state.getAddress()
+    }
+    const _types: types.TypedDataTypes = {
+      DepositHash: [
+        { name: "pi_hash", type: "bytes32" }
+      ]
+    }
+    const _values: types.TypedDataValues = {
+      pi_hash: types.ZERO_HEX
+    }
+    console.log(inputs)
+    inputs.contract_only_inputs.signature_hash = await keccak_tx_no_deposit(
+      inputs.current_root,
+      inputs.deposit_amount,
+      inputs.withdrawals,
+      inputs.utxo_spendable,
+      inputs.utxo_new,
+      inputs.contract_only_inputs
+    ).then(hash => {
+      _values.pi_hash = zeroPadValue(hash, 32)
+      if (inputs.deposit_amount === types.toFixedHex(0, true)) return types.toFixedHex(0, true);
+      else return zeroPadValue(
+        Fr.fromBufferReduce(
+          Buffer.from(
+            TypedDataEncoder.hash(_domain, _types, _values).slice(2),
+            "hex"
+          )
+        ).toString(),
+        32
+      );
+    })
+    return inputs
+  }
+
+  async getSiblingsFromChain(utxo: UTXO_New): Promise<string[]> {
+    const commitment: string = await this.utxo_to_commitment(utxo).then(c => zeroPadValue(c, 32))
+    const old_root: string = await this.contracts.state.utxoPrevRoots(commitment)
+    const siblings: string[] = await this.contracts.state.queryFilter(
+      this.contracts.state.filters.TransactionPublish(undefined, old_root, undefined)
+    )
+      .then((events: any) => events.map((event: any) => event.args[0].commitments))
+      .then((commitments: any) => commitments.find((c: any) => c.includes(commitment)))
+    if (!siblings) return Promise.reject("Siblings not found.")
+    return siblings
+  }
+
+  async getUtxoCommitment(utxo: UTXO_New): Promise<string> {
+    const commitment: string = await this.utxo_to_commitment(utxo)
+    return commitment
+  }
+
+  async getTxHashFromUtxo(utxo: UTXO_New): Promise<string> {
+    const commitment: string = await this.getUtxoCommitment(utxo)
+    const oldRoot: string = await this.contracts.state.utxoPrevRoots(commitment)
+    const txHash: string = await this.contracts.state.queryFilter(
+      this.contracts.state.filters.TransactionPublish(undefined, oldRoot, undefined)
+    )
+      .then(events => events.find(event => event.args[0].commitments.includes(commitment)))
+      .then(event => (event ? event.transactionHash : types.toFixedHex(0, true)))
+    return txHash
+  }
+
+  async _generateUTXOCommitments(inputs: types.TransactionInputsRaw, spend_in_same_batch: boolean[]): Promise<types.UTXO_Commitment[]> {
+    const formattedInputs: TransactionInputs = await create_transaction(
+      inputs.current_root,
+      inputs.deposit_amount,
+      inputs.withdrawals,
+      inputs.utxo_spendable,
+      inputs.utxo_new,
+      inputs.contract_only_inputs
+    )
+    const utxo_commitments: types.UTXO_Commitment[] = inputs.utxo_new.map((utxo, i, _) => {
+      return {
+        commitment: formattedInputs.public_inputs.commitment_out[i],
+        secret: utxo.secret,
+        amount: utxo.amount,
+        asset_type: utxo.asset_type,
+        siblings: formattedInputs.public_inputs.commitment_out,
+        spend_in_same_batch: spend_in_same_batch[i] ? true : false
+      } as types.UTXO_Commitment
+    })
+    return utxo_commitments
+  }
+
+  async _generateFormattedTransactionInputs(inputs: types.TransactionInputsRaw): Promise<TransactionInputs> {
+    const formattedInputs: TransactionInputs = await create_transaction(
+      inputs.current_root,
+      inputs.deposit_amount,
+      inputs.withdrawals,
+      inputs.utxo_spendable,
+      inputs.utxo_new,
+      inputs.contract_only_inputs
+    )
+    return formattedInputs
+  }
+
+  async _generateMerkleProof(
+    utxo_input: types.MerkleProofInput,
+    tx_input: types.MerkleProofInput,
+    state_input: types.MerkleProofInput
+  ): Promise<types.Merkle_Proof_Struct> {
+    const merkleProof: types.Merkle_Proof_Struct = {
+      path_utxo: await utxo_input.tree.proof(utxo_input.tree.getIndex(utxo_input.leaf))
+        .then(proof => proof.pathElements),
+      path_tx: await tx_input.tree.proof(tx_input.tree.getIndex(tx_input.leaf))
+        .then(proof => proof.pathElements),
+      path_historic: await state_input.tree.proof(state_input.tree.getIndex(state_input.leaf))
+        .then(proof => proof.pathElements),
+      index_utxo: types.toFixedHex(utxo_input.tree.getIndex(utxo_input.leaf), true),
+      index_tx: types.toFixedHex(tx_input.tree.getIndex(tx_input.leaf), true),
+      index_historic: types.toFixedHex(state_input.tree.getIndex(state_input.leaf), true)
+    }
+    return merkleProof
+  }
+
+  async getNewStateRoot(old_state_root: string): Promise<string> {
+    const validRoots: string[] = await this.contracts.state.getValidRoots()
+    const oldRootIndex: number = validRoots.indexOf(old_state_root)
+    if (oldRootIndex === undefined) return Promise.reject("Root not found")
+    const newStateRoot: string = validRoots[oldRootIndex + 1]
+    return newStateRoot
+  }
+
+  async _generateUTXOSpendableSingle(utxo: types.UTXO_Commitment, hist_tree: MerkleTree): Promise<types.UTXO_Spendable_Struct> {
+    const empty_utxo_spendable: types.UTXO_Spendable_Struct = {
+      secret: types.ZERO_HEX,
+      amount: types.ZERO_VALUE,
+      asset_type: types.ZERO_VALUE,
+      oracle: types.ZERO_VALUE,
+      old_root_proof: types.ZERO_VALUE,
+      merkle_proof: {
+        path_utxo: new Array(types.treeConfig.utxoDepth).fill(types.ZERO_HEX),
+        path_tx: new Array(types.treeConfig.txDepth).fill(types.ZERO_HEX),
+        path_historic: new Array(types.treeConfig.stateDepth).fill(types.ZERO_HEX),
+        index_utxo: types.ZERO_HEX,
+        index_tx: types.ZERO_HEX,
+        index_historic: types.ZERO_HEX
+      },
+      spend_in_same_batch: false
+    }
+
+    if (!utxo.spend_in_same_batch) utxo.spend_in_same_batch = false;
+    if (!utxo.commitment) utxo.commitment = await this.utxo_to_commitment(utxo);
+    if (!utxo.siblings && !utxo.spend_in_same_batch) utxo.siblings = await this.getSiblingsFromChain(utxo);
+
+    if (utxo.commitment === types.ZERO_VALUE) return empty_utxo_spendable
+    if (utxo.spend_in_same_batch) return {
+      secret: utxo.secret,
+      amount: utxo.amount,
+      asset_type: utxo.asset_type,
+      oracle: types.ZERO_VALUE,
+      old_root_proof: types.ZERO_HEX,
+      merkle_proof: {
+        path_utxo: new Array(types.treeConfig.utxoDepth).fill(types.ZERO_HEX),
+        path_tx: new Array(types.treeConfig.txDepth).fill(types.ZERO_HEX),
+        path_historic: new Array(types.treeConfig.stateDepth).fill(types.ZERO_HEX),
+        index_utxo: types.ZERO_HEX,
+        index_tx: types.ZERO_HEX,
+        index_historic: types.ZERO_HEX
+      },
+      spend_in_same_batch: true
+    }
+    const utxo_tree: MerkleTree = new MerkleTree(
+      types.treeConfig.utxoDepth,
+      utxo.siblings
+    )
+    await utxo_tree.init()
+
+    const old_root: string = (utxo.commitment !== types.ZERO_VALUE && utxo.spend_in_same_batch === false)
+      ? await this.contracts.state.utxoPrevRoots(zeroPadValue(utxo.commitment, 32))
+      : types.ZERO_HEX
+
+    const new_root: string = (old_root === types.ZERO_HEX) ? types.ZERO_HEX : await this.getNewStateRoot(old_root)
+
+    const tx_tree: MerkleTree = await this.getBatchTransactions(old_root)
+      .then(transactions => new MerkleTree(types.treeConfig.txDepth, transactions))
+    await tx_tree.init()
+
+    const utxo_input: types.MerkleProofInput = {
+      leaf: utxo.commitment,
+      tree: utxo_tree
+    }
+    const tx_input: types.MerkleProofInput = {
+      leaf: utxo_tree.root(),
+      tree: tx_tree
+    }
+    const state_input: types.MerkleProofInput = {
+      leaf: new_root,
+      tree: hist_tree
+    }
+
+    const utxo_spendable: types.UTXO_Spendable_Struct = {
+      secret: utxo.secret,
+      amount: utxo.amount,
+      asset_type: utxo.asset_type,
+      oracle: await this.getBatchOracle(old_root),
+      old_root_proof: old_root,
+      merkle_proof: await this._generateMerkleProof(utxo_input, tx_input, state_input),
+      spend_in_same_batch: utxo.spend_in_same_batch
+    }
+
+    return utxo_spendable
+  }
+
+  async _generateUTXOSpendable(utxos?: types.UTXO_Commitment[]): Promise<types.UTXO_Spendable_Struct[]> {
+    const empty_utxo_spendable: types.UTXO_Spendable_Struct = {
+      secret: types.ZERO_HEX,
+      amount: types.ZERO_VALUE,
+      asset_type: types.ZERO_VALUE,
+      oracle: types.ZERO_VALUE,
+      old_root_proof: types.ZERO_VALUE,
+      merkle_proof: {
+        path_utxo: new Array(types.treeConfig.utxoDepth).fill(types.ZERO_HEX),
+        path_tx: new Array(types.treeConfig.txDepth).fill(types.ZERO_HEX),
+        path_historic: new Array(types.treeConfig.stateDepth).fill(types.ZERO_HEX),
+        index_utxo: types.ZERO_HEX,
+        index_tx: types.ZERO_HEX,
+        index_historic: types.ZERO_HEX
+      },
+      spend_in_same_batch: false
+    }
+    const utxo_spendable_empty_array: types.UTXO_Spendable_Struct[] = new Array(16).fill(empty_utxo_spendable)
+    if (!utxos) return utxo_spendable_empty_array;
+
+    const hist_tree: MerkleTree = await this.contracts.state.getValidRoots()
+      .then((roots: any) => new MerkleTree(types.treeConfig.stateDepth, roots))
+    await hist_tree.init()
+
+    let utxo_spendable_array: types.UTXO_Spendable_Struct[] = await Promise.all(
+      utxos.map(utxo => this._generateUTXOSpendableSingle(utxo, hist_tree))
+    )
+
+    utxo_spendable_array = utxo_spendable_array.concat(new Array(16 - utxos.length).fill(empty_utxo_spendable))
+
+    return utxo_spendable_array
+  }
+
+  async getBatchTransactions(old_root: string): Promise<string[]> {
+    const transactions: string[] = await this.contracts.state.queryFilter(
+      this.contracts.state.filters.TransactionPublish(undefined, old_root, undefined)
+    )
+      .then((events: any) => events.map((event: any) => event.args[0].utxo_root))
+    return transactions
+  }
+
+  async getBatchOracle(root: string): Promise<string> {
+    const index = await this.contracts.state.getValidRoots()
+      .then((roots: any) => roots.indexOf(root))
+    const oracle: string = await this.contracts.state.queryFilter(
+      this.contracts.state.filters.BatchPublish(index, undefined, undefined, undefined, undefined)
+    )
+      .then((events: any) => {
+        if (events.length === 0) return Promise.reject("No batch for this root");
+        else return events[0].args[3];
+      })
+    return oracle
+  }
+
+  async _generateTransactionDepositSignature(inputs: types.TransactionInputsRaw): Promise<types.Deposit> {
+    if (!this.config.signer) throw new Error("Signer not initialized");
+    const _domain: types.TypedDataDomain = {
+      name: "Momiji",
+      version: "1",
+      chainId: BigInt(1),
+      verifyingContract: await this.contracts.state.getAddress()
+    }
+    const _types: types.TypedDataTypes = {
+      DepositHash: [
+        { name: "pi_hash", type: "bytes32" }
+      ]
+    }
+    const _values: types.TypedDataValues = {
+      pi_hash: await keccak_tx_no_deposit(
+        inputs.current_root,
+        inputs.deposit_amount,
+        inputs.withdrawals,
+        inputs.utxo_spendable,
+        inputs.utxo_new,
+        inputs.contract_only_inputs
+      ).then(hash => zeroPadValue(hash, 32))
+    }
+    const deposit: types.Deposit = {
+      signature: (BigInt(inputs.deposit_amount) === BigInt(types.ZERO_HEX)) ? "0x00" : await this.config.signer.signTypedData(_domain, _types, _values),
+      pi_hash: inputs.contract_only_inputs.signature_hash
+    }
+    return deposit
+
+  }
+
+  async _generateTransactionContractInputs(inputs: types.TransactionInputsRaw): Promise<types.ContractTransaction> {
+    const formattedInputs = await this._generateFormattedTransactionInputs(inputs)
+    const deposit = await this._generateTransactionDepositSignature(inputs)
+    const contract_inputs: types.ContractTransaction = {
+      current_root: await this.contracts.state.histRoot(),
+      utxo_root: zeroPadValue(formattedInputs.public_inputs.utxo_root, 32),
+      price_limit: zeroPadValue(inputs.contract_only_inputs.price_limit, 32),
+      timestamp: zeroPadValue(inputs.contract_only_inputs.timestamp, 32),
+      deadline: zeroPadValue(inputs.contract_only_inputs.deadline, 32),
+      amount: zeroPadValue(formattedInputs.public_inputs.deposit_amount, 32),
+      encrypted_utxo: inputs.contract_only_inputs.encrypted_utxo
+        .map(utxo => {
+          return {
+            secret: zeroPadValue(utxo.secret, 32),
+            amount: zeroPadValue(utxo.amount, 32),
+            data: zeroPadValue(utxo.data, 32)
+          } as types.EncryptedUTXO
+        }),
+      withdrawals: inputs.withdrawals,
+      commitments_in: formattedInputs.public_inputs.commitment_in.map(c => zeroPadValue(c, 32)),
+      commitments: formattedInputs.public_inputs.commitment_out.map(c => zeroPadValue(c, 32)),
+      recipients: inputs.contract_only_inputs.recipients.map(r => zeroPadValue(r, 32)),
+      nullifier_hashes: formattedInputs.public_inputs.nullifier_hashes.map(hash => zeroPadValue(hash, 32)),
+      uids: inputs.contract_only_inputs.uids.map(uid => zeroPadValue(uid, 32)),
+      swap_amounts: inputs.contract_only_inputs.swap_amounts.map(swap => zeroPadValue(swap, 32)),
+      deposit: deposit
+    }
+    return contract_inputs
+  }
+
+  async _generateTransactionProofArtifacts(inputs: types.TransactionInputsRaw): Promise<types.ProofArtifacts> {
+    const formattedInputs: TransactionInputs = await create_transaction(
+      inputs.current_root,
+      inputs.deposit_amount,
+      inputs.withdrawals,
+      inputs.utxo_spendable,
+      inputs.utxo_new,
+      inputs.contract_only_inputs
+    )
+    const toml = json2toml(formattedInputs)
+    let proof_artifacts: types.ProofArtifacts;
+    let tx_proof = await this.noirs.transaction.execute(formattedInputs)
+      .then(w => this.backends.transaction.generateProof(w.witness)) 
+
+    let artifacts = await this.backends.transaction.generateRecursiveProofArtifacts(tx_proof, 1)
+
+    proof_artifacts = {
+      proofData: tx_proof,
+      proofAsFields: artifacts.proofAsFields,
+      vkAsFields: artifacts.vkAsFields,
+      vkHash: artifacts.vkHash
+    }
+    return proof_artifacts
+  }
+
+  async _generateTransactionProof(
+    utxo_commitments?: types.UTXO_Commitment[],
+    utxo_encrypted?: types.UTXO_Encrypted[],
+    withdrawals?: types.WithdrawalSwap[]
+  ): Promise<types.Transaction> {
+    const inputs: types.TransactionInputsRaw = await this._generateRawTransactionInputs(
+      utxo_commitments,
+      utxo_encrypted,
+      withdrawals
+    )
+    return {
+      public_inputs: await this._generateFormattedTransactionInputs(inputs).then(formatted => formatted.public_inputs),
+      contract_inputs: await this._generateTransactionContractInputs(inputs),
+      proof_artifacts: await this._generateTransactionProofArtifacts(inputs)
+    }
+  }
+
+  async _generateTransactionProofExpert(
+    deposit?: bigint,
+    utxo_commitments?: types.UTXO_Commitment[],
+    utxo_encrypted?: types.UTXO_Encrypted[],
+    withdrawals?: types.WithdrawalSwap[]
+  ): Promise<types.Transaction> {
+    const inputs: types.TransactionInputsRaw = await this._generateRawTransactionInputsExpert(
+      deposit,
+      utxo_commitments,
+      utxo_encrypted,
+      withdrawals
+    )
+    return {
+      public_inputs: await this._generateFormattedTransactionInputs(inputs).then(formatted => formatted.public_inputs),
+      contract_inputs: await this._generateTransactionContractInputs(inputs),
+      proof_artifacts: await this._generateTransactionProofArtifacts(inputs)
+    }
+  }
+
+  async generateTransactions(inputs: types.TransactionIO[]): Promise<types.Transaction[]> {
+    const transactions: types.Transaction[] = new Array(inputs.length)
+    for (let i = 0; i < inputs.length; i++) {
+      console.log(`Transaction proof ${i}`)
+      transactions[i] = await this._generateTransactionProof(
+        inputs[i].utxo_commitment,
+        inputs[i].utxo_encrypted,
+        inputs[i].withdrawal
+      )
+    }
+    return transactions
+  }
+
+  async wrapTransaction(transaction: types.Transaction, txProofArtifacts: types.ProofArtifacts): Promise<Verifier> {
+    const public_inputs_hash: string = await tx_as_hash(transaction.public_inputs)
+    const wrapperInputs: InputMap = {
+      public_inputs_hash: public_inputs_hash,
+      transaction_verifier: {
+        key_hash: txProofArtifacts.vkHash,
+        verification_key: txProofArtifacts.vkAsFields,
+        proof: txProofArtifacts.proofAsFields,
+      }
+    }
+    let tx_aggregation_object: string[]
+    let wrapperArtifacts: types.ProofArtifacts;
+    let wrapper_proof = await this.noirs.transaction_wrapper.execute(wrapperInputs)
+      .then((wrapper_witness: any) => this.backends.transaction_wrapper.generateProof(wrapper_witness.witness));
+
+    tx_aggregation_object = wrapper_proof.publicInputs.slice(1);
+    let artifacts = await this.backends.transaction_wrapper.generateRecursiveProofArtifacts(wrapper_proof, 17);
+    wrapperArtifacts = {
+      proofData: wrapper_proof,
+      proofAsFields: artifacts.proofAsFields,
+      vkAsFields: artifacts.vkAsFields,
+      vkHash: artifacts.vkHash
+    }
+
+    const txWrapperVerifier: Verifier = {
+      key_hash: wrapperArtifacts.vkHash,
+      proof: wrapperArtifacts.proofAsFields,
+      verification_key: wrapperArtifacts.vkAsFields,
+      aggregation_object: tx_aggregation_object
+    }
+    txWrapperVerifier.proof = tx_aggregation_object.concat(txWrapperVerifier.proof)
+    return txWrapperVerifier
+  }
+
+}
\ No newline at end of file
diff --git a/momiji-helpers/utils/transaction_circuits.ts b/momiji-helpers/utils/transaction_circuits.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ed90c6791de83f0edb28d7b8d68926f7abdb06d9
--- /dev/null
+++ b/momiji-helpers/utils/transaction_circuits.ts
@@ -0,0 +1,339 @@
+import { CompiledCircuit } from "@noir-lang/noir_js";
+export const transaction: CompiledCircuit = {
+    "abi": {
+        "parameters": [
+            {
+                "name": "public_inputs_hash",
+                "type": {
+                    "kind": "field"
+                },
+                "visibility": "public"
+            },
+            {
+                "name": "public_inputs",
+                "type": {
+                    "kind": "struct",
+                    "path": "helpers::structs::PublicInputs",
+                    "fields": [
+                        {
+                            "name": "current_root",
+                            "type": {
+                                "kind": "field"
+                            }
+                        },
+                        {
+                            "name": "utxo_root",
+                            "type": {
+                                "kind": "field"
+                            }
+                        },
+                        {
+                            "name": "deposit_amount",
+                            "type": {
+                                "kind": "field"
+                            }
+                        },
+                        {
+                            "name": "withdrawals",
+                            "type": {
+                                "kind": "field"
+                            }
+                        },
+                        {
+                            "name": "commitment_in",
+                            "type": {
+                                "kind": "array",
+                                "length": 16,
+                                "type": {
+                                    "kind": "field"
+                                }
+                            }
+                        },
+                        {
+                            "name": "commitment_out",
+                            "type": {
+                                "kind": "array",
+                                "length": 16,
+                                "type": {
+                                    "kind": "field"
+                                }
+                            }
+                        },
+                        {
+                            "name": "nullifier_hashes",
+                            "type": {
+                                "kind": "array",
+                                "length": 16,
+                                "type": {
+                                    "kind": "field"
+                                }
+                            }
+                        },
+                        {
+                            "name": "contract_only_inputs",
+                            "type": {
+                                "kind": "field"
+                            }
+                        }
+                    ]
+                },
+                "visibility": "private"
+            },
+            {
+                "name": "private_inputs",
+                "type": {
+                    "kind": "struct",
+                    "path": "helpers::structs::PrivateInputs",
+                    "fields": [
+                        {
+                            "name": "oracle",
+                            "type": {
+                                "kind": "array",
+                                "length": 16,
+                                "type": {
+                                    "kind": "field"
+                                }
+                            }
+                        },
+                        {
+                            "name": "old_root_proof",
+                            "type": {
+                                "kind": "array",
+                                "length": 16,
+                                "type": {
+                                    "kind": "field"
+                                }
+                            }
+                        },
+                        {
+                            "name": "secrets",
+                            "type": {
+                                "kind": "array",
+                                "length": 16,
+                                "type": {
+                                    "kind": "field"
+                                }
+                            }
+                        },
+                        {
+                            "name": "utxo_in",
+                            "type": {
+                                "kind": "array",
+                                "length": 16,
+                                "type": {
+                                    "kind": "struct",
+                                    "path": "helpers::structs::UTXO",
+                                    "fields": [
+                                        {
+                                            "name": "owner",
+                                            "type": {
+                                                "kind": "field"
+                                            }
+                                        },
+                                        {
+                                            "name": "amount",
+                                            "type": {
+                                                "kind": "field"
+                                            }
+                                        },
+                                        {
+                                            "name": "asset_type",
+                                            "type": {
+                                                "kind": "field"
+                                            }
+                                        }
+                                    ]
+                                }
+                            }
+                        },
+                        {
+                            "name": "merkle_proofs",
+                            "type": {
+                                "kind": "array",
+                                "length": 16,
+                                "type": {
+                                    "kind": "struct",
+                                    "path": "helpers::structs::MerkleProof",
+                                    "fields": [
+                                        {
+                                            "name": "path_utxo",
+                                            "type": {
+                                                "kind": "array",
+                                                "length": 4,
+                                                "type": {
+                                                    "kind": "field"
+                                                }
+                                            }
+                                        },
+                                        {
+                                            "name": "path_tx",
+                                            "type": {
+                                                "kind": "array",
+                                                "length": 4,
+                                                "type": {
+                                                    "kind": "field"
+                                                }
+                                            }
+                                        },
+                                        {
+                                            "name": "path_historic",
+                                            "type": {
+                                                "kind": "array",
+                                                "length": 20,
+                                                "type": {
+                                                    "kind": "field"
+                                                }
+                                            }
+                                        },
+                                        {
+                                            "name": "index_utxo",
+                                            "type": {
+                                                "kind": "field"
+                                            }
+                                        },
+                                        {
+                                            "name": "index_tx",
+                                            "type": {
+                                                "kind": "field"
+                                            }
+                                        },
+                                        {
+                                            "name": "index_historic",
+                                            "type": {
+                                                "kind": "field"
+                                            }
+                                        }
+                                    ]
+                                }
+                            }
+                        },
+                        {
+                            "name": "utxo_out",
+                            "type": {
+                                "kind": "array",
+                                "length": 16,
+                                "type": {
+                                    "kind": "struct",
+                                    "path": "helpers::structs::UTXO",
+                                    "fields": [
+                                        {
+                                            "name": "owner",
+                                            "type": {
+                                                "kind": "field"
+                                            }
+                                        },
+                                        {
+                                            "name": "amount",
+                                            "type": {
+                                                "kind": "field"
+                                            }
+                                        },
+                                        {
+                                            "name": "asset_type",
+                                            "type": {
+                                                "kind": "field"
+                                            }
+                                        }
+                                    ]
+                                }
+                            }
+                        }
+                    ]
+                },
+                "visibility": "private"
+            }
+        ],
+        "param_witnesses": {
+            "private_inputs": [
+                {
+                    "start": 54,
+                    "end": 694
+                }
+            ],
+            "public_inputs": [
+                {
+                    "start": 1,
+                    "end": 54
+                }
+            ],
+            "public_inputs_hash": [
+                {
+                    "start": 0,
+                    "end": 1
+                }
+            ]
+        },
+        "return_type": null,
+        "return_witnesses": []
+    },
+    "bytecode": "H4sIAAAAAAAA/+xdC5hNZdveBuNMSgdCk5wL+509hz2KolIplCIpas/MnqIoiqIIRdFR6ZwOOuqgUhSiKIqKDioRSaWoFEVR9L/vZ+1mzfr1Dde+7/09z/dZ17Wu+dal75l1P89z38+93vXuPWVCO483I6HQvMN3/u8y9qxoz+xQ8fUOe6Z5P8t6P8t5P8t7P9O9nxW8nxW9n5W8n5W9n1W8n1W9n9W8n9W9nzW8n/t4P2t6P/f1fu7n/azl/dzf+3mA9/NA7+dB3s/a3s863s+DvZ91vZ/1vJ/1vZ+HeD8zvJ+Hej8beD8P83429H428n429n428X429X428342934e7v08wvvZwvvZ0vvZyvsZ9n4a72em9zPi/czyfmZ7P90xPS1U4khcHuP9jIRzsrLiuZlxEzGxcGZefjQ7nJWdnxM1UZMdzS7MjEYi8WhWNDcvPy83nGeyInFTlJ0XKQrvPPyxwskdxt0rKFaYifl8YKyX/ZhNTiwrEo7FsqM50exYfszGNJlZWbG83Egskl8QyY5Gs/MKY9Gc3GhWfjzbhPOyIjnReLQoP6coNzPs+Oa4WCb0/48ygRyEkzvMy8Ba+e/3lbRd3D/qplmJ8N80Ku6MNCxJGbhnpMFrFE4Mm8T9dg8Vi9lMspghcz4rjdu3yd5fkY0xKw0ft1FdrIij+9b1EAN347qpGV7h5A4DrI9BYk7wPoE3wXs//1/1/hHdE41IXGhG5gJCo14l4G6uhAvA+pjmBC6U9eIVeRw43/t5QaiYE7PJM7E8MNYcpWZ3DsnsvqbN7LpEvEYwu68LN7sO9+sEs8u411nevaJFfS6QBIlUorFPtTHmEupUzoszz8Z+w55v2nN+2k6xdRjSvH8r47t+I3D9ZuB6vq9GrDyge6AFabCXBd/nPICexIt2Hm8Ataml8Px5mAvfxOUvbz4wf61SlL9wcocB8sQAe8a0SpExl8DfRKwF5IWYcHKHcTo9j6DVb6Vha83AvYCA+23huO+0Md4i4I4IX3hzD6pvE3BnKfEkC4E6BKy1yRLeN44vjL7JVcAXhk5ElfBlEZAvwFqbKHHR22mEW9hblFa8wPdOWqjEgfZayOebdxV4rTcInHpPgdd6l4B7sXDcd9kY7xFwHyl8djjNWEzAfZSS2bEEqEPAWpujhPeN4wujb45WwBeGThyjhC/vA/kCrLU5hui1lnge6/20Yq/1QVqoxIH2Woh11USsDxV4rTcJnPpIgdf6kIB7qXDcd9sYHxFwHyt8djjNWErAfZyS2fExUIeAtTbHCe8bxxdG35yggC8MnThRCV8+AfIFWGtzItFrfex5rE/Sir3Wp2mhEgfaayHfOy9T4LXmEzj1mQKvtYyAe7lw3PfYGJ8RcJ8sfHY4zVhOwH2KktmxAqhDwFqbU4T3jeMLo2+6KOALQydOVcKXz4F8AdbanEr0Wis8j/V5WrHXWplW/O/oHnsxxN1zu8rG/sKeq+35ZVrJPber0kruqf0icL06cP1lGm/PbSIPaK6droRrqwB+O7Hn9gugdz9DyZ7b1bj85X0JzF83JXtugTwxwJ4xrPyhn5dXAXtmjYLn5VUErf5KwfPyGgLur4XjvtfG+IqA+yzh/t/5vq8JuHsq8STfAHUIWGvTU3jfOL4w+qaXAr4wdKK3Er6sBfIFWGvTm/i8/I33nLw2rfh5+du0UIkD7bWQzzffKfBaXxA4tU6B1/qOgHu9cNz32RjrCLhjwmeH04z1BNz5SmbH90AdAtba5AvvG8cXRt/EFfCFoRNFSvjyA5AvwFqbIqLX+t7zWD+kFXutH9NCJQ6010KsqyZibVDgtVYTOPWTAq+1gYD7Z+G477cxfiLg7iN8djjN+JmAu6+S2bERqEPAWpu+wvvG8YXRN/0U8IWhE/2V8GUTkC/AWpv+RK+10fNYm9KKvdYvaaESB9prId87/6rAa31J4NRmBV7rVwLuLcJxT7QxNhNwDxA+O5xmbCHgHqhkdvwG1CFgrc1A4X3j+MLom0EK+MLQicFK+PI7kC/AWpvBRK/1m+exfk8r9lpbvR7w/3dbvX/PCRX/d9u8f0T3ofsdu9qPmhkvioVtOSP5sXwTy42bXFMUieSawmi4MD8rFi7KjOVH4zmFRZEsk5kVK4hEsgrzi8LZOeGsvHA0bpDfAxzMzzYvPx18+fkjjbd3+aUQZ+9yLS/Onzb2dofJnn+532PJVsaeafYsa89y9ixvz3R7VrBnRXtWsmdle1axZ1V7VrNndXvWKFty7/OfaSX3Nm8PXO8IXP8VuP7XvfiuywSu0wLXZQPX5QLX5QPX6YHrCoHrioHrSoHryoHrKoHrqoHraoHr6oHrGmV5e78TfYTW/CFKNP9PwHNfYu/3duAz5FAle7934PKX9xcwf1fqyJ9xATGx4qZMWVz+rlKRvwKTBstf1JQF5m+YivyFTTlU/uJhUx6Yv+Ea8lcQNumo/EXDpgIwf1dryJ/1HxVB+YvbWJWA+RuhIH8FFnNlUP6iNlYVYP5GKsifDW2qYvIXd7GqAfM3Sn7+Chzm6pj8RV2sGsD8XaPks3/A5yTjf2ZINn/XKskf0Oebq4D5G60kf0CfaoYD8zdGSf6APsuMAObvOiX5A/oEMwqYv+uV5A8458y1wPyNVZI/oE6bMcD8jVOSP6DOmOuB+btBSf6APDHAnjGs/KUF8idh/T4Ra5+yuPy5GIz9S4l3Z8gc1iyLrTUD9z5l8bj3FY77ARujJgH3g8L3obj35vsScD+k5J3kfkAdAtbaPCS8bxxfGH3ziAK+MHTiUSV8qQXkC7DWBpm/4H4jpxFun1GtssX7jfYvGypxoL0Wcn/DAQq81naC1zpQgdc6gKAlBwnH/aCNcSAB9xPCZ4fTjIMIuJ9UMjtqA3UIWGvzpPC+cXxh9M3TCvjC0IlnlPClDpAvwFqbZ4heq7bnser4vNbBZK+F2FeZiFVXgdfaQfBa9RR4rboELakvHPdDNkY9Au7nhM8Opxn1CbifVzI7DgHqELDW5nnhffNQiNM3LyrgC0MnXlLClwwgX4C1Ni8RvdYhnsfK8HmtQ8leC/m5kwYKvNZfBK91mAKv1YCgJQ2F437YxjiMgPtl4bPDaUZDAu5XlMyORkAdAtbavCK8bxxfGH0zSwFfGDrxqhK+NAbyBVhr8yrRazXyPFZjn9dqQvZaiM+7JmI1VeC1QgRONVPgtZoScDcXjnuSjdGMgPs14bPDaUZzAu7XlcyOw4E6BKy1eV143zi+MPrmDQV8YejEm0r4cgSQL8BamzeJXutwz2Md4fNaLcheC/l9IC0VeK0yBE61UuC1WhJwh4XjfsTGaEXA/Zbw2eE0I0zA/baS2WGAOgSstXlbeN84vjD65h0FfGHoxLtK+JIJ5Auw1uZdotcynsfK9HmtCNlrpQG9VpYCr5VG4FS2Aq+VRcCdIxz3ozZGNgH3EuGzw2lGDgH3+0pmRy5Qh4C1Nu8L7xvHF0bffKSALwydWKqEL1EgX4C1NkuJXivX81hRn9fKI3st5Pe0tlbgtcoSOHWkAq/VmoD7KOG4H7MxjiTg/lT47HCacRQB9zIls6MNUIeAtTbLhPeN4wujb1Yo4AtDJz5Xwpe2QL4Aa20+J3qtNp7HauvzWkeTvVY5oNc6RoHXKkfgVDsFXusYAu72wnE/bmO0I+D+QvjscJrRnoB7tZLZcSxQh4C1NquF943jC6NvvlLAF4ZOfK2EL8cB+QKstfma6LWO9TzWcT6vdTzZayH/fk4HBV6rPIFTJyjwWh0IuE8UjvsJG+MEAu5vhc8OpxknEnB/p2R2nATUIWCtzXfC+8bxhdE33yvgC0MnflDCl45AvgBrbX4geq2TPI/V0ee1TiZ7rXSg1zpFgddKJ3CqkwKvdQoBd2fhuJ+0MToRcP8kfHY4zehMwP2zktnRBahDwFqbn4X3jeMLo29+UcAXhk78qoQvpwL5Aqy1+ZXotbp4HutUn9c6jey1kH/XuKsCr1WBwKnTFXitrgTcZwjHPdnGOJ2A+zfhs8NpxhkE3L8rmR3dgDoErLX5XXjfOL4w+uYPBXxh6MSfSvjSHcgXYK3Nn0Sv1c3zWN19XutMsteqCPRaPRR4rYoETp2lwGv1IODuKRz3UzbGWQTcfwmfHU4zehJwh+rpmB1nA3UIWGuDzh+DL4y+KSsct+MLQyfKKeHLOUC+AGttkPkLeq2zPY91js9r9SJ7rUpAr9VbgdeqRODUuQq8Vm8C7vOE437axjiXgLuC8NnhNOM8Au6KSmZHDKhDwFqbisL7xvGF0TdVFPCFoRNVlfAlH8gXYK1NVaLXinkeK9/ntQrIXqsy0GsVKvBalQmciivwWoUE3EXCcT9jY8QJuGsInx1OM4oIuPdRMjvOB+oQsNZmH+F94/jC6Jv9FPCFoRO1lPDlAiBfgLU2tYhe63zPY13g81p9yF6rCtBr9VXgtaoQOHWhAq/Vl4D7IuG4n7UxLiTgPlD47HCacREB90FKZkc/oA4Ba20OEt43ji+MvjlYAV8YOlFXCV/6A/kCrLWpS/Ra/TyP1d/ntS4me62qQK91iQKvVZXAqQEKvNYlBNwDheOeYmMMIOA+RPjscJoxkIA7Q8nsuBSoQ8BamwzhfeP4wuibwxTwhaETDZXw5TIgX4C1Ng2JXutSz2Nd5vNag8heqxrQaw1W4LWqETh1uQKvNZiA+wrhuJ+zMS4n4G4ifHY4zbiCgLupktkxBKhDwFqbpsL7xvGF0TeHK+ALQyeOUMKXoUC+AGttjiB6rSGexxrq81pXkr1WdaDXukqB16pO4NQwBV7rKgLu4cJxP29jDCPgbiV8djjNGE7AHVYyO64G6hCw1iYsvG8cXxh9E1HAF4ZOZCnhywggX4C1NllEr3W157FG+LzWSLLXqgH0WqMUeK0aBE5do8BrjSLgvlY47hdsjGsIuHOFzw6nGdcScEeVzI7RQB0C1tpEhfeN4wujb45UwBeGThylhC9jgHwB1tocRfRaoz2PNcbnta7zEovuAxfPzWB03KOF88phvo7Aq2NIvEoD4wfWx6QKc7K1eT0NF+t64c8TsyzW6wn9PZbsq5P+W2M2xlgC7mOF69nsNA7u45ToGbA+Bok5PbTTE5UJ/f8D3QPnh7CeJHGMK7uL+0fdNCsR48ri494AXJBi4b6hLLxG1KGMzOmNwKH830DcmzQS9yYCcW9WQNybScRlOMsbCU7jlrI6BAvZS7eCBcsdgZcyu8xBOLnDlA3JFD8/ZnTflyXdZwh6n5klBsB4x1N0IhxRbyWIVRmvUcf7xIV172jxug0oXuke7lQ4D2RTp/nu83avPyYwGtAle7ySaenu8zZCw90h/P2ma4A7CLjvLIsXHBdzRIhDsAmkPNxFyMNdvjwkjrKEvtjNWKaUfw9PADqxu4XzydWB0UcnkNc1ETp3NwH3iUrWNYH1MSeC1zXTQrt+2gjtYQ5KqZXxx2TMKVROkslBKbdZwtXf41/WQSfkDsJguWcX61DojQLIwXIPcLDcWxZGBMpgcfW+lyCw9xH66L7dMCjJ3jfSVCD76P49yGdpv4vVR/cT+mgioY8men307560/1eWzNJ8mB/wyPSglgHDur8HCI38EKGRHyI+ubo8PEjIw8OEPDycgidXFoGTzeckkoNF5+8BoEF7EDhYH1GgR5MIPDxZwZP/IwTcpyh58gfWx5yy98k/eOyJHpV6JJODUm6zxJP/o9qe/B9NwZM/crA8Chwsjyl48n+MILCPE/ro8RQ8+SNNBbKPnlDw5P8EoY+eJPTRk74n/38aYlqWmPcOxFBosraBOHk3BmI4uaNEwyGHa7KxuqToM4el/F9LNQGTgZifAu7w8+dP4i5Wx5enCIPgaQIPn07BihHyVQLSnJym5LO/SB4+A+ThacI/C+Z4+AyBh88SePjsLniYBr7v8cA+mgLso1Ru9ESuEqf57vM5j/TPszZ6TvFZdBQARoIT94om3QvCl6ddA7xAwD2VIDZTia/Lnifl4UVCHl5Mgfl5Drgq9zxQwF8SzqdJpD46XfjrHof5JQLuM5S87gHWx5yx93VP8NgTPSr1SCYHpdxmidWtaczVrRcIg2VaCl73IAfLNOBgmS78dY+r93SCwL5M6KOXU/C6B2kqkH30ivDXPa6PXiH00QxCH83YjY2eWj5SOdMjwCwtQ4F1fzMJzfcqofleJT5tujzMIuRhNiEPs1PwtDkTaApmAcV8jnA+uTownjbPVPC0OYeAu4eSp01gfUyPvU+bwWNP9KjUI5kclHKbJZ42X9P2tPlaCp42kYPlNeBgeV3B0+brBIGdS+ijuSl42kSaCmQfzVPwtDmP0EdvEProjf/A5kLWsubegRgKvaltIL65GwMxnNxRouGQwzXZWGcr2Vz4JhDzfOBmlLOFby50fJlPGAQLCDxckIIVD+TyNdKc9FKyuRDJw7eAPOwlfHOh4+FbBB6+TeDh28QV2NtI+zQWCl8xdN+guZCAW8vX//YFxlrkx2xyYlmRcCyWHc2JZsfyYzamyczKiuXlRmKR/IJIdjSanVcYi+bkRrPy49kmnJcVyYnGo0X5OUW5mSn9QwOLwFxNHO+UVfZ95S4R75TFx30XOJxYuN8tC6/R338JK3G/Z4aK/wLWe4HHaTSxkTlfXJbbt8neXx8bYzFBxM8Vbl5cDzFwn6fktQ+wPgaJOcH7BN4E7/38X+LxH90TjUlcKBD+CtRhXkLAXaiEC8D6mEICFxLjro/Hgb7ezwtDxZx4nzwT04GxPlBqdj8gmd0PtZldl4gPCWb3I+Fm1+H+iGB2Gfe62LtXtKgvBZIgIVLwOtkYSwl1KufF+djG/sSen9pzWdmdYptYafq4bPEGU3f9SeD608D1Ml+NWHlA98D5SlZ2PwboSbxo5/EJUJsuEJ4/D3Php7j85S0D5q+PjDd8pR0GyBMD7BnTJ0XGXAJ/E7E+Iy/EhJM7jNPpjwlavVz4WwSH+zMC7hXCcU+zMZYTcPcTvvDmHlRXEHD3V+JJPgfqELDWpr/wvnF8YfTNAAV8YejEQCV8WQnkC7DWZiBx0dtphFvYW1m2eIFvFXmBD/l884UCr/UJgVOrFXitLwi4vxSOe7qNsZqAe5Dw2eE040sC7sFKZscaoA4Ba20GC+8bxxdG3wxRwBeGTgxVwpevgHwB1toMJXqtNZ7H+srntb4me61PgV7rGwVe61MCp9Yq8FrfEHB/Kxz3yzbGWgLuYcJnh9OMbwm4hyuZHd8BdQhYazNceN84vjD6ZqQCvjB0YpQSvqwD8gVYazOK6LW+8zzWOp/XWk/2Wsj3zt8r8FrLCJz6QYHX+p6A+0fhuF+xMX4g4B4tfHY4zfiRgHuMktmxAahDwFqbMcL7xvGF0TdjFfCFoRPjlPDlJyBfgLU244hea4PnsX7yea2fyxb/O7rHPgxx99xutLE32fMXe/4a2HO7MbCndlPg+pfA9a/EPbeJPKC5dpMSrm0E7rndBPTuNyvZc/sLcM/tr8D83aJkzy2QJwbYM4aVP/Tz8kZgz2xW8Ly8kaDVWxQ8L28m4P5NOO4ZNsYWAu7bhft/5/t+I+CeoMST/A7UIWCtzQThfeP4wuibuxTwhaETdyvhy1YgX4C1NncTn5d/956Tt/qel7eR300gn2/+UOC1NhE49acCr/UHAfd24bhn2hh/EnDfJ3x2OM3YTsB9v5LZsQOoQ8Bam/uF943jC6NvHlTAF4ZOPKSEL38B+QKstXmI6LV2eB7rL5/XCpULlTjQXusXoNcqU06+1/qFwKm0cvK9lqsNGndZ4bhnOb4QcD8ifHY4zShLwP2oktlRDqhDwFqbR4X3jeMLo2+eUMAXhk48qYQv5YF8AdbaPEn0Wk4jnMcqX67Ya6WTvRbyvXMFBV7rV4LXqqjAa1UgaEkl4bhfdfwi4H5a+OxwmlGJgPsZJbOjMlCHgLU2zwjvG8cXRt88p4AvDJ14XglfqgD5Aqy1eZ7otSp7HquKz2tV9XrA/99V9f49N1T831XzPBm6D93v2NV+1Mx4USxsyxnJj+WbWG7c5JqiSCTXFEbDhflZsXBRZiw/Gs8pLIpkmcysWEEkklWYXxTOzgln5YWjcYP8HuBgfqp5+TnBl5/q5Xh7lz8KcfYu1/Li1LD3vo89a9pzX3vuZ89a9tzfngfY80B7HmTP2vasY8+D7VnXnvXsWd+eh9gzw56H2rNBuZJ7n2uUK7m3eZ/Adc3A9b6B6/0C17UC1/sHrg8IXB8YuD4ocF07cF0ncH1w4Lpu4Lpe4Lp+4PqQwHVG4PrQwHWDcry934k+Qmv+i0o0v0a55GMl9n7vUw53Xy8p2ftdE5e/vH2B+ZumI39mP1j+4qYWMH/TVeSvwOwPy1/UHADM38sq8hc2B6LyFw+bg4D5e0VD/grCpjYqf9GwqQPM3wwN+bP+42BQ/uI2Vl1g/mYqyF+BxVwPlL+ojVUfmL9ZCvJnQ5tDMPmLu1gZwPy9Kj9/BQ7zoZj8RV2sBsD8zVby2T/gc5LxPzMkm785SvIH9PlmOjB/rynJH9CnmleA+XtdSf6APsvMBOZvrpL8AX2CeRWYv3lK8gecc2YOMH9vKMkfUKfN68D8vakkf0CdMfOA+ZuvJH9AnhhgzxhW/tIC+ZOwfp+IdZiCfVs1CO/nGyrYt3UYAXcj4bhn2xgNCbg/E74Pxb03b0TAvVzJO8nGQB0C1tosF943ji+MvlmpgC8MnVilhC9NgHwB1tog8xfcb9TY22/UpFzxfqOm5D3yyP0NzRR4rX0InGquwGs1I+A+XDjuOTZGcwLuL4XPDqcZhxNwr1EyO44A6hCw1maN8L5xfGH0zTcK+MLQibVK+NICyBdgrc1aotc6wvNYLXxeqyXZa9UEeq1WCrxWTQKnwgq8VisCbiMc92suBgH3OuGzw2mGIeBer2R2ZAJ1CFhrs1543zi+MPrmRwV8YejEBiV8iQD5Aqy12UD0Wpmex4r4vFYW2WshP3eSrcBr7UvgVI4Cr5VNwJ0rHPfrNkYOAfdG4bPDaUYuAfcmJbMjCtQhYK3NJuF983qI0zebFfCFoRNblPAlD8gXYK3NFqLXinoeK8/ntVqTvdZ+QK91pAKvtR+BU0cp8FpHEnC3EY57ro1xFAH3VuGzw2lGGwLubUpmR1ugDgFrbbYJ7xvHF0bfbFfAF4ZO7FDCl6OBfAHW2uwgeq22nsc62ue1jiF7LeT3gbRT4LVqETjVXoHXakfAfaxw3PNsjPYE3GXqy8btNONYAu60+jpmx3FAHQLW2qQJ7xvHF0bflFfAF4ZOpCvhy/FAvgBrbZD5C3qt4zyPdbzPa3Uge639gV7rBAVea38Cp05U4LVOIOA+STjuN2yMEwm4KwmfHU4zTiLgrqxkdnQE6hCw1qay8L5xfGH0TTUFfGHoRHUlfDkZyBdgrU11otfq6Hmsk31e6xSy10J+T2snBV7rAAKnOivwWp0IuLsIx/2mjdGZgLum8NnhNKMLAfe+SmbHqUAdAtba7Cu8bxxfGH2zvwK+MHTiACV8OQ3IF2CtzQFEr3Wq57FO83mtrmSvdSDQa52uwGsdSODUGQq81ukE3N2E455vY5xBwF1b+OxwmtGNgLuOktnRHahDwFqbOsL7xvGF0Tf1FPCFoRP1lfDlTCBfgLU29Yleq7vnsc70ea0eZK+F/Ps5ZynwWgcRONVTgdc6i4D7bOG4F9gYPQm4DxU+O5xmnE3A3UDJ7DgHqEPAWpsGwvvG8YXRN40U8IWhE42V8KUXkC/AWpvGRK91juexevm8Vm+y16oN9FrnKvBatQmcOk+B1zqXgDsmHPdbNsZ5BNzNhM8OpxkxAu7mSmZHPlCHgLU2zYX3jeMLo29aKOALQydaKuFLAZAvwFqblkSvle95rAKf1yokey3k3zWOK/BadQicKlLgteIE3OcLx/22jVFEwG2Ezw6nGecTcGcqmR0XAHUIWGuTKbxvHF8YfZOtgC8MnchRwpc+QL4Aa21yiF7rAs9j9fF5rb5kr3Uw0GtdqMBrHUzg1EUKvNaFBNz9hONeaGNcRMCdJ3x2OM3oR8DdWsns6A/UIWCtTWvhfeP4wuibNgr4wtCJtkr4cjGQL8Bam7ZEr9Xf81gX+7zWJWSvVRfotQYo8Fp1CZwaqMBrDSDgvlQ47kU2xkAC7nbCZ4fTjEsJuNsrmR2XAXUIWGvTXnjfOL4w+uZ4BXxh6EQHJXwZBOQLsNamA9FrXeZ5rEE+rzWY7LXqAb3W5Qq8Vj0Cp65Q4LUuJ+AeIhz3OzbGFQTcJwmfHU4zhhBwd1QyO4YCdQhYa9NReN84vjD6ppMCvjB0orMSvlwJ5Auw1qYz0WsN9TzWlT6vdRXZa9UHeq1hCrxWfQKnhivwWsMIuK8WjvtdG2M4AfdpwmeH04yrCbi7KpkdI4A6BKy16Sq8bxxfGH3TTQFfGDrRXQlfRgL5Aqy16U70WiM8jzXS57VGkb3WIUCvdY0Cr3UIgVPXKvBa1xBwjxaO+z0b41oC7rOEzw6nGaMZ322iZHaMAeoQsNamp/C+cXxh9E0vBXxh6ERvJXy5DsgXYK1Nb6LXGuN5rOt8Xut6stfKAHqtsQq8VgaBU+MUeK2xBNw3CMe92MYYx/iuC+Gzw2nGDQTc+Upmx41AHQLW2uQL7xvHF0bfxBXwhaETRUr4chOQL8BamyKi17rR81g3+bzWzWSvdSjQa92iwGsdSuDUrQq81i0E3OOF415iY9xKwN1H+OxwmjGegLuvktlxG1CHgLU2fYX3jeMLo2/6KeALQyf6K+HL7UC+AGtt+hO91m2ex7rd57UmkL1WA6DXukOB12pA4NSdCrzWHQTcdwnH/b6NcScB9wDhs8Npxl2Mz9sqmR13A3UIWGszUHjfOL4w+maQAr4wdGKwEr7cA+QLsNZmMNFr3e15rHt8Xutez2uh+8DFczMY/tk04bxymO8l8GooiVdpYPzA+phUYU62Nh+VxcW6T/jzxGKL9T5Cf99P9tXJ3l+6jXE/Afcw6f6oLAf3cCV6BqyPQWJ2/VjWV2//Af9+sBDWkySOieV2cf+om2YlYmI5fNwHgAtSLNwPlIPXiDqUkTl9EDiU/xuI+5BG4j5EIO7DCoj7MIm4DGf5IMFpTCqnQ7CQvfQIWLDcUfbfYA8nd5gZaTvjo+LNsvEmlZUtqJryGMLeZwkeYWNnlhhUjzo9QTeBE5RHCKJaxmuIR30iyLp3tMg+BhTZdA+3v5D/q0RJ8+Xgca/nnmA0tSvgo0qcgrvPxwhN/KTwd7uuAZ4k4J5cDi9iLuYILyY6D0+Q8vAUIQ9PEfPg9MYJGToPI4WvSf6Tu0sW9ygl7y6fBrp7YK1NqvIXTu74l47uZixTyr+HnwA+tT0jfP44zX2a8b0MZL1B+IJnCLjHKHkHAqyPGQN+B5IWKrkyETx293eVUivjj8nwdaicJJODUm6zxJP1s/4lYIbQgGL9bcSe3cWaNXowIwfLs8DBMqUcjAi0wTKFILDPEfroOZ+hZ/UR0lQg++j5Pchnab+L1UfPE/roBUIfveD1kebVLsnL62m+fE71FrZe1DK0WPc3lUCOlwjkeIm4auLy8CIhD9MIeZi2G8MmnNyBJF2J1YSkvzFIyWrMdOBqDHAFxYxVshozFWiaXwSanZcV6Pl0go7doGA15mUC7huVrMYA62Nu3LsaEzz2RI9KPZLJQSm3WWI15hVtqzGvpGA1BjlYXgEOlhkKVmNmEAR2JqGPZqZgNQZpKpB9NEvBaswsQh+9SuijV32rMf80xLQs++8diKHQbG0DcfZuDMRwckeJhkMO16S/r07Gk2qpJmA2EPMc4KrBLcBVFxZf5hAGwWsEHr6WghU35OsdpDkZr2TFDcnD14E8HC9835zj4esEHs4l8HDuLniYBr7vR4F9NA/8iZvgK8HEge4J4Op1iVdub3iv3N5kbVafV674l6EAMBKcuFc06eYLX552DTCfgHsBQWwWEF83vknKw1uEPLyVAvPzBnBV7k2ggL8tnE/TSX10u/DXPQ7z2wTcE5S87gHWx0zY+7oneOyJHpV6JJODUm6zxOrWQubq1nzCYFmYgtc9yMGyEDhYFgl/3ePqvYggsO8Q+uidFLzuQZoKZB+9K/x1j+ujdwl99B6hj977N5tvEwc6P8BP7ZV40l7sPQgv0TIUWPe3mNB87xOa733i06bLwxJCHj4g5OGDFDxtLgaagiVAMf9QOJ+eJj1t3qXgafNDAu67lTxtAutj7t77tBk89kSPSj2SyUEpt1niafMjbU+bH6XgaRM5WD4CDpalCp42lxIE9mNCH32cgqdNpKlA9tEnCp42PyH00aeEPvr0P7C5kLWsuXcghkLLtA3EZSnYXPhGOc5wTfoPKijZXLgMiPkz4GaU+4RvLnR8+YwwCJYTeLg8BSseyOVrpDmZqGRzIZKHK4A8nCh8c6Hj4QoCDz8n8PBz4grsY6SVs5XCVwzdNwuvJODW8vXt/YCxVvkxm5xYViQci2VHc6LZsfyYjWkys7JiebmRWCS/IJIdjWbnFcaiObnRrPx4tgnnZUVyovFoUX5OUW5mSv9QzCowVxPHF7vwr7CbZiXii3L4uKuBw4mFe3U5eI3+/kuGifvtESr+C4Zf+n6fO9DERuZ8TTlu3yZ7fxfZGGsIIv6gcPPieoiB+yElr32A9TFIzAneJ/AmeO/n/1ce/9E90YTEhUeEvwJ1mL8i4H5UCReA9TGPEriQeOC9yONAP+9n/1AxJ74mz8QKwFjfKDW735DM7lptZtclYi3B7H4r3Ow63N8SzC7jXtd494oW9e8ImxrR2H+2Mb4j1CkRcp39H+vt+b09fyi3U2wTK03ryhVvMHXX6wPX3weuf/DViJUHdA88oWRldx1AT+JFO4/1QG16Unj+PMyF3+Pyl/cDMH+TlXzRJZAnBtgzZnKKjLkE/iZi/UheiAkndxin0+sIWr1B+FsEh/tHAu6fhONeamNsIOB+VvjCm3tQ/YmAe4oST/IzUIeAtTZThPeN4wujb15QwBeGTkxVwpeNQL4Aa22mEhe9nUa4hb2N5YoX+DaRF/iQzze/KPBa6wmc+lWB1/qFgHuzcNwf2xi/EnBPEz47nGZsJuCermR2bAHqELDWZrrwvnF8YfTNDAV8YejETCV8+Q3IF2CtzUyi19rieazffF7rd7LX+h7otbYq8FrfEzi1TYHX2krA/Ydw3J/YGNsIuGcLnx1OM/4g4J6jZHb8CdQhYK3NHOF94/jC6Ju5CvjC0Il5SviyHcgXYK3NPKLX+tPzWNt9XmsH2Wsh3zv/pcBr/UDgVKi8fK/1FwF3GeG4P3VByhO+E0n47HCaUYaAe4GS2ZGG60sDrLVZILxvHF8YfbNQAV8YOrFICV/KAvkCrLVZRPRaTiOcxypbvthrlStf/O/oHtsY4u65LW/vPd2eFexZsXzJPbfly5fcU5seuK4QuK5YnrfnNpEHNNfeU8K18uWTj5XYc5teHndfi5Xsua2Ay19eRWD+lijZcwvkiQH2jGHlD/28XB7YM5WAc9fFYDw3lif4osoKnpcrEXBXEY57mY1RmYD7I+H+3/m+KgTcS5V4kqpAHQLW2iwV3jeOL4y++VQBXxg6sUwJX6oB+QKstVlGfF6u6j0nV/M9L1cvHypxoL0W8vmmhgKvlU7g1D4KvFYNAu6awnF/ZmPsQ8C9QvjscJpRk4D7cyWzY1+gDgFrbT4X3jeOL4y++UIBXxg6sVoJX/YD8gVYa7Oa6LX29TzWfj6vVYvstSoAvdb+CrxWBQKnDlDgtfYn4D5QOO7lNsYBBNxfCZ8dTjMOJOD+WsnsOAioQ8Bam6+F943jC6NvvlXAF4ZOfKeEL7WBfAHW2nxH9FoHeR6rts9r1SF7LeR754MVeK2KBE7VVeC1Dibgricc9woboy4B9/fCZ4fTjHoE3D8omR31gToErLX5QXjfOL4w+uYnBXxh6MTPSvhyCJAvwFqbn4leq77nsQ7xea0Mrwf8/12G9+/RUPF/d6jnydB96H7HrvajZsaLYmFbzkh+LN/EcuMm1xRFIrmmMBouzM+KhYsyY/nReE5hUSTLZGbFCiKRrML8onB2TjgrLxyNG+T3AAfzc6iXnxN9+WlA3Lu8KcTZu1zLi3OYvfeG9mxkz8b2bGLPpvZsZs/m9jzcnkfYs4U9W9qzlT3D9jT2zLRnxJ5Z9sy2Z05g7/Nhgb3NDQPXjQLXjQPXTQLXTQPXzQLXzQPXhweujwhctwhctwxctwpchwPXJnCdGbiOBK6zAtfZgesc4t7vRB+hNf8XJZp/GHDvd0PgM+SvSvZ+NwLu/W4MzN9mHfkzTWD5i5umwPxtUZG/AtMMlr+oaQ7M328q8hc2h6PyFw+bI4D5+11D/grCpgUqf9GwaQnM31YN+bP+oxUof3EbKwzM3zYF+SuwmA0of1EbKxOYvz8U5M+GNhFM/uIuVhYwf3/Kz1+Bw5yNyV/UxcoB5m+7ks/+AZ+TjP+ZIdn87VCSP6DPN1uA+ftLSf6APtX8Dsxf6BAd+QP6LLMNmL8ySvIH9AnmT2D+0pTkDzjnzA5g/soqyR9Qp41fs5LNXzkl+QPqjEkD5q+8kvwBeWKAPWNY+UsL5E/C+n0iVq6CfVuHEd7PRxXs28ol4M4TjvtzGyNKwF37ENm43XvzPALuOimaCcneZ2ugDgFrbeoI7xvHF0bf1FPAF4ZO1FfClyOBfAHW2iDzF9xv1Nrbb3Rk+eL9RkeR98gj9ze0UeC1GhI41VaB12pDwH20cNwrbYy2BNyHCp8dTjOOJuBuoGR2HAPUIWCtTQPhfeP4wuibRgr4wtCJxkr40g7IF2CtTWOi1zrG81jtfF6rPdlrNQJ6rWMVeK1GBE4dp8BrHUvAfbxw3KtsjOMIuJsJnx1OM44n4G6uZHZ0AOoQsNamufC+cXxh9E0LBXxh6ERLJXw5AcgXYK1NS6LX6uB5rBN8XutEstdCfu7kJAVeqzGBUx0VeK2TCLhPFo77CxujIwG3ET47nGacTMCdqWR2nALUIWCtTabwvnF8YfRNtgK+MHQiRwlfOgH5Aqy1ySF6rVM8j9XJ57U6k71WE6DX6qLAazUhcOpUBV6rCwH3acJxr7YxTmXsUxM+O5xmnEbA3VrJ7OgK1CFgrU1r4X2zOsTpmzYK+MLQibZK+HI6kC/AWpu2RK/V1fNYp/u81hlkr4X8PpBuCrxWUwKnuivwWt0IuM8UjvtLG6M7AXc74bPDacaZBNztlcyOHkAdAtbatBfeN44vjL45XgFfGDrRQQlfzgLyBVhr04HotXp4Hussn9fqSfZazYBe62wFXqsZgVPnKPBaZxNw9xKOe42NcQ4B90nCZ4fTjF6Md+VKZkdvoA4Ba206Cu8bxxdG33RSwBeGTnRWwpdzgXwB1tp0Jnqt3p7HOtfntc4jey3k97TGFHit5gRO5SvwWjEC7gLhuL+yMfIZ706Fzw6nGQUE3F2VzI5CoA4Ba226Cu8bxxdG33RTwBeGTnRXwpc4kC/AWpvuRK9V6HmsuM9rFZG91uFAr3W+Aq91OIFTFyjwWucTcPcRjvtrG+MCAu6zhM8Opxl9CLh7KpkdfYE6BKy16Sm8bxxfGH3TSwFfGDrRWwlfLgTyBVhr05votfp6HutCn9e6iOy1kH8/p58Cr3UEgVP9FXitfgTcFwvH/Y2N0Z+AOyZ8djjNuJixfqtkdlwC1CFgrU2+8L5xfGH0TVwBXxg6UaSELwOAfAHW2hQRvdYlnsca4PNaA8leqwXQa12qwGu1IHDqMgVe61IC7kHCca+1MS5jrOcJnx1OMwYRcPdVMjsGA3UIWGvTV3jfOL4w+qafAr4wdKK/Er5cDuQLsNamP9FrDfY81uU+r3UF2Wsh/67xEAVeqyWBU0MVeK0hBNxXCsf9rY0xlIB7gPDZ4TTjSgLugUpmx1VAHQLW2gwU3jeOL4y+GaSALwydGKyEL8OAfAHW2gwmeq2rPI81zOe1hpO9Viug17pagddqReDUCAVe62oC7pHScdsYIwi4hwifHU4zRjKeKZTMjlFAHQLW2gwV3jeOL4y+GaaALwydGK6EL9cA+QKstRlO9FqjPI91jc9rXUv2WmGg1xqtwGuFCZwao8BrjSbgvk447nU2xhiGxxQ+O5xmXEfAPUrJ7LgeqEPAWptRwvvG8YXRN6MV8IWhE2OU8GUskC/AWpsxRK91veexxvq81jiy1zJAr3WDAq9lCJy6UYHXuoGA+ybhuNfbGDcScI8VPjucZtxEwD1Oyey4GahDwFqbccL7xvGF0Tc3KeALQyduVsKXW4B8Adba3Ez0Wjd7HusWn9e6ley1MoFea7wCr5VJ4NRtCrzWeALu24Xj/t7GuI2Ae7zw2eE043ZGnyuZHROAOgSstblNeN84vjD65g4FfGHoxJ1K+HIHkC/AWps7iV5rguex7vB5rTvJXisC9Fp3KfBaEQKn7lbgte4i4L5HOO4fbIy7GbiFzw6nGfcQcN+rZHbcC9QhYK3NvcL7xvGF0TcTFfCFoRMPKOHLfUC+AGttHiB6rXs9j3Wfz2vdT/ZaWUCvNVGB18picEqB15pIwP2gcNw/2hgPEHA/LHx2OM14kIB7kpLZ8RBQh4C1NpOE943jC6NvHlPAF4ZOPK6ELw8D+QKstXmc6LUe8jzWwz6vNYnstbKBXusRBV4rm8CpRxV4rUcYGioc9wYb41EC7snCZ4fTjMcIuJ9SMjseB+oQsNbmKeF94/jC6JtnFfCFoRNTlPDlCSBfgLU2U4he63HPYz3h81pPkr1WDtBrTVbgtXIYM0iB15pMwP20cNw/2RhPEXC/IHx2OM14moB7qpLZ8QxQh4C1NlOF943jC6NvpingC0Mnpivhy7NAvgBrbaYTvdYznsd61ue1pnheC90HLp6bwei4M6R/h0y5nTlF455J4lUaGD+wPiZVmJOtzbflcLGeE/48scZifY7Q38+TfXWy91fBxniegHu29L9hWI6De44SPQPWxyAxp4d2eqIyof9/oHugXwjrSRLHC+V3cf+om2Yl4oXy+LhTgQtSLNxTy8NrRB3KyJy+CBzK/w3EfUkjcV8iEHeaAuJOIxGX4SxfZKxIlNchWMheehksWO4o+2+wh5M7zLs2+NPlcPEW23jTy8kWVE15DGHvswSPsLEzSwyqV5yeoJvACcrLBFEt4zXEKz4RZN07fFkOKLLpHm5/If9XiZLmy8FMr+dmMZraFfAVJU7B3ecMQhO/KvzdrmuAVxlrUOXxIuZijvBiovMwi5SHOYQ8zCHmISFi6DzMFb4m+U/uLlnc85S8u3wN6O6BtTapyl84ueNfOrqbsUwp/x6eBXxqe134/HGa+xpBd+eT9QbhC14n4F6g5B0IsD5mAfgdSFqo5MpE8Njd31VKrYw/JsPXoXKSTA5Kuc0ST9Zz/UvADKEBxfrbiM3dxZo1ejAjB8tc4GCZVx5GBNpgmUcQ2DcIffSGz9Cz+ghpKpB99OYe5LO038XqozcZBoXQR/O9PtK82iV5eT3Nl88F3sLWW1qGFuv+FhDI8TaBHG8TV01cHt4i5GEhIQ8Ld2PYhJM7kKQrsZqQdD6VrMYsAq7GAFdQzEIlqzELgKb5LaDZeUeBni8i6Ng7ClZj3iHgflfJagywPubdvasxwWNP9KjUI5kclHKbJVZj3tW2GvNuClZjkIPlXeBgeU/Basx7BIFdTOijxSlYjUGaCmQfLVGwGrOE0EfvE/rofd9qzD8NMS3L/nsHYij0gbaB+MFuDMRwckeJhkMO16SFTMaTaqkm4AMg5g+BqwZLgKsuLL58SBgEHxF4+FEKVtyQr3eQ5uQDJStuSB4uBfLwA+H75hwPlxJ4+DGBhx/vgodp4Pt+BdhHn4A/cRN8JZg40D0BXL0u8crtU++V2zLWZvVPyhf/MhQARoIT94om3WfCl6ddA3xGwL2cIDbLia8bl5HysIKQhxUpMD+fAlfllgEF/HPhfFpE6qOPhL/ucZg/J+BequR1D7A+Zune1z3BY0/0qNQjmRyUcpslVrdWMle3PiMMlpUpeN2DHCwrgYNllfDXPa7eqwgC+wWhj75IwesepKlA9tFq4a97XB+tJvTRl4Q++vLfbL5NHOj8AD+1V+JJe433IPyVlqHAur81hOb7mtB8XxOfNl0eviLk4RtCHr5JwdPmGqAp+Aoo5muF8+k10tPmpwqeNtcScC9T8rQJrI9ZtvdpM3jsiR6VeiSTg1Jus8TT5rfanja/TcHTJnKwfAscLN8peNr8jiCw6wh9tC4FT5tIU4Hso/UKnjbXE/roe0Ifff8f2FzIWtbcOxBDoR+0DcQfUrC58NPynOGa9HtSJZsLfwBi/hG4GWWF8M2Fji8/EgbBBgIPN6RgxQO5fI00JyuVbC5E8vAnIA9XCt9c6Hj4E4GHPxN4+DNxBXYGaeVso/AVQ/fNwhsJuLV8ffslwFib/JhNTiwrEo7FsqM50exYfszGNJlZWbG83Egskl8QyY5Gs/MKY9Gc3GhWfjzbhPOyIjnReLQoP6coNzOlfyhmE5irieOXXfhX2E2zEvFLeXzcX4HDiYX71/LwGv39lwwT93tWqPgvGG72/T53oImNzPmW8ty+Tfb+LrYxtjD2ggg3L66HGLhXK3ntA6yPQWJO8D6BN8F7P/9/8/iP7ommJC58JfwVqMP8G2MrhRIuAOtjviZwIfHAe7HHgUu8nwNCxZz4nTwTKwJjbVVqdreSzO42bWbXJWIbwez+IdzsOtx/EMwu4163ePeKFvU/CZsa0dhr2IB/EuqU+HM/223sHfb8y/2O9J1im1hp2l6+eIOpu94RuP4rcO3+/2XIeUD3wLdKVna3A/QkXrTz2IHcsiE8fx7mwr9w+ctzfY7K3zolX3QJ5IkB9oxZlyJjLoG/iVhl0mV7KqfT2wlanZYeEu1T/jWf0vG4ywrH/YvjCwH3j8IX3tyDalkC7g1KPEk5oA4Ba202CO8bxxdG32xUwBeGTmxSwpfyQL4Aa202ERe9nUa4hb3y6cULfOnpoRIH2mshn28qKPBaOwheq6ICr1WBoCWVhOP+1fGLgHuz8NnhNKMSAfcWJbOjMlCHgLU2W4T3jeMLo2+2KuALQye2KeFLFSBfgLU224heq7Lnsar4vFZVstf6C+i1qinwWn8RvFZ1BV6rGkFLagjHvdnGqE7AvV347HCaUYOAe4eS2bEPUIeAtTY7pG9EDHH6pkyGfL4wdCItQwdfagL5Aqy1QeYv6LX28TxWTZ/X2pfstZDvnfdT4LVCBE7VUuC19iPg3l847i02Ri0C7vIZsnE7zdifgDs9Q8fsOACoQ8BaG3T+GHxh9E0l4bgdXxg6UTlDB18OBPIFWGuDzF/Qax3geawDfV7roPTif0f32D7kPbe17b3XsefB9qwb2HNbO73knto6geuDA9d1iXtu9yHtua2WoYNrtQF+O7Hntg7Qu1cXnr/EntuDcfnLqwvMX40U5S+c3GGAPDHAnjGs/KGfl2sDe6aegufl2gRfVF/B83I9Au5DhOP+zcaoT8C9X4Zs3M73HcJYF8qQPVMT95kB1CFgrQ06fwy+MPrmQOG4HV8YOnFQhg6+HArkC7DWBpm/4PNyhvecfKjvebkB+d0E8vnmMAVeqw6BUw0VeK3DCLgbCcf9u43RkID74AzZuJ1mNCLgrpuhY3Y0BuoQsNYGnT8GXxh9c4hw3I4vDJ3IyNDBlyZAvgBrbZD5C3qtxp7HauLzWk3JXutgoNdqpsBrHUzgVHMFXqsZAffhwnFvtTGaE3AfliEbt9OMwxnPFBk6ZscRQB0C1tqg88fgC6NvmgjH7fjC0ImmGTr40gLIF2CtDTJ/Qa91hOexWvi8Vkuy10K+d26lwGvVJXAqrMBrtSLgNsJxb3MxGB4zQzZupxmGgPuIDB2zIxOoQ8BaG3T+GHxh9E0r4bgdXxg6Ec7QwZcIkC/AWhtk/oJeK9PzWBGf18ryesD/32V5/54XKv7vsj1Phu5D9zt2tR81M14UC9tyRvJj+SaWGze5pigSyTWF0XBhflYsXJQZy4/GcwqLIlkmMytWEIlkFeYXhbNzwll54WjcIL8HOJifbC8/J/nyk0Pcu1yTtHe5lhcn19571J559mxtzyPteZQ929izrT2PdlyxZzt7trfnsfY8zp7H27ODPU+w54n2PMmeHQN7n3MDe5ujgeu8wHXrwPWRgeujAtdtAtdtA9dHB66PCVy3C1y3D1wfG7g+LnB9fOC6Q+D6hMD1iYHrkwLXHYl7v2uS9n5HMnRofi5w73cU+AyZJTx/ib3fecC9362B+cvWkT9zJCx/cXMUMH85KvJXYNrA8hc1bYH5y1WRv7A5GpW/eNgcA8xfVEP+CsKmHSp/0bBpD8xfnob8Wf9xLCh/cRvrOGD+WivIX4HFfDwof1EbqwMwf0cqyJ8NbU7A5C/uYp0IzN9R8vNX4DCfhMlf1MXqCMxfmxTlL5zcYYDPScb/zJBs/toqyR/Q55scYP6OVpI/oE81UWD+jlGSP6DPMq2B+WunJH9An2COAuavvZL8AeecaQvM37FK8gfUaXMMMH/HKclfO2D+2gPzd7yS/AF5YoA9Y1j5SwvkT8L6fSLWyQr2beUS3s+fomDf1skE3J2E4/7DxjiFgPusDNm43XvzTgTcPTNSMxOSvc/OQB0C1tqg88fgC6NvegnH7fjC0IneGTr40gXIF2CtDTJ/wf1Gnb39Rl3Si/cbnUreI4/c33CaAq8VJXCqqwKvdRoB9+nScdsYXQm4YxmycTvNOJ2AOz9Dx+w4A6hDwFobdP4YfGH0TVw4bscXhk4UZejgSzcgX4C1Nsj8Bb3WGZ7H6ubzWt3JXisP6LXOVOC18gic6qHAa53JWN8Rjnu7jdGDgLtPhmzcTjPOIuDum6FjdvQE6hCw1gadPwZfGH3TTzhuxxeGTvTP0MGXs4F8AdbaIPMX9Fo9PY91ts9rnUP2WsjPnfRS4LVaM9aKFXitXgTc5wrH7TjUm4B7QIZs3E4zziXgHpihY3acB9QhYK0NOn8MvjD6ZpBw3I4vDJ0YnKGDLzEgX4C1Nsj8Bb3WeZ7Hivm8Vj7Zax0J9FoFCrzWkQROFSrwWgWMdwPCcf9lYxQScA/JkI3baUacgHtoho7ZUQTUIWCtDTp/DL4w+maYcNyOLwydGJ6hgy/nA/kCrLVB5i/otYo8j3W+z2tdQPZayO8D6aPAax3FeLeiwGv1IeC+UDhuF7AvAffIDNm4nWZcSMA9KkPH7LgIqEPAWht0/hh8YfTNaOG4HV8YOjEmQwdf+gH5Aqy1QeYv6LUu8jxWP5/X6k/2Wm2AXutiBV6rDYFTlyjwWhcz3qUJx13GBryEgHtshmzcTjMGEHCPy9AxOwYCdQhYa4POH4MvjL65SThuxxeGTtycoYMvlwL5Aqy1QeYv6LUGeh7rUp/XuozstZDf0zpIgddqy3gvr8BrDSLgvlw47jQbcDAB9/gM2bidZlxOwH1bho7ZcQVQh4C1Nuj8MfjC6Js7hON2fGHoxJ0ZOvgyBMgXYK0NMn9Br3WF57GG+LzWULLXOhrota5U4LWOJnDqKgVe60rGPgzhuMvagFcRcN+TIRu304xhBNz3ZuiYHcOBOgSstUHnj8EXRt9MFI7b8YWhEw9k6ODL1UC+AGttkPkLeq3hnse62ue1RpC9FvLv54xU4LWOYexjUeC1RhJwXyMcdzkbcBQB98MZsnE7zbiGgHtSho7ZcS1Qh4C1Nuj8MfjC6JvHhON2fGHoxOMZOvgyGsgXYK0NMn9Br3Wt57FG+7zWGLLXagf0Wtcp8FrtCJy6XoHXuo6xb0k47vI24PUE3JMzZON2mjGWgPupDB2zYxxQh4C1Nuj8MfjC6JtnheN2fGHoxJQMHXy5AcgXYK0NMn9BrzXO81g3+LzWjWSvhfy7xjcp8FrtGXsgFXitmwi4bxGOO90GvJmA+4UM2bidZtxCwD01Q8fsuBWoQ8BaG3T+GHxh9M004bgdXxg6MT1DB1/GA/kCrLVB5i/otW71PNZ4n9e6jey1jgV6rdsVeK1jCZyaoMBr3c7Y8yocdwUbcAIB94wM2bidZtxBwD0zQ8fsuBOoQ8BaG3T+GHxh9M1s4bgdXxg6MSdDB1/uAvIFWGuDzF/Qa93peay7fF7rbrLXOg7ote5R4LWOY+wZVuC17iHgvk847oo24L0E3HMzZON2mnEfAfe8DB2z436gDgFrbdD5Y/CF0TfzheN2fGHoxIIMHXyZCOQLsNYGmb+g17rf81gTfV7rAbLXOh7otR5U4LWOJ3DqIQVe60HGHnHhuCvZgA8RcC/MkI3bacbDBNyLMnTMjklAHQLW2qDzx+ALo2/eE47b8YWhE4szdPDlESBfgLU2yPwFvdYkz2M94vNaj5K9Vgeg13pMgdfqwPi8iQKv9RgB9xPCcVe2AR8n4P4gQzZupxlPEHB/mKFjdjwJ1CFgrQ06fwy+MPrmY+G4HV8YOvFJhg6+TAbyBVhrg8xf0Gs96XmsyT6v9RTZa50A9FpPK/BaJxA49YwCr/U04/NFwnFXsQGfIeD+LEM2bqcZzxJwL8/QMTumAHUIWGuDzh+DL4y+WSkct+MLQydWZejgy3NAvgBrbZD5C3qtKZ7Hes7ntZ4ne60TgV7rBQVe60TG57MUeK0XCLhfFI67qg04lYD7ywzZuJ1mvEjAvSZDx+x4CahDwFobdP4YfGH0zTfCcTu+MHRibYYOvkwD8gVYa4PMX9BrveR5rGk+rzWd7LVOAnqtlxV4rZMInHpFgdd6mfF5POG4q9mArxBwr8uQjdtpxgwC7vUZOmbHTKAOAWtt0Plj8IXRNz8Kx+34wtCJDRk6+DILyBdgrQ0yf0GvNdPzWLN8XutVstfqCPRasxV4rY6Mz/Yq8FqzCbhfE467ug04h4B7Y4Zs3E4zXiPg3pShY3a8DtQhYK0NOn8MvjD6ZrNw3I4vDJ3YkqGDL3OBfAHW2iDzF/Rar3sea67Pa83zvBa6D1w8N4PRcbdmyPcd8wi82pbB4VUaGD+wPiZVmJOtzR/lcbHeEP48scVifYPQ32+SfXWy9+d09E0C7u0ZsvXs9/Ic3DsydOgZsD4GidmN7bK+evsPdA9cEsJ6ksQxP30X94+6aVYi5qfj4y4ALkixcC9Ih9eIOpSROX0LOJT/G4j7tkbivk0g7kIFxF1IIi7DWb7F+HaLdB2Cheyld8CC5Y6y/wZ7OLnDrC5nV+HK4+KtsfEWlZctqJryGMLeZwkeYWNnlhhU7zo9QTeBE5R3CKJaxmuId30iyLp3+FfBAEU23cPtL+T/KlHSfDlY7PXcEkZTuwK+q8QpuPt8j9DE7wt/t+sa4H3Gd3Gk40XMxRzhxUTnYQkpDx8S8vAhMQ8JEYO/uzlUNg/+yd0lizsNjDtxoN9dfgR098Bam1TlL5zc8S8d3c1YppR/Dy8BPrUtFT5/nOZ+RNDd8mS9QfiCpQTc6SS+oM0ysD4GiTndw+pfmQgeu/u7SqmV8cdk+DpUTpLJQSm3WeLJ+mP/EjBDaECx/jZiH+9izRo9mJGD5WPgYPkkHUYE2mD5hCCwnxL66FOfoWf1EdJUIPto2R7ks7TfxeqjZYQ++ozQR595faR5tUvy8nqaL5/LvYWtFVqGFuv+lhPI8TmBHJ8TV01cHlYQ8rCSkIeVuzFswskdSNKVWE1INp+VlKzGrAKuxgBXUEyq8hdO7jDLgaZ5BdDsfKFAz1cRdKyKgtWYLwi4qypZjQHWxyAx/7esxixP5/TBnuaglNsssRqzWttqzOoUrMYgB8tq4GD5UsFqzJcEgV1D6KM1KViNQZoKZB99pWA15itCH31N6KOvfasx/zTEtCz77x2IodA32gbiN7sxEMPJHSUaDjlck41VQ8aTaqkm4Bsg5rXAVYMawFUXFl/WEgbBtwQefpuCFTfk6x2kOampZMUNycPvgDysSV45CSd3/IuH3xF4uI7Aw3W74GEa+L7fBfbRevAnboKvBBMHuieAq9clXrl9771y+4G1WX19evEvQwFgJDhxr2jS/Sh8edo1wI8E3BsIYrOB+LrxB1IefiLk4acUmJ/vgatyPwAF/GfhfFpF6qP9hL/ucZh/JuCupeR1D7A+Bon5v+V1z/fpnD7Y0xyUcpslVrc2Mle3fiQMlo0peN2DHCwbgYNlk/DXPa7emwgC+wuhj35JwesepKlA9tGvwl/3uD76ldBHmwl9tPnfbL5NHOj8AD+1V+JJe4v3IPyblqHAur8thOb7ndB8vxOfNl0efiPkYSshD1tT8LS5BWgKfgOK+TbhfPqI9LR5oIKnzW0E3AcpedoE1scctPdpM3jsiR6VeiSTg1Jus8TT5h/anjb/SMHTJnKw/AEcLH8qeNr8kyCw2wl9tD0FT5tIU4Hsox0KnjZ3EProL0If/fUf2FzIWtbcOxDtUUHZQCxxw97BfK+HHK7JxjpYyeZCVyMU5jIVcHU9WPjmwn89pVYgfBlYBTwPXcwRIS4PkcvXSHNST8nmQiQPywJ5WI+8chJO7vgXD8sSeFiOwMNyFXgrsO+RVs7KV5Bdf/fNwuUJ9dfy9e2XAmOl+2ttcmJZkXAslh3NiWbH8mM2psnMyorl5UZikfyCSHY0mp1XGIvm5Eaz8uPZJpyXFcmJxqNF+TlFuZkp/UMx6WCuJo4Ku/CvsJtmJaJCBXzcisDhxMLt7hFco7//kmHifnuGiv+CYSXf73MHmtjInFeuwO3bZO9voI1RmSDihwg3L66HGLgzlLz2AdbHIDEneJ/Am+C9n/9VPP6je6IZiQuHCX8F6jBXIeBuqIQLwPqYhgQuJB54B3ocuNT7eVmomBNVyTOxEjBWNaVmtxrJ7FbXZnZdIqoTzG4N4WbX4a5BMLuMe63s3Sta1PcBkiAhUmjsLW3AfQh1KufFqWlj72vP/exZq8JOsU2sNNWsULzB1F3vG7jeL3Bdy1cjVh7QPdBEycpuTYCexIt2HvsCtamp8Px5mAv3w+UvrxYwf81kvOEr7TBAnhhgz5hmKTLmEvibiLU/eSEmnNxhnE7XJGj1AcLfIjjc+xNwHygc97424AEE3C2EL7y5B9UDCbhbKvEkBwF1CFhr01J43zi+MPrGKOALQycylfClNpAvwFobZP6Ci95OI9zCXu0KxQt8dcgLfMjnm4MVeK19CZyqq8BrHUzAXU847v1swLoE3NnCZ4fTjHoE3DlKZkd9oA4Ba21yhPeN4wujb/IU8IWhE62V8OUQIF+AtTatiV6rvuexDvF5rQyy19oP6LUOVeC19iNwqoECr3UoYzOJcNy1bMAGBNxthM8OpxmHEXC3VTI7GgJ1CFhr01Z43zi+MPqmnQK+MHSivRK+NALyBVhr057otRp6HquRz2s1Jnst5HvnJgq8Vi0Cp5oq8FpNCLibCce9vw3YlID7eOGzw2lGMwLuDkpmR3OgDgFrbToI7xvHF0bfnKSALwyd6KiEL4cD+QKstelI9FrNPY91uM9rHVGh+N/RPdaqDHfPbQsbu6U9W9kzHNhz2yKwp7Zl4LpV4DpM3HPbirTntpMSrrUA7rltCfTunZXsuW0F3HMbBuavi5I9t0CeGGDPGFb+0M/LLYA9YxQ8L7dg7K1S8LxsCLgjwnEfYANmEnCfLtz/O98XIeA+Q4knyQLqELDW5gzhfeP4wuibMxXwhaETPZTwJRvIF2CtDTJ/weflLO85Odv3vJxDfjeBfL7JVeC1WhI4FVXgtXIZe+mE4z7QBowScJ8tfHY4zcgj4D5HyexoDdQhYK3NOcL7xvGF0TfnKuALQyfOU8KXI4F8AdbanEf0Wq09j3Wkz2sdRfZarYBeq40Cr9WKsRdRgddqQ8B9tHDcB9mAbQm4C4TPDqcZRxNwFyqZHccAdQhYa1MovG8cXxh9c74CvjB04gIlfGkH5Auw1uYCotc6xvNY7Xxeqz3ZayHfOx+rwGuFCZw6ToHXOpax91Q47to24HEE3BcKnx1OM44n4L5IyezoANQhYK3NRcL7xvGF0TcXK+ALQycuUcKXE4B8AdbaXEL0Wh08j3WCz2ud6PWA/7870fv31qHi/+4kz5Oh+9D9jl3tR82MF8XCtpyR/Fi+ieXGTa4pikRyTWE0XJifFQsXZcbyo/GcwqJIlsnMihVEIlmF+UXh7JxwVl44GjfI7wEO5uckLz8dffnpSNy7HC7D2btcy4tzso19ij072bOzPbvY81R7nmbPrvY83Z5n2LObPbvb80x79rDnWfbsac+z7XmOPXvZs3eFknufT65Qcm/zKYHrToHrzoHrLoHrUwPXpwWuuwauTw9cnxG47ha47h64PjNw3SNwfVbgumfg+uzA9TmB616B694VeHu/E32E1vxLD9Wh+ScDnvsSe79PAT5DXiY8f4m9351w+cvrDMzfIB35M11g+YubU4H5G6wifwXmNFj+oqYrMH+Xq8hf2JyOyl88bM4A5u8KDfkrCJtuqPxFw6Y7MH9DNOTP7bUE5S/u9loC8zdUQf4KLOazQPmL2lg9gfm7UkH+wm6/FiZ/cRfrHGD+rpKfvwKHuRcmf1EXqzcwf8NSlL9wcocBPicZ/zNDsvkbriR/QJ9vBgPzd7WS/AF9qrkCmL8RSvIH9FlmKDB/I5XkD+gTzFXA/I1Skj/gnDPDgfm7Rkn+gDptRgDzd62S/AF1xowC5m+0kvwBeWKAPWNY+UsL5E/C+v3fnztRsG/rZMK7mvMU7Ns6l4A7Jhx3HRvwPALue4TvQ3HvzWME3PcqeSeZD9QhYK3NvcL7xvGF0TcTFfCFoRMPKOFLAZAvwFobZP6C+43yvf1GBRWK9xsVkvfII/c3xBV4rVMInCpS4LXijM8ZCcd9sA1YRMD9sPDZ4TTjfALuSUpmxwVAHQLW2kwS3jeOL4y+eUwBXxg68bgSvvQB8gVYa/M40Wtd4HmsPj6v1ZfstToBvdaFCrxWJ8bntBR4rQsJuPsJx13XBryIgHuy8NnhNKMfAfdTSmZHf6AOAWttnhLeN44vjL55VgFfGDoxRQlfLgbyBVhrM4Xotfp7Hutin9e6hOy1kJ87GaDAa3UmcGqgAq81gPE5N+G469mAAwm4XxA+O5xmXErAPVXJ7LgMqEPAWpupwvvG8YXRN9MU8IWhE9OV8GUQkC/AWpvpRK91meexBvm81mCy1+oC9FqXK/BaXQicukKB17qcgHuIcNz1bcArCLhnCJ8dTjOGEHDPVDI7hgJ1CFhrM1N43zi+MPpmtgK+MHRijhK+XAnkC7DWZg7Raw31PNaVPq91FdlrIb8PZJgCr3UqgVPDFXitYQTcVwvHfYgNOJyAe67w2eE042oC7nlKZscIoA4Ba23mCe8bxxdG38xXwBeGTixQwpeRQL4Aa20WEL3WCM9jjfR5rVFkr3Ua0Gtdo8BrnUbg1LUKvNY1BNyjhePOsAGvJeBeKHx2OM0YTcC9SMnsGAPUIWCtzSLhfeP4wuib9xTwhaETi5Xw5TogX4C1NouJXmuM57Gu83mt68leC/k9rWMVeK2uBE6NU+C1xhJw3yAc96E24DgC7g+Ezw6nGTcQcH+oZHbcCNQhYK3Nh8L7xvGF0TcfK+ALQyc+UcKXm4B8AdbafEL0Wjd6Husmn9e6mey1Tgd6rVsUeK3TCZy6VYHXuoWAe7xw3A1swFsJuD8TPjucZown4F6uZHbcBtQhYK3NcuF94/jC6JuVCvjC0IlVSvhyO5AvwFqbVUSvdZvnsW73ea0JZK+F/Ps5dyjwWmcQOHWnAq91BwH3XcJxH2YD3knA/aXw2eE04y4C7jVKZsfdQB0C1tqsEd43ji+MvvlGAV8YOrFWCV/uAfIFWGuzlui17vY81j0+r3Uv2Wt1A3qt+xR4rW4ETt2vwGvdR8A9UTjuhjbg/QTc64TPDqcZEwm41yuZHQ8AdQhYa7NeeN84vjD65kcFfGHoxAYlfHkQyBdgrc0Gotd6wPNYD/q81kNkr4X8u8YPK/Ba3QmcmqTAaz1MwP2IcNyNbMBJBNwbhc8OpxmPEHBvUjI7HgXqELDWZpPwvnF8YfTNZgV8YejEFiV8eQzIF2CtzRai13rU81iP+bzW42SvdSbQaz2hwGudSeDUkwq81hME3JOF425sAz5JwL1V+OxwmjGZgHubktnxFFCHgLU224T3jeMLo2+2K+ALQyd2KOHL00C+AGttdhC91lOex3ra57WeIXutHkCv9awCr9WDwKkpCrzWswTczwnH3cQGnELAXaaBbNxOM54j4E5roGN2PA/UIWCtTZrwvnF8YfRNeQV8YehEuhK+vADkC7DWBpm/oNd63vNYL/i81lSy1zoL6LVeVOC1ziJw6iUFXutFAu5pwnE3tQFfIuCuJHx2OM2YRsBdWcnsmA7UIWCtTWXhfeP4wuibagr4wtCJ6kr48jKQL8BaG2T+gl5ruuexXvZ5rVfIXqsn0GvNUOC1ehI4NVOB15pBwD1LOO5mNuBMAu6awmeH04xZBNz7KpkdrwJ1CFhrs6/wvnF8YfTN/gr4wtCJA5TwZTaQL8BaG2T+gl7rVc9jzfZ5rTlkr3U20Gu9psBrnU3g1OsKvNZrBNxzheNubgO+TsBdW/jscJoxl4C7jpLZMQ+oQ8BamzrC+8bxhdE39RTwhaET9ZXw5Q0gX4C1Nsj8Bb3WPM9jveHzWm+SvdY5QK81X4HXOofAqQUKvNZ8Au63hOM+3AZcQMB9qPDZ4TTjLQLuBkpmx9tAHQLW2jQQ3jeOL4y+aaSALwydaKyELwuBfAHW2iDzF/Rab3sea6HPay0ie61eQK/1jgKv1YvAqXcVeK13CLjfE477CBvwXQLuZsJnh9OM9wi4myuZHYuBOgSstWkuvG8cXxh900IBXxg60VIJX5YA+QKstUHmL+i1Fnsea4nPa71P9lq9gV7rAwVeqzeBUx8q8FofEHB/JBx3CxvwQwJuI3x2OM34iIA7U8nsWArUIWCtTabwvnF8YfRNtgK+MHQiRwlfPgbyBVhrg8xf0Gst9TzWxz6v9YnnteCfW7cx9iH0V55wXjnMnxBwtybxKg2MH1gfkyrMydamBvB54lPhzxOV7f19SujvZWRfnfRnQ22MZQTcbYTrWdUKHNxtlegZsD4GiTk9tNMTlQn9/wPdA5eGsJ4kcXxWYRf3j7ppViI+q4CPuxw4QFi4l1eA14g6lJE5XQEcyv8NxP1cI3E/JxB3pQLiriQRl+EsVxCcxqoKOgQL2UtfgAXLHWX/DfZwcof5tbxdhUvHxdti461Kly2omvIYwt5nCR5hY2eWGFSrnZ6gm8AJyhcEUS3jNcRqnwiy7h0tsl8CRTbdw+0v5P8qUdJ8OVjj9dxXjKZ2BVytxCm4+/yS0MRfC3+36xrgawLubyrgRczFHOHFROfhK1Ie1hLysJaYh4SIofPQTvia5D+5u2RxtwfjThzod5ffAt09sNYmVfkLJ3f8S0d3M5Yp5d/DXwGf2r4TPn+c5n5L0N3jyXqD8AXfEXB3UPIOBFgfg8Sc7mH1r0wEj939XaXUyvhjMnwdKifJ5KCU2yzxZL3OvwTMEBpQrL+N2LpdrFmjBzNysKwDDpb1FWBEoA2W9QSB/Z7QR9/7DD2rj5CmAtlHP+xBPkv7Xaw++oHQRz8S+uhHr480r3ZJXl5P8+Vzg7ew9ZOWocW6vw0EcvxMIMfPxFUTl4efCHnYSMjDxt0YNuHkDiTpSqwmJJvPk5SsxmwCrsYAV1BMqvIXTu4wG4Cm+Seg2flFgZ5vIujYyQpWY34h4D5FyWoMsD4Gifm/ZTVmQwVOH+xpDkq5zRKrMb9qW435NQWrMcjB8itwsGxWsBqzmSCwWwh9tCUFqzFIU4Hso98UrMb8Ruij3wl99LtvNeafhpiWZf+9AzEU2qptIG7djYEYTu4o0XDI4ZpsrC4ynlRLNQFbgZi3AVcNugBXXVh82UYYBH8QePhHClbckK93kObkNCUrbkge/gnkITp/DB7+SeDhdgIPt++Ch2ng+14N7KMd4E/cBF8JJg50TwBXr0u8cvvLe+XmvoCEsll9R4XiX4YCwEhw4l7hX7BSUTZu1wDuHtG40yrixcbFHBHiEOxfBCDkoSwhD2Ur8s3PX8BVuVBFXD7LCefTJhKfThf+usdhLkfAfQbJ7KJf9wDrY5CY/1te9/xVgdMHe5qDUm6zxOpW+YrE1a0yhMFS4oa9A/1UiBws5YGDJb0ijAiUweLqnU4Q2AqEPqpQkf+6B2kqkH1UcQ/y+Z943eP6qCKhjyoR+qhSxX/efJs40Pn5lvSkXbnizp9VtAwF1v1VJjRfVULzVSU+bbo8VCHkoRohD9VS8LRZuSLOFFQBinl14Xz6lvS0eaaCp83qBNw9lDxtAutjkJj/W542K1fk9MGe5qCU2yzxtFlD29NmjRQ8bSIHSw3gYNlHwdPmPgSBrUnoo5opeNpEmgpkH+2r4GlzX0If7Ufoo/0qpn5zIWtZc+9ADIVqaRuItXZjIIaTO0o0HHK4JhvrbJLzRm8urAXEvD+uh4w/fxI3Fzq+7E8YBAcQeHhAClY8kMvXSHPSK0U8TPY+kTw8EMhDdP4YPDyQwMODCDw8iLgC+yVp5ay28BVD983CtQm4tXx9+2BgrDr+WpucWFYkHItlR3Oi2bH8mI1pMrOyYnm5kVgkvyCSHY1m5xXGojm50az8eLYJ52VFcqLxaFF+TlFuZkr/UEwdMFcTx8G78K+4gUlKxMEV8XHrAocTC3fdivAa/f2XDBP3e3ao+C8Y1vP9PnegiY3Mef2K3L5N9v4G2Rj1CSJ+rnDz4nqIgfu8BqkZXuHkDgOsj0FiTvA+gTfBez//D/H4j+6J5iQuFAh/BeowH0LAXaiEC8D6mEICFxIPvIM8Dgz2fl4eKuZEBnkmVgbGOlSp2T2UZHYbaDO7LhENCGb3MOFm1+E+jGB2Gfda37tXtKg3BJIgIVJo7J1swIaEOpXz4jSysRvbs4k9m1bcKbaJlaZGFYs3mLrrxoHrJoHrpr4asfKA7oHzlazsNgLoSbxo59EYqE0XCM+fh7mwCS5/eU2B+esj4w1faYcB8sQAe8aw8oc2nY2APdOMvBATTu4wTqcbEbS6ufC3CA53MwLuw4XjNjZgcwLufsIX3tyD6uEE3P2VeJIjgDoErLXpL7xvHF8YfTNAAV8YOjFQCV9aAPkCrLVB5i+46O00wi3stahYvMDXkrzAh3y+aaXAazUmcCqswGu1IuA2wnFn2oBhAu5BwmeH0wxDwD1YyezIBOoQsNZmsPC+cXxh9M0QBXxh6MRQJXyJAPkCrLVB5i/otTI9jxXxea0sstdqAvRa2Qq8VhMCp3IUeK1sAu5c4bgjNmAOAfcw4bPDaUYuAfdwJbMjCtQhYK3NcOF94/jC6JuRCvjC0IlRSviSB+QLsNYGmb+g14p6HivP57Vak70W8r3zkQq8VlMCp45S4LWOJOBuIxx3lg14FAH3aOGzw2lGGwLuMUpmR1ugDgFrbcYI7xvHF0bfjFXAF4ZOjFPCl6OBfAHW2iDzF/RabT2PdbTPax1Tsfjf0T3Wmbzntp2N3d6ex9rzuMCe23aBPbXtA9fHBq6PI+657Uzac3uTEq61A+65bQ/07jcLz19iz+2xwD23xwHzd0uK8hdO7jBAnhhgzxhW/tDPy+2APXO8gufldgSt7qDgefl4Au4ThOPOtgE7EHDfLtz/O993AgH3BCWe5ESgDgFrbSYI7xvHF0bf3KWALwyduFsJX04C8gVYa4PMX/B5+UTvOfkk3/NyR/K7CeTzzckKvFZ7AqdOUeC1Tibg7iQcd44NeAoB933CZ4fTjE4E3PcrmR2dgToErLW5X3jfOL4w+uZBBXxh6MRDSvjSBcgXYK0NMn9Br9XZ81hdfF7rVLLXOhbotU5T4LWOJXCqqwKvdRoB9+nCcefagF0JuB8RPjucZpxOwP2oktlxBlCHgLU2jwrvG8cXRt88oYAvDJ14UglfugH5Aqy1QeYv6LXO8DxWN5/X6k72Wsj3zmcq8FrHETjVQ4HXOpOA+yzhuKM2YA8C7qeFzw6nGWcRcD+jZHb0BOoQsNbmGeF94/jC6JvnFPCFoRPPK+HL2UC+AGttkPkLeq2ensc62+e1zvF6wP/fneP9+5Gh4v+ul+fJ0H3ofseu9qNmxotiYVvOSH4s38Ry4ybXFEUiuaYwGi7Mz4qFizJj+dF4TmFRJMtkZsUKIpGswvyicHZOOCsvHI0b5PcAB/PTy8vPyb789CbuXe5C2rtcy4tzro19nj1j9sy3Z4E9C+0Zt2eRPc+35wX27GPPvva80J4X2bOfPfvb82J7XmLPAfYcWLHk3udzK5bc23xe4DoWuM4PXBcErgsD1/HAdVHg+vzA9QWB6z6B676B6wsD1xcFrvsFrvsHri8OXF8SuB4QuB5Ykbf3uwtp7/eLSjT/XMBzX2Lv93nAZ8iXhOcvsfc7hstfXj4wf9N05M8UwPIXN4XA/E1Xkb8CE4flL2qKgPl7WUX+wuZ8VP7iYXMBMH+vaMhfQdj0QeUvGjZ9gfmboSF/1n9cCMpf3Ma6CJi/mQryV+C+TxmUv6j7PmVg/mYpyJ8NbS7G5C/uYl0CzN+r8vNX4DAPwOQv6mINBOZvdoryF07uMMDnJON/Zkg2f3OU5A/o8810YP5eU5I/oE81rwDz97qS/AF9lpkJzN9cJfkD+gTzKjB/85TkDzjnzBxg/t5Qkj+gTpvXgfl7U0n+gDpj5gHzN19J/oA8McCeMaz8pQXyJ2H9PhHrUgX7ts4lvKu5TMG+rUsJuAcJx51nA15GwP1ZA9m43XvzQQTcy4Wvqfz9t0qAOgSstVkuvG8cXxh9s1IBXxg6sUoJXy4H8gVYa4PMX3C/0WBvv9HlFYv3G11B3iOP3N8wRIHXOo/AqaEKvNYQAu4rheNubQMOJeD+UvjscJpxJQH3GiWz4yqgDgFrbdYI7xvHF0bffKOALwydWKuEL8OAfAHW2iDzF/RaV3kea5jPaw0ne60Y0GtdrcBrxQicGqHAa11NwD1SOO4jbcARBNzrhM8OpxkjCbjXK5kdo4A6BKy1WS+8bxxfGH3zowK+MHRigxK+XAPkC7DWBpm/oNca5Xmsa3xe61qy10J+7mS0Aq+VT+DUGAVeazQB93XCcR9lA44h4N4ofHY4zbiOgHuTktlxPVCHgLU2m4T3jeMLo282K+ALQye2KOHLWCBfgLU2yPwFvdb1nsca6/Na48heqwDotW5Q4LUKCJy6UYHXuoGA+ybhuNvYgDcScG8VPjucZtxEwL1Nyey4GahDwFqbbcL7xvGF0TfbFfCFoRM7lPDlFiBfgLU2yPwFvdbNnse6xee1biV7LeT3gYxX4LUKCZy6TYHXGk/Afbtw3G1twNsIuMscJhu304zbCbjTDtMxOyYAdQhYa5MmvG8cXxh9U14BXxg6ka6EL3cA+QKstUHmL+i1Jnge6w6f17qT7LXiQK91lwKvFSdw6m4FXusuAu57hOM+2ga8m4C7kvDZ4TTjHgLuykpmx71AHQLW2lQW3jeOL4y+qaaALwydqK6EL/cB+QKstalO9Fr3eh7rPp/Xup/stZDf0zpRgdcqInDqAQVeayIB94PCcR9jAz5AwF1T+OxwmvEgAfe+SmbHQ0AdAtba7Cu8bxxfGH2zvwK+MHTiACV8eRjIF2CtzQFEr/WQ57Ee9nmtSWSvdT7Qaz2iwGudT+DUowq81iME3I8Jx93OBnyUgLu28NnhNOMxAu46SmbH40AdAtba1BHeN44vjL6pp4AvDJ2or4QvTwD5Aqy1qU/0Wo97HusJn9d6kuy1kH8/Z7ICr3UBgVNPKfBakwm4nxaOu70N+BQB96HCZ4fTjKcJuBsomR3PAHUIWGvTQHjfOL4w+qaRAr4wdKKxEr48C+QLsNamMdFrPeN5rGd9XmsK2Wv1AXqt5xR4rT4ETj2vwGs9R8D9gnDcx9qAzxNwNxM+O5xmvEDA3VzJ7JgK1CFgrU1z4X3j+MLomxYK+MLQiZZK+PIikC/AWpuWRK811fNYL/q81ktkr4X8u8bTFHitvgROTVfgtaYRcL8sHPdxNuB0Am4jfHY4zXiZgDtTyex4BahDwFqbTOF94/jC6JtsBXxh6ESOEr7MAPIFWGuTQ/Rar3gea4bPa80ke60LgV5rlgKvdSGBU68q8FqzCLhnC8d9vA34KgF3nvDZ4TRjNgF3ayWzYw5Qh4C1Nq2F943jC6Nv2ijgC0Mn2irhy2tAvgBrbdoSvdYcz2O95vNar5O91kVArzVXgde6iMCpeQq81lwC7jeE4+5gA84j4G4nfHY4zXiDgLu9ktnxJlCHgLU27YX3jeMLo2+OV8AXhk50UMKX+UC+AGttOhC91puex5rv81oLyF6rH9BrvaXAa/UjcOptBV7rLQLuhcJxn2ADvk3AfZLw2eE0YyEBd0cls2MRUIeAtTYdhfeN4wujbzop4AtDJzor4cs7QL4Aa206E73WIs9jvePzWu+SvVZ/oNd6T4HX6k/g1GIFXus9Au4lwnGfaAMuJuA+TfjscJqxhIC7q5LZ8T5Qh4C1Nl2F943jC6NvuingC0MnuivhywdAvgBrbboTvdb7nsf6wOe1PiR7rYuBXusjBV7rYgKnlirwWh8RcH8sHPdJNuBSAu6zhM8OpxkfE3D3VDI7PgHqELDWpqfwvnF8YfRNLwV8YehEbyV8+RTIF2CtTW+i1/rE81if+rzWMrLXugTotT5T4LUuIXBquQKv9RkB9wrhuDvagMsJuGPCZ4fTjBUE3PlKZsfnQB0C1trkC+8bxxdG38QV8IWhE0VK+LISyBdgrU0R0Wt97nmslT6vtYrstQYAvdYXCrzWAAKnVivwWl8QcH8pHPfJNuBqAu4+wmeH04wvCbj7Kpkda4A6BKy16Su8bxxfGH3TTwFfGDrRXwlfvgLyBVhr05/otdZ4Husrn9f6muy1BgK91jcKvNZAAqfWKvBa3xBwfysc9yk24FoC7gHCZ4fTjG8JuAcqmR3fAXUIWGszUHjfOL4w+maQAr4wdGKwEr6sA/IFWGszmOi1vvM81jqf11rveS10H7h4DQn9NUQ4rxzm9QTcQ0m8SgPjB9bHpApzsrU5DPg88b3w54n69v6+J/T3D2Rfnez9VbYxfiDgHiZczzIqcnAPV6JnwPoYJOb00E5PVCb0/w90DwwOYT1J4vix4i7uH3XTrET8WBEfdwNwgLBwb6gIrxF1KCNz+hNwKP83EPdnjcT9mUDcjQqIu5FEXIaz/IngNDZV1CFYyF76BSxY7ij7b7CHkztMxQp2Fa4CLl5lG2tTBdmCqimPIex9luARNnZmiUH1q9MTdBM4QfmFIKplvIb41SeCrHtHi+xmoMime7j9hfxfJUqaLwdbvJ77jdHUroC/KnEK7j43E5r4d+Hvdl0D/E7AvbUiXsRczBFeTHQefiPlYRshD9uIeUiIGDoPI4WvSf6Tu0sW9ygl7y7/ALp7YK1NqvIXTu74l47uZixTyr+HfwM+tf0pfP44zf2DoLujyXqD8AV/EnCPUfIOBFgfMwb8DiQtVHJlInjs7u8qpVbGH5Ph61A5SSYHpdxmiSfr7f4lYIbQgGL9bcS272LNGj2YkYNlO3Cw7KgIIwJtsOwgCOxfhD76y2foWX2ENBXIPgpV2v18lva7WH3k7hG+ma0Svo9czBH2p+bVLsnL62n+fFbyeFpJydBi3V8agRzlCOQoV4m3auLyUJaQh/KEPJSvVPqwCSd3IElXYjUh2XyOVbIak46rO3IFxYxVshqTtvv5K9U0l62Eq2uFSvL1PJ2gYzcoWI2pQMB9o5LVGGB9zI17V2OCx57oUalHMjko5TZLrMZU1GJsE8amxA17B3owIwdLReBgqVQJRgTaYKlEENjKBINcuRJ/NQZpKpB9VEXBakwVQh9VJfRRVd9qzD8NMS3L/nsHYihUTdtArLYbAzGc3FGi4ZDDNdlYt8h4Ui3VBFQDYq4OXDW4BbjqwuJLdcIgqEEYBDVSsOKGfL2DNCfjlay4IXm4D5CH48krJ+Hkjn/xcB8CD2sSeFhzFzxMA9/3r0Ae7gvso129Ekwc6J4Arl6XeOW2n/fKrVYl0mb1fSsV/zIUAEaCE/eKJt3+wpenXQPsT8B9AEFsDiC+bqxFysOBhDwcmALzsx9wVa4W0AgcJJxP6aQ+ul346x6H+SAC7glKXvcA62Mm7H3dEzz2RI9KPZLJQSm3WWJ1qzZzdWt/wmCpnYLXPcjBUhs4WOoIf93j6l2HILAHE/ro4BS87kGaCmQf1RX+usf1UV1CH9Uj9FG9f7P5NnGg8wP81F6JJ+363oPwIVqGAuv+6hOaL4PQfBnEp02Xh0MIeTiUkIdDU/C0WR9oCg4BinkD4XxyYsV42rxLwdNmAwLuu5U8bQLrY+7e+7QZPPZEj0o9kslBKbdZ4mnzMG1Pm4el4GkTOVgOAw6WhgqeNhsSBLYRoY8apeBpE2kqkH3UWMHTZmNCHzUh9FGT/8DmQtay5t6BGAo11TYQm6Zgc+F+lTjDNdlY9ynZXNgUiLkZcDPKfcI3Fzq+NCMMguYEHjZPwYoHcvkaaU4mKtlciOTh4UAeThS+udDx8HACD48g8PAI4grsZtLKWQvhK4bum4VbEHBr+fr2IcBYLf21NjmxrEg4FsuO5kSzY/kxG9NkZmXF8nIjsUh+QSQ7Gs3OK4xFc3KjWfnxbBPOy4rkROPRovycotzMlP6hmJZgriaOVrvwr7CbZiWiVSV83DBwOLFwhyvBa/T3XzJM3O85oeK/YGh8v88daGIjc55Zidu3yd7fFTZGJkHEHxRuXlwPMXA/pOS1D7A+Bok5wfsE3gTv/fyPePxH98ThJC48IvwVqMMcIeB+VAkXgPUxjxK4kHjgvcLjwBDv59BQMSeyyDOxCjBWtlKzm00yuznazK5LRA7B7OYKN7sOd66ST6FleveKFvUokAQJkUJjv8gGjBLqVM6Lk2djt7bnkfY8qpL37a6hnT/zKhVvMHXXrQPXRwauj/LViJUHdA88oWRlNw+gJ/GinUdroDY9KTx/HubCI3H5yzsKmL/JSr7oEsgTA+wZMzlFxlwCfxOx2pAXYsLJHcbpdB5Bq9sKf4vgcLch4D5aOO5TbcC2BNzPCl94cw+qRxNwT1HiSY4B6hCw1maK8L5xfGH0zQsK+MLQialK+NIOyBdgrc1U4qK30wi3sNeuUvECX3vyAh/y+eZYBV6rNYFTxynwWscScB8vHPdpNuBxBNzThM8OpxnHE3BPVzI7OgB1CFhrM1143zi+MPpmhgK+MHRiphK+nADkC7DWZibRa3XwPNYJPq91ItlrHQn0Wicp8FpHEjjVUYHXOomA+2ThuLvagB0JuGcLnx1OM04m4J6jZHacAtQhYK3NHOF94/jC6Ju5CvjC0Il5SvjSCcgXYK3NPKLXOsXzWJ18Xqsz2Wsh3zt3UeC1jiJw6lQFXqsLAfdpwnGfbgOeSsA9X/jscJpxGgH3AiWzoytQh4C1NguE943jC6NvFirgC0MnFinhy+lAvgBrbRYRvVZXz2Od7vNaZ1Qq/nd0j/Uj77ntZmN3t+eZ9uwR2HPbLbCntnvg+szAdQ/intt+pD237ynhWjfgntvuQO++WMme2zOBe257APO3RMmeWyBPDLBnDCt/6OflbsCeOUvB83I3glb3VPC8fBYB99nCcZ9hA/Yk4P5IuP93vu9sAu6lSjzJOUAdAtbaLJXeN2U4ffOpAr4wdGKZEr70AvIFWGuzjPi8fI73nNzL97zcm/xuAvl8c64Cr9WdwKnzFHitcwm4Y8Jxd7MBzyPgXiF8djjNiBFwf65kduQDdQhYa/O58L5xfGH0zRcK+MLQidVK+FIA5Auw1mY10Wvlex6rwOe1Csle60yg14or8FpnEjhVpMBrxQm4zxeOu7sNWETA/ZXw2eE043wC7q+VzI4LgDoErLX5WnjfOL4w+uZbBXxh6MR3SvjSB8gXYK3Nd0SvdYHnsfr4vFZfstdCvne+UIHX6kHg1EUKvNaFBNz9hOM+0wa8iID7e+Gzw2lGPwLuH5TMjv5AHQLW2vwgvG8cXxh985MCvjB04mclfLkYyBdgrc3PRK/V3/NYF/u81iVeD/j/u0u8fz8qVPzfDfA8GboP3e/Y1X7UzHhRLGzLGcmP5ZtYbtzkmqJIJNcURsOF+VmxcFFmLD8azyksimSZzKxYQSSSVZhfFM7OCWflhaNxg/we4GB+Bnj5OcWXn4HEvcv9SXuXa3lxLrWxL7PnIHsOtufl9rzCnkPsOdSeV9rzKnsOs+dwe15tzxH2HGnPUfa8xp7X2nO0PcdUKrn3+dJKJfc2Xxa4HhS4Hhy4vjxwfUXgekjgemjg+srA9VWB62GB6+GB66sD1yMC1yMD16MC19cErq8NXI8OXI+pxNv73Z+09/sXJZp/KeC5L7H3+zLgM+SvSvZ+D8LlL28wMH+bdeTPXA7LX9xcAczfFhX5KzBDYPmLmqHA/P2mIn9hcyUqf/GwuQqYv9815K8gbIah8hcNm+HA/G3VkD/rP64G5S9uY40A5m+bgvwVWMwjQfmL2lijgPn7Q0H+bGhzDSZ/cRfrWmD+/pSfvwKHeTQmf1EXawwwf9uVfPYP+Jxk/M8MyeZvh5L8AX2+2QLM319K8gf0qeZ3YP5CDXXkD+izzDZg/sooyR/QJ5g/gflLU5I/4JwzO4D5K6skf0CdNn7NSjZ/5ZTkD6gzJg2Yv/JK8gfkiQH2jGHlLy2QPwnr94lY1ynYt3Up4V3N9Qr2bV1HwD1WOO4eNuD1BNy1G8rG7d6bjyXgrpOimZDsfY4D6hCw1qaO8L5xfGH0TT0FfGHoRH0lfLkByBdgrQ0yf8H9RuO8/UY3VCreb3QjeY88cn/DTQq81mUETt2swGvdRMB9i3DcZ9mANxNwHyp8djjNuIWAu4GS2XErUIeAtTYNhPeN4wujbxop4AtDJxor4ct4IF+AtTaNiV7rVs9jjfd5rdvIXmsQ0GvdrsBrDSJwaoICr3U7AfcdwnH3tAEnEHA3Ez47nGbcQcDdXMnsuBOoQ8Bam+bC+8bxhdE3LRTwhaETLZXw5S4gX4C1Ni2JXutOz2Pd5fNad5O9FvJzJ/co8FqDCZy6V4HXuoeA+z7huM+2Ae8l4DbCZ4fTjPsIuDOVzI77gToErLXJFN43ji+MvslWwBeGTuQo4ctEIF+AtTY5RK91v+exJvq81gNkr3U50Gs9qMBrXU7g1EMKvNaDBNwPC8d9jg34EAF3nvDZ4TTjYQLu1kpmxySgDgFrbVoL7xvHF0bftFHAF4ZOtFXCl0eAfAHW2rQleq1Jnsd6xOe1HiV7LeT3gTymwGtdQeDU4wq81mME3E8Ix93LBnycgLud8NnhNOMJAu72SmbHk0AdAtbatBfeN44vjL45XgFfGDrRQQlfJgP5Aqy16UD0Wk96Hmuyz2s9RfZaQ4Be62kFXmsIgVPPKPBaTxNwPyscd28b8BkC7pOEzw6nGc8ScHdUMjumAHUIWGvTUXjfOL4w+qaTAr4wdKKzEr48B+QLsNamM9FrTfE81nM+r/U82Wshv6f1BQVeayiBU1MVeK0XCLhfFI77XBtwKgH3acJnh9OMFwm4uyqZHS8BdQhYa9NVeN84vjD6ppsCvjB0orsSvkwD8gVYa9Od6LVe8jzWNJ/Xmk72WlcCvdbLCrzWlQROvaLAa71MwD1DOO7zbMBXCLjPEj47nGbMIODuqWR2zATqELDWpqfwvnF8YfRNLwV8YehEbyV8mQXkC7DWpjfRa830PNYsn9d6ley1kH8/Z7YCr3UVgVNzFHit2QTcrwnHHbMB5xBwx4TPDqcZrxFw5yuZHa8DdQhYa5MvvG8cXxh9E1fAF4ZOFCnhy1wgX4C1NkVEr/W657Hm+rzWPLLXGgb0Wm8o8FrDCJx6U4HXeoOAe75w3Pk24JsE3H2Ezw6nGfMJuPsqmR0LgDoErLXpK7xvHF8YfdNPAV8YOtFfCV/eAvIFWGvTn+i1Fnge6y2f13qb7LWQf9d4oQKvNZzAqUUKvNZCAu53hOMusAEXEXAPED47nGa8Q8A9UMnseBeoQ8Bam4HC+8bxhdE3gxTwhaETg5Xw5T0gX4C1NoOJXutdz2O95/Nai8le62qg11qiwGtdTeDU+wq81hIC7g+E4y60Ad8n4B4ifHY4zfiAgHuoktnxIVCHgLU2Q4X3jeMLo2+GKeALQyeGK+HLR0C+AGtthhO91oeex/rI57WWkr3WCKDX+liB1xpB4NQnCrzWxwTcnwrHHbcBPyHgHil8djjN+JSAe5SS2bEMqEPAWptRwvvG8YXRN6MV8IWhE2OU8OUzIF+AtTZjiF5rmeexPvN5reVkrzUS6LVWKPBaIwmc+lyB11pBwL1SOO4iG/BzAu6xwmeH04yVBNzjlMyOVUAdAtbajBPeN44vjL65SQFfGDpxsxK+fAHkC7DW5mai11rleawvfF5rNdlrjQJ6rS8VeK1RBE6tUeC1viTg/ko47vNtwDUE3OOFzw6nGV8RcN+mZHZ8DdQhYK3NbcL7xvGF0Td3KOALQyfuVMKXb4B8Adba3En0Wl97Husbn9daS/Za1wC91rcKvNY1BE59p8BrfUvAvU447gtswO8IuO8RPjucZqwj4L5XyexYD9QhYK3NvcL7xvGF0TcTFfCFoRMPKOHL90C+AGttHiB6rfWex/re57V+IHuta4Fe60cFXutaAqc2KPBaPxJw/yQcdx8bcAMB98PCZ4fTjJ8IuCcpmR0/A3UIWGszSXjfOL4w+uYxBXxh6MTjSviyEcgXYK3N40Sv9bPnsTb6vNYmstcaDfRavyjwWqMJnPpVgdf6hYB7s3DcfW3AXwm4JwufHU4zNhNwP6VkdmwB6hCw1uYp4X3j+MLom2cV8IWhE1OU8OU3IF+AtTZTiF5ri+exfvN5rd/JXmsM0GttVeC1xhA4tU2B19pKwP2HcNwX2oDbCLhfED47nGb8QcA9Vcns+BOoQ8Bam6nC+8bxhdE30xTwhaET05XwZTuQL8Bam+lEr/Wn57G2+7zWDs9rofvAxYsS+muGcF45zDsIuGeSeJUGxg+sj0kV5mRrkwt8nvhL+PNEpr2/vwj9HarM5XWy91fFBamMjztbuJ5lVeLgnqNEz4D1MUjM6aGdnqhM6P8f6B4YEsJ6kr/vs/Iu7h9106xElKmMj5tWGSikJNzuHsE1og5lZE7L4oaT+W8gbjmNxC1HIG55BcQtTyIuw1mWJTiN9Mo6BAvZSxXAguWOsv8Gezi5w9S1yxR/VMTFq29jpVeSLaia8hjC3mcJHmFjZ5YYVBWdnqCbwAlKBYKolvEaoqJPBFn3jhbZSkCRTfdw+wv5v0qUNF8OKns9V4XR1K6AFZU4BXeflQhNXLWybNyuAaoScFerjBcxF3OEFxOdhyqkPFQn5KE6MQ8JEUPnYa7wNcl/cnfJ4p6n5N1lDaC7B9bapCp/4eSOf+nobsYypfx7uArwqW0f4fPHaW4Ngu7OJ+sNwhfsQ8C9QMk7EGB9zALwO5C0UMmVieCxu7+rlFoZf0yGr0PlJJkclHKbJZ6sa/qXgBlCA4r1txGruYs1a/RgRg6WmsDBsm9lGBFog2VfgsDuR+ij/XyGntVHSFOB7KNae5DP0n4Xq49qEfpof0If7e/1kebVLsnL62m+fB7gLWwdqGVose7vAAI5DiKQ4yDiqonLw4GEPNQm5KH2bgybcHIHknQlVhOSzedCJasxdYCrMcAVFLNQyWrMAUDTfCDQ7BysQM/rEHTsHQWrMQcTcL+rZDUGWB/z7t7VmOCxJ3pU6pFMDkq5zRKrMXW1rcbUTcFqDHKw1AUOlnoKVmPqEQS2PqGP6qdgNQZpKpB9dIiC1ZhDCH2UQeijDN9qzD8NMS3L/nsHYih0qLaBeOhuDMRwckeJhkMO12RjLZHxpFqqCTgUiLkBcNVgCXDVhcWXBoRBcBiBh4elYMUN+XoHaU4+ULLihuRhQyAPPxC+b87xsCGBh40IPGy0Cx6mge+7IrCPGoM/cRN8JZg40D0BXL0u8cqtiffKrSlrs3rjysW/DAWAkeDEvaJJ10z48rRrgGYE3M0JYtOc+LqxKSkPhxPycHgKzE8T4KpcU6CAHyGcT3VIffSR8Nc9DvMRBNxLlbzuAdbHLN37uid47IkelXokk4NSbrPE6lYL5upWM8JgaZGC1z3IwdICOFhaCn/d4+rdkiCwrQh91CoFr3uQpgLZR2Hhr3tcH4UJfWQIfWT+zebbxIHOD/BTeyWetDO9B+GIlqHAur9MQvNlEZovi/i06fIQIeQhm5CH7BQ8bWYCTUEEKOY5wvlUg/S0+amCp80cAu5lSp42gfUxy/Y+bQaPPdGjUo9kclDKbZZ42szV9rSZm4KnTeRgyQUOlqiCp80oQWDzCH2Ul4KnTaSpQPZRawVPm60JfXQkoY+O/A9sLmQta+4diKHQUdoG4lEp2FzYpDJnuCYba4WSzYVHATG3AW5GWSF8c6HjSxvCIGhL4GHbFKx4IJevkeZkpZLNhUgeHg3k4UrhmwsdD48m8PAYAg+PIa7AViKtnLUTvmLovlm4HQG3lq9vvwoYq70fs8mJZUXCsVh2NCeaHcuP2ZgmMysrlpcbiUXyCyLZ0Wh2XmEsmpMbzcqPZ5twXlYkJxqPFuXnFOVmpvQPxbQHczVxHLsL/wq7aVYijq2Mj3sccDixcB9XGV6jv/+SYeJ+e4WK/4Lh8b7f5w40sZE571CZ27fJ3t+VNkYHgoh/Idy8uB5i4F6t5LUPsD4GiTnB+wTeBO/9/D/B4z+6J44gceEr4a9AHeYTCLi/VsIFYH3M1wQuJB54r/Q4cJX3c1iomBMnkmdiVWCsk5Sa3ZNIZrejNrPrEtGRYHZPFm52He6TCWaXca8dvHtFi/ophE2NaOw32ICnEOpUzovTycbubM8u9jy18k6xTaw0dapcvMHUXXcOXHcJXJ/qqxErD+ge+FbJym4ngJ7Ei3YenYHa9J3w/HmYC7vg8pd3KjB/65R80SWQJwbYM2Zdioy5BP4mYp1GXogJJ3cYp9OdCFrdVfhbBIf7NALu04XjvtgG7ErA/aPwhTf3oHo6AfcGJZ7kDKAOAWttNgjvG8cXRt9sVMAXhk5sUsKXbkC+AGttNhEXvZ1GuIW9bpWLF/i6kxf4kM83ZyrwWp0JnOqhwGudScB9lnDcl9iAPQi4NwufHU4zziLg3qJkdvQE6hCw1maL8L5xfGH0zVYFfGHoxDYlfDkbyBdgrc02otfq6Xmss31e6xyy1+oC9Fq9FHitLgRO9VbgtXoRcJ8rHPcAG7A3Afd24bPDaca5BNw7lMyO84A6BKy12SG8bxxfGH1TppF8vjB0Iq2RDr7EgHwB1tog8xf0Wud5Hivm81r5ZK+FfO9coMBrnUrgVKECr1VAwB0XjnugDVhIwF1e+OxwmhFnfPJMyewoAuoQsNYmXXjfOL4w+qaSAr4wdKKyEr6cD+QLsNamMtFrFXke63yf17qgcvG/o3vsRvKe2z42dl97XmjPiwJ7bvsE9tT2DVxfGLi+iLjn9kbSnttqSrjWB7jnti/Qu1cXnr/EntsLgXtuLwLmr0aK8hdO7jBAnhhgzxhW/tDPy32APdNPwfNyH4JW91fwvNyPgPti4bgvtQH7E3DvJ9z/O993MQF3LSWe5BKgDgFrbWoJ7xvHF0bfHKiALwydOEgJXwYA+QKstTmI+Lx8ifecPMD3vDyQ/G4C+XxzqQKv1ZfAqcsUeK1LCbgHCcd9mQ14GQH3wdLXmC3mQQTcdZXMjsFAHQLW2tQV3jeOL4y+OUQBXxg6kaGEL5cD+QKstckgeq3Bnse63Oe1riB7rQuBXmuIAq91IYFTQxV4rSEE3FcKxz3IBhxKwH2Y8NnhNONKAu6GSmbHVUAdAtbaNBTeN44vjL5pooAvDJ1oqoQvw4B8AdbaNCV6ras8jzXM57WGk70W8r3z1Qq81kUETo1Q4LWuJuAeKRz3YBtwBAH34cJnh9OMkQTcRyiZHaOAOgSstTlCeN84vjD6ppUCvjB0IqyEL9cA+QKstQkTvdYoz2Nd4/Na13o94P/vrvX+vU2o+L8b7XkydB+637Gr/aiZ8aJY2JYzkh/LN7HcuMk1RZFIrimMhgvzs2LhosxYfjSeU1gUyTKZWbGCSCSrML8onJ0TzsoLR+MG+T3AwfyM9vLTyZefMcS9yzeR9i7X8uJcZ2Nfb8+x9hxnzxvseaM9b7Lnzfa8xZ632nO8PW+z5+32nGDPO+x5pz3vsufd9rzHnvdWLrn3+brKJfc2Xx+4Hhu4Hhe4viFwfWPg+qbA9c2B61sC17cGrscHrm8LXN8euJ4QuL4jcH1n4PquwPXdget7Atf3Vubt/b6JtPc7okTzrwM89yX2fl8PfIbMUrL3eywuf3njgPnL1pE/cwMsf3FzIzB/OSryV2BuguUvam4G5i9XRf7C5hZU/uJhcyswf1EN+SsIm/Go/EXD5jZg/vI05M/6j9tB+YvbWBOA+WutIH8FFvMdoPxFbaw7gfk7UkH+bGhzFyZ/cRfrbmD+jpKfvwKH+R5M/qIu1r3A/LVR8tk/4HOS8T8zJJu/tkryB/T5JgeYv6OV5A/oU00UmL9jlOQP6LNMa2D+2inJH9AnmKOA+WuvJH/AOWfaAvN3rJL8AXXaHAPM33FK8gfUGdMemL/jleQPyBMD7BnDyl9aIH8S1u8Tse5TsG/rOsK7mvsV7Nu6j4B7onDcl9uA9xNwnyV8H4p7bz6RgLunkneSDwB1CFhr01N43zi+MPqmlwK+MHSitxK+PAjkC7DWBpm/4H6jB7z9Rg9WLt5v9BB5jzxyf8PDCrzW9QROTVLgtR4m4H5EOO4rbMBJBNwx4bPDacYjBNz5SmbHo0AdAtba5AvvG8cXRt/EFfCFoRNFSvjyGJAvwFqbIqLXetTzWI/5vNbjZK81Fui1nlDgtcYSOPWkAq/1BAH3ZOG4h9iATxJw9xE+O5xmTCbg7qtkdjwF1CFgrU1f4X3j+MLom34K+MLQif5K+PI0kC/AWpv+RK/1lOexnvZ5rWfIXgv5uZNnFXitcQROTVHgtZ4l4H5OOO6hNuAUAu4BwmeH04znCLgHKpkdzwN1CFhrM1B43zi+MPpmkAK+MHRisBK+vADkC7DWZjDRaz3veawXfF5rKtlr3QD0Wi8q8Fo3EDj1kgKv9SIB9zThuK+0AV8i4B4ifHY4zZhGwD1UyeyYDtQhYK3NUOF94/jC6JthCvjC0InhSvjyMpAvwFqb4USvNd3zWC/7vNYrZK+F/D6QGQq81o0ETs1U4LVmEHDPEo77KhtwJgH3SOGzw2nGLALuUUpmx6tAHQLW2owS3jeOL4y+Ga2ALwydGKOEL7OBfAHW2owheq1XPY812+e15pC91k1Ar/WaAq91E4FTryvwWq8RcM8VjnuYDfg6AfdY4bPDacZcAu5xSmbHPKAOAWttxgnvG8cXRt/cpIAvDJ24WQlf3gDyBVhrczPRa83zPNYbPq/1JtlrIb+ndb4Cr3UzgVMLFHit+QTcbwnHPdwGXEDAPV747HCa8RYB921KZsfbQB0C1trcJrxvHF8YfXOHAr4wdOJOJXxZCOQLsNbmTqLXetvzWAt9XmsR2WvdAvRa7yjwWrcQOPWuAq/1DgH3e8JxX20DvkvAfY/w2eE04z0C7nuVzI7FQB0C1trcK7xvHF8YfTNRAV8YOvGAEr4sAfIFWGvzANFrLfY81hKf13qf7LWQfz/nAwVe61YCpz5U4LU+IOD+SDjuETbghwTcDwufHU4zPiLgnqRkdiwF6hCw1maS8L5xfGH0zWMK+MLQiceV8OVjIF+AtTaPE73WUs9jfezzWp+QvdZ4oNf6VIHXGk/g1DIFXutTAu7PhOMeaQMuI+CeLHx2OM34jID7KSWzYzlQh4C1Nk8J7xvHF0bfPKuALwydmKKELyuAfAHW2kwheq3lnsda4fNan5O9FvLvGq9U4LVuI3BqlQKvtZKA+wvhuEfZgKsIuF8QPjucZnxBwD1VyexYDdQhYK3NVOF94/jC6JtpCvjC0InpSvjyJZAvwFqb6USvtdrzWF/6vNYaste6Hei1vlLgtW4ncOprBV7rKwLub4TjvsYG/JqAe4bw2eE04xsC7plKZsdaoA4Ba21mCu8bxxdG38xWwBeGTsxRwpdvgXwB1trMIXqttZ7H+tbntb4je60JQK+1ToHXmkDg1HoFXmsdAff3wnFfawOuJ+CeK3x2OM34noB7npLZ8QNQh4C1NvOE943jC6Nv5ivgC0MnFijhy49AvgBrbRYQvdYPnsf60ee1NpC91h1Ar/WTAq91B4FTPyvwWj8RcG8Ujnu0DfgzAfdC4bPDacZGAu5FSmbHJqAOAWttFgnvG8cXRt+8p4AvDJ1YrIQvvwD5Aqy1WUz0Wps8j/WLz2v9SvZadwK91mYFXutOAqe2KPBamwm4fxOOe4wNuIWA+wPhs8Npxm+Mz9sqmR2/A3UIWGvzofC+cXxh9M3HCvjC0IlPlPBlK5AvwFqbT4he63fPY231ea1tZK91F9Br/aHAa91F4NSfCrzWHwTc24Xjvs4G/JPx+Uvhs8NpxnYC7uVKZscOoA4Ba22WC+8bxxdG36xUwBeGTqxSwpe/gHwB1tqsInqtHZ7H+svntUJVQiUOtNe6G+i1ylSR77XuJnAqrYp8r+Vqg8ZdVjju623ANALuL4XPDqcZZQm41yiZHeWAOgSstVkjvG8cXxh9840CvjB0Yq0SvpQH8gVYa7OW6LWcRjiPVb5KsddKJ3ute4Beq4ICr3UPwWtVVOC1KhC0pJJw3GNtwIoE3OuEzw6nGZUIuNcrmR2VgToErLVZL7xvHF8YffOjAr4wdGKDEr5UAfIFWGuzgei1Knseq4rPa1Ule617gV6rmgKvdS/Ba1VX4LWqEbSkhnDc42zA6gTcG4XPDqcZNQi4NymZHfsAdQhYa7NJeN84vjD6ZrMCvjB0YosSvtQE8gVYa7OF6LX28TxWTZ/X2tfzWug+cPFOIfiOrcJ55TDvS+DVNhKv0sD4gfUxqcKcbG1OBj5P7Cf8eaKDxbofob9rkX11svdX1caoRcC9XbienViZg3uHEj0D1scgMaeHdnqiMqH/f6B74KoQ1pMkjv2r7OL+UTfNSsT+VfBxD6iCIxYL9wFV4DWiDmVkTg8EDuX/BuIepJG4BxGIW1sBcWuTiMtwlgcSnEadKjoEC9lLB4MFyx1l/w32cHKHCVeyq3DAXd2ZNl6dyrIFVVMeQ9j7LMEjbOzMEoOqrtMTdBM4QTmYIKplvIao6xNB1r2jRbYeUGTTPdz+Qv6vEiXNl4P6Xs8dwmhqV8C6SpyCu896hCbOEP5u1zVABgH3oVXwIuZijvBiovNwCCkPDQh5aEDMQ0LE4O9uGsvmwT+5u6Q/qwXGnTjQ7y4PA7p7YK1NqvIXTu74l47uZixTyr+HDwE+tTUUPn+c5h5G0N3yZL1B+IKGBNzpJL6gzTKwPgaJOd3D6l+ZCB67+7tKqZXxx2T4OlROkslBKbdZ4sm6kX8JmCE0oFh/G7FGu1izRg9m5GBpBBwsjavAiEAbLI0JAtuE0EdNfIae1UdIU4Hso6Z7kM/Sfherj5oS+qgZoY+aeX2kebVL8vJ6mi+fzb2FrcO1DC3W/TUnkOMIAjmOIK6auDwcTshDC0IeWuzGsAkndyBJV2I1IelPNStZjWkJXI0BrqCYSkpWY5oDTfPhQLPTSoGetyToWBUFqzGtCLirKlmNAdbHVN27GhM89kSPSj2SyUEpt1liNSasbTUmnILVGORgCQMHi1GwGmMIAptJ6KPMFKzGIE0Fso8iClZjIoQ+yiL0UZZvNeafhpiWZf+9AzEUytY2ELN3YyCGkztKNBxyuCb9nRoynlRLNQHZQMw5wFWDGsBVFxZfcgiDIJfAw9wUrLghX+8gzUlNJStuSB5GgTysKXzfnONhlMDDPAIP83bBwzTwfdcF9lFr8Cdugq8EEwe6J4Cr1yVeuR3pvXI7irVZvXWV4l+GAsBIcOJe0aRrI3x52jVAGwLutgSxaUt83XgUKQ9HE/JwdArMz5HAVbmjgAJ+jHA+tST10X7CX/f8S+cIuGsped0DrI+ptfd1T/DYEz0q9UgmB6XcZonVrXbM1a02hMHSLgWve5CDpR1wsLQX/rrH1bs9QWCPJfTRsSl43YM0Fcg+Ok746x7XR8cR+uh4Qh8d/2823yYOdH6An9or8aTdwXsQPkHLUGDdXwdC851IaL4TiU+bLg8nEPJwEiEPJ6XgabMD0BScABTzjsL5dBjpafNABU+bHQm4D1LytAmsjzlo79Nm8NgTPSr1SCYHpdxmiafNk7U9bZ6cgqdN5GA5GThYTlHwtHkKQWA7EfqoUwqeNpGmAtlHnRU8bXYm9FEXQh91+Q9sLmQta+4diKHQqdoG4qkp2Fx4ZBXOcE36q1CVbC48FYj5NOBmlIOFby50fDmNMAi6EnjYNQUrHsjla6Q5qadkcyGSh6cDeVhP+OZCx8PTCTw8g8DDM4grsPVIK2fdhK8Yum8W7kbAreXr268Gxurux2xyYlmRcCyWHc2JZsfyYzamyczKiuXlRmKR/IJIdjSanVcYi+bkRrPy49kmnJcVyYnGo0X5OUW5mSn9QzHdwVxNHGfuwr/CbpqViDOr4OP2AA4nFu4eVeA1+vsvGSbut3eo+C8YnuX7fe5AExuZ855VuH2b7P0NtzF6EkT8EOHmxfUQA3eGktc+wPoYJOYE7xN4E7z38/9sj//onmhB4sJhwl+BOsxnE3A3VMIFYH1MQwIXEg+8wz0OXO39HBEq5sQ55JlYDRirl1Kz24tkdntrM7suEb0JZvdc4WbX4T6XYHYZ99rTu1e0qJ9H2NSIxv6UDXgeoU7lvDgxGzvfngX2LKyyU2wTK02xKsUbTN11fuC6IHBd6KsRKw/oHmiiZGU3BtCTeNHOIx+oTU2F58/DXFiAy19eITB/zZR80SWQJwbYM6ZZioy5BP4mYsXJCzHh5A7jdDpG0Ooi4W8RHO44Aff5wnHfbAMWEXC3EL7w5h5UzyfgbqnEk1wA1CFgrU1L4X3j+MLoG6OALwydyFTClz5AvgBrbTKJi95OI9zCXp8qxQt8fckLfMjnmwsVeK18AqcuUuC1LiTg7icc9y024EUE3NnCZ4fTjH4E3DlKZkd/oA4Ba21yhPeN4wujb/IU8IWhE62V8OViIF+AtTatiV6rv+exLvZ5rUvIXqsA6LUGKPBaBQRODVTgtQYQcF8qHPetNuBAAu42wmeH04xLCbjbKpkdlwF1CFhr01Z43zi+MPqmnQK+MHSivRK+DALyBVhr057otS7zPNYgn9caTPZayPfOlyvwWoUETl2hwGtdTsA9RDju8TbgFQTcxwufHU4zhhBwd1AyO4YCdQhYa9NBeN84vjD65iQFfGHoREclfLkSyBdgrU1Hotca6nmsK31e66oqxf+O7rGnyXtuh9nYw+15tT1HBPbcDgvsqR0euL46cD2CuOf2adKe205KuDYMuOd2ONC7d1ay5/Zq4J7bEcD8dVGy5xbIEwPsGcPKH/p5eRiwZ0YqeF4eRtDqUQqel0cScF8jHPdtNuAoAu7Thft/5/uuIeA+Q4knuRaoQ8BamzOE943jC6NvzlTAF4ZO9FDCl9FAvgBrbXoQn5ev9Z6TR/uel8eQ300gn2+uU+C1hhM4db0Cr3UdAfdY4bhvtwGvJ+A+W/jscJoxloD7HCWzYxxQh4C1NucI7xvHF0bfnKuALwydOE8JX24A8gVYa3Me0WuN8zzWDT6vdSPZa10N9Fo3KfBaVxM4dbMCr3UTAfctwnFPsAFvJuAuED47nGbcQsBdqGR23ArUIWCtTaHwvnF8YfTN+Qr4wtCJC5TwZTyQL8BamwuIXutWz2ON93mt28heC/ne+XYFXmsEgVMTFHit2wm47xCO+w4bcAIB94XS3wVZzHcQcF+kZHbcCdQhYK3NRcL7xvGF0TcXK+ALQycuUcKXu4B8AdbaXEL0Wnd6Husun9e62+sB/393t/fvbUPF/909nidD96H7Hbvaj5oZL4qFbTkj+bF8E8uNm1xTFInkmsJouDA/KxYuyozlR+M5hUWRLJOZFSuIRLIK84vC2TnhrLxwNG6Q3wMczM89Xn46+/JzL3Hv8jOkvcu1vDj32dj323OiPR+w54P2fMieD9tzkj0fseej9nzMno/b8wl7PmnPyfZ8yp5P2/MZez5rzylVSu59vq9Kyb3N9weuJwauHwhcPxi4fihw/XDgelLg+pHA9aOB68cC148Hrp8IXD8ZuJ4cuH4qcP104PqZwPWzgespVXh7v58h7f2+VInm3wd47kvs/b4f+Ax5mZK93xNx+ct7AJi/QTryZx6E5S9uHgLmb7CK/BWYh2H5i5pJwPxdriJ/YfMIKn/xsHkUmL8rNOSvIGweQ+UvGjaPA/M3REP+rP94ApS/uI31JDB/QxXkr8BingzKX9T97Q1g/q5UkL+w++wjJn9xF+sZYP6ukp+/Aof5WUz+oi7WFGD+hin57B/wOcn4nxmS3uetJH9An28GA/N3tZL8AX2quQKYvxFK8gf0WWYoMH8jleQP6BPMVcD8jVKSP+CcM8OB+btGSf6AOm1GAPN3rZL8AXXGjALmb7SS/AF5YoA9Y1j5SwvkT8L6fSLWcwr2bd1HeFfzvIJ9W88RcL8gHPedNuDzBNz3CN+H4t6bv0DAfa+Sd5JTgToErLW5V3jfOL4w+maiAr4wdOIBJXx5EcgXYK0NMn/B/UZTvf1GL1Yp3m/0EnmPPHJ/wzQFXut+AqemK/Ba0wi4XxaO+y4bcDoB98PCZ4fTjJcJuCcpmR2vAHUIWGszSXjfOL4w+uYxBXxh6MTjSvgyA8gXYK3N40Sv9YrnsWb4vNZMsteaCPRasxR4rYkETr2qwGvNIuCeLRz33TbgqwTck4XPDqcZswm4n1IyO+YAdQhYa/OU8L5xfGH0zbMK+MLQiSlK+PIakC/AWpspRK81x/NYr/m81utkr4X83MlcBV7rAQKn5inwWnMJuN8QjvseG3Ae492p8NnhNOMNAu6pSmbHm0AdAtbaTBXeN44vjL6ZpoAvDJ2YroQv84F8AdbaTCd6rTc9jzXf57UWkL3Wg0Cv9ZYCr/UggVNvK/BabxFwLxSO+14b8G0C7hnCZ4fTjIUE3DOVzI5FQB0C1trMlL5vqQynb2Yr4AtDJ+Yo4cs7QL4Aa23mEL3WIs9jvePzWu+SvRby+0DeU+C1HiJwarECr/UeAfcS4bjvswEXE3DPFT47nGYsYazfKpkd7wN1CFhrM0943zi+MPpmvgK+MHRigRK+fADkC7DWZgHRa73veawPfF7rQ7LXehjotT5S4LUeJnBqqQKv9REB98fCcd9vAy5lrOcJnx1OMz4m4F6kZHZ8AtQhYK3NIuF94/jC6Jv3FPCFoROLlfDlUyBfgLU2i4le6xPPY33q81rLyF4L+T2tnynwWpMInFquwGt9RsC9QjjuiTbgcgLuD4TPDqcZKwi4P1QyOz4H6hCw1uZD4X3j+MLom48V8IWhE58o4ctKIF+AtTafEL3W557HWunzWqvIXusRoNf6QoHXeoTAqdUKvNYXBNxfCsf9gA24moD7M+Gzw2nGl4xnCiWzYw1Qh4C1NsuF943jC6NvVirgC0MnVinhy1dAvgBrbVYRvdYaz2N95fNaX5O9FvLv53yjwGs9SuDUWgVe6xsC7m+F437QBlzL8JjCZ4fTjG8JuNcomR3fAXUIWGuzRnjfOL4w+uYbBXxh6MRaJXxZB+QLsNZmLdFrfed5rHU+r7We7LUeA3qt7xV4rccInPpBgdf6noD7R+G4H7IBfyDgXid8djjN+JGAe72S2bEBqEPAWpv1wvvG8YXRNz8q4AtDJzYo4ctPQL4Aa202EL3WBs9j/eTzWj+TvRby7xpvVOC1HidwapMCr7WRgPsX4bgftgE3EXBvFD47nGb8wuhzJbPjV6AOAWttNgnvG8cXRt9sVsAXhk5sUcKXzUC+AGttthC91q+ex9rs81pbyF7rCaDX+k2B13qCwKnfFXit3wi4twrHPckG/J2BW/jscJqxlYB7m5LZsQ2oQ8Bam23C+8bxhdE32xXwhaETO5Tw5Q8gX4C1NjuIXmub57H+8HmtP8le60mg19quwGs9yeCUAq+1nYD7L+G4H7EBdxBwl2kiG7fTjL8IuNOa6Jgdoaq4XAJrbdKE943jC6NvyivgC0Mn0pXwpQyQL8BaG2T+gl7LaYTzWGWqFnuttKqhEgfaa00Geq2yVeV7rckETpWrKt9rudrANVQ47kdtwHIE3JWEzw6nGeUJuCsrmR3pQB0C1tpUFt43ji+MvqmmgC8MnaiuhC8VgHwB1tpUJ3qtdM9jVfB5rYpkr/UU0GtVUuC1niJ4rcoKvFYlgpZUEY77MRuwMgF3TeGzw2lGFQLufZXMjqpAHQLW2uwrvG8cXxh9s78CvjB04gAlfKkG5Auw1uYAoteq6nmsaj6vVZ3stZ4Geq0aCrzW0wSvtY8Cr1WD4TmE437cBtyHgLu28NnhNKMmAXcdJbNjX6AOAWtt6gjvG8cXRt/UU8AXhk7UV8KX/YB8Adba1Cd6rX09j7Wfz2vVInutZ4Bea38FXusZgtc6QIHX2p+gJQcKx/2EDXgAAfehwmeH04wDCbgbKJkdBwF1CFhr00B43zi+MPqmkQK+MHSisRK+1AbyBVhr05jotQ7yPFZtn9eqQ/ZazwK91sEKvNazBK9VV4HXOpjxvCoc95M2YF0C7mbCZ4fTjHoE3M2VzI76QB0C1to0F943ji+MvmmhgC8MnWiphC+HAPkCrLVpSfRa9T2PdYjPa2WQvdYUoNc6VIHXmkLwWg0UeK1DCVpymHDck23ABgTcRvjscJpxGAF3ppLZ0RCoQ8Bam0zhfeP4wuibbAV8YehEjhK+NALyBVhrk0P0Wg09j9XI57Uae14L/rl1G+M8gu/IE84rh7kxgVetSbxKA+MH1sekCnOytTkX+DzRRPjzRE+LtQmhv5uSfXXS+3ttjKYE3G2E69k5VTi42yrRM2B9DBJzeminJyoT+v8HugeuDmE9SeJoVnUX94+6aVYimlXFx21eFUcsFu7mVeE1og5lZE4PBw7l/wbiHqGRuEcQiNtCAXFbkIjLcJaHM97+VNUhWMheagUWLHeU/TfYw8kd5rjKdhUO+I2OHWy8llVkC6qmPIaw91mCR9jYmSUGVdjpCboJnKC0IohqGa8hwj4RZN07/PUQUGTTPdz+Qv6vEiXNl4NMr+cijKZ2BQwrcQruPg2hibOEv9t1DZDFeFdVFS9iLuYILyY6DxFSHnIIecgh5iEhYug8tBO+JvlP7i5Z3O2VvLvMBbp7YK1NqvIXTu74l47uZixTyr+HI8Cntqjw+eM0N5egu8eT9QbhC6IE3B2UvAMB1sd0AL8DSQuVXJkIHrv7u0qplfHHZPg6VE6SyUEpt1niyTrPvwTMEBpQrL+NWN4u1qzRgxk5WPKAg6V1VRgRaIOlNUFgjyT00ZE+Q8/qI6SpQPbRUXuQz9J+F6uPjmJs0iD0URuvjzSvdkleXk/z5bOtt7B1tJahxbq/tgRyHEMgxzHEVROXh6MJeWhHyEO73Rg24eQOJOlKrCYkm8+TlKzGtAeuxgBXUMxJSlZj2gJN89FAs3OsAj1vT9CxkxWsxhxLwH2KktUYYH3MKXtXY4LHnuhRqUcyOSjlNkusxhynbTXmuBSsxiAHy3HAwXK8gtWY4xnL3YQ+6pCC1RikqUD20QkKVmNOIPTRiYQ+OtG3GvNPQ0zLsv/egRgKnaRtIJ60GwMxnNxRouGQwzXZWF1kPKmWagJOAmLuCFw16AJcdWHxpSPjSZXAw5NTsOKGfL2DNCenKVlxQ/LwFCAPTxO+b87x8BQCDzsReNhpFzxMA993GNhHncGfuAm+Ekwc6J4Arl6XeOXWxXvldiprs3rnqsW/DAWAkeDEvaJJd5rw5WnXAKcRcHcliE1X4uvGU0l5OJ2Qh9NTYH66AFflTgUK+BnC+dSe1UfCX/c4zGcQcJ+h5HUPsD7mjL2ve4LHnuhRqUcyOSjlNkusbnVjrm6dRhgs3VLwugc5WLoBB0t34a97XL27EwT2TEIfnZmC1z1IU4Hsox7CX/e4PupB6KOzCH101r/ZfJs40PkBfmqvxJN2T+9B+GwtQ4F1fz0JzXcOofnOIT5tujycTchDL0IeeqXgabMn0BScDRTz3sL5lEt62jxTwdNmbwLuHkqeNoH1MT32Pm0Gjz3Ro1KPZHJQym2WeNo8V9vT5rkpeNpEDpZzgYPlPAVPm+cRBDZG6KNYCp42kaYC2Uf5Cp428wl9VEDoo4L/wOZC1rLm3oEYChVqG4iFKdhc2KUqZ7gmLbBKNhcWAjHHgZtRzha+udDxJU4YBEUEHhalYMUDuXyNNCe9lGwuRPLwfCAPewnfXOh4eD6BhxcQeHgBcQXWkFbO+ghfMXTfLNyHgFvL17ePAsbq68dscmJZkXAslh3NiWbH8mM2psnMyorl5UZikfyCSHY0mp1XGIvm5Eaz8uPZJpyXFcmJxqNF+TlFuZkp/UMxfcFcTRwX7sK/wm6alYgLq+LjXgQcTizcF1WF1+jvv2SYuN9zQ8V/wbCf7/e5A01sZM77V+X2bbL3N9LG6E8Q8XOFmxfXQwzc5yl57QOsj0FiTvA+gTfBez//L/b4Dzc0JC4UCH8F6jBfTMBdqIQLwPqYQgIXEg+8Iz0OjPJ+XhMq5sQl5JlYHRhrgFKzO4BkdgdqM7suEQMJZvdS4WbX4b6UYHYZ99rfu1e0qF9G2NSIxr7QBryMUKdyXpxBNvZge15uzyuq7hTbxErToKrFG0zd9eDA9eWB6yt8NWLlAd0D5ytZ2R0E0JN40c5jMFCbLhCePw9z4eW4/OVdAcxfHyVfdAnkiQH2jOmTImMugb+JWEPICzHh5A7jdHoQQauHCn+L4HAPIeC+UjjuZ23AoQTc/YQvvLkH1SsJuPsr8SRXAXUIWGvTX3jfOL4w+maAAr4wdGKgEr4MA/IFWGszkLjo7TTCLewNq1q8wDecvMCHfL65WoHXGkzg1AgFXutqAu6RwnFPsQFHEHAPEj47nGaMJOAerGR2jALqELDWZrDwvnF8YfTNEAV8YejEUCV8uQbIF2CtzVCi1xrleaxrfF7rWrLXuhzotUYr8FqXEzg1RoHXGk3AfZ1w3M/ZgGMIuIcJnx1OM64j4B6uZHZcD9QhYK3NcOF94/jC6JuRCvjC0IlRSvgyFsgXYK3NKKLXut7zWGN9Xmsc2Wsh3zvfoMBrXUHg1I0KvNYNBNw3Ccf9vA14IwH3aOGzw2nGTYxnCiWz42agDgFrbcYI7xvHF0bfjFXAF4ZOjFPCl1uAfAHW2owjeq2bPY91i89r3Vq1+N/RPbaIvOd2vI19mz1vt+eEwJ7b8YE9tbcFrm8PXE8g7rldRNpze5MSro0H7rm9Dejdb1ay5/Z24J7bCcD83aJkzy2QJwbYM4aVP/Tz8nhgz9yh4Hl5PEGr71TwvHwHAfddwnG/YAPeScB9u3D/73zfXQTcE5R4kruBOgSstZkgvG8cXxh9c5cCvjB04m4lfLkHyBdgrc3dxOflu73n5Ht8z8v3kt9NIJ9v7lPgtW4jcOp+BV7rPgLuicJxT7UB7yfgvk/47HCaMZHR50pmxwNAHQLW2twvvG8cXxh986ACvjB04iElfHkQyBdgrc1DRK/1gOexHvR5rYfIXut2oNd6WIHXup3AqUkKvNbDBNyPCMf9og04iYFb+OxwmvEIAfejSmbHo0AdAtbaPCq8bxxfGH3zhAK+MHTiSSV8eQzIF2CtzZNEr/Wo57Ee83mtx8leC/ne+QkFXmsCg1MKvNYTBNyTheN+yQZ8koD7aeGzw2nGZALuZ5TMjqeAOgSstXlGeN84vjD65jkFfGHoxPNK+PI0kC/AWpvniV7rKc9jPe3zWs94PeD/757x/v3oUPF/96znydB96H7HrvajZsaLYmFbzkh+LN/EcuMm1xRFIrmmMBouzM+KhYsyY/nReE5hUSTLZGbFCiKRrML8onB2TjgrLxyNG+T3AAfz86yXny6+/Ewh7l1+h7R3uZYX5zkb+3l7vmDPqfZ80Z4v2XOaPafb82V7vmLPGfacac9Z9nzVnrPtOceer9nzdXvOtee8qiX3Pj9XteTe5ucD1y8ErqcGrl8MXL8UuJ4WuJ4euH45cP1K4HpG4Hpm4HpW4PrVwPXswPWcwPVrgevXA9dzA9fzqvL2fr9D2vv9ohLNfw7w3JfY+/088BnyJSV7v1/A5S9vKjB/03Tkz7wIy1/cvATM33QV+Ssw02D5i5rpwPy9rCJ/YfMyKn/xsHkFmL9XNOSvIGxmoPIXDZuZwPzN0JA/6z9mgfIXt7FeBeZvpoL8FVjMs0H5i9pYc4D5m6Ugfza0eQ2Tv7iL9Towf6/Kz1+BwzwXk7+oizUPmL/ZSj77B3xOMv5nhmTzN0dJ/oA+30wH5u81JfkD+lTzCjB/ryvJH9BnmZnA/M1Vkj+gTzCvAvM3T0n+gHPOzAHm7w0l+QPqtHkdmL83leQPqDNmHjB/85XkD8gTA+wZw8pfWiB/Etbv/9YsBfu2niO8q3lTwb6tNwi45wvHPc0GfJOA+zPpf8vBYp5PwL1cyTvJBUAdAtbaLBfeN44vjL5ZqYAvDJ1YpYQvbwH5Aqy1QeYvuN9ogbff6K2qxfuN3ibvkUfub1iowGs9T+DUIgVeayEB9zvCcU+3ARcRcH8pfHY4zXiHgHuNktnxLlCHgLU2a4T3jeMLo2++UcAXhk6sVcKX94B8AdbarCV6rXc9j/Wez2stJnutF4Bea4kCr/UCgVPvK/BaSwi4PxCO+2Ub8H0C7nXCZ4fTjA8IuNcrmR0fAnUIWGuzXnjfOL4w+uZHBXxh6MQGJXz5CMgXYK3NBqLX+tDzWB/5vNZSstdCfu7kYwVeayqBU58o8FofE3B/Khz3KzbgJwTcG4XPDqcZnxJwb1IyO5YBdQhYa7NJeN84vjD6ZrMCvjB0YosSvnwG5Auw1mYL0Wst8zzWZz6vtZzstV4Eeq0VCrzWiwROfa7Aa61g7MMQjnuGDfg5AfdW4bPDacZKAu5tSmbHKqAOAWtttgnvG8cXRt9sV8AXhk7sUMKXL4B8Adba7CB6rVWex/rC57VWk70W8vtAvlTgtV5i7GNR4LW+JOD+SjjumTbgGgLuMk1l43aa8RUBd1pTHbPja6AOAWtt0oT3jeMLo2/KK+ALQyfSlfDlGyBfgLU2yPwFvdbXnsf6xue11pK91jSg1/pWgdeaRuDUdwq81reMfUvCcc+yAb8j4K4kfHY4zVhHwF1ZyexYD9QhYK1NZeF94/jC6JtqCvjC0InqSvjyPZAvwFqb6kSvtd7zWN/7vNYPZK+F/J7WHxV4remMPZAKvNaPBNw/Ccf9qg24gYC7pvDZ4TTjJwLufZXMjp+BOgSstdlXeN84vjD6Zn8FfGHoxAFK+LIRyBdgrc0BRK/1s+exNvq81iay13oZ6LV+UeC1XiZw6lcFXusXxp5X4bhn24C/EnDXFj47nGZsJuCuo2R2bAHqELDWpo7wvnF8YfRNPQV8YehEfSV8+Q3IF2CtTX2i19rieazffF7rd7LXQv79nK0KvNYrjD3DCrzWVgLuP4TjnmMDbiPgPlT47HCa8QcBdwMls+NPoA4Ba20aCO8bxxdG3zRSwBeGTjRWwpftQL4Aa20aE73Wn57H2u7zWjvIXmsG0Gv9pcBrzSBwKlRNvtf6i7FHXDju11zAanjczYTPDqcZZQi4myuZHWm4vjTAWpvmwvvG8YXRNy0U8IWhEy2V8KUskC/AWpuWRK/lNMJ5rLLVir1WuWqhEgfaayH/rnH5avK91kzG500UeK3yBC2pIBz36zZgOgG3ET47nGZUIODOVDI7KgJ1CFhrkym8bxxfGH2TrYAvDJ3IUcKXSkC+AGttcoheq6LnsSr5vFZlsteaBfRaVRR4rVkEr1VVgdeqQtCSasJxz7UBqxJw5wmfHU4zqhFwt1YyO6oDdQhYa9NaeN84vjD6po0CvjB0oq0SvtQA8gVYa9OW6LWqex6rhs9r7UP2Wq8CvVZNBV7rVcbnsxR4rZoELdlPOO55NuC+BNzthM8Opxn7EXC3VzI7agF1CFhr01543zi+MPrmeAV8YehEByV82R/IF2CtTQei16rleaz9fV7rALLXmg30Wgcq8FqzCV7rIAVe60CCltQWjvsNG/AgAu6ThM8Opxm1Cbg7KpkddYA6BKy16Si8bxxfGH3TSQFfGDrRWQlfDgbyBVhr05notep4Hutgn9eqS/Zac4Beq54CrzWH8dleBV6rHkFLDhGO+00bsD4B92nCZ4fTjEMIuLsqmR0ZQB0C1tp0Fd43ji+MvummgC8MneiuhC+HAvkCrLXpTvRaGZ7HOtTntRqQvdZrQK91mAKv9RrBazVU4LUOI2hJI+G459uADQm4zxI+O5xmNCLg7qlkdjQG6hCw1qan8L5xfGH0TS8FfGHoRG8lfGkC5Auw1qY30Ws19jxWE5/Xakr2Wq8DvVYzBV7rdYLXaq7AazUjaMnhwnEvsAGbE3DHhM8OpxmHE3DnK5kdRwB1CFhrky+8bxxfGH0TV8AXhk4UKeFLCyBfgLU2RUSvdYTnsVr4vFZLsteaC/RarRR4rbkErxVW4LVaMb77QDjut2zAMAF3H+Gzw2mGIeDuq2R2ZAJ1CFhr01d43zi+MPqmnwK+MHSivxK+RIB8Adba9Cd6rUzPY0V8XiuL7LXmAb1WtgKvNY/gtXIUeK1sgpbkCsf9tg2YQ8A9QPjscJqRS8A9UMnsiAJ1CFhrM1B43zi+MPpmkAK+MHRisBK+5AH5Aqy1GUz0WlHPY+X5vFZrz2uh+8DFu4zgO4YI55XD3JrAq6EkXqWB8QPrY1KFOdnaXAp8njhS+PNEf4v1SEJ/H0X21Ul/p5aNcRQB9zDhenZJVQ7u4Ur0DFgfg8ScHtrpicqE/v+B7oFRIawnSRxtqu3i/lE3zUpEm2r4uG2r4YjFwt22GrxG1KGMzOnRwKH830DcYzQS9xgCcdspIG47EnEZzvJoxjeJVdMhWMheOhYsWO4o+2+wh5M7TI8qdhUO+Ffhetp47avKFlRNeQxh77MEj7CxM0sMquOcnqCbwAnKsQRRLeM1xHE+EWTdO/xr94Aim+7h9hfyf5Uoab4cdPB67gRGU7sCHqfEKbj7PJ7QxCcKf7frGuBExveeVcOLmIs5wouJzsMJpDx0JOShIzEPCRFD52Gk8DXJf3J3yeIepeTd5clAdw+stUlV/sLJHf/S0d2MZUr59/AJwKe2U4TPH6e5JxN0dzRZbxC+4BQC7jFK3oEA62PGgN+BpIVKrkwEj939XaXUyvhjMnwdKifJ5KCU2yzxZN3JvwTMEBpQrL+NWKddrFmjBzNysHQCDpbO1WBEoA2WzgSB7ULooy4+Q8/qI6SpQPbRqXuQz9J+F6uPTiX00WmEPjrN6yPNq12Sl9fTfPns6i1sna5laLHuryuBHGcQyHEGcdXE5eF0Qh66EfLQbTeGTTi5A0m6EqsJyeZzrJLVmO7A1RjgCooZq2Q1pivQNJ8ONDtnKtDz7gQdu0HBasyZBNw3KlmNAdbH3Lh3NSZ47IkelXokk4NSbrPEakwPbasxPVKwGoMcLD2Ag+UsBasxZxEEtiehj3qmYDUGaSqQfXS2gtWYswl9dA6hj87xrcb80xDTsuy/dyCGQr20DcReuzEQw8kdJRoOOVyTjXWLjCfVUk1ALyDm3sBVg1uAqy4svvQmDIJzCTw8NwUrbsjXO0hzMl7JihuSh+cBeThe+L45x8PzCDyMEXgY2wUP08D3fRywj/LBn7gJvhJMHOieAK5el3jlVuC9citkbVbPr1b8y1AAGAlO3CuadHHhy9OuAeIE3EUEsSkivm4sJOXhfEIezk+B+SkArsoVAgX8AuF86k7qo9uFv+5xmC8g4J6g5HUPsD5mwt7XPcFjT/So1COZHJRymyVWt/owV7fihMHSJwWve5CDpQ9wsPQV/rrH1bsvQWAvJPTRhSl43YM0Fcg+ukj46x7XRxcR+qgfoY/6/ZvNt4kDnR/gp/ZKPGn39x6EL9YyFFj315/QfJcQmu8S4tOmy8PFhDwMIORhQAqeNvsDTcHFQDEfKJxPJ5OeNu9S8LQ5kID7biVPm8D6mLv3Pm0Gjz3Ro1KPZHJQym2WeNq8VNvT5qUpeNpEDpZLgYPlMgVPm5cRBHYQoY8GpeBpE2kqkH00WMHT5mBCH11O6KPL/wObC1nLmnsHYih0hbaBeEUKNhcWVOMM12Rj3adkc+EVQMxDgJtR7hO+udDxZQhhEAwl8HBoClY8kMvXSHMyUcnmQiQPrwTycKLwzYWOh1cSeHgVgYdXEVdgjyetnA0TvmLovll4GAG3lq9vHw2MNdyP2eTEsiLhWCw7mhPNjuXHbEyTmZUVy8uNxCL5BZHsaDQ7rzAWzcmNZuXHs004LyuSE41Hi/JzinIzU/qHYoaDuZo4rt6Ff4XdNCsRV1fDxx0BHE4s3COqwWv0918yTNzveaHiv2A40vf73IEmNjLno6px+zbZ+7vWxhhFEPEHhZsX10MM3A8pee0DrI9BYk7wPoH3vNBO3id+uuMaj//onmhF4sIjwl+BOszXEHA/qoQLwPqYRwlcSDzwXutxYLT3c0yomBPXkmdiDWCs0UrN7miS2R2jzey6RIwhmN3rhJtdh/s6gtll3Oso717Ron49YVMjGvt3NuD1hDqV8+KMtbHH2fMGe95YbafYJlaaxlYr3mDqrscFrm8IXN/oqxErD+geeELJyu5YgJ7Ei3Ye44Da9KTw/HmYC2/A5S/vRmD+Jiv5oksgTwywZ8zkFBlzCfxNxLqJvBATTu4wTqfHErT6ZuFvERzumwi4bxGO+10b8GYC7meFL7y5B9VbCLinKPEktwJ1CFhrM0V43zi+MPrmBQV8YejEVCV8GQ/kC7DWZipx0dtphFvYG1+teIHvNvICH/L55nYFXmscgVMTFHit2wm47xCO+z0bcAIB9zThs8Npxh0E3NOVzI47gToErLWZLrxvHF8YfTNDAV8YOjFTCV/uAvIFWGszk+i17vQ81l0+r3U32WvdAPRa9yjwWjcQOHWvAq91DwH3fcJxL7YB7yXgni18djjNuI+Ae46S2XE/UIeAtTZzhPeN4wujb+Yq4AtDJ+Yp4ctEIF+AtTbziF7rfs9jTfR5rQfIXgv53vlBBV7rRsamZgVe60EC7oeF415iAz5EwD1f+OxwmvEwAfcCJbNjElCHgLU2C4T3jeMLo28WKuALQycWKeHLI0C+AGttFhG91iTPYz3i81qPViv+d3SPrSPvuX3Mxn7cnk/Y88nAntvHAntqHw9cPxG4fpK453Ydac/te0q49hhwz+3jQO++WMme2yeAe26fBOZviZI9t0CeGGDPGFb+0M/LjwF7ZrKC5+XHCFr9lILn5ckE3E8Lx/2+DfgUAfdHwv2/831PE3AvVeJJngHqELDWZqnwvnF8YfTNpwr4wtCJZUr48iyQL8Bam2XE5+VnvOfkZ33Py1PI7yaQzzfPKfBajxM49bwCr/Uc43MLwnF/YAM+T8C9QvjscJrxAgH350pmx1SgDgFrbT4X3jeOL4y++UIBXxg6sVoJX14E8gVYa7Oa6LWmeh7rRZ/XeonstZ4Aeq1pCrzWE4zPfSjwWtMIuF8WjvtDG3A6AfdXwmeH04yXCbi/VjI7XgHqELDW5mvhfeP4wuibbxXwhaET3ynhywwgX4C1Nt8RvdYrnsea4fNaM8leC/neeZYCr/UkgVOvKvBasxif8xGO+yMb8FUC7u+Fzw6nGbMJuH9QMjvmAHUIWGvzg/C+cXxh9M1PCvjC0ImflfDlNSBfgLU2PxO91hzPY73m81qvez3g/+9e9/7d3Ufiv5vreTJ0H7o4u9qPmhkvioVtOSP5sXwTy42bXFMUieSawmi4MD8rFi7KjOVH4zmFRZEsk5kVK4hEsgrzi8LZOeGsvHA0bpDfAxzMz1wvP6f68jOPuHd5PWnvci0vzhs29pv2nG/PBfZ8y55v23OhPRfZ8x17vmvP9+y52J5L7Pm+PT+w54f2/MieS+35sT0/qVZy7/Mb1UrubX4zcD0/cL0gcP1W4PrtwPXCwPWiwPU7get3A9fvBa4XB66XBK7fD1x/ELj+MHD9UeB6aeD648D1J9V4e7/Xk/Z+/6JE898APPcl9n6/CXyG/FXJ3u/5uPzlLQDmb7OO/Jm3YPmLm7eB+duiIn8FZiEsf1GzCJi/31TkL2zeQeUvHjbvAvP3u4b8FYTNe6j8RcNmMTB/WzXkz33GBJS/uNv7C8zfNgX5K3B7cED5i7p3TMD8/aEgf2G31oPJX9zFWgrM35/y81fgMH+MyV/UxfoEmL/tSj77B3xOMv5nhmTzt0NJ/oA+32wB5u8vJfkD+lTzOzB/oWY68gf0WWYbMH9llOQP6BPMn8D8pSnJH3DOmR3A/JVVkj+gThu/ZiWbv3JK8gfUGZMGzF95JfkD8sQAe8aw8pcWyJ+E9fu/P+OrYN/WG4R3NcsU7Nv6lID7M+G4l9qAywi4azeTjdu9N/+MgLtOimZCsve5HKhDwFqbOsL7xvGF0Tf1FPCFoRP1lfBlBZAvwFobZP6C+42We/uNVlQr3m/0OXmPPHJ/w0oFXutNAqdWKfBaKwm4vxCO+2MbcBUB96HCZ4fTjC8IuBsomR2rgToErLVpILxvHF8YfdNIAV8YOtFYCV++BPIFWGvTmOi1Vnse60uf11pD9lrzgV7rKwVeaz6BU18r8FpfEXB/Ixz3Jzbg1wTczYTPDqcZ3xBwN1cyO9YCdQhYa9NceN84vjD6poUCvjB0oqUSvnwL5Auw1qYl0Wut9TzWtz6v9R3ZayE/d7JOgddaQODUegVeax0B9/fCcX9qA64n4DbCZ4fTjO8JuDOVzI4fgDoErLXJFN43ji+MvslWwBeGTuQo4cuPQL4Aa21yiF7rB89j/ejzWhvIXustoNf6SYHXeovAqZ8VeK2fCLg3Cse9zAb8mYA7T/jscJqxkYC7tZLZsQmoQ8Bam9bC+8bxhdE3bRTwhaETbZXw5RcgX4C1Nm2JXmuT57F+8XmtX8leC/l9IJsVeK23CZzaosBrbSbg/k047s9swC0E3O2Ezw6nGb8RcLdXMjt+B+oQsNamvfC+cXxh9M3xCvjC0IkOSviyFcgXYK1NB6LX+t3zWFt9Xmsb2WstBHqtPxR4rYUETv2pwGv9QcC9XTju5TbgnwTcJwmfHU4zthNwd1QyO3YAdQhYa9NReN84vjD6ppMCvjB0orMSvvwF5Auw1qYz0Wvt8DzWXz6vFaoeKnGgvRbye1rLVJfvtRYROJVWXb7XcrVB4y4rHPcKGzCNgPs04bPDaUZZAu6uSmZHOaAOAWttugrvG8cXRt90U8AXhk50V8KX8kC+AGttuhO9ltMI57HKVy/2Wulkr/UO0GtVUOC13iF4rYoKvFYFgpZUEo77cxuwIgH3WcJnh9OMSgTcPZXMjspAHQLW2vQU3jeOL4y+6aWALwyd6K2EL1WAfAHW2vQmeq3Knseq4vNaVcleC/n3c6op8FrvErxWdQVeqxpBS2oIx73SBqxOwB0TPjucZtQg4M5XMjv2AeoQsNYmX3jfOL4w+iaugC8MnShSwpeaQL4Aa22KiF5rH89j1fR5rX3JXus9oNfaT4HXeo/gtWop8Fr7EbRkf+G4V9mAtQi4+wifHU4z9ifg7qtkdhwA1CFgrU1f4X3j+MLom34K+MLQif5K+HIgkC/AWpv+RK91gOexDvR5rYPIXgv5d41rK/Baiwleq44Cr1WboCUHC8f9hQ1Yh4B7gPDZ4TTjYALugUpmR12gDgFrbQYK7xvHF0bfDFLAF4ZODFbCl3pAvgBrbQYTvVZdz2PV83mt+mSvtQTotQ5R4LWWELxWhgKvdQhBSw4Vjnu1DZhBwD1E+OxwmnEoAfdQJbOjAVCHgLU2Q4X3jeMLo2+GKeALQyeGK+HLYUC+AGtthhO9VgPPYx3m81oNyV7rfaDXaqTAa73P+LtXCrxWI4KWNBGO+0sbsDEB90jhs8NpRhMC7lFKZkdToA4Ba21GCe8bxxdG34xWwBeGToxRwpdmQL4Aa23GEL1WU89jNfN5reZkr/UB0GsdrsBrfUDwWkco8FqHE7SkhXDca2zAIwi4xwqfHU4zWhBwj1MyO1oCdQhYazNOeN84vjD65iYFfGHoxM1K+NIKyBdgrc3NRK/V0vNYrXxeK0z2Wh8CvZZR4LU+ZPydOAVeyxC0JCIc91c2YCYB93jhs8NpRoSA+zYlsyMLqEPAWpvbhPeN4wujb+5QwBeGTtyphC/ZQL4Aa23uJHqtLM9jZfu8Vg7Za30E9Fq5CrzWRwSvFVXgtXIJWpInHPfXNmCUgPse4bPDaUYeAfe9SmZHa6AOAWtt7hXeN44vjL6ZqIAvDJ14QAlfjgTyBVhr8wDRa7X2PNaRPq91FNlrLQV6rTYKvNZSxt8YVeC12hC05GjhuL+xAdsScD8sfHY4zTiagHuSktlxDFCHgLU2k4T3jeMLo28eU8AXhk48roQv7YB8AdbaPE70Wsd4Hqudz2u1J3utj4Fe61gFXutjgtc6ToHXOpagJccLx73WBjyOgHuy8NnhNON4Au6nlMyODkAdAtbaPCW8bxxfGH3zrAK+MHRiihK+nADkC7DWZgrRa3XwPNYJPq91ItlrfQL0Wicp8FqfMP4mrwKvdRJBS04WjvtbG7AjAfcLwmeH04yTCbinKpkdpwB1CFhrM1V43zi+MPpmmgK+MHRiuhK+dALyBVhrM53otU7xPFYnn9fq7HktdB+4eNcTfMcM4bxymDsTeDWTxKs0MH5gfUyqMCdbm+uAzxNdhD9PjLJYuxD6+1Syr07670XZGKcScM8WrmfXVuPgnqNEz4D1MUjM6aGdnqhM6P8f6B4YHcJ6ksRxWvVd3D/qplmJOK06Pm7X6jhisXB3rQ6vEXUoI3N6OnAo/zcQ9wyNxD2DQNxuCojbjURchrM8neA0ulfXIVjIXjoTLFjuKPtvsIeTO8xFVe0qXDVcvP42XvdqsgVVUx5D2PsswSNs7MwSg6qH0xN0EzhBOZMgqmW8hujhE0HWvaNF9iygyKZ7uP2F/F8lSpovBz29njub0dSugD2UOAV3n2cRmvgc4e92XQOcQ8DdqzpexFzMEV5MdB7OJuWhNyEPvYl5SIgYOg9zha9J/pO7Sxb3PCXvLs8FuntgrU2q8hdO7viXju5mLFPKv4fPBj61nSd8/jjNPZegu/PJeoPwBecRcC9Q8g4EWB+zAPwOJC1UcmUieOzu7yqlVsYfk+HrUDlJJgel3GaJJ+uYfwmYITSgWH8bsdgu1qzRgxk5WGLAwZJfHUYE2mDJJwhsAaGPCnyGntVHSFOB7KPCPchnab+L1UeFhD6KE/oo7vWR5tUuycvrab58FnkLW+drGVqs+ysikOMCAjkuIK6auDycT8hDH0Ie+uzGsAkndyBJV2I1Idl8LlSyGtMXuBoDXEExC5WsxhQBTfP5QLNzoQI970vQsXcUrMZcSMD9rpLVGGB9zLt7V2OCx57oUalHMjko5TZLrMZcpG015qIUrMYgB8tFwMHST8FqTD+CwPYn9FH/FKzGIE0Fso8uVrAaczGhjy4h9NElvtWYfxpiWpb99w7EUGiAtoE4YDcGYji5o0TDIYdrsrGWyHhSLdUEDABiHghcNVgCXHVh8WUgYRBcSuDhpSlYcUO+3kGakw+UrLgheXgZkIcfCN8353h4GYGHgwg8HLQLHqaB77sHsI8Ggz9xE3wlmDjQPQFcvS7xyu1y75XbFazN6oOrF/8yFABGghP3iibdEOHL064BhhBwDyWIzVDi68YrSHm4kpCHK1Ngfi4HrspdARTwq4TzqS+pjz4S/rrHYb6KgHupktc9wPqYpXtf9wSPPdGjUo9kclDKbZZY3RrGXN0aQhgsw1Lwugc5WIYBB8tw4a97XL2HEwT2akIfXZ2C1z1IU4HsoxHCX/e4PhpB6KORhD4a+W823yYOdH6An9or8aQ9ynsQvkbLUGDd3yhC811LaL5riU+bLg/XEPIwmpCH0Sl42hwFNAXXAMV8jHA+nUt62vxUwdPmGALuZUqeNoH1Mcv2Pm0Gjz3Ro1KPZHJQym2WeNq8TtvT5nUpeNpEDpbrgIPlegVPm9cTBHYsoY/GpuBpE2kqkH00TsHT5jhCH91A6KMb/gObC1nLmnsHYih0o7aBeGMKNhdeXp0zXJONtULJ5sIbgZhvAm5GWSF8c6Hjy02EQXAzgYc3p2DFA7l8jTQnK5VsLkTy8BYgD1cK31zoeHgLgYe3Enh4K3EF9izSytl44SuG7puFxxNwa/n69uuBsW7zYzY5saxIOBbLjuZEs2P5MRvTZGZlxfJyI7FIfkEkOxrNziuMRXNyo1n58WwTzsuK5ETj0aL8nKLczJT+oZjbwFxNHLfvwr/CbpqViNur4+NOAA4nFu4J1eE1+vsvGSbuNxYq/guGd/h+nzvQxEbm/M7q3L5NegXJxriTIOJfCDcvrocYuFcree0DrI9BYk7wPoE3wXs//+/y+I/uiTCJC18JfwXqMN9FwP21Ei4A62O+JnAh8cB7nceB672fY0PFnLibPBP3Aca6R6nZvYdkdu/VZnZdIu4lmN37hJtdh/s+gtll3Oud3r2iRf1+wqZGNPYKNvD9hDqV8+JMtLEfsOeD9nyo+k6xTaw0TaxevMHUXT8QuH4wcP2Qr0asPKB74FslK7sTAXoSL9p5PADUpu+E58/DXPggLn95DwHzt07JF10CeWKAPWPWpciYS+BvItbD5IWYcHKHcTo9kaDVk4S/RXC4HybgfkQ47u9twEkE3D8KX3hzD6qPEHBvUOJJHgXqELDWZoPwvnF8YfTNRgV8YejEJiV8eQzIF2CtzSbiorfTCLew91j14gW+x8kLfMjnmycUeK0HCJx6UoHXeoKAe7Jw3D/YgE8ScG8WPjucZkwm4N6iZHY8BdQhYK3NFuF94/jC6JutCvjC0IltSvjyNJAvwFqbbUSv9ZTnsZ72ea1nyF7rQaDXelaB13qQwKkpCrzWswTczwnH/aMNOIWAe7vw2eE04zkC7h1KZsfzQB0C1trsEN43ji+MvinTXD5fGDqR1lwHX14A8gVYa4PMX9BrPe95rBd8Xmsq2Wsh3zu/qMBrPUTg1EsKvNaLBNzThOPeYAO+RMBdXvjscJoxjYA7XcnsmA7UIWCtTbrwvnF8YfRNJQV8YehEZSV8eRnIF2CtTWWi15rueayXfV7rlerF/47usYpp3D23M2zsmfacZc9XA3tuZwT21M4MXM8KXL9K3HObyAOaa9WUcG0GcM/tTKB3ry48f4k9t7OAe25fBeavRoryF07uMECeGGDPGFb+0M/LM4A9M1vB8/IMglbPUfC8PJuA+zXhuH+yAecQcO8n3P873/caAXctJZ7kdaAOAWttagnvG8cXRt8cqIAvDJ04SAlf5gL5Aqy1OYj4vPy695w81/e8PI/8bgL5fPOGAq81k8CpNxV4rTcIuOcLx/2zDfgmAffBwmeH04z5BNx1lcyOBUAdAtba1BXeN44vjL45RAFfGDqRoYQvbwH5Aqy1ySB6rQWex3rL57XeJnutWUCvtVCB15pF4NQiBV5rIQH3O8Jxb7QBFxFwHyZ8djjNeIeAu6GS2fEuUIeAtTYNhfeN4wujb5oo4AtDJ5oq4ct7QL4Aa22aEr3Wu57Hes/ntRaTvRbyvfMSBV7rVQKn3lfgtZYQcH8gHPcmG/B9Au7Dhc8OpxkfEHAfoWR2fAjUIWCtzRHC+8bxhdE3rRTwhaETYSV8+QjIF2CtTZjotT70PNZHPq+11OsB/3+31Pv3dqHi/+5jz5Oh+9D9jl3tR82MF8XCtpyR/Fi+ieXGTa4pikRyTWE0XJifFQsXZcbyo/GcwqJIlsnMihVEIlmF+UXh7JxwVl44GjfI7wEO5udjLz+n+fLzCXHvcqU0zt7lWl6cT23sZfb8zJ7L7bnCnp/bc6U9V9nzC3uutueX9lxjz6/s+bU9v7HnWnt+a8/v7LnOnuurl9z7/Gn1knublwWuPwtcLw9crwhcfx64Xhm4XhW4/iJwvTpw/WXgek3g+qvA9deB628C12sD198Grr8LXK8LXK+vztv7negjtOZHlGj+p4DnvsTe72XAZ8gsJXu/P8PlL285MH/ZOvJnVsDyFzefA/OXoyJ/BWYlLH9RswqYv1wV+QubL1D5i4fNamD+ohryVxA2X6LyFw2bNcD85WnIn/tDRqD8xd0fMgLmr7WC/BVYzN+A8he1sdYC83ekgvyF3d87wOQv7mJ9B8zfUfLzV+Awr8PkL+pirQfmr42Sz/4Bn5OM/5kh2fy1VZI/oM83OcD8Ha0kf0CfaqLA/B2jJH9An2VaA/PXTkn+gD7BHAXMX3sl+QPOOdMWmL9jleQPqNPmGGD+jlOSP6DOmPbA/B2vJH9AnhhgzxhW/tIC+ZOwfp+I9b2CfVufEt7V/KBg39b3BNw/Csf9iw34AwH3WcL3obj35j8ScPdU8k5yA1CHgLU2PYX3jeMLo296KeALQyd6K+HLT0C+AGttkPkL7jfa4O03+ql68X6jn8l75JH7GzYq8FrLCJzapMBrbSTg/kU47l9twE0E3DHpn+G3mH8h4M5XMjt+BeoQsNYmX3jfOL4w+iaugC8MnShSwpfNQL4Aa22KiF7rV89jbfZ5rS1kr/UZ0Gv9psBrfUbg1O8KvNZvBNxbhePebAP+TsDdR/jscJqxlYC7r5LZsQ2oQ8Bam77C+8bxhdE3/RTwhaET/ZXw5Q8gX4C1Nv2JXmub57H+8HmtP8leC/m5k+0KvNZyAqd2KPBa2wm4/xKOe4sNuIOAe4Dw2eE04y8C7oFKZkeoBi6XwFqbgdI9RxlO3wxSwBeGTgxWwpcyQL4Aa20GE72W0wjnscrUKPZaaTVCJQ6011oB9Fpla8j3WisInCpXQ77XcrVB4y4vHPdvNmA5Au4hwmeH04zyBNxDlcyOdKAOAWtthgrvG8cXRt8MU8AXhk4MV8KXCkC+AGtthhO9VrrnsSr4vFZFstdCfh9IJQVe63OC16qswGtVImhJFeG4f7cBKxNwjxQ+O5xmVCHgHqVkdlQF6hCw1maU8L5xfGH0zWgFfGHoxBglfKkG5Auw1mYM0WtV9TxWNZ/Xqk72WiuBXquGAq+1kuC19lHgtWoQtKSmcNxbbcB9CLjHCp8dTjNqEnCPUzI79gXqELDWZpzwvnF8YfTNTQr4wtCJm5XwZT8gX4C1NjcTvda+nsfaz+e1apG9FvJ7WvdX4LVWEbzWAQq81v4ELTlQOO5tNuABBNzjhc8OpxkHEnDfpmR2HATUIWCtzW3C+8bxhdE3dyjgC0Mn7lTCl9pAvgBrbe4keq2DPI9V2+e16pC91hdAr3WwAq/1BcFr1VXgtQ4maEk94bj/sAHrEnDfI3x2OM2oR8B9r5LZUR+oQ8Bam3uF943jC6NvJirgC0MnHlDCl0OAfAHW2jxA9Fr1PY91iM9rZZC9FvLv5xyqwGutJnitBgq81qEELTlMOO4/bcAGBNwPC58dTjMOI+CepGR2NATqELDWZpLwvnF8YfTNYwr4wtCJx5XwpRGQL8Bam8eJXquh57Ea+bxWY7LX+hLotZoo8FpfErxWUwVeqwlBS5oJx73dBmxKwD1Z+OxwmtGMgPspJbOjOVCHgLU2TwnvG8cXRt88q4AvDJ2YooQvhwP5Aqy1mUL0Ws09j3W4z2sdQfZayL9r3EKB11pD8FotFXitFgQtaSUc9w4bsCUB9wvCZ4fTjFYE3FOVzI4wUIeAtTZThfeN4wujb6Yp4AtDJ6Yr4YsB8gVYazOd6LXCnscyPq+VSfZaXwG9VkSB1/qK4LWyFHitCEFLsoXj/ssGzCLgniF8djjNyCbgnqlkduQAdQhYazNTeN84vjD6ZrYCvjB0Yo4SvuQC+QKstZlD9Fo5nsfK9XmtKNlrfQ30WnkKvNbXBK/VWoHXyiNoyZHCcTuytCbgnit8djjNOJKAe56S2XEUUIeAtTbzhPeN4wujb+Yr4AtDJxYo4UsbIF+AtTYLiF7rKM9jtfF5rbZkr/UN0GsdrcBrfUPwWsco8FpHE7SknXDcZSxZjiHgXih8djjNaEfAvUjJ7GgP1CFgrc0i4X3j+MLom/cU8IWhE4uV8OVYIF+AtTaLiV6rveexjvV5rePIXmst0Gsdr8BrrSV4rQ4KvNbxBC05QTjuNEuWDgTcHwifHU4zTiDg/lDJ7DgRqEPAWpsPhfeN4wujbz5WwBeGTnyihC8nAfkCrLX5hOi1TvQ81kk+r9WR7LW+BXqtkxV4rW8JXusUBV7rZIKWdBKOu6wlyykE3J8Jnx1OMzoRcC9XMjs6A3UIWGuzXHjfOL4w+malAr4wdGKVEr50AfIFWGuziui1Onseq4vPa51K9lrfAb3WaQq81ncEr9VVgdc6jaAlpwvHXc6SpSsB95fCZ4fTjNMJuNcomR1nAHUIWGuzRnjfOL4w+uYbBXxh6MRaJXzpBuQLsNZmLdFrneF5rG4+r9Wd7LXWAb3WmQq81jqC1+qhwGudSdCSs4TjLm/J0oOAe53w2eE04ywC7vVKZkdPoA4Ba23WC+8bxxdG3/yogC8MndighC9nA/kCrLXZQPRaPT2PdbbPa51D9lrrgV6rlwKvtZ7gtXor8Fq9CFpyrnDc6ZYsvQm4NwqfHU4zziXg3qRkdpwH1CFgrc0m4X3j+MLom80K+MLQiS1K+BID8gVYa7OF6LXO8zxWzOe18j2vhe4DF+9+gu/YKpxXDnM+gVfbSLxKA+MH1sekCnOytbkP+DxRIPx54k6LtYDQ34VkX53s/e1jYxQScG8Xrmd3V+fg3qFEz4D1MUjM6aGdnqhM6P8f6B64PoT1JIkjXmMX94+6aVYi4jXwcYtq4IjFwl1UA14j6lBG5vR84FD+byDuBRqJewGBuH0UELcPibgMZ3k+wWn0raFDsJC9dCFYsNxR9t9gDyd3mBHV7CpcdVy8UTZe3+qyBVVTHkPY+yzBI2zszBKD6iKnJ+gmcIJyIUFUy3gNcZFPBFn3jhbZfkCRTfdw+wv5v0qUNF8O+ns9dzGjqV0BL1LiFNx99iM08SXC3+26BriEgHtADbyIuZgjvJjoPFxMysNAQh4GEvOQEDH4u5vDZfPgn9xdsrjTwLgTB/rd5aVAdw+stUlV/sLJHf/S0d2MZf6PvS8Bt3J6299OSpPGM5/mAUW11xn3CSEyz/OU7HM6x5whRZnKTEIJkaJMFZVKUQhR5pA5RCRCydAg5L8W7/569/4fdvt673u1np+9ruu5+s7n/N6znmfd9zOt5907yX8Pnwus2i50PP4Yn9uf4Hdrk/0NIi+4kKB3HRJf0Mky8HwUUuc6nq7+zkTi2tK/leSslP+ZjLwOZZMgNkiyzbjKeoC/BcxwNKBn/V8iNqCGnjU6MCMDywBgYBnYGEYEWmAZSHCwFxFwdJEvoWfhCJlUIHF0cQr2TPa3WDi6mICjQQQcDfJwJLnb5XJ7PcNnz8FeY+sSKUGLtb/BBHJcSiDHpcSuibHDJQQ7XEaww2VbEGzCwRaSdHHdhKD2rCekG3M5sBsD7KCoekK6MYOBSfMlwGTnCgH+/HKCH2sgoBtzBUHvhkK6McDzUQ3T3ZjElYo/SrqC2CDJNuO6MUOkdWOGWOjGIAPLEGBgGSqgGzOU4GCvJODoSgvdGGRSgcTRVQK6MVcRcHQ1AUdX+7ox/xTEpLT90wExFLpGWkC8ZgsCYjjYigMcMrgGfVZjNyrVpEnANUCdrwV2DRoDuy4svlxLCATXEXh4nYWOG/J6B5mcNBXScUPy8HogD5s6PjdneHg9gYc3EHh4Qw08zADv+2wgjm4Ev3GTeCUYW2hMALvXcVduw7wrt5tYw+o3Nt78x1AKMAwc2yuadMMdb08bAAwn6H0zwdncTLxuvIlkh1sIdrjFQvIzDNiVuwnowG91nE+Xk3DU3PHrHqPzrQS9M4Vc9wDPR2Wmr3sSVyr+KOkKYoMk24zrbo1gdreGEwLLCAvXPcjAMgIYWEY6ft1jznskwcHeRsDRbRaue5BJBRJHoxy/7jE4GkXA0e0EHN3+L8O3sYW2D/CtvbhK+w6vEL5TSlBg7e8OAvhGE8A3mlhtGjvcSbDDXQQ73GWh2rwDmBTcCXTmdzvOp/6kajNHQLV5N0HvXCHVJvB8VG662kxcqfijpCuIDZJsM67aHCOt2hxjodpEBpYxwMByj4Bq8x6Cgx1LwNFYC9UmMqlA4micgGpzHAFH9xJwdO9WGC5ktTXTATEUuk9aQLzPwnDhsMac4Br0WQVChgvvA+o8HjiMUuD4cKHhy3hCIJhA4OEECx0PZPsamZy0FDJciOTh/UAetnR8uNDw8H4CDx8g8PABYgf2HFLn7EHHO4bmk4UfJOgt5ePbhwGf9ZBfZ1UaLS4KR6MlkdJISbQiqp+pCouLo+VlRdGiisqikkikpLxvNFJaFimuqCpR4fLiotJIVaS6orS6rNDqF8U8BOZqbD1cQ/4K2zTLEA83xj93IjA4sfSe2Bh+Rv/3TYax/VaENn+D4STf3zMLTWykzSc35uI28BS7fsZkghNv7XjyYjDE0LuNkGsf4PkopM4x3sf0jfHez/9HPP6jMaFIXGjv+BWo0fkRgt4dhHABeD6qA4ELsYL3Ro8Dw7x/bwpt5sSj5JjYFPisKUKT3SmkZHeqtGTXGGIqIdmd5niya/SeRkh2GXud7O0V7dQfIww1onXfQT/4McI5bes9Z7p+9gwtM7U83vhvZxvrNE1vvHnA1Pw8I+HnmQk/P+47I5Yd0BjYUUhndzrAn1RV/71mAH3TTo7bz9O570yc/cofB9qvk5APugTyRAExozpZSsxd4G/sWbPIjZhwsKWMn55O8NWzHb9FMHrPIuj9hON619dkmU3Qu4vjjTdTqD5B0LurkJzkSaAfAp616uo4bgxfGLhRAvjC8BOFQvgyB8gX4FmrQmLT2/gI09ib03hzg28uucGHrG+eEpBrzSBw6mkBudZTBL2fcVzvBposTxP0LnE8dhif8QxB71IhsWMe0A8Bz1qVOo4bwxcGbsoF8IXhJ7oL4cuzQL4Az1p1J+Za87wc61lfrvUcOdeaCcy1nheQa80kcGq+gFzreYLeLziud0NNlvkEvXd3PHYYn/ECQe8eQmLHi0A/BDxr1cNx3Bi+MHCzlwC+MPxETyF8WQDkC/CsVU9irvWil2Mt8OVaC8m5FvLe+SUBudbjBE69LCDXeomg9yuO6729JsvLBL17OR47jM94haD3vkJix6tAPwQ8a7Wv47gxfGHg5gABfGH4iQOF8OU1IF+AZ60OJOZar3o51mu+XOv1xpv/OxpjO2ZwZ27f0M9epOVNLW8lzNy+kTBTuyjh5zcTfn6LOHMbswOaa4cI4dobwJnbRcDc/VAhM7dvAmdu3wLa7zAhM7dAniggZhTLfuh6+Q0gZt4WUC+/QfDViwXUy28T9H7Hcb0babIsJuh9lOP5v8n73iHofbSQnORdoB8CnrU62nHcGL4wcHOcAL4w/MTxQvjyHpAvwLNWxxPr5Xe9Ovk9X738PvluAlnffCAg11pE4NSHAnKtDwh6f+S43o01WT4k6H2S47HD+IyPCHqfLCR2LAH6IeBZq5Mdx43hCwM3fQTwheEnThXCl4+BfAGetTqVmGst8XKsj3251ifkXOtNYK71qYBc600Cp5YKyLU+Jej9meN6N9FkWUrQu9Lx2GF8xmcEvfsKiR2fA/0Q8KxVX8dxY/jCwM1pAvjC8BOnC+HLMiBfgGetTifmWp97OdYyX671BTnXQt47fykg13qLwKnlAnKtLwl6f+W43k01WZYT9D7L8dhhfMZXBL3PFhI7VgD9EPCs1dmO48bwhYGbcwXwheEnzhPCl6+BfAGetTqPmGut8HKsr3251jceBvy/943333uGNv/eSi8nQ+PQ/I2a5lELq6qjYX2cRRXRChUtq1JlqrqoqEz1jYT7VhRHw9WF0YpIVWnf6qJiVVgcrSwqKu5bUR0uKQ0Xl4cjVQr5OcCJ9lnp2edIn32+Jc4u75TBmV3O9J7znX7291pWaVmt5Qcta7T8qOUnLT9r+UXLWi3rtKzXskHLr1o2avlNy+9a/jB2aRw/+/xd4/jZ5u8Tfl6V8PPqhJ9/SPh5TcLPPyb8/FPCzz8n/PxLws9rE35el/Dz+oSfNyT8/GvCzxsTfv4t4effE37+I+HnTY15s98xHKF9fn8hPv87QN0Xm/3+HlhDXihk9nsVzn7lq4H2GyDDfuoHmP2q1Bqg/QaKsF+l+hFmv4j6CWi/i0TYL6x+RtmvKqx+AdrvYgn2qwyrtSj7RcJqHdB+gyTYT+cf60H2q9LP2gC032AB9qvUOv8Ksl9EP2sj0H6XCLCffrT6DWO/KvOs34H2u9R9+1Uanf/A2C9inrUJaL/LhLz7B6yTlL9mCGq/y4XYD5jnq4FA+10hxH7APFVdDLTfECH2A+ZZajDQfkOF2A+YJ6hLgfa7Uoj9gHFOXQ6031VC7Af002oI0H5XC7Ef0M+oK4H2u0aI/YA8UUDMKJb9MhLs50L/PvasPwXMbX1HuKsJNcGeNUPvPwl6b+O43s0MWZrg9b7L8TkUc2++DUHvu4XcSWbgcKmAZ63udhw3hi8M3IwVwBeGnxgnhC+1gHwBnrVC2i9x3sj4CDNnVKvJ5nmjbZuE4hY610LON9Ru4n6u9T0h56gjINeqTfAl2zmud3NNljoEvcc7HjuMz9iOoPcEIbGjLtAPAc9aTXAcN4YvDNw8KIAvDD/xkBC+1APyBXjW6iFirlXXy7Hq+XKt+uRcaxUw12ogINdaRci1GgrItRoQfMn2juudqcnSkKD3JNe/D17rvD1B78lCYkcjoB8CnrWa7DhuDF8YuJkigC8MPzFVCF8aA/kCPGs1lZhrNfJyrMa+XKsJOddCvnfSVECutZqQazUTkGs1JfiS5o7rnaXJ0oyg93TXPy9J69ycoPcMIbEjE+iHgGetZjiOG8MXBm5mCeALw0/MFsKXLCBfgGetZhNzrUwvx8ry5VrZ5FzrB2CulSMg1/qBkGvlCsi1cgi+JM9xvbM1WXIJes9xPHYYn5FH0HuukNiRD/RDwLNWc13HTQYHN88I4AvDT8wTwpcCIF+AZ63mEXOtfC/HKvDlWi3IuRby80BaCsi11hByrVYCcq2WBF/S2nG9czRZWhH0ft7x2GF8RmuC3vOFxI42QD8EPGs133HcGL4wcLNAAF8YfmKhEL60BfIFeNZqITHXauPlWG19uVY7cq71IzDXai8g1/qRkGt1EJBrtSf4ko6O652rydKBoPcrjscO4zM6EvR+VUjs2AHoh4BnrV51HDeGLwzcvCGALww/sUgIX3YE8gV41moRMdfawcuxdvTlWjuRcy3k57R2EpBr/UTItToLyLU6EXzJzo7rnafJ0pmg99uOxw7jM3Ym6L1YSOzYBeiHgGetFjuOG8MXBm7eE8AXhp94XwhfugD5Ajxr9T4x19rFy7G6+HKtruRc62dgrtVNQK71MyHXCgvItboRfIlyXO98TZYwQe+PHI8dxmcogt5LhMSOQqAfAp61WuI4bgxfGLj5VABfGH5iqRC+FAH5AjxrtZSYaxV6OVaRL9cqJudayO/PKRGQa/1CyLVKBeRaJQRfUua43gWaLKUEvZc5HjuMzygj6P2FkNgRAfoh4FmrLxzHjeELAzdfCeALw0+sEMKXciBfgGetVhBzrYiXY5X7cq3u5FxrLTDX2lVArrWWkGvtJiDX2pXgS3Z3XO8Wmiy7EfRe6XjsMD5jd4Le3wqJHT2Afgh41upbx3Fj+MLAzSoBfGH4idVC+LIHkC/As1ariblWDy/H2sOXa+1JzrWQ32u8l4Bcax0h1+opINfai+BL9nZc75aaLD0Jev/oeOwwPmNvgt4/CYkd+wD9EPCs1U+O48bwhYGbtQL4wvAT64TwpReQL8CzVuuIudY+Xo7Vy5dr7UvOtdYDc639BORa6wm51v4Ccq39CL7kAMf1bqXJsj9B718djx3GZxxA0HujkNhxINAPAc9abXQcN4YvDNz8IYAvDD+xSQhfDgLyBXjWahMx1zrQy7EO8uVaB5NzrQ3AXOsQAbnWBkKudaiAXOsQgi85zHG9W2uyHErQe5td3Nbb+IzDCHpn7CIjdhwO9EPAs1YZjuPG8IWBm9oC+MLwE3WE8OUIIF+AZ62Q9kvMtQ73cqwjfLnWkeRc61dgrnWUgFzrV0KudbSAXOsogi85xnG922iyHE3Qu57jscP4jGMIetcXEjuOBfoh4Fmr+o7jxvCFgZvtBfCF4ScaCeHLcUC+AM9aNSLmWsd6OdZxvlzreHKutRGYa50gINfaSMi1ThSQa51A8CUnOa53W02WEwl6N3U8dhifcRJB72ZCYsfJQD8EPGvVzHHcGL4wcJMlgC8MP5EthC+9gXwBnrXKJuZaJ3s5Vm9frnUKOdf6DZhr9RGQa/1GyLVOFZBr9SH4kqjjerfTZDmVoHee47HD+IwoQe98IbGjAuiHgGet8h3HjeELAzctBfCF4SdaCeFLJZAvwLNWrYi5VoWXY1X6cq2+5Fzrd2CuVSUg1/qdkGtVC8i1qgi+5DTH9W6vyVJN0Lut47HD+IzTCHq3ExI7Tgf6IeBZq3aO48bwhYGbjgL4wvATOwjhyxlAvgDPWu1AzLVO93KsM3y51pnkXOsPYK51loBc6w9CrnW2gFzrLIIvOcdxvTtospxN0LuT47HD+IxzCHp3FhI7+gH9EPCsVWfHcWP4wsBNFwF8YfiJrkL4ci6QL8CzVl2JuVY/L8c615drnUfOtTYBc63zBeRamwi51gUCcq3zCb6kv+N6d9RkuYCgt3I8dhif0Z+gd6GQ2HEh0A8Bz1oVOo4bwxcGbkoE8IXhJ0qF8GUAkC/As1alxFzrQi/HGuDLtQZ6uRb8vXX9jMcIeUe547wyOg8k8Ko7iVcZYP2B56Ns6Rz0bKYB64mLHK8nJmtdLyLg+2JyXh34fQX9jIsJeu/uuD97tDFH7x5C/BnwfBRS5zqhv3OibUL//0JjYFgIm5PE1qAmNewftWmWIQY1wT93cBMcsVh6D24CPyNqUEba9BJgUP5fIO6lEol7KYG4lwkg7mUk4jIyy0sImcblTWQ4LCSWrgA7LLNq/Yvu4WBLjWqku3CNcc+7Qz/v8sZuO1RJdgxh9xnHI+yzC+MC1RDjT9AgMA7lCoJT3cYDxBCfE2TtHe1khwKdbB1Pb/9B/leJkuGzwZUe5q5igNoc4BAhmYLZ51ACiK92/G7XAOBqgt7XNME7MfPMId4z0Xa4imSHawl2uJZoh5gTQ9thL8d7kv+U3QX+zjghd5fXAbN74FkrW/YLB1t/+dEtfJZK8t/DVwGrtusdjz/G515H8Lu9yP4GkRdcT9B7XyF3IMDzUfuC70AyQvGdicS1pX8ryVkp/zMZeR3KJkFskGSbcZX1Df4WMMPRgJ71f4nYDTX0rNGBGRlYbgAGlhubwIhACyw3EhzsMAKOhvkSehaOkEkFEkc3pWDPZH+LhaObCDgaTsDRcA9HkrtdLrfXM3z2vNlrbN0iJWix9nczgRy3EshxK7FrYuxwC8EOIwh2GLEFwSYcbCFJF9dNCPztqkK6MSOB3RhgB0UdIKQbczMwab4FmOzcJsCfjyT4sYMEdGNuI+h9sJBuDPB81MHpbkziSsUfJV1BbJBkm3HdmFHSujGjLHRjkIFlFDCw3C6gG3M7wcHeQcDRHRa6McikAomjOwV0Y+4k4Gg0AUejfd2YfwpiUtr+6YAYCt0lLSDetQUBMRxsxQEOGVwDf7e3G5Vq0iTgLqDOdwO7BocBuy4svtxNCARjCDwcY6HjhrzeQSYnRwjpuCF5eA+Qh0c4PjdneHgPgYdjCTwcWwMPM8D7HgLE0Tggjmq6EowtNCaA3eu4K7d7vSu3+1jD6uOabP5jKAUYBo7tFU268Y63pw0AxhP0nkBwNhOI1433kexwP8EO91tIfu4FduXuAzrwBxzn00gSjo5y/LrH6PwAQe+jhVz3AM9HHZ2+7klcqfijpCuIDZJsM6679SCzuzWeEFgetHDdgwwsDwIDy0OOX/eY836I4GAfJuDoYQvXPcikAomjiY5f9xgcTSTgaBIBR5Oa/PPwbWyh7QN8ay+u0p7sFcKPSAkKrP1NJoDvUQL4HiVWm8YOjxDsMIVghykWqs3JwKTgEaAzn+o4n64jVZvHCag2pxL0Pl5ItQk8H3V8utpMXKn4o6QriA2SbDOu2pwmrdqcZqHaRAaWacDA8piAavMxgoOdTsDRdAvVJjKpQOJohoBqcwYBRzMJOJq5FYYLWW3NdEAMhR6XFhAf34KAGA624gCHDK5Bn3WSkOHCx4E6zwIOo5zk+HCh4cssQiCYTeDhbAsdD2T7Gpmc9BYyXIjk4RNAHvZ2fLjQ8PAJAg+fJPDwSWIHdiipczbH8Y6h+WThOQS9pXx8+83AZ83166xKo8VF4Wi0JFIaKYlWRPUzVWFxcbS8rChaVFFZVBKJlJT3jUZKyyLFFVUlKlxeXFQaqYpUV5RWlxVa/aKYuWCuxtZTNeSvsE2zDPFUE/xznwYGJ5beTzeBn9H/fZNhbL+Voc3fYPiM7++ZhSY20ubzmnBxG/iDrvQz5hGceB/HkxeDIYbepwq59gGej0LqHON9TN8Y7/38f9bjPxoThSQuVDp+BWp0fpagd18hXACej+pL4EKs4B3uceBm799bQps58Rw5JjYDPut5ocnu86Rkd760ZNcYYj4h2X3B8WTX6P0CIdll7HWet1e0U3+RMNSI1r2XfvCLhHPa1nvOAv3shVpe0vJyk7+dbazTtKDJ5gFT8/PChJ9fSvj5Zd8ZseyAxsBpQjq7CwD+pKr677UQ6JtOd9x+ns59X8LZr/xloP3OEPJBl0CeKCBm1BmWEnMX+Bt71ivkRkw42FLGTy8g+OpXHb9FMHq/QtD7Ncf17qTJ8ipB73Mcb7yZQvU1gt79hOQkrwP9EPCsVT/HcWP4wsDN+QL4wvATFwjhyxtAvgDPWl1AbHobH2Eae2802dzgW0Ru8CHrmzcF5FoLCZx6S0Cu9SZB77cd17uzJstbBL0HOB47jM94m6D3QCGxYzHQDwHPWg10HDeGLwzcDBLAF4afGCyEL+8A+QI8azWYmGst9nKsd3y51rvkXOslYK71noBc6yUCp94XkGu9R9D7A8f13lmT5X2C3pc5HjuMz/iAMQ0tJHZ8CPRDwLNWlzuOG8MXBm6GCuALw09cKYQvHwH5AjxrdSUx1/rQy7E+8uVaS8i5FvLe+WMBudbLBE59IiDX+pig96eO672LJssnBL2vcTx2GJ/xKUHva4XEjqVAPwQ8a3Wt47gxfGHg5gYBfGH4iRuF8OUzIF+AZ61uJOZaS70c6zNfrvV5k83/HY2xfTO4M7fL9LO/0PKlluVN4mdulzWJn6n9IuHnLxN+Xt6EN3MbswP8RT0hXFsGnLn9Api73yxk5vZL4MztcqD9bhEycwvkiQJiRrHsh66XlwEx85WAenkZwVevEFAvf0XQ+2vH9e6iybKCoPdtjuf/Ju/7mqD3KCE5yTdAPwQ8azXKcdwYvjBwc6cAvjD8xGghfFkJ5AvwrNVoYr38jVcnr/TVy9+S7yaQ9c13AnKtLwic+l5ArvUdQe9VjuvdVZPle4LeYxyPHcZnrCLofY+Q2LEa6IeAZ63ucRw3hi8M3NwrgC8MP3GfEL78AOQL8KzVfcRca7WXY/3gy7XWkHOtL4G51o8Ccq0vCZz6SUCu9SNB758d17ubJstPBL3vdzx2GJ/xM0HvB4TEjl+Afgh41uoBx3Fj+MLAzcMC+MLwExOF8GUtkC/As1YTibnWL16OtdaXa60j51rIe+f1AnKt5QRObRCQa60n6P2r43qbDy3cQND7Ecdjh/EZvxL0flRI7NgI9EPAs1aPOo4bwxcGbqYJ4AvDTzwmhC+/AfkCPGv1GDHX2ujlWL/5cq3fPQz4f+9377/vHdr8e394ORkah+Zv1DSPWlhVHQ3r4yyqiFaoaFmVKlPVRUVlqm8k3LeiOBquLoxWRKpK+1YXFavC4mhlUVFx34rqcElpuLg8HKlSyM8BTrTPH559jvLZZ1MT3uzyfhmc2eVM7zl/mmc31fvWkqGllpZttdTWUkfLdlrqaqmnpb6WBloaatleSyMtjbU00dJUS7Om8bPPfzaJn23+6+/4ft4m4eeMhJ9rJfy8bcLPtRN+rpPw83YJP9dN+Llews/1E35ukPBzw4Sft0/4uVHCz40Tfm6S8HPThJ+bNeXNfsdwhPb5M4X4/D+Bs98Gx6h9PS5k9nubprBnlWcA7TdLhv1ULZj9qtS2QPvNFmG/SlUbZr+IqgO03xMi7BdW26HsVxVWdYH2e1KC/SrDqh7KfpGwqg+03xwJ9tP5RwOQ/ar0sxoC7TdXgP0qtc7bg+wX0c9qBLTfUwLspx+tGmPsV2We1QRov6fdt1+l0bkpxn4R86xmQPs9I+TdP2CdpPw1Q1D7zRNiP2Cer2YD7fesEPsB81T1JNB+zwmxHzDPUnOB9nteiP2AeYJ6Gmi/+ULsB4xzah7Qfi8IsR/QT6vngPZ7UYj9gH5GzQfab4EQ+wF5ooCYUSz7ZSTYz4X+fexZzZvi7GeewZhf+pNwV5PZFHvWDL2bN8XrneW43kqTJZOg90eOz6GYe/Msgt5LhNxJZgP9EPCs1RLHcWP4wsDNpwL4wvATS4XwJQfIF+BZK6T9EueNjI8wc0Y5TTfPG+U2DcUtdK6FnG/IE5BrhQicyheQa+UR9C5wXO9CTZZ8gt7LHI8dxmcUEPT+QkjsaAH0Q8CzVl84jhvDFwZuvhLAF4afWCGELy2BfAGetVpBzLVaeDlWS1+u1Yqca20DzLVaC8i1tiFwqo2AXKs1Qe+2jutdpMnShqD3Ssdjh/EZbQl6fyskdrQD+iHgWatvHceN4QsDN6sE8IXhJ1YL4Ut7IF+AZ61WE3Otdl6O1d6Xa3Ug51rI9046Csi1Mgic2kFArtWRoPeOjutdrMmyA0HvHx2PHcZn7EjQ+ychsWMnoB8CnrX6yXHcGL4wcLNWAF8YfmKdEL50AvIFeNZqHTHX2snLsTr5cq3O5FyrFjDX2llArlWLwKldBORaOxP07uK43iWaLLsQ9P7V8dhhfEYXgt4bhcSOrkA/BDxrtdFx3Bi+MHDzhwC+MPzEJiF86QbkC/Cs1SZirtXVy7G6+XKtMDnXQn4eiBKQa21L4FShgFxLEfQuclzvUk2WQoLe23RxW2/jM4oIemd0kRE7ioF+CHjWKsNx3Bi+MHBTWwBfGH6ijhC+lAD5AjxrhbRfYq5V7OVYJb5cq5Sca9UG5lplAnKt2gRORQTkWmUEvcsd17tMkyVC0Lue6zFT61xO0Lu+kNjRHeiHgGet6juOG8MXBm62F8AXhp9oJIQvuwL5Ajxr1YiYa3X3cqxdfbnWbuRcC/k5rbsLyLXqEDjVQ0CutTtB7z0c1zuiydKDoHdTx2OH8Rl7EPRuJiR27An0Q8CzVs0cx43hCwM3WQL4wvAT2UL4sheQL8CzVtnEXGtPL8fay5dr9STnWtsBc629BeRa2xE4tY+AXGtvgt69HNe7XJNlH4LeeY7HDuMzehH0zhcSO/YF+iHgWat8x3Fj+MLATUsBfGH4iVZC+LIfkC/As1atiLnWvl6OtZ8v19qfnGshvz/nAAG5Vl0Cpw4UkGsdQND7IMf17q7JciDjsy4cjx3GZxxE0LudkNhxMNAPAc9atXMcN4YvDNx0FMAXhp/YQQhfDgHyBXjWagdirnWwl2Md4su1DiXnWvWAudZhAnKtegROHS4g1zqMoPcRjuu9qybL4QS9OzkeO4zPOIKgd2chseNIoB8CnrXq7DhuDF8YuOkigC8MP9FVCF+OAvIFeNaqKzHXOtLLsY7y5VpHk3Mt5PcaHyMg16pP4NSxAnKtYwh6H+e43rtpshxL0Fs5HjuMzziO8b6tkNhxPNAPAc9aFbo+t5TBwU2JAL4w/ESpEL6cAOQL8KxVKTHXOt7LsU7w5VonknOtBsBc6yQBuVYDAqdOFpBrnUTQu7fjeu+uyXIy4/1Lx2OH8Rm9CXp3FxI7TgH6IeBZq+6O48bwhYGb3QXwheEnegjhSx8gX4BnrXoQc61TvByrjy/XOpWcazUE5lpRAblWQwKnKgTkWlGC3pWO691Dk6WCoPdejscO4zMqCXr3FBI7+gL9EPCsVU/HcWP4wsBNLwF8YfiJfYXwpQrIF+BZq32JuVZfL8eq8uVa1eRca3tgrnWagFxrewKnTheQa51G0PsMx/XeQ5PldILeBzgeO4zPOIPxDoiQ2HEm0A8Bz1od6DhuDF8YuDlEAF8YfuJQIXw5C8gX4FmrQ4m51plejnWWL9c6m5xrNQLmWucIyLUaETjVT0CudQ5B73Md13tPTZZ+jHcCHI8dxmecS9D7SCGx4zygHwKetTrScdwYvjBwc4wAvjD8xLFC+HI+kC/As1bHEnOt87wc63xfrnUBOddqDMy1+gvItRoTOHWhgFyrP0HvAY7rvZcmy4UEvU9wPHYYnzGAoPeJQmLHQKAfAp61OtFx3Bi+MHDTWwBfGH7iFCF8uQjIF+BZq1OIudZAL8e6yJdrXUzOtZoAc61BAnKtJgRODRaQaw0i6H2J43r31GQZTNA76njsMD7jEsZcopDYcSnQDwHPWlU4jhvDFwZuqgTwheEnqoXw5TIgX4BnraqJudalXo51mS/XupycazUF5lpXCMi1mhI4NURArnUFQe+hjuu9tybLEMacmuOxw/iMoQS9zxQSO64E+iHgWaszHceN4QsDN+cI4AvDT/QTwpergHwBnrXqR8y1rvRyrKt8udbV5FyrGTDXukZArtWMwKlrBeRa1xD0vs5xvffRZLmWoPf5jscO4zOuI+h9gZDYcT3QDwHPWl3gOG4MXxi4GSCALww/MVAIX24A8gV41mogMde63suxbvDlWjd6uRYaB+Z5JgajnzvIcV4ZnW9k3COSeJUB1h94PsqWzkHP5oUmuGcNc7yemKd1HUbA903kvDpwzaifcRNB78sc92fPNeHofbkQfwY8H4XUuU7o75xom9D/v9AYuDmEzUlia3jTGvaP2jTLEMObEp4LbEix9L65KfyMqEEZadNbgEH5f4G4t0ok7q0E4o4QQNwRJOIyMstbCJnGyKYyHBYSS7eBHZZZtf5F93CwpSY21l24JrjnTdbPG9nEbYcqyY4h7D7jeIR9dmFcoBpl/AkaBMah3EZwqtt4gBjlc4KsvaOd7O1AJ1vH09t/kP9VomT4bHCHh7k7GaA2BzhKSKZg9nk7AcSjHb/bNQAYTdD7rqZ4J2aeOcR7JtoOd5LscDfBDncT7RBzYvB5Usd7kv+U3QWeVxRydzkGmN0Dz1rZsl842PrLj27hs1SS/x6+E1i13eN4/DE+dwzB715D9jeIvOAexgydkDsQ4Pmoa8F3IBmh+M5E4trSv5XkrJT/mYy8DmWTIDZIss24ynqsvwXMcDSgZ/1fIja2hp41OjAjA8tYYGAZ1xRGBFpgGUdwsPcScHSvL6Fn4QiZVCBxdF8K9kz2t1g4uo+Ao/EEHI33cCS52+Vyez3DZ88JXmPrfilBi7W/CQRyPEAgxwPEromxw/0EOzxIsMODWxBswsEWknRx3YTAE9pCujEPAbsxwA6KukFIN2YCMGm+H5jsPCzAnz9E8GPDBHRjHmZMIAvpxgDPR92U7sYkrlT8UdIVxAZJthnXjZkorRsz0UI3BhlYJgIDyyQB3ZhJBAc7mYCjyRa6McikAomjRwR0Yx4h4OhRAo4e9XVj/imISWn7pwNiKDRFWkCcsgUBMRxsxQEOGVwDv17hRqWaNAmYAtR5KrBrcAuw68Liy1RCIJhG4OE0Cx035PUOMjkZIaTjhuThY0AejnB8bs7w8DECD6cTeDi9Bh5mgPc9CoijGeA3bhKvBGMLjQlg9zruym2md+X2OGtYfUbTzX8MpQDDwLG9okk3y/H2tAHALILeswnOZjbxuvFxkh2eINjhCQvJz0xgV+5xoAN/0nE+PUTC0W2OX/cYnZ8k6D1KyHUP8HzUqPR1T+JKxR8lXUFskGSbcd2tOczu1ixCYJlj4boHGVjmAAPLXMeve8x5zyU42KcIOHrKwnUPMqlA4uhpx697DI6eJuDoGQKOnvmX4dvYQtsH+NZeXKU9zyuEn5USFFj7m0cA33ME8D1HrDaNHZ4l2OF5gh2et1BtzgMmBc8Cnfl8x/k0hlRt3img2pxP0Hu0kGoTeD5qdLraTFyp+KOkK4gNkmwzrtp8QVq1+YKFahMZWF4ABpYXBVSbLxIc7AICjhZYqDaRSQUSRwsFVJsLCTh6iYCjl7bCcCGrrZkOiKHQy9IC4ssWhgtnNuUE18AfliRkuPBloM6vAIdRxjg+XGj48gohELxK4OGrFjoeyPY1MjkZK2S4EMnD14A8HOv4cKHh4WsEHr5O4OHrxA7s7aTO2RuOdwzNJwu/QdBbzMe3A5+1yK+zKo0WF4Wj0ZJIaaQkWhHVz1SFxcXR8rKiaFFFZVFJJFJS3jcaKS2LFFdUlahweXFRaaQqUl1RWl1WaPWLYhaBuRpbb9aQv8I2zTLEm03xz30LGJxYer/VFH5G//dNhrH9mpZC7BsM3/b9PbPQxEbafHFTLm6D7u9W/YzFBCd+r+PJi8EQQ+/7hFz7AM9HIXWO8T6mb4z3fv6/4/EfjYkiEhfud/wK1Oj8DkHvB4RwAXg+6gECF2IF760eB0Z4/44MbebEu+SY2Bz4rPeEJrvvkZLd96Ulu8YQ7xOS3Q8cT3aN3h8Qkl3GXhd7e0U79Q8JQ41o3fvqB39IOKdtved8pJ+9RMvHWj5p+rezjXWaPmq6ecDU/Lwk4eePE37+xHdGLDugMfCwkM7uRwB/UlX991oC9E0THbefp3Pfj3H2K/8EaL9JQj7oEsgTBcSMmmQpMXeBv7FnfUpuxISDLWX89EcEX73U8VsEo/enBL0/c1zv/TVZlhL0nuJ4480Uqp8R9J4qJCf5HOiHgGetpjqOG8MXBm6mC+DLUoLeM4TwZRmQL8CzVjOITW/jI0xjb1nTzQ2+L8gNPmR986WAXGsJgVPLBeRaXxL0/spxvQ/QZFlO0HuW47HD+IyvCHrPFhI7VgD9EPCs1WzHcWP4wsDNHAF8YfiJuUL48jWQL8CzVnOJudYKL8f62pdrfUPOtT4G5lorBeRaHxM49a2AXGslQe/vHNf7QE2Wbwl6P+N47DA+4zuC3vOExI7vgX4IeNZqnuO4MXxh4OZ5AXxh+In5QviyCsgX4Fmr+cRc63svx1rly7VWk3Mt5L3zDwJyrU8InFojINf6gaD3j47rfZAmyxqC3gscjx3GZ/xI0HuhkNjxE9APAc9aLXQcN4YvDNy8IoAvDD/xqhC+/AzkC/Cs1avEXOsnL8f62Zdr/dJ0839HY6wqgztzu1Y/e52W9Vo2JMzcrk2YqV2X8PP6hJ83EGduY3aAvw0uhGtrgTO364C5+yIhM7frgTO3G4D2e1PIzC2QJwqIGcWyH7peXgvEzK8C6uW1BF+9UUC9/CtB798c1/tgTZaNBL3fcTz/N3nfbwS93xWSk/wO9EPAs1bvOo4bwxcGbj4QwBeGn/hQCF/+APIFeNbqQ2K9/LtXJ//hq5c3ke8mkPXNnwJyrXUEToWauZ9r/UnQexvH9T7EkKUZXu+PHY8dxmdsQ9D7EyGxIwOHSwU8a/WJ47gxfGHg5jMBfGH4ic+F8KUWkC/As1afE3Mt4yNMjlWr2eZca9tmobiFzrXWA3Ot2s3cz7XWE3KOOgJyrdoEX7Kd43ofqslSh6D3l47HDuMztiPovVxI7KgL9EPAs1bLHceN4QsDN18L4AvDT3wjhC/1gHwBnrX6hphr1fVyrHq+XKs+OddC3js3EJBrbSDkWg0F5FoNCL5ke8f1PkyTpSFB7+8cjx3GZ2xP0Pt7IbGjEdAPAc9afe84bgxfGLj5QQBfGH5ijRC+NAbyBXjWag0x12rk5ViNfblWEw8D/t9r4v33fUKbf6+pl5OhcWj+Rk3zqIVV1dGwPs6iimiFipZVqTJVXVRUpvpGwn0riqPh6sJoRaSqtG91UbEqLI5WFhUV962oDpeUhovLw5Eqhfwc4ET7NPXsc7TPPs2a8WaXqzM4s8uZ3nOa671nasnSkq0lR0uuljwt+VoKtLTQ0lJLKy2ttbTR0lZLOy3ttXTQ0lHLDs3iZ5+bN4ufbc5M+Dkr4efshJ9zEn7OTfg5L+Hn/ISfCxJ+bpHwc8uEn1sl/Nw64ec2CT+3Tfi5XcLP7RN+7pDwc8eEn3doxpv9juEI7fN/FuLzmzcL/qzY7HdmM9y+fhEy+52Fs195NtB+a2XYT+XA7FelcoH2WyfCfpUqD2a/iMoH2m+9CPuFVQHKflVh1QJovw0S7FcZVi1R9ouEVSug/X6VYD+df7QG2a9KP6sN0H4bBdivUuvcFmS/iH5WO6D9fhNgP/1o1R5jvyrzrA5A+/3uvv0qjc4dMfaLmGftALTfH0Le/QPWScpfMwS13yYh9gPm+Wod0H5/CrEfME9VG4D2C3WVYT9gnqU2Au23jRD7AfME9TvQfhlC7AeMc2oT0H61hNgP6KeV32cFtd+2QuwH9DMqA2i/2kLsB+SJAmJGseyXkWA/F/r3sWftKGBuqznhfn4nAXNbOxL07uS43odrsuxE0Duvq9t6m3vzTgS98y3FhKD77Az0Q8CzVvmO48bwhYGblgL4wvATrYTwZWcgX4BnrZD2S5w36uzNG+3cbPO80S7kGXnkfEMXAblWJoFTXQXkWl0IendzXO8jNFm6EvRu63jsMD6jG0HvdkJiRxjoh4Bnrdo5jhvDFwZuOgrgC8NP7CCELwrIF+BZqx2IuVbYy7GUL9cqJOdaWcBcq0hArpVF4FSxgFyriKB3ieN6H6nJUszo5zkeO4zPKCHo3VlI7CgF+iHgWavOjuPG8IWBmy4C+MLwE12F8KUMyBfgWauuxFyr1Muxyny5VoScayHfOykXkGtlEzjVXUCuVU7Qe1fH9T5Kk6U7QW/leOwwPmNXgt6FQmLHbkA/BDxrVeg4bgxfGLgpEcAXhp8oFcKX3YF8AZ61KiXmWrt5OdbuvlyrBznXygHmWnsIyLVyCJzaU0CutQdB770c1/toTZY9CXqXOx47jM/Yi1FTCIkdPYF+CHjWqrvjuDF8YeBmdwF8YfiJHkL4sjeQL8CzVj2IuVZPL8fa25dr7UPOtZCfB9JLQK6VS+DUvgJyrV4EvfdzXO9jNFn2ZeSYjscO4zP2I+jdU0js2B/oh4BnrXo6jhvDFwZuegngC8NP7CuELwcA+QI8a7UvMdfa38uxDvDlWgeSc608YK51kIBcK4/AqYMF5FoHEfQ+xHG9j9VkOZig9wGOxw7jMw4h6H2gkNhxKNAPAc9aHeg4bgxfGLg5RABfGH7iUCF8OQzIF+BZq0OJudahXo51mC/XOpycayE/p/UIAblWPoFTRwrItY4g6H2U43ofp8lyJEHvI1x/d1/rfBQD50Jix9FAPwQ8a3Wk47gxfGHg5hgBfGH4iWOF8OUYIF+AZ62OJeZaR3s51jG+XOtYcq5VAMy1jhOQaxUQOHW8gFzrOILeJziu9/GaLMcz9Ha9P6F1PoGg94lCYseJQD8EPGt1ouO4MXxh4Ka3AL4w/MQpQvhyEpAvwLNWpxBzrRO9HOskX651MjnXQn5/Tm8BuVYLBqcE5Fq9CXr3cVzvEzRZTiHoHXU8dhif0Yegd4WQ2HEq0A8Bz1pVOI4bwxcGbqoE8IXhJ6qF8CUK5AvwrFU1Mdc61cuxor5cq4Kca7UE5lqVAnKtlgRO9RWQa1UyfKjjep+oydKXoPcZjscO4zOqCHqfKSR2VAP9EPCs1ZmO48bwhYGbcwTwheEn+gnhy2lAvgDPWvUj5lrVXo51mi/XOp2cayG/1/gMAblWK0YMEpBrnUHQ+yzH9T5Jk+VMgt7nOx47jM84i6D3BUJix9lAPwQ8a3WB47gxfGHgZoAAvjD8xEAhfDkHyBfgWauBxFzrbC/HOseXa/Uj51qtgbnWuQJyrdYETp0nINc6l5FzOK73yZos5xH0HuR47DA+43yC3oOFxI4LgH4IeNZqsOt3aRkc3FwmgC8MP3G5EL70B/IFeNbqcmKudYGXY/X35VoXknOtNsBca4CAXKsNo34RkGsNIOh9keN699ZkGUjQe6jjscP4jIsIel8pJHZcDPRDwLNWVzqOG8MXBm6uEcAXhp+4VghfBgH5AjxrdS0x17rYy7EG+XKtweRcqy0w17pEQK7VlsCpSwXkWpcw6lXH9T5Fk+VSgt43OB47jM+4jKD3jUJix+VAPwQ8a3Wj47gxfGHgZrgAvjD8xM1C+HIFkC/As1Y3E3Oty70c6wpfrjWEnGu1A+ZaQwXkWu0Y9b6AXGsoQe+rHNe7jybLlQS9RzgeO4zPuIqg90ghseNqoB8CnrUa6ThuDF8YuLldAF8YfuIOIXy5BsgX4FmrO4i51tVejnWNL9e6lpxrtQfmWtcJyLXaEzh1vYBc6zpGf8dxvU/VZLmeoPddjscO4zNuIOh9t5DYcSPQDwHPWt3tOG4MXxi4GSuALww/MU4IX4YB+QI8azWOmGvd6OVYw3y51k3kXKsDMNcaLiDX6sDoFQvItYYT9L7Fcb2jmiw3E/Qe73jsMD7jFoLeE4TEjluBfgh41mqC47gxfGHg5kEBfGH4iYeE8GUEkC/As1YPEXOtW70ca4Qv1xpJzrU6AnOt2wTkWh0JnBolINe6jXE34LjeFZosowh6T3I8dhifcTtB78lCYscdQD8EPGs12XHcGL4wcDNFAF8YfmKqEL7cCeQL8KzVVGKudYeXY93py7VGk3OtHYC51l0Ccq0dGHcrAnKtuwh6j3Fc70pNlrsJek93PHYYnzGGoPcMIbHjHqAfAp61muE4bgxfGLiZJYAvDD8xWwhfxgL5AjxrNZuYa93j5VhjfbnWOC/XQuPAPM/EYPRz5zjOK6PzOAKv5pJ4lQHWH3g+ypbOQc/mg6a4Z93reD2xWOt6LwHf95Hz6qD7a66fcR9B72cc92fvNuXoPU+IPwOej0LqXCf0d060Tej/X2gMjAhhc5LYGt+shv2jNs0yxPhm+OdOADakWHpPaAY/I2pQRtr0fmBQ/l8g7gMSifsAgbgPCiDugyTiMjLL+xmTNs1kOCwklh4GOyyzav2L7uFgSz3dRHfhmgIzLf28h5q67VAl2TGE3Wccj7DPLowLVBONP0GDwDiUhwlOdRsPEBN9TpC1d/goDtDJ1vH09h/kf5UoGT4bTPYw9wgD1OYAJwrJFMw+JxFA/Kjjd7sGAI8y5oKa4Z2YeeYQ75loOzxCssNUgh2mEu0Qc2JoOzzveE/yn7K7oHrPF3J3OQ2Y3QPPWtmyXzjY+suPbuGzVJL/Hn4EWLU95nj8MT53GsHvLiD7G0Re8BhB74VC7kCA56MWgu9AMkLxnYnEtaV/K8lZKf8zGXkdyiZBbJBkm3GV9XR/C5jhaEDP+r9EbHoNPWt0YEYGlunAwDKjGYwItMAyg+BgZxJwNNOX0LNwhEwqkDh6PAV7JvtbLBw9zhjmJOBolocjyd0ul9vrGT57zvYaW09ICVqs/c0mkONJAjmeJHZNjB2eINhhDsEOc7Yg2ISDLSTp4roJQe35ipBuzFxgNwbYQVGvCOnGzAYmzU8Ak52nBPjzuQQ/9pqAbsxTBL1fF9KNAZ6Pej3djUlcqfijpCuIDZJsM64b87S0bszTFroxyMDyNDCwPCOgG/MMY+SfgKN5FroxyKQCiaNnBXRjniXg6DkCjp7zdWP+KYhJafunA2Io9Ly0gPj8FgTEcLAVBzhkcA36rDfdqFSTJgHPA3WeD+wavAnsurD4Mp8QCF4g8PAFCx035PUOMjl5W0jHDcnDF4E8fNvxuTnDwxcZ8zsEHi6ogYcZ4H1PBOJoIfiNm8QrwdhCYwLYvY67cnvJu3J7mTWsvrDZ5j+GUoBh4Nhe0aR7xfH2tAHAKwS9XyU4m1eJ140vk+zwGsEOr1lIfl4CduVeBjrw1x3n01wSjt5x/LrH6Pw6Qe93hVz3AM9HvZu+7klcqfijpCuIDZJsM6679Qazu/UKIbC8YeG6BxlY3gAGlkWOX/eY815EcLBvEnD0poXrHmRSgcTRW45f9xgcvUXA0dsEHL39L8O3sYW2D/CtvbhKe7FXCL8jJSiw9reYkSUSwPcusdo0dniHYIf3CHZ4z0K1uRiYFLwDdObvO86naaRq8wMB1eb7BL0/FFJtAs9HfZiuNhNXKv4o6QpigyTbjKs2P5BWbX5godpEBpYPgIHlQwHV5ocEB/sRAUcfWag2kUkFEkdLBFSbSwg4+piAo4+3wnAhq62ZDoih0CfSAuInFoYLX2rGCa6BCS1kuPAToM6fAodRPnZ8uNDw5VNCIFhK4OFSCx0PZPsamZx8KmS4EMnDz4A8/NTx4ULDw88IPPycwMPPiR3YSaTO2TLHO4bmk4WXEfSW8vHto4DP+sKvsyqNFheFo9GSSGmkJFoR1c9UhcXF0fKyomhRRWVRSSRSUt43GiktixRXVJWocHlxUWmkKlJdUVpdVmj1i2K+AHM1tr6sIX+FbZpliC+b4Z+7HBicWHovbwY/o//7JsPYfqtCm7/B8Cvf3zMLTWykzVc04+I26P5u089YQXDinzmevBgMMfT+XMi1D/B8FFLnGO9j+sZ47+f/1x7/0ZgoJnHhS8evQI3OXxP0Xi6EC8DzUcsJXIgVvLd5HBjl/Xt7aDMnviHHxEzgs1YKTXZXkpLdb6Ulu8YQ3xKS3e8cT3aN3t8Rkl3GXld4e0U79e8JQ41o3a/SD/6ecE7bes9ZpZ+9WssPWtY0+9vZxjpNq5ptHjA1P69O+PmHhJ/X+M6IZQc0Br4W0tldBfAnVdV/r9VA3/SN4/bzdO77A85+5WuA9lsp5IMugTxRQMyolZYScxf4G3vWj+RGTDjYUsZPryL46p8cv0Uwev9I0Ptnx/U+TZPlJ4LeqxxvvJlC9WeC3quF5CS/AP0Q8KzVasdxY/jCwM2PAvjC8BM/CeHLWiBfgGetfiI2vY2PMI29tc02N/jWkRt8yPpmvYBcazWBUxsE5FrrCXr/6rjep2uybCDovdbx2GF8xq8EvdcJiR0bgX4IeNZqneO4MXxh4OZXAXxh+ImNQvjyG5AvwLNWG4m51kYvx/rNl2v9Ts61fgDmWn8IyLV+IHBqk4Bc6w+C3n86rvcZmiybCHr/4XjsMD7jTwbOhcSOUHOcLYFnrTY5jhvDFwZutunmPl8YfiKjmwy+bAPkC/CsFdJ+ibmW8REmx9qm+eZcK6N5KG6hcy3kvXOt5u7nWmsInNq2ufu5ljkbtN61Hdf7TE2WbRl6Ox47jM+oTdC7jpDYUQfoh4Bnreo4jhvDFwZu6gngC8NP1BfCl+2AfAGetapPzLXqeDnWdr5cq27zzf8djbGrM7gzt/X03utraaClYfP4mdt6zeNnausn/Nwg4eeGzXkztzE7oLm2vRCu1Wse/Fmxmdv6zXH7auS4/WIztw1w9itvCLRfY0v2CwdbCsgTBcSMYtkPXS/XA2JmewH1cj1CXtRIQL28PUHvxo7rfZYmSyOC3s0dz/9N3teYoHemkJykCdAPAc9aZTqOG8MXBm5yBPCF4SdyhfClKZAvwLNWucR6uYlXJzf11cvNyHcTyPqmuYBcqz4jBgnItZoT9M5yXO+zNVkyCXoXOB47jM/IIujdQkjsyAb6IeBZqxaO48bwhYGb1gL4wvATbYTwJQfIF+BZqzbEXCvby7FyfLlWLjnXagDMtfIE5FoNCJzKF5Br5TFyDsf1PkeTJZ+gd3vHY4fxGQUEvTsIiR0tgH4IeNaqg+O4MXxh4GZHAXxh+ImdhPClJZAvwLNWOxFzrRZejtXSl2u1IudayHvn1gJyrYaM+kVArtWaoHdbx/Xup8nShqD3zo7HDuMz2hL03kVI7GgH9EPAs1a7OI4bwxcGbroJ4AvDT4SF8KU9kC/As1ZhYq7Vzsux2vtyrQ4eBvy/18H7771Cm3+vo5eToXFo/kZN86iFVdXRsD7OoopohYqWVakyVV1UVKb6RsJ9K4qj4erCaEWkqrRvdVGxKiyOVhYVFfetqA6XlIaLy8ORKoX8HOBE+3T07HOMzz47EGeXr8ngzC5nes/ZUe99Jy2dtHTWsrOWXbR00dJVSzctYS1KS6GWIi3FWkq0lGop0xLRUq6le8Ls844Js807JfzcKeHnzgk/75zw8y4JP3dJ+Llrws/dEn4OJ/ysEn4uTPi5KOHn4oSfSxJ+Lk34uSzh50jCz+UJP3cnzn7HcIT2+UVCfP6OwNnvnYA1ZLGQ2e9OwNnvzkD7lciwn9oZZr8qtQvQfqUi7FepusDsF1FdgfYrE2E/naei7Fel81Sg/SIS7FcZVgplv0hYFQLtVy7Bfjr/KALZr8p8GRbQft0F2K9S61wCsl9EP6sUaL9dBdhPP1qVYexXZZ4VAdpvN/ftV2l0LsfYL2Ke1R1ov92FvPsHrJOUv2YIar8eQuwHzPNVKdB+ewixHzBPVRGg/fYUYj9gnqW6A+23lxD7AfMEtRvQfj2F2A8Y51QPoP32FmI/oJ9WewLtt48Q+wH9jOoJtF8vIfYD8kQBMaNY9stIsJ8L/fv/q1kFzG3tSLif303A3NauBL13d1zvczVZdiPofYLjcyjm3nx3gt4nCrmT7AH0Q8CzVic6jhvDFwZuegvgC8NPnCKEL3sA+QI8a4W0X+K8UQ9v3miP5pvnjfYkz8gj5xv2EpBr7UTgVE8BudZeBL33dlzv8zRZehL0jjoeO4zP2Jugd4WQ2LEP0A8Bz1pVOI4bwxcGbqoE8IXhJ6qF8KUXkC/As1bVxFxrn9jsuy/X2peca3UC5lr7Cci1OhE4tb+AXGs/gt4HOK73+Zos+xP0PsPx2GF8xgEEvc8UEjsOBPoh4FmrMx3HjeELAzfnCOALw0/0E8KXg4B8AZ616kfMtQ70cqyDfLnWweRcC/neySECcq3OBE4dKiDXOoSg92GO632BJsuhBL3Pdzx2GJ9xGEHvC4TEjsOBfgh41uoCx3Fj+MLAzQABfGH4iYFC+HIEkC/As1YDibnW4V6OdYQv1zqSnGvtDMy1jhKQa+1M4NTRAnKtowh6H+O43v01WY4m6D3I8dhhfMYxBL0HC4kdxwL9EPCs1WDHcWP4wsDNZQL4wvATlwvhy3FAvgDPWl1OzLWO9XKs43y51vHkXAv5eSAnCMi1dmHMDAvItU4g6H2S43pfqMlyIkHvoY7HDuMzTiLofaWQ2HEy0A8Bz1pd6ThuDF8YuLlGAF8YfuJaIXzpDeQL8KzVtcRc62Qvx+rty7VOIedaXYC5Vh8BuVYXAqdOFZBr9WHMiDuu9wBNllMJet/geOwwPiNK0PtGIbGjAuiHgGetbnQcN4YvDNwMF8AXhp+4WQhfKoF8AZ61upmYa1V4OValL9fqS861kJ/TWiUg1+rKeN9EQK5VRdD7NMf1HqjJUk3Qe4TjscP4jNMIeo8UEjtOB/oh4FmrkY7jxvCFgZvbBfCF4SfuEMKXM4B8AZ61uoOYa53u5Vhn+HKtM8m5VjdgrnWWgFyrG4FTZwvItc5ivF/kuN4XabKcTdD7Lsdjh/EZ5xD0vltI7OgH9EPAs1Z3O44bwxcGbsYK4AvDT4wTwpdzgXwBnrUaR8y1+nk51rm+XOs8cq6F/P6c8wXkWmHG+1kCcq3zCXr3d1zvizVZLiDoPd71z0nSOvcn6D1BSOy4EOiHgGetJjiOG8MXBm4eFMAXhp94SAhfBgD5Ajxr9RAx17rQy7EG+HKtgeRcSwFzrYsE5FqKwKmLBeRaFzHex3Nc70GaLBcT9J7k+l2Q1nkQQe/JQmLHYKAfAp61muw4bgxfGLiZIoAvDD8xVQhfLgHyBXjWaiox1xrs5ViX+HKtS8m5FvJ7jS8TkGsVMt7tFZBrXUbQ+wrH9R6syXI5Qe/pjscO4zOuIOg9Q0jsGAL0Q8CzVjMcx43hCwM3swTwheEnZgvhy1AgX4BnrWYTc60hXo411JdrXUnOtYqAudZVAnKtIgKnrhaQa13FeJfbcb0v0WS5mqD3HMdjh/EZ1xD0niskdlwL9EPAs1ZzHceN4QsDN88I4AvDT8wTwpfrgHwBnrWaR8y1rvVyrOt8udb15FyrGJhr3SAg1ypmvAsvINe6gaD3MMf1vlST5UaC3s87HjuMzxhG0Hu+kNhxE9APAc9azXe9v5PBwc0CAXxh+ImFQvgyHMgX4FmrhcRc6yYvxxruy7VuJudaJcBc6xYBuVYJgVO3Csi1bmF89oHjel+myXIrQe9XHI8dxmeMIOj9qpDYMRLoh4BnrV51HDeGLwzcvCGALww/sUgIX24D8gV41moRMdca6eVYt/lyrVHkXKsUmGvdLiDXKmV8joqAXOt2gt53Oq735ZosdxD0ftvx2GF8xp0EvRcLiR2jgX4IeNZqseO4MXxh4OY9AXxh+In3hfDlLiBfgGet3ifmWqO9HOsuX651NznXKgPmWmME5FplBE7dIyDXGkPQe6zjel+hyXIPQe+PHI8dxmeMJei9REjsGAf0Q8CzVkscx43hCwM3nwrgC8NPLBXCl3uBfAGetVpKzLXGeTnWvb5c6z5yrhUB5lrjBeRaEQKnJgjItcYT9L7fcb2HaLJMIOi9zPHYYXzG/QS9vxASOx4A+iHgWasvHMeN4QsDN18J4AvDT6wQwpcHgXwBnrVaQcy1HvByrAd9udZD5FyrHJhrPSwg1yoncGqigFzrYYLekxzXe6gmy0SC3isdjx3GZ0wi6P2tkNgxGeiHgGetvnUcN4YvDNysEsAXhp9YLYQvjwD5AjxrtZqYa032cqxHfLnWo+Rcqzsw15oiINfqTuDUVAG51hSC3tMc1/tKTZapBL1/dDx2GJ8xjaD3T0Jix2NAPwQ8a/WT47gxfGHgZq0AvjD8xDohfJkO5AvwrNU6Yq71mJdjTfflWjO8XAuNA/M8E4PRz/3VcV4ZnWcQeLWRxKsMsP7A81G2dA56Nt81wz1rpuP1xAqt60wCvh8n59VB95epn/E4Qe8/HPdn3zTj6L1JiD8Dno9C6lwn9HdOtE3o/1/w2f4QNieJrVnNa9g/atMsQ8xqjn/ubGBDiqX37ObwM6IGZaRNnwAG5f8F4j4pkbhPEog7RwBx55CIy8gsnyBkGnOby3BYSCw9BXZYZtX6F93DwZZ6q6nuwjXDPW+xft7cZm47VEl2DGH3Gccj7LML4wLV08afoEFgHMpTBKe6jQeIp31OkLV3tJN9Buhk63h6+w/yv0qUDJ8N5nmYe5YBanOATwvJFMw+nyGA+DnH73YNAJ4j6P18c7wTM88c4j0TbYdnSXaYT7DDfKIdYk4MfncTdpsH/5TdBdU7A6x3bKHvLl8AZvfAs1a27BcOtv7yo1v4LJXkv4efBVZtLzoef4zPfYHgd2uT/Q0iL3iRoHcdEl/QyTLwfBRS5zqerv7OROLa0r+V5KyU/5mMvA5lkyA2SLLNuMp6gb8FzHA0oGf9XyK2oIaeNTowIwPLAmBgWdgcRgRaYFlIcLAvEXD0ki+hZ+EImVQgcfRyCvZM9rdYOHqZgKNXCDh6xcOR5G6Xy+31DJ89X/UaW69JCVqs/b1KIMfrBHK8TuyaGDu8RrDDGwQ7vLEFwSYcbCFJF9dNCGrPekK6MYuA3RhgB0XVE9KNeRWYNL8GTHbeFODPFxH8WAMB3Zg3CXo3FNKNAZ6PapjuxiSuVPxR0hXEBkm2GdeNeUtaN+YtC90YZGB5CxhY3hbQjXmb4GAXE3C02EI3BplUIHH0joBuzDsEHL1LwNG7vm7MPwUxKW3/dEAMhd6TFhDf24KAGA624gCHDK5Bn9XYjUo1aRLwHlDn94Fdg8bArguLL+8TAsEHBB5+YKHjhrzeQSYnTYV03JA8/BDIw6bkzkk42PqLhx8SePgRgYcf1cDDDPC+nwbiaAn4jZvEK8HYQmMC2L2Ou3L72Lty+4Q1rL6k+eY/hlKAYeDYXtGk+9Tx9rQBwKcEvZcSnM1S4nXjJyQ7fEaww2cWkp+PgV25T4AO/HPH+bSIhKPmjl/3GJ0/J+idKeS6B3g+KjN93ZO4UvFHSVcQGyTZZlx3axmzu/UpIbAss3Ddgwwsy4CB5QvHr3vMeX9BcLBfEnD0pYXrHmRSgcTRcsevewyOlhNw9BUBR1/9y/BtbKHtA3xrL67SXuEVwl9LCQqs/a0ggO8bAvi+IVabxg5fE+ywkmCHlRaqzRXApOBroDP/1nE+vUCqNnMEVJvfEvTOFVJtAs9H5aarzcSVij9KuoLYIMk246rN76RVm99ZqDaRgeU7YGD5XkC1+T3Bwa4i4GiVhWoTmVQgcbRaQLW5moCjHwg4+mErDBey2prpgBgKrZEWENdYGC78uDknuAZ9VoGQ4cI1QJ1/BA6jFDg+XGj48iMhEPxE4OFPFjoeyPY1MjlpKWS4EMnDn4E8bOn4cKHh4c8EHv5C4OEvxA7sM6TO2VrHO4bmk4XXEvSW8vHtWcBnrfPrrEqjxUXhaLQkUhopiVZE9TNVYXFxtLysKFpUUVlUEomUlPeNRkrLIsUVVSUqXF5cVBqpilRXlFaXFVr9oph1YK7G1voa8lfYplmGWN8c/9wNwODE0ntDc/gZUVr9y5txPs2yteNXHOZ7NhifG9FGyOeNXJeBe1ZrYHHUVkiC/CswqQViRrUFnoXNoPkrKWhulBY0jSE2EoLmb44HTaP3b6SgGVvobBeZiPzeHItLls5IHP0B1NnGFzTFkiXU82JJCBjz1Lt7YOJg7QuQNjFevzOE/YPgsGLtmU2+IMDaOzr7/RMYxW1OpSJBneHfaKa330wCAI2xN1kqM8PBljL7/JMAuIxMt/U2ADB7ROtdKxPvcMwzh4Q4BNuGZIdtCXbYNpN/PxXa8n0nvTPdJhNnz9qO88k4agaOOjrerjI61ybovYOQiVzg+Sikzv8rE7mhTA4OUrVBkm3GZfV1MokDSBmEwBK3YW+h+5LIwFIHGFi2y4QRgRJYzHlvR3CwdQk4qpvJn8hFJhVIHNVLwZ5bYyLX4KgeAUf1CTiqn2nvy1ektM4yfDZo4FXvDaUEGtb+GhAAvT0B0NsTK1hjh4YEOzQi2KGRhQDRGOjUkRfIyMvUf7NfONhSDYCJWkPgWTQR4I8aE3jYSUAHoAlB785COgDA81Gd0x2AxJWKP0q6gtggyTbjOgBNpXUAmlroACADS1NgYGkmoAPQjOBgmxNw1NxCgodMKpA4yhTQAcgk4CiLgKOsTPvv5LJazemAGAplSwuI2VsQEMPBVhzgkME16LO6CHknNxuocw4OQ6qL4+/kGr7kEAJBLoGHuRZmHpBXCsjkpJuQVw6QPMwD8rAbuXMSDrb+4mEegYf5BB7mZ/K/8GMT8nMlgDiyOfDZGHh2Gb59tvCujFqyBj4LMjf/MZQCDAPH9oomXSvH29MGAK0IercmOJvWxOuyliQ7tCHYoY2F5KcFsCvXEpgItHWcT41JOFKOX/cYndsS9C4Uct0DPB9VmL7uSVyp+KOkK4gNkmwzrrvVjtndakUILO0sXPcgA0s7YGBp7/h1jznv9gQH24GAow4WrnuQSQUSRx0dv+4xOOrIeDODgKMdMu1/4Qfr1codvUJ4JylBgbW/HRnDUATwdSJWm8YOOzGGowh26Gyh2twRmBTsBHTmOzvOJ+OsGNVmiYBqc2eC3qVCqk3g+ajSdLWZuFLxR0lXEBsk2WZctbmLtGpzFwvVJjKw7IKcpRBQbXYhONiuBBx1tVBtIpMKJI66Cag2uxFwFCbgKLwVhgtZbc10QAyFlLSAqCwMF7bI5ATXoM8qFzJcqIA6FwKHUcodHy40fCkkBIIiAg+LLHQ8kO1rZHKyq5DhQiQPi4E83NXx4ULDw2JGx4jAwxJiB9bMezE6Z6WOdwzNJ2mWEvT+HfxJmrY+xxt53ePfb1mmsM/xNoYoy8Q/N5LpdmJi9I5kws+I+jneSJuWgyeipRO3u0TidicQd1cBxN1VyHS5iY7lhKi7W6YMh4XE0u5gh2VWTa0+9J3dtiE3nZ9fZzTugTpb+/D9HoxXYQxRdyc4q1ip1COT9+H7sb2jndceQOdlc0IMCeoM3z739PCxFwOAxtg9hERLs889CIDr6XhtbgDQk6D33oTezN7E3sxeJDvsQ7DDPhZ6xXsChxj2AmZivRznk3HUDBzt7vh0nNG5F0HvHkKm44Dno3qkp+MSVyr+KOkKYoMk24zL6vdlDgP0JASWfS1MxyEDy77AwLKf49Nx5rz3IzjY/Qk42t/CdBwyqUDi6ADHp+MMjg4g4OhAAo4O3IJ3sf4rLbMMn84HeUX1wVICDGt/BxGAfAgByIcQK1djh4MJdjiUYIdDLVSuLAIHtedhpAwWbb+DgAnawcDAergAf3QYgYd7Caj8D2d0ToVU/sDzUT3TlX/iSsUfJV1BbJBkm3GV/xHSKv8jLFT+yMByBDCwHCmg8j+S4GCPIuDoKAuVPzKpQOLoaAGV/9EEHB1DwNExW+G9OFaLOR0QQ6FjpQXEY7cgIIaDrTjAIYNr4DtWIe/FHQvU+TjghF8vx9+LM3w5jhAIjifw8HgLHSPkVQIyOdlPyHtxSB6eAOThfuTOSTjY+ouHJxB4eCKBhydm8j90vwcQRyeBJ7ZtDXoiu8QZvn2e7F0Z9WYNep6UufmPoRRgGDi2VzTpTnG8PW0AcApB7z4EZ9OHeF3Wm2SHUwl2ONVC8nMysCvXG+jAo47z6TASjg5w/LrH6BxlzI8Iue4Bno86MH3dk7hS8UdJVxAbJNlmXHergtndOoUQWCosXPcgA0sFMLBUOn7dY867kuBg+xJw1NfCdQ8yqUDiqMrx6x6DoyoCjqoJOKrOtP+h+6xXKk/zCuHTpQQF1v5OI4DvDAL4ziBWm8YOpxPscCbBDmdaqDZPAyYFpwOd+VmO88k4K0a1eYiAavMsxnCzkGoTeD7q0HS1mbhS8UdJVxAbJNlmXLV5trRq82wL1SYysJwNDCznCKg2zyE42H4EHPWzUG0ikwokjs4VUG2eS8DReQQcnbcVhgtZbc10QAyFzpcWEM+3MFx4ciYnuAaeuBYyXHg+UOcLgMMoRzg+XGj4cgEhEPQn8LC/hY4Hsn2NTE6OEjJciOThhUAeHuX4cKHh4YUEHg4g8HAAsQO7B2lOY6DjHUPzCZoDCXrvBj7/uj6fca0Gwyb973Xev9d7/5p1UWbN+AiqT5Z+hvmoZPhbUY77B6PzRQR8HCukswo8H2VL56Bnkw181sV+P6BKo8VF4Wi0JFIaKYlWRPUzVWFxcbS8rChaVFFZVBKJlJT3jUZKyyLFFVUlKlxeXFQaqYpUV5RWlxVa/fKNi8H+K7YG1VDTwTbNMsSgTPxzBwMTNpbegzPhZxSkGE265xszcDZtDDyfS4BksukELiE5gUulOQFjiEsJTuAyx52A0fsyshNAR2+kY708E4tLls5IHF0B1PnfvsQDjdXGQq4O/EEqHHDVYFbQs+O/eGMI43U4Q64rCM4l1i4Zksn74o3Y3tFl4VBwpmBrShQJ6gzfPq/08HEVA4DG2ENI0Q29V7PPoQTAXe14f84A4GqC3tcQ+rPXEPuzV5HscC3BDtdauC+6EjjIdBUwe7rOcT4ZR83A0QmOT8gana8j6H2ikD4u8HwUUuf/lQnZK0nVR6o2SLLNuKz+euZA0NWEwHL9FgwEBSU0MrBcDwwsNzg+IWvO+waCg72RgKMbLUzIIpMKJI6GOT4ha3A0jICjmwg4uinT/vuYyDZXhm+fw71C+GYpQYG1v+EE8N1CAN8txGrT2OFmgh1uJdjhVgvV5nBgUnAz0JmPcJxPjUldi94Cqs0RBL1PEVJtAs9HnZKuNhNXKv4o6QpigyTbjKs2R0qrNkdaqDaRgWUkMLDcJqDavI3gYEcRcDTKQrWJTCqQOLpdQLV5OwFHdxBwdEem/fcxWW3NdEAMhe6UFhDv3IKAGA624gCHDK6BP2dVyPuYdwJ1Hg2cBIs6/j6m4ctoQiC4i8DDuyx0PJDta2RyUinkfUwkD+8G8rCS3DkJB1t/8fBuAg/HEHg4JpP/ZQ9DgDi6BzzZK/3KY6x35TGONVx4T+bmP4ZSgGHg2F7RpLvX8fa0AcC9BL3vIzib+4jXPeNIdhhPsMN4C8nPWGBXbhzQgU8QcN3DwFGV49c9RucJBL2rhVz3AM9HVaevexJXKv4o6QpigyTbjOtu3c/sbt1LCCz3W7juQQaW+4GB5QHHr3vMeT9AcLAPEnD0oIXrHmRSgcTRQ45f9xgcPUTA0cMEHD28FYYLWa/xTfQK4UlSggJrfxMJ4JtMAN9kYrVp7DCJYIdHCHZ4xEK1ORGYFEwCOvNHHeeTcVaMavMMAdXmowS9zxRSbQLPR52ZrjYTVyr+KOkKYoMk24yrNqdIqzanWKg2kYFlCjCwTBVQbU4lONhpBBxNs1BtIpMKJI4eE1BtPkbA0XQCjqZvheFCVlszHRBDoRnSAuIMC8OFYzM5wTXwtx8JGS6cAdR5JnAY5RzHhwsNX2YSAsHjBB4+bqHjgWxfI5OTc4UMFyJ5OAvIw3MdHy40PJxF4OFsAg9nEzuwQ0lzGk843jE0n9r4BEFv4MfEWv18Z+R1j3+/T9aQy8E2zTLEk5n4587JdDsxMXrPyYSfEfXznZE2nQueiJZO3KckEvcpAnGfFkDcp4VMl5voOJcQdZ/JlOGwkFiaB3ZYZtX6F93DwZba0DwU2hb4PPN1TIdluu1QJdkxhN2ntQ+kf5bxyo5xKPMIRomVdM9m8j6QPrZ3tJN9DlzaJE6y/VeJkuGzwfPe8+czQG0O8FkhmYLZ53MEEL/geF/CAOAFgt4vEvpSLxL7UvNJdlhAsMMCoh2MA9tA+LLN8wV82eZhhPO/QEhffyEwuweetbrAjfvJpPt8HjjwNB9Ytb3kePwxPnchgXcDHJ+kNXq/RNB7oJBJWuD5KKTO/yuTtM9ncnCQqg2SbDOusn6ZOTj0AiERe3kLBoeCEhoZWF4GBpZXHJ+kNef9CsHBvkrA0asWJmmRSQUSR685PklrcPQaAUevE3D0euY/v7cppdsl5b3SN7zG1iIpQYu1vzcI5HiTQI43iV0TY4dFBDu8RbDDWxamLIGki+smBLXnICHdmLeB3RhgB0UNEtKNeQOYNC8CJjuLBfjztwl+7BIB3ZjFBL0vFdKNAZ6PujTdjUlcqfijpCuIDZJsM64b8460bsw7FroxyMDyDjCwvCugG/MuwcG+R8DRexa6McikAomj9wV0Y94n4OgDAo4+yLT/XjOr7Z8OiKHQh9IC4odbEBDDwVYc4JDBNeizrhDyXvOHQJ0/AnYNrnD8vWbDl48IgWAJgYdLLHTckNc7yORkqJCOG5KHHwN5OJTcOQkHW3/x8GMCDz8h8PCTTP6XpjwLxNGn4DduEq8EYwuNCWD3Ou7Kbal35fYZa1j908zNfwylAMPAsb2iSfe54+1pA4DPCXovIzibZcTrxs9IdviCYIcvLCQ/S4Fduc+ADvxLx/n0NglHVzl+3WN0/pKg99VCrnuA56OuTl/3JK5U/FHSFcQGSbYZ191azuxufU4ILMstXPcgA8tyYGD5yvHrHnPeXxEc7AoCjlZYuO5BJhVIHH3t+HWPwdHXBBx9Q8DRN5n2vzQF+NZeXKW90iuEv5USFFj7W0kA33cE8H1HrDaNHb4l2OF7gh2+t1BtrgQmBd8Cnfkqx/m0kFRtXieg2lxF0Pt6IdUm8HzU9elqM3Gl4o+SriA2SLLNuGpztbRqc7WFahMZWFYDA8sPAqrNHwgOdg0BR2ssVJvIpAKJox8FVJs/EnD0EwFHP22F4UJWWzMdEEOhn6UFxJ8tDBcuzeQE16DPGiZkuPBnoM6/AIdRhjk+XGj48gshEKwl8HCthY4Hsn2NTE6GCxkuRPJwHZCHwx0fLjQ8XEfg4XoCD9cTO7DPkTpnGxzvGJpPFt5A0PsZ8PnX9fmMGzQYNul/b/T+Heb9a9avmTXjI6g+2foZlxPsdIvj/sHo/CtB71uFdFaB56Ns6Rz0bHKAz9ro9wOqNFpcFI5GSyKlkZJoRVQ/UxUWF0fLy4qiRRWVRSWRSEl532iktCxSXFFVosLlxUWlkapIdUVpdVmh1S9P2gj2X7H1Ww01HWzTLEP8lkn4NGBgwsbS+/dM+BkFKUaT7nl4Bs6mjYHn8weQTDadwB8kJ7BJmhMwhthEcAJ/Ou4EjN5/kp0AOnpDHWsWFpcsnZE42gaoc01fwhRbaKw2FnJ14A9S4YCrBrOCnh3/hUQZWYTX4Qy5DNiwG9/cLvlr06RDjO0dXRbWysJmCramRJGgzvDtc1sPH7UZADTGziAAkGFgs89aBMDVyXJbbwOAOgS9t8vCOxzzzCEhDsFqk+xQl2CHuln8+6Jtt3zfSe8wa2fh7FnPcT4ZR83A0W2OT8ganesR9B4lpI8LPB+F1Pl/ZUJ22ywODlK1QZJtxmX19bOIA0F1CIElbsPeQl+kIwNLfWBgaZAFIwIlsJjzbkBwsA0JOGqYxZ+QRSYVSBxtn4I9t8aErMHR9gQcNSLgqFGW/fcxkW2uDN8+G3uFcBMpQYG1v8YE8DUlgK8psdo0dmhCsEMzgh2aWag2GwOTgiZAZ97ccT4ZZ8WoNu8UUG02J+g9Wki1CTwfNTpdbSauVPxR0hXEBkm2GVdtZkqrNjMtVJvIwJIJDCxZAqrNLIKDzSbgKNtCtYlMKpA4yhFQbeYQcJRLwFFulv33MVltzXRADIXypAXEvC0IiOFgKw5wyOAa9FljhLyPmQfUOR84CTbG8fcxDV/yCYGggMDDAgsdD2T7GpmcjBXyPiaShy2APBxL7pyEg62/eNiCwMOWBB62zOJ/2UMGEEetwJO90q88WntXHm1Yw4Wtsjb/MZQCDAPH9oomXVvH29MGAG0JercjOJt2xOueNiQ7tCfYob2F5Kc1sCvXBujAOwi47mHg6F7Hr3uMzh0Iet8n5LoHeD7qvvR1T+JKxR8lXUFskGSbcd2tjszuVltCYOlo4boHGVg6AgPLDo5f95jz3oHgYHck4GhHC9c9yKQCiaOdHL/uMTjaiYCjTgQcddoKw4Ws1/g6e4XwzlKCAmt/nQng24UAvl2I1aaxw84EO3Qh2KGLhWqzMzAp2BnozLs6zifjrBjV5v0Cqs2uBL0fEFJtAs9HPZCuNhNXKv4o6QpigyTbjKs2u0mrNrtZqDaRgaUbMLCEBVSbYYKDVQQcKQvVJjKpQOKoUEC1WUjAUREBR0VbYbiQ1dZMB8RQqFhaQCy2MFzYOosTXIM+62Ehw4XFQJ1LgMMoDzs+XGj4UkIIBKUEHpZa6Hgg29fI5GSSkOFCJA/LgDyc5PhwoeFhGYGHEQIPI8QObC3SvE+54x1D86mN5QS9gR8Ta/XznZHXPf79dq8hl8MdIskQ3bPwz901y+3ExOi9axb8jKif74y06W7giWjpxN1dInF3JxC3hwDi9hAyXW6i426EqLtHlgyHhcTSnmCHZVatf9E9HGypwZmh0ELg18mZr2N6O9NthyrJjiHsPq19IP1ejFd2/nIoBKcaK+n2yuJ9IH1s72gn2xNc2iROsv1XiZLhs8HeHub2YYDaHOBeQjIFs8+eBBD3crwvYQDQi6D3voS+1L7EvtQ+JDvsR7DDfkQ7xJwY2g6PCPiyzbcJej8qpK+/PzC7B561etSN+8mk+9wbOPC0D7BqO8Dx+GN87v4EvzvN8Ulao/cBBL0fEzJJCzwfhdT5f2WSdu8sDg5StUGSbcZV1gcyB4d6ERKxA7dgcCgooZGB5UBgYDnI8Ulac94HERzswQQcHWxhkhaZVCBxdIjjk7QGR4cQcHQoAUeHZv3ze5tSul1S3is9zGtsHS4laLH2dxiBHEcQyHEEsWti7HA4wQ5HEuxwpIUpSyDp4roJQe05U0g35ihgNwbYQVEzhXRjDgMmzYcDk52jBfjzowh+bJaAbszRBL1nC+nGAM9HzU53YxJXKv4o6QpigyTbjOvGHCOtG3OMhW4MMrAcAwwsxwroxhxLcLDHEXB0nIVuDDKpQOLoeAHdmOMJODqBgKMTtsJ7zay2fzoghkInSguIJ25BQAwHW3GAQwbXoM+aI+S95hOBOp8E7BrMcfy9ZsOXkwiB4GQCD0+20HFDXu8gk5OnhHTckDzsDeThU+TOSTjY+ouHvQk8PIXAw1Oy+F+ashcQR33Ab9wkXgnGFhoTwO513JXbqd6VW5Q1rN4na/MfQynAMHBsr2jSVTjenjYAqCDoXUlwNpXE68YoyQ59CXboayH5ORXYlYsCHXiV43w6ioSjZxy/7jE6VxH0nifkugd4Pmpe+roncaXij5KuIDZIss247lY1s7tVQQgs1Raue5CBpRoYWE5z/LrHnPdpBAd7OgFHp1u47kEmFUgcneH4dY/B0RkEHJ1JwNGZWfa/NAX41l5cpX2WVwifLSUosPZ3FgF85xDAdw6x2jR2OJtgh34EO/SzUG2eBUwKzgY683Md59P+pGrzeQHV5rkEvecLqTaB56Pmp6vNxJWKP0q6gtjg31d8tXmetGrzPAvVJjKwnAcMLOcLqDbPJzjYCwg4usBCtYlMKpA46i+g2uxPwNGFBBxduBWGC1ltzXRADIUGSAuIAywMF56axQmuQZ+1QMhw4QCgzgOBwygLHB8uNHwZSAgEFxF4eJGFjgeyfY1MTl4SMlyI5OHFQB6+5PhwoeHhxQQeDiLwcBCxA9uT1Dkb7HjH0Hyy8GCC3nuAz7+uz2fcpMGwSf873Pv3Zu9fsy7JqhkfQfXJMQ8h2OkVx/2D0fkSgt6vCumsAs9H2dI56NnkAp91qd8PqNJocVE4Gi2JlEZKohVR/UxVWFwcLS8rihZVVBaVRCIl5X2jkdKySHFFVYkKlxcXlUaqItUVpdVlhVa/POlSsP+KrctqqOlwZCUZ4rIswqcBAxM2lt6XZ8HPKEgxmnTPt2bgbNo4E/esK4BksukEriA5gSHSnIAxxBCCExjquBMweg8lOwF09EY61iuzsLhk6YzE0VVAnWv6EqbYQmO1cSYHn+h9+oNUOOCqwaygZ8d/IdHVWYTX4Qy5riI4l1i75Gqfw2btHV0WXgPOFGxNiSJBneHb57UePq5jANAY+2pSdEPv1ezzGgLgrne8P2cAcD1B7xsI/dkbiP3Z60h2uJFghxst3BddCxxkug6YPQ1znE/GUTNw9IbjE7JG52EEvRcJ6eMCz0chdf5fmZC9NouDg1RtkGSbcVn9TcyBoOsJgeWmLRgICkpoZGC5CRhYhjs+IWvOezjBwd5MwNHNFiZkkUkFEke3OD4ha3B0CwFHtxJwdGuW/fcxkW2uDN8+R3iF8EgpQYG1vxEE8N1GAN9txGrT2GEkwQ6jCHYYZaHaHAFMCkYCnfntjvPJOCtGtfm2gGrzdoLei4VUm8DzUYvT1WbiSsUfJV1BbJBkm3HV5h3Sqs07LFSbyMByBzCw3Cmg2ryT4GBHE3A02kK1iUwqkDi6S0C1eRcBR3cTcHR3lv33MVltzXRADIXGSAuIY7YgIIaDrTjAIYNr0Ge9J+R9zDFAne8BToK95/j7mIYv9xACwVgCD8da6Hgg29fI5OQDIe9jInk4DsjDD8idk3Cw9RcPxxF4eC+Bh/dm8b/s4Wogju4DT/ZKv/IY7115TGANF96XtfmPoRRgGDi2VzTp7ne8PW0AcD9B7wcIzuYB4nXPBJIdHiTY4UELyc94YFduAtCBPyTguoeBo48cv+4xOj9E0HuJkOse4PmoJenrnsSVij9KuoLYIMk247pbDzO7W/cTAsvDFq57kIHlYWBgmej4dY8574kEBzuJgKNJFq57kEkFEkeTHb/uMTiaTMDRIwQcPbIVhgtZr/E96hXCU6QEBdb+HiWAbyoBfFOJ1aaxwxSCHaYR7DDNQrX5KDApmAJ05o85zifjrBjV5qcCqs3HCHovFVJtAs9HLU1Xm4krFX+UdAWxQZJtxlWb06VVm9MtVJvIwDIdGFhmCKg2ZxAc7EwCjmZaqDaRSQUSR48LqDYfJ+BoFgFHs7bCcCGrrZkOiKHQbGkBcbaF4cLxWZzgGvRZy4QMF84G6vwEcBhlmePDhYYvTxACwZMEHj5poeOBbF8jk5MvhQwXInk4B8jDLx0fLjQ8nEPg4VwCD+cSO7DXkOZ9nnK8Y2g+tfEpgt7Aj4m1+vnOyOse/36friGXg22aZYins/DPfSbL7cTE6P1MFvyMqJ/vjLTpPPBEtHTiPiuRuM8SiPucAOI+J2S63ETHeYSo+3yWDIeFxNJ8sMMyq9a/6B4OttTvmaHQ/sA9m69jOirLbYcqyY4h7D6tfSD9C4xXdoxDmU8wSqykeyGL94H0sb2jneyL4NImcZLtv0qUDJ8NFnjPX8gAtTnAF4RkCmafLxJA/JLjfQkDgJcIer9M6Eu9TOxLLSTZ4RWCHV4h2iHmxNB2+ErAl20eRdB7hZC+/qvAwAU8a7XCjfvJpPtcABx4Wgis2l5zPP4Yn/sqgXcrHZ+kNXq/RtD7WyGTtMDzUUid/1cmaRdkcXCQqg2SbDOusn6dOTj0EiERez2LP0mLDCyvAwPLG45P0przfoPgYBcRcLTIwiQtMqlA4uhNxydpDY7eJODoLQKO3sr65/c2pXS7pLxX+rbX2FosJWix9vc2gRzvEMjxDrFrYuywmGCHdwl2eNfClCWQdHHdhKD2XCWkG/Me0LECOyhqlZBuzNvApHkxMNl5X4A/f4/gx34Q0I15n6D3GiHdGOD5qDXpbkziSsUfJV1BbJBkm3HdmA+kdWM+sNCNQQaWD4CB5UMB3ZgPCQ72IwKOPrLQjUEmFUgcLRHQjVlCwNHHBBx9nGX/vWZW2z8dEEOhT6QFxE+2ICCGg604wCGDa9Bn/SzkveZPgDp/Cuwa/Oz4e82GL58SAsFSAg+XWui4Ia93kMnJWiEdNyQPPwPycC25cxIOtv7i4WcEHn5O4OHnWfwvTXkBiKNl4DduEq8EYwuNCWD3Ou7K7Qvvyu1L1rD6sqzNfwylAMPAsb2iSbfc8fa0AcByxnAywdl8Rbxu/JJkhxUEO6ywkPx8AezKfQl04F87zqf3SDha7/h1j9H5a4LeG4Rc9wDPR21IX/ckrlT8UdIVxAZJthnX3fqG2d1aTggs31i47kEGlm+AgWWl49c95rxXMt5uIODoWwvXPcikAomj7xy/7jE4+o6Ao+8JOPo+y/6XpgDf2ourtFd5hfBqKUGBtb9VjGEoAvh+IFabxg6rGcNRBDussVBtrgImBauBzvxHx/n0Kqna/E1AtfkjQe/fhVSbwPNRv6erzcSVij9KuoLYIMk246rNn6RVmz9ZqDaRgeUn5CyFgGrzZ4KD/YWAo18sVJvIpAKJo7UCqs21BBytI+Bo3VYYLmS1NdMBMRRaLy0grrcwXPhFFie4Bn3Wn0KGC9cDdd4AHEb50/HhQsOXDYRA8CuBh79a6Hgg29fI5GQbZYeHge/DgTpvBPIQbT8GDzcyOkYEHv5G7MC+SOqc/e54x9B8svDvBL2fB59/XZ/PuEWDYZP+91bv3xHev2b9kVUzPoLqk6ufcSXBTrUc9w9G5z8Iem9LiisZYP2B56Ns6Rz0bPKAz9rk9wOqNFpcFI5GSyKlkZJoRVQ/UxUWF0fLy4qiRRWVRSWRSEl532iktCxSXFFVosLlxUWlkapIdUVpdVmh1S9P2gT2X7H1Zw01HWzTLEP8mUX4NOBstwsUo7fZI/iMqJ/JclsGzqaNM4FFRDb2SsmWE0DuO+6D4rKFOQFjCP+mUc+t5bgTMHrXIjsBdPRGOtZts7G4ZOmMxFFtoM41fQlTbKGx6nfY4YCLuU9/kAoHXDWYFfTs+C8kqpNNeB3OkKs2wbnE2iV1fA6btXd0WbgdOFOwNSWKBHWGb591PXzUYwDQGLsOKbqh92r2uR0BcPWz3dbbAKA+Qe8G2XiHY545JMQhWD2SHRoS7NAwm39fVHfL9530DrMeMHva3nE+GUfNwNF25D4uws9tT9C7rpA+LvB8FFLn/5UJ2brZHBykaoMk24zL6htlEweC6hMCS6Ns/oQsMrA0AgaWxtkwIlACiznvxgQH24SAoybZ/AlZZFKBxFHTFOy5NSZkDY6aEnDUjICjZtn238dEtrkyfPts7hXCmVKCAmt/zQngyyKAL4tYbRo7ZBLskE2wQ7aFarM5MCnIBDrzHMf5ZJwVpXsjoNrMYXRrhFSbwPNRDdPVZuJKxR8lXUFskGSbcdVmrrRqM9dCtYkMLLnAwJInoNrMIzjYfAKO8i1Um8ikAomjAgHVZgEBRy0IOGqRbf99TFZbMx0QQ6GW0gJiyy0IiOFgKw5wyOAauP1q6T2wJP/TpElAS6DOrYCTYH77uTjpaPjSihAIWhN42NpCxwPZvkYmJ02FvI+J5GEbIA+bOv6+leFhGwIP2xJ42Dab/2UPdYA4agee7JV+5dHeu/LowBoubJe9+Y+hFGAYOLZXNOk6Ot6eNgDoSNB7B4Kz2YF43dOBZIcdCXbY0ULy0x7YlesAdOA7CbjuYeCouePXPUbnnQh6Zwq57gGej8pMX/ckrlT8UdIVxAZJthnX3erE7G51JASWThaue5CBpRMwsHR2/LrHnHdngoPdmYCjnS1c9yCTCiSOdnH8usfgaBcCjroQcNRlKwwXsl7j6+oVwt2kBAXW/roSwBcmgC9MrDaNHboR7KAIdlAWqs2uwKSgG9CZFzrOJ+OsGNVmjoBqs5Cgd66QahN4Pio3XW0mrlT8UdIVxAZJthlXbRZJqzaLLFSbyMBSBAwsxQKqzWKCgy0h4KjEQrWJTCqQOCoVUG2WEnBURsBR2VYYLmS1NdMBMRSKSAuIEQvDhe2zOcE18JS0kOHCCFDncuAwSoHjw4WGL+WEQNCdwMPuFjoeyPY1MjlpKWS4EMnDXYE8bOn4cKHh4a4EHu5G4OFuxA7sdqR5n90d7xiaT23cnaA38GNirX6+M/K6x7/fHjXkcrBNswzRIxv/3D2y3U5MjN57ZMPPiPr5zkib7gmeiJZO3L0kEncvAnF7CiBuTyHT5X9FR0LU3TtbhsNCYmkfsMMyq9a/6B4OttTlWaHQq8CvkzNfx/ReltsOVZIdQ9h9WvtA+l6MV3aMQ9mH4FRjJV2vbN4H0sf2jnay+4JLm8RJtv8qUTJ8NtjPw9z+DFCbA+wlJFMw+9yXAOIDHO9LGAAcQND7QEJf6kBiX2p/kh0OItjhIKIdYk4M/mEEAr5s8z2C3m2E9PUPBmb3wLNWbdy4n0y6z/2AA0/7A6u2QxyPP8bnHkzwu+0dn6Q1eh9C0LuDkEla4PmoDulJ2sSVij9KuoLYIMk24yrrQ5mDQwcQErFDt2BwKCihkYHlUGBgOczxSVpz3ocRHOzhBBwdbmGSFplUIHF0hOOTtAZHRxBwdCQBR0dm//N7m1K6XVLeKz3Ka2wdLSVosfZ3FIEcxxDIcQyxa2LscDTBDscS7HCshSlLIOniugmBPxVKSDfmOGA3BthBUTsK6cYcBUyajwYmO8cL8OfHEfxYJwHdmOMJencW0o0Bno/qnO7GJK5U/FHSFcQGSbYZ1405QVo35gQL3RhkYDkBGFhOFNCNOZHgYE8i4OgkC90YZFKBxNHJAroxJxNw1JuAo95b4b1mVts/HRBDoVOkBcRTtiAghoOtOMAhg2vgj8UT8l7zKUCd+wC7Bl0cf6/Z8KUPIRCcSuDhqRY6bsjrHWRy0k1Ixw3JwyiQh90cn5szPIwSeFhB4GFFNv9LU3oBcVQJfuMm8UowttCYAHav467c+npXblWsYfXK7M1/DKUAw8CxvaJJV+14e9oAoJqg92kEZ3Ma8bqximSH0wl2ON1C8tMX2JWrAjrwMxzn03EkHCnHr3uMzmcQ9C4Uct0DPB9VmL7uSVyp+KOkK4gNkmwzrrt1JrO7VU0ILGdauO5BBpYzgYHlLMeve8x5n0VwsGcTcHS2heseZFKBxNE5jl/3GBydQ8BRPwKO+mXb/9IU4Ft7cZX2uV4hfJ6UoMDa37kE8J1PAN/5xGrT2OE8gh0uINjhAgvV5rnApOA8oDPv7zifDiZVmyUCqs3+BL1LhVSbwPNRpelqM3Gl4o+SriA2SLLNuGrzQmnV5oUWqk1kYLkQGFgGCKg2BxAc7EACjgZaqDaRSQUSRxcJqDYvIuDoYgKOLt4Kw4WstmY6IIZCg6QFxEEWhgv7ZnOCa+AvEBEyXDgIqPNg4DBKuePDhYYvgwmB4BICDy+x0PFAtq+RycmuQoYLkTy8FMjDXR0fLjQ8vJTAw8sIPLyM2IHdl9Q5u9zxjqH5ZOHLCXrvDT7/uj6fMVKDYZP+9zbv31Hev2ZdkV0zPoLqk6efsS3BTrs77h+MzlcQ9O4hpLMKPB9lS+egZ5MPfNYQvx9QpdHionA0WhIpjZREK6L6maqwuDhaXlYULaqoLCqJRErK+0YjpWWR4oqqEhUuLy4qjVRFqitKq8sKrX550hCw/4qtoTXUdLBNswwxNJvwacDAhI2l95XZ8DOifibLHRk4mzbOxD3rKiCZbDqBq0hO4GppTsAY4mqCE7jGcSdg9L6G7ATQ0RvpWK/NxuKSpTMSR9cBda7pS5hiC41Vv8MOB1zMffqDVDjgqsGsoGfHfyHR9dmE1+EMua4jOJdYu+R6n8Nm7R1dFt4AzhRsTYkiQZ3h2+eNHj6GMQBojH09Kbqh92r2eQMBcDc53p8zALiJoPdwQn92OLE/O4xkh5sJdrjZwn3RjcBBpmHA7OkWx/lkHDUDR3s5PiFrdL6FoHdPIX1c4PmonukJ2cSVij9KuoLYIMk247L6W5kDQTcRAsutWzAQFJTQyMByKzCwjHB8Qtac9wiCgx1JwNFICxOyyKQCiaPbHJ+QNTi6jYCjUQQcjcq2/z4mss2V4dvn7V4hfIeUoMDa3+0E8N1JAN+dxGrT2OEOgh1GE+ww2kK1eTswKbgD6MzvcpxPxlkxqs1eAqrNuwh67yuk2gSej9o3XW0mrlT8UdIVxAZJthlXbd4trdq820K1iQwsdwMDyxgB1eYYgoO9h4CjeyxUm8ikAomjsQKqzbEEHI0j4Ghctv33MVltzXRADIXulRYQ792CgBgOtuIAhwyugb++Tcj7mPcCdb4POAl2gOPvYxq+3EcIBOMJPBxvoeOBbF8jk5ODhLyPieThBCAPD3L8fSvDwwkEHt5P4OH92fwve7geiKMHwJO90q88HvSuPB5iDRc+kL35j6EUYBg4tlc06R52vD1tAPAwQe+JBGczkXjd8xDJDpMIdphkIfl5ENiVewjowCcLuO5h4OgQx697jM6TCXofKuS6B3g+6tD0dU/iSsUfJV1BbJBkm3HdrUeY3a2HCYHlEQvXPcjA8ggwsDzq+HWPOe9HCQ52CgFHUyxc9yCTCiSOpjp+3WNwNJWAo2kEHE3bCsOFrNf4HvMK4elSggJrf48RwDeDAL4ZxGrT2GE6wQ4zCXaYaaHafAyYFEwHOvPHHeeTcVaMavMIAdXm4wS9jxRSbQLPRx2ZrjYTVyr+KOkKYoMk24yrNmdJqzZnWag2kYFlFjCwzBZQbc4mONgnCDh6wkK1iUwqkDh6UkC1+SQBR3MIOJqzFYYLWW3NdEAMheZKC4hzLQwXPpjNCa5Bn3WMkOHCuUCdnwIOoxzj+HCh4ctThEDwNIGHT1voeCDb18jk5Dghw4VIHj4D5OFxjg8XGh4+Q+DhPAIP5xE7sDeQ5n2edbxjaD618VmC3sCPibX6+c7I6x7/fp+rIZeDbZpliOey8c99PtvtxMTo/Xw2/Iyon++MtOl88ES0dOK+IJG4LxCI+6IA4r4oZLrcRMf5hKi7IFuGw0JiaSHYYZlV6190DwdbKqT3ezBwz+brmI7LdtuhSrJjCLtPax9I/xLjlR3jUBYSjBIr6V7K5n0gfWzvaCf7Mri0SZxk+68SJcNng1e857/KALU5wJeEZApmny8TQPya430JA4DXCHq/TuhLvU7sS71KssMbBDu8QbRDzImh7XCCgC/bPI6g94lC+vqLgIELeNbqRDfuJ5Pu8xXgwNOrwKrtTcfjj/G5iwi86+34JK3R+02C3qcImaQFno86JT1Jm7hS8UdJVxAbJNlmXGX9FnNw6DVCIvZWNn+SFhlY3gIGlrcdn6Q15/02wcEuJuBosYVJWmRSgcTRO45P0hocvUPA0bsEHL2b/c/vbUrpdkl5r/Q9r7H1vpSgxdrfewRyfEAgxwfEromxw/sEO3xIsMOHFqYsgaSL6yYEtWdUSDfmI6BjBXZQVFRIN+Y9YNL8PjDZWSLAn39E8GOVAroxSwh69xXSjQGej+qb7sYkrlT8UdIVxAZJthnXjflYWjfmYwvdGGRg+RgYWD4R0I35hOBgPyXg6FML3RhkUoHE0VIB3ZilBBx9RsDRZ9n232tmtf3TATEU+lxaQPx8CwJiONiKAxwyuAZ91mlC3mv+HKjzMmDX4DTH32s2fFlGCARfEHj4hYWOG/J6B5mcnCGk44bk4ZdAHp7h+Nyc4eGXBB4uJ/BweTb/S1NeAuLoKyCObH6UK7B7HXfltsK7cvuaNaz+VfbmP4ZSgGHg2F7RpPvG8fa0AcA3BL1XEpzNSuJ149ckO3xLsMO3FpKfFcCu3NdAB/6d43z6iISjsxy/7jE6f0fQ+2wh1z3A81Fnp697Elcq/ijpCmKDJNuM6259z+xufUMILN9buO5BBpbvgYFllePXPea8VxEc7GoCjlZbuO5BJhVIHP3g+HWPwdEPBBytIeBoTbb9L00BvrUXV2n/6BXCP0kJCqz9/UgA388E8P1MrDaNHX4i2OEXgh1+sVBt/ghMCn4COvO1jvNpEanaPFdAtbmWoPd5QqpN4Pmo89LVZuJKxR8lXUFskGSbcdXmOmnV5joL1SYysKwDBpb1AqrN9QQHu4GAow0Wqk1kUoHE0a8Cqs1fCTjaSMDRxq0wXMhqa6YDYij0m7SA+JuF4cIV2ZzgGvRZ/YUMF/4G1Pl34DBKf8eHCw1fficEgj8IPPzDQscD2b5GJicDhAwXInm4CcjDAY4PFxoebiLw8E8CD/8kdmBfJnXOQjlun7/5ZGGzR7TeC8DnXze02WfcrsGwSf97h/fvnd6/f9knp2Z8BNUnXz/jWgI+LnLcP/ylMwEfFwvprALPR9nSOejZFACfleH3f6o0WlwUjkZLIqWRkmhFVD9TFRYXR8vLiqJFFZVFJZFISXnfaKS0LFJcUVWiwuXFRaWRqkh1RWl1WaHVL0/KyMH6r9iqlVPD/lGbZhmiVg7h04Bz3C5QjN7b5sDPiPqZLHdl4GzaOBP3rNpAMtl0ArVJTqCONCdgDFGH4AS2c9wJGL23IzsBdPRGOta6OVhcsnRG4qgeUOeavoQpttBY9TvscMDF3Kc/SIUDrhrMCnp2/BcS1c8hvA5nyFWP4Fxi7ZL6PofN2ju6LGwAzhRsTYkiQZ3h22dDDx/bMwBojF2fFN3QezX7bEAAXCPH+3MGAI0IejfOwTsc88whIQ7BtifZoQnBDk1y+PdFDbd830nvMLcHZk9NHeeTcdQMHF3i+ISs0bkpQe9LhfRxgeejLk1PyCauVPxR0hXEBkm2GZfVN8shDgQ1IgSWZjn8CVlkYGkGDCzNc2BEoAQWc97NCQ42k4CjzBz+hCwyqUDiKCsFe26NCVmDoywCjrIJOMrOsf8+JrLNleHbZ45XCOdKCQqs/eUQwJdHAF8esdo0dsgl2CGfYId8C9VmDjApyAU68wLH+WScFaPavEJAtVlA0HuIkGoTeD5qSLraTFyp+KOkK4gNkmwzrtpsIa3abGGh2kQGlhbAwNJSQLXZkuBgWxFw1MpCtYlMKpA4ai2g2mxNwFEbAo7a5Nh/H5PV1kwHxFCorbSA2HYLAmI42IoDHDK4Bn3WVULex2wL1LkdcBLsKsffxzR8aUcIBO0JPGxvoeOBbF8jk5NrhLyPieRhByAPr3H8fSvDww4EHnYk8LBjDv/LHuoDcbQDeLJX+pXHjt6Vx06s4cIdcjb/MZQCDAPH9oomXSfH29MGAJ0IencmOJvOxOuenUh22Jlgh50tJD87ArtyOwEd+C4CrnsYOLrO8eseo/MuBL2vF3LdAzwfdX36uidxpeKPkq4gNkiyzbjuVhdmd6sTIbB0sXDdgwwsXYCBpavj1z3mvLsSHGw3Ao66WbjuQSYVSByFHb/uMTgKE3CkCDhSW2G4kPUaX6FXCBdJCQqs/RUSwFdMAF8xsdo0digi2KGEYIcSC9VmITApKAI681LH+WScFaPaHCag2iwl6H2TkGoTeD7qpnS1mbhS8UdJVxAbJNlmXLVZJq3aLLNQbSIDSxkwsEQEVJsRgoMtJ+Co3EK1iUwqkDjqLqDa7E7A0a4EHO26FYYLWW3NdEAMhXaTFhB3szBcuGMOJ7gGfdYtQoYLdwPqvDtwGOUWx4cLDV92JwSCHgQe9rDQ8UC2r5HJyQghw4VIHu4B5OEIx4cLDQ/3IPBwTwIP9yR2YBuQ5n32crxjaD61cS+C3sCPibX6+c7I6x7/fnvWkMvBNs0yRM8c/HP3znE7MTF6750DPyPq5zsjbboPeCJaOnF7SSRuLwJx9xVA3H2FTJeb6LgPIerulyPDYSGxtD/YYZlV6190Dwdb6srsUGgR8OvkzNcxfZTttkOVZMcQdp/WPpD+AMYrO8ah7E9wqrGS7oAc3gfSx/aOdrIHgkubxEm2/ypRMnw2OMjD3MEMUJsDPEBIpmD2eSABxIc43pcwADiEoPehhL7UocS+1MEkOxxGsMNhRDvEnBjaDrcJ+LLNjwh6jxLS1z8cmN0Dz1qNcuN+Muk+DwIOPB0MrNqOcDz+GJ97OMHv3un4JK3R+wiC3qOFTNICz0eNTk/SJq5U/FHSFcQGSbYZV1kfyRwcOoSQiB25BYNDQQmNDCxHAgPLUY5P0przPorgYI8m4OhoC5O0yKQCiaNjHJ+kNTg6hoCjYwk4Ojbnn9/blNLtkvJe6XFeY+t4KUGLtb/jCOQ4gUCOE4hdE2OH4wl2OJFghxMtTFkCSRfXTQhqzzFCujEnAbsxwA6KGiOkG3McMGk+HpjsnCzAn59E8GNjBXRjTiboPU5INwZ4PmpcuhuTuFLxR0lXEBsk2WZcN6a3tG5MbwvdGGRg6Q0MLKcI6MacQnCwfQg46mOhG4NMKpA4OlVAN+ZUAo6iBBxFt8J7zay2fzoghkIV0gJixRYExHCwFQc4ZHAN+qzxQt5rrgDqXAnsGox3/L1mw5dKQiDoS+BhXwsdN+T1DjI5uV9Ixw3JwyogD+93fG7O8LCKwMNqAg+rc/hfmnIAEEengd+4SbwSjC00JoDd67grt9O9K7czWMPqp+Vs/mMoBRgGju0VTbozHW9PGwCcSdD7LIKzOYt43XgGyQ5nE+xwtoXk53RgV+4MoAM/x3E+nUTC0YOOX/cYnc8h6P2QkOse4Pmoh9LXPYkrFX+UdAWxQZJtxnW3+jG7W2cSAks/C9c9yMDSDxhYznX8usec97kEB3seAUfnWbjuQSYVSByd7/h1j8HR+QQcXUDA0QU59r80BfjWXlyl3d8rhC+UEhRY++tPAN8AAvgGEKtNY4cLCXYYSLDDQAvVZn9gUnAh0Jlf5DifDidVm5MEVJsXEfSeLKTaBJ6PmpyuNhNXKv4o6QpigyTbjKs2L5ZWbV5sodpEBpaLgYFlkIBqcxDBwQ4m4GiwhWoTmVQgcXSJgGrzEgKOLiXg6NKtMFzIamumA2IodJm0gHiZheHC03M4wTXos6YIGS68DKjz5cBhlCmODxcavlxOCARXEHh4hYWOB7J9jUxOpgkZLkTycAiQh9McHy40PBxC4OFQAg+HEjuwB5I6Z1c63jE0nyx8JUHv/cDnX9fnM0ZrMGzS/97l/Xu3969ZV+XUjI+g+hSYPRDsNN1x/2B0voqg9wwhnVXg+ShbOgc9mxbAZ13t9wOqNFpcFI5GSyKlkZJoRVQ/UxUWF0fLy4qiRRWVRSWRSEl532iktCxSXFFVosLlxUWlkapIdUVpdVmh1S9Puhrsv2LrmhpqOtimWYa4JofwacDAhI2l97U58DOifibLPRk4mzbOxD3rOiCZbDqB60hO4HppTsAY4nqCE7jBcSdg9L6B7ATQ0RvpWG/MweKSpTMSR8OAOtf0JUyxhcaq32GHAy7mPv1BKhxw1WBW0LPjv5DophzC63CGXMMIziXWLrnJ57BZe0eXhcPBmYKtKVEkqDN8+7zZw8ctDAAaY99Eim7ovZp9DicA7lbH+3MGALcS9B5B6M+OIPZnbyHZYSTBDiMt3BfdDBxkugWYPd3mOJ+Mo2bgaJbjE7JG59sIes8W0scFno+anZ6QTVyp+KOkK4gNkmwzLqsfxRwIupUQWEZtwUBQUEIjA8soYGC53fEJWXPetxMc7B0EHN1hYUIWmVQgcXSn4xOyBkd3EnA0moCj0Tn238dEtrkyfPu8yyuE75YSFFj7u4sAvjEE8I0hVpvGDncT7HAPwQ73WKg27wImBXcDnflYx/lknBWj2pwjoNocS9B7rpBqE3g+am662kxcqfijpCuIDZJsM67aHCet2hxnodpEBpZxwMByr4Bq816Cg72PgKP7LFSbyKQCiaPxAqrN8QQcTSDgaEKO/fcxWW3NdEAMhe6XFhDv34KAGA624gCHDK5Bn/WMkPcx7wfq/ABwEuwZx9/HNHx5gBAIHiTw8EELHQ9k+xqZnDwr5H1MJA8fAvLwWcfftzI8fIjAw4cJPHw4h/9lDzcBcTQRPNkr/cpjknflMZk1XDgxZ/MfQynAMHBsr2jSPeJ4e9oA4BGC3o8SnM2jxOueySQ7TCHYYYqF5GcSsCs3GejApwq47mHg6HnHr3uMzlMJes8Xct0DPB81P33dk7hS8UdJVxAbJNlmXHdrGrO79QghsEyzcN2DDCzTgIHlMceve8x5P0ZwsNMJOJpu4boHmVQgcTTD8eseg6MZBBzNJOBo5lYYLmS9xve4VwjPkhIUWPt7nPEKCgF8s4nVprHDLIIdniDY4QkL1ebjwKRgFtCZP+k4n4yzYlSbCwRUm08S9F4opNoEno9amK42E1cq/ijpCmKDJNuMqzbnSKs251ioNpGBZQ4wsMwVUG3OJTjYpwg4espCtYlMKpA4elpAtfk0AUfPEHD0zFYYLmS1NdMBMRSaJy0gzrMwXDgphxNcgz7rFSHDhfOQg1zAYZRXHB8uNHx5lhAIniPw8DkLHQ9k+xqZnLwmZLgQycPngTx8zfHhQsPD5xn39AQezid2YIeT5n1ecLxjaD618QWC3sCPibX6+c7I6x7/fl+sIZeDbZpliBdz8M9dkON2YmL0XpADPyPq5zsjbboQPBEtnbgvSSTuSwTiviyAuC8LmS430XEhIeq+kiPDYSGx9CrYYZlV6190Dwdbalu938OBezZfx3RSjtsOVZIdQ9h9WvtA+tcYr+wYh/IqwSixku61HN4H0sf2jnayr4NLm8RJtv8qUTJ8NnjDe/4iBqjNAb4mJFMw+3ydAOI3He9LGAC8SdD7LUJf6i1iX2oRyQ5vE+zwNtEOMSeGtsMbAr5s8ySC3ouE9PUXAwMX8KzVIjfuJ5Pu8w3gwNMiYNX2juPxx/jcxQy/6/gkrdH7HYLei4VM0gLPRy1OT9ImrlT8UdIVxAZJthlXWb/LHBx6k5CIvZvDn6RFBpZ3gYHlPccnac15v0dwsO8TcPS+hUlaZFKBxNEHjk/SGhx9QMDRhwQcfZjzz+9tSul2SXmv9COvsbVEStBi7e8jAjk+JpDjY2LXxNhhCcEOnxDs8ImFKUsg6eK6CYGTFiHdmE+BjhXYQVHvCenGfARMmpcAk52lAvz5pwQ/9oGAbsxSRpInpBsDPB/1Ybobk7hS8UdJVxAbJNlmXDfmM2ndmM8sdGOQgeUzYGD5XEA35nOCg11GwNEyC90YZFKBxNEXAroxXxBw9CUBR1/m2H+vmdX2TwfEUGi5tIC4fAsCYjjYigMcMrgG7iAJea95OVDnr4Bdg48df6/Z8OUrQiBYQeDhCgsdN+T1DjI5+VRIxw3Jw6+BPPzU8bk5w8OvCTz8hsDDb3L4X5ryGhBHK4E4svlRrsDuddyV27feldt3rGH1lTmb/xhKAYaBY3tFk+57x9vTBgDfE/ReRXA2q4jXjd+R7LCaYIfVFpKfb4Fdue+ADvwHx/n0KQlHnzl+3WN0/oGg9+dCrnuA56M+T1/3JK5U/FHSFcQGSbYZ191aw+xufU8ILGssXPcgA8saYGD50fHrHnPePxIc7E8EHP1k4boHmVQgcfSz49c9Bkc/E3D0CwFHv+TY/9IU4Ft7cZX2Wq8QXiclKLD2t5YAvvUE8K0nVpvGDusIdthAsMMGC9XmWmBSsA7ozH91nE+LSdXmlwKqzV8Jei8XUm0Cz0ctT1ebiSsVf5R0BbFBkm3GVZsbpVWbGy1Um8jAshEYWH4TUG3+RnCwvxNw9LuFahOZVCBx9IeAavMPAo42EXC0aSsMF7LamumAGAr9KS0g/mlhuPDbHE5wDTzgI2S48E+gzqFc3Ll+7fhwoeGL0RcdCLbJxfPQPHNIiMtDZPsamZysFDJciORhBpCHKx0fLjQ8zCDwsBaBh7VyeR3Y10mds21z3T5/88nC2xLO/xVwPlQ3tNlnjNFg2KT/vcf7d6z3r1m1c2vGR1B9Wuhn3EjAx3eO+wejc20CPr4X0lkFno+ypXPQs2kJfFYdv/9TpdHionA0WhIpjZREK6L6maqwuDhaXlYULaqoLCqJRErK+0YjpWWR4oqqEhUuLy4qjVRFqitKq8sKrX55Uh1w/Iqt7XJr2D9q0yxDbJdL+DTgXLcLFKN33Vz4GVE/k+XeDJxNG2finlUPSCabTqAeyQnUl+YEjCHqE5xAA8edgNG7AdkJoKM30rE2zMXikqUzEkfbA3Wu6UuYYguNVb/DDgdczH36g1Q44KrBrKBnx38hUaNcwutwhlzbE5xLrF3SyOewWXtHl4WNwZmCrSlRJKgzfPts4uGjKQOAxtiNSNENvVezz8YEwDVzvD9nANCMoHdzQn+2ObE/25Rkh0yCHTIt3Bc12fJ9J73DbArMnrIc55Nx1Awc/eD4hKzROYug9xohfVzg+ag16QnZxJWKP0q6gtggyTbjsvrsXOJAUDNCYMnO5U/IIgNLNjCw5OTCiEAJLOa8cwgONpeAo9xc/oQsMqlA4igvBXtujQlZg6M8Ao7yCTjKz7X/PiayzZXh22eBVwi3kBIUWPsrIICvJQF8LYnVprFDC4IdWhHs0MpCtVkATApaAJ15a8f5ZJwVo9r8WUC12Zqg9y9Cqk3g+ahf0tVm4krFHyVdQWyQZJtx1WYbadVmGwvVJjKwtAEGlrYCqs22BAfbjoCjdhaqTWRSgcRRewHVZnsCjjoQcNQh1/77mKy2ZjoghkIdpQXEjlsQEMPBVhzgkME18CcqCXkfsyNQ5x2Ak2DrHX8f0/BlB0Ig2JHAwx0tdDyQ7WtkcvKrkPcxkTzcCcjDXx1/38rwcCcCDzsReNgpl/9lD42AOOoMnuyVfuWxs3flsQtruLBz7uY/hlKAYmBvr2jSdXG8PW0A0IWgd1eCs+lKvO7ZhWSHbgQ7dLOQ/OwM7MrtAnTgYQHXPQwc/eb4dY/ROUzQ+3ch1z3A81G/p697Elcq/ijpCmKDJNuM624pZnerCyGwKAvXPcjAooCBpdDx6x5z3oUEB1tEwFGRheseZFKBxFGx49c9BkfFBByVEHBUshWGC1mv8ZV6hXCZlKDA2l8pAXwRAvgixGrT2KGMYIdygh3KLVSbpcCkoAzozLs7zifjrBjV5p8Cqs3uBL1DhTKqTeD5KKTO/yvVZmkuBwep2iDJNuOqzV2lVZu7Wqg2kYFlV2Bg2U1AtbkbwcHuTsDR7haqTWRSgcRRDwHVZg8CjvYg4GiPrTBcyGprpgOifqa0gLinheHCnXM5wTXwh4WTMm/0cOGeQJ33Ag6j+O3n4nCh4ctehEDQk8DDnhY6Hsj2NTI5qW2Jh0H3ieTh3kAeou3H4OHeBB7uQ+DhPsQObGPSvE8vxzuG5lMbexH0Bn5MrNXPd0Ze9/j3u28NuRyuZUcyxL65+Oful+t2YmL03i8XfkbUz3dG2nR/8ES0dOIeIJG4BxCIe6AA4h4oZLrcRMf9CVH3oFwZDguJpYPBDsusWv+iezjYUtfmhEKLcV+F9dfXMX2a47ZDlWTHEHaf1j6Q/hDGKzvGoRxMcKqxku6QXN4H0sf2jnayh4JLm8RJtv8qUTJ8NjjMw9zhDFCbAzxESKZg9nkoAcRHON6XMAA4gqD3kYS+1JHEvtThJDscRbDDUUQ7xJwY2g7bOd6f/afsLvBXQgnp6x8NzO6BZ63qunE/mXSfhwEHng4HVm3HOB5/jM89muB3G5D9DSIvOIZxHyBkkhZ4PqphepI2caXij5KuIDZIss24yvpY5uDQEYRE7NgtGBwKSmhkYDkWGFiOc3yS1pz3cQQHezwBR8dbmKRFJhVIHJ3g+CStwdEJBBydSMDRibn//N6mlG6XlPdKT/IaWydLCVqs/Z1EIEdvAjl6E7smxg4nE+xwCsEOp1iYsgSSLq6bEPg7boV0Y/oAuzHADopqLKQbcxIwaT4ZmOycKsCf9yH4saYCujGnEvRuJqQbAzwf1SzdjUlcqfijpCuIDZJsM64bE5XWjYla6MYgA0sUGFgqBHRjKggOtpKAo0oL3RhkUoHEUV8B3Zi+BBxVEXBUtRXea2a1/dMBMRSqlhYQq7cgIIaDrTjAIYNr0GdlCXmvuRqo82nArkGW4+81G76cRggEpxN4eLqFjhvyegeZnOQI6bgheXgGkIc5js/NGR6eQeDhmQQenpnL/9KUQ4A4Ogv8xk3ilWBsoTEB7F7HXbmd7V25ncMaVj8rd/MfQynAMHBsr2jS9XO8PW0A0I+g97kEZ3Mu8brxHJIdziPY4TwLyc/ZwK7cOUAHfr7jfOpDwlGe49c9RufzCXrnC7nuAZ6Pyk9f9ySuVPxR0hXEBkm2GdfduoDZ3epHCCwXWLjuQQaWC4CBpb/j1z3mvPsTHOyFBBxdaOG6B5lUIHE0wPHrHoOjAQQcDSTgaGCu/S9NAb61F1dpX+QVwhdLCQqs/V1EAN8gAvgGEatNY4eLCXYYTLDDYAvV5kXApOBioDO/xHE+HU2qNlsKqDYvIejdSki1CTwf1SpdbSauVPxR0hXEBkm2GVdtXiqt2rzUQrWJDCyXAgPLZQKqzcsIDvZyAo4ut1BtIpMKJI6uEFBtXkHA0RACjoZsheFCVlszHRBDoaHSAuJQC8OFZ+dygmvQZ7UVMlw4FKjzlcBhlLaODxcavlxJCARXEXh4lYWOB7J9jUxO2gsZLkTy8GogD9s7PlxoeHg1gYfXEHh4DbEDeyipc3at4x1D88nC1xL0Pgh8/nV9PmOcBsMm/e+93r/3ef+adV1uzfgI3AHVz2hIsFNHx/2D0fk6gt47COmsAs9H2dI5cNcb+Kzr/X5AlUaLi8LRaEmkNFISrYjqZ6rC4uJoeVlRtKiisqgkEikp7xuNlJZFiiuqSlS4vLioNFIVqa4orS4rtPrlSdeD/Vds3VBDTQfbNMsQN+QSPg0YmLCx9L4xF35G1M9kmZCBs2njTNyzhgHJZNMJDCM5gZukOQFjiJsITmC4407A6D2c7ATQ0RvpWG/OxeKSpTMSR7cAda7pS5hiC41Vv8MOB1zMffqDVDjgqsGsoGfHfyHRrbmE1+EMuW4hOJdYu+RWn8Nm7R1dFo4AZwq2pkSRoM7w7XOkh4/bGAA0xr6VFN3QezX7HEEA3CjH+3MGAKMIet9O6M/eTuzP3kaywx0EO9xh4b5oJHCQ6TZg9nSn43wyjpqBo06OT8gane8k6N1ZSB8XeD6qc3pCNnGl4o+SriA2SLLNuKx+NHMgaBQhsIzegoGgoIRGBpbRwMByl+MTsua87yI42LsJOLrbwoQsMqlA4miM4xOyBkdjCDi6h4Cje3Ltv4+JbHNl+PY51iuEx0kJCqz9jSWA714C+O4lVpvGDuMIdriPYIf7LFSbY4FJwTigMx/vOJ+Ms2JUm10EVJvjCXp3FVJtAs9HdU1Xm4krFX+UdAWxQZJtxlWbE6RVmxMsVJvIwDIBGFjuF1Bt3k9wsA8QcPSAhWoTmVQgcfSggGrzQQKOHiLg6KFc++9jstqa6YAYCj0sLSA+vAUBMRxsxQEOGVyDPksJeR/zYaDOE4GTYMrx9zENXyYSAsEkAg8nWeh4INvXyOSkSMj7mEgeTgbysMjx960MDycTePgIgYeP5PK/7OFWII4eBU/2Sr/ymOJdeUxlDRc+mrv5j6EUYBg4tlc06aY53p42AJhG0PsxgrN5jHjdM5Vkh+kEO0y3kPxMAXblpgId+AwB1z0MHJU4ft1jdJ5B0LtUyHUP8HxUafq6J3Gl4o+SriA2SLLNuO7WTGZ3axohsMy0cN2DDCwzgYHlcceve8x5P05wsLMIOJpl4boHmVQgcTTb8eseg6PZBBw9QcDRE1thuJD1Gt+TXiE8R0pQYO3vSQL45hLAN5dYbRo7zCHY4SmCHZ6yUG0+CUwK5gCd+dOO88k4K0a1WS6g2nyaoHd3IdUm8HxU93S1mbhS8UdJVxAbJNlmXLX5jLRq8xkL1SYysDwDDCzzBFSb8wgO9lkCjp61UG0ikwokjp4TUG0+R8DR8wQcPb8VhgtZbc10QAyF5ksLiPMtDBdOyeUE16DP2l3IcOF8oM4vAIdRdnd8uNDw5QVCIHiRwMMXLXQ8kO1rZHKyh5DhQiQPFwB5uIfjw4WGhwsIPFxI4OFCYgd2BGne5yXHO4bmUxtfIugN/JhYq5/vjLzu8e/35RpyOdimWYZ4ORf/3Fdy3U5MjN6v5MLPiPr5zkibvgqeiJZO3NckEvc1AnFfF0Dc14VMl5vo+Coh6r6RK8NhIbG0COywzKr1L7qHgy1VV+/3aOCezdcx9cl126FKsmMIu09rH0j/JuOVHeNQFhGMEivp3szlfSB9bO9oJ/sWuLRJnGT7rxIlw2eDt73nL2aA2hzgm0IyBbPPtwggfsfxvoQBwDsEvd8l9KXeJfalFpPs8B7BDu8R7RBzYmg77CXgyzb7EPTuKaSv/z4wcAHPWvV0434y6T7fBg48LQZWbR84Hn+Mz32fwLtejk/SGr0/IOi9r5BJWuD5qH3Tk7SJKxV/lHQFsUGSbcZV1h8yB4feISRiH+byJ2mRgeVDYGD5yPFJWnPeHxEc7BICjpZYmKRFJhVIHH3s+CStwdHHBBx9QsDRJ7n//N6mlG6XlPdKP/UaW0ulBC3W/j4lkOMzAjk+I3ZNjB2WEuzwOcEOn1uYsgSSLq6bENSeBwjpxiwDOlZgB0UdIKQb8ykwaV4KTHa+EODPlxH82EECujFfEPQ+WEg3Bng+6uB0NyZxpeKPkq4gNkiyzbhuzJfSujFfWujGIAPLl8DAslxAN2Y5wcF+RcDRVxa6McikAomjFQK6MSsIOPqagKOvc+2/18xq+6cDYij0jbSA+M0WBMRwsBUHOGRwDfqsw4S81/wNUOeVwK7BYY6/12z4spIQCL4l8PBbCx035PUOMjk5QkjHDcnD74A8PMLxuTnDw+8IPPyewMPvc/lfmvImEEergDiy+VGuwO513JXbau/K7QfWsPqq3M1/DKUAw8CxvaJJt8bx9rQBwBqC3j8SnM2PxOvGH0h2+Ilgh58sJD+rgV25H4AO/GfH+bSMhKOjHL/uMTr/TND7aCHXPcDzUUenr3sSVyr+KOkKYoMk24zrbv3C7G6tIQSWXyxc9yADyy/AwLLW8esec95rCQ52HQFH6yxc9yCTCiSO1jt+3WNwtJ6Aow0EHG3Itf+lKcC39uIq7V+9QnijlKDA2t+vBPD9RgDfb8Rq09hhI8EOvxPs8LuFavNXYFKwEejM/3CcT++Tqs3jBFSbfxD0Pl5ItQk8H3V8utpMXKn4o6QriA2SbDOu2twkrdrcZKHaRAaWTcDA8qeAavNPgoMN5eFxZJ45hIwjZFKBxNE2Kdhza1WbZo9oHGUQcJSRZ3+4kNXWTAdEfX55wgJi3IZjShABhwyuQZ91kpDhwlp5OJ23xTkxdZLjw4WGL9sSAkFtQiConcfveCDb18jkpLeQ4UIkD+sAedjb8eFCw8M6BB5uR+Dhdnm8DuxbpM5Z3Ty3z998snBdwvm/Ac6H6vp8xngNhk363wnev/d7/5pVL69mfATVp5V+xs0EfPRx3D8YnesR8HGqkM4q8HyULZ2Dnk1r4LPq+/2fKo0WF4Wj0ZJIaaQkWhHVz1SFxcXR8rKiaFFFZVFJJFJS3jcaKS2LFFdUlahweXFRaaQqUl1RWl1WaPXLk+qD41dsNaihpoNtmmWIBnmETwMGJmwsvRvmwc+I+pksD2bgbNo4E/es7YFksukEtic5gUbSnIAxRCOCE2jsuBMwejcmOwF09EY61iZ5WFyydEbiqClQ55q+hCm24FzKlHF14A9S4YCrBrOCnh3/hUTN8givwxlyNSU4l1i7pJnPYbP2ji4Lm4MzBVtTokhQZ/j2menhI4sBQGPsZqToht6r2WdzAuCyHe/PGQBkE/TOIfRnc4j92SySHXIJdsi1cF+UueX7TnqHmQXMnvIc55Nx1AwcVTo+IWt0ziPo3VdIHxd4PqpvekI2caXij5KuIDZIss24rD6fORCUTQgs+VswEBSU0MjAkg8MLAV5MCJQAos57wKCg21BwFELCxOyyKQCiaOWjk/IGhy1JOCoFQFHrfLsv4+JbHNl+PbZ2iuE20gJCqz9tSaAry0BfG2J1aaxQxuCHdoR7NDOQrXZGpgUtAE68/aO88k4K0a1eZqAarM9Qe/ThVSbwPNRp6erzcSVij9KuoLYIMk246rNDtKqzQ4Wqk1kYOkADCwdBVSbHQkOdgcCjnawUG0ikwokjnYUUG3uSMDRTgQc7bQV3sdktTXTATEU6iQtIHbagoAYDrbiAIcMrkGfdZaQ9zE7AXXuDJwEO8vx9zENXzoTAsHOBB7ubKHjgWxfI5OTc4S8j4nk4S5AHp7j+PtWhoe7EHjYhcDDLnn8L3toBsRRV/Bkr/Qrj27elUeYNVzYNW/zH0MpwDBwbK9o0inH29MGAIqgdyHB2RQSr3vCJDsUEexQZCH56QbsyoWBDrxYwHUPA0fnOn7dY3QuJuh9npDrHuD5qPPS1z2JKxV/lHQFsUGSbcZ1t0qY3S1FCCwlFq57kIGlBBhYSh2/7jHnXUpwsGUEHJVZuO5BJhVIHEUcv+4xOIoQcFROwFH5VhguZL3G190rhHeVEhRY++tOAN9uBPDtRqw2jR12Jdhhd4IddrdQbXYHJgW7Ap15D8f5ZJwVo9rsL6Da7EHQ+0Ih1SbwfNSF6WozcaXij5KuIDZIss24anMPadXmHhaqTWRg2QMYWPYUUG3uSXCwexFwtJeFahOZVCBx1FNAtdmTgKO9CTjaeysMF7LamumAGArtIy0g7mNhuLBbHie4Bn3WRUKGC/cB6twLOIxykePDhYYvvQiBYF8CD/e10PFAtq+RyckgIcOFSB7uB+ThIMeHCw0P9yPwcH8CD/cndmCbk+Z9DnC8Y2g+tfEAgt7Aj4m1+vnOyOse/34PrCGXg22aZYgD8/DPPSjP7cTE6H1QHvyMqJ/vjLTpweCJaOnEPUQicQ8hEPdQAcQ9VMh0uYmOBxOi7mF5MhwWEkuHgx2WWbX+RfdwsKVuzA2F3sd9FdZfX8e0LNdthyrJjiHsPq19IP0RjFd2jEM5nOBUYyXdEXm8D6SP7R3tZI8ElzaJk2z/VaJk+GxwlIe5oxmgNgd4hJBMwezzSAKIj3G8L2EAcAxB72MJfaljiX2po0l2OI5gh+OIdog5MbQdLhHwZZvLCHpfKqSvfzwwuweetbrUjfvJpPs8CjjwdDSwajvB8fhjfO7xBL97heOTtEbvEwh6DxEySQs8HzUkPUmbuFLxR0lXEBsk2WZcZX0ic3DoGEIiduIWDA4FJTQysJwIDCwnOT5Ja877JIKDPZmAo5MtTNIikwokjno7PklrcNSbgKNTCDg6Je+f39uU0u2S8l5pH6+xdaqUoMXaXx8COaIEckSJXRNjh1MJdqgg2KHCwpQlkHRx3YSg9rxKSDemEtiNAXZQ1FVCujF9gEnzqcBkp68Af15J8GPXCOjG9CXofa2QbgzwfNS16W5M4krFHyVdQWyQZJtx3Zgqad2YKgvdGGRgqQIGlmoB3ZhqgoM9jYCj0yx0Y5BJBRJHpwvoxpxOwNEZBBydsRXea2a1/dMBMRQ6U1pAPHMLAmI42IoDHDK4Bn3WDULeaz4TqPNZwK7BDY6/12z4chYhEJxN4OHZFjpuyOsdZHIyTEjHDcnDc4A8HOb43Jzh4TkEHvYj8LBfHv9LU44A4uhc8Bs3iVeCsYXGBLB7HXfldp535XY+a1j93LzNfwylAMPAsb2iSXeB4+1pA4ALCHr3Jzib/sTrxvNJdriQYIcLLSQ/5wG7cucDHfgAx/lUScLRcMeve4zOAwh63yzkugd4Purm9HVP4krFHyVdQWyQZJtx3a2BzO7WBYTAMtDCdQ8ysAwEBpaLHL/uMed9EcHBXkzA0cUWrnuQSQUSR4Mcv+4xOBpEwNFgAo4G59n/0hTgW3txlfYlXiF8qZSgwNrfJQTwXUYA32XEatPY4VKCHS4n2OFyC9XmJcCk4FKgM7/CcT4dT6o2RwioNq8g6D1SSLUJPB81Ml1tJq5U/FHSFcQGSbYZV20OkVZtDrFQbSIDyxBgYBkqoNocSnCwVxJwdKWFahOZVCBxdJWAavMqAo6uJuDo6q0wXMhqa6YDYih0jbSAeI2F4cLz8jjBNeizbhcyXHgNUOdrgcMotzs+XGj4ci0hEFxH4OF1FjoeyPY1Mjm5U8hwIZKH1wN5eKfjw4WGh9cTeHgDgYc3EDuwR5I6Zzc63jE0nyx8I0Hvw8DnX9fnMx7QYNik/33Q+/ch71+zhuXVjI+g+rTWz2hCsNNdjvsHo/Mwgt53C+msAs9H2dI56Nm0AT7rJr8fUKXR4qJwNFoSKY2URCui+pmqsLg4Wl5WFC2qqCwqiURKyvtGI6VlkeKKqhIVLi8uKo1URaorSqvLCq1+edJNYP8VW8NrqOlgm2YZYnge4dOAgQkbS++b8+BnRP1MlokZOJs2zsQ96xYgmWw6gVtITuBWaU7AGOJWghMY4bgTMHqPIDsBdPRGOtaReVhcsnRG4ug2oM41fQlTbKGx6nfY4YCLuU9/kAoHXDWYFfTs+C8kGpVHeB3OkOs2gnOJtUtG+Rw2a+/osvB2cKZga0oUCeoM3z7v8PBxJwOAxtijSNENvVezz9sJgBvteH/OAGA0o+9E6M/eRezP3kmyw90EO9xt4b7oDuAg053A7GmM43wyjpqBo7GOT8ganccQ9B4npI8LPB81Lj0hm7hS8UdJVxAbJNlmXFZ/D3MgaDQhsNyzBQNBQQmNDCz3AAPLWMcnZM15j2U4WAKOxlmYkEUmFUgc3ev4hKzB0b0EHN1HwNF9efbfx0S2uTJ8+xzvFcITpAQF1v7GE8B3PwF89xOrTWOHCQQ7PECwwwMWqs3xwKRgAtCZP+g4n4yzYlSb4wVUmw8S9J4gpNoEno+akK42E1cq/ijpCmKDJNuMqzYfklZtPmSh2kQGloeAgeVhAdXmwwQHO5GAo4kWqk1kUoHE0SQB1eYkAo4mE3A0Oc/++5istmY6IIZCj0gLiI9sQUAMB1txgEMG18CVlpD3MR8B6vwocBLsQcffxzR8eZQQCKYQeDjFQscD2b5GJicPC3kfE8nDqUAePuz4+1aGh1MJPJxG4OG0PP6XPYwC4ugx8GSv9CuP6d6VxwzWcOFjeZv/GEoBhoFje0WTbqbj7WkDgJkEvR8nOJvHidc9M0h2mEWwwywLyc90YFduBtCBzxZw3cPA0STHr3uMzrMZXSQh1z3A81GT09c9iSsVf5R0BbFBkm3GdbeeYHa3ZhICyxMWrnuQgeUJYGB50vHrHnPeTxIc7BwCjuZYuO5BJhVIHM11/LrH4GguAUdPEXD01FYYLmS9xve0Vwg/IyUosPb3NAF88wjgm0esNo0dniHY4VmCHZ61UG0+DUwKngE68+cc55NxVoxqc4qAavM5gt5ThVSbwPNRU9PVZuJKxR8lXUFskGSbcdXm89KqzectVJvIwPI8MLDMF1Btzic42BcIOHrBQrWJTCqQOHpRQLX5IgFHCwg4WrAVhgtZbc10QAyFFkoLiAstDBdOz+ME18BtYSHDhQuBOr8EHEaZ7vhwoeHLS4RA8DKBhy9b6Hgg29fI5GSmkOFCJA9fAfJwpuPDhYaHrxB4+CqBh68SO7C3k+Z9XnO8Y2g+tfE1gt7Aj4m1+vnOyOse/35fryGXg22aZYjX8/DPfSPP7cTE6P1GHvyMqJ/vjLTpIvBEtHTivimRuG8SiPuWAOK+JWS63ETHRYSo+3aeDIeFxNJisMMyq9a/6B4OtlRDvd/jgXs2X8dUmee2Q5VkxxB2n9Y+kP4dxis7xqEsJhglVtK9k8f7QPrY3tFO9l1waZM4yfZfJUqGzwbvec9/nwFqc4DvCMkUzD7fJYD4A8f7EgYAHxD0/pDQl/qQ2Jd6n2SHjwh2+Ihoh5gTg7+PJ+DLNisJes8W0tdfAgxcwLNWs924n0y6z/eAA0/vA6u2jx2PP8bnLiHwbo7jk7RG748Jes8VMkkLPB81Nz1Jm7hS8UdJVxAbJNlmXGX9CXNw6ANCIvZJHn+SFhlYPgEGlk8dn6Q15/0pwcEuJeBoqYVJWmRSgcTRZ45P0hocfUbA0ecEHH2e98/vbUrpdkl5r3SZ19j6QkrQYu1vGYEcXxLI8SWxa2Ls8AXBDssJdlhuYcoSSLq4bkLgiU0h3ZivgI4V2EFRzwjpxiwDJs1fAJOdFQL8+VcEP/asgG7MCoLezwnpxgDPRz2X7sYkrlT8UdIVxAZJthnXjflaWjfmawvdGGRg+RoYWL4R0I35huBgVxJwtNJCNwaZVCBx9K2Absy3BBx9R8DRd3n232tmtf3TATEU+l5aQPx+CwJiONiKAxwyuAb+wAsh7zV/D9R5FbBr8ILj7zUbvqwiBILVBB6uttBxQ17vIJOTBUI6bkge/gDk4QLH5+YMD38g8HANgYdr8vhfmvIOEEc/AnFk86Ncgd3ruCu3n7wrt59Zw+o/5m3+YygFGAaO7RVNul8cb08bAPxC0HstwdmsJV43/kyywzqCHdZZSH5+AnblfgY68PWO8+krEo5ecvy6x+i8nqD3y0Kue4Dno15OX/ckrlT8UdIVxAZJthnX3drA7G79QggsGyxc9yADywZgYPnV8esec96/EhzsRgKONlq47kEmFUgc/eb4dY/B0W8EHP1OwNHvefa/NAX41l5cpf2HVwhvkhIUWPv7gwC+Pwng+5NYbRo7bCLYIZSPt4N5ZswOsYWuNv8AJgWbgM58m3y3+bSEVG2+JqDaNGeDfu7rQqpN4Pmo19PVZuJKxR8lXUFs8O8rvtrMyBdWbcZt2FvoKgEZWDLycfuqlQ8jAi1Rq0VwsNsSEpRt8/nVJjKpQOKodgr23FrVZm0CjuoQcFQn3/5wIautmQ6IodB20gLidlsQEMPBVhzgkME16LPeFDJcuB3QedfFOTH1puPDhYYvdQmBoB4hENSz0PFAtq+RycnbQoYLkTysD+Th244PFxoe1ifwsAGBhw3yeR3Yd0mds4aOdwzNJws3JJz/2+B8qK7PZzyswbBJ/zvR+3eS969Z2+fXjI+g+rTRzxhJwMc7jvsHo/P2BHy8K6SzCjwfZUvnoGfTFvisRn7/p0qjxUXhaLQkUhopiVZE9TNVYXFxtLysKFpUUVlUEomUlPeNRkrLIsUVVSUqXF5cVBqpilRXlFaXFVr98qRG4PgVW41rqOlgm2YZonE+4dOAgQkbS+8m+fAzon4myyMZOJs2zsQ9qymQTDadQFOSE2gmzQkYQzQjOIHmjjsBo3dzshNAR2+kY83Mx+KSpTMSR1lAnWv6EqbYQmPV77DDARdzn/4gFQ64ajAr6NnxX0iUnU94Hc6QK4vgXGLtkmyfw2btHV0W5oAzBVtTokhQZ/j2mevhI48BQGPsbFJ0Q+/V7DOHALh8x/tzBgD5BL0LCP3ZAmJ/No9khxYEO7SwcF+Uu+X7TnqHmQfMnlo6zifjqBk4+sDxCVmjc0uC3h8K6eMCz0d9mJ6QTVyp+KOkK4gNkmwzLqtvxRwIyicEllYWJmSRgaUVMLC0dnxC1px3a4KDbUPAURsLE7LIpAKJo7aOT8gaHLUl4KgdAUft8u2/j4lsc2X49tneK4Q7SAkKrP21J4CvIwF8HYnVprFDB4IddiDYYQcL1WZ7YFLQAejMd3ScT8ZZMarNjwVUmzsS9P5ESLUJPB/1SbraTFyp+KOkK4gNkmwzrtrcSVq1uZOFahMZWHYCBpZOAqrNTgQH25mAo84Wqk1kUoHE0c4Cqs2dCTjahYCjXbbC+5istmY6IIZCXaQFxC5bEBDDwVYc4JDBNfB3CAt5H7MLUOeuwEmwzxx/H9PwpSshEHQj8LCbhY4Hsn2NTE6WCXkfE8nDMJCHyxx/38rwMEzgoSLwUOXzv+whG4ijQvBkr/QrjyLvyqOYNVxYmL/5j6EUYBg4tlc06Uocb08bAJQQ9C4lOJtS4nVPMckOZQQ7lFlIfoqAXblioAOPCLjuYeDoS8eve4zOEYLey4Vc9wDPRy1PX/ckrlT8UdIVxAZJthnX3SpndrdKCIGl3MJ1DzKwlAMDS3fHr3vMeXcnONhdCTja1cJ1DzKpQOJoN8evewyOdiPgaHcCjnbfCsOFrNf4eniF8B5SggJrfz0I4NuTAL49idWmscMeBDvsRbDDXhaqzR7ApGAPoDPv6TifjLNiVJtfC6g2exL0/kZItQk8H/VNutpMXKn4o6QriA2SbDOu2txbWrW5t4VqExlY9gYGln0EVJv7EBxsLwKOelmoNpFJBRJH+wqoNvcl4Gg/Ao722wrDhay2ZjoghkL7SwuI+1sYLizK5wTXoM/6Tshw4f5AnQ8ADqN85/hwoeHLAYRAcCCBhwda6Hgg29fI5GSVkOFCJA8PAvJwlePDhYaHBxF4eDCBhwcTO7A5pHmfQxzvGJpPbTyEoDfwY2Ktfr4z8rrHv99Da8jlYJtmGeLQfPxzD8t3OzExeh+WDz8j6uc7I216OHgiWjpxj5BI3CMIxD1SAHGPFDJdbqLj4YSoe1S+DIeFxNLRYIdlVq1/0T0cbKmb80KhJbivwvrr65i+ynPboUqyYwi7T2sfSH8M45Ud41COJjjVWEl3TD7vA+lje0c72WPBpU3iJNt/lSgZPhsc52HueAaozQEeIyRTMPs8lgDiExzvSxgAnEDQ+0RCX+pEYl/qeJIdTiLY4SSiHWJODG2HHwR82eZXBL3XCOnrnwzM7oFnrda4cT+ZdJ/HAQeejgdWbb0djz/G555M8Ls/Oz5Ja/TuTdD7FyGTtMDzUb+kJ2kTVyr+KOkKYoMk24yrrE9hDg6dQEjETtmCwaGghEYGllOAgaWP45O05rz7EBzsqQQcnWphkhaZVCBxFHV8ktbgKErAUQUBRxX5//zeppRul5T3Siu9xlZfKUGLtb9KAjmqCOSoInZNjB36EuxQTbBDtYUpSyDp4roJQe25Xkg35jRgNwbYQVHrhXRjKoFJc19gsnO6AH9+GsGP/SqgG3M6Qe+NQroxwPNRG9PdmMSVij9KuoLYIMk247oxZ0jrxpxhoRuDDCxnAAPLmQK6MWcSHOxZBBydZaEbg0wqkDg6W0A35mwCjs4h4OicrfBeM6vtnw6IoVA/aQGx3xYExHCwFQc4ZHAN+qw/hLzX3A+o87nArsEfjr/XbPhyLiEQnEfg4XkWOm7I6x1kcvKnkI4bkofnA3n4p+Nzc4aH5xN4eAGBhxfk87805RggjvqD37hJvBKMLTQmgN3ruCu3C70rtwGsYfX++Zv/GEoBhoFje0WTbqDj7WkDgIEEvS8iOJuLiNeNA0h2uJhgh4stJD8XArtyA4AOfJDjfDqNhKNtity+7jE6DyLonQHWO7bQ1z3A81FInf9XrnsuzOfgIFUbJNlmXHdrMLO7NZAQWAZbuO5BBpbBwMByiePXPea8LyE42EsJOLrUwnUPMqlA4ugyx697DI4uI+DocgKOLs+3/6UpwLf24irtK7xCeIiUoMDa3xUE8A0lgG8osdo0dhhCsMOVBDtcaaHavAKYFAwBOvOrHOfTyaRqs7aAavMqgt51hFSbwPNRddLVZuJKxR8lXUFskGSbcdXm1dKqzastVJvIwHI1MLBcI6DavIbgYK8l4OhaC9UmMqlA4ug6AdXmdQQcXU/A0fVbYbiQ1dZMB8RQ6AZpAfEGC8OFF+ZzgmvQZ9UjZd7o4cIbgDrfCBxG8dvPxeFCw5cbCYFgGIGHwyx0PJDta2Ry0sASD4PuE8nDm4A8bEDunISDrb94eBOBh8MJPBxO7MAeS+qc3ex4x9B8svDNBL2PAp9/XZ/PmKzBsEn/+4j376Pev2bdkl8zPoLq01Y/I5Ngp+0d9w9G51sIejcS0lkFno+ypXPQs2kHfNatfj+gSqPFReFotCRSGimJVkT1M1VhcXG0vKwoWlRRWVQSiZSU941GSssixRVVJSpcXlxUGqmKVFeUVpcVWv3ypFvB/iu2RtRQ08E2zTLEiHzCpwEDEzaW3iPz4WdE/UyWqRk4mzbOxD3rNiCZbDqB20hOYJQ0J2AMMYrgBG533AkYvW8nOwF09EY61jvysbhk6YzE0Z1AnWv6EqbYQmPV77DDARdzn/4gFQ64ajAr6NnxX0g0Op/wOpwh150E5xJrl4z2OWzW3tFl4V3gTMHWlCgS1Bm+fd7t4WMMA4DG2KNJ0Q29V7PPuwiAu8fx/pwBwD0EvccS+rNjif3ZMSQ7jCPYYZyF+6K7gYNMY4DZ072O88k4agaOmjo+IWt0vpegdzMhfVzg+ahm6QnZxJWKP0q6gtggyTbjsvr7mANB9xACy31bMBAUlNDIwHIfMLCMd3xC1pz3eIKDnUDA0QQLE7LIpAKJo/sdn5A1OLqfgKMHCDh6IN/++5jINleGb58PeoXwQ1KCAmt/DxLA9zABfA8Tq01jh4cIdphIsMNEC9Xmg8Ck4CGgM5/kOJ+Ms2JUm1kCqs1JBL2zhVSbwPNR2elqM3Gl4o+SriA2SLLNuGpzsrRqc7KFahMZWCYDA8sjAqrNRwgO9lECjh61UG0ikwokjqYIqDanEHA0lYCjqfn238dktTXTATEUmiYtIE7bgoAYDrbiAIcMrkGflSfkfcxpQJ0fA06C5Tn+Pqbhy2OEQDCdwMPpFjoeyPY1MjkpEPI+JpKHM4A8LHD8fSvDwxkEHs4k8HBmPv/LHkYDcfQ4eLJX+pXHLO/KYzZruPDx/M1/DKUAw8CxvaJJ94Tj7WkDgCcIej9JcDZPEq97ZpPsMIdghzkWkp9ZwK7cbKADnyvguoeBo5aOX/cYnecS9G4l5LoHeD6qVfq6J3Gl4o+SriA2SLLNuO7WU8zu1hOEwPKUheseZGB5ChhYnnb8usec99MEB/sMAUfPWLjuQSYVSBzNc/y6x+BoHgFHzxJw9OxWGC5kvcb3nFcIPy8lKLD29xwBfPMJ4JtPrDaNHZ4n2OEFgh1esFBtPgdMCp4HOvMXHeeTcVaMarOtgGrzRYLe7YRUm8DzUe3S1WbiSsUfJV1BbJBkm3HV5gJp1eYCC9UmMrAsAAaWhQKqzYUEB/sSAUcvWag2kUkFEkcvC6g2Xybg6BUCjl7ZCsOFrLZmOiCGQq9KC4ivWhgunJXPCa5Bn9VRyHDhq0CdXwMOo3R0fLjQ8OU1QiB4ncDD1y10PJDta2RysqOQ4UIkD98A8nBHx4cLDQ/fIPBwEYGHi4gd2LtI8z5vOt4xNJ/a+CZBb+DHxFr9fGfkdY9/v2/VkMvBNs0yxFv5+Oe+ne92YmL0fjsffkbUz3dG2nQxeCJaOnHfkUjcdwjEfVcAcd8VMl1uouNiQtR9L1+Gw0Ji6X2wwzKr1r/oHg62VBO935OBezZfx3RavtsOVZIdQ9h9WvtA+g8Yr+wYh/I+wSixku6DfN4H0sf2jnayH4JLm8RJtv8qUTJ8NvjIe/4SBqjNAX4gJFMw+/yQAOKPHe9LGAB8TND7E0Jf6hNiX2oJyQ6fEuzwKdEOMSeGtkMnAV+2eRpB785C+vpLgYELeNaqsxv3k0n3+RFw4GkJsGr7zPH4Y3zuUgLvujg+SWv0/oygd1chk7TA81Fd05O0iSsVf5R0BbFBkm3GVdafMweHPiYkYp/n8ydpkYHlc2BgWeb4JK0572UEB/sFAUdfWJikRSYVSBx96fgkrcHRlwQcLSfgaHn+P7+3KaXbJeW90q+8xtYKKUGLtb+vCOT4mkCOr4ldE2OHFQQ7fEOwwzcWpiyBpIvrJgS1pxLSjVkJdKzADopSQroxXwGT5hXAZOdbAf58JcGPFQnoxnxL0LtYSDcGeD6qON2NSVyp+KOkK4gNkmwzrhvznbRuzHcWujHIwPIdMLB8L6Ab8z3Bwa4i4GiVhW4MMqlA4mi1gG7MagKOfiDg6Id8++81s9r+6YAYCq2RFhDXbEFADAdbcYBDBtegzyoT8l7zGqDOPwK7BmWOv9ds+PIjIRD8RODhTxY6bsjrHWRyUi6k44bk4c9AHpY7PjdnePgzgYe/EHj4Sz7/S1M+AOJoLRBHNj/KFdi9jrtyW+ddua1nDauvzd/8x1AKMAwc2yuadBscb08bAGwg6P0rwdn8SrxuXE+yw0aCHTZaSH7WAbty64EO/DfH+bSShKNdHb/uMTr/RtB7NyHXPcDzUbulr3sSVyr+KOkKYoMk24zrbv3O7G5tIASW3y1c9yADy+/AwPKH49c95rz/IDjYTQQcbbJw3YNMKpA4+tPx6x6Doz8JOAoV4HFknjkkZPdLU4Bv7cVV2tsU/P1vRoGQoMDa3zYFePDVIoCvVgGv2jR2yCDYYVuCHbYt4Feb2xTgkoKMApw9axe4zaelpGpzDwHVZm0Cf/YUUm0Cz0ftma42E1cq/ijpCmKDJNuMqzbrSEksYoElbsPeQlcJyMBSBxhYtiuAEYGWqG1HcLB1CQlK3QJ+tYlMKpA4qpeCPbdWtVmPgKP6BBzVL7A/XMhqa6YDYijUQFpAbLAFATEcbMUBDhlcgz5rbyHDhQ2AOjfEkUrt7fhwoeFLQ0Ig2J4QCLa30PFAtq+RyUkvIcOFSB42AvKwl+PDhYaHjQg8bEzgYWNiB/ZDUuesieMdQ/PJwk0I5/8eOB+q6/MZUzQYNul/p3r/TvP+NatpQc34CPz1yfoZdxDwsZ/j/sHo3JSAj/2FdFaB56Ns6Rz0bNoDn9XM7/9UabS4KByNlkRKIyXRiqh+piosLo6WlxVFiyoqi0oikZLyvtFIaVmkuKKqRIXLi4tKI1WR6orS6rJCq1+e1Awcv2KreQ01HWzTLEM0LyB8GjAwYWPpnVkAPyPqZ7JMzwAmcJm4Z2UByWTTCWSRnEC2NCdgDJFNcAI5jjsBo3cO2QmgozfSseYWYHHJ0hmJozygzjV9CVNsobHqd9jhgIu5T3+QCgdcNZgV9Oz4LyTKLyC8DmfIlUdwLrF2Sb7PYbP2ji4LC8CZgq0pUSSoM3z7bOHhoyUDgMbY+aToht6r2WcBAXCtHO/PGQC0IujdmtCfbU3sz7Yk2aENwQ5tLNwXtQAOMrUEZk9tHeeTcdQMHB3k+ISs0bktQe+DhfRxgeejDk5PyCauVPxR0hXEBkm2GZfVt2MOBLUiBJZ2FiZkkYGlHTCwtHd8Qtacd3uCg+1AwFEHCxOyyKQCiaOOjk/IGhx1JOBoBwKOdtgK72Mi21wZvn3u6BXCO0kJCqz97UgAXycC+DoRq01jh50IduhMsENnC9XmjsCkYCegM9/ZcT4ZZ8WoNg8TUG3uTND7cCHVJvB81OHpajNxpeKPkq4gNkiyzbhqcxdp1eYuFqpNZGDZBRhYugioNrsQHGxXAo66Wqg2kUkFEkfdBFSb3Qg4ChNwFN4K72Oy2prpgBgKKWkBUW1BQAwHW3GAQwbXoM86Ssj7mAqocyFwEuwox9/HNHwpJASCIgIPiyx0PJDta2RycoyQ9zGRPCwG8vAYx9+3MjwsJvCwhMDDkgL+lz3kA3FUCp7slX7lUeZdeURYw4WlBZv/GEoBhoFje0WTrtzx9rQBQDlB7+4EZ9OdeN0TIdlhV4IddrWQ/JQBu3IRoAPfTcB1DwNHxzl+3WN03o2g9/FCrnuA56OOT1/3JK5U/FHSFcQGSbYZ193andndKicElt0tXPcgA8vuwMDSw/HrHnPePQgOdg8CjvawcN2DTCqQONrT8euev/wGAUd7EXC011YYLmS9xtfTK4T3lhIUWPvrSQDfPgTw7UOsNo0d9ibYoRfBDr0sVJs9gUnB3kBnvq/jfDLOilFtniSg2tyXoPfJQqpN4Pmok9PVZuJKxR8lXUFskGSbcdXmftKqzf0sVJvIwLIfMLDsL6Da3J/gYA8g4OgAC9UmMqlA4uhAAdXmgQQcHUTA0UFbYbiQ1dZMB8RQ6GBpAfFgC8OFZQWc4Br0WX2EDBceDNT5EOAwSh/HhwsNXw4hBIJDCTw81ELHA9m+RiYnUSHDhUgeHgbkYdTx4ULDw8MIPDycwMPDiR3YAtK8zxGOdwzNpzYeQdAb+DGxVj/fGXnd49/vkTXkcrBNswxxZAH+uUcVuJ2YGL2PKoCfEfXznZE2PRo8ES2duMdIJO4xBOIeK4C4xwqZLjfR8WjGVGiBDIeFxNLxYIdlVq1/0T0cbKmR+aHQUtxXYf31dUwr8912qJLsGMLu09oH0p/AeGXHOJTjCU41VtKdUMD7QPrY3tFO9kRwaZM4yfZfJUqGzwYneZg7mQFqc4AnCMkUzD5PJIC4t+N9CQOA3gS9TyH0pU4h9qVOJtmhD8EOfYh2iDkxtB0qBXzZ5kqC3n2F9PVPBWb3wLNWfd24n0y6z5OAA08nI++VHI8/xueeSvC7pzk+SWv0jhL0Pl3IJC3wfNTp6UnaxJWKP0q6gtggyTbjKusK5uBQb0IiVrEFg0OBXwkABpYKYGCpdHyS1px3JcHB9iXgqK+FSVpkUoHEUZXjk7QGR1UEHFUTcFRd8M/vbUrpdkl5r/Q0r7F1upSgxdrfaQRynEEgxxnEromxw+kEO5xJsMOZFqYsgaSL6yYEtedZQroxZwG7McAOijpLSDfmNGDSfDow2TlbgD8/i+DHzhHQjTmboHc/Id0Y4PmofuluTOJKxR8lXUFskGSbcd2Yc6R1Y86x0I1BBpZzgIGln4BuTD+Cgz2XgKNzLXRjkEkFEkfnCejGnEfA0fkEHJ2/Fd5rZrX90wExFLpAWkC8YAsCYjjYigMcMrgGJrSQ95ovAOrcH9g1ON/x95oNX/oTAsGFBB5eaKHjhrzeQSYn/YV03JA8HADkYX/H5+YMDwcQeDiQwMOBBfwvTTkBiKOLwG/cJF4JxhYaE8DuddyV28Xeldsg1rD6RQWb/xhKAYaBY3tFk26w4+1pA4DBBL0vITibS4jXjYNIdriUYIdLLSQ/FwO7coOADvwyx/l0FglHAxy/7jE6X8ZIWoRc9wDPRw1MX/ckrlT8UdIVxAZJthnX3bqc2d0aTAgsl1u47kEGlsuBgeUKx697zHlfQXCwQwg4GmLhugeZVCBxNNTx6x6Do6EEHF1JwNGVBfa/NAX41l5cpX2VVwhfLSUosPZ3FQF81xDAdw2x2jR2uJpgh2sJdrjWQrV5FTApuBrozK9znE+nkqrNQQKqzesY3Toh1SbwfNTgdLWZuFLxR0lXEBsk2WZctXm9tGrzegvVJjKwXA8MLDcIqDZvIDjYGwk4utFCtYlMKpA4Giag2hxGwNFNBBzdtBWGC1ltzXRADIWGSwuIwy0MF15cwAmuge/1hAwXDgfqfDNwGOUyx4cLDV9uJgSCWwg8vMVCxwPZvkYmJ1cIGS5E8vBWIA+vcHy40PDwVgIPRxB4OILYgT2R1Dkb6XjH0Hyy8EiC3seBz7+uz2c8psGwSf873ft3hvevWbcV1IyPoPq018/IJdhpqOP+weh8G+N6UEhnFXg+ypbOQc+mA/BZo/x+QJVGi4vC0WhJpDRSEq2I6meqwuLiaHlZUbSoorKoJBIpKe8bjZSWRYorqkpUuLy4qDRSFamuKK0uK7T65UmjwP4rtm6voaaDbZpliNsLCJ8GDEzYWHrfUQA/I+pnsjyegbNp40zcs+4EksmmE7iT5ARGS3MCxhCjCU7gLsedgNH7LrITQEdvpGO9uwCLS5bOSByNAepc05cwxRYaq36HHQ64mPv0B6lwwFWDWUHPjv9ConsKCK/DGXKNITiXWLvkHp/DZu0dXRaOBWcKtqZEkaDO8O1znIePexkANMa+hxTd0Hs1+xxLANx9jvfnDADuI+g9ntCfHU/sz95LssMEgh0mWLgvGgccZLoXmD3d7zifjKNm4Ogaxydkjc73MybMhfRxgeejrk1PyCauVPxR0hXEBkm2GZfVP8AcCLqPEFge2IKBoKCERgaWB4CB5UHHJ2TNeT9IcLAPEXD0kIUJWWRSgcTRw45PyBocPUzA0UQCjiYW2H8fE9nmyvDtc5JXCE+WEhRY+5tEAN8jBPA9Qqw2jR0mE+zwKMEOj1qoNicBk4LJQGc+xXE+GWfFqDZvEFBtTmG8LiSk2gSej7oxXW0mrlT8UdIVxAZJthlXbU6VVm1OtVBtIgPLVGBgmSag2pxGcLCPEXD0mIVqE5lUIHE0XUC1OZ2AoxkEHM0osP8+JqutmQ6IodBMaQFx5hYExHCwFQc4ZHAN/H6VkPcxZwJ1fhw4CTbc8fcxDV8eJwSCWQQezrLQ8UC2r5HJyS1C3sdE8nA2kIe3OP6+leHhbAIPnyDw8IkC/pc93APE0ZPgyV7pVx5zvCuPuazhwicLNv8xlAIMA8f2iibdU463pw0AniLo/TTB2TxNvO6ZS7LDMwQ7PGMh+ZkD7MrNBTrweQKuexg4GuH4dY/ReR5B75FCrnuA56NGpq97Elcq/ijpCmKDJNuM6249y+xuPUUILM9auO5BBpZngYHlOceve8x5P0dwsM8TcPS8heseZFKBxNF8x697DI7mE3D0AgFHL2yF4ULWa3wveoXwAilBgbW/FwngW0gA30JitWnssIBgh5cIdnjJQrX5IjApWAB05i87zifjrBjV5u0Cqs2XCXrfIaTaBJ6PuiNdbSauVPxR0hXEBkm2GVdtviKt2nzFQrWJDCyvAAPLqwKqzVcJDvY1Ao5es1BtIpMKJI5eF1Btvk7A0RsEHL2xFYYLWW3NdEAMhRZJC4iLLAwXzingBNfAH98mZLhwEVDnN4HDKHc5Plxo+PImIRC8ReDhWxY6Hsj2NTI5GSNkuBDJw7eBPBzj+HCh4eHbBB4uJvBwMbEDO5Y07/OO4x1D86mN7xD0Bn5MrNXPd0Ze9/j3+24NuRxs0yxDvFuAf+57BW4nJkbv9wrgZ0T9fGekTd8HT0RLJ+4HEon7AYG4Hwog7odCpstNdHyfEHU/KpDhsJBYWgJ2WGbV+hfdw8GWytT7PRW4Z/N1TGcVuO1QJdkxhN2ntQ+k/5jxyo5xKEsIRomVdB8X8D6QPrZ3tJP9BFzaJE6y/VeJkuGzwafe85cyQG0O8GMhmYLZ5ycEEH/meF/CAOAzgt6fE/pSnxP7UktJdlhGsMMyoh1iTgxth7ECvmzzLILe44T09b8ABi7gWatxbtxPJt3np8CBp6XAqu1Lx+OP8blfEHg33vFJWqP3lwS9JwiZpAWej5qQnqRNXKn4o6QriA2SbDOusl7OHBz6jJCILS/gT9IiA8tyYGD5yvFJWnPeXxEc7AoCjlZYmKRFJhVIHH3t+CStwdHXBBx9Q8DRNwX//N6mlG6XlPdKV3qNrW+lBC3W/lYSyPEdgRzfEbsmxg7fEuzwPcEO31uYsgSSLq6bEPibrIR0Y1YBHSuwg6IeFNKNWQlMmr8FJjurBfjzVQQ/9rCAbsxqgt4ThXRjgOejJqa7MYkrFX+UdAWxQZJtxnVjfpDWjfnBQjcGGVh+AAaWNQK6MWsIDvZHAo5+tNCNQSYVSBz9JKAb8xMBRz8TcPRzgf33mllt/3RADIV+kRYQf9mCgBgOtuIAhwyugb/2VMh7zb8AdV4L7Bo84vh7zYYvawmBYB2Bh+ssdNyQ1zvI5GSKkI4bkofrgTyc4vjcnOHhegIPNxB4uKGA/6UpHwNx9CsQRzY/yhXYvY67ctvoXbn9xhpW/7Vg8x9DKcAwcGyvaNL97nh72gDgd4LefxCczR/E68bfSHbYRLDDJgvJz0ZgV+43oAP/03E+rSLhaJrj1z1G5z8Jej8m5LoHeD7qsfR1T+JKxR8lXUFskGSbcd2tUAtid+t3QmCJ27C30FUhMrCY/aL2tU0LGBEogeWvoNIC72AzWuBxZJ45hIwjZFKBxFGtFOy5Na57DI5qEXC0LQFH27aw/6UpX5Aq7dot/v63jpSgwNpfbQL4tiOAb7sWvGrT2KEOwQ51CXao24JfbdZugUsK6gCdeb0WbvPpC1K1OVNAtVmPwJ/HhVSbwPNRj6erzcSVij9KuoLYIMk246rN+tKqzfoWqk1kYKkPDCwNBFSbDQgOtiEhQWloodpEJhVIHG0voNrcnoCjRgQcNWphf7iQ1dZMB8RQqLG0gNh4CwJiONiKAxwyuAZ91hNChgsbA3VugiOVesLx4ULDlyaEQNCUEAiaWuh4INvXyORkjpDhQiQPmwF5OMfx4ULDw2YEHjYn8LA5sQP7Calzlul4x9B8snAm4fw/AudDdX0+Y6YGwyb97+Pev7O8f83KalEzPoLq00E/424CPp5y3D8YnbMI+HhaSGcVeD7qace76HcUcD4o8lnH9b6b9JEMzwnJnVqHcc9qA3zW80I+CgWIbwXEjELaLxaDY/41K/R3zM0ObY692V6c8P9ejvffc32/l1PD7+V5/z3f93u5NfxegfffW/h+L6+G32vp/fdWvt/Lr+H3Wnv/vY3v9wpq+L223n9v5/u9FjX8Xnvvv3fw/V7LGn7P2GqTZ4vY77Wq4fdyvf+e5/u91jX8Xr733wt8v9emht9r4f33lr7fa1vD77Xy/ntr3++1q+H32nj/va3v99rX8HvtvP/e3vd7HbxcLbYSY3fgUbYQjksdwPVMzAfN8pSO1Tjm/7+tltqhvxvP23l2rKelvpYGWhpq2V5LIy2NtTTR0lRLMy3NtWSG/uan4abhn+Ge4ZfhluGPMbvhh+GGwX+b0N/4Ntg2+DXY7ahlBy07atlJSyctnbXsrGUXLV20dNXSzdhDi7l+LTRnpqVYS4mWUi1lWiJayrV017Krlt207K6lh5Y9vDPaS0tPLXtr2UdLLy37atlPy/5aDtByoJaDtBys5RAth2o5TMvhWo7QcqSWo7QcreUYLcdqOU7L8VpO0HKilpO0nKylt5ZTtPTRcqqWqJYKLZVazM1HlZZqLadpOV3LGVrO1HKWlrO1nKOln5ZztZyn5XwtF2jpr+VCLQO0DNRykZaLtQzSMljLJVou1XKZlsu1XBH6u6YdquVKLVdpuVrLNVqu1XKdluu13KDlRi3DtNykZbiWm7XcouVWLSO0jNRym5ZRWm7XcoeWO7WM1nKXlru1jNFyj5axWsZpuVfLfVrGa5mg5X4tD2h5UMtDWh7WMlHLJC2TtTyi5VEtU7RM1TJNy2NapmuZoWWmlse1zNIyW8sTWp7UMkfLXC1PaXlayzNa5ml5VstzWp7XMl/LC1pe1LJAy0ItL2l5WcsrWl7V8pqW17W8oWWRlje1vKXlbS2Ltbyj5V0t72l5X8sHWj7U8pGWJVo+1vKJlk+1LNXymZbPtSzT8oWWL7Us1/KVlhVavtbyjZaVWr7V8p2W77Ws0rJayw9a1mj5UctPWn7W8ouWtVrWaVmvZYOWX7Vs1PKblt+1/BH62w/+qcWQ37xsl6GllpZttdTWUkfLdlrqaqmnpb6WBloaatleSyMtjbU00dJUSzMtzbVkasnSkq0lR0uuljwt+VoKtLTQ0lJLKy2ttbTR0lZLOy3ttXTQ0lHLDlp21LKTlk5aOmvZWcsuWrpo6aqlmxbj0JSWQi1FWoq1lGgp1VKmJaKlXEt3Lbtq2U3L7lp6aNlDy55a9tLSU8veWvbR0kvLvlr207K/lgO0HKjlIC0HazlEy6FaDtNyuJYjtByp5SgtR2s5RsuxWo7TcryWE7ScqOUkLSdr6a3lFC19tJyqJaqlQkullr5aqrRUazlNy+laztByppaztJyt5Rwt/bScq+U8LedruUBLfy0XahmgZaCWi7RcrGWQlsFaLtFyqZbLtFyu5QotQ7QM1XKllqu0XK3lGi3XarlOy/VabtByo5ZhWm7SMlzLzVpu0XKrlhFaRmq5TcsoLbdruUPLnVpGa7lLy91axmi5R8tYLeO03KvlPi3jtUzQcr+WB7Q8qOUhLQ9rmahlkpbJWh7R8qiWKVqmapmm5TEt07XM0DJTy+NaZmmZreUJLU9qmaNlrpantDyt5Rkt87Q8q+U5Lc9rma/lBS0valmgZaGWl7S8rOUVLa9qeU3L61re0LJIy5ta3tLytpbFWt7R8q6W97S8r+UDLR9q+UjLEi0fa/lEy6dalmr5TMvnWpZp+ULLl1qWa/lKywotX2v5RstKLd9q+U7L91pWaVmt5Qcta7T8qOUnLT9r+UXLWi3rtKzXskHLr1o2avlNy+9a/tCyScufWkzg30ZLhpZaWrbVUltLHS3baamrpZ6W+loaaGmoZXstjbQ01tJES1MtzbQ015KpJUtLtpYcLbla8rTkaynQ0kJLSy2ttLTW0kZLWy3ttLTX0kFLRy07aNlRy05aOmnprGVnLbto6aKlq5ZuWkyipbQUainSUqylREupljItES3lWrpr2VXLblp219JDyx5a9tSyl5aeWvbWso+WXlr21bKflv21HKDlQC0HaTlYyyFaDtVymJbDtRyh5UgtR2k5WssxWo7VcpyW47WcoOVELSdpOVlLby2naOmj5VQtUS0VWiq19NVSpaVay2laTtdyhpYztZyl5Wwt52jpp+VcLedpOV/LBVr6a7lQywAtA7VcpOViLYO0DNZyiZZLtVym5XItV2gZomWoliu1XKXlai3XaLlWy3Vartdyg5YbtQzTcpOW4Vpu1nKLllu1jNAyUsttWkZpuV3LHVru1DJay11a7tYyRss9WsZqGaflXi33aRmvZYKW+7U8oOVBLQ9peVjLRC2TtEzW8oiWR7VM0TJVyzQtj2mZrmVGxt+9WdOXNXmtgXbiOq/p5v/7Su8XYq+EV0bPPrvNhee2ifbvX3XBhX3OiV7cp+KMC/v0P2Owycb+cosp/Prw1H791tR+/bbUfv321H793tR+fUJqvz4xtV9/NLVfn57ar89M7defTu3Xn03t1+en9usvpvbrb6T262+l9uvvp/brS1L79d61Uvr1Pqn9+lmp/Xq/1H79/NR+vX9qv355ar8+NLVfvy61Xx+W2q/fmtqvj0zt18ek9uvjUvv18an9+v2p/fqjqf36tNR+fVZqvz4ntV/frXZKv94jtV8/MLVfPyS1Xz88tV8/MrVf753ar5+a2q9Xp/brZ6b26+em9uvnp/brg1P79ctS+/Uhqf36lan9+rDUfv3m1H59VGq/Pjq1Xy/YLqVfb5nar3dK7dd3Se3Xu6X26yq1X98ttV/fI7Vf75Xarx+Q2q8fmtqvH57ar5+Q2q+fnNqv90nt16Op/fqZqf36Oan9+v9r71zAoyzPdR1OylmQYhRQYoyIQDRpocBWJMjBFIQSNLWJOxqUQ6LTQDkpWKREEdAACaQgIiKLorAEDJhiSkEIltrowmWUKCIqB1GBIhtUFEjjbmS+zc/fyPrv5w297L6c6/JKTO53vm+eueeZfOOYjGb4fQw/URfh5QyvWw/hDRjemOFNGN6S4ZcxPIbhbRkey/BrGd6F4dcx/AaGJzD8Zwy/meGDGP4Lhr9bH+HvMfwThh9g+CGGH2b4CYb/neG1GiD8fIY3ZHhjhkcyvAXDL2V4a4a3ZXh7hsczvBPDixoifB3D/8LwEob/F8NfZ/i7DN/J8D0M/5jhBxl+iOHHGH6c4eUMr2D4+Y0QXp/hTRj+I4bPa4zw+QxfyvBlDH+O4SsZXsTwPzG8mOFbGP4qw/+L4WUM387w9xj+PsM/Zvh+hh9m+OcMH9cE4fcz/GGGT2X4owzPYfg8hj/B8KcZ/nuGL2f4cwwvZPiLDF/H8PUM38LwvzL8dYa/yfDkCxF+G8PvZvgwhmcy/F6Gj2P4eIZPYvhDDJ/G8EcZPofhcxk+n+ELGP57hj/L8JUMX83wjj9C+E8ZfiPDezM8keF9GZ7M8F8y/A6G38Xw4QzPZPgoho9l+P0Mn8Dwhxj+CMNzGJ7L8GYXIbw5wy9neAzDr2L41QzvyPDODO/G8B4M78PwRIYnMfxWht/G8BSG38XwoQy/l+EjGH40EuFfMPzb/w0uOF6L4ecxvC7DmzH8Ioa3YngUw69k+FUMj2P4Txj+U4Z3YXgPhvdieF+GD2B46SUIf4vhHzJ8D8P3MfwThh9l+JcMP8nwbxheuwXCz2P4BQy/kOHNGR7J8CiGX8Hwqxkey/CClghfw/CXGF7M8D8z/C8ML2X4NobvYPgHDN/L8H0M/4zhRxj+BcOPMfwbhtdshfC6DG/I8FmXIjyP4QsZ/jTDlzB8KcMLGP4Cw//I8A0M38zwPzN8K8PfYPhbDC9j+AcM383wTxh+kOE1LkN4LYY3ZPgFDL+Q4T9i+GUMv5zhVzG8PcPjGP5jhl/H8BsY3oPhPRl+M8N/zvBkhqcw/F6G/4rh4xg+nuG/YfiDDJ/G8McYnsfw3zH8CYY/yfClDF/G8OcYvpLhaxn+R4ZvZPjLDN/B8J0M38fwTxl+kOGHGH6M4ccZ/g38eaY1wusyvD7DmzH8IoZfwvCWDI9h+FUMj2V4PMN7Mrw3w5MYfivDb2N4CsOHMHw4w3/F8F8zfBzD72f4ZIY/zPCpDJ/O8NkM/x3DFzB8EcPXMryI4cUM/zPDX2F4CcPfZHgZw99j+IcM/4jhHzP8MMOPMvxLhn/F8IgohNdieD2GN2J4a4ZfzvBYhscx/CcM78TwBIb3ZPjPGN6f4YMYfivD0xiezvC7GT6U4VkM/zXD72P4AwyfzfB8hi9k+NMMX8LwpQxfxfDVDH+R4X9i+CaGb2b4awx/neGlDH+L4TsZ/iHD9zF8P8NPMvzvDK93OcIbMvwChjdleCuGt2b4lQy/muHXMDyO4V0Zfj3DuzO8B8P7Mrw/w29h+G0Mz2L4SIaPZ/hvGD6J4ZMZ/ijDZzB8DsPnMfxJhj/F8GcZ/p8MX8nw5xlexPA/MbyY4VsY/g7D32X4PoZ/yvCDDD/E8K8ZfpLhNaIRXofh9RnekOHNGX4xw1sy/FKGt2H41Qy/luE/YXhfht/M8GSG/5LhtzM8jeHDGJ7J8BEMH83w+xk+geEPMfwRhk9n+GMMz2f4PIYvZPhihr/A8D8wvJjhf2b4KwwvYfg2hr/D8PcZvpvhHzP8U4YfYfgXDP+K4ccZXvMKhNdheAOGX8DwNgxvy/B4hndkeGeGd2X4jQzvzfB+DP85w29l+C8YfifD72L4UIYPZ/hIho9m+HiGT2T4LIbnMXwhw59m+BKGL2V4AcNfYPgfGb6B4ZsZ/meGb2X4Gwx/i+FlDP+A4bsZ/gnDDzK8ZgzCazO8EcObMLwZw5sz/DKGX87wqxjenuFxDP8xw69j+A0M78Hwngy/meE/Z3gyw1MYfi/Df8Xw8Qz/DcMnMXwyw3MYPovhv2P4fIY/xfCnGb6c4SsY/jzDVzN8HcM3MPxlhr/C8A8Yvovh+xn+N4YfZvgRhp9g+N8ZXutKhJ/P8IYMb8zwSIa3YPilDG/N8LYMb8/weIZ3YvhNDP8Zw5MZ/kuG387wNIZnMPxehv+a4WMZPoHhv2H4FIZPY/hjDJ/B8LkMn8/wRQxfwvB1DF/P8C0M/yvDX2P4Voa/zfB3Gf4hw/cy/FOGH2D45ww/xvDjDD/J8NptEH4+wxsxvCnDr2D4lQyPZ3hHhndmeFeG92L4TQzvz/Akhv+C4b9k+GCGD2H4cIZnMnwUw8cy/AGGT2L4XIY/zvDFDP89w59l+HKGr2H4Hxj+J4ZvZPifGf4Xhv83w99keBnD32H4LobvZfh+hh9i+DcMr3EVwhsxvAnDmzG8OcOjGH4Fw69meCzDf8zwjgzvxvAEhvdkeG+GD2B4EsNvY/jtDB/F8DEMn8jw3zL8IYZPYfhMhucxfB7DFzD8aYb/B8OfY/gqhq9m+AsMX8/wjQzfwvAShr/H8PcZvp/hf2P4YYYfYXg5w79heJ22CK/H8MYMb8LwSxjeiuGtGX45w9sxPJbhP2F4Z4YPYPhAhqcw/H8z/E6GD2b4PQz/FcNHM/w+hv+G4Q8yfCrDH2X4DIbPYvjjDF/A8MUMX8rwFxn+R4ZvYfhfGf4aw7cyfDvD32P4bobvY/gBhv+N4V8y/GuGn2T43xl+3tUIr8fwCxjejOHtGN6B4Z0Y3oXh1zG8G8P7MPxnDP85w29h+C8Znsrwuxk+jOGZDL+X4WMYfh/DJzJ8MsPnMPx3DF/M8N8z/FmGL2d4IcNfZPgGhhcz/C8M/yvDSxm+jeHvMPxdhu9h+D6GH2T4YYaf1w7hdRnelOE/Yngkwy9heDTDr2R4e4Zfy/CODP8pw7sz/EaG92b4TQwfyPBbGJ7C8DSGj2D4rxk+keG/ZfhDDJ/C8FyGz2H4fIYvZPh/MPz3DF/J8AKGv8DwPzD8JYYXM/wVhr/G8D0M/4jhhxj+fxj+OcO/ZHgFw2u0R/j5DG/A8CYMv5DhLRl+GcMvZ/gVDO/A8GsZ3onhXRnej+H9GZ7C8P/N8DsZPpjhIYaPYPhYho9n+IMM/y3DpzM8h+GzGJ7H8CcYvpDhSxj+bHC8xj++/Zsap7BfhPHwb86MGDxmzNBfjRxTOTl67F1jRg2+e0zUfZljMqJGjBs6alhoxH3e4VTLcHp4qFn448+yhgy9P2rE2DFRI4ZF3TVibNaQ0V787jB2Sfhjj1GjBo+Pyjz7UCZbI6Ss8WAYbvXPIQweMuSfb/+k8NyNwfbm8N5kb25okLi3X7C9pSh7y4R7m+7LG0nnhrMtw9OCpeLwx0gqbiiPrZGvrPEMTD6PGZunGJsnGpvHjM1TjM0TjV1gMXaBxdgFzNgFirELmLELFGMXiMYusSS/xJL8Epb8EiX5JSz5JUryS8TkV7GuWKV0xSqxK1axrlildMUqsSuKLMYWWYwtYsYWKcYWMWOLFGOLRGM3MWM3KcZuEo3dxIzdpBi7STS2xGJsicXYEmZsiWJsCTO2RDG2RDS21JJ8qSX5UpZ8qZJ8KUu+VEm+VEz+tlqnOOnU7IZTLcPpwVJxODo1u6FMtkZIWYOemlPDcwFb2uGopd0QbelUnxUB94ZaOtV33wTd23Bf3kg6N5xtGQ7YFQ5HXeGG8tga+coatCtGMGNHKMaOEI0dwYwdoRg7QjR2gsXYCRZjJzBjJyjGTmDGTlCMnSAam21JPtuSfDZLPltJPpsln60kny0mP4N1xQylK2aIXTGDdcUMpStmiF0xz2LsPIux85ix8xRj5zFj5ynGzhONXcSMXaQYu0g0dhEzdpFi7CLR2GUWY5dZjF3GjF2mGLuMGbtMMXaZaGyBJfkCS/IFLPkCJfkClnyBknyBmPxP65zipFOzG061DKcHS8Xhd5NU3FAmWyOkrEFPzV3DcwFb2uGopd0QbemuPisC7g21dFfffRN0b318eSPp3HC2ZThgVzgcdYUbymNr5Ctr0K4YwIwdoBg7QDR2ADN2gGLsANHYFIuxKRZjU5ixKYqxKczYFMXYFNHYwZbkB1uSH8ySH6wkP5glP1hJfrCYfIh1RUjpipDYFSHWFSGlK0JiV4yzGDvOYuw4Zuw4xdhxzNhxirHjRGMfZMY+qBj7oGjsg8zYBxVjHxSNnWoxdqrF2KnM2KmKsVOZsVMVY6eKxs6yJD/LkvwslvwsJflZLPlZSvKzxOSbn3+Kk07NbjjVMpweLBWHo1OzG8pka4SUNeip+eLwXMCWdjhqaTdEW/pinxUB94Za+mLffRN0b1f68kbSueFsy3DArnA46go3lMfWyFfWoF0Ry4yNVYyNFY2NZcbGKsbGisZ2sRjbxWJsF2ZsF8XYLszYLoqxXURjEyzJJ1iST2DJJyjJJ7DkE5TkE8Tk+7Gu6Kd0RT+xK/qxruindEU/sSuSLcYmW4xNZsYmK8YmM2OTFWOTRWPTmLFpirFporFpzNg0xdg00dhhFmOHWYwdxowdphg7jBk7TDF2mGhsliX5LEvyWSz5LCX5LJZ8lpJ8lpj8F3VPcdKp2Q2nWobTg6XicHRqdkOZbI2QsgY9NX8VngvY0g5HLe2GaEt/5bMi4N5QS3/lu2+C7q12vTPzRtK54WzLcMCucDjqCjeUx9bIV9agXdEwPBfQWIcjY90QNdbNBTTW4chYN0SNjbQYG2kxNpIZG6kYG8mMjVSMjRSNbW1JvrUl+dYs+dZK8q1Z8q2V5FuLybdjXdFO6Yp2Yle0Y13RTumKdmJXdLQY29FibEdmbEfF2I7M2I6KsR1FY69nxl6vGHu9aOz1zNjrFWOvF43tbTG2t8XY3szY3oqxvZmxvRVje4vG9rck39+SfH+WfH8l+f4s+f5K8v3F5N+qf4qTTs1uONUynB4sFYejU7MbymRrhJQ16Kn57fBcwJZ2OGppN0Rb+m2fFQH3hlr6bd99E3Rve315I+nccLZlOGBXOBx1hRvKY2vkK2vQrjjIjD2oGHtQNPYgM/agYuxB0dhjFmOPWYw9xow9phh7jBl7TDH2mGhshSX5CkvyFSz5CiX5CpZ8hZJ8hZh8vQanuIBd4XDUFW6IdoWbC9gVDkdd4YZoVzQLz0nGuuFsy3BAYx2OjHVDeWyNfGUNamxLZmxLxdiWorEtmbEtFWNbisbGWIyNsRgbw4yNUYyNYcbGKMbGiMZ2sCTfwZJ8B5Z8ByX5Diz5DkryHcTk1zQ8xUmnZjecahlOD5aKw9Gp2Q1lsjVCyhr01PyH8FzAlnY4amk3RFv6Dz4rAu4NtfQffPdN0L1t9uWNpHPD2ZbhgF3hcNQVbiiPrZGvrEG74lVm7KuKsa+Kxr7KjH1VMfZV0dgyi7FlFmPLmLFlirFlzNgyxdgy0dj3Lcm/b0n+fZb8+0ry77Pk31eSf19M/lPWFZ8qXfGp2BWfsq74VOmKT8WuOGox9qjF2KPM2KOKsUeZsUcVY4+Kxp5gxp5QjD0hGnuCGXtCMfaEaGytRqc4yVg3nG0ZDmisw5GxbiiPrZGvrEGNbWBJvoEl+QYs+QZK8g1Y8g2U5BuIyec1PsVJp2Y3nGoZTg+WisPRqdkNZbI1Qsoa9NScH54L2NIORy3thmhL5/usCLg31NL5vvsm6N4W+/JG0rnhbMtwwK5wOOoKN5TH1shX1qBdsZwZu1wxdrlo7HJm7HLF2OWisYUWYwstxhYyYwsVYwuZsYWKsYWisestya+3JL+eJb9eSX49S369kvx6MflXWFe8onTFK2JXvMK64hWlK14Ru6LUYmypxdhSZmypYmwpM7ZUMbZUNPZdZuy7irHvisa+y4x9VzH2XdHYPRZj91iM3cOM3aMYu4cZu0cxdo9o7AFL8gcsyR9gyR9Qkj/Akj+gJH9ATH5kk1OcdGp2w6mW4fRgqTgcnZrdUCZbI6SsQU/No8NzAVva4ail3RBt6dE+KwLuDbX0aN99E3Rvv/XljaRzw9mW4YBd4XDUFW4oj62Rr6xBu2IaM3aaYuw00dhpzNhpirHTRGPnWIydYzF2DjN2jmLsHGbsHMXYOaKxCyzJL7Akv4Alv0BJfgFLfoGS/AIx+WdYVzyjdMUzYlc8w7riGaUrnhG7osBibIHF2AJmbIFibAEztkAxtkA0togZW6QYWyQaW8SMLVKMLRKNLbYYW2wxtpgZW6wYW8yMLVaMLRaNLbEkX2JJvoQlX6IkX8KSL1GSLxGT//mFpzjp1OyGUy3D6cFScTg6NbuhTLZGSFmDnpoHhecCtrTDUUu7IdrSg3xWBNwbaulBvvsm6N7u9OWNpHPD2ZbhgF3hcNQVbiiPrZGvrEG7Yjgzdrhi7HDR2OHM2OGKscNFY0dZjB1lMXYUM3aUYuwoZuwoxdhRorETLMlPsCQ/gSU/QUl+Akt+gpL8BDH5KawrpihdMUXsiimsK6YoXTFF7IpZFmNnWYydxYydpRg7ixk7SzF2lmjsPGbsPMXYeaKx85ix8xRj54nGPm0x9mmLsU8zY59WjH2aGfu0YuzTorHLLMkvsyS/jCW/TEl+GUt+mZL8MjH5a350ipNOzW441TKcHiwVh6NTsxvKZGuElDXoqTk+PBewpR2OWtoN0ZaO91kRcG+opeN9903Qvd3gyxtJ54azLcMBu8LhqCvcUB5bI19Zg3ZFH2ZsH8XYPqKxfZixfRRj+4jGJlmMTbIYm8SMTVKMTWLGJinGJonGpliST7Ekn8KST1GST2HJpyjJp4jJD2FdMUTpiiFiVwxhXTFE6YohYldkWYzNshibxYzNUozNYsZmKcZmicaOY8aOU4wdJxo7jhk7TjF2nGjsJIuxkyzGTmLGTlKMncSMnaQYO0k0dqol+amW5Key5KcqyU9lyU9Vkp8qJt/oolOcdGp2w6mW4fRgqTgcnZrdUCZbI6SsQU/NTcJzAVva4ail3RBt6SY+KwLuDbV0E999E3Rvl/ryRtK54WzLcMCucDjqCjeUx9bIV9agXXElM/ZKxdgrRWOvZMZeqRh7pWhsnMXYOIuxcczYOMXYOGZsnGJsnGhsF0vyXSzJd2HJd1GS78KS76Ik30VMvifrip5KV/QUu6In64qeSlf0FLuiv8XY/hZj+zNj+yvG9mfG9leM7S8am8yMTVaMTRaNTWbGJivGJovG3mEx9g6LsXcwY+9QjL2DGXuHYuwdorHDLMkPsyQ/jCU/TEl+GEt+mJL8MDH5v0We4qRTsxtOtQynB0vF4ejU7IYy2RohZQ16aj4cngvY0g5HLe2GaEsf9lkRcG+opQ/77pugeyv35Y2kc8PZluGAXeFw1BVuKI+tka+sQbui9sWnuIDGOhwZ64aosW4uoLEOR8a6IWrsBeE5yVg3nG0ZDmisw5GxbiiPrZGvrEGNjbQkH2lJPpIlH6kkH8mSj1SSjxSTj2ZdEa10RbTYFdGsK6KVrogWu6KDxdgOFmM7MGM7KMZ2YMZ2UIztIBrbkRnbUTG2o2hsR2ZsR8XYjqKx3SzGdrMY240Z200xthsztptibDfR2N6W5Htbku/Nku+tJN+bJd9bSb63mPxr4WuXTs1uONUynB4sFYejU7MbymRrhJQ16Kn59fBcwJZ2OGppN0Rb+nWfFQH3hlr6dd99E3Rv7/nyRtK54WzLcMCucDjqCjeUx9bIV9agXbGXGbtXMXavaOxeZuxexdi9orGfWYz9zGLsZ8zYzxRjP2PGfqYY+5lo7DFL8scsyR9jyR9Tkj/Gkj+mJH9MTL5Gi1NcwK5wOOoKN0S7ws0F7AqHo65wQ7QrGoTntL8mEx7OtgwH/WsyYZz9NZnwUB5bI19ZgxrbjBnbTDG2mWhsM2ZsM8XYZqKxrSzGtrIY24oZ20oxthUztpVibCvR2BhL8jGW5GNY8jFK8jEs+Rgl+Rgx+f9seYqTTs1uONUynB4sFYejU7MbymRrhJQ16Kl5ZXguYEs7HLW0G6ItvdJnRcC9oZZe6btvgu5tnS9vJJ0bzrYMB+wKh6OucEN5bI18ZQ3aFZuZsZsVYzeLxm5mxm5WjN0sGrvVYuxWi7FbmbFbFWO3MmO3KsZuFY0tsyRfZkm+jCVfpiRfxpIvU5IvE5Pfxbpil9IVu8Su2MW6YpfSFbvErjhgMfaAxdgDzNgDirEHmLEHFGMPiMYeZcYeVYw9Khp7lBl7VDH2qGjsSYuxJy3GnmTGnlSMPcmMPakYe1I0tlYrQ/JuONsyHPQvZbcSkndDeWyNfGUNmvz0S09x0qnZDadahtODpeJwdGp2Q5lsjZCyBj0154TnAra0w1FLuyHa0jk+KwLuDbV0ju++Cbq3+b68kXRuONsyHLArHI66wg3lsTXylTVoVyxmxi5WjF0sGruYGbtYMXaxaOwKi7ErLMauYMauUIxdwYxdoRi7QjS20JJ8oSX5QpZ8oZJ8IUu+UEm+UEx+I+uKjUpXbBS7YiPrio1KV2wUu6LEYmyJxdgSZmyJYmwJM7ZEMbZENLaUGVuqGFsqGlvKjC1VjC0Vjd1hMXaHxdgdzNgdirE7mLE7FGN3iMbusSS/x5L8Hpb8HiX5PSz5PUrye8TkT1pOzSctp+aT7NR8Ujk1n2Sn5pPKqfmkeGquYC1dobR0hdjSFaylK5SWrhBbuu5lZ+aNpHPD2ZbhgF3hcNQVbiiPrZGvrEG7okl4Lujvrwvj7PfXhYfw768LzwX9/XVhHBnrhqixLSzGtrAY24IZ20IxtgUztoVibAvR2GhL8tGW5KNZ8tFK8tEs+Wgl+Wgx+VjWFbFKV8SKXRHLuiJW6YpYsSs6W4ztbDG2MzO2s2JsZ2ZsZ8XYzqKx3Zmx3RVju4vGdmfGdleM7S4am2gxNtFibCIzNlExNpEZm6gYmygaO9CS/EBL8gNZ8gOV5Aey5AcqyQ8Ukx/qezyi8NxwqmU4PVgqDken5qG+Jgi4RkhZg56aM1hLZygtnSG2dAZr6QylpTPElh5l6YpRlq4YxbpilNIVo1hXjFK6YpTYFROYsRMUYyeIxk5gxk5QjJ0gGvuwxdiHLcY+zIx9WDH2YWbsw4qxD4vG5liSz7Ekn8OSz1GSz2HJ5yjJ54jJz2NdMU/pinliV8xjXTFP6Yp5Ylcsthi72GLsYmbsYsXYxczYxYqxi0VjlzNjlyvGLheNXc6MXa4Yu1w0do3F2DUWY9cwY9coxq5hxq5RjF0jGrvOkvw6S/LrWPLrlOTXseTXKcmvE5PfZjk1b7OcmrexU/M25dS8jZ2atymn5m3iqfkd1tLvKC39jtjS77CWfkdp6XfElt5t6Yrdlq7Yzbpit9IVu1lX7Fa6YrfYFfuZsfsVY/eLxu5nxu5XjN0vGnvUYuxRi7FHmbFHFWOPMmOPKsYeFY09YUn+hCX5Eyz5E0ryJ1jyJ5TkT4jJ12l9igvYFQ5HXeGGaFe4uYBd4XDUFW4I/7798JxkrBvOtgwH/X37YZz9vv3wUB5bI19ZA/++fWZspGJspGhsJDM2UjE2UjQ2ymJslMXYKGZslGJsFDM2SjE2SjS2rSX5tpbk27Lk2yrJt2XJt1WSbysm3833eEThueFUy3B6sFQcjk7N3XxNEHCNkLIGPTUnsJZOUFo6QWzpBNbSCUpLJ4gt3d/SFf0tXdGfdUV/pSv6s67or3RFf7ErkpmxyYqxyaKxyczYZMXYZNHYdIux6RZj05mx6Yqx6czYdMXYdNHYDEvyGZbkM1jyGUryGSz5DCX5DDH50awrRitdMVrsitGsK0YrXTFa7IqJFmMnWoydyIydqBg7kRk7UTF2omjsFGbsFMXYKaKxU5ixUxRjp4jGzrQYO9Ni7Exm7EzF2JnM2JmKsTNFY+dakp9rSX4uS36ukvxclvxcJfm5YvIFllNzgeXUXMBOzQXKqbmAnZoLlFNzgXhqfoG19AtKS78gtvQLrKVfUFr6BbGlN1i6YoOlKzawrtigdMUG1hUblK7YIHbFFmbsFsXYLaKxW5ixWxRjt4jGvm4x9nWLsa8zY19XjH2dGfu6YuzrorFvW5J/25L82yz5t5Xk32bJv60k/7aY/G7WFbuVrtgtdsVu1hW7la7YLXbFQYuxBy3GHmTGHlSMPciMPagYe1A09nNm7OeKsZ+Lxn7OjP1cMfZz0dhyi7HlFmPLmbHlirHlzNhyxdhy0djaUYbk3XC2ZThg8g5HybuhPLYGSt4N0eQvCc9Jp2Y3nGoZTg+WisPRqdkNZbI10KnZDdFTc6vwXMCWdjhqaTdEW9rNBWxph6OWbuW7b4Lu7eqoM/NG0rnhbMtwwK5wOOoKN5TH1kBd4YZoV8SH5wIa63BkrBuixrq5gMY6HBnrhqix14fnJGPdcLZlOKCxDkfGuqE8tgYy1g1RY3tFGZLvZUm+F0u+l5J8L5Z8LyX5XmLyPw/PBewKh6OucEO0K9xcwK5wOOoKN0S7IiU8JxnrhrMtwwGNdTgy1g3lsTWQsW6IGjs4PBfQWIcjY90QNdbNBTTW4chYN0SNvSc8JxnrhrMtwwGNdTgy1g3lsTWQsW6IGjsqypD8KEvyo1jyo5TkR7HkRynJjxKTzwnPSadmN5xqGU4PlorD0anZDWWyNdCp2Q3RU/Os8FzAlnY4amk3RFvazQVsaYejlp7lu28C/+WpqDPzRtK54WzLcNC/PBXG2V+eCg/lsTXYX54KD+G/PBWeC/qXp8I4+8tT4SH8l6fCc0H/8lQYR8a6IWrsf4bnJGPdcLZlOKCxDkfGuqE8tgYy1g1RY9dEGZJfY0l+DUt+jZL8Gpb8GiX5NWLyG8JzAbvC4agr3BDtCjcXsCscjrrCDdGueCU8JxnrhrMtwwGNdTgy1g3lsTWQsW6IGvvf4bmAxjocGeuGqLFuLqCxDkfGuiFq7PbwnGSsG862DAc01uHIWDeUx9ZAxrohauyuKEPyuyzJ72LJ71KS38WS36Ukv0tM/svwnHRqdsOpluH0YKk4HJ2a3VAmWwOdmt0QPTV/HZ4L2NIORy3thmhLu7mALe1w1NJf++6bwL/L5fIz80bSueFsy3DArnA46go3lMfWyFfWoF3RKDwX0FiHI2PdEDXWzQU01uHIWDdEjb3YYuzFFmMvZsZerBh7MTP2YsXYi0VjoyzJR1mSj2LJRynJR7Hko5Tko8Tk27OuaK90RXuxK9qzrmivdEV7sSs6WYztZDG2EzO2k2JsJ2ZsJ8XYTqKx3Zix3RRju4nGdmPGdlOM7SYa28dibB+LsX2YsX0UY/swY/soxvYRjR1gSX6AJfkBLPkBSvIDWPIDlOQHiMln+B6PKDw3nGoZTg+WisPRqTnD1wQB1wgpa9BT872spe9VWvpesaXvZS19r9LS94otPdbSFWMtXTGWdcVYpSvGsq4Yq3TFWLErJjJjJyrGThSNnciMnagYO1E09hGLsY9YjH2EGfuIYuwjzNhHFGMfEY2daUl+piX5mSz5mUryM1nyM5XkZ4rJz2ddMV/pivliV8xnXTFf6Yr5YlcssRi7xGLsEmbsEsXYJczYJYqxS0Rjn2PGPqcY+5xo7HPM2OcUY58TjS20GFtoMbaQGVuoGFvIjC1UjC0UjV1vSX69Jfn1LPn1SvLrWfLrleTXi8mX+h6PKDw3nGoZTg+WisPRqbnU1wQB1wgpa9BT8zbW0tuUlt4mtvQ21tLblJbeJrb0bktX7LZ0xW7WFbuVrtjNumK30hW7xa7Yz4zdrxi7XzR2PzN2v2LsftHYLyzGfmEx9gtm7BeKsV8wY79QjP1CNLbckny5Jflylny5knw5S75cSb5cTP786FNcwK5wOOoKN0S7ws0F7AqHo65wQ7QrmobnJGPdcLZlOKCxDkfGuqE8tka+sgb+DT/M2EsUYy8Rjb2EGXuJYuwlorHRFmOjLcZGM2OjFWOjmbHRirHRorHtLMm3syTfjiXfTkm+HUu+nZJ8OzH5Xr7HIwrPDadahtODpeJwdGru5WuCgGuElDXoqfkm1tI3KS19k9jSN7GWvklp6ZvElk6ydEWSpSuSWFckKV2RxLoiSemKJLErUpixKYqxKaKxKczYFMXYFNHYuyzG3mUx9i5m7F2KsXcxY+9SjL1LNPYeS/L3WJK/hyV/j5L8PSz5e5Tk7xGTH8u6YqzSFWPFrhjLumKs0hVjxa6YZDF2ksXYSczYSYqxk5ixkxRjJ4nGTmXGTlWMnSoaO5UZO1UxdqpobK7F2FyLsbnM2FzF2FxmbK5ibK5o7OOW5B+3JP84S/5xJfnHWfKPK8k/Lia/0nJqXmk5Na9kp+aVyql5JTs1r1ROzSvFU3MBa+kCpaULxJYuYC1doLR0gdjSGyxdscHSFRtYV2xQumID64oNSldsELtiCzN2i2LsFtHYLczYLYqxW0Rj37AY+4bF2DeYsW8oxr7BjH1DMfYN0djtluS3W5LfzpLfriS/nSW/XUl+u5j8XtYVe5Wu2Ct2xV7WFXuVrtgrdsUhi7GHLMYeYsYeUow9xIw9pBh7SDT2S2bsl4qxX4rGfsmM/VIx9kvR2AqLsRUWYyuYsRWKsRXM2ArF2ArR2POuMCTvhrMtwwGTdzhK3g3lsTXylTXw70sJz0mnZjecahlOD5aKw9Gp2Q1lsjVCyhr01HxFeC5gSzsctbQboi19hc+KgHtDLX2F774JurdYS1fEWroilnVFrNIVsawrYpWuiBW7ohMztpNibCfR2E7M2E6KsZ1EY2+wGHuDxdgbmLE3KMbewIy9QTH2BtHYPpbk+1iS78OS76Mk34cl30dJvo+YfBLriiSlK5LErkhiXZGkdEWS2BW3W4y93WLs7czY2xVjb2fG3q4Ye7to7N3M2LsVY+8Wjb2bGXu3YuzdorEhi7Ehi7EhZmxIMTbEjA0pxoZEY8dYkh9jSX4MS36MkvwYlvwYJfkxYvLTLafm6ZZT83R2ap6unJqns1PzdOXUPF08Neewls5RWjpHbOkc1tI5SkvniC0939IV8y1dMZ91xXylK+azrpivdMV8sSsWM2MXK8YuFo1dzIxdrBi7WDR2hcXYFRZjVzBjVyjGrmDGrlCMXSEaW2hJvtCSfCFLvlBJvpAlX6gkXygmv5F1xUalKzaKXbGRdcVGpSs2il1RYjG2xGJsCTO2RDG2hBlbohhbIhpbyowtVYwtFY0tZcaWKsaWisbusBi7w2LsDmbsDsXYHczYHYqxO0Rj91iS32NJfg9Lfo+S/B6W/B4l+T1i8uWWU3O55dRczk7N5cqpuZydmsuVU3O5eGr+hrX0N0pLfyO29Despb9RWvobsaXrxZyZN5LODWdbhgN2hcNRV7ihPLZGvrIG7Yqm4bmAxjocGeuGqLFuLqCxDkfGuiFqbAuLsS0sxrZgxrZQjG3BjG2hGNtCNDbakny0Jflolny0knw0Sz5aST5aTD6WdUWs0hWxYlfEsq6IVboiVuyKzhZjO1uM7cyM7awY25kZ21kxtrNobHdmbHfF2O6isd2Zsd0VY7uLxiZajE20GJvIjE1UjE1kxiYqxiaKxg60JD/QkvxAlvxAJfmBLPmBSvIDxeSH+h6PKDw3nGoZTg+WisPRqXmorwkCrhFS1qCn5gzW0hlKS2eILZ3BWjpDaekMsaXHWrpirKUrxrKuGKt0xVjWFWOVrhgrdsVEZuxExdiJorETmbETFWMnisZOsxg7zWLsNGbsNMXYaczYaYqx00Rjcy3J51qSz2XJ5yrJ57Lkc5Xkc8XkF7CuWKB0xQKxKxawrligdMUCsSuWWoxdajF2KTN2qWLsUmbsUsXYpaKxK5mxKxVjV4rGrmTGrlSMXSkau9Zi7FqLsWuZsWsVY9cyY9cqxq4VjX3JkvxLluRfYsm/pCT/Ekv+JSX5l8Tkt1tOzdstp+bt7NS8XTk1b2en5u3KqXm7eGp+j7X0e0pLvye29Huspd9TWvo9saX3Wbpin6Ur9rGu2Kd0xT7WFfuUrtgndsUhZuwhxdhDorGHmLGHFGMPicYesxh7zGLsMWbsMcXYY8zYY4qxx0RjKyzJV1iSr2DJVyjJV7DkK5TkK8Tk6115igvYFQ5HXeGGaFe4uYBd4XDUFW6IdkWz8JxkrBvOtgwHNNbhyFg3lMfWyFfWoMa2ZMa2VIxtKRrbkhnbUjG2pWhsjMXYGIuxMczYGMXYGGZsjGJsjGhsB0vyHSzJd2DJd1CS78CS76Ak30FMvofv8YjCc8OpluH0YKk4HJ2ae/iaIOAaIWUNemruxVq6l9LSvcSW7sVaupfS0r3Elk6ydEWSpSuSWFckKV2RxLoiSemKJLErUpixKYqxKaKxKczYFMXYFNHYIRZjh1iMHcKMHaIYO4QZO0QxdohobMiSfMiSfIglH1KSD7HkQ0ryITH5+1hX3Kd0xX1iV9zHuuI+pSvuE7tissXYyRZjJzNjJyvGTmbGTlaMnSwaO50ZO10xdrpo7HRm7HTF2OmisbMtxs62GDubGTtbMXY2M3a2Yuxs0dgnLMk/YUn+CZb8E0ryT7Dkn1CSf0JMvtByai60nJoL2am5UDk1F7JTc6Fyai4UT80vspZ+UWnpF8WWfpG19ItKS78otnSxpSuKLV1RzLqiWOmKYtYVxUpXFItdUcKMLVGMLRGNLWHGlijGlojGvmkx9k2LsW8yY99UjH2TGfumYuyborE7LMnvsCS/gyW/Q0l+B0t+h5L8DjH5fawr9ildsU/sin2sK/YpXbFP7IrDFmMPW4w9zIw9rBh7mBl7WDH2sGjsV8zYrxRjvxKN/YoZ+5Vi7FeisRFtTnGSsW442zIc0FiHI2PdUB5bAxnrhqixdS3J17UkX5clX1dJvi5Lvq6SfF0x+UvDc9Kp2Q2nWobTg6XicHRqdkOZbI2QsgY9NUeF5wK2tMNRS7sh2tJRPisC7g21dJTvvgn8u1wsXRFr6YpY1hWxSlfEsq6IVboiVuyKTszYToqxnURjOzFjOynGdhKNTbAYm2AxNoEZm6AYm8CMTVCMTRCNTbQkn2hJPpEln6gkn8iST1SSTxSTv4V1xS1KV9widsUtrCtuUbriFrEr0izGplmMTWPGpinGpjFj0xRj00RjhzJjhyrGDhWNHcqMHaoYO1Q0NstibJbF2CxmbJZibBYzNksxNks0dpwl+XGW5Mex5McpyY9jyY9Tkh8nJp9rOTXnWk7NuezUnKucmnPZqTlXOTXniqfmOayl5ygtPUds6TmspecoLT1HbOmFlq5YaOmKhawrFipdsZB1xUKlKxaKXbGUGbtUMXapaOxSZuxSxdilorGrLMaushi7ihm7SjF2FTN2lWLsKtHYtZbk11qSX8uSX6skv5Ylv1ZJfq2YfDHrimKlK4rFrihmXVGsdEWx2BWvWYx9zWLsa8zY1xRjX2PGvqYY+5po7FvM2LcUY98SjX2LGfuWYuxborE7LcbutBi7kxm7UzF2JzN2p2LsTtHYjyzJf2RJ/iOW/EdK8h+x5D9Skv9ITP645dR83HJqPs5OzceVU/Nxdmo+rpyaj4un5nLW0uVKS5eLLV3OWrpcaelysaXrXXVm3kg6N5xtGQ76l6fCOPvLU+GhPLZGvrIG7Yqm4bmgf3kqjCNj3RD+y1PhuaB/eSqMI2PdEDW2lcXYVhZjWzFjWynGtmLGtlKMbSUaG2NJPsaSfAxLPkZJPoYlH6MkHyMmfy3rimuVrrhW7IprWVdcq3TFtWJXdLUY29VibFdmbFfF2K7M2K6KsV1FY3swY3soxvYQje3BjO2hGNtDNLavxdi+FmP7MmP7Ksb2Zcb2VYztKxo7yJL8IEvyg1jyg5TkB7HkBynJDxKTD/kejyg8N5xqGU4PlorD0ak55GuCgGuElDXoqXkEa+kRSkuPEFt6BGvpEUpLjxBberylK8ZbumI864rxSleMZ10xXumK8WJXTGbGTlaMnSwaO5kZO1kxdrJo7KMWYx+1GPsoM/ZRxdhHmbGPKsY+Kho725L8bEvys1nys5XkZ7PkZyvJzxaTX8i6YqHSFQvFrljIumKh0hULxa541mLssxZjn2XGPqsY+ywz9lnF2GdFY59nxj6vGPu8aOzzzNjnFWOfF40tshhbZDG2iBlbpBhbxIwtUowtEo3dZEl+kyX5TSz5TUrym1jym5TkN4nJl1lOzWWWU3MZOzWXKafmMnZqLlNOzWXiqXk7a+ntSktvF1t6O2vp7UpLbxdbep+lK/ZZumIf64p9SlfsY12xT+mKfWJXHGLGHlKMPSQae4gZe0gx9pBo7NcWY7+2GPs1M/ZrxdivmbFfK8Z+LRob0daQvBvOtgwH/U01bYXk3VAeW4P9ppq2WvINwnMBu8LhqCvcEO0KNxewKxyOusIN0a5objG2ucXY5szY5oqxzZmxzRVjm4vGXsqMvVQx9lLR2EuZsZcqxl4qGtvGYmwbi7FtmLFtFGPbMGPbKMa2EY29xpL8NZbkr2HJX6Mkfw1L/hol+WvE5BN9j0cUnhtOtQynB0vF4ejUnOhrgoBrhJQ16Km5H2vpfkpL9xNbuh9r6X5KS/cTWzrZ0hXJlq5IZl2RrHRFMuuKZKUrksWuSGPGpinGponGpjFj0xRj00Rjh1mMHWYxdhgzdphi7DBm7DDF2GGisVmW5LMsyWex5LOU5LNY8llK8lli8uNZV4xXumK82BXjWVeMV7pivNgVD1mMfchi7EPM2IcUYx9ixj6kGPuQaOxjzNjHFGMfE419jBn7mGLsY6Kx+RZj8y3G5jNj8xVj85mx+Yqx+aKxT1qSf9KS/JMs+SeV5J9kyT+pJP+kmPxqy6l5teXUvJqdmlcrp+bV7NS8Wjk1rxZPzYWspQuVli4UW7qQtXSh0tKFYksXW7qi2NIVxawripWuKGZdUax0RbHYFSXM2BLF2BLR2BJmbIlibIlo7DaLsdssxm5jxm5TjN3GjN2mGLtNNHanJfmdluR3suR3KsnvZMnvVJLfKSb/CeuKT5Su+ETsik9YV3yidMUnYlccsRh7xGLsEWbsEcXYI8zYI4qxR0RjjzNjjyvGHheNPc6MPa4Ye1w0tubVpzjJWDecbRkOaKzDkbFuKI+tka+sQY2tb0m+viX5+iz5+kry9Vny9ZXk64vJx4TnpFOzG061DKcHS8Xh6NTshjLZGiFlDXpqvio8F7ClHY5a2g3Rlr7KZ0XAvaGWvsp33wTdW7ylK+ItXRHPuiJe6Yp41hXxSlfEi13RlRnbVTG2q2hsV2ZsV8XYrqKxN1qMvdFi7I3M2BsVY29kxt6oGHujaGxfS/J9Lcn3Zcn3VZLvy5LvqyTfV0w+mXVFstIVyWJXJLOuSFa6Ilnsijstxt5pMfZOZuydirF3MmPvVIy9UzR2ODN2uGLscNHY4czY4Yqxw0VjR1qMHWkxdiQzdqRi7Ehm7EjF2JGisfdbkr/fkvz9LPn7leTvZ8nfryR/v5j8DMupeYbl1DyDnZpnKKfmGezUPEM5Nc8QT825rKVzlZbOFVs6l7V0rtLSuWJLL7R0xUJLVyxkXbFQ6YqFrCsWKl2xUOyKpczYpYqxS0VjlzJjlyrGLhWNLbAYW2AxtoAZW6AYW8CMLVCMLRCNLbIkX2RJvoglX6QkX8SSL1KSLxKTf5l1xctKV7wsdsXLrCteVrriZbErtlqM3Woxdiszdqti7FZm7FbF2K2isWXM2DLF2DLR2DJmbJlibJlo7AcWYz+wGPsBM/YDxdgPmLEfKMZ+IBr7sSX5jy3Jf8yS/1hJ/mOW/MdK8h+LyUe0O8VJp2Y3nGoZTg+WisPRqdkNZbI10KnZDdFTc63wXMCWdjhqaTdEW7qWz4qAe0MtXct33wTdWyNf3kg6N5xtGQ7YFQ5HXeGG8tga+coatCuaM2ObK8Y2F41tzoxtrhjbXDT2Mouxl1mMvYwZe5li7GXM2MsUYy8TjW1jSb6NJfk2LPk2SvJtWPJtlOTbiMnHs66IV7oiXuyKeNYV8UpXxItdcZ3F2Ossxl7HjL1OMfY6Zux1irHXicb2ZMb2VIztKRrbkxnbUzG2p2jszRZjb7YYezMz9mbF2JuZsTcrxt4sGnurJflbLcnfypK/VUn+Vpb8rUryt4rJZ1pOzZmWU3MmOzVnKqfmTHZqzlROzZniqTnEWjqktHRIbOkQa+mQ0tIhsaXHW7pivKUrxrOuGK90xXjWFeOVrhgvdsVkZuxkxdjJorGTmbGTFWMni8bmWIzNsRibw4zNUYzNYcbmKMbmiMbmW5LPtySfz5LPV5LPZ8nnK8nni8kvYl2xSOmKRWJXLGJdsUjpikViVyy3GLvcYuxyZuxyxdjlzNjlirHLRWNXM2NXK8auFo1dzYxdrRi7WjR2ncXYdRZj1zFj1ynGrmPGrlOMXScau9mS/GZL8ptZ8puV5Dez5DcryW8Wk99pOTXvtJyad7JT807l1LyTnZp3KqfmneKp+UPW0h8qLf2h2NIfspb+UGnpD8WW3m/piv2WrtjPumK/0hX7WVfsV7piv9gVR5ixRxRjj4jGHmHGHlGMPSIae8Ji7AmLsSeYsScUY08wY08oxp4Qja3Z3pC8G862DAf9TTXtheTdUB5bI19ZgybfKDwXsCscjrrCDdGucHMBu8LhqCvcEO2KSIuxkRZjI5mxkYqxkczYSMXYSNHY1szY1oqxrUVjWzNjWyvGthaNbWsxtq3F2LbM2LaKsW2ZsW0VY9uKxsZZko+zJB/Hko9Tko9jyccpyceJyff2PR5ReG441TKcHiwVh6NTc29fEwRcI6SsQU/NiaylE5WWThRbOpG1dKLS0oliSydbuiLZ0hXJrCuSla5IZl2RrHRFstgVaczYNMXYNNHYNGZsmmJsmmhshsXYDIuxGczYDMXYDGZshmJshmjsSEvyIy3Jj2TJj1SSH8mSH6kkP1JM/gHWFQ8oXfGA2BUPsK54QOmKB8SumGIxdorF2CnM2CmKsVOYsVMUY6eIxs5gxs5QjJ0hGjuDGTtDMXaGaOxci7FzLcbOZcbOVYydy4ydqxg7VzT2KUvyT1mSf4ol/5SS/FMs+aeU5J9Skq8dhiaHP9aNOH1JCP9TeYmzXDrGdTyv8krCi9WKOPNSs/Kf8Pfcx6h//NMg/L0Iz2wDz3wNz9fc7XDz5//jn3oRnpnap9eqvDT1fK2G57afF3F6/YTquO3xcXE1w/vx3Ixvr7tmeG8RnnUrwl+vVwVfub/6nn+vlv39Y4cNIs68372ZRHjWcxdvrg0jzsy18nouqP49xlXup0n4uuqEr/cC334q127q2X81rR3vXbtG+B+3jvt6bc/nURGnL00932/oyc1dLvTk17SK7zfyrNuwipnGPq5umL3Qcx0JEafvX5dZYw/T2MM2PMt+63pmEiKqN98LfPu9wHdb63g+r+vZU3Xvo75vH/V9GXgfs/7Hstuz/7HcqAq+riff6rwNlXvz3p+Vl7M9lht5bp/z1/Vr5R6bVf8ev30s/yh8Xe6x3My3n8q1m3v2X01rx3vXdo9lt477em3P510iTl+ae77vsvJ6e1H4Y00P6/3+hZ51m1Qx09THucfyRZ7rSIg4ff+6zBp7mKYetslZ9lvXM5MQUb35NvPtt5nvtlbe5+08+zgHzxfx3r50192wigyanoO1G0Sceb9XXs72GGxaxX6q0fm4xp79eNdqco5u+4URwW+724P3+aiqPUZV3x7jKvdYx7d+5b/38ey3qefrUR6+tuejY/p72J+FP28Ucfpx6rL3etHY87WaPq5eeL6qPjjPs8eE6smjyp9v3Dren18cM8hzeyd49nYO7qt4731RI3zd7j7w7tnt97ww4+0+99Ext/nmvRfvdbn1vC64rzfzree+583LMbefZb2avuuqvCSE1/iu50h3lvB2eHX74H2u8+7lIs/XHTP4LLfPe13+21GviusaEvC6IiLO/LnW+/OD26v354fzvmMPDTyM977zznhvs2Pu+R/22fQ71mtUxXX9KuB1RURU/fzfKOKfH69eRyvXqszJ5eLYc/kzlncf3vutWRW3f0z4Y2VW46vYf53v2L/3ea2Z5zY1Owe3yfv81KyK/f6ru9Bdt/95rKourKqbHDPJN++9NKhi1vs8GfLcXndJiKi214x+4n3NqEYVe3PPmxGe13zO93y/hu81n29nfK9BNa2Cq3v6Kqv1daC6njyr7Xrjfvzt60vefnP3Q+XX658Z0f87k9atgq/8Wj3Pv1fP/k79TOjuF3c528+Ebm8NIs48d7vvNa7+PcZ5X4Nwnd3Ytx/v47q6+/ICz/V6fx5zX6/t+bx1xOmL9+ccl5X3NYymnvyaVPH9hp51G1Qx08jHuTOp/znJ3b+NPR8d08jDNjjLfs/VeaxGxJmviSR4/t3ba95zx7l4nbVyH/V8+6hXRQaNzsHaDSLOvN8rL0FeF/Lup6L69vPtmbR+FWudi9f1vK9TB7ntbg+NPXPePZ6D/on3dl2QPTauYj/VeP98+/NOgyrWOhev7Xv/m463g3/sWbd2ta8b/23n1/Gsl+DZh/fc6JhuHvan4c8bRfxzjzXyfO59Dd3/enrlR//j3/tzjZd3+6rn+djIszc3X8Ozd/9t8v7c39jDJ4Q/j7Ndvu037/nGu5fGnq87pmf443edexp9x+2oW8V19Ql4XRERZz5fuetsFHF6r46t6rX7Ch/rfcxecJY5/+d1fDPePqxdxZ68z7/V/xg887Hgrtv/mPTmeJ6P8b4+5phbwh+D3r91PNftGO/PN94Zr0+O+Z9e12nyHevVreK6UgNeV0TEmT6562wUcXqvjq3p+37lpcLHen0625z/c/9rYlU9d1W1jvdn2mp7/vjHWce7p5pVZOF9fqnt2cu5+NnH20Puur2P+8qL13+/21U9F5zt9Z8GVcx6n8+We25vRHXf3n+T91o09u3J5VGnuvMI3//eS4Ln8zpV7KfW92w/tb9n+6nxPdhPg4iqXxNy3/e+5uOeT2p5vuZ/P47Xf+8a/p+dvP6f7/kYX8V6NatY77wquH9Fnv7/buR/vaiRZx/nfU/2U/t7tp9a37P91PTtx/v9Op7v1/Jcl/e1rMp/9//c4n0MeV+H8z826kX88H457+WH98udzqeq/558tvfLJUacvvzwfrlg+QZ5v9z/8uzjh/fLVX0bfni/3Nnz8a4d5P1y6RGnLz+8Xy5YvkHeLzfIs48f3i/3z/upRud/eL+c7/Jd75fL8uyXvF9urIf9dfjz/5/fLzfBc3v/w7O3f5f3y53tPSLn4v1yD51lvZoR//7vl5t+ltvnva4g75fLCXhdERFn/lz7r36/3Oz/YZ/k/XK/C3hdERFVP///u79f7snwx8qsFlex/+/z++UWez7/V3ahu27r++We9c17L9/1fjn3POl/DdCt771UZuGe36rz/RaV1+H/b3URnrVqR1T9+laN6t9LvPf21or45wyaVpHP/wXUWXy7+QgrAA=="
+};
+
+export const transaction_wrapper: CompiledCircuit = {
+    "abi": {
+        "parameters": [
+            {
+                "name": "public_inputs_hash",
+                "type": {
+                    "kind": "field"
+                },
+                "visibility": "public"
+            },
+            {
+                "name": "transaction_verifier",
+                "type": {
+                    "kind": "struct",
+                    "path": "helpers::structs::VerifierTx",
+                    "fields": [
+                        {
+                            "name": "key_hash",
+                            "type": {
+                                "kind": "field"
+                            }
+                        },
+                        {
+                            "name": "verification_key",
+                            "type": {
+                                "kind": "array",
+                                "length": 114,
+                                "type": {
+                                    "kind": "field"
+                                }
+                            }
+                        },
+                        {
+                            "name": "proof",
+                            "type": {
+                                "kind": "array",
+                                "length": 93,
+                                "type": {
+                                    "kind": "field"
+                                }
+                            }
+                        }
+                    ]
+                },
+                "visibility": "private"
+            }
+        ],
+        "param_witnesses": {
+            "public_inputs_hash": [
+                {
+                    "start": 0,
+                    "end": 1
+                }
+            ],
+            "transaction_verifier": [
+                {
+                    "start": 1,
+                    "end": 209
+                }
+            ]
+        },
+        "return_type": null,
+        "return_witnesses": []
+    },
+    "bytecode": "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"
+};
+
+export const txVk: string[] = ["0x2e592c2ade5527a4aaa1a68b75bdff97876a8bc89c8d41a704f1e2b23a82b698", "0x19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e0", "0x0000000000000000000000000000000000000000000000000000000000040000", "0x0000000000000000000000000000000000000000000000000000000000000005", "0x0000000000000000000000000000000000000000000000000000000000040000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000002a8e4638fe890cb43aca194c43c794c145", "0x00000000000000000000000000000000000fc379c77a020ebe6facbad763de76", "0x000000000000000000000000000000eeb6057fa6ac1da4b77880242c8c3b05c9", "0x0000000000000000000000000000000000297cfb0a0650b7ed60ddb1c63a15e6", "0x000000000000000000000000000000ce88227a4bf7754b638b9237a9bc5fe3da", "0x0000000000000000000000000000000000236dceba50da931a369c4be1401026", "0x000000000000000000000000000000728c97969f92c442167450b9ef6ac18d9c", "0x0000000000000000000000000000000000264b94274f11d130fcdb1ddf507f33", "0x0000000000000000000000000000004301542287a1e249b63089dcfa48498644", "0x0000000000000000000000000000000000227ddd84179aac0294c9163b990cb7", "0x000000000000000000000000000000a2a4d84c82bf735b5c1b3858023151ef2a", "0x00000000000000000000000000000000000e7057cad36abe675d10c487eecb24", "0x0000000000000000000000000000004976a738a8f7b23aab0cf7f6f911c2b4d6", "0x0000000000000000000000000000000000056a2544ff213cdf11f5eb671c62ca", "0x000000000000000000000000000000e67ff9fbedee8d0a7f9f690b214ca64484", "0x0000000000000000000000000000000000215d4a78379930402b628e6856fcdf", "0x0000000000000000000000000000002fec1fa4dd765e6a0aacc5a9b921d4bc9a", "0x0000000000000000000000000000000000227a63de3b66cdce0e299d8ef18908", "0x00000000000000000000000000000019097eb1909f84949efa64912166db0f9e", "0x00000000000000000000000000000000002aa055b0785af28e6a415c5aa30b59", "0x0000000000000000000000000000008dfcaf909c6e19977027cac02866068624", "0x000000000000000000000000000000000010299e08de0cbd3b5073c4f9ed0a03", "0x000000000000000000000000000000b92e0032b2f62145978a0523936f4b17b4", "0x00000000000000000000000000000000000282e1565f5f1b49267d76f5e8d061", "0x0000000000000000000000000000008972e372748f5b508cb8f5bb3ef8e50280", "0x000000000000000000000000000000000018c81e10aaa2c8645e5fa5de02ce4f", "0x0000000000000000000000000000009f58065ce4bfacc7ebc9a3efcaf7e2df8a", "0x00000000000000000000000000000000000f032bf323ffa61eb61f2c0e2d0e64", "0x000000000000000000000000000000b1958c9a035ec70f483be5d660ff5bbfc7", "0x00000000000000000000000000000000000aa01c4d94918f12fdb472e0a48c6a", "0x000000000000000000000000000000dbca85061f0cbc80faec1d4172c4950eae", "0x0000000000000000000000000000000000016cca75f7649a48d54f13201425ab", "0x000000000000000000000000000000cb98ffdd6c305efe2b96de6052bb928cb9", "0x000000000000000000000000000000000006698cb6b134db7043bb0a19772df1", "0x00000000000000000000000000000065df11b87c6a8edbbf1a3e2d307870e124", "0x00000000000000000000000000000000002f9e8b045390ff035dd03626890011", "0x000000000000000000000000000000ee587a3108b7b7f3bca8aad8a29233ad1c", "0x00000000000000000000000000000000001bed1483f3b48d1edfd50fe8107d8d", "0x000000000000000000000000000000b1c8e58aa7f9bcfa6130fd93ba7aab9362", "0x000000000000000000000000000000000028d9eb2b3b0a612043278aaa2a2c44", "0x0000000000000000000000000000002c2d9a3de66255084a4bb7730f65ef8c1a", "0x0000000000000000000000000000000000044564fba61d2ea7c2f453b84cb185", "0x00000000000000000000000000000099d2fbb99c623d9123be965199f8cb5d3b", "0x000000000000000000000000000000000015f52ff3f4ce480955c71fb245313e", "0x00000000000000000000000000000011ea2fc35f4045603afc750534c08dd373", "0x00000000000000000000000000000000001cfb8d903a6634fa0e6a242e51a831", "0x000000000000000000000000000000e79549b3f91a371da96d0e8da4b358fa4d", "0x00000000000000000000000000000000001cdfaca9f18fcd5d01020f2e670724", "0x000000000000000000000000000000e4bfc9c2c620a1838eed970f550198579d", "0x00000000000000000000000000000000001ba0949ff199218bc6807cbf372621", "0x00000000000000000000000000000002ab1af04948521d990480572148201ad7", "0x000000000000000000000000000000000024c4985645b110cc8ff358e8fbd533", "0x0000000000000000000000000000006c591a583a07e9d00466445ccaf56eef4b", "0x0000000000000000000000000000000000287dab85bc4dbc397de6ce17a70c2c", "0x000000000000000000000000000000fdfac2966f06782c46e83e62a0ed3f9f36", "0x0000000000000000000000000000000000056a4a40511eba9e7733d56791970a", "0x000000000000000000000000000000da65d2bda0fbe3f3fba50e51e64b8834b0", "0x00000000000000000000000000000000001e4d70a799e115231b6bade5b5c0a1", "0x000000000000000000000000000000dbd23932a54bed3f89432635503222faa9", "0x00000000000000000000000000000000002fe8339867a24a287e0ac43003856e", "0x000000000000000000000000000000bdec694d9ed21e653c9e407cb9819a65d6", "0x0000000000000000000000000000000000055ed855db256e5b4f8a06c1efb875", "0x00000000000000000000000000000003f1f66e07d1ffb03288efecacf884cb55", "0x00000000000000000000000000000000001ee61fb43eecca1e6de550ef663662", "0x0000000000000000000000000000006a91cb9b127b4df21a841b3d522e20cbb3", "0x000000000000000000000000000000000014b7078c4edeb2d7bfa70fe8f45387", "0x0000000000000000000000000000004bdc4a150e56380a29758003563dcb8abb", "0x0000000000000000000000000000000000215cbdfcaac938aca1d60562f8ee94", "0x0000000000000000000000000000009d1efca3006a8f2f62e82269704a080668", "0x0000000000000000000000000000000000217044aeae4265324cae6b6497135d", "0x000000000000000000000000000000648414f086df6a6d51c5fcc682e1d236fd", "0x000000000000000000000000000000000019b82be10a8ce8bc808b3f4a68eb62", "0x000000000000000000000000000000a9ab3db5fc581680802619b5ef2bcc0dd8", "0x0000000000000000000000000000000000192d388bd495bed2e5e9ba5cf2e162", "0x0000000000000000000000000000000d841571d0d8f6c515d6a89878008e0e71", "0x0000000000000000000000000000000000137c5ef4cd039774daf5897a894ca0", "0x000000000000000000000000000000f491336163c054d1fda0e7d6d205ac3d51", "0x00000000000000000000000000000000002a3d9e1d726f057480b18c3e768b7d", "0x000000000000000000000000000000abaf8de11e9c38874587792459a10ac601", "0x00000000000000000000000000000000000d0c9f725f52c7de5af92d699a4679", "0x0000000000000000000000000000009ad52f5fd10d116b84c23afad5654a4634", "0x000000000000000000000000000000000011366ef4cc5ca4043f9ebecd45938c", "0x0000000000000000000000000000005b0e3524d14b0499abb7019191c6c2d968", "0x00000000000000000000000000000000002000ff961349d9c559fd25e1b68156", "0x000000000000000000000000000000ac2b6e35506e7b4ab39165c78a9e22f959", "0x000000000000000000000000000000000015544496733c4c498deeb2093f7e63", "0x000000000000000000000000000000be09ebbd30043936e78435dd3f50cc6ac3", "0x000000000000000000000000000000000002d26517af1fdf0b77a5c31840d282", "0x0000000000000000000000000000007ff81caf53b14e78d558f322f923ec3967", "0x00000000000000000000000000000000002b3912052d2f780d0e1eae7ee01bdb", "0x0000000000000000000000000000001bda48577269dfcf7b4a75228d8e7c6325", "0x000000000000000000000000000000000002c116ba8b423ace60212194aefe73"]
\ No newline at end of file
diff --git a/momiji-helpers/utils/typechain-types/@chainlink/contracts/index.ts b/momiji-helpers/utils/typechain-types/@chainlink/contracts/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f68cafedd41e648db7f7dac20d8eae3208591b06
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@chainlink/contracts/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as src from "./src";
+export type { src };
diff --git a/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/index.ts b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0d87d23101a48d507d78cdab548da7a2c32f3211
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as v08 from "./v0.8";
+export type { v08 };
diff --git a/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/index.ts b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..92159233f80a824de74163d927a22ffa7734c206
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as interfaces from "./interfaces";
+export type { interfaces };
diff --git a/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.ts b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f7fb821bdf5aae3c1cf875ce89c5f6f9b92ea1e2
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.ts
@@ -0,0 +1,233 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface AggregatorInterfaceInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "getAnswer"
+      | "getTimestamp"
+      | "latestAnswer"
+      | "latestRound"
+      | "latestTimestamp"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "AnswerUpdated" | "NewRound"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "getAnswer",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getTimestamp",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestAnswer",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestRound",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestTimestamp",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(functionFragment: "getAnswer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getTimestamp",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestAnswer",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestRound",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestTimestamp",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace AnswerUpdatedEvent {
+  export type InputTuple = [
+    current: BigNumberish,
+    roundId: BigNumberish,
+    updatedAt: BigNumberish
+  ];
+  export type OutputTuple = [
+    current: bigint,
+    roundId: bigint,
+    updatedAt: bigint
+  ];
+  export interface OutputObject {
+    current: bigint;
+    roundId: bigint;
+    updatedAt: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace NewRoundEvent {
+  export type InputTuple = [
+    roundId: BigNumberish,
+    startedBy: AddressLike,
+    startedAt: BigNumberish
+  ];
+  export type OutputTuple = [
+    roundId: bigint,
+    startedBy: string,
+    startedAt: bigint
+  ];
+  export interface OutputObject {
+    roundId: bigint;
+    startedBy: string;
+    startedAt: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface AggregatorInterface extends BaseContract {
+  connect(runner?: ContractRunner | null): AggregatorInterface;
+  waitForDeployment(): Promise<this>;
+
+  interface: AggregatorInterfaceInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getAnswer: TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+
+  getTimestamp: TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+
+  latestAnswer: TypedContractMethod<[], [bigint], "view">;
+
+  latestRound: TypedContractMethod<[], [bigint], "view">;
+
+  latestTimestamp: TypedContractMethod<[], [bigint], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "getAnswer"
+  ): TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getTimestamp"
+  ): TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestAnswer"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestRound"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestTimestamp"
+  ): TypedContractMethod<[], [bigint], "view">;
+
+  getEvent(
+    key: "AnswerUpdated"
+  ): TypedContractEvent<
+    AnswerUpdatedEvent.InputTuple,
+    AnswerUpdatedEvent.OutputTuple,
+    AnswerUpdatedEvent.OutputObject
+  >;
+  getEvent(
+    key: "NewRound"
+  ): TypedContractEvent<
+    NewRoundEvent.InputTuple,
+    NewRoundEvent.OutputTuple,
+    NewRoundEvent.OutputObject
+  >;
+
+  filters: {
+    "AnswerUpdated(int256,uint256,uint256)": TypedContractEvent<
+      AnswerUpdatedEvent.InputTuple,
+      AnswerUpdatedEvent.OutputTuple,
+      AnswerUpdatedEvent.OutputObject
+    >;
+    AnswerUpdated: TypedContractEvent<
+      AnswerUpdatedEvent.InputTuple,
+      AnswerUpdatedEvent.OutputTuple,
+      AnswerUpdatedEvent.OutputObject
+    >;
+
+    "NewRound(uint256,address,uint256)": TypedContractEvent<
+      NewRoundEvent.InputTuple,
+      NewRoundEvent.OutputTuple,
+      NewRoundEvent.OutputObject
+    >;
+    NewRound: TypedContractEvent<
+      NewRoundEvent.InputTuple,
+      NewRoundEvent.OutputTuple,
+      NewRoundEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.ts b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.ts
new file mode 100644
index 0000000000000000000000000000000000000000..862b2093fb86d75e03f5b9880104a41fc7545f57
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.ts
@@ -0,0 +1,339 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface AggregatorV2V3InterfaceInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "decimals"
+      | "description"
+      | "getAnswer"
+      | "getRoundData"
+      | "getTimestamp"
+      | "latestAnswer"
+      | "latestRound"
+      | "latestRoundData"
+      | "latestTimestamp"
+      | "version"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "AnswerUpdated" | "NewRound"): EventFragment;
+
+  encodeFunctionData(functionFragment: "decimals", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "description",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getAnswer",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getRoundData",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getTimestamp",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestAnswer",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestRound",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestRoundData",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestTimestamp",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "version", values?: undefined): string;
+
+  decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "description",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "getAnswer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getRoundData",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getTimestamp",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestAnswer",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestRound",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestRoundData",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestTimestamp",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "version", data: BytesLike): Result;
+}
+
+export namespace AnswerUpdatedEvent {
+  export type InputTuple = [
+    current: BigNumberish,
+    roundId: BigNumberish,
+    updatedAt: BigNumberish
+  ];
+  export type OutputTuple = [
+    current: bigint,
+    roundId: bigint,
+    updatedAt: bigint
+  ];
+  export interface OutputObject {
+    current: bigint;
+    roundId: bigint;
+    updatedAt: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace NewRoundEvent {
+  export type InputTuple = [
+    roundId: BigNumberish,
+    startedBy: AddressLike,
+    startedAt: BigNumberish
+  ];
+  export type OutputTuple = [
+    roundId: bigint,
+    startedBy: string,
+    startedAt: bigint
+  ];
+  export interface OutputObject {
+    roundId: bigint;
+    startedBy: string;
+    startedAt: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface AggregatorV2V3Interface extends BaseContract {
+  connect(runner?: ContractRunner | null): AggregatorV2V3Interface;
+  waitForDeployment(): Promise<this>;
+
+  interface: AggregatorV2V3InterfaceInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  decimals: TypedContractMethod<[], [bigint], "view">;
+
+  description: TypedContractMethod<[], [string], "view">;
+
+  getAnswer: TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+
+  getRoundData: TypedContractMethod<
+    [_roundId: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  getTimestamp: TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+
+  latestAnswer: TypedContractMethod<[], [bigint], "view">;
+
+  latestRound: TypedContractMethod<[], [bigint], "view">;
+
+  latestRoundData: TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  latestTimestamp: TypedContractMethod<[], [bigint], "view">;
+
+  version: TypedContractMethod<[], [bigint], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "decimals"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "description"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "getAnswer"
+  ): TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getRoundData"
+  ): TypedContractMethod<
+    [_roundId: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "getTimestamp"
+  ): TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestAnswer"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestRound"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestRoundData"
+  ): TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "latestTimestamp"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "version"
+  ): TypedContractMethod<[], [bigint], "view">;
+
+  getEvent(
+    key: "AnswerUpdated"
+  ): TypedContractEvent<
+    AnswerUpdatedEvent.InputTuple,
+    AnswerUpdatedEvent.OutputTuple,
+    AnswerUpdatedEvent.OutputObject
+  >;
+  getEvent(
+    key: "NewRound"
+  ): TypedContractEvent<
+    NewRoundEvent.InputTuple,
+    NewRoundEvent.OutputTuple,
+    NewRoundEvent.OutputObject
+  >;
+
+  filters: {
+    "AnswerUpdated(int256,uint256,uint256)": TypedContractEvent<
+      AnswerUpdatedEvent.InputTuple,
+      AnswerUpdatedEvent.OutputTuple,
+      AnswerUpdatedEvent.OutputObject
+    >;
+    AnswerUpdated: TypedContractEvent<
+      AnswerUpdatedEvent.InputTuple,
+      AnswerUpdatedEvent.OutputTuple,
+      AnswerUpdatedEvent.OutputObject
+    >;
+
+    "NewRound(uint256,address,uint256)": TypedContractEvent<
+      NewRoundEvent.InputTuple,
+      NewRoundEvent.OutputTuple,
+      NewRoundEvent.OutputObject
+    >;
+    NewRound: TypedContractEvent<
+      NewRoundEvent.InputTuple,
+      NewRoundEvent.OutputTuple,
+      NewRoundEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.ts b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.ts
new file mode 100644
index 0000000000000000000000000000000000000000..98607e7b851897264df973ccc889adcd5939cf29
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.ts
@@ -0,0 +1,186 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface AggregatorV3InterfaceInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "decimals"
+      | "description"
+      | "getRoundData"
+      | "latestRoundData"
+      | "version"
+  ): FunctionFragment;
+
+  encodeFunctionData(functionFragment: "decimals", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "description",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getRoundData",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestRoundData",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "version", values?: undefined): string;
+
+  decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "description",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getRoundData",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestRoundData",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "version", data: BytesLike): Result;
+}
+
+export interface AggregatorV3Interface extends BaseContract {
+  connect(runner?: ContractRunner | null): AggregatorV3Interface;
+  waitForDeployment(): Promise<this>;
+
+  interface: AggregatorV3InterfaceInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  decimals: TypedContractMethod<[], [bigint], "view">;
+
+  description: TypedContractMethod<[], [string], "view">;
+
+  getRoundData: TypedContractMethod<
+    [_roundId: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  latestRoundData: TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  version: TypedContractMethod<[], [bigint], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "decimals"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "description"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "getRoundData"
+  ): TypedContractMethod<
+    [_roundId: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "latestRoundData"
+  ): TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "version"
+  ): TypedContractMethod<[], [bigint], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/index.ts b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..084d088a6ca817f742e5037299fead61b2d6ec23
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@chainlink/contracts/src/v0.8/interfaces/index.ts
@@ -0,0 +1,6 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { AggregatorInterface } from "./AggregatorInterface";
+export type { AggregatorV2V3Interface } from "./AggregatorV2V3Interface";
+export type { AggregatorV3Interface } from "./AggregatorV3Interface";
diff --git a/momiji-helpers/utils/typechain-types/@chainlink/index.ts b/momiji-helpers/utils/typechain-types/@chainlink/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a11e4ca299013228e835e98a10502ed6603e575b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@chainlink/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as contracts from "./contracts";
+export type { contracts };
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dde83e2f8fcc82f18e5b8c87aeeb43603ab02239
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts
@@ -0,0 +1,186 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../common";
+
+export interface OwnableUpgradeableInterface extends Interface {
+  getFunction(
+    nameOrSignature: "owner" | "renounceOwnership" | "transferOwnership"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "Initialized" | "OwnershipTransferred"
+  ): EventFragment;
+
+  encodeFunctionData(functionFragment: "owner", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "renounceOwnership",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferOwnership",
+    values: [AddressLike]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "renounceOwnership",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "transferOwnership",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace OwnershipTransferredEvent {
+  export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike];
+  export type OutputTuple = [previousOwner: string, newOwner: string];
+  export interface OutputObject {
+    previousOwner: string;
+    newOwner: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface OwnableUpgradeable extends BaseContract {
+  connect(runner?: ContractRunner | null): OwnableUpgradeable;
+  waitForDeployment(): Promise<this>;
+
+  interface: OwnableUpgradeableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  owner: TypedContractMethod<[], [string], "view">;
+
+  renounceOwnership: TypedContractMethod<[], [void], "nonpayable">;
+
+  transferOwnership: TypedContractMethod<
+    [newOwner: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "owner"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "renounceOwnership"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "transferOwnership"
+  ): TypedContractMethod<[newOwner: AddressLike], [void], "nonpayable">;
+
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+  getEvent(
+    key: "OwnershipTransferred"
+  ): TypedContractEvent<
+    OwnershipTransferredEvent.InputTuple,
+    OwnershipTransferredEvent.OutputTuple,
+    OwnershipTransferredEvent.OutputObject
+  >;
+
+  filters: {
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+
+    "OwnershipTransferred(address,address)": TypedContractEvent<
+      OwnershipTransferredEvent.InputTuple,
+      OwnershipTransferredEvent.OutputTuple,
+      OwnershipTransferredEvent.OutputObject
+    >;
+    OwnershipTransferred: TypedContractEvent<
+      OwnershipTransferredEvent.InputTuple,
+      OwnershipTransferredEvent.OutputTuple,
+      OwnershipTransferredEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/access/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/access/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5b7d8440c28c8d20bdf5b6180a41bad85f33839b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/access/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { OwnableUpgradeable } from "./OwnableUpgradeable";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cb37af6a29e62750dc4bd27c9121de3027475e21
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/index.ts
@@ -0,0 +1,9 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as access from "./access";
+export type { access };
+import type * as proxy from "./proxy";
+export type { proxy };
+import type * as utils from "./utils";
+export type { utils };
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..74cdc5faaf78af81eb0e070b6e702b4c5575b7de
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as utils from "./utils";
+export type { utils };
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b449ea2cd79db3bda0103043d12ba1a69e777bb2
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.ts
@@ -0,0 +1,105 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  FunctionFragment,
+  Interface,
+  EventFragment,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+} from "../../../../common";
+
+export interface InitializableInterface extends Interface {
+  getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface Initializable extends BaseContract {
+  connect(runner?: ContractRunner | null): Initializable;
+  waitForDeployment(): Promise<this>;
+
+  interface: InitializableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+
+  filters: {
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fd0c254349b39e51cbc5ef86a5d276f7424a9b1a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.ts
@@ -0,0 +1,196 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface UUPSUpgradeableInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "UPGRADE_INTERFACE_VERSION"
+      | "proxiableUUID"
+      | "upgradeToAndCall"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "Initialized" | "Upgraded"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "UPGRADE_INTERFACE_VERSION",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "proxiableUUID",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "upgradeToAndCall",
+    values: [AddressLike, BytesLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "UPGRADE_INTERFACE_VERSION",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "proxiableUUID",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "upgradeToAndCall",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace UpgradedEvent {
+  export type InputTuple = [implementation: AddressLike];
+  export type OutputTuple = [implementation: string];
+  export interface OutputObject {
+    implementation: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface UUPSUpgradeable extends BaseContract {
+  connect(runner?: ContractRunner | null): UUPSUpgradeable;
+  waitForDeployment(): Promise<this>;
+
+  interface: UUPSUpgradeableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  UPGRADE_INTERFACE_VERSION: TypedContractMethod<[], [string], "view">;
+
+  proxiableUUID: TypedContractMethod<[], [string], "view">;
+
+  upgradeToAndCall: TypedContractMethod<
+    [newImplementation: AddressLike, data: BytesLike],
+    [void],
+    "payable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "UPGRADE_INTERFACE_VERSION"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "proxiableUUID"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "upgradeToAndCall"
+  ): TypedContractMethod<
+    [newImplementation: AddressLike, data: BytesLike],
+    [void],
+    "payable"
+  >;
+
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Upgraded"
+  ): TypedContractEvent<
+    UpgradedEvent.InputTuple,
+    UpgradedEvent.OutputTuple,
+    UpgradedEvent.OutputObject
+  >;
+
+  filters: {
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+
+    "Upgraded(address)": TypedContractEvent<
+      UpgradedEvent.InputTuple,
+      UpgradedEvent.OutputTuple,
+      UpgradedEvent.OutputObject
+    >;
+    Upgraded: TypedContractEvent<
+      UpgradedEvent.InputTuple,
+      UpgradedEvent.OutputTuple,
+      UpgradedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f23837bac7ae9cfe4bdedee4d2faca98abb03798
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { Initializable } from "./Initializable";
+export type { UUPSUpgradeable } from "./UUPSUpgradeable";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a6af1bed63c4f0588b9b75e73d259113c918c804
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.ts
@@ -0,0 +1,105 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  FunctionFragment,
+  Interface,
+  EventFragment,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+} from "../../../common";
+
+export interface ContextUpgradeableInterface extends Interface {
+  getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface ContextUpgradeable extends BaseContract {
+  connect(runner?: ContractRunner | null): ContextUpgradeable;
+  waitForDeployment(): Promise<this>;
+
+  interface: ContextUpgradeableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+
+  filters: {
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4f3ad279255aa1a8a4bc1acee8e13c44d67a1aad
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.ts
@@ -0,0 +1,183 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../common";
+
+export interface PausableUpgradeableInterface extends Interface {
+  getFunction(nameOrSignature: "paused"): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "Initialized" | "Paused" | "Unpaused"
+  ): EventFragment;
+
+  encodeFunctionData(functionFragment: "paused", values?: undefined): string;
+
+  decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace PausedEvent {
+  export type InputTuple = [account: AddressLike];
+  export type OutputTuple = [account: string];
+  export interface OutputObject {
+    account: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace UnpausedEvent {
+  export type InputTuple = [account: AddressLike];
+  export type OutputTuple = [account: string];
+  export interface OutputObject {
+    account: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface PausableUpgradeable extends BaseContract {
+  connect(runner?: ContractRunner | null): PausableUpgradeable;
+  waitForDeployment(): Promise<this>;
+
+  interface: PausableUpgradeableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  paused: TypedContractMethod<[], [boolean], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "paused"
+  ): TypedContractMethod<[], [boolean], "view">;
+
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Paused"
+  ): TypedContractEvent<
+    PausedEvent.InputTuple,
+    PausedEvent.OutputTuple,
+    PausedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Unpaused"
+  ): TypedContractEvent<
+    UnpausedEvent.InputTuple,
+    UnpausedEvent.OutputTuple,
+    UnpausedEvent.OutputObject
+  >;
+
+  filters: {
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+
+    "Paused(address)": TypedContractEvent<
+      PausedEvent.InputTuple,
+      PausedEvent.OutputTuple,
+      PausedEvent.OutputObject
+    >;
+    Paused: TypedContractEvent<
+      PausedEvent.InputTuple,
+      PausedEvent.OutputTuple,
+      PausedEvent.OutputObject
+    >;
+
+    "Unpaused(address)": TypedContractEvent<
+      UnpausedEvent.InputTuple,
+      UnpausedEvent.OutputTuple,
+      UnpausedEvent.OutputObject
+    >;
+    Unpaused: TypedContractEvent<
+      UnpausedEvent.InputTuple,
+      UnpausedEvent.OutputTuple,
+      UnpausedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..98e6939a56be74eee3d1696768e247d41a15c712
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.ts
@@ -0,0 +1,184 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface EIP712UpgradeableInterface extends Interface {
+  getFunction(nameOrSignature: "eip712Domain"): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "EIP712DomainChanged" | "Initialized"
+  ): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "eip712Domain",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "eip712Domain",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace EIP712DomainChangedEvent {
+  export type InputTuple = [];
+  export type OutputTuple = [];
+  export interface OutputObject {}
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface EIP712Upgradeable extends BaseContract {
+  connect(runner?: ContractRunner | null): EIP712Upgradeable;
+  waitForDeployment(): Promise<this>;
+
+  interface: EIP712UpgradeableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  eip712Domain: TypedContractMethod<
+    [],
+    [
+      [string, string, string, bigint, string, string, bigint[]] & {
+        fields: string;
+        name: string;
+        version: string;
+        chainId: bigint;
+        verifyingContract: string;
+        salt: string;
+        extensions: bigint[];
+      }
+    ],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "eip712Domain"
+  ): TypedContractMethod<
+    [],
+    [
+      [string, string, string, bigint, string, string, bigint[]] & {
+        fields: string;
+        name: string;
+        version: string;
+        chainId: bigint;
+        verifyingContract: string;
+        salt: string;
+        extensions: bigint[];
+      }
+    ],
+    "view"
+  >;
+
+  getEvent(
+    key: "EIP712DomainChanged"
+  ): TypedContractEvent<
+    EIP712DomainChangedEvent.InputTuple,
+    EIP712DomainChangedEvent.OutputTuple,
+    EIP712DomainChangedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+
+  filters: {
+    "EIP712DomainChanged()": TypedContractEvent<
+      EIP712DomainChangedEvent.InputTuple,
+      EIP712DomainChangedEvent.OutputTuple,
+      EIP712DomainChangedEvent.OutputObject
+    >;
+    EIP712DomainChanged: TypedContractEvent<
+      EIP712DomainChangedEvent.InputTuple,
+      EIP712DomainChangedEvent.OutputTuple,
+      EIP712DomainChangedEvent.OutputObject
+    >;
+
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/cryptography/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/cryptography/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f33f7478d771b49c5ddd8486b5bdadf1e50c61d0
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/cryptography/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { EIP712Upgradeable } from "./EIP712Upgradeable";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3f54ae7fa866f31c7d502fa3507df671a22bf512
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.ts
@@ -0,0 +1,7 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as cryptography from "./cryptography";
+export type { cryptography };
+export type { ContextUpgradeable } from "./ContextUpgradeable";
+export type { PausableUpgradeable } from "./PausableUpgradeable";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/access/AccessControl.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/access/AccessControl.ts
new file mode 100644
index 0000000000000000000000000000000000000000..98803591488711f080ab1961efff3ce37fb9dbcd
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/access/AccessControl.ts
@@ -0,0 +1,324 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../common";
+
+export interface AccessControlInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "DEFAULT_ADMIN_ROLE"
+      | "getRoleAdmin"
+      | "grantRole"
+      | "hasRole"
+      | "renounceRole"
+      | "revokeRole"
+      | "supportsInterface"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "RoleAdminChanged" | "RoleGranted" | "RoleRevoked"
+  ): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "DEFAULT_ADMIN_ROLE",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getRoleAdmin",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "grantRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "hasRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "renounceRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "revokeRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "supportsInterface",
+    values: [BytesLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "DEFAULT_ADMIN_ROLE",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getRoleAdmin",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "renounceRole",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "supportsInterface",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace RoleAdminChangedEvent {
+  export type InputTuple = [
+    role: BytesLike,
+    previousAdminRole: BytesLike,
+    newAdminRole: BytesLike
+  ];
+  export type OutputTuple = [
+    role: string,
+    previousAdminRole: string,
+    newAdminRole: string
+  ];
+  export interface OutputObject {
+    role: string;
+    previousAdminRole: string;
+    newAdminRole: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace RoleGrantedEvent {
+  export type InputTuple = [
+    role: BytesLike,
+    account: AddressLike,
+    sender: AddressLike
+  ];
+  export type OutputTuple = [role: string, account: string, sender: string];
+  export interface OutputObject {
+    role: string;
+    account: string;
+    sender: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace RoleRevokedEvent {
+  export type InputTuple = [
+    role: BytesLike,
+    account: AddressLike,
+    sender: AddressLike
+  ];
+  export type OutputTuple = [role: string, account: string, sender: string];
+  export interface OutputObject {
+    role: string;
+    account: string;
+    sender: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface AccessControl extends BaseContract {
+  connect(runner?: ContractRunner | null): AccessControl;
+  waitForDeployment(): Promise<this>;
+
+  interface: AccessControlInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  DEFAULT_ADMIN_ROLE: TypedContractMethod<[], [string], "view">;
+
+  getRoleAdmin: TypedContractMethod<[role: BytesLike], [string], "view">;
+
+  grantRole: TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  hasRole: TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [boolean],
+    "view"
+  >;
+
+  renounceRole: TypedContractMethod<
+    [role: BytesLike, callerConfirmation: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  revokeRole: TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  supportsInterface: TypedContractMethod<
+    [interfaceId: BytesLike],
+    [boolean],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "DEFAULT_ADMIN_ROLE"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "getRoleAdmin"
+  ): TypedContractMethod<[role: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "grantRole"
+  ): TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "hasRole"
+  ): TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [boolean],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "renounceRole"
+  ): TypedContractMethod<
+    [role: BytesLike, callerConfirmation: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "revokeRole"
+  ): TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "supportsInterface"
+  ): TypedContractMethod<[interfaceId: BytesLike], [boolean], "view">;
+
+  getEvent(
+    key: "RoleAdminChanged"
+  ): TypedContractEvent<
+    RoleAdminChangedEvent.InputTuple,
+    RoleAdminChangedEvent.OutputTuple,
+    RoleAdminChangedEvent.OutputObject
+  >;
+  getEvent(
+    key: "RoleGranted"
+  ): TypedContractEvent<
+    RoleGrantedEvent.InputTuple,
+    RoleGrantedEvent.OutputTuple,
+    RoleGrantedEvent.OutputObject
+  >;
+  getEvent(
+    key: "RoleRevoked"
+  ): TypedContractEvent<
+    RoleRevokedEvent.InputTuple,
+    RoleRevokedEvent.OutputTuple,
+    RoleRevokedEvent.OutputObject
+  >;
+
+  filters: {
+    "RoleAdminChanged(bytes32,bytes32,bytes32)": TypedContractEvent<
+      RoleAdminChangedEvent.InputTuple,
+      RoleAdminChangedEvent.OutputTuple,
+      RoleAdminChangedEvent.OutputObject
+    >;
+    RoleAdminChanged: TypedContractEvent<
+      RoleAdminChangedEvent.InputTuple,
+      RoleAdminChangedEvent.OutputTuple,
+      RoleAdminChangedEvent.OutputObject
+    >;
+
+    "RoleGranted(bytes32,address,address)": TypedContractEvent<
+      RoleGrantedEvent.InputTuple,
+      RoleGrantedEvent.OutputTuple,
+      RoleGrantedEvent.OutputObject
+    >;
+    RoleGranted: TypedContractEvent<
+      RoleGrantedEvent.InputTuple,
+      RoleGrantedEvent.OutputTuple,
+      RoleGrantedEvent.OutputObject
+    >;
+
+    "RoleRevoked(bytes32,address,address)": TypedContractEvent<
+      RoleRevokedEvent.InputTuple,
+      RoleRevokedEvent.OutputTuple,
+      RoleRevokedEvent.OutputObject
+    >;
+    RoleRevoked: TypedContractEvent<
+      RoleRevokedEvent.InputTuple,
+      RoleRevokedEvent.OutputTuple,
+      RoleRevokedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1f0c8cfba8ea8e167c0b9c86a9771c86e5a666bb
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts
@@ -0,0 +1,292 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../common";
+
+export interface IAccessControlInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "getRoleAdmin"
+      | "grantRole"
+      | "hasRole"
+      | "renounceRole"
+      | "revokeRole"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "RoleAdminChanged" | "RoleGranted" | "RoleRevoked"
+  ): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "getRoleAdmin",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "grantRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "hasRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "renounceRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "revokeRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getRoleAdmin",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "renounceRole",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result;
+}
+
+export namespace RoleAdminChangedEvent {
+  export type InputTuple = [
+    role: BytesLike,
+    previousAdminRole: BytesLike,
+    newAdminRole: BytesLike
+  ];
+  export type OutputTuple = [
+    role: string,
+    previousAdminRole: string,
+    newAdminRole: string
+  ];
+  export interface OutputObject {
+    role: string;
+    previousAdminRole: string;
+    newAdminRole: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace RoleGrantedEvent {
+  export type InputTuple = [
+    role: BytesLike,
+    account: AddressLike,
+    sender: AddressLike
+  ];
+  export type OutputTuple = [role: string, account: string, sender: string];
+  export interface OutputObject {
+    role: string;
+    account: string;
+    sender: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace RoleRevokedEvent {
+  export type InputTuple = [
+    role: BytesLike,
+    account: AddressLike,
+    sender: AddressLike
+  ];
+  export type OutputTuple = [role: string, account: string, sender: string];
+  export interface OutputObject {
+    role: string;
+    account: string;
+    sender: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IAccessControl extends BaseContract {
+  connect(runner?: ContractRunner | null): IAccessControl;
+  waitForDeployment(): Promise<this>;
+
+  interface: IAccessControlInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getRoleAdmin: TypedContractMethod<[role: BytesLike], [string], "view">;
+
+  grantRole: TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  hasRole: TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [boolean],
+    "view"
+  >;
+
+  renounceRole: TypedContractMethod<
+    [role: BytesLike, callerConfirmation: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  revokeRole: TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "getRoleAdmin"
+  ): TypedContractMethod<[role: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "grantRole"
+  ): TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "hasRole"
+  ): TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [boolean],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "renounceRole"
+  ): TypedContractMethod<
+    [role: BytesLike, callerConfirmation: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "revokeRole"
+  ): TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  getEvent(
+    key: "RoleAdminChanged"
+  ): TypedContractEvent<
+    RoleAdminChangedEvent.InputTuple,
+    RoleAdminChangedEvent.OutputTuple,
+    RoleAdminChangedEvent.OutputObject
+  >;
+  getEvent(
+    key: "RoleGranted"
+  ): TypedContractEvent<
+    RoleGrantedEvent.InputTuple,
+    RoleGrantedEvent.OutputTuple,
+    RoleGrantedEvent.OutputObject
+  >;
+  getEvent(
+    key: "RoleRevoked"
+  ): TypedContractEvent<
+    RoleRevokedEvent.InputTuple,
+    RoleRevokedEvent.OutputTuple,
+    RoleRevokedEvent.OutputObject
+  >;
+
+  filters: {
+    "RoleAdminChanged(bytes32,bytes32,bytes32)": TypedContractEvent<
+      RoleAdminChangedEvent.InputTuple,
+      RoleAdminChangedEvent.OutputTuple,
+      RoleAdminChangedEvent.OutputObject
+    >;
+    RoleAdminChanged: TypedContractEvent<
+      RoleAdminChangedEvent.InputTuple,
+      RoleAdminChangedEvent.OutputTuple,
+      RoleAdminChangedEvent.OutputObject
+    >;
+
+    "RoleGranted(bytes32,address,address)": TypedContractEvent<
+      RoleGrantedEvent.InputTuple,
+      RoleGrantedEvent.OutputTuple,
+      RoleGrantedEvent.OutputObject
+    >;
+    RoleGranted: TypedContractEvent<
+      RoleGrantedEvent.InputTuple,
+      RoleGrantedEvent.OutputTuple,
+      RoleGrantedEvent.OutputObject
+    >;
+
+    "RoleRevoked(bytes32,address,address)": TypedContractEvent<
+      RoleRevokedEvent.InputTuple,
+      RoleRevokedEvent.OutputTuple,
+      RoleRevokedEvent.OutputObject
+    >;
+    RoleRevoked: TypedContractEvent<
+      RoleRevokedEvent.InputTuple,
+      RoleRevokedEvent.OutputTuple,
+      RoleRevokedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/access/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/access/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8209e49214325ffa72aa1425e514345ff0050834
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/access/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { AccessControl } from "./AccessControl";
+export type { IAccessControl } from "./IAccessControl";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b570e96027662ba641eb734f031849fd1f51c3c5
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/index.ts
@@ -0,0 +1,13 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as access from "./access";
+export type { access };
+import type * as interfaces from "./interfaces";
+export type { interfaces };
+import type * as proxy from "./proxy";
+export type { proxy };
+import type * as token from "./token";
+export type { token };
+import type * as utils from "./utils";
+export type { utils };
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/IERC5267.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/IERC5267.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f92fc9097bf8d8d5bc112a7a1871a783bf7385d3
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/IERC5267.ts
@@ -0,0 +1,151 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../common";
+
+export interface IERC5267Interface extends Interface {
+  getFunction(nameOrSignature: "eip712Domain"): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "EIP712DomainChanged"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "eip712Domain",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "eip712Domain",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace EIP712DomainChangedEvent {
+  export type InputTuple = [];
+  export type OutputTuple = [];
+  export interface OutputObject {}
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IERC5267 extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC5267;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC5267Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  eip712Domain: TypedContractMethod<
+    [],
+    [
+      [string, string, string, bigint, string, string, bigint[]] & {
+        fields: string;
+        name: string;
+        version: string;
+        chainId: bigint;
+        verifyingContract: string;
+        salt: string;
+        extensions: bigint[];
+      }
+    ],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "eip712Domain"
+  ): TypedContractMethod<
+    [],
+    [
+      [string, string, string, bigint, string, string, bigint[]] & {
+        fields: string;
+        name: string;
+        version: string;
+        chainId: bigint;
+        verifyingContract: string;
+        salt: string;
+        extensions: bigint[];
+      }
+    ],
+    "view"
+  >;
+
+  getEvent(
+    key: "EIP712DomainChanged"
+  ): TypedContractEvent<
+    EIP712DomainChangedEvent.InputTuple,
+    EIP712DomainChangedEvent.OutputTuple,
+    EIP712DomainChangedEvent.OutputObject
+  >;
+
+  filters: {
+    "EIP712DomainChanged()": TypedContractEvent<
+      EIP712DomainChangedEvent.InputTuple,
+      EIP712DomainChangedEvent.OutputTuple,
+      EIP712DomainChangedEvent.OutputObject
+    >;
+    EIP712DomainChanged: TypedContractEvent<
+      EIP712DomainChangedEvent.InputTuple,
+      EIP712DomainChangedEvent.OutputTuple,
+      EIP712DomainChangedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f822039b3d1b8e8c93250887d3b7b7da4bbf8690
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.ts
@@ -0,0 +1,90 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface IERC1822ProxiableInterface extends Interface {
+  getFunction(nameOrSignature: "proxiableUUID"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "proxiableUUID",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "proxiableUUID",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IERC1822Proxiable extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC1822Proxiable;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC1822ProxiableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  proxiableUUID: TypedContractMethod<[], [string], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "proxiableUUID"
+  ): TypedContractMethod<[], [string], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..daec45bbe14543cf72f16ba99079873810cc7204
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { IERC1822Proxiable } from "./IERC1822Proxiable";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts
new file mode 100644
index 0000000000000000000000000000000000000000..959e42d8344668e834258640d0124175a0aeed3e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+} from "../../../../common";
+
+export interface IERC1155ErrorsInterface extends Interface {}
+
+export interface IERC1155Errors extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC1155Errors;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC1155ErrorsInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts
new file mode 100644
index 0000000000000000000000000000000000000000..04699221fe4a90f55843fb1d1cf3c235cabed824
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+} from "../../../../common";
+
+export interface IERC20ErrorsInterface extends Interface {}
+
+export interface IERC20Errors extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC20Errors;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC20ErrorsInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts
new file mode 100644
index 0000000000000000000000000000000000000000..39b0d2b514c963c1b6c2d591cf79efa6d330db48
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+} from "../../../../common";
+
+export interface IERC721ErrorsInterface extends Interface {}
+
+export interface IERC721Errors extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC721Errors;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC721ErrorsInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9415fdf5901820c8bfe2e32f49b91a2fa8ef9c0c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts
@@ -0,0 +1,6 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { IERC1155Errors } from "./IERC1155Errors";
+export type { IERC20Errors } from "./IERC20Errors";
+export type { IERC721Errors } from "./IERC721Errors";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9a200f39c6486f18799006c00d1ed345ad31639c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/interfaces/index.ts
@@ -0,0 +1,8 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as draftIerc1822Sol from "./draft-IERC1822.sol";
+export type { draftIerc1822Sol };
+import type * as draftIerc6093Sol from "./draft-IERC6093.sol";
+export type { draftIerc6093Sol };
+export type { IERC5267 } from "./IERC5267";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f10c52da56c9c3dd4fe1ef4ef08de15062ef194a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.ts
@@ -0,0 +1,168 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+} from "../../../../common";
+
+export interface ERC1967UtilsInterface extends Interface {
+  getEvent(
+    nameOrSignatureOrTopic: "AdminChanged" | "BeaconUpgraded" | "Upgraded"
+  ): EventFragment;
+}
+
+export namespace AdminChangedEvent {
+  export type InputTuple = [previousAdmin: AddressLike, newAdmin: AddressLike];
+  export type OutputTuple = [previousAdmin: string, newAdmin: string];
+  export interface OutputObject {
+    previousAdmin: string;
+    newAdmin: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace BeaconUpgradedEvent {
+  export type InputTuple = [beacon: AddressLike];
+  export type OutputTuple = [beacon: string];
+  export interface OutputObject {
+    beacon: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace UpgradedEvent {
+  export type InputTuple = [implementation: AddressLike];
+  export type OutputTuple = [implementation: string];
+  export interface OutputObject {
+    implementation: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface ERC1967Utils extends BaseContract {
+  connect(runner?: ContractRunner | null): ERC1967Utils;
+  waitForDeployment(): Promise<this>;
+
+  interface: ERC1967UtilsInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getEvent(
+    key: "AdminChanged"
+  ): TypedContractEvent<
+    AdminChangedEvent.InputTuple,
+    AdminChangedEvent.OutputTuple,
+    AdminChangedEvent.OutputObject
+  >;
+  getEvent(
+    key: "BeaconUpgraded"
+  ): TypedContractEvent<
+    BeaconUpgradedEvent.InputTuple,
+    BeaconUpgradedEvent.OutputTuple,
+    BeaconUpgradedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Upgraded"
+  ): TypedContractEvent<
+    UpgradedEvent.InputTuple,
+    UpgradedEvent.OutputTuple,
+    UpgradedEvent.OutputObject
+  >;
+
+  filters: {
+    "AdminChanged(address,address)": TypedContractEvent<
+      AdminChangedEvent.InputTuple,
+      AdminChangedEvent.OutputTuple,
+      AdminChangedEvent.OutputObject
+    >;
+    AdminChanged: TypedContractEvent<
+      AdminChangedEvent.InputTuple,
+      AdminChangedEvent.OutputTuple,
+      AdminChangedEvent.OutputObject
+    >;
+
+    "BeaconUpgraded(address)": TypedContractEvent<
+      BeaconUpgradedEvent.InputTuple,
+      BeaconUpgradedEvent.OutputTuple,
+      BeaconUpgradedEvent.OutputObject
+    >;
+    BeaconUpgraded: TypedContractEvent<
+      BeaconUpgradedEvent.InputTuple,
+      BeaconUpgradedEvent.OutputTuple,
+      BeaconUpgradedEvent.OutputObject
+    >;
+
+    "Upgraded(address)": TypedContractEvent<
+      UpgradedEvent.InputTuple,
+      UpgradedEvent.OutputTuple,
+      UpgradedEvent.OutputObject
+    >;
+    Upgraded: TypedContractEvent<
+      UpgradedEvent.InputTuple,
+      UpgradedEvent.OutputTuple,
+      UpgradedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..29e34c1f13abd302a4fe2a123ec7679c837e27a7
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { ERC1967Utils } from "./ERC1967Utils";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.ts
new file mode 100644
index 0000000000000000000000000000000000000000..27a21e393a05a05b03a6354638153173a6621e11
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.ts
@@ -0,0 +1,90 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface IBeaconInterface extends Interface {
+  getFunction(nameOrSignature: "implementation"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "implementation",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "implementation",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IBeacon extends BaseContract {
+  connect(runner?: ContractRunner | null): IBeacon;
+  waitForDeployment(): Promise<this>;
+
+  interface: IBeaconInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  implementation: TypedContractMethod<[], [string], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "implementation"
+  ): TypedContractMethod<[], [string], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/beacon/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/beacon/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9224b1ea09cdad64396a247b69095c1ce7dc6057
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/beacon/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { IBeacon } from "./IBeacon";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..34dd32248b116f090178ab4bd1e5099391977d88
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/proxy/index.ts
@@ -0,0 +1,7 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as erc1967 from "./ERC1967";
+export type { erc1967 };
+import type * as beacon from "./beacon";
+export type { beacon };
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts
new file mode 100644
index 0000000000000000000000000000000000000000..46736897d28c4ca58c4eebbf599859d5a368d0b8
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts
@@ -0,0 +1,286 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface ERC20Interface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "allowance"
+      | "approve"
+      | "balanceOf"
+      | "decimals"
+      | "name"
+      | "symbol"
+      | "totalSupply"
+      | "transfer"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "allowance",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(functionFragment: "decimals", values?: undefined): string;
+  encodeFunctionData(functionFragment: "name", values?: undefined): string;
+  encodeFunctionData(functionFragment: "symbol", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "totalSupply",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transfer",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "name", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "totalSupply",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    spender: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [owner: string, spender: string, value: bigint];
+  export interface OutputObject {
+    owner: string;
+    spender: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    from: AddressLike,
+    to: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [from: string, to: string, value: bigint];
+  export interface OutputObject {
+    from: string;
+    to: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface ERC20 extends BaseContract {
+  connect(runner?: ContractRunner | null): ERC20;
+  waitForDeployment(): Promise<this>;
+
+  interface: ERC20Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  allowance: TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  approve: TypedContractMethod<
+    [spender: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">;
+
+  decimals: TypedContractMethod<[], [bigint], "view">;
+
+  name: TypedContractMethod<[], [string], "view">;
+
+  symbol: TypedContractMethod<[], [string], "view">;
+
+  totalSupply: TypedContractMethod<[], [bigint], "view">;
+
+  transfer: TypedContractMethod<
+    [to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  transferFrom: TypedContractMethod<
+    [from: AddressLike, to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "allowance"
+  ): TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [spender: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[account: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "decimals"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "name"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "symbol"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "totalSupply"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "transfer"
+  ): TypedContractMethod<
+    [to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [from: AddressLike, to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d800ff34b5ba74959ee0791d72f202c672311cec
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts
@@ -0,0 +1,262 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface IERC20Interface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "allowance"
+      | "approve"
+      | "balanceOf"
+      | "totalSupply"
+      | "transfer"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "allowance",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "totalSupply",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transfer",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "totalSupply",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    spender: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [owner: string, spender: string, value: bigint];
+  export interface OutputObject {
+    owner: string;
+    spender: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    from: AddressLike,
+    to: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [from: string, to: string, value: bigint];
+  export interface OutputObject {
+    from: string;
+    to: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IERC20 extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC20;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC20Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  allowance: TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  approve: TypedContractMethod<
+    [spender: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">;
+
+  totalSupply: TypedContractMethod<[], [bigint], "view">;
+
+  transfer: TypedContractMethod<
+    [to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  transferFrom: TypedContractMethod<
+    [from: AddressLike, to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "allowance"
+  ): TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [spender: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[account: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "totalSupply"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "transfer"
+  ): TypedContractMethod<
+    [to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [from: AddressLike, to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6b50935379e4850499cc171473e3081701e8b475
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts
@@ -0,0 +1,286 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IERC20MetadataInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "allowance"
+      | "approve"
+      | "balanceOf"
+      | "decimals"
+      | "name"
+      | "symbol"
+      | "totalSupply"
+      | "transfer"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "allowance",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(functionFragment: "decimals", values?: undefined): string;
+  encodeFunctionData(functionFragment: "name", values?: undefined): string;
+  encodeFunctionData(functionFragment: "symbol", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "totalSupply",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transfer",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "name", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "totalSupply",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    spender: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [owner: string, spender: string, value: bigint];
+  export interface OutputObject {
+    owner: string;
+    spender: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    from: AddressLike,
+    to: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [from: string, to: string, value: bigint];
+  export interface OutputObject {
+    from: string;
+    to: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IERC20Metadata extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC20Metadata;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC20MetadataInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  allowance: TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  approve: TypedContractMethod<
+    [spender: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">;
+
+  decimals: TypedContractMethod<[], [bigint], "view">;
+
+  name: TypedContractMethod<[], [string], "view">;
+
+  symbol: TypedContractMethod<[], [string], "view">;
+
+  totalSupply: TypedContractMethod<[], [bigint], "view">;
+
+  transfer: TypedContractMethod<
+    [to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  transferFrom: TypedContractMethod<
+    [from: AddressLike, to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "allowance"
+  ): TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [spender: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[account: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "decimals"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "name"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "symbol"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "totalSupply"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "transfer"
+  ): TypedContractMethod<
+    [to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [from: AddressLike, to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6044cdef44ac79aaf53bafd4441e02a2a027c6af
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { IERC20Metadata } from "./IERC20Metadata";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cc196974abe7605e3b8a40831c70faefc0f52e6d
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts
@@ -0,0 +1,7 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as extensions from "./extensions";
+export type { extensions };
+export type { ERC20 } from "./ERC20";
+export type { IERC20 } from "./IERC20";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5c4062a9ca8b785ea3e836b154d718e756e5fa8e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/token/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as erc20 from "./ERC20";
+export type { erc20 };
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/Address.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/Address.ts
new file mode 100644
index 0000000000000000000000000000000000000000..eaaadeb4663ef315f8887fcb446191c04ee3dc1e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/Address.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+} from "../../../common";
+
+export interface AddressInterface extends Interface {}
+
+export interface Address extends BaseContract {
+  connect(runner?: ContractRunner | null): Address;
+  waitForDeployment(): Promise<this>;
+
+  interface: AddressInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/Strings.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/Strings.ts
new file mode 100644
index 0000000000000000000000000000000000000000..08a73eb05991e86d4902fa5ae42c71ea12db8ee7
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/Strings.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+} from "../../../common";
+
+export interface StringsInterface extends Interface {}
+
+export interface Strings extends BaseContract {
+  connect(runner?: ContractRunner | null): Strings;
+  waitForDeployment(): Promise<this>;
+
+  interface: StringsInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/cryptography/ECDSA.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/cryptography/ECDSA.ts
new file mode 100644
index 0000000000000000000000000000000000000000..433b59f51fd6d71f8f9dc661fb03530a65eac386
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/cryptography/ECDSA.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+} from "../../../../common";
+
+export interface ECDSAInterface extends Interface {}
+
+export interface ECDSA extends BaseContract {
+  connect(runner?: ContractRunner | null): ECDSA;
+  waitForDeployment(): Promise<this>;
+
+  interface: ECDSAInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/cryptography/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/cryptography/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6249962570601fe910534a2584d29e0dad394d55
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/cryptography/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { ECDSA } from "./ECDSA";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4bb37979e449464d971272c600a26e004b6fed83
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/index.ts
@@ -0,0 +1,11 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as cryptography from "./cryptography";
+export type { cryptography };
+import type * as introspection from "./introspection";
+export type { introspection };
+import type * as math from "./math";
+export type { math };
+export type { Address } from "./Address";
+export type { Strings } from "./Strings";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/introspection/ERC165.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/introspection/ERC165.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e56b1fd79cdc6c1aea8fae19f8f92485cc778fac
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/introspection/ERC165.ts
@@ -0,0 +1,94 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface ERC165Interface extends Interface {
+  getFunction(nameOrSignature: "supportsInterface"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "supportsInterface",
+    values: [BytesLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "supportsInterface",
+    data: BytesLike
+  ): Result;
+}
+
+export interface ERC165 extends BaseContract {
+  connect(runner?: ContractRunner | null): ERC165;
+  waitForDeployment(): Promise<this>;
+
+  interface: ERC165Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  supportsInterface: TypedContractMethod<
+    [interfaceId: BytesLike],
+    [boolean],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "supportsInterface"
+  ): TypedContractMethod<[interfaceId: BytesLike], [boolean], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/introspection/IERC165.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/introspection/IERC165.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c943112ce3ad90a0cf1884b740ccdece6d9d50bb
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/introspection/IERC165.ts
@@ -0,0 +1,94 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface IERC165Interface extends Interface {
+  getFunction(nameOrSignature: "supportsInterface"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "supportsInterface",
+    values: [BytesLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "supportsInterface",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IERC165 extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC165;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC165Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  supportsInterface: TypedContractMethod<
+    [interfaceId: BytesLike],
+    [boolean],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "supportsInterface"
+  ): TypedContractMethod<[interfaceId: BytesLike], [boolean], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/introspection/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/introspection/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d7fccec73c23dce666a296af5c774ef973310c7a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/introspection/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { ERC165 } from "./ERC165";
+export type { IERC165 } from "./IERC165";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/math/Math.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/math/Math.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cfc37039e59b5dd369e7f7e48f028161a55c4445
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/math/Math.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+} from "../../../../common";
+
+export interface MathInterface extends Interface {}
+
+export interface Math extends BaseContract {
+  connect(runner?: ContractRunner | null): Math;
+  waitForDeployment(): Promise<this>;
+
+  interface: MathInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/math/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/math/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..48a816e8595bfc50de6dbb5012bc2337e6b066e6
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/contracts/utils/math/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { Math } from "./Math";
diff --git a/momiji-helpers/utils/typechain-types/@openzeppelin/index.ts b/momiji-helpers/utils/typechain-types/@openzeppelin/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f34b8770ed3995145a03775cdf2e82bba84548b5
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@openzeppelin/index.ts
@@ -0,0 +1,7 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as contracts from "./contracts";
+export type { contracts };
+import type * as contractsUpgradeable from "./contracts-upgradeable";
+export type { contractsUpgradeable };
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/index.ts b/momiji-helpers/utils/typechain-types/@uniswap/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..620b30bbeee2818de7a30ac05680ab61ba151183
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/index.ts
@@ -0,0 +1,7 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as v3Core from "./v3-core";
+export type { v3Core };
+import type * as v3Periphery from "./v3-periphery";
+export type { v3Periphery };
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/index.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..92159233f80a824de74163d927a22ffa7734c206
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as interfaces from "./interfaces";
+export type { interfaces };
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7ad62fc2e802fb99c68c6486e0cc367b90ca7fb5
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.ts
@@ -0,0 +1,99 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IUniswapV3SwapCallbackInterface extends Interface {
+  getFunction(nameOrSignature: "uniswapV3SwapCallback"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "uniswapV3SwapCallback",
+    values: [BigNumberish, BigNumberish, BytesLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "uniswapV3SwapCallback",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IUniswapV3SwapCallback extends BaseContract {
+  connect(runner?: ContractRunner | null): IUniswapV3SwapCallback;
+  waitForDeployment(): Promise<this>;
+
+  interface: IUniswapV3SwapCallbackInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  uniswapV3SwapCallback: TypedContractMethod<
+    [amount0Delta: BigNumberish, amount1Delta: BigNumberish, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "uniswapV3SwapCallback"
+  ): TypedContractMethod<
+    [amount0Delta: BigNumberish, amount1Delta: BigNumberish, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/callback/index.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/callback/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c552691c403d6a5cf2c9ddcab1e118a0919cf702
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/callback/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { IUniswapV3SwapCallback } from "./IUniswapV3SwapCallback";
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/index.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d1c7ca6de29fd0018daa1f3df9245d1f28fe0dc5
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/index.ts
@@ -0,0 +1,7 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as callback from "./callback";
+export type { callback };
+import type * as pool from "./pool";
+export type { pool };
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2b0768ab41c919c5de0c3a2f6b7bfb48f532bb22
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.ts
@@ -0,0 +1,265 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IUniswapV3PoolActionsInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "burn"
+      | "collect"
+      | "flash"
+      | "increaseObservationCardinalityNext"
+      | "initialize"
+      | "mint"
+      | "swap"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "burn",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "collect",
+    values: [
+      AddressLike,
+      BigNumberish,
+      BigNumberish,
+      BigNumberish,
+      BigNumberish
+    ]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "flash",
+    values: [AddressLike, BigNumberish, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "increaseObservationCardinalityNext",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "initialize",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "mint",
+    values: [AddressLike, BigNumberish, BigNumberish, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "swap",
+    values: [AddressLike, boolean, BigNumberish, BigNumberish, BytesLike]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "collect", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "flash", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "increaseObservationCardinalityNext",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "swap", data: BytesLike): Result;
+}
+
+export interface IUniswapV3PoolActions extends BaseContract {
+  connect(runner?: ContractRunner | null): IUniswapV3PoolActions;
+  waitForDeployment(): Promise<this>;
+
+  interface: IUniswapV3PoolActionsInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  burn: TypedContractMethod<
+    [tickLower: BigNumberish, tickUpper: BigNumberish, amount: BigNumberish],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+
+  collect: TypedContractMethod<
+    [
+      recipient: AddressLike,
+      tickLower: BigNumberish,
+      tickUpper: BigNumberish,
+      amount0Requested: BigNumberish,
+      amount1Requested: BigNumberish
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+
+  flash: TypedContractMethod<
+    [
+      recipient: AddressLike,
+      amount0: BigNumberish,
+      amount1: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  increaseObservationCardinalityNext: TypedContractMethod<
+    [observationCardinalityNext: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  initialize: TypedContractMethod<
+    [sqrtPriceX96: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  mint: TypedContractMethod<
+    [
+      recipient: AddressLike,
+      tickLower: BigNumberish,
+      tickUpper: BigNumberish,
+      amount: BigNumberish,
+      data: BytesLike
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+
+  swap: TypedContractMethod<
+    [
+      recipient: AddressLike,
+      zeroForOne: boolean,
+      amountSpecified: BigNumberish,
+      sqrtPriceLimitX96: BigNumberish,
+      data: BytesLike
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "burn"
+  ): TypedContractMethod<
+    [tickLower: BigNumberish, tickUpper: BigNumberish, amount: BigNumberish],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "collect"
+  ): TypedContractMethod<
+    [
+      recipient: AddressLike,
+      tickLower: BigNumberish,
+      tickUpper: BigNumberish,
+      amount0Requested: BigNumberish,
+      amount1Requested: BigNumberish
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "flash"
+  ): TypedContractMethod<
+    [
+      recipient: AddressLike,
+      amount0: BigNumberish,
+      amount1: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "increaseObservationCardinalityNext"
+  ): TypedContractMethod<
+    [observationCardinalityNext: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "initialize"
+  ): TypedContractMethod<[sqrtPriceX96: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "mint"
+  ): TypedContractMethod<
+    [
+      recipient: AddressLike,
+      tickLower: BigNumberish,
+      tickUpper: BigNumberish,
+      amount: BigNumberish,
+      data: BytesLike
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "swap"
+  ): TypedContractMethod<
+    [
+      recipient: AddressLike,
+      zeroForOne: boolean,
+      amountSpecified: BigNumberish,
+      sqrtPriceLimitX96: BigNumberish,
+      data: BytesLike
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.ts
new file mode 100644
index 0000000000000000000000000000000000000000..002b61503d7366786eb5b9d5210ff9ae9190c813
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.ts
@@ -0,0 +1,141 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IUniswapV3PoolDerivedStateInterface extends Interface {
+  getFunction(
+    nameOrSignature: "observe" | "snapshotCumulativesInside"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "observe",
+    values: [BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "snapshotCumulativesInside",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "observe", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "snapshotCumulativesInside",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IUniswapV3PoolDerivedState extends BaseContract {
+  connect(runner?: ContractRunner | null): IUniswapV3PoolDerivedState;
+  waitForDeployment(): Promise<this>;
+
+  interface: IUniswapV3PoolDerivedStateInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  observe: TypedContractMethod<
+    [secondsAgos: BigNumberish[]],
+    [
+      [bigint[], bigint[]] & {
+        tickCumulatives: bigint[];
+        secondsPerLiquidityCumulativeX128s: bigint[];
+      }
+    ],
+    "view"
+  >;
+
+  snapshotCumulativesInside: TypedContractMethod<
+    [tickLower: BigNumberish, tickUpper: BigNumberish],
+    [
+      [bigint, bigint, bigint] & {
+        tickCumulativeInside: bigint;
+        secondsPerLiquidityInsideX128: bigint;
+        secondsInside: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "observe"
+  ): TypedContractMethod<
+    [secondsAgos: BigNumberish[]],
+    [
+      [bigint[], bigint[]] & {
+        tickCumulatives: bigint[];
+        secondsPerLiquidityCumulativeX128s: bigint[];
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "snapshotCumulativesInside"
+  ): TypedContractMethod<
+    [tickLower: BigNumberish, tickUpper: BigNumberish],
+    [
+      [bigint, bigint, bigint] & {
+        tickCumulativeInside: bigint;
+        secondsPerLiquidityInsideX128: bigint;
+        secondsInside: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4f246a5b0e84f7f5879c4cbafa6f2aa46c7369e4
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.ts
@@ -0,0 +1,492 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  FunctionFragment,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+} from "../../../../../common";
+
+export interface IUniswapV3PoolEventsInterface extends Interface {
+  getEvent(
+    nameOrSignatureOrTopic:
+      | "Burn"
+      | "Collect"
+      | "CollectProtocol"
+      | "Flash"
+      | "IncreaseObservationCardinalityNext"
+      | "Initialize"
+      | "Mint"
+      | "SetFeeProtocol"
+      | "Swap"
+  ): EventFragment;
+}
+
+export namespace BurnEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    tickLower: BigNumberish,
+    tickUpper: BigNumberish,
+    amount: BigNumberish,
+    amount0: BigNumberish,
+    amount1: BigNumberish
+  ];
+  export type OutputTuple = [
+    owner: string,
+    tickLower: bigint,
+    tickUpper: bigint,
+    amount: bigint,
+    amount0: bigint,
+    amount1: bigint
+  ];
+  export interface OutputObject {
+    owner: string;
+    tickLower: bigint;
+    tickUpper: bigint;
+    amount: bigint;
+    amount0: bigint;
+    amount1: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace CollectEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    recipient: AddressLike,
+    tickLower: BigNumberish,
+    tickUpper: BigNumberish,
+    amount0: BigNumberish,
+    amount1: BigNumberish
+  ];
+  export type OutputTuple = [
+    owner: string,
+    recipient: string,
+    tickLower: bigint,
+    tickUpper: bigint,
+    amount0: bigint,
+    amount1: bigint
+  ];
+  export interface OutputObject {
+    owner: string;
+    recipient: string;
+    tickLower: bigint;
+    tickUpper: bigint;
+    amount0: bigint;
+    amount1: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace CollectProtocolEvent {
+  export type InputTuple = [
+    sender: AddressLike,
+    recipient: AddressLike,
+    amount0: BigNumberish,
+    amount1: BigNumberish
+  ];
+  export type OutputTuple = [
+    sender: string,
+    recipient: string,
+    amount0: bigint,
+    amount1: bigint
+  ];
+  export interface OutputObject {
+    sender: string;
+    recipient: string;
+    amount0: bigint;
+    amount1: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace FlashEvent {
+  export type InputTuple = [
+    sender: AddressLike,
+    recipient: AddressLike,
+    amount0: BigNumberish,
+    amount1: BigNumberish,
+    paid0: BigNumberish,
+    paid1: BigNumberish
+  ];
+  export type OutputTuple = [
+    sender: string,
+    recipient: string,
+    amount0: bigint,
+    amount1: bigint,
+    paid0: bigint,
+    paid1: bigint
+  ];
+  export interface OutputObject {
+    sender: string;
+    recipient: string;
+    amount0: bigint;
+    amount1: bigint;
+    paid0: bigint;
+    paid1: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace IncreaseObservationCardinalityNextEvent {
+  export type InputTuple = [
+    observationCardinalityNextOld: BigNumberish,
+    observationCardinalityNextNew: BigNumberish
+  ];
+  export type OutputTuple = [
+    observationCardinalityNextOld: bigint,
+    observationCardinalityNextNew: bigint
+  ];
+  export interface OutputObject {
+    observationCardinalityNextOld: bigint;
+    observationCardinalityNextNew: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace InitializeEvent {
+  export type InputTuple = [sqrtPriceX96: BigNumberish, tick: BigNumberish];
+  export type OutputTuple = [sqrtPriceX96: bigint, tick: bigint];
+  export interface OutputObject {
+    sqrtPriceX96: bigint;
+    tick: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace MintEvent {
+  export type InputTuple = [
+    sender: AddressLike,
+    owner: AddressLike,
+    tickLower: BigNumberish,
+    tickUpper: BigNumberish,
+    amount: BigNumberish,
+    amount0: BigNumberish,
+    amount1: BigNumberish
+  ];
+  export type OutputTuple = [
+    sender: string,
+    owner: string,
+    tickLower: bigint,
+    tickUpper: bigint,
+    amount: bigint,
+    amount0: bigint,
+    amount1: bigint
+  ];
+  export interface OutputObject {
+    sender: string;
+    owner: string;
+    tickLower: bigint;
+    tickUpper: bigint;
+    amount: bigint;
+    amount0: bigint;
+    amount1: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace SetFeeProtocolEvent {
+  export type InputTuple = [
+    feeProtocol0Old: BigNumberish,
+    feeProtocol1Old: BigNumberish,
+    feeProtocol0New: BigNumberish,
+    feeProtocol1New: BigNumberish
+  ];
+  export type OutputTuple = [
+    feeProtocol0Old: bigint,
+    feeProtocol1Old: bigint,
+    feeProtocol0New: bigint,
+    feeProtocol1New: bigint
+  ];
+  export interface OutputObject {
+    feeProtocol0Old: bigint;
+    feeProtocol1Old: bigint;
+    feeProtocol0New: bigint;
+    feeProtocol1New: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace SwapEvent {
+  export type InputTuple = [
+    sender: AddressLike,
+    recipient: AddressLike,
+    amount0: BigNumberish,
+    amount1: BigNumberish,
+    sqrtPriceX96: BigNumberish,
+    liquidity: BigNumberish,
+    tick: BigNumberish
+  ];
+  export type OutputTuple = [
+    sender: string,
+    recipient: string,
+    amount0: bigint,
+    amount1: bigint,
+    sqrtPriceX96: bigint,
+    liquidity: bigint,
+    tick: bigint
+  ];
+  export interface OutputObject {
+    sender: string;
+    recipient: string;
+    amount0: bigint;
+    amount1: bigint;
+    sqrtPriceX96: bigint;
+    liquidity: bigint;
+    tick: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IUniswapV3PoolEvents extends BaseContract {
+  connect(runner?: ContractRunner | null): IUniswapV3PoolEvents;
+  waitForDeployment(): Promise<this>;
+
+  interface: IUniswapV3PoolEventsInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getEvent(
+    key: "Burn"
+  ): TypedContractEvent<
+    BurnEvent.InputTuple,
+    BurnEvent.OutputTuple,
+    BurnEvent.OutputObject
+  >;
+  getEvent(
+    key: "Collect"
+  ): TypedContractEvent<
+    CollectEvent.InputTuple,
+    CollectEvent.OutputTuple,
+    CollectEvent.OutputObject
+  >;
+  getEvent(
+    key: "CollectProtocol"
+  ): TypedContractEvent<
+    CollectProtocolEvent.InputTuple,
+    CollectProtocolEvent.OutputTuple,
+    CollectProtocolEvent.OutputObject
+  >;
+  getEvent(
+    key: "Flash"
+  ): TypedContractEvent<
+    FlashEvent.InputTuple,
+    FlashEvent.OutputTuple,
+    FlashEvent.OutputObject
+  >;
+  getEvent(
+    key: "IncreaseObservationCardinalityNext"
+  ): TypedContractEvent<
+    IncreaseObservationCardinalityNextEvent.InputTuple,
+    IncreaseObservationCardinalityNextEvent.OutputTuple,
+    IncreaseObservationCardinalityNextEvent.OutputObject
+  >;
+  getEvent(
+    key: "Initialize"
+  ): TypedContractEvent<
+    InitializeEvent.InputTuple,
+    InitializeEvent.OutputTuple,
+    InitializeEvent.OutputObject
+  >;
+  getEvent(
+    key: "Mint"
+  ): TypedContractEvent<
+    MintEvent.InputTuple,
+    MintEvent.OutputTuple,
+    MintEvent.OutputObject
+  >;
+  getEvent(
+    key: "SetFeeProtocol"
+  ): TypedContractEvent<
+    SetFeeProtocolEvent.InputTuple,
+    SetFeeProtocolEvent.OutputTuple,
+    SetFeeProtocolEvent.OutputObject
+  >;
+  getEvent(
+    key: "Swap"
+  ): TypedContractEvent<
+    SwapEvent.InputTuple,
+    SwapEvent.OutputTuple,
+    SwapEvent.OutputObject
+  >;
+
+  filters: {
+    "Burn(address,int24,int24,uint128,uint256,uint256)": TypedContractEvent<
+      BurnEvent.InputTuple,
+      BurnEvent.OutputTuple,
+      BurnEvent.OutputObject
+    >;
+    Burn: TypedContractEvent<
+      BurnEvent.InputTuple,
+      BurnEvent.OutputTuple,
+      BurnEvent.OutputObject
+    >;
+
+    "Collect(address,address,int24,int24,uint128,uint128)": TypedContractEvent<
+      CollectEvent.InputTuple,
+      CollectEvent.OutputTuple,
+      CollectEvent.OutputObject
+    >;
+    Collect: TypedContractEvent<
+      CollectEvent.InputTuple,
+      CollectEvent.OutputTuple,
+      CollectEvent.OutputObject
+    >;
+
+    "CollectProtocol(address,address,uint128,uint128)": TypedContractEvent<
+      CollectProtocolEvent.InputTuple,
+      CollectProtocolEvent.OutputTuple,
+      CollectProtocolEvent.OutputObject
+    >;
+    CollectProtocol: TypedContractEvent<
+      CollectProtocolEvent.InputTuple,
+      CollectProtocolEvent.OutputTuple,
+      CollectProtocolEvent.OutputObject
+    >;
+
+    "Flash(address,address,uint256,uint256,uint256,uint256)": TypedContractEvent<
+      FlashEvent.InputTuple,
+      FlashEvent.OutputTuple,
+      FlashEvent.OutputObject
+    >;
+    Flash: TypedContractEvent<
+      FlashEvent.InputTuple,
+      FlashEvent.OutputTuple,
+      FlashEvent.OutputObject
+    >;
+
+    "IncreaseObservationCardinalityNext(uint16,uint16)": TypedContractEvent<
+      IncreaseObservationCardinalityNextEvent.InputTuple,
+      IncreaseObservationCardinalityNextEvent.OutputTuple,
+      IncreaseObservationCardinalityNextEvent.OutputObject
+    >;
+    IncreaseObservationCardinalityNext: TypedContractEvent<
+      IncreaseObservationCardinalityNextEvent.InputTuple,
+      IncreaseObservationCardinalityNextEvent.OutputTuple,
+      IncreaseObservationCardinalityNextEvent.OutputObject
+    >;
+
+    "Initialize(uint160,int24)": TypedContractEvent<
+      InitializeEvent.InputTuple,
+      InitializeEvent.OutputTuple,
+      InitializeEvent.OutputObject
+    >;
+    Initialize: TypedContractEvent<
+      InitializeEvent.InputTuple,
+      InitializeEvent.OutputTuple,
+      InitializeEvent.OutputObject
+    >;
+
+    "Mint(address,address,int24,int24,uint128,uint256,uint256)": TypedContractEvent<
+      MintEvent.InputTuple,
+      MintEvent.OutputTuple,
+      MintEvent.OutputObject
+    >;
+    Mint: TypedContractEvent<
+      MintEvent.InputTuple,
+      MintEvent.OutputTuple,
+      MintEvent.OutputObject
+    >;
+
+    "SetFeeProtocol(uint8,uint8,uint8,uint8)": TypedContractEvent<
+      SetFeeProtocolEvent.InputTuple,
+      SetFeeProtocolEvent.OutputTuple,
+      SetFeeProtocolEvent.OutputObject
+    >;
+    SetFeeProtocol: TypedContractEvent<
+      SetFeeProtocolEvent.InputTuple,
+      SetFeeProtocolEvent.OutputTuple,
+      SetFeeProtocolEvent.OutputObject
+    >;
+
+    "Swap(address,address,int256,int256,uint160,uint128,int24)": TypedContractEvent<
+      SwapEvent.InputTuple,
+      SwapEvent.OutputTuple,
+      SwapEvent.OutputObject
+    >;
+    Swap: TypedContractEvent<
+      SwapEvent.InputTuple,
+      SwapEvent.OutputTuple,
+      SwapEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ab56892aeeddb607527281297cfbee33a30b5e15
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.ts
@@ -0,0 +1,139 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IUniswapV3PoolImmutablesInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "factory"
+      | "fee"
+      | "maxLiquidityPerTick"
+      | "tickSpacing"
+      | "token0"
+      | "token1"
+  ): FunctionFragment;
+
+  encodeFunctionData(functionFragment: "factory", values?: undefined): string;
+  encodeFunctionData(functionFragment: "fee", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "maxLiquidityPerTick",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "tickSpacing",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "token0", values?: undefined): string;
+  encodeFunctionData(functionFragment: "token1", values?: undefined): string;
+
+  decodeFunctionResult(functionFragment: "factory", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "fee", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "maxLiquidityPerTick",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "tickSpacing",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "token0", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "token1", data: BytesLike): Result;
+}
+
+export interface IUniswapV3PoolImmutables extends BaseContract {
+  connect(runner?: ContractRunner | null): IUniswapV3PoolImmutables;
+  waitForDeployment(): Promise<this>;
+
+  interface: IUniswapV3PoolImmutablesInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  factory: TypedContractMethod<[], [string], "view">;
+
+  fee: TypedContractMethod<[], [bigint], "view">;
+
+  maxLiquidityPerTick: TypedContractMethod<[], [bigint], "view">;
+
+  tickSpacing: TypedContractMethod<[], [bigint], "view">;
+
+  token0: TypedContractMethod<[], [string], "view">;
+
+  token1: TypedContractMethod<[], [string], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "factory"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "fee"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "maxLiquidityPerTick"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "tickSpacing"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "token0"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "token1"
+  ): TypedContractMethod<[], [string], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5db2d96548a26f6ffeee846f61ecaf3ba39f4ce8
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.ts
@@ -0,0 +1,131 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IUniswapV3PoolOwnerActionsInterface extends Interface {
+  getFunction(
+    nameOrSignature: "collectProtocol" | "setFeeProtocol"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "collectProtocol",
+    values: [AddressLike, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "setFeeProtocol",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "collectProtocol",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "setFeeProtocol",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IUniswapV3PoolOwnerActions extends BaseContract {
+  connect(runner?: ContractRunner | null): IUniswapV3PoolOwnerActions;
+  waitForDeployment(): Promise<this>;
+
+  interface: IUniswapV3PoolOwnerActionsInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  collectProtocol: TypedContractMethod<
+    [
+      recipient: AddressLike,
+      amount0Requested: BigNumberish,
+      amount1Requested: BigNumberish
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+
+  setFeeProtocol: TypedContractMethod<
+    [feeProtocol0: BigNumberish, feeProtocol1: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "collectProtocol"
+  ): TypedContractMethod<
+    [
+      recipient: AddressLike,
+      amount0Requested: BigNumberish,
+      amount1Requested: BigNumberish
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "setFeeProtocol"
+  ): TypedContractMethod<
+    [feeProtocol0: BigNumberish, feeProtocol1: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.ts
new file mode 100644
index 0000000000000000000000000000000000000000..33ac4c9aa580383d45652b1abd4869e09f6e8ee3
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.ts
@@ -0,0 +1,298 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IUniswapV3PoolStateInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "feeGrowthGlobal0X128"
+      | "feeGrowthGlobal1X128"
+      | "liquidity"
+      | "observations"
+      | "positions"
+      | "protocolFees"
+      | "slot0"
+      | "tickBitmap"
+      | "ticks"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "feeGrowthGlobal0X128",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "feeGrowthGlobal1X128",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "liquidity", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "observations",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "positions",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "protocolFees",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "slot0", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "tickBitmap",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "ticks", values: [BigNumberish]): string;
+
+  decodeFunctionResult(
+    functionFragment: "feeGrowthGlobal0X128",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "feeGrowthGlobal1X128",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "liquidity", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "observations",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "positions", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "protocolFees",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "slot0", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "tickBitmap", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "ticks", data: BytesLike): Result;
+}
+
+export interface IUniswapV3PoolState extends BaseContract {
+  connect(runner?: ContractRunner | null): IUniswapV3PoolState;
+  waitForDeployment(): Promise<this>;
+
+  interface: IUniswapV3PoolStateInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  feeGrowthGlobal0X128: TypedContractMethod<[], [bigint], "view">;
+
+  feeGrowthGlobal1X128: TypedContractMethod<[], [bigint], "view">;
+
+  liquidity: TypedContractMethod<[], [bigint], "view">;
+
+  observations: TypedContractMethod<
+    [index: BigNumberish],
+    [
+      [bigint, bigint, bigint, boolean] & {
+        blockTimestamp: bigint;
+        tickCumulative: bigint;
+        secondsPerLiquidityCumulativeX128: bigint;
+        initialized: boolean;
+      }
+    ],
+    "view"
+  >;
+
+  positions: TypedContractMethod<
+    [key: BytesLike],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        _liquidity: bigint;
+        feeGrowthInside0LastX128: bigint;
+        feeGrowthInside1LastX128: bigint;
+        tokensOwed0: bigint;
+        tokensOwed1: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  protocolFees: TypedContractMethod<
+    [],
+    [[bigint, bigint] & { token0: bigint; token1: bigint }],
+    "view"
+  >;
+
+  slot0: TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint, bigint, boolean] & {
+        sqrtPriceX96: bigint;
+        tick: bigint;
+        observationIndex: bigint;
+        observationCardinality: bigint;
+        observationCardinalityNext: bigint;
+        feeProtocol: bigint;
+        unlocked: boolean;
+      }
+    ],
+    "view"
+  >;
+
+  tickBitmap: TypedContractMethod<
+    [wordPosition: BigNumberish],
+    [bigint],
+    "view"
+  >;
+
+  ticks: TypedContractMethod<
+    [tick: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint, bigint, bigint, boolean] & {
+        liquidityGross: bigint;
+        liquidityNet: bigint;
+        feeGrowthOutside0X128: bigint;
+        feeGrowthOutside1X128: bigint;
+        tickCumulativeOutside: bigint;
+        secondsPerLiquidityOutsideX128: bigint;
+        secondsOutside: bigint;
+        initialized: boolean;
+      }
+    ],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "feeGrowthGlobal0X128"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "feeGrowthGlobal1X128"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "liquidity"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "observations"
+  ): TypedContractMethod<
+    [index: BigNumberish],
+    [
+      [bigint, bigint, bigint, boolean] & {
+        blockTimestamp: bigint;
+        tickCumulative: bigint;
+        secondsPerLiquidityCumulativeX128: bigint;
+        initialized: boolean;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "positions"
+  ): TypedContractMethod<
+    [key: BytesLike],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        _liquidity: bigint;
+        feeGrowthInside0LastX128: bigint;
+        feeGrowthInside1LastX128: bigint;
+        tokensOwed0: bigint;
+        tokensOwed1: bigint;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "protocolFees"
+  ): TypedContractMethod<
+    [],
+    [[bigint, bigint] & { token0: bigint; token1: bigint }],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "slot0"
+  ): TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint, bigint, boolean] & {
+        sqrtPriceX96: bigint;
+        tick: bigint;
+        observationIndex: bigint;
+        observationCardinality: bigint;
+        observationCardinalityNext: bigint;
+        feeProtocol: bigint;
+        unlocked: boolean;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "tickBitmap"
+  ): TypedContractMethod<[wordPosition: BigNumberish], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "ticks"
+  ): TypedContractMethod<
+    [tick: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint, bigint, bigint, boolean] & {
+        liquidityGross: bigint;
+        liquidityNet: bigint;
+        feeGrowthOutside0X128: bigint;
+        feeGrowthOutside1X128: bigint;
+        tickCumulativeOutside: bigint;
+        secondsPerLiquidityOutsideX128: bigint;
+        secondsOutside: bigint;
+        initialized: boolean;
+      }
+    ],
+    "view"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/index.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..459d8ece6f674034b01303ae419b215867a7dd12
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/contracts/interfaces/pool/index.ts
@@ -0,0 +1,9 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { IUniswapV3PoolActions } from "./IUniswapV3PoolActions";
+export type { IUniswapV3PoolDerivedState } from "./IUniswapV3PoolDerivedState";
+export type { IUniswapV3PoolEvents } from "./IUniswapV3PoolEvents";
+export type { IUniswapV3PoolImmutables } from "./IUniswapV3PoolImmutables";
+export type { IUniswapV3PoolOwnerActions } from "./IUniswapV3PoolOwnerActions";
+export type { IUniswapV3PoolState } from "./IUniswapV3PoolState";
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-core/index.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a11e4ca299013228e835e98a10502ed6603e575b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-core/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as contracts from "./contracts";
+export type { contracts };
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/contracts/index.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/contracts/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..92159233f80a824de74163d927a22ffa7734c206
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/contracts/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as interfaces from "./interfaces";
+export type { interfaces };
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.ts
new file mode 100644
index 0000000000000000000000000000000000000000..22e1bc3f76c33a2480cdc433c464b9f774bea3bf
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.ts
@@ -0,0 +1,296 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export declare namespace ISwapRouter {
+  export type ExactInputParamsStruct = {
+    path: BytesLike;
+    recipient: AddressLike;
+    deadline: BigNumberish;
+    amountIn: BigNumberish;
+    amountOutMinimum: BigNumberish;
+  };
+
+  export type ExactInputParamsStructOutput = [
+    path: string,
+    recipient: string,
+    deadline: bigint,
+    amountIn: bigint,
+    amountOutMinimum: bigint
+  ] & {
+    path: string;
+    recipient: string;
+    deadline: bigint;
+    amountIn: bigint;
+    amountOutMinimum: bigint;
+  };
+
+  export type ExactInputSingleParamsStruct = {
+    tokenIn: AddressLike;
+    tokenOut: AddressLike;
+    fee: BigNumberish;
+    recipient: AddressLike;
+    deadline: BigNumberish;
+    amountIn: BigNumberish;
+    amountOutMinimum: BigNumberish;
+    sqrtPriceLimitX96: BigNumberish;
+  };
+
+  export type ExactInputSingleParamsStructOutput = [
+    tokenIn: string,
+    tokenOut: string,
+    fee: bigint,
+    recipient: string,
+    deadline: bigint,
+    amountIn: bigint,
+    amountOutMinimum: bigint,
+    sqrtPriceLimitX96: bigint
+  ] & {
+    tokenIn: string;
+    tokenOut: string;
+    fee: bigint;
+    recipient: string;
+    deadline: bigint;
+    amountIn: bigint;
+    amountOutMinimum: bigint;
+    sqrtPriceLimitX96: bigint;
+  };
+
+  export type ExactOutputParamsStruct = {
+    path: BytesLike;
+    recipient: AddressLike;
+    deadline: BigNumberish;
+    amountOut: BigNumberish;
+    amountInMaximum: BigNumberish;
+  };
+
+  export type ExactOutputParamsStructOutput = [
+    path: string,
+    recipient: string,
+    deadline: bigint,
+    amountOut: bigint,
+    amountInMaximum: bigint
+  ] & {
+    path: string;
+    recipient: string;
+    deadline: bigint;
+    amountOut: bigint;
+    amountInMaximum: bigint;
+  };
+
+  export type ExactOutputSingleParamsStruct = {
+    tokenIn: AddressLike;
+    tokenOut: AddressLike;
+    fee: BigNumberish;
+    recipient: AddressLike;
+    deadline: BigNumberish;
+    amountOut: BigNumberish;
+    amountInMaximum: BigNumberish;
+    sqrtPriceLimitX96: BigNumberish;
+  };
+
+  export type ExactOutputSingleParamsStructOutput = [
+    tokenIn: string,
+    tokenOut: string,
+    fee: bigint,
+    recipient: string,
+    deadline: bigint,
+    amountOut: bigint,
+    amountInMaximum: bigint,
+    sqrtPriceLimitX96: bigint
+  ] & {
+    tokenIn: string;
+    tokenOut: string;
+    fee: bigint;
+    recipient: string;
+    deadline: bigint;
+    amountOut: bigint;
+    amountInMaximum: bigint;
+    sqrtPriceLimitX96: bigint;
+  };
+}
+
+export interface ISwapRouterInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "exactInput"
+      | "exactInputSingle"
+      | "exactOutput"
+      | "exactOutputSingle"
+      | "uniswapV3SwapCallback"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "exactInput",
+    values: [ISwapRouter.ExactInputParamsStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "exactInputSingle",
+    values: [ISwapRouter.ExactInputSingleParamsStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "exactOutput",
+    values: [ISwapRouter.ExactOutputParamsStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "exactOutputSingle",
+    values: [ISwapRouter.ExactOutputSingleParamsStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "uniswapV3SwapCallback",
+    values: [BigNumberish, BigNumberish, BytesLike]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "exactInput", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "exactInputSingle",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "exactOutput",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "exactOutputSingle",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "uniswapV3SwapCallback",
+    data: BytesLike
+  ): Result;
+}
+
+export interface ISwapRouter extends BaseContract {
+  connect(runner?: ContractRunner | null): ISwapRouter;
+  waitForDeployment(): Promise<this>;
+
+  interface: ISwapRouterInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  exactInput: TypedContractMethod<
+    [params: ISwapRouter.ExactInputParamsStruct],
+    [bigint],
+    "payable"
+  >;
+
+  exactInputSingle: TypedContractMethod<
+    [params: ISwapRouter.ExactInputSingleParamsStruct],
+    [bigint],
+    "payable"
+  >;
+
+  exactOutput: TypedContractMethod<
+    [params: ISwapRouter.ExactOutputParamsStruct],
+    [bigint],
+    "payable"
+  >;
+
+  exactOutputSingle: TypedContractMethod<
+    [params: ISwapRouter.ExactOutputSingleParamsStruct],
+    [bigint],
+    "payable"
+  >;
+
+  uniswapV3SwapCallback: TypedContractMethod<
+    [amount0Delta: BigNumberish, amount1Delta: BigNumberish, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "exactInput"
+  ): TypedContractMethod<
+    [params: ISwapRouter.ExactInputParamsStruct],
+    [bigint],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "exactInputSingle"
+  ): TypedContractMethod<
+    [params: ISwapRouter.ExactInputSingleParamsStruct],
+    [bigint],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "exactOutput"
+  ): TypedContractMethod<
+    [params: ISwapRouter.ExactOutputParamsStruct],
+    [bigint],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "exactOutputSingle"
+  ): TypedContractMethod<
+    [params: ISwapRouter.ExactOutputSingleParamsStruct],
+    [bigint],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "uniswapV3SwapCallback"
+  ): TypedContractMethod<
+    [amount0Delta: BigNumberish, amount1Delta: BigNumberish, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/contracts/interfaces/index.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/contracts/interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0286eebba93b8edbd0d4c81eae81463a3aae0694
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/contracts/interfaces/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { ISwapRouter } from "./ISwapRouter";
diff --git a/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/index.ts b/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a11e4ca299013228e835e98a10502ed6603e575b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/@uniswap/v3-periphery/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as contracts from "./contracts";
+export type { contracts };
diff --git a/momiji-helpers/utils/typechain-types/common.ts b/momiji-helpers/utils/typechain-types/common.ts
new file mode 100644
index 0000000000000000000000000000000000000000..56b5f21e9c1c1776ac6bedd486163b420aa8a837
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/common.ts
@@ -0,0 +1,131 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  FunctionFragment,
+  Typed,
+  EventFragment,
+  ContractTransaction,
+  ContractTransactionResponse,
+  DeferredTopicFilter,
+  EventLog,
+  TransactionRequest,
+  LogDescription,
+} from "ethers";
+
+export interface TypedDeferredTopicFilter<_TCEvent extends TypedContractEvent>
+  extends DeferredTopicFilter {}
+
+export interface TypedContractEvent<
+  InputTuple extends Array<any> = any,
+  OutputTuple extends Array<any> = any,
+  OutputObject = any
+> {
+  (...args: Partial<InputTuple>): TypedDeferredTopicFilter<
+    TypedContractEvent<InputTuple, OutputTuple, OutputObject>
+  >;
+  name: string;
+  fragment: EventFragment;
+  getFragment(...args: Partial<InputTuple>): EventFragment;
+}
+
+type __TypechainAOutputTuple<T> = T extends TypedContractEvent<
+  infer _U,
+  infer W
+>
+  ? W
+  : never;
+type __TypechainOutputObject<T> = T extends TypedContractEvent<
+  infer _U,
+  infer _W,
+  infer V
+>
+  ? V
+  : never;
+
+export interface TypedEventLog<TCEvent extends TypedContractEvent>
+  extends Omit<EventLog, "args"> {
+  args: __TypechainAOutputTuple<TCEvent> & __TypechainOutputObject<TCEvent>;
+}
+
+export interface TypedLogDescription<TCEvent extends TypedContractEvent>
+  extends Omit<LogDescription, "args"> {
+  args: __TypechainAOutputTuple<TCEvent> & __TypechainOutputObject<TCEvent>;
+}
+
+export type TypedListener<TCEvent extends TypedContractEvent> = (
+  ...listenerArg: [
+    ...__TypechainAOutputTuple<TCEvent>,
+    TypedEventLog<TCEvent>,
+    ...undefined[]
+  ]
+) => void;
+
+export type MinEthersFactory<C, ARGS> = {
+  deploy(...a: ARGS[]): Promise<C>;
+};
+
+export type GetContractTypeFromFactory<F> = F extends MinEthersFactory<
+  infer C,
+  any
+>
+  ? C
+  : never;
+export type GetARGsTypeFromFactory<F> = F extends MinEthersFactory<any, any>
+  ? Parameters<F["deploy"]>
+  : never;
+
+export type StateMutability = "nonpayable" | "payable" | "view";
+
+export type BaseOverrides = Omit<TransactionRequest, "to" | "data">;
+export type NonPayableOverrides = Omit<
+  BaseOverrides,
+  "value" | "blockTag" | "enableCcipRead"
+>;
+export type PayableOverrides = Omit<
+  BaseOverrides,
+  "blockTag" | "enableCcipRead"
+>;
+export type ViewOverrides = Omit<TransactionRequest, "to" | "data">;
+export type Overrides<S extends StateMutability> = S extends "nonpayable"
+  ? NonPayableOverrides
+  : S extends "payable"
+  ? PayableOverrides
+  : ViewOverrides;
+
+export type PostfixOverrides<A extends Array<any>, S extends StateMutability> =
+  | A
+  | [...A, Overrides<S>];
+export type ContractMethodArgs<
+  A extends Array<any>,
+  S extends StateMutability
+> = PostfixOverrides<{ [I in keyof A]-?: A[I] | Typed }, S>;
+
+export type DefaultReturnType<R> = R extends Array<any> ? R[0] : R;
+
+// export interface ContractMethod<A extends Array<any> = Array<any>, R = any, D extends R | ContractTransactionResponse = R | ContractTransactionResponse> {
+export interface TypedContractMethod<
+  A extends Array<any> = Array<any>,
+  R = any,
+  S extends StateMutability = "payable"
+> {
+  (...args: ContractMethodArgs<A, S>): S extends "view"
+    ? Promise<DefaultReturnType<R>>
+    : Promise<ContractTransactionResponse>;
+
+  name: string;
+
+  fragment: FunctionFragment;
+
+  getFragment(...args: ContractMethodArgs<A, S>): FunctionFragment;
+
+  populateTransaction(
+    ...args: ContractMethodArgs<A, S>
+  ): Promise<ContractTransaction>;
+  staticCall(
+    ...args: ContractMethodArgs<A, "view">
+  ): Promise<DefaultReturnType<R>>;
+  send(...args: ContractMethodArgs<A, S>): Promise<ContractTransactionResponse>;
+  estimateGas(...args: ContractMethodArgs<A, S>): Promise<bigint>;
+  staticCallResult(...args: ContractMethodArgs<A, "view">): Promise<R>;
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4411c222003230db1c35c863db0412493ea97fb4
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.ts
@@ -0,0 +1,233 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../../../common";
+
+export interface AggregatorInterfaceInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "getAnswer"
+      | "getTimestamp"
+      | "latestAnswer"
+      | "latestRound"
+      | "latestTimestamp"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "AnswerUpdated" | "NewRound"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "getAnswer",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getTimestamp",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestAnswer",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestRound",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestTimestamp",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(functionFragment: "getAnswer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getTimestamp",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestAnswer",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestRound",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestTimestamp",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace AnswerUpdatedEvent {
+  export type InputTuple = [
+    current: BigNumberish,
+    roundId: BigNumberish,
+    updatedAt: BigNumberish
+  ];
+  export type OutputTuple = [
+    current: bigint,
+    roundId: bigint,
+    updatedAt: bigint
+  ];
+  export interface OutputObject {
+    current: bigint;
+    roundId: bigint;
+    updatedAt: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace NewRoundEvent {
+  export type InputTuple = [
+    roundId: BigNumberish,
+    startedBy: AddressLike,
+    startedAt: BigNumberish
+  ];
+  export type OutputTuple = [
+    roundId: bigint,
+    startedBy: string,
+    startedAt: bigint
+  ];
+  export interface OutputObject {
+    roundId: bigint;
+    startedBy: string;
+    startedAt: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface AggregatorInterface extends BaseContract {
+  connect(runner?: ContractRunner | null): AggregatorInterface;
+  waitForDeployment(): Promise<this>;
+
+  interface: AggregatorInterfaceInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getAnswer: TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+
+  getTimestamp: TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+
+  latestAnswer: TypedContractMethod<[], [bigint], "view">;
+
+  latestRound: TypedContractMethod<[], [bigint], "view">;
+
+  latestTimestamp: TypedContractMethod<[], [bigint], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "getAnswer"
+  ): TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getTimestamp"
+  ): TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestAnswer"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestRound"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestTimestamp"
+  ): TypedContractMethod<[], [bigint], "view">;
+
+  getEvent(
+    key: "AnswerUpdated"
+  ): TypedContractEvent<
+    AnswerUpdatedEvent.InputTuple,
+    AnswerUpdatedEvent.OutputTuple,
+    AnswerUpdatedEvent.OutputObject
+  >;
+  getEvent(
+    key: "NewRound"
+  ): TypedContractEvent<
+    NewRoundEvent.InputTuple,
+    NewRoundEvent.OutputTuple,
+    NewRoundEvent.OutputObject
+  >;
+
+  filters: {
+    "AnswerUpdated(int256,uint256,uint256)": TypedContractEvent<
+      AnswerUpdatedEvent.InputTuple,
+      AnswerUpdatedEvent.OutputTuple,
+      AnswerUpdatedEvent.OutputObject
+    >;
+    AnswerUpdated: TypedContractEvent<
+      AnswerUpdatedEvent.InputTuple,
+      AnswerUpdatedEvent.OutputTuple,
+      AnswerUpdatedEvent.OutputObject
+    >;
+
+    "NewRound(uint256,address,uint256)": TypedContractEvent<
+      NewRoundEvent.InputTuple,
+      NewRoundEvent.OutputTuple,
+      NewRoundEvent.OutputObject
+    >;
+    NewRound: TypedContractEvent<
+      NewRoundEvent.InputTuple,
+      NewRoundEvent.OutputTuple,
+      NewRoundEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5841318bad4b4fc955143af44b778af3106e2df2
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.ts
@@ -0,0 +1,339 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../../../common";
+
+export interface AggregatorV2V3InterfaceInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "decimals"
+      | "description"
+      | "getAnswer"
+      | "getRoundData"
+      | "getTimestamp"
+      | "latestAnswer"
+      | "latestRound"
+      | "latestRoundData"
+      | "latestTimestamp"
+      | "version"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "AnswerUpdated" | "NewRound"): EventFragment;
+
+  encodeFunctionData(functionFragment: "decimals", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "description",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getAnswer",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getRoundData",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getTimestamp",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestAnswer",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestRound",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestRoundData",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestTimestamp",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "version", values?: undefined): string;
+
+  decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "description",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "getAnswer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getRoundData",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getTimestamp",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestAnswer",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestRound",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestRoundData",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestTimestamp",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "version", data: BytesLike): Result;
+}
+
+export namespace AnswerUpdatedEvent {
+  export type InputTuple = [
+    current: BigNumberish,
+    roundId: BigNumberish,
+    updatedAt: BigNumberish
+  ];
+  export type OutputTuple = [
+    current: bigint,
+    roundId: bigint,
+    updatedAt: bigint
+  ];
+  export interface OutputObject {
+    current: bigint;
+    roundId: bigint;
+    updatedAt: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace NewRoundEvent {
+  export type InputTuple = [
+    roundId: BigNumberish,
+    startedBy: AddressLike,
+    startedAt: BigNumberish
+  ];
+  export type OutputTuple = [
+    roundId: bigint,
+    startedBy: string,
+    startedAt: bigint
+  ];
+  export interface OutputObject {
+    roundId: bigint;
+    startedBy: string;
+    startedAt: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface AggregatorV2V3Interface extends BaseContract {
+  connect(runner?: ContractRunner | null): AggregatorV2V3Interface;
+  waitForDeployment(): Promise<this>;
+
+  interface: AggregatorV2V3InterfaceInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  decimals: TypedContractMethod<[], [bigint], "view">;
+
+  description: TypedContractMethod<[], [string], "view">;
+
+  getAnswer: TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+
+  getRoundData: TypedContractMethod<
+    [_roundId: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  getTimestamp: TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+
+  latestAnswer: TypedContractMethod<[], [bigint], "view">;
+
+  latestRound: TypedContractMethod<[], [bigint], "view">;
+
+  latestRoundData: TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  latestTimestamp: TypedContractMethod<[], [bigint], "view">;
+
+  version: TypedContractMethod<[], [bigint], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "decimals"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "description"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "getAnswer"
+  ): TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getRoundData"
+  ): TypedContractMethod<
+    [_roundId: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "getTimestamp"
+  ): TypedContractMethod<[roundId: BigNumberish], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestAnswer"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestRound"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "latestRoundData"
+  ): TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "latestTimestamp"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "version"
+  ): TypedContractMethod<[], [bigint], "view">;
+
+  getEvent(
+    key: "AnswerUpdated"
+  ): TypedContractEvent<
+    AnswerUpdatedEvent.InputTuple,
+    AnswerUpdatedEvent.OutputTuple,
+    AnswerUpdatedEvent.OutputObject
+  >;
+  getEvent(
+    key: "NewRound"
+  ): TypedContractEvent<
+    NewRoundEvent.InputTuple,
+    NewRoundEvent.OutputTuple,
+    NewRoundEvent.OutputObject
+  >;
+
+  filters: {
+    "AnswerUpdated(int256,uint256,uint256)": TypedContractEvent<
+      AnswerUpdatedEvent.InputTuple,
+      AnswerUpdatedEvent.OutputTuple,
+      AnswerUpdatedEvent.OutputObject
+    >;
+    AnswerUpdated: TypedContractEvent<
+      AnswerUpdatedEvent.InputTuple,
+      AnswerUpdatedEvent.OutputTuple,
+      AnswerUpdatedEvent.OutputObject
+    >;
+
+    "NewRound(uint256,address,uint256)": TypedContractEvent<
+      NewRoundEvent.InputTuple,
+      NewRoundEvent.OutputTuple,
+      NewRoundEvent.OutputObject
+    >;
+    NewRound: TypedContractEvent<
+      NewRoundEvent.InputTuple,
+      NewRoundEvent.OutputTuple,
+      NewRoundEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7129f1e98aae7dfe841ae5ff9e5c13151231e57a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.ts
@@ -0,0 +1,186 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../../../common";
+
+export interface AggregatorV3InterfaceInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "decimals"
+      | "description"
+      | "getRoundData"
+      | "latestRoundData"
+      | "version"
+  ): FunctionFragment;
+
+  encodeFunctionData(functionFragment: "decimals", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "description",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getRoundData",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "latestRoundData",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "version", values?: undefined): string;
+
+  decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "description",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getRoundData",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "latestRoundData",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "version", data: BytesLike): Result;
+}
+
+export interface AggregatorV3Interface extends BaseContract {
+  connect(runner?: ContractRunner | null): AggregatorV3Interface;
+  waitForDeployment(): Promise<this>;
+
+  interface: AggregatorV3InterfaceInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  decimals: TypedContractMethod<[], [bigint], "view">;
+
+  description: TypedContractMethod<[], [string], "view">;
+
+  getRoundData: TypedContractMethod<
+    [_roundId: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  latestRoundData: TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  version: TypedContractMethod<[], [bigint], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "decimals"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "description"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "getRoundData"
+  ): TypedContractMethod<
+    [_roundId: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "latestRoundData"
+  ): TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        roundId: bigint;
+        answer: bigint;
+        startedAt: bigint;
+        updatedAt: bigint;
+        answeredInRound: bigint;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "version"
+  ): TypedContractMethod<[], [bigint], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8290f6900dc8ea1da135fbaad78e14d11b516ea1
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts
@@ -0,0 +1,186 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../common";
+
+export interface OwnableUpgradeableInterface extends Interface {
+  getFunction(
+    nameOrSignature: "owner" | "renounceOwnership" | "transferOwnership"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "Initialized" | "OwnershipTransferred"
+  ): EventFragment;
+
+  encodeFunctionData(functionFragment: "owner", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "renounceOwnership",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferOwnership",
+    values: [AddressLike]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "renounceOwnership",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "transferOwnership",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace OwnershipTransferredEvent {
+  export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike];
+  export type OutputTuple = [previousOwner: string, newOwner: string];
+  export interface OutputObject {
+    previousOwner: string;
+    newOwner: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface OwnableUpgradeable extends BaseContract {
+  connect(runner?: ContractRunner | null): OwnableUpgradeable;
+  waitForDeployment(): Promise<this>;
+
+  interface: OwnableUpgradeableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  owner: TypedContractMethod<[], [string], "view">;
+
+  renounceOwnership: TypedContractMethod<[], [void], "nonpayable">;
+
+  transferOwnership: TypedContractMethod<
+    [newOwner: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "owner"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "renounceOwnership"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "transferOwnership"
+  ): TypedContractMethod<[newOwner: AddressLike], [void], "nonpayable">;
+
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+  getEvent(
+    key: "OwnershipTransferred"
+  ): TypedContractEvent<
+    OwnershipTransferredEvent.InputTuple,
+    OwnershipTransferredEvent.OutputTuple,
+    OwnershipTransferredEvent.OutputObject
+  >;
+
+  filters: {
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+
+    "OwnershipTransferred(address,address)": TypedContractEvent<
+      OwnershipTransferredEvent.InputTuple,
+      OwnershipTransferredEvent.OutputTuple,
+      OwnershipTransferredEvent.OutputObject
+    >;
+    OwnershipTransferred: TypedContractEvent<
+      OwnershipTransferredEvent.InputTuple,
+      OwnershipTransferredEvent.OutputTuple,
+      OwnershipTransferredEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a3065220891d3dbcfbd886786e185ffae4244549
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.ts
@@ -0,0 +1,105 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  FunctionFragment,
+  Interface,
+  EventFragment,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+} from "../../../../../../../common";
+
+export interface InitializableInterface extends Interface {
+  getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface Initializable extends BaseContract {
+  connect(runner?: ContractRunner | null): Initializable;
+  waitForDeployment(): Promise<this>;
+
+  interface: InitializableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+
+  filters: {
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3e1b20a9d8745bd1c67142d10c3d267857eb31ba
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.ts
@@ -0,0 +1,196 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../../common";
+
+export interface UUPSUpgradeableInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "UPGRADE_INTERFACE_VERSION"
+      | "proxiableUUID"
+      | "upgradeToAndCall"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "Initialized" | "Upgraded"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "UPGRADE_INTERFACE_VERSION",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "proxiableUUID",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "upgradeToAndCall",
+    values: [AddressLike, BytesLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "UPGRADE_INTERFACE_VERSION",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "proxiableUUID",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "upgradeToAndCall",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace UpgradedEvent {
+  export type InputTuple = [implementation: AddressLike];
+  export type OutputTuple = [implementation: string];
+  export interface OutputObject {
+    implementation: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface UUPSUpgradeable extends BaseContract {
+  connect(runner?: ContractRunner | null): UUPSUpgradeable;
+  waitForDeployment(): Promise<this>;
+
+  interface: UUPSUpgradeableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  UPGRADE_INTERFACE_VERSION: TypedContractMethod<[], [string], "view">;
+
+  proxiableUUID: TypedContractMethod<[], [string], "view">;
+
+  upgradeToAndCall: TypedContractMethod<
+    [newImplementation: AddressLike, data: BytesLike],
+    [void],
+    "payable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "UPGRADE_INTERFACE_VERSION"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "proxiableUUID"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "upgradeToAndCall"
+  ): TypedContractMethod<
+    [newImplementation: AddressLike, data: BytesLike],
+    [void],
+    "payable"
+  >;
+
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Upgraded"
+  ): TypedContractEvent<
+    UpgradedEvent.InputTuple,
+    UpgradedEvent.OutputTuple,
+    UpgradedEvent.OutputObject
+  >;
+
+  filters: {
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+
+    "Upgraded(address)": TypedContractEvent<
+      UpgradedEvent.InputTuple,
+      UpgradedEvent.OutputTuple,
+      UpgradedEvent.OutputObject
+    >;
+    Upgraded: TypedContractEvent<
+      UpgradedEvent.InputTuple,
+      UpgradedEvent.OutputTuple,
+      UpgradedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..316bdf39294a317449c8d938b971b75b5ef378a3
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.ts
@@ -0,0 +1,105 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  FunctionFragment,
+  Interface,
+  EventFragment,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+} from "../../../../../../common";
+
+export interface ContextUpgradeableInterface extends Interface {
+  getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface ContextUpgradeable extends BaseContract {
+  connect(runner?: ContractRunner | null): ContextUpgradeable;
+  waitForDeployment(): Promise<this>;
+
+  interface: ContextUpgradeableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+
+  filters: {
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a5c3d8338a3cdd19bad5cfbc05e3f4369a357d32
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.ts
@@ -0,0 +1,183 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../common";
+
+export interface PausableUpgradeableInterface extends Interface {
+  getFunction(nameOrSignature: "paused"): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "Initialized" | "Paused" | "Unpaused"
+  ): EventFragment;
+
+  encodeFunctionData(functionFragment: "paused", values?: undefined): string;
+
+  decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace PausedEvent {
+  export type InputTuple = [account: AddressLike];
+  export type OutputTuple = [account: string];
+  export interface OutputObject {
+    account: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace UnpausedEvent {
+  export type InputTuple = [account: AddressLike];
+  export type OutputTuple = [account: string];
+  export interface OutputObject {
+    account: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface PausableUpgradeable extends BaseContract {
+  connect(runner?: ContractRunner | null): PausableUpgradeable;
+  waitForDeployment(): Promise<this>;
+
+  interface: PausableUpgradeableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  paused: TypedContractMethod<[], [boolean], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "paused"
+  ): TypedContractMethod<[], [boolean], "view">;
+
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Paused"
+  ): TypedContractEvent<
+    PausedEvent.InputTuple,
+    PausedEvent.OutputTuple,
+    PausedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Unpaused"
+  ): TypedContractEvent<
+    UnpausedEvent.InputTuple,
+    UnpausedEvent.OutputTuple,
+    UnpausedEvent.OutputObject
+  >;
+
+  filters: {
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+
+    "Paused(address)": TypedContractEvent<
+      PausedEvent.InputTuple,
+      PausedEvent.OutputTuple,
+      PausedEvent.OutputObject
+    >;
+    Paused: TypedContractEvent<
+      PausedEvent.InputTuple,
+      PausedEvent.OutputTuple,
+      PausedEvent.OutputObject
+    >;
+
+    "Unpaused(address)": TypedContractEvent<
+      UnpausedEvent.InputTuple,
+      UnpausedEvent.OutputTuple,
+      UnpausedEvent.OutputObject
+    >;
+    Unpaused: TypedContractEvent<
+      UnpausedEvent.InputTuple,
+      UnpausedEvent.OutputTuple,
+      UnpausedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f460b7ae0e18dee0a3ddb97bd741f5fcb032e7ee
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.ts
@@ -0,0 +1,184 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../../common";
+
+export interface EIP712UpgradeableInterface extends Interface {
+  getFunction(nameOrSignature: "eip712Domain"): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "EIP712DomainChanged" | "Initialized"
+  ): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "eip712Domain",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "eip712Domain",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace EIP712DomainChangedEvent {
+  export type InputTuple = [];
+  export type OutputTuple = [];
+  export interface OutputObject {}
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface EIP712Upgradeable extends BaseContract {
+  connect(runner?: ContractRunner | null): EIP712Upgradeable;
+  waitForDeployment(): Promise<this>;
+
+  interface: EIP712UpgradeableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  eip712Domain: TypedContractMethod<
+    [],
+    [
+      [string, string, string, bigint, string, string, bigint[]] & {
+        fields: string;
+        name: string;
+        version: string;
+        chainId: bigint;
+        verifyingContract: string;
+        salt: string;
+        extensions: bigint[];
+      }
+    ],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "eip712Domain"
+  ): TypedContractMethod<
+    [],
+    [
+      [string, string, string, bigint, string, string, bigint[]] & {
+        fields: string;
+        name: string;
+        version: string;
+        chainId: bigint;
+        verifyingContract: string;
+        salt: string;
+        extensions: bigint[];
+      }
+    ],
+    "view"
+  >;
+
+  getEvent(
+    key: "EIP712DomainChanged"
+  ): TypedContractEvent<
+    EIP712DomainChangedEvent.InputTuple,
+    EIP712DomainChangedEvent.OutputTuple,
+    EIP712DomainChangedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+
+  filters: {
+    "EIP712DomainChanged()": TypedContractEvent<
+      EIP712DomainChangedEvent.InputTuple,
+      EIP712DomainChangedEvent.OutputTuple,
+      EIP712DomainChangedEvent.OutputObject
+    >;
+    EIP712DomainChanged: TypedContractEvent<
+      EIP712DomainChangedEvent.InputTuple,
+      EIP712DomainChangedEvent.OutputTuple,
+      EIP712DomainChangedEvent.OutputObject
+    >;
+
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/interfaces/IERC5267.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/interfaces/IERC5267.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b595cac3a02a5fcaec695d601af04399b497c340
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/interfaces/IERC5267.ts
@@ -0,0 +1,151 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../common";
+
+export interface IERC5267Interface extends Interface {
+  getFunction(nameOrSignature: "eip712Domain"): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "EIP712DomainChanged"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "eip712Domain",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "eip712Domain",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace EIP712DomainChangedEvent {
+  export type InputTuple = [];
+  export type OutputTuple = [];
+  export interface OutputObject {}
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IERC5267 extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC5267;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC5267Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  eip712Domain: TypedContractMethod<
+    [],
+    [
+      [string, string, string, bigint, string, string, bigint[]] & {
+        fields: string;
+        name: string;
+        version: string;
+        chainId: bigint;
+        verifyingContract: string;
+        salt: string;
+        extensions: bigint[];
+      }
+    ],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "eip712Domain"
+  ): TypedContractMethod<
+    [],
+    [
+      [string, string, string, bigint, string, string, bigint[]] & {
+        fields: string;
+        name: string;
+        version: string;
+        chainId: bigint;
+        verifyingContract: string;
+        salt: string;
+        extensions: bigint[];
+      }
+    ],
+    "view"
+  >;
+
+  getEvent(
+    key: "EIP712DomainChanged"
+  ): TypedContractEvent<
+    EIP712DomainChangedEvent.InputTuple,
+    EIP712DomainChangedEvent.OutputTuple,
+    EIP712DomainChangedEvent.OutputObject
+  >;
+
+  filters: {
+    "EIP712DomainChanged()": TypedContractEvent<
+      EIP712DomainChangedEvent.InputTuple,
+      EIP712DomainChangedEvent.OutputTuple,
+      EIP712DomainChangedEvent.OutputObject
+    >;
+    EIP712DomainChanged: TypedContractEvent<
+      EIP712DomainChangedEvent.InputTuple,
+      EIP712DomainChangedEvent.OutputTuple,
+      EIP712DomainChangedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c3ec22b655247e11270c7b5e36ed18f8a6210329
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.ts
@@ -0,0 +1,90 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../../common";
+
+export interface IERC1822ProxiableInterface extends Interface {
+  getFunction(nameOrSignature: "proxiableUUID"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "proxiableUUID",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "proxiableUUID",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IERC1822Proxiable extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC1822Proxiable;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC1822ProxiableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  proxiableUUID: TypedContractMethod<[], [string], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "proxiableUUID"
+  ): TypedContractMethod<[], [string], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..896ec71dd5dd96a554548074b9517acaa699964b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.ts
@@ -0,0 +1,168 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+} from "../../../../../../../common";
+
+export interface ERC1967UtilsInterface extends Interface {
+  getEvent(
+    nameOrSignatureOrTopic: "AdminChanged" | "BeaconUpgraded" | "Upgraded"
+  ): EventFragment;
+}
+
+export namespace AdminChangedEvent {
+  export type InputTuple = [previousAdmin: AddressLike, newAdmin: AddressLike];
+  export type OutputTuple = [previousAdmin: string, newAdmin: string];
+  export interface OutputObject {
+    previousAdmin: string;
+    newAdmin: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace BeaconUpgradedEvent {
+  export type InputTuple = [beacon: AddressLike];
+  export type OutputTuple = [beacon: string];
+  export interface OutputObject {
+    beacon: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace UpgradedEvent {
+  export type InputTuple = [implementation: AddressLike];
+  export type OutputTuple = [implementation: string];
+  export interface OutputObject {
+    implementation: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface ERC1967Utils extends BaseContract {
+  connect(runner?: ContractRunner | null): ERC1967Utils;
+  waitForDeployment(): Promise<this>;
+
+  interface: ERC1967UtilsInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getEvent(
+    key: "AdminChanged"
+  ): TypedContractEvent<
+    AdminChangedEvent.InputTuple,
+    AdminChangedEvent.OutputTuple,
+    AdminChangedEvent.OutputObject
+  >;
+  getEvent(
+    key: "BeaconUpgraded"
+  ): TypedContractEvent<
+    BeaconUpgradedEvent.InputTuple,
+    BeaconUpgradedEvent.OutputTuple,
+    BeaconUpgradedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Upgraded"
+  ): TypedContractEvent<
+    UpgradedEvent.InputTuple,
+    UpgradedEvent.OutputTuple,
+    UpgradedEvent.OutputObject
+  >;
+
+  filters: {
+    "AdminChanged(address,address)": TypedContractEvent<
+      AdminChangedEvent.InputTuple,
+      AdminChangedEvent.OutputTuple,
+      AdminChangedEvent.OutputObject
+    >;
+    AdminChanged: TypedContractEvent<
+      AdminChangedEvent.InputTuple,
+      AdminChangedEvent.OutputTuple,
+      AdminChangedEvent.OutputObject
+    >;
+
+    "BeaconUpgraded(address)": TypedContractEvent<
+      BeaconUpgradedEvent.InputTuple,
+      BeaconUpgradedEvent.OutputTuple,
+      BeaconUpgradedEvent.OutputObject
+    >;
+    BeaconUpgraded: TypedContractEvent<
+      BeaconUpgradedEvent.InputTuple,
+      BeaconUpgradedEvent.OutputTuple,
+      BeaconUpgradedEvent.OutputObject
+    >;
+
+    "Upgraded(address)": TypedContractEvent<
+      UpgradedEvent.InputTuple,
+      UpgradedEvent.OutputTuple,
+      UpgradedEvent.OutputObject
+    >;
+    Upgraded: TypedContractEvent<
+      UpgradedEvent.InputTuple,
+      UpgradedEvent.OutputTuple,
+      UpgradedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon.ts
new file mode 100644
index 0000000000000000000000000000000000000000..766a954c7cf399db7aab23bfd3af093f0c1f211f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon.ts
@@ -0,0 +1,90 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../../common";
+
+export interface IBeaconInterface extends Interface {
+  getFunction(nameOrSignature: "implementation"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "implementation",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "implementation",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IBeacon extends BaseContract {
+  connect(runner?: ContractRunner | null): IBeacon;
+  waitForDeployment(): Promise<this>;
+
+  interface: IBeaconInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  implementation: TypedContractMethod<[], [string], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "implementation"
+  ): TypedContractMethod<[], [string], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/Address.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/Address.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a23174de0789403be6db3ac0336c04eb7f34a1bb
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/Address.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+} from "../../../../../../common";
+
+export interface AddressInterface extends Interface {}
+
+export interface Address extends BaseContract {
+  connect(runner?: ContractRunner | null): Address;
+  waitForDeployment(): Promise<this>;
+
+  interface: AddressInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/Strings.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/Strings.ts
new file mode 100644
index 0000000000000000000000000000000000000000..160fd7716cecea2a75bc037f4c1125f80aa367c4
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/Strings.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+} from "../../../../../../common";
+
+export interface StringsInterface extends Interface {}
+
+export interface Strings extends BaseContract {
+  connect(runner?: ContractRunner | null): Strings;
+  waitForDeployment(): Promise<this>;
+
+  interface: StringsInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/ECDSA.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/ECDSA.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7695a2d0419a19a5dbd09c34ab1a8c0168d802ce
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/ECDSA.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+} from "../../../../../../../common";
+
+export interface ECDSAInterface extends Interface {}
+
+export interface ECDSA extends BaseContract {
+  connect(runner?: ContractRunner | null): ECDSA;
+  waitForDeployment(): Promise<this>;
+
+  interface: ECDSAInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/math/Math.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/math/Math.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4a7bda9b53e2e90c385003d353d6d58f43668e75
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@openzeppelin/contracts/utils/math/Math.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  FunctionFragment,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+} from "../../../../../../../common";
+
+export interface MathInterface extends Interface {}
+
+export interface Math extends BaseContract {
+  connect(runner?: ContractRunner | null): Math;
+  waitForDeployment(): Promise<this>;
+
+  interface: MathInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9fed833808f97792ad106c82cf0553dc1afdfccf
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.ts
@@ -0,0 +1,99 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../../../common";
+
+export interface IUniswapV3SwapCallbackInterface extends Interface {
+  getFunction(nameOrSignature: "uniswapV3SwapCallback"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "uniswapV3SwapCallback",
+    values: [BigNumberish, BigNumberish, BytesLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "uniswapV3SwapCallback",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IUniswapV3SwapCallback extends BaseContract {
+  connect(runner?: ContractRunner | null): IUniswapV3SwapCallback;
+  waitForDeployment(): Promise<this>;
+
+  interface: IUniswapV3SwapCallbackInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  uniswapV3SwapCallback: TypedContractMethod<
+    [amount0Delta: BigNumberish, amount1Delta: BigNumberish, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "uniswapV3SwapCallback"
+  ): TypedContractMethod<
+    [amount0Delta: BigNumberish, amount1Delta: BigNumberish, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.ts b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.ts
new file mode 100644
index 0000000000000000000000000000000000000000..70f0fb912d6d3e1d174496229d3d85363b229632
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/.deps/npm/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.ts
@@ -0,0 +1,296 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../../../common";
+
+export declare namespace ISwapRouter {
+  export type ExactInputParamsStruct = {
+    path: BytesLike;
+    recipient: AddressLike;
+    deadline: BigNumberish;
+    amountIn: BigNumberish;
+    amountOutMinimum: BigNumberish;
+  };
+
+  export type ExactInputParamsStructOutput = [
+    path: string,
+    recipient: string,
+    deadline: bigint,
+    amountIn: bigint,
+    amountOutMinimum: bigint
+  ] & {
+    path: string;
+    recipient: string;
+    deadline: bigint;
+    amountIn: bigint;
+    amountOutMinimum: bigint;
+  };
+
+  export type ExactInputSingleParamsStruct = {
+    tokenIn: AddressLike;
+    tokenOut: AddressLike;
+    fee: BigNumberish;
+    recipient: AddressLike;
+    deadline: BigNumberish;
+    amountIn: BigNumberish;
+    amountOutMinimum: BigNumberish;
+    sqrtPriceLimitX96: BigNumberish;
+  };
+
+  export type ExactInputSingleParamsStructOutput = [
+    tokenIn: string,
+    tokenOut: string,
+    fee: bigint,
+    recipient: string,
+    deadline: bigint,
+    amountIn: bigint,
+    amountOutMinimum: bigint,
+    sqrtPriceLimitX96: bigint
+  ] & {
+    tokenIn: string;
+    tokenOut: string;
+    fee: bigint;
+    recipient: string;
+    deadline: bigint;
+    amountIn: bigint;
+    amountOutMinimum: bigint;
+    sqrtPriceLimitX96: bigint;
+  };
+
+  export type ExactOutputParamsStruct = {
+    path: BytesLike;
+    recipient: AddressLike;
+    deadline: BigNumberish;
+    amountOut: BigNumberish;
+    amountInMaximum: BigNumberish;
+  };
+
+  export type ExactOutputParamsStructOutput = [
+    path: string,
+    recipient: string,
+    deadline: bigint,
+    amountOut: bigint,
+    amountInMaximum: bigint
+  ] & {
+    path: string;
+    recipient: string;
+    deadline: bigint;
+    amountOut: bigint;
+    amountInMaximum: bigint;
+  };
+
+  export type ExactOutputSingleParamsStruct = {
+    tokenIn: AddressLike;
+    tokenOut: AddressLike;
+    fee: BigNumberish;
+    recipient: AddressLike;
+    deadline: BigNumberish;
+    amountOut: BigNumberish;
+    amountInMaximum: BigNumberish;
+    sqrtPriceLimitX96: BigNumberish;
+  };
+
+  export type ExactOutputSingleParamsStructOutput = [
+    tokenIn: string,
+    tokenOut: string,
+    fee: bigint,
+    recipient: string,
+    deadline: bigint,
+    amountOut: bigint,
+    amountInMaximum: bigint,
+    sqrtPriceLimitX96: bigint
+  ] & {
+    tokenIn: string;
+    tokenOut: string;
+    fee: bigint;
+    recipient: string;
+    deadline: bigint;
+    amountOut: bigint;
+    amountInMaximum: bigint;
+    sqrtPriceLimitX96: bigint;
+  };
+}
+
+export interface ISwapRouterInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "exactInput"
+      | "exactInputSingle"
+      | "exactOutput"
+      | "exactOutputSingle"
+      | "uniswapV3SwapCallback"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "exactInput",
+    values: [ISwapRouter.ExactInputParamsStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "exactInputSingle",
+    values: [ISwapRouter.ExactInputSingleParamsStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "exactOutput",
+    values: [ISwapRouter.ExactOutputParamsStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "exactOutputSingle",
+    values: [ISwapRouter.ExactOutputSingleParamsStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "uniswapV3SwapCallback",
+    values: [BigNumberish, BigNumberish, BytesLike]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "exactInput", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "exactInputSingle",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "exactOutput",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "exactOutputSingle",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "uniswapV3SwapCallback",
+    data: BytesLike
+  ): Result;
+}
+
+export interface ISwapRouter extends BaseContract {
+  connect(runner?: ContractRunner | null): ISwapRouter;
+  waitForDeployment(): Promise<this>;
+
+  interface: ISwapRouterInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  exactInput: TypedContractMethod<
+    [params: ISwapRouter.ExactInputParamsStruct],
+    [bigint],
+    "payable"
+  >;
+
+  exactInputSingle: TypedContractMethod<
+    [params: ISwapRouter.ExactInputSingleParamsStruct],
+    [bigint],
+    "payable"
+  >;
+
+  exactOutput: TypedContractMethod<
+    [params: ISwapRouter.ExactOutputParamsStruct],
+    [bigint],
+    "payable"
+  >;
+
+  exactOutputSingle: TypedContractMethod<
+    [params: ISwapRouter.ExactOutputSingleParamsStruct],
+    [bigint],
+    "payable"
+  >;
+
+  uniswapV3SwapCallback: TypedContractMethod<
+    [amount0Delta: BigNumberish, amount1Delta: BigNumberish, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "exactInput"
+  ): TypedContractMethod<
+    [params: ISwapRouter.ExactInputParamsStruct],
+    [bigint],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "exactInputSingle"
+  ): TypedContractMethod<
+    [params: ISwapRouter.ExactInputSingleParamsStruct],
+    [bigint],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "exactOutput"
+  ): TypedContractMethod<
+    [params: ISwapRouter.ExactOutputParamsStruct],
+    [bigint],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "exactOutputSingle"
+  ): TypedContractMethod<
+    [params: ISwapRouter.ExactOutputSingleParamsStruct],
+    [bigint],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "uniswapV3SwapCallback"
+  ): TypedContractMethod<
+    [amount0Delta: BigNumberish, amount1Delta: BigNumberish, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/Interfaces/IERC20.ts b/momiji-helpers/utils/typechain-types/contracts/Interfaces/IERC20.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aac1cb34fd96494d39fece5790cf18a140054261
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/Interfaces/IERC20.ts
@@ -0,0 +1,262 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface IERC20Interface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "allowance"
+      | "approve"
+      | "balanceOf"
+      | "totalSupply"
+      | "transfer"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "allowance",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "totalSupply",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transfer",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "totalSupply",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    spender: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [owner: string, spender: string, value: bigint];
+  export interface OutputObject {
+    owner: string;
+    spender: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    from: AddressLike,
+    to: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [from: string, to: string, value: bigint];
+  export interface OutputObject {
+    from: string;
+    to: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IERC20 extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC20;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC20Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  allowance: TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  approve: TypedContractMethod<
+    [spender: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">;
+
+  totalSupply: TypedContractMethod<[], [bigint], "view">;
+
+  transfer: TypedContractMethod<
+    [recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  transferFrom: TypedContractMethod<
+    [sender: AddressLike, recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "allowance"
+  ): TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [spender: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[account: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "totalSupply"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "transfer"
+  ): TypedContractMethod<
+    [recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [sender: AddressLike, recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/Interfaces/IElasticERC20.ts b/momiji-helpers/utils/typechain-types/contracts/Interfaces/IElasticERC20.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ed9bae6e053ec98aa75340f9a1f783a53e4b1853
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/Interfaces/IElasticERC20.ts
@@ -0,0 +1,300 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface IElasticERC20Interface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "allowance"
+      | "approve"
+      | "balanceOf"
+      | "burn"
+      | "mint"
+      | "totalSupply"
+      | "transfer"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "allowance",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "burn",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "mint",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "totalSupply",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transfer",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "totalSupply",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    spender: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [owner: string, spender: string, value: bigint];
+  export interface OutputObject {
+    owner: string;
+    spender: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    from: AddressLike,
+    to: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [from: string, to: string, value: bigint];
+  export interface OutputObject {
+    from: string;
+    to: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IElasticERC20 extends BaseContract {
+  connect(runner?: ContractRunner | null): IElasticERC20;
+  waitForDeployment(): Promise<this>;
+
+  interface: IElasticERC20Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  allowance: TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  approve: TypedContractMethod<
+    [spender: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">;
+
+  burn: TypedContractMethod<
+    [account: AddressLike, amount: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  mint: TypedContractMethod<
+    [account: AddressLike, amount: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  totalSupply: TypedContractMethod<[], [bigint], "view">;
+
+  transfer: TypedContractMethod<
+    [recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  transferFrom: TypedContractMethod<
+    [sender: AddressLike, recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "allowance"
+  ): TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [spender: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[account: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "burn"
+  ): TypedContractMethod<
+    [account: AddressLike, amount: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "mint"
+  ): TypedContractMethod<
+    [account: AddressLike, amount: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "totalSupply"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "transfer"
+  ): TypedContractMethod<
+    [recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [sender: AddressLike, recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/Interfaces/IUniswapV3Pool.ts b/momiji-helpers/utils/typechain-types/contracts/Interfaces/IUniswapV3Pool.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8030762fc84028be2545676da5c2f47b4472b34e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/Interfaces/IUniswapV3Pool.ts
@@ -0,0 +1,1079 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface IUniswapV3PoolInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "burn"
+      | "collect"
+      | "collectProtocol"
+      | "factory"
+      | "fee"
+      | "feeGrowthGlobal0X128"
+      | "feeGrowthGlobal1X128"
+      | "flash"
+      | "increaseObservationCardinalityNext"
+      | "initialize"
+      | "liquidity"
+      | "maxLiquidityPerTick"
+      | "mint"
+      | "observations"
+      | "observe"
+      | "positions"
+      | "protocolFees"
+      | "setFeeProtocol"
+      | "slot0"
+      | "snapshotCumulativesInside"
+      | "swap"
+      | "tickBitmap"
+      | "tickSpacing"
+      | "ticks"
+      | "token0"
+      | "token1"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic:
+      | "Burn"
+      | "Collect"
+      | "CollectProtocol"
+      | "Flash"
+      | "IncreaseObservationCardinalityNext"
+      | "Initialize"
+      | "Mint"
+      | "SetFeeProtocol"
+      | "Swap"
+  ): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "burn",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "collect",
+    values: [
+      AddressLike,
+      BigNumberish,
+      BigNumberish,
+      BigNumberish,
+      BigNumberish
+    ]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "collectProtocol",
+    values: [AddressLike, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "factory", values?: undefined): string;
+  encodeFunctionData(functionFragment: "fee", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "feeGrowthGlobal0X128",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "feeGrowthGlobal1X128",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "flash",
+    values: [AddressLike, BigNumberish, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "increaseObservationCardinalityNext",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "initialize",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "liquidity", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "maxLiquidityPerTick",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "mint",
+    values: [AddressLike, BigNumberish, BigNumberish, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "observations",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "observe",
+    values: [BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "positions",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "protocolFees",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "setFeeProtocol",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "slot0", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "snapshotCumulativesInside",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "swap",
+    values: [AddressLike, boolean, BigNumberish, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "tickBitmap",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "tickSpacing",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "ticks", values: [BigNumberish]): string;
+  encodeFunctionData(functionFragment: "token0", values?: undefined): string;
+  encodeFunctionData(functionFragment: "token1", values?: undefined): string;
+
+  decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "collect", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "collectProtocol",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "factory", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "fee", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "feeGrowthGlobal0X128",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "feeGrowthGlobal1X128",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "flash", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "increaseObservationCardinalityNext",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "liquidity", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "maxLiquidityPerTick",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "observations",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "observe", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "positions", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "protocolFees",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "setFeeProtocol",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "slot0", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "snapshotCumulativesInside",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "swap", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "tickBitmap", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "tickSpacing",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "ticks", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "token0", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "token1", data: BytesLike): Result;
+}
+
+export namespace BurnEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    tickLower: BigNumberish,
+    tickUpper: BigNumberish,
+    amount: BigNumberish,
+    amount0: BigNumberish,
+    amount1: BigNumberish
+  ];
+  export type OutputTuple = [
+    owner: string,
+    tickLower: bigint,
+    tickUpper: bigint,
+    amount: bigint,
+    amount0: bigint,
+    amount1: bigint
+  ];
+  export interface OutputObject {
+    owner: string;
+    tickLower: bigint;
+    tickUpper: bigint;
+    amount: bigint;
+    amount0: bigint;
+    amount1: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace CollectEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    recipient: AddressLike,
+    tickLower: BigNumberish,
+    tickUpper: BigNumberish,
+    amount0: BigNumberish,
+    amount1: BigNumberish
+  ];
+  export type OutputTuple = [
+    owner: string,
+    recipient: string,
+    tickLower: bigint,
+    tickUpper: bigint,
+    amount0: bigint,
+    amount1: bigint
+  ];
+  export interface OutputObject {
+    owner: string;
+    recipient: string;
+    tickLower: bigint;
+    tickUpper: bigint;
+    amount0: bigint;
+    amount1: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace CollectProtocolEvent {
+  export type InputTuple = [
+    sender: AddressLike,
+    recipient: AddressLike,
+    amount0: BigNumberish,
+    amount1: BigNumberish
+  ];
+  export type OutputTuple = [
+    sender: string,
+    recipient: string,
+    amount0: bigint,
+    amount1: bigint
+  ];
+  export interface OutputObject {
+    sender: string;
+    recipient: string;
+    amount0: bigint;
+    amount1: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace FlashEvent {
+  export type InputTuple = [
+    sender: AddressLike,
+    recipient: AddressLike,
+    amount0: BigNumberish,
+    amount1: BigNumberish,
+    paid0: BigNumberish,
+    paid1: BigNumberish
+  ];
+  export type OutputTuple = [
+    sender: string,
+    recipient: string,
+    amount0: bigint,
+    amount1: bigint,
+    paid0: bigint,
+    paid1: bigint
+  ];
+  export interface OutputObject {
+    sender: string;
+    recipient: string;
+    amount0: bigint;
+    amount1: bigint;
+    paid0: bigint;
+    paid1: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace IncreaseObservationCardinalityNextEvent {
+  export type InputTuple = [
+    observationCardinalityNextOld: BigNumberish,
+    observationCardinalityNextNew: BigNumberish
+  ];
+  export type OutputTuple = [
+    observationCardinalityNextOld: bigint,
+    observationCardinalityNextNew: bigint
+  ];
+  export interface OutputObject {
+    observationCardinalityNextOld: bigint;
+    observationCardinalityNextNew: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace InitializeEvent {
+  export type InputTuple = [sqrtPriceX96: BigNumberish, tick: BigNumberish];
+  export type OutputTuple = [sqrtPriceX96: bigint, tick: bigint];
+  export interface OutputObject {
+    sqrtPriceX96: bigint;
+    tick: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace MintEvent {
+  export type InputTuple = [
+    sender: AddressLike,
+    owner: AddressLike,
+    tickLower: BigNumberish,
+    tickUpper: BigNumberish,
+    amount: BigNumberish,
+    amount0: BigNumberish,
+    amount1: BigNumberish
+  ];
+  export type OutputTuple = [
+    sender: string,
+    owner: string,
+    tickLower: bigint,
+    tickUpper: bigint,
+    amount: bigint,
+    amount0: bigint,
+    amount1: bigint
+  ];
+  export interface OutputObject {
+    sender: string;
+    owner: string;
+    tickLower: bigint;
+    tickUpper: bigint;
+    amount: bigint;
+    amount0: bigint;
+    amount1: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace SetFeeProtocolEvent {
+  export type InputTuple = [
+    feeProtocol0Old: BigNumberish,
+    feeProtocol1Old: BigNumberish,
+    feeProtocol0New: BigNumberish,
+    feeProtocol1New: BigNumberish
+  ];
+  export type OutputTuple = [
+    feeProtocol0Old: bigint,
+    feeProtocol1Old: bigint,
+    feeProtocol0New: bigint,
+    feeProtocol1New: bigint
+  ];
+  export interface OutputObject {
+    feeProtocol0Old: bigint;
+    feeProtocol1Old: bigint;
+    feeProtocol0New: bigint;
+    feeProtocol1New: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace SwapEvent {
+  export type InputTuple = [
+    sender: AddressLike,
+    recipient: AddressLike,
+    amount0: BigNumberish,
+    amount1: BigNumberish,
+    sqrtPriceX96: BigNumberish,
+    liquidity: BigNumberish,
+    tick: BigNumberish
+  ];
+  export type OutputTuple = [
+    sender: string,
+    recipient: string,
+    amount0: bigint,
+    amount1: bigint,
+    sqrtPriceX96: bigint,
+    liquidity: bigint,
+    tick: bigint
+  ];
+  export interface OutputObject {
+    sender: string;
+    recipient: string;
+    amount0: bigint;
+    amount1: bigint;
+    sqrtPriceX96: bigint;
+    liquidity: bigint;
+    tick: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IUniswapV3Pool extends BaseContract {
+  connect(runner?: ContractRunner | null): IUniswapV3Pool;
+  waitForDeployment(): Promise<this>;
+
+  interface: IUniswapV3PoolInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  burn: TypedContractMethod<
+    [tickLower: BigNumberish, tickUpper: BigNumberish, amount: BigNumberish],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+
+  collect: TypedContractMethod<
+    [
+      recipient: AddressLike,
+      tickLower: BigNumberish,
+      tickUpper: BigNumberish,
+      amount0Requested: BigNumberish,
+      amount1Requested: BigNumberish
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+
+  collectProtocol: TypedContractMethod<
+    [
+      recipient: AddressLike,
+      amount0Requested: BigNumberish,
+      amount1Requested: BigNumberish
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+
+  factory: TypedContractMethod<[], [string], "view">;
+
+  fee: TypedContractMethod<[], [bigint], "view">;
+
+  feeGrowthGlobal0X128: TypedContractMethod<[], [bigint], "view">;
+
+  feeGrowthGlobal1X128: TypedContractMethod<[], [bigint], "view">;
+
+  flash: TypedContractMethod<
+    [
+      recipient: AddressLike,
+      amount0: BigNumberish,
+      amount1: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  increaseObservationCardinalityNext: TypedContractMethod<
+    [observationCardinalityNext: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  initialize: TypedContractMethod<
+    [sqrtPriceX96: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  liquidity: TypedContractMethod<[], [bigint], "view">;
+
+  maxLiquidityPerTick: TypedContractMethod<[], [bigint], "view">;
+
+  mint: TypedContractMethod<
+    [
+      recipient: AddressLike,
+      tickLower: BigNumberish,
+      tickUpper: BigNumberish,
+      amount: BigNumberish,
+      data: BytesLike
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+
+  observations: TypedContractMethod<
+    [index: BigNumberish],
+    [
+      [bigint, bigint, bigint, boolean] & {
+        blockTimestamp: bigint;
+        tickCumulative: bigint;
+        secondsPerLiquidityCumulativeX128: bigint;
+        initialized: boolean;
+      }
+    ],
+    "view"
+  >;
+
+  observe: TypedContractMethod<
+    [secondsAgos: BigNumberish[]],
+    [
+      [bigint[], bigint[]] & {
+        tickCumulatives: bigint[];
+        secondsPerLiquidityCumulativeX128s: bigint[];
+      }
+    ],
+    "view"
+  >;
+
+  positions: TypedContractMethod<
+    [key: BytesLike],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        _liquidity: bigint;
+        feeGrowthInside0LastX128: bigint;
+        feeGrowthInside1LastX128: bigint;
+        tokensOwed0: bigint;
+        tokensOwed1: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  protocolFees: TypedContractMethod<
+    [],
+    [[bigint, bigint] & { token0: bigint; token1: bigint }],
+    "view"
+  >;
+
+  setFeeProtocol: TypedContractMethod<
+    [feeProtocol0: BigNumberish, feeProtocol1: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  slot0: TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint, bigint, boolean] & {
+        sqrtPriceX96: bigint;
+        tick: bigint;
+        observationIndex: bigint;
+        observationCardinality: bigint;
+        observationCardinalityNext: bigint;
+        feeProtocol: bigint;
+        unlocked: boolean;
+      }
+    ],
+    "view"
+  >;
+
+  snapshotCumulativesInside: TypedContractMethod<
+    [tickLower: BigNumberish, tickUpper: BigNumberish],
+    [
+      [bigint, bigint, bigint] & {
+        tickCumulativeInside: bigint;
+        secondsPerLiquidityInsideX128: bigint;
+        secondsInside: bigint;
+      }
+    ],
+    "view"
+  >;
+
+  swap: TypedContractMethod<
+    [
+      recipient: AddressLike,
+      zeroForOne: boolean,
+      amountSpecified: BigNumberish,
+      sqrtPriceLimitX96: BigNumberish,
+      data: BytesLike
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+
+  tickBitmap: TypedContractMethod<
+    [wordPosition: BigNumberish],
+    [bigint],
+    "view"
+  >;
+
+  tickSpacing: TypedContractMethod<[], [bigint], "view">;
+
+  ticks: TypedContractMethod<
+    [tick: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint, bigint, bigint, boolean] & {
+        liquidityGross: bigint;
+        liquidityNet: bigint;
+        feeGrowthOutside0X128: bigint;
+        feeGrowthOutside1X128: bigint;
+        tickCumulativeOutside: bigint;
+        secondsPerLiquidityOutsideX128: bigint;
+        secondsOutside: bigint;
+        initialized: boolean;
+      }
+    ],
+    "view"
+  >;
+
+  token0: TypedContractMethod<[], [string], "view">;
+
+  token1: TypedContractMethod<[], [string], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "burn"
+  ): TypedContractMethod<
+    [tickLower: BigNumberish, tickUpper: BigNumberish, amount: BigNumberish],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "collect"
+  ): TypedContractMethod<
+    [
+      recipient: AddressLike,
+      tickLower: BigNumberish,
+      tickUpper: BigNumberish,
+      amount0Requested: BigNumberish,
+      amount1Requested: BigNumberish
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "collectProtocol"
+  ): TypedContractMethod<
+    [
+      recipient: AddressLike,
+      amount0Requested: BigNumberish,
+      amount1Requested: BigNumberish
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "factory"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "fee"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "feeGrowthGlobal0X128"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "feeGrowthGlobal1X128"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "flash"
+  ): TypedContractMethod<
+    [
+      recipient: AddressLike,
+      amount0: BigNumberish,
+      amount1: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "increaseObservationCardinalityNext"
+  ): TypedContractMethod<
+    [observationCardinalityNext: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "initialize"
+  ): TypedContractMethod<[sqrtPriceX96: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "liquidity"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "maxLiquidityPerTick"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "mint"
+  ): TypedContractMethod<
+    [
+      recipient: AddressLike,
+      tickLower: BigNumberish,
+      tickUpper: BigNumberish,
+      amount: BigNumberish,
+      data: BytesLike
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "observations"
+  ): TypedContractMethod<
+    [index: BigNumberish],
+    [
+      [bigint, bigint, bigint, boolean] & {
+        blockTimestamp: bigint;
+        tickCumulative: bigint;
+        secondsPerLiquidityCumulativeX128: bigint;
+        initialized: boolean;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "observe"
+  ): TypedContractMethod<
+    [secondsAgos: BigNumberish[]],
+    [
+      [bigint[], bigint[]] & {
+        tickCumulatives: bigint[];
+        secondsPerLiquidityCumulativeX128s: bigint[];
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "positions"
+  ): TypedContractMethod<
+    [key: BytesLike],
+    [
+      [bigint, bigint, bigint, bigint, bigint] & {
+        _liquidity: bigint;
+        feeGrowthInside0LastX128: bigint;
+        feeGrowthInside1LastX128: bigint;
+        tokensOwed0: bigint;
+        tokensOwed1: bigint;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "protocolFees"
+  ): TypedContractMethod<
+    [],
+    [[bigint, bigint] & { token0: bigint; token1: bigint }],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "setFeeProtocol"
+  ): TypedContractMethod<
+    [feeProtocol0: BigNumberish, feeProtocol1: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "slot0"
+  ): TypedContractMethod<
+    [],
+    [
+      [bigint, bigint, bigint, bigint, bigint, bigint, boolean] & {
+        sqrtPriceX96: bigint;
+        tick: bigint;
+        observationIndex: bigint;
+        observationCardinality: bigint;
+        observationCardinalityNext: bigint;
+        feeProtocol: bigint;
+        unlocked: boolean;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "snapshotCumulativesInside"
+  ): TypedContractMethod<
+    [tickLower: BigNumberish, tickUpper: BigNumberish],
+    [
+      [bigint, bigint, bigint] & {
+        tickCumulativeInside: bigint;
+        secondsPerLiquidityInsideX128: bigint;
+        secondsInside: bigint;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "swap"
+  ): TypedContractMethod<
+    [
+      recipient: AddressLike,
+      zeroForOne: boolean,
+      amountSpecified: BigNumberish,
+      sqrtPriceLimitX96: BigNumberish,
+      data: BytesLike
+    ],
+    [[bigint, bigint] & { amount0: bigint; amount1: bigint }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "tickBitmap"
+  ): TypedContractMethod<[wordPosition: BigNumberish], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "tickSpacing"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "ticks"
+  ): TypedContractMethod<
+    [tick: BigNumberish],
+    [
+      [bigint, bigint, bigint, bigint, bigint, bigint, bigint, boolean] & {
+        liquidityGross: bigint;
+        liquidityNet: bigint;
+        feeGrowthOutside0X128: bigint;
+        feeGrowthOutside1X128: bigint;
+        tickCumulativeOutside: bigint;
+        secondsPerLiquidityOutsideX128: bigint;
+        secondsOutside: bigint;
+        initialized: boolean;
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "token0"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "token1"
+  ): TypedContractMethod<[], [string], "view">;
+
+  getEvent(
+    key: "Burn"
+  ): TypedContractEvent<
+    BurnEvent.InputTuple,
+    BurnEvent.OutputTuple,
+    BurnEvent.OutputObject
+  >;
+  getEvent(
+    key: "Collect"
+  ): TypedContractEvent<
+    CollectEvent.InputTuple,
+    CollectEvent.OutputTuple,
+    CollectEvent.OutputObject
+  >;
+  getEvent(
+    key: "CollectProtocol"
+  ): TypedContractEvent<
+    CollectProtocolEvent.InputTuple,
+    CollectProtocolEvent.OutputTuple,
+    CollectProtocolEvent.OutputObject
+  >;
+  getEvent(
+    key: "Flash"
+  ): TypedContractEvent<
+    FlashEvent.InputTuple,
+    FlashEvent.OutputTuple,
+    FlashEvent.OutputObject
+  >;
+  getEvent(
+    key: "IncreaseObservationCardinalityNext"
+  ): TypedContractEvent<
+    IncreaseObservationCardinalityNextEvent.InputTuple,
+    IncreaseObservationCardinalityNextEvent.OutputTuple,
+    IncreaseObservationCardinalityNextEvent.OutputObject
+  >;
+  getEvent(
+    key: "Initialize"
+  ): TypedContractEvent<
+    InitializeEvent.InputTuple,
+    InitializeEvent.OutputTuple,
+    InitializeEvent.OutputObject
+  >;
+  getEvent(
+    key: "Mint"
+  ): TypedContractEvent<
+    MintEvent.InputTuple,
+    MintEvent.OutputTuple,
+    MintEvent.OutputObject
+  >;
+  getEvent(
+    key: "SetFeeProtocol"
+  ): TypedContractEvent<
+    SetFeeProtocolEvent.InputTuple,
+    SetFeeProtocolEvent.OutputTuple,
+    SetFeeProtocolEvent.OutputObject
+  >;
+  getEvent(
+    key: "Swap"
+  ): TypedContractEvent<
+    SwapEvent.InputTuple,
+    SwapEvent.OutputTuple,
+    SwapEvent.OutputObject
+  >;
+
+  filters: {
+    "Burn(address,int24,int24,uint128,uint256,uint256)": TypedContractEvent<
+      BurnEvent.InputTuple,
+      BurnEvent.OutputTuple,
+      BurnEvent.OutputObject
+    >;
+    Burn: TypedContractEvent<
+      BurnEvent.InputTuple,
+      BurnEvent.OutputTuple,
+      BurnEvent.OutputObject
+    >;
+
+    "Collect(address,address,int24,int24,uint128,uint128)": TypedContractEvent<
+      CollectEvent.InputTuple,
+      CollectEvent.OutputTuple,
+      CollectEvent.OutputObject
+    >;
+    Collect: TypedContractEvent<
+      CollectEvent.InputTuple,
+      CollectEvent.OutputTuple,
+      CollectEvent.OutputObject
+    >;
+
+    "CollectProtocol(address,address,uint128,uint128)": TypedContractEvent<
+      CollectProtocolEvent.InputTuple,
+      CollectProtocolEvent.OutputTuple,
+      CollectProtocolEvent.OutputObject
+    >;
+    CollectProtocol: TypedContractEvent<
+      CollectProtocolEvent.InputTuple,
+      CollectProtocolEvent.OutputTuple,
+      CollectProtocolEvent.OutputObject
+    >;
+
+    "Flash(address,address,uint256,uint256,uint256,uint256)": TypedContractEvent<
+      FlashEvent.InputTuple,
+      FlashEvent.OutputTuple,
+      FlashEvent.OutputObject
+    >;
+    Flash: TypedContractEvent<
+      FlashEvent.InputTuple,
+      FlashEvent.OutputTuple,
+      FlashEvent.OutputObject
+    >;
+
+    "IncreaseObservationCardinalityNext(uint16,uint16)": TypedContractEvent<
+      IncreaseObservationCardinalityNextEvent.InputTuple,
+      IncreaseObservationCardinalityNextEvent.OutputTuple,
+      IncreaseObservationCardinalityNextEvent.OutputObject
+    >;
+    IncreaseObservationCardinalityNext: TypedContractEvent<
+      IncreaseObservationCardinalityNextEvent.InputTuple,
+      IncreaseObservationCardinalityNextEvent.OutputTuple,
+      IncreaseObservationCardinalityNextEvent.OutputObject
+    >;
+
+    "Initialize(uint160,int24)": TypedContractEvent<
+      InitializeEvent.InputTuple,
+      InitializeEvent.OutputTuple,
+      InitializeEvent.OutputObject
+    >;
+    Initialize: TypedContractEvent<
+      InitializeEvent.InputTuple,
+      InitializeEvent.OutputTuple,
+      InitializeEvent.OutputObject
+    >;
+
+    "Mint(address,address,int24,int24,uint128,uint256,uint256)": TypedContractEvent<
+      MintEvent.InputTuple,
+      MintEvent.OutputTuple,
+      MintEvent.OutputObject
+    >;
+    Mint: TypedContractEvent<
+      MintEvent.InputTuple,
+      MintEvent.OutputTuple,
+      MintEvent.OutputObject
+    >;
+
+    "SetFeeProtocol(uint8,uint8,uint8,uint8)": TypedContractEvent<
+      SetFeeProtocolEvent.InputTuple,
+      SetFeeProtocolEvent.OutputTuple,
+      SetFeeProtocolEvent.OutputObject
+    >;
+    SetFeeProtocol: TypedContractEvent<
+      SetFeeProtocolEvent.InputTuple,
+      SetFeeProtocolEvent.OutputTuple,
+      SetFeeProtocolEvent.OutputObject
+    >;
+
+    "Swap(address,address,int256,int256,uint160,uint128,int24)": TypedContractEvent<
+      SwapEvent.InputTuple,
+      SwapEvent.OutputTuple,
+      SwapEvent.OutputObject
+    >;
+    Swap: TypedContractEvent<
+      SwapEvent.InputTuple,
+      SwapEvent.OutputTuple,
+      SwapEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/Interfaces/index.ts b/momiji-helpers/utils/typechain-types/contracts/Interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..54a4777542cb65818dbd9309b30c4344586a7e98
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/Interfaces/index.ts
@@ -0,0 +1,6 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { IERC20 } from "./IERC20";
+export type { IElasticERC20 } from "./IElasticERC20";
+export type { IUniswapV3Pool } from "./IUniswapV3Pool";
diff --git a/momiji-helpers/utils/typechain-types/contracts/XFTmock.sol/XFTMock.ts b/momiji-helpers/utils/typechain-types/contracts/XFTmock.sol/XFTMock.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3ac39d388c5b2c227b68c85af426019f2034c26d
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/XFTmock.sol/XFTMock.ts
@@ -0,0 +1,596 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface XFTMockInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "BURNER_ROLE"
+      | "DEFAULT_ADMIN_ROLE"
+      | "MINTER_ROLE"
+      | "allowance"
+      | "approve"
+      | "balanceOf"
+      | "burn"
+      | "decimals"
+      | "getRoleAdmin"
+      | "grantRole"
+      | "hasRole"
+      | "mint"
+      | "name"
+      | "renounceRole"
+      | "revokeRole"
+      | "supportsInterface"
+      | "symbol"
+      | "totalSupply"
+      | "transfer"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic:
+      | "Approval"
+      | "RoleAdminChanged"
+      | "RoleGranted"
+      | "RoleRevoked"
+      | "Transfer"
+  ): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "BURNER_ROLE",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "DEFAULT_ADMIN_ROLE",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "MINTER_ROLE",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "allowance",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "burn",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "decimals", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "getRoleAdmin",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "grantRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "hasRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "mint",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "name", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "renounceRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "revokeRole",
+    values: [BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "supportsInterface",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "symbol", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "totalSupply",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transfer",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "BURNER_ROLE",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "DEFAULT_ADMIN_ROLE",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "MINTER_ROLE",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getRoleAdmin",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "name", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "renounceRole",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "supportsInterface",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "totalSupply",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    spender: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [owner: string, spender: string, value: bigint];
+  export interface OutputObject {
+    owner: string;
+    spender: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace RoleAdminChangedEvent {
+  export type InputTuple = [
+    role: BytesLike,
+    previousAdminRole: BytesLike,
+    newAdminRole: BytesLike
+  ];
+  export type OutputTuple = [
+    role: string,
+    previousAdminRole: string,
+    newAdminRole: string
+  ];
+  export interface OutputObject {
+    role: string;
+    previousAdminRole: string;
+    newAdminRole: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace RoleGrantedEvent {
+  export type InputTuple = [
+    role: BytesLike,
+    account: AddressLike,
+    sender: AddressLike
+  ];
+  export type OutputTuple = [role: string, account: string, sender: string];
+  export interface OutputObject {
+    role: string;
+    account: string;
+    sender: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace RoleRevokedEvent {
+  export type InputTuple = [
+    role: BytesLike,
+    account: AddressLike,
+    sender: AddressLike
+  ];
+  export type OutputTuple = [role: string, account: string, sender: string];
+  export interface OutputObject {
+    role: string;
+    account: string;
+    sender: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    from: AddressLike,
+    to: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [from: string, to: string, value: bigint];
+  export interface OutputObject {
+    from: string;
+    to: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface XFTMock extends BaseContract {
+  connect(runner?: ContractRunner | null): XFTMock;
+  waitForDeployment(): Promise<this>;
+
+  interface: XFTMockInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  BURNER_ROLE: TypedContractMethod<[], [string], "view">;
+
+  DEFAULT_ADMIN_ROLE: TypedContractMethod<[], [string], "view">;
+
+  MINTER_ROLE: TypedContractMethod<[], [string], "view">;
+
+  allowance: TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  approve: TypedContractMethod<
+    [spender: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">;
+
+  burn: TypedContractMethod<
+    [from: AddressLike, amount: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  decimals: TypedContractMethod<[], [bigint], "view">;
+
+  getRoleAdmin: TypedContractMethod<[role: BytesLike], [string], "view">;
+
+  grantRole: TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  hasRole: TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [boolean],
+    "view"
+  >;
+
+  mint: TypedContractMethod<
+    [to: AddressLike, amount: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  name: TypedContractMethod<[], [string], "view">;
+
+  renounceRole: TypedContractMethod<
+    [role: BytesLike, callerConfirmation: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  revokeRole: TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  supportsInterface: TypedContractMethod<
+    [interfaceId: BytesLike],
+    [boolean],
+    "view"
+  >;
+
+  symbol: TypedContractMethod<[], [string], "view">;
+
+  totalSupply: TypedContractMethod<[], [bigint], "view">;
+
+  transfer: TypedContractMethod<
+    [to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  transferFrom: TypedContractMethod<
+    [from: AddressLike, to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "BURNER_ROLE"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "DEFAULT_ADMIN_ROLE"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "MINTER_ROLE"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "allowance"
+  ): TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [spender: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[account: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "burn"
+  ): TypedContractMethod<
+    [from: AddressLike, amount: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "decimals"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getRoleAdmin"
+  ): TypedContractMethod<[role: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "grantRole"
+  ): TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "hasRole"
+  ): TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [boolean],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "mint"
+  ): TypedContractMethod<
+    [to: AddressLike, amount: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "name"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "renounceRole"
+  ): TypedContractMethod<
+    [role: BytesLike, callerConfirmation: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "revokeRole"
+  ): TypedContractMethod<
+    [role: BytesLike, account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "supportsInterface"
+  ): TypedContractMethod<[interfaceId: BytesLike], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "symbol"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "totalSupply"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "transfer"
+  ): TypedContractMethod<
+    [to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [from: AddressLike, to: AddressLike, value: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "RoleAdminChanged"
+  ): TypedContractEvent<
+    RoleAdminChangedEvent.InputTuple,
+    RoleAdminChangedEvent.OutputTuple,
+    RoleAdminChangedEvent.OutputObject
+  >;
+  getEvent(
+    key: "RoleGranted"
+  ): TypedContractEvent<
+    RoleGrantedEvent.InputTuple,
+    RoleGrantedEvent.OutputTuple,
+    RoleGrantedEvent.OutputObject
+  >;
+  getEvent(
+    key: "RoleRevoked"
+  ): TypedContractEvent<
+    RoleRevokedEvent.InputTuple,
+    RoleRevokedEvent.OutputTuple,
+    RoleRevokedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "RoleAdminChanged(bytes32,bytes32,bytes32)": TypedContractEvent<
+      RoleAdminChangedEvent.InputTuple,
+      RoleAdminChangedEvent.OutputTuple,
+      RoleAdminChangedEvent.OutputObject
+    >;
+    RoleAdminChanged: TypedContractEvent<
+      RoleAdminChangedEvent.InputTuple,
+      RoleAdminChangedEvent.OutputTuple,
+      RoleAdminChangedEvent.OutputObject
+    >;
+
+    "RoleGranted(bytes32,address,address)": TypedContractEvent<
+      RoleGrantedEvent.InputTuple,
+      RoleGrantedEvent.OutputTuple,
+      RoleGrantedEvent.OutputObject
+    >;
+    RoleGranted: TypedContractEvent<
+      RoleGrantedEvent.InputTuple,
+      RoleGrantedEvent.OutputTuple,
+      RoleGrantedEvent.OutputObject
+    >;
+
+    "RoleRevoked(bytes32,address,address)": TypedContractEvent<
+      RoleRevokedEvent.InputTuple,
+      RoleRevokedEvent.OutputTuple,
+      RoleRevokedEvent.OutputObject
+    >;
+    RoleRevoked: TypedContractEvent<
+      RoleRevokedEvent.InputTuple,
+      RoleRevokedEvent.OutputTuple,
+      RoleRevokedEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/XFTmock.sol/index.ts b/momiji-helpers/utils/typechain-types/contracts/XFTmock.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..241109376b325f1586bac32b7f369b052ce5beb2
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/XFTmock.sol/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { XFTMock } from "./XFTMock";
diff --git a/momiji-helpers/utils/typechain-types/contracts/index.ts b/momiji-helpers/utils/typechain-types/contracts/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a5a7d73adedd5d6d86feb0be1e22fa0faa26cf61
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/index.ts
@@ -0,0 +1,11 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as interfaces from "./Interfaces";
+export type { interfaces };
+import type * as xfTmockSol from "./XFTmock.sol";
+export type { xfTmockSol };
+import type * as plonkVkSol from "./plonk_vk.sol";
+export type { plonkVkSol };
+import type * as stateSol from "./state.sol";
+export type { stateSol };
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk.sol/BaseUltraVerifier.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk.sol/BaseUltraVerifier.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fd87802c2ce90a1710ce78b371a0903fd3f97f6f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk.sol/BaseUltraVerifier.ts
@@ -0,0 +1,110 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface BaseUltraVerifierInterface extends Interface {
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [BytesLike, BytesLike[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+}
+
+export interface BaseUltraVerifier extends BaseContract {
+  connect(runner?: ContractRunner | null): BaseUltraVerifier;
+  waitForDeployment(): Promise<this>;
+
+  interface: BaseUltraVerifierInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getVerificationKeyHash: TypedContractMethod<[], [string], "view">;
+
+  verify: TypedContractMethod<
+    [_proof: BytesLike, _publicInputs: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "verify"
+  ): TypedContractMethod<
+    [_proof: BytesLike, _publicInputs: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk.sol/UltraVerifier.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk.sol/UltraVerifier.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0d75066f8a20e891a04110947ebfb68eb16083a6
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk.sol/UltraVerifier.ts
@@ -0,0 +1,110 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface UltraVerifierInterface extends Interface {
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [BytesLike, BytesLike[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+}
+
+export interface UltraVerifier extends BaseContract {
+  connect(runner?: ContractRunner | null): UltraVerifier;
+  waitForDeployment(): Promise<this>;
+
+  interface: UltraVerifierInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getVerificationKeyHash: TypedContractMethod<[], [string], "view">;
+
+  verify: TypedContractMethod<
+    [_proof: BytesLike, _publicInputs: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "verify"
+  ): TypedContractMethod<
+    [_proof: BytesLike, _publicInputs: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk.sol/index.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..72545bb117138bdfd62b88b9aff8e33b2f79a87a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { BaseUltraVerifier } from "./BaseUltraVerifier";
+export type { UltraVerifier } from "./UltraVerifier";
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/BaseUltraVerifier.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/BaseUltraVerifier.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7065169f1829d1248e4c635089ae452c0617558c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/BaseUltraVerifier.ts
@@ -0,0 +1,128 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumber,
+  BytesLike,
+  CallOverrides,
+  PopulatedTransaction,
+  Signer,
+  utils,
+} from "ethers";
+import type { FunctionFragment, Result } from "@ethersproject/abi";
+import type { Listener, Provider } from "@ethersproject/providers";
+import type {
+  TypedEventFilter,
+  TypedEvent,
+  TypedListener,
+  OnEvent,
+  PromiseOrValue,
+} from "../../common";
+
+export interface BaseUltraVerifierInterface extends utils.Interface {
+  functions: {
+    "getVerificationKeyHash()": FunctionFragment;
+    "verify(bytes,bytes32[])": FunctionFragment;
+  };
+
+  getFunction(
+    nameOrSignatureOrTopic: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [PromiseOrValue<BytesLike>, PromiseOrValue<BytesLike>[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+
+  events: {};
+}
+
+export interface BaseUltraVerifier extends BaseContract {
+  connect(signerOrProvider: Signer | Provider | string): this;
+  attach(addressOrName: string): this;
+  deployed(): Promise<this>;
+
+  interface: BaseUltraVerifierInterface;
+
+  queryFilter<TEvent extends TypedEvent>(
+    event: TypedEventFilter<TEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TEvent>>;
+
+  listeners<TEvent extends TypedEvent>(
+    eventFilter?: TypedEventFilter<TEvent>
+  ): Array<TypedListener<TEvent>>;
+  listeners(eventName?: string): Array<Listener>;
+  removeAllListeners<TEvent extends TypedEvent>(
+    eventFilter: TypedEventFilter<TEvent>
+  ): this;
+  removeAllListeners(eventName?: string): this;
+  off: OnEvent<this>;
+  on: OnEvent<this>;
+  once: OnEvent<this>;
+  removeListener: OnEvent<this>;
+
+  functions: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<[string]>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<[boolean]>;
+  };
+
+  getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+  verify(
+    _proof: PromiseOrValue<BytesLike>,
+    _publicInputs: PromiseOrValue<BytesLike>[],
+    overrides?: CallOverrides
+  ): Promise<boolean>;
+
+  callStatic: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<boolean>;
+  };
+
+  filters: {};
+
+  estimateGas: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<BigNumber>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<BigNumber>;
+  };
+
+  populateTransaction: {
+    getVerificationKeyHash(
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/UltraVerifier.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/UltraVerifier.ts
new file mode 100644
index 0000000000000000000000000000000000000000..35dbc6de6ffe533bd7295ec264ca2123b3d6c363
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/UltraVerifier.ts
@@ -0,0 +1,128 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumber,
+  BytesLike,
+  CallOverrides,
+  PopulatedTransaction,
+  Signer,
+  utils,
+} from "ethers";
+import type { FunctionFragment, Result } from "@ethersproject/abi";
+import type { Listener, Provider } from "@ethersproject/providers";
+import type {
+  TypedEventFilter,
+  TypedEvent,
+  TypedListener,
+  OnEvent,
+  PromiseOrValue,
+} from "../../common";
+
+export interface UltraVerifierInterface extends utils.Interface {
+  functions: {
+    "getVerificationKeyHash()": FunctionFragment;
+    "verify(bytes,bytes32[])": FunctionFragment;
+  };
+
+  getFunction(
+    nameOrSignatureOrTopic: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [PromiseOrValue<BytesLike>, PromiseOrValue<BytesLike>[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+
+  events: {};
+}
+
+export interface UltraVerifier extends BaseContract {
+  connect(signerOrProvider: Signer | Provider | string): this;
+  attach(addressOrName: string): this;
+  deployed(): Promise<this>;
+
+  interface: UltraVerifierInterface;
+
+  queryFilter<TEvent extends TypedEvent>(
+    event: TypedEventFilter<TEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TEvent>>;
+
+  listeners<TEvent extends TypedEvent>(
+    eventFilter?: TypedEventFilter<TEvent>
+  ): Array<TypedListener<TEvent>>;
+  listeners(eventName?: string): Array<Listener>;
+  removeAllListeners<TEvent extends TypedEvent>(
+    eventFilter: TypedEventFilter<TEvent>
+  ): this;
+  removeAllListeners(eventName?: string): this;
+  off: OnEvent<this>;
+  on: OnEvent<this>;
+  once: OnEvent<this>;
+  removeListener: OnEvent<this>;
+
+  functions: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<[string]>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<[boolean]>;
+  };
+
+  getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+  verify(
+    _proof: PromiseOrValue<BytesLike>,
+    _publicInputs: PromiseOrValue<BytesLike>[],
+    overrides?: CallOverrides
+  ): Promise<boolean>;
+
+  callStatic: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<boolean>;
+  };
+
+  filters: {};
+
+  estimateGas: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<BigNumber>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<BigNumber>;
+  };
+
+  populateTransaction: {
+    getVerificationKeyHash(
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/UltraVerifierInner.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/UltraVerifierInner.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dee70b0c7098f057ae8c03a048e23648d81e49e7
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/UltraVerifierInner.ts
@@ -0,0 +1,128 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumber,
+  BytesLike,
+  CallOverrides,
+  PopulatedTransaction,
+  Signer,
+  utils,
+} from "ethers";
+import type { FunctionFragment, Result } from "@ethersproject/abi";
+import type { Listener, Provider } from "@ethersproject/providers";
+import type {
+  TypedEventFilter,
+  TypedEvent,
+  TypedListener,
+  OnEvent,
+  PromiseOrValue,
+} from "../../common";
+
+export interface UltraVerifierInnerInterface extends utils.Interface {
+  functions: {
+    "getVerificationKeyHash()": FunctionFragment;
+    "verify(bytes,bytes32[])": FunctionFragment;
+  };
+
+  getFunction(
+    nameOrSignatureOrTopic: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [PromiseOrValue<BytesLike>, PromiseOrValue<BytesLike>[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+
+  events: {};
+}
+
+export interface UltraVerifierInner extends BaseContract {
+  connect(signerOrProvider: Signer | Provider | string): this;
+  attach(addressOrName: string): this;
+  deployed(): Promise<this>;
+
+  interface: UltraVerifierInnerInterface;
+
+  queryFilter<TEvent extends TypedEvent>(
+    event: TypedEventFilter<TEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TEvent>>;
+
+  listeners<TEvent extends TypedEvent>(
+    eventFilter?: TypedEventFilter<TEvent>
+  ): Array<TypedListener<TEvent>>;
+  listeners(eventName?: string): Array<Listener>;
+  removeAllListeners<TEvent extends TypedEvent>(
+    eventFilter: TypedEventFilter<TEvent>
+  ): this;
+  removeAllListeners(eventName?: string): this;
+  off: OnEvent<this>;
+  on: OnEvent<this>;
+  once: OnEvent<this>;
+  removeListener: OnEvent<this>;
+
+  functions: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<[string]>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<[boolean]>;
+  };
+
+  getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+  verify(
+    _proof: PromiseOrValue<BytesLike>,
+    _publicInputs: PromiseOrValue<BytesLike>[],
+    overrides?: CallOverrides
+  ): Promise<boolean>;
+
+  callStatic: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<boolean>;
+  };
+
+  filters: {};
+
+  estimateGas: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<BigNumber>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<BigNumber>;
+  };
+
+  populateTransaction: {
+    getVerificationKeyHash(
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/index.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3d59fc8df10e832ef98c1e00475b4613327ae4f0
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_inner.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { BaseUltraVerifier } from "./BaseUltraVerifier";
+export type { UltraVerifierInner } from "./UltraVerifierInner";
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/BaseUltraVerifier.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/BaseUltraVerifier.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7065169f1829d1248e4c635089ae452c0617558c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/BaseUltraVerifier.ts
@@ -0,0 +1,128 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumber,
+  BytesLike,
+  CallOverrides,
+  PopulatedTransaction,
+  Signer,
+  utils,
+} from "ethers";
+import type { FunctionFragment, Result } from "@ethersproject/abi";
+import type { Listener, Provider } from "@ethersproject/providers";
+import type {
+  TypedEventFilter,
+  TypedEvent,
+  TypedListener,
+  OnEvent,
+  PromiseOrValue,
+} from "../../common";
+
+export interface BaseUltraVerifierInterface extends utils.Interface {
+  functions: {
+    "getVerificationKeyHash()": FunctionFragment;
+    "verify(bytes,bytes32[])": FunctionFragment;
+  };
+
+  getFunction(
+    nameOrSignatureOrTopic: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [PromiseOrValue<BytesLike>, PromiseOrValue<BytesLike>[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+
+  events: {};
+}
+
+export interface BaseUltraVerifier extends BaseContract {
+  connect(signerOrProvider: Signer | Provider | string): this;
+  attach(addressOrName: string): this;
+  deployed(): Promise<this>;
+
+  interface: BaseUltraVerifierInterface;
+
+  queryFilter<TEvent extends TypedEvent>(
+    event: TypedEventFilter<TEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TEvent>>;
+
+  listeners<TEvent extends TypedEvent>(
+    eventFilter?: TypedEventFilter<TEvent>
+  ): Array<TypedListener<TEvent>>;
+  listeners(eventName?: string): Array<Listener>;
+  removeAllListeners<TEvent extends TypedEvent>(
+    eventFilter: TypedEventFilter<TEvent>
+  ): this;
+  removeAllListeners(eventName?: string): this;
+  off: OnEvent<this>;
+  on: OnEvent<this>;
+  once: OnEvent<this>;
+  removeListener: OnEvent<this>;
+
+  functions: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<[string]>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<[boolean]>;
+  };
+
+  getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+  verify(
+    _proof: PromiseOrValue<BytesLike>,
+    _publicInputs: PromiseOrValue<BytesLike>[],
+    overrides?: CallOverrides
+  ): Promise<boolean>;
+
+  callStatic: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<boolean>;
+  };
+
+  filters: {};
+
+  estimateGas: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<BigNumber>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<BigNumber>;
+  };
+
+  populateTransaction: {
+    getVerificationKeyHash(
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/UltraVerifier.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/UltraVerifier.ts
new file mode 100644
index 0000000000000000000000000000000000000000..35dbc6de6ffe533bd7295ec264ca2123b3d6c363
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/UltraVerifier.ts
@@ -0,0 +1,128 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumber,
+  BytesLike,
+  CallOverrides,
+  PopulatedTransaction,
+  Signer,
+  utils,
+} from "ethers";
+import type { FunctionFragment, Result } from "@ethersproject/abi";
+import type { Listener, Provider } from "@ethersproject/providers";
+import type {
+  TypedEventFilter,
+  TypedEvent,
+  TypedListener,
+  OnEvent,
+  PromiseOrValue,
+} from "../../common";
+
+export interface UltraVerifierInterface extends utils.Interface {
+  functions: {
+    "getVerificationKeyHash()": FunctionFragment;
+    "verify(bytes,bytes32[])": FunctionFragment;
+  };
+
+  getFunction(
+    nameOrSignatureOrTopic: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [PromiseOrValue<BytesLike>, PromiseOrValue<BytesLike>[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+
+  events: {};
+}
+
+export interface UltraVerifier extends BaseContract {
+  connect(signerOrProvider: Signer | Provider | string): this;
+  attach(addressOrName: string): this;
+  deployed(): Promise<this>;
+
+  interface: UltraVerifierInterface;
+
+  queryFilter<TEvent extends TypedEvent>(
+    event: TypedEventFilter<TEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TEvent>>;
+
+  listeners<TEvent extends TypedEvent>(
+    eventFilter?: TypedEventFilter<TEvent>
+  ): Array<TypedListener<TEvent>>;
+  listeners(eventName?: string): Array<Listener>;
+  removeAllListeners<TEvent extends TypedEvent>(
+    eventFilter: TypedEventFilter<TEvent>
+  ): this;
+  removeAllListeners(eventName?: string): this;
+  off: OnEvent<this>;
+  on: OnEvent<this>;
+  once: OnEvent<this>;
+  removeListener: OnEvent<this>;
+
+  functions: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<[string]>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<[boolean]>;
+  };
+
+  getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+  verify(
+    _proof: PromiseOrValue<BytesLike>,
+    _publicInputs: PromiseOrValue<BytesLike>[],
+    overrides?: CallOverrides
+  ): Promise<boolean>;
+
+  callStatic: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<boolean>;
+  };
+
+  filters: {};
+
+  estimateGas: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<BigNumber>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<BigNumber>;
+  };
+
+  populateTransaction: {
+    getVerificationKeyHash(
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/UltraVerifierOuter.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/UltraVerifierOuter.ts
new file mode 100644
index 0000000000000000000000000000000000000000..210794bc7b777cf77332e2bf3722dd5cfdba43b9
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/UltraVerifierOuter.ts
@@ -0,0 +1,128 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumber,
+  BytesLike,
+  CallOverrides,
+  PopulatedTransaction,
+  Signer,
+  utils,
+} from "ethers";
+import type { FunctionFragment, Result } from "@ethersproject/abi";
+import type { Listener, Provider } from "@ethersproject/providers";
+import type {
+  TypedEventFilter,
+  TypedEvent,
+  TypedListener,
+  OnEvent,
+  PromiseOrValue,
+} from "../../common";
+
+export interface UltraVerifierOuterInterface extends utils.Interface {
+  functions: {
+    "getVerificationKeyHash()": FunctionFragment;
+    "verify(bytes,bytes32[])": FunctionFragment;
+  };
+
+  getFunction(
+    nameOrSignatureOrTopic: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [PromiseOrValue<BytesLike>, PromiseOrValue<BytesLike>[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+
+  events: {};
+}
+
+export interface UltraVerifierOuter extends BaseContract {
+  connect(signerOrProvider: Signer | Provider | string): this;
+  attach(addressOrName: string): this;
+  deployed(): Promise<this>;
+
+  interface: UltraVerifierOuterInterface;
+
+  queryFilter<TEvent extends TypedEvent>(
+    event: TypedEventFilter<TEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TEvent>>;
+
+  listeners<TEvent extends TypedEvent>(
+    eventFilter?: TypedEventFilter<TEvent>
+  ): Array<TypedListener<TEvent>>;
+  listeners(eventName?: string): Array<Listener>;
+  removeAllListeners<TEvent extends TypedEvent>(
+    eventFilter: TypedEventFilter<TEvent>
+  ): this;
+  removeAllListeners(eventName?: string): this;
+  off: OnEvent<this>;
+  on: OnEvent<this>;
+  once: OnEvent<this>;
+  removeListener: OnEvent<this>;
+
+  functions: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<[string]>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<[boolean]>;
+  };
+
+  getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+  verify(
+    _proof: PromiseOrValue<BytesLike>,
+    _publicInputs: PromiseOrValue<BytesLike>[],
+    overrides?: CallOverrides
+  ): Promise<boolean>;
+
+  callStatic: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<string>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<boolean>;
+  };
+
+  filters: {};
+
+  estimateGas: {
+    getVerificationKeyHash(overrides?: CallOverrides): Promise<BigNumber>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<BigNumber>;
+  };
+
+  populateTransaction: {
+    getVerificationKeyHash(
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+
+    verify(
+      _proof: PromiseOrValue<BytesLike>,
+      _publicInputs: PromiseOrValue<BytesLike>[],
+      overrides?: CallOverrides
+    ): Promise<PopulatedTransaction>;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/index.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8b7ecd044c532de15d79d1537bb01143834d9cbf
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_outer.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { BaseUltraVerifier } from "./BaseUltraVerifier";
+export type { UltraVerifierOuter } from "./UltraVerifierOuter";
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/BaseUltraVerifier.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/BaseUltraVerifier.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fd87802c2ce90a1710ce78b371a0903fd3f97f6f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/BaseUltraVerifier.ts
@@ -0,0 +1,110 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface BaseUltraVerifierInterface extends Interface {
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [BytesLike, BytesLike[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+}
+
+export interface BaseUltraVerifier extends BaseContract {
+  connect(runner?: ContractRunner | null): BaseUltraVerifier;
+  waitForDeployment(): Promise<this>;
+
+  interface: BaseUltraVerifierInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getVerificationKeyHash: TypedContractMethod<[], [string], "view">;
+
+  verify: TypedContractMethod<
+    [_proof: BytesLike, _publicInputs: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "verify"
+  ): TypedContractMethod<
+    [_proof: BytesLike, _publicInputs: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/PublishVerifier.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/PublishVerifier.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3e284d3b2655be1367cabac42614de8362ce670d
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/PublishVerifier.ts
@@ -0,0 +1,110 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface PublishVerifierInterface extends Interface {
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [BytesLike, BytesLike[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+}
+
+export interface PublishVerifier extends BaseContract {
+  connect(runner?: ContractRunner | null): PublishVerifier;
+  waitForDeployment(): Promise<this>;
+
+  interface: PublishVerifierInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getVerificationKeyHash: TypedContractMethod<[], [string], "view">;
+
+  verify: TypedContractMethod<
+    [_proof: BytesLike, _publicInputs: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "verify"
+  ): TypedContractMethod<
+    [_proof: BytesLike, _publicInputs: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/Publisher.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/Publisher.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1d8c28a185bc8e5bc3109b6a4e4f02ac3a0a927b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/Publisher.ts
@@ -0,0 +1,110 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface PublisherInterface extends Interface {
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [BytesLike, BytesLike[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+}
+
+export interface Publisher extends BaseContract {
+  connect(runner?: ContractRunner | null): Publisher;
+  waitForDeployment(): Promise<this>;
+
+  interface: PublisherInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getVerificationKeyHash: TypedContractMethod<[], [string], "view">;
+
+  verify: TypedContractMethod<
+    [_proof: BytesLike, _publicInputs: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "verify"
+  ): TypedContractMethod<
+    [_proof: BytesLike, _publicInputs: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/index.ts b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..00173ef85a91ebb075228028aa2d822adc526923
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/plonk_vk_publish.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { BaseUltraVerifier } from "./BaseUltraVerifier";
+export type { PublishVerifier } from "./PublishVerifier";
diff --git a/momiji-helpers/utils/typechain-types/contracts/state.sol/IMomiji.ts b/momiji-helpers/utils/typechain-types/contracts/state.sol/IMomiji.ts
new file mode 100644
index 0000000000000000000000000000000000000000..50d8cc2d6276dc31e2debef6988edbd40bf5256c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/state.sol/IMomiji.ts
@@ -0,0 +1,200 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export type EncryptedUTXOStruct = {
+  secret: BytesLike;
+  amount: BytesLike;
+  data: BytesLike;
+};
+
+export type EncryptedUTXOStructOutput = [
+  secret: string,
+  amount: string,
+  data: string
+] & { secret: string; amount: string; data: string };
+
+export type DepositStruct = { signature: BytesLike; pi_hash: BytesLike };
+
+export type DepositStructOutput = [signature: string, pi_hash: string] & {
+  signature: string;
+  pi_hash: string;
+};
+
+export type TransactionStruct = {
+  current_root: BytesLike;
+  utxo_root: BytesLike;
+  price_limit: BytesLike;
+  timestamp: BytesLike;
+  deadline: BytesLike;
+  amount: BytesLike;
+  encrypted_utxo: EncryptedUTXOStruct[];
+  withdrawals: BytesLike[];
+  commitments_in: BytesLike[];
+  commitments: BytesLike[];
+  recipients: BytesLike[];
+  nullifier_hashes: BytesLike[];
+  uids: BytesLike[];
+  swap_amounts: BytesLike[];
+  deposit: DepositStruct;
+};
+
+export type TransactionStructOutput = [
+  current_root: string,
+  utxo_root: string,
+  price_limit: string,
+  timestamp: string,
+  deadline: string,
+  amount: string,
+  encrypted_utxo: EncryptedUTXOStructOutput[],
+  withdrawals: string[],
+  commitments_in: string[],
+  commitments: string[],
+  recipients: string[],
+  nullifier_hashes: string[],
+  uids: string[],
+  swap_amounts: string[],
+  deposit: DepositStructOutput
+] & {
+  current_root: string;
+  utxo_root: string;
+  price_limit: string;
+  timestamp: string;
+  deadline: string;
+  amount: string;
+  encrypted_utxo: EncryptedUTXOStructOutput[];
+  withdrawals: string[];
+  commitments_in: string[];
+  commitments: string[];
+  recipients: string[];
+  nullifier_hashes: string[];
+  uids: string[];
+  swap_amounts: string[];
+  deposit: DepositStructOutput;
+};
+
+export type BatchStruct = {
+  tx_key_hash: BytesLike;
+  recursive_key_hash: BytesLike;
+  new_root: BytesLike;
+  old_hist_root: BytesLike;
+  new_hist_root: BytesLike;
+  oracle: BytesLike;
+  historic_path: BytesLike[];
+  aggregation_object: BytesLike[];
+  transactions: TransactionStruct[];
+};
+
+export type BatchStructOutput = [
+  tx_key_hash: string,
+  recursive_key_hash: string,
+  new_root: string,
+  old_hist_root: string,
+  new_hist_root: string,
+  oracle: string,
+  historic_path: string[],
+  aggregation_object: string[],
+  transactions: TransactionStructOutput[]
+] & {
+  tx_key_hash: string;
+  recursive_key_hash: string;
+  new_root: string;
+  old_hist_root: string;
+  new_hist_root: string;
+  oracle: string;
+  historic_path: string[];
+  aggregation_object: string[];
+  transactions: TransactionStructOutput[];
+};
+
+export interface IMomijiInterface extends Interface {
+  getFunction(nameOrSignature: "publish"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "publish",
+    values: [BytesLike, BatchStruct]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "publish", data: BytesLike): Result;
+}
+
+export interface IMomiji extends BaseContract {
+  connect(runner?: ContractRunner | null): IMomiji;
+  waitForDeployment(): Promise<this>;
+
+  interface: IMomijiInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  publish: TypedContractMethod<
+    [_proof: BytesLike, _batch: BatchStruct],
+    [void],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "publish"
+  ): TypedContractMethod<
+    [_proof: BytesLike, _batch: BatchStruct],
+    [void],
+    "nonpayable"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/state.sol/IOracle.ts b/momiji-helpers/utils/typechain-types/contracts/state.sol/IOracle.ts
new file mode 100644
index 0000000000000000000000000000000000000000..36fcae1252526be1c9660382ab10a21c1c91764f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/state.sol/IOracle.ts
@@ -0,0 +1,114 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface IOracleInterface extends Interface {
+  getFunction(nameOrSignature: "chainlinkPrice" | "getCost"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "chainlinkPrice",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getCost",
+    values: [BigNumberish, AddressLike, AddressLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "chainlinkPrice",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "getCost", data: BytesLike): Result;
+}
+
+export interface IOracle extends BaseContract {
+  connect(runner?: ContractRunner | null): IOracle;
+  waitForDeployment(): Promise<this>;
+
+  interface: IOracleInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  chainlinkPrice: TypedContractMethod<
+    [_chainlinkFeed: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  getCost: TypedContractMethod<
+    [_amount: BigNumberish, _chainlinkFeed: AddressLike, _xftPool: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "chainlinkPrice"
+  ): TypedContractMethod<[_chainlinkFeed: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getCost"
+  ): TypedContractMethod<
+    [_amount: BigNumberish, _chainlinkFeed: AddressLike, _xftPool: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/state.sol/IVerifier.ts b/momiji-helpers/utils/typechain-types/contracts/state.sol/IVerifier.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6b0b3989c9e71730d62807bc76d0e5fd513ace5e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/state.sol/IVerifier.ts
@@ -0,0 +1,110 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface IVerifierInterface extends Interface {
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash" | "verify"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "getVerificationKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "verify",
+    values: [BytesLike, BytesLike[]]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "getVerificationKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "verify", data: BytesLike): Result;
+}
+
+export interface IVerifier extends BaseContract {
+  connect(runner?: ContractRunner | null): IVerifier;
+  waitForDeployment(): Promise<this>;
+
+  interface: IVerifierInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getVerificationKeyHash: TypedContractMethod<[], [string], "view">;
+
+  verify: TypedContractMethod<
+    [arg0: BytesLike, arg1: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "getVerificationKeyHash"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "verify"
+  ): TypedContractMethod<
+    [arg0: BytesLike, arg1: BytesLike[]],
+    [boolean],
+    "view"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/state.sol/IWETH9.ts b/momiji-helpers/utils/typechain-types/contracts/state.sol/IWETH9.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b5ede57ea9357c874f53006aad97070691909fba
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/state.sol/IWETH9.ts
@@ -0,0 +1,281 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export interface IWETH9Interface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "allowance"
+      | "approve"
+      | "balanceOf"
+      | "deposit"
+      | "totalSupply"
+      | "transfer"
+      | "transferFrom"
+      | "withdraw"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "allowance",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(functionFragment: "deposit", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "totalSupply",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transfer",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "withdraw",
+    values: [BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "deposit", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "totalSupply",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    spender: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [owner: string, spender: string, value: bigint];
+  export interface OutputObject {
+    owner: string;
+    spender: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    from: AddressLike,
+    to: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [from: string, to: string, value: bigint];
+  export interface OutputObject {
+    from: string;
+    to: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IWETH9 extends BaseContract {
+  connect(runner?: ContractRunner | null): IWETH9;
+  waitForDeployment(): Promise<this>;
+
+  interface: IWETH9Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  allowance: TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  approve: TypedContractMethod<
+    [spender: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">;
+
+  deposit: TypedContractMethod<[], [void], "payable">;
+
+  totalSupply: TypedContractMethod<[], [bigint], "view">;
+
+  transfer: TypedContractMethod<
+    [recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  transferFrom: TypedContractMethod<
+    [sender: AddressLike, recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  withdraw: TypedContractMethod<[_amount: BigNumberish], [void], "nonpayable">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "allowance"
+  ): TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [spender: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[account: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "deposit"
+  ): TypedContractMethod<[], [void], "payable">;
+  getFunction(
+    nameOrSignature: "totalSupply"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "transfer"
+  ): TypedContractMethod<
+    [recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [sender: AddressLike, recipient: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "withdraw"
+  ): TypedContractMethod<[_amount: BigNumberish], [void], "nonpayable">;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/state.sol/Momiji.ts b/momiji-helpers/utils/typechain-types/contracts/state.sol/Momiji.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b62eb28a96ff29bccb642c064d541c17a2aeaf91
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/state.sol/Momiji.ts
@@ -0,0 +1,1539 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../common";
+
+export type EncryptedUTXOStruct = {
+  secret: BytesLike;
+  amount: BytesLike;
+  data: BytesLike;
+};
+
+export type EncryptedUTXOStructOutput = [
+  secret: string,
+  amount: string,
+  data: string
+] & { secret: string; amount: string; data: string };
+
+export type DepositStruct = { signature: BytesLike; pi_hash: BytesLike };
+
+export type DepositStructOutput = [signature: string, pi_hash: string] & {
+  signature: string;
+  pi_hash: string;
+};
+
+export type TransactionStruct = {
+  current_root: BytesLike;
+  utxo_root: BytesLike;
+  price_limit: BytesLike;
+  timestamp: BytesLike;
+  deadline: BytesLike;
+  amount: BytesLike;
+  encrypted_utxo: EncryptedUTXOStruct[];
+  withdrawals: BytesLike[];
+  commitments_in: BytesLike[];
+  commitments: BytesLike[];
+  recipients: BytesLike[];
+  nullifier_hashes: BytesLike[];
+  uids: BytesLike[];
+  swap_amounts: BytesLike[];
+  deposit: DepositStruct;
+};
+
+export type TransactionStructOutput = [
+  current_root: string,
+  utxo_root: string,
+  price_limit: string,
+  timestamp: string,
+  deadline: string,
+  amount: string,
+  encrypted_utxo: EncryptedUTXOStructOutput[],
+  withdrawals: string[],
+  commitments_in: string[],
+  commitments: string[],
+  recipients: string[],
+  nullifier_hashes: string[],
+  uids: string[],
+  swap_amounts: string[],
+  deposit: DepositStructOutput
+] & {
+  current_root: string;
+  utxo_root: string;
+  price_limit: string;
+  timestamp: string;
+  deadline: string;
+  amount: string;
+  encrypted_utxo: EncryptedUTXOStructOutput[];
+  withdrawals: string[];
+  commitments_in: string[];
+  commitments: string[];
+  recipients: string[];
+  nullifier_hashes: string[];
+  uids: string[];
+  swap_amounts: string[];
+  deposit: DepositStructOutput;
+};
+
+export type TransactionWithProofStruct = {
+  transaction: TransactionStruct;
+  proof: BytesLike[];
+  proofU8: BytesLike;
+};
+
+export type TransactionWithProofStructOutput = [
+  transaction: TransactionStructOutput,
+  proof: string[],
+  proofU8: string
+] & { transaction: TransactionStructOutput; proof: string[]; proofU8: string };
+
+export type BatchStruct = {
+  tx_key_hash: BytesLike;
+  recursive_key_hash: BytesLike;
+  new_root: BytesLike;
+  old_hist_root: BytesLike;
+  new_hist_root: BytesLike;
+  oracle: BytesLike;
+  historic_path: BytesLike[];
+  aggregation_object: BytesLike[];
+  transactions: TransactionStruct[];
+};
+
+export type BatchStructOutput = [
+  tx_key_hash: string,
+  recursive_key_hash: string,
+  new_root: string,
+  old_hist_root: string,
+  new_hist_root: string,
+  oracle: string,
+  historic_path: string[],
+  aggregation_object: string[],
+  transactions: TransactionStructOutput[]
+] & {
+  tx_key_hash: string;
+  recursive_key_hash: string;
+  new_root: string;
+  old_hist_root: string;
+  new_hist_root: string;
+  oracle: string;
+  historic_path: string[];
+  aggregation_object: string[];
+  transactions: TransactionStructOutput[];
+};
+
+export interface MomijiInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "MAX_ITEMS"
+      | "MAX_UTXOS"
+      | "STATE_DEPTH"
+      | "UPGRADE_INTERFACE_VERSION"
+      | "_accumulatePublicInputs"
+      | "_getSignatureHash"
+      | "batchNumber"
+      | "broadcastAddress"
+      | "broadcastTransaction"
+      | "burnPercentageSwap"
+      | "changeBurnPercentage"
+      | "changeCap"
+      | "changePools"
+      | "dailyCap"
+      | "dailyMint"
+      | "ecRecover"
+      | "eip712Domain"
+      | "emergencyPause"
+      | "emergencyUnpause"
+      | "fee"
+      | "getSpentNullifiers"
+      | "getValidRootAtIndex"
+      | "getValidRoots"
+      | "getValidRootsPaginated"
+      | "hashCircuitInputsForTx"
+      | "hashCircuitInputsForTxWithoutDeposit"
+      | "hashContractOnlyInputsForTx"
+      | "hashContractOnlyInputsForTxWithoutDeposit"
+      | "hashTypedDataV4"
+      | "histRoot"
+      | "initialize"
+      | "isSpent"
+      | "lastCapReset"
+      | "merkleRoot"
+      | "nullifierHashes"
+      | "oracle"
+      | "owner"
+      | "paused"
+      | "prepareBatchPublicInputs"
+      | "proxiableUUID"
+      | "publish"
+      | "recursiveKeyHash"
+      | "relay"
+      | "renounceOwnership"
+      | "simulatePublish"
+      | "swapRouter"
+      | "token"
+      | "transferOwnership"
+      | "txKeyHash"
+      | "txWrapperKeyHash"
+      | "updateCircuits"
+      | "upgradeToAndCall"
+      | "utxoPrevRoots"
+      | "validRoots"
+      | "verifier"
+      | "verifyProof"
+      | "xft"
+      | "xftPool"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic:
+      | "BatchPublish"
+      | "BroadcastAddress"
+      | "BurnPercentageChanged"
+      | "DailyCapChanged"
+      | "EIP712DomainChanged"
+      | "EncryptedUTXOBroadcast"
+      | "Initialized"
+      | "OwnershipTransferred"
+      | "Paused"
+      | "TransactionBroadcast"
+      | "TransactionPublish"
+      | "Unpaused"
+      | "Upgraded"
+  ): EventFragment;
+
+  encodeFunctionData(functionFragment: "MAX_ITEMS", values?: undefined): string;
+  encodeFunctionData(functionFragment: "MAX_UTXOS", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "STATE_DEPTH",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "UPGRADE_INTERFACE_VERSION",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "_accumulatePublicInputs",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "_getSignatureHash",
+    values: [TransactionStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "batchNumber",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "broadcastAddress",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "broadcastTransaction",
+    values: [TransactionWithProofStruct, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "burnPercentageSwap",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "changeBurnPercentage",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "changeCap",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "changePools",
+    values: [AddressLike[]]
+  ): string;
+  encodeFunctionData(functionFragment: "dailyCap", values?: undefined): string;
+  encodeFunctionData(functionFragment: "dailyMint", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "ecRecover",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "eip712Domain",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "emergencyPause",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "emergencyUnpause",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "fee", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "getSpentNullifiers",
+    values: [BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getValidRootAtIndex",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getValidRoots",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getValidRootsPaginated",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "hashCircuitInputsForTx",
+    values: [TransactionStruct, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "hashCircuitInputsForTxWithoutDeposit",
+    values: [TransactionStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "hashContractOnlyInputsForTx",
+    values: [TransactionStruct, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "hashContractOnlyInputsForTxWithoutDeposit",
+    values: [TransactionStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "hashTypedDataV4",
+    values: [DepositStruct]
+  ): string;
+  encodeFunctionData(functionFragment: "histRoot", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "initialize",
+    values: [
+      AddressLike,
+      AddressLike,
+      BytesLike,
+      BytesLike,
+      BytesLike,
+      AddressLike
+    ]
+  ): string;
+  encodeFunctionData(functionFragment: "isSpent", values: [BytesLike]): string;
+  encodeFunctionData(
+    functionFragment: "lastCapReset",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "merkleRoot",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "nullifierHashes",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "oracle", values?: undefined): string;
+  encodeFunctionData(functionFragment: "owner", values?: undefined): string;
+  encodeFunctionData(functionFragment: "paused", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "prepareBatchPublicInputs",
+    values: [BatchStruct, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "proxiableUUID",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "publish",
+    values: [BytesLike, BatchStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "recursiveKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "relay", values: [BytesLike]): string;
+  encodeFunctionData(
+    functionFragment: "renounceOwnership",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "simulatePublish",
+    values: [BatchStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "swapRouter",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "token", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "transferOwnership",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(functionFragment: "txKeyHash", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "txWrapperKeyHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "updateCircuits",
+    values: [BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "upgradeToAndCall",
+    values: [AddressLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "utxoPrevRoots",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "validRoots",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "verifier", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "verifyProof",
+    values: [BytesLike, BatchStruct, BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "xft", values?: undefined): string;
+  encodeFunctionData(functionFragment: "xftPool", values?: undefined): string;
+
+  decodeFunctionResult(functionFragment: "MAX_ITEMS", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "MAX_UTXOS", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "STATE_DEPTH",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "UPGRADE_INTERFACE_VERSION",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "_accumulatePublicInputs",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "_getSignatureHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "batchNumber",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "broadcastAddress",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "broadcastTransaction",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "burnPercentageSwap",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "changeBurnPercentage",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "changeCap", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "changePools",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "dailyCap", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "dailyMint", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "ecRecover", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "eip712Domain",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "emergencyPause",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "emergencyUnpause",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "fee", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getSpentNullifiers",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getValidRootAtIndex",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getValidRoots",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getValidRootsPaginated",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "hashCircuitInputsForTx",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "hashCircuitInputsForTxWithoutDeposit",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "hashContractOnlyInputsForTx",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "hashContractOnlyInputsForTxWithoutDeposit",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "hashTypedDataV4",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "histRoot", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "isSpent", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "lastCapReset",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "merkleRoot", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "nullifierHashes",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "oracle", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "prepareBatchPublicInputs",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "proxiableUUID",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "publish", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "recursiveKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "relay", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "renounceOwnership",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "simulatePublish",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "swapRouter", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "token", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferOwnership",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "txKeyHash", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "txWrapperKeyHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "updateCircuits",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "upgradeToAndCall",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "utxoPrevRoots",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "validRoots", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "verifier", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "verifyProof",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "xft", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "xftPool", data: BytesLike): Result;
+}
+
+export namespace BatchPublishEvent {
+  export type InputTuple = [
+    _batchNumber: BigNumberish,
+    _oldRoot: BytesLike,
+    _newRoot: BytesLike,
+    _oracle: BytesLike,
+    _historicPath: BytesLike[]
+  ];
+  export type OutputTuple = [
+    _batchNumber: bigint,
+    _oldRoot: string,
+    _newRoot: string,
+    _oracle: string,
+    _historicPath: string[]
+  ];
+  export interface OutputObject {
+    _batchNumber: bigint;
+    _oldRoot: string;
+    _newRoot: string;
+    _oracle: string;
+    _historicPath: string[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace BroadcastAddressEvent {
+  export type InputTuple = [_merkleRoot: BytesLike, _address: string];
+  export type OutputTuple = [_merkleRoot: string, _address: string];
+  export interface OutputObject {
+    _merkleRoot: string;
+    _address: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace BurnPercentageChangedEvent {
+  export type InputTuple = [
+    _oldPercentage: BigNumberish,
+    _newPercentage: BigNumberish
+  ];
+  export type OutputTuple = [_oldPercentage: bigint, _newPercentage: bigint];
+  export interface OutputObject {
+    _oldPercentage: bigint;
+    _newPercentage: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace DailyCapChangedEvent {
+  export type InputTuple = [_oldCap: BigNumberish, _newCap: BigNumberish];
+  export type OutputTuple = [_oldCap: bigint, _newCap: bigint];
+  export interface OutputObject {
+    _oldCap: bigint;
+    _newCap: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace EIP712DomainChangedEvent {
+  export type InputTuple = [];
+  export type OutputTuple = [];
+  export interface OutputObject {}
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace EncryptedUTXOBroadcastEvent {
+  export type InputTuple = [
+    _oldRoot: BytesLike,
+    _utxoId: BytesLike,
+    _encryptedUTXO: EncryptedUTXOStruct
+  ];
+  export type OutputTuple = [
+    _oldRoot: string,
+    _utxoId: string,
+    _encryptedUTXO: EncryptedUTXOStructOutput
+  ];
+  export interface OutputObject {
+    _oldRoot: string;
+    _utxoId: string;
+    _encryptedUTXO: EncryptedUTXOStructOutput;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace InitializedEvent {
+  export type InputTuple = [version: BigNumberish];
+  export type OutputTuple = [version: bigint];
+  export interface OutputObject {
+    version: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace OwnershipTransferredEvent {
+  export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike];
+  export type OutputTuple = [previousOwner: string, newOwner: string];
+  export interface OutputObject {
+    previousOwner: string;
+    newOwner: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace PausedEvent {
+  export type InputTuple = [account: AddressLike];
+  export type OutputTuple = [account: string];
+  export interface OutputObject {
+    account: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransactionBroadcastEvent {
+  export type InputTuple = [
+    _tx: TransactionWithProofStruct,
+    _merkleRoot: BytesLike,
+    _txId: BytesLike
+  ];
+  export type OutputTuple = [
+    _tx: TransactionWithProofStructOutput,
+    _merkleRoot: string,
+    _txId: string
+  ];
+  export interface OutputObject {
+    _tx: TransactionWithProofStructOutput;
+    _merkleRoot: string;
+    _txId: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransactionPublishEvent {
+  export type InputTuple = [
+    _tx: TransactionStruct,
+    _merkleRoot: BytesLike,
+    _txId: BytesLike
+  ];
+  export type OutputTuple = [
+    _tx: TransactionStructOutput,
+    _merkleRoot: string,
+    _txId: string
+  ];
+  export interface OutputObject {
+    _tx: TransactionStructOutput;
+    _merkleRoot: string;
+    _txId: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace UnpausedEvent {
+  export type InputTuple = [account: AddressLike];
+  export type OutputTuple = [account: string];
+  export interface OutputObject {
+    account: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace UpgradedEvent {
+  export type InputTuple = [implementation: AddressLike];
+  export type OutputTuple = [implementation: string];
+  export interface OutputObject {
+    implementation: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface Momiji extends BaseContract {
+  connect(runner?: ContractRunner | null): Momiji;
+  waitForDeployment(): Promise<this>;
+
+  interface: MomijiInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  MAX_ITEMS: TypedContractMethod<[], [bigint], "view">;
+
+  MAX_UTXOS: TypedContractMethod<[], [bigint], "view">;
+
+  STATE_DEPTH: TypedContractMethod<[], [bigint], "view">;
+
+  UPGRADE_INTERFACE_VERSION: TypedContractMethod<[], [string], "view">;
+
+  _accumulatePublicInputs: TypedContractMethod<
+    [_previousAccumulator: BytesLike, _publicInputsHash: BytesLike],
+    [string],
+    "view"
+  >;
+
+  _getSignatureHash: TypedContractMethod<
+    [_transaction: TransactionStruct],
+    [string],
+    "view"
+  >;
+
+  batchNumber: TypedContractMethod<[], [bigint], "view">;
+
+  broadcastAddress: TypedContractMethod<
+    [_address: string],
+    [void],
+    "nonpayable"
+  >;
+
+  broadcastTransaction: TypedContractMethod<
+    [_tx: TransactionWithProofStruct, _recipient: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  burnPercentageSwap: TypedContractMethod<[], [bigint], "view">;
+
+  changeBurnPercentage: TypedContractMethod<
+    [_percentage: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  changeCap: TypedContractMethod<[_cap: BigNumberish], [void], "nonpayable">;
+
+  changePools: TypedContractMethod<
+    [_addrs: AddressLike[]],
+    [void],
+    "nonpayable"
+  >;
+
+  dailyCap: TypedContractMethod<[], [bigint], "view">;
+
+  dailyMint: TypedContractMethod<[], [bigint], "view">;
+
+  ecRecover: TypedContractMethod<
+    [_hash: BytesLike, _signature: BytesLike],
+    [string],
+    "view"
+  >;
+
+  eip712Domain: TypedContractMethod<
+    [],
+    [
+      [string, string, string, bigint, string, string, bigint[]] & {
+        fields: string;
+        name: string;
+        version: string;
+        chainId: bigint;
+        verifyingContract: string;
+        salt: string;
+        extensions: bigint[];
+      }
+    ],
+    "view"
+  >;
+
+  emergencyPause: TypedContractMethod<[], [void], "nonpayable">;
+
+  emergencyUnpause: TypedContractMethod<[], [void], "nonpayable">;
+
+  fee: TypedContractMethod<[], [bigint], "view">;
+
+  getSpentNullifiers: TypedContractMethod<
+    [_nullifierHashes: BytesLike[]],
+    [boolean[]],
+    "view"
+  >;
+
+  getValidRootAtIndex: TypedContractMethod<
+    [_index: BigNumberish],
+    [string],
+    "view"
+  >;
+
+  getValidRoots: TypedContractMethod<[], [string[]], "view">;
+
+  getValidRootsPaginated: TypedContractMethod<
+    [_start: BigNumberish, _end: BigNumberish],
+    [string[]],
+    "view"
+  >;
+
+  hashCircuitInputsForTx: TypedContractMethod<
+    [_tx: TransactionStruct, _signatureHash: BytesLike],
+    [string],
+    "view"
+  >;
+
+  hashCircuitInputsForTxWithoutDeposit: TypedContractMethod<
+    [_tx: TransactionStruct],
+    [string],
+    "view"
+  >;
+
+  hashContractOnlyInputsForTx: TypedContractMethod<
+    [_tx: TransactionStruct, _signatureHash: BytesLike],
+    [string],
+    "view"
+  >;
+
+  hashContractOnlyInputsForTxWithoutDeposit: TypedContractMethod<
+    [_tx: TransactionStruct],
+    [string],
+    "view"
+  >;
+
+  hashTypedDataV4: TypedContractMethod<
+    [_deposit: DepositStruct],
+    [string],
+    "view"
+  >;
+
+  histRoot: TypedContractMethod<[], [string], "view">;
+
+  initialize: TypedContractMethod<
+    [
+      _verifier: AddressLike,
+      _token: AddressLike,
+      _txKeyHash: BytesLike,
+      _txWrapperKeyHash: BytesLike,
+      _recursiveKeyHash: BytesLike,
+      _xftPool: AddressLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  isSpent: TypedContractMethod<[_nullifierHash: BytesLike], [boolean], "view">;
+
+  lastCapReset: TypedContractMethod<[], [bigint], "view">;
+
+  merkleRoot: TypedContractMethod<[], [string], "view">;
+
+  nullifierHashes: TypedContractMethod<[arg0: BytesLike], [boolean], "view">;
+
+  oracle: TypedContractMethod<[], [string], "view">;
+
+  owner: TypedContractMethod<[], [string], "view">;
+
+  paused: TypedContractMethod<[], [boolean], "view">;
+
+  prepareBatchPublicInputs: TypedContractMethod<
+    [_batch: BatchStruct, _accumulator: BytesLike],
+    [string],
+    "view"
+  >;
+
+  proxiableUUID: TypedContractMethod<[], [string], "view">;
+
+  publish: TypedContractMethod<
+    [_proof: BytesLike, _batch: BatchStruct],
+    [void],
+    "nonpayable"
+  >;
+
+  recursiveKeyHash: TypedContractMethod<[], [string], "view">;
+
+  relay: TypedContractMethod<[arg0: BytesLike], [string], "view">;
+
+  renounceOwnership: TypedContractMethod<[], [void], "nonpayable">;
+
+  simulatePublish: TypedContractMethod<
+    [_batch: BatchStruct],
+    [void],
+    "nonpayable"
+  >;
+
+  swapRouter: TypedContractMethod<[], [string], "view">;
+
+  token: TypedContractMethod<[], [string], "view">;
+
+  transferOwnership: TypedContractMethod<
+    [newOwner: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  txKeyHash: TypedContractMethod<[], [string], "view">;
+
+  txWrapperKeyHash: TypedContractMethod<[], [string], "view">;
+
+  updateCircuits: TypedContractMethod<
+    [_circuits: BytesLike[]],
+    [void],
+    "nonpayable"
+  >;
+
+  upgradeToAndCall: TypedContractMethod<
+    [newImplementation: AddressLike, data: BytesLike],
+    [void],
+    "payable"
+  >;
+
+  utxoPrevRoots: TypedContractMethod<[arg0: BytesLike], [string], "view">;
+
+  validRoots: TypedContractMethod<[arg0: BigNumberish], [string], "view">;
+
+  verifier: TypedContractMethod<[], [string], "view">;
+
+  verifyProof: TypedContractMethod<
+    [_proof: BytesLike, _batch: BatchStruct, _accumulator: BytesLike],
+    [boolean],
+    "view"
+  >;
+
+  xft: TypedContractMethod<[], [string], "view">;
+
+  xftPool: TypedContractMethod<[], [string], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "MAX_ITEMS"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "MAX_UTXOS"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "STATE_DEPTH"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "UPGRADE_INTERFACE_VERSION"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "_accumulatePublicInputs"
+  ): TypedContractMethod<
+    [_previousAccumulator: BytesLike, _publicInputsHash: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "_getSignatureHash"
+  ): TypedContractMethod<[_transaction: TransactionStruct], [string], "view">;
+  getFunction(
+    nameOrSignature: "batchNumber"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "broadcastAddress"
+  ): TypedContractMethod<[_address: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "broadcastTransaction"
+  ): TypedContractMethod<
+    [_tx: TransactionWithProofStruct, _recipient: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "burnPercentageSwap"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "changeBurnPercentage"
+  ): TypedContractMethod<[_percentage: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "changeCap"
+  ): TypedContractMethod<[_cap: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "changePools"
+  ): TypedContractMethod<[_addrs: AddressLike[]], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "dailyCap"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "dailyMint"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "ecRecover"
+  ): TypedContractMethod<
+    [_hash: BytesLike, _signature: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "eip712Domain"
+  ): TypedContractMethod<
+    [],
+    [
+      [string, string, string, bigint, string, string, bigint[]] & {
+        fields: string;
+        name: string;
+        version: string;
+        chainId: bigint;
+        verifyingContract: string;
+        salt: string;
+        extensions: bigint[];
+      }
+    ],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "emergencyPause"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "emergencyUnpause"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "fee"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getSpentNullifiers"
+  ): TypedContractMethod<[_nullifierHashes: BytesLike[]], [boolean[]], "view">;
+  getFunction(
+    nameOrSignature: "getValidRootAtIndex"
+  ): TypedContractMethod<[_index: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "getValidRoots"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "getValidRootsPaginated"
+  ): TypedContractMethod<
+    [_start: BigNumberish, _end: BigNumberish],
+    [string[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "hashCircuitInputsForTx"
+  ): TypedContractMethod<
+    [_tx: TransactionStruct, _signatureHash: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "hashCircuitInputsForTxWithoutDeposit"
+  ): TypedContractMethod<[_tx: TransactionStruct], [string], "view">;
+  getFunction(
+    nameOrSignature: "hashContractOnlyInputsForTx"
+  ): TypedContractMethod<
+    [_tx: TransactionStruct, _signatureHash: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "hashContractOnlyInputsForTxWithoutDeposit"
+  ): TypedContractMethod<[_tx: TransactionStruct], [string], "view">;
+  getFunction(
+    nameOrSignature: "hashTypedDataV4"
+  ): TypedContractMethod<[_deposit: DepositStruct], [string], "view">;
+  getFunction(
+    nameOrSignature: "histRoot"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "initialize"
+  ): TypedContractMethod<
+    [
+      _verifier: AddressLike,
+      _token: AddressLike,
+      _txKeyHash: BytesLike,
+      _txWrapperKeyHash: BytesLike,
+      _recursiveKeyHash: BytesLike,
+      _xftPool: AddressLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "isSpent"
+  ): TypedContractMethod<[_nullifierHash: BytesLike], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "lastCapReset"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "merkleRoot"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "nullifierHashes"
+  ): TypedContractMethod<[arg0: BytesLike], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "oracle"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "owner"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "paused"
+  ): TypedContractMethod<[], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "prepareBatchPublicInputs"
+  ): TypedContractMethod<
+    [_batch: BatchStruct, _accumulator: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "proxiableUUID"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "publish"
+  ): TypedContractMethod<
+    [_proof: BytesLike, _batch: BatchStruct],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "recursiveKeyHash"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "relay"
+  ): TypedContractMethod<[arg0: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "renounceOwnership"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "simulatePublish"
+  ): TypedContractMethod<[_batch: BatchStruct], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "swapRouter"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "token"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "transferOwnership"
+  ): TypedContractMethod<[newOwner: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "txKeyHash"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "txWrapperKeyHash"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "updateCircuits"
+  ): TypedContractMethod<[_circuits: BytesLike[]], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "upgradeToAndCall"
+  ): TypedContractMethod<
+    [newImplementation: AddressLike, data: BytesLike],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "utxoPrevRoots"
+  ): TypedContractMethod<[arg0: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "validRoots"
+  ): TypedContractMethod<[arg0: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "verifier"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "verifyProof"
+  ): TypedContractMethod<
+    [_proof: BytesLike, _batch: BatchStruct, _accumulator: BytesLike],
+    [boolean],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "xft"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "xftPool"
+  ): TypedContractMethod<[], [string], "view">;
+
+  getEvent(
+    key: "BatchPublish"
+  ): TypedContractEvent<
+    BatchPublishEvent.InputTuple,
+    BatchPublishEvent.OutputTuple,
+    BatchPublishEvent.OutputObject
+  >;
+  getEvent(
+    key: "BroadcastAddress"
+  ): TypedContractEvent<
+    BroadcastAddressEvent.InputTuple,
+    BroadcastAddressEvent.OutputTuple,
+    BroadcastAddressEvent.OutputObject
+  >;
+  getEvent(
+    key: "BurnPercentageChanged"
+  ): TypedContractEvent<
+    BurnPercentageChangedEvent.InputTuple,
+    BurnPercentageChangedEvent.OutputTuple,
+    BurnPercentageChangedEvent.OutputObject
+  >;
+  getEvent(
+    key: "DailyCapChanged"
+  ): TypedContractEvent<
+    DailyCapChangedEvent.InputTuple,
+    DailyCapChangedEvent.OutputTuple,
+    DailyCapChangedEvent.OutputObject
+  >;
+  getEvent(
+    key: "EIP712DomainChanged"
+  ): TypedContractEvent<
+    EIP712DomainChangedEvent.InputTuple,
+    EIP712DomainChangedEvent.OutputTuple,
+    EIP712DomainChangedEvent.OutputObject
+  >;
+  getEvent(
+    key: "EncryptedUTXOBroadcast"
+  ): TypedContractEvent<
+    EncryptedUTXOBroadcastEvent.InputTuple,
+    EncryptedUTXOBroadcastEvent.OutputTuple,
+    EncryptedUTXOBroadcastEvent.OutputObject
+  >;
+  getEvent(
+    key: "Initialized"
+  ): TypedContractEvent<
+    InitializedEvent.InputTuple,
+    InitializedEvent.OutputTuple,
+    InitializedEvent.OutputObject
+  >;
+  getEvent(
+    key: "OwnershipTransferred"
+  ): TypedContractEvent<
+    OwnershipTransferredEvent.InputTuple,
+    OwnershipTransferredEvent.OutputTuple,
+    OwnershipTransferredEvent.OutputObject
+  >;
+  getEvent(
+    key: "Paused"
+  ): TypedContractEvent<
+    PausedEvent.InputTuple,
+    PausedEvent.OutputTuple,
+    PausedEvent.OutputObject
+  >;
+  getEvent(
+    key: "TransactionBroadcast"
+  ): TypedContractEvent<
+    TransactionBroadcastEvent.InputTuple,
+    TransactionBroadcastEvent.OutputTuple,
+    TransactionBroadcastEvent.OutputObject
+  >;
+  getEvent(
+    key: "TransactionPublish"
+  ): TypedContractEvent<
+    TransactionPublishEvent.InputTuple,
+    TransactionPublishEvent.OutputTuple,
+    TransactionPublishEvent.OutputObject
+  >;
+  getEvent(
+    key: "Unpaused"
+  ): TypedContractEvent<
+    UnpausedEvent.InputTuple,
+    UnpausedEvent.OutputTuple,
+    UnpausedEvent.OutputObject
+  >;
+  getEvent(
+    key: "Upgraded"
+  ): TypedContractEvent<
+    UpgradedEvent.InputTuple,
+    UpgradedEvent.OutputTuple,
+    UpgradedEvent.OutputObject
+  >;
+
+  filters: {
+    "BatchPublish(uint256,bytes32,bytes32,bytes32,bytes32[20])": TypedContractEvent<
+      BatchPublishEvent.InputTuple,
+      BatchPublishEvent.OutputTuple,
+      BatchPublishEvent.OutputObject
+    >;
+    BatchPublish: TypedContractEvent<
+      BatchPublishEvent.InputTuple,
+      BatchPublishEvent.OutputTuple,
+      BatchPublishEvent.OutputObject
+    >;
+
+    "BroadcastAddress(bytes32,string)": TypedContractEvent<
+      BroadcastAddressEvent.InputTuple,
+      BroadcastAddressEvent.OutputTuple,
+      BroadcastAddressEvent.OutputObject
+    >;
+    BroadcastAddress: TypedContractEvent<
+      BroadcastAddressEvent.InputTuple,
+      BroadcastAddressEvent.OutputTuple,
+      BroadcastAddressEvent.OutputObject
+    >;
+
+    "BurnPercentageChanged(uint256,uint256)": TypedContractEvent<
+      BurnPercentageChangedEvent.InputTuple,
+      BurnPercentageChangedEvent.OutputTuple,
+      BurnPercentageChangedEvent.OutputObject
+    >;
+    BurnPercentageChanged: TypedContractEvent<
+      BurnPercentageChangedEvent.InputTuple,
+      BurnPercentageChangedEvent.OutputTuple,
+      BurnPercentageChangedEvent.OutputObject
+    >;
+
+    "DailyCapChanged(uint256,uint256)": TypedContractEvent<
+      DailyCapChangedEvent.InputTuple,
+      DailyCapChangedEvent.OutputTuple,
+      DailyCapChangedEvent.OutputObject
+    >;
+    DailyCapChanged: TypedContractEvent<
+      DailyCapChangedEvent.InputTuple,
+      DailyCapChangedEvent.OutputTuple,
+      DailyCapChangedEvent.OutputObject
+    >;
+
+    "EIP712DomainChanged()": TypedContractEvent<
+      EIP712DomainChangedEvent.InputTuple,
+      EIP712DomainChangedEvent.OutputTuple,
+      EIP712DomainChangedEvent.OutputObject
+    >;
+    EIP712DomainChanged: TypedContractEvent<
+      EIP712DomainChangedEvent.InputTuple,
+      EIP712DomainChangedEvent.OutputTuple,
+      EIP712DomainChangedEvent.OutputObject
+    >;
+
+    "EncryptedUTXOBroadcast(bytes32,bytes32,tuple)": TypedContractEvent<
+      EncryptedUTXOBroadcastEvent.InputTuple,
+      EncryptedUTXOBroadcastEvent.OutputTuple,
+      EncryptedUTXOBroadcastEvent.OutputObject
+    >;
+    EncryptedUTXOBroadcast: TypedContractEvent<
+      EncryptedUTXOBroadcastEvent.InputTuple,
+      EncryptedUTXOBroadcastEvent.OutputTuple,
+      EncryptedUTXOBroadcastEvent.OutputObject
+    >;
+
+    "Initialized(uint64)": TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+    Initialized: TypedContractEvent<
+      InitializedEvent.InputTuple,
+      InitializedEvent.OutputTuple,
+      InitializedEvent.OutputObject
+    >;
+
+    "OwnershipTransferred(address,address)": TypedContractEvent<
+      OwnershipTransferredEvent.InputTuple,
+      OwnershipTransferredEvent.OutputTuple,
+      OwnershipTransferredEvent.OutputObject
+    >;
+    OwnershipTransferred: TypedContractEvent<
+      OwnershipTransferredEvent.InputTuple,
+      OwnershipTransferredEvent.OutputTuple,
+      OwnershipTransferredEvent.OutputObject
+    >;
+
+    "Paused(address)": TypedContractEvent<
+      PausedEvent.InputTuple,
+      PausedEvent.OutputTuple,
+      PausedEvent.OutputObject
+    >;
+    Paused: TypedContractEvent<
+      PausedEvent.InputTuple,
+      PausedEvent.OutputTuple,
+      PausedEvent.OutputObject
+    >;
+
+    "TransactionBroadcast(tuple,bytes32,bytes32)": TypedContractEvent<
+      TransactionBroadcastEvent.InputTuple,
+      TransactionBroadcastEvent.OutputTuple,
+      TransactionBroadcastEvent.OutputObject
+    >;
+    TransactionBroadcast: TypedContractEvent<
+      TransactionBroadcastEvent.InputTuple,
+      TransactionBroadcastEvent.OutputTuple,
+      TransactionBroadcastEvent.OutputObject
+    >;
+
+    "TransactionPublish(tuple,bytes32,bytes32)": TypedContractEvent<
+      TransactionPublishEvent.InputTuple,
+      TransactionPublishEvent.OutputTuple,
+      TransactionPublishEvent.OutputObject
+    >;
+    TransactionPublish: TypedContractEvent<
+      TransactionPublishEvent.InputTuple,
+      TransactionPublishEvent.OutputTuple,
+      TransactionPublishEvent.OutputObject
+    >;
+
+    "Unpaused(address)": TypedContractEvent<
+      UnpausedEvent.InputTuple,
+      UnpausedEvent.OutputTuple,
+      UnpausedEvent.OutputObject
+    >;
+    Unpaused: TypedContractEvent<
+      UnpausedEvent.InputTuple,
+      UnpausedEvent.OutputTuple,
+      UnpausedEvent.OutputObject
+    >;
+
+    "Upgraded(address)": TypedContractEvent<
+      UpgradedEvent.InputTuple,
+      UpgradedEvent.OutputTuple,
+      UpgradedEvent.OutputObject
+    >;
+    Upgraded: TypedContractEvent<
+      UpgradedEvent.InputTuple,
+      UpgradedEvent.OutputTuple,
+      UpgradedEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/contracts/state.sol/index.ts b/momiji-helpers/utils/typechain-types/contracts/state.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c20849fbd3178783d9c6e795d1ec5ad8ae9155b5
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/contracts/state.sol/index.ts
@@ -0,0 +1,8 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { IMomiji } from "./IMomiji";
+export type { IOracle } from "./IOracle";
+export type { IVerifier } from "./IVerifier";
+export type { IWETH9 } from "./IWETH9";
+export type { Momiji } from "./Momiji";
diff --git a/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/index.ts b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ba4b10744625eda63009597ce1571a4fd270ea92
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as src from "./src";
diff --git a/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/index.ts b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..26688d8edfbdda9dcad754d715eaf0337d4bc32a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as v08 from "./v0.8";
diff --git a/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/index.ts b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1d3444d5be0d1ab81b293f9a6a1bad64af59bfcc
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as interfaces from "./interfaces";
diff --git a/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface__factory.ts b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ebb3dc3853be9c2136f548f0a489cabb80d06cb1
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface__factory.ts
@@ -0,0 +1,156 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  AggregatorInterface,
+  AggregatorInterfaceInterface,
+} from "../../../../../../@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "int256",
+        name: "current",
+        type: "int256",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+    ],
+    name: "AnswerUpdated",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "startedBy",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+    ],
+    name: "NewRound",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+    ],
+    name: "getAnswer",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+    ],
+    name: "getTimestamp",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestAnswer",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestRound",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestTimestamp",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class AggregatorInterface__factory {
+  static readonly abi = _abi;
+  static createInterface(): AggregatorInterfaceInterface {
+    return new Interface(_abi) as AggregatorInterfaceInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): AggregatorInterface {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as AggregatorInterface;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface__factory.ts b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1aef50cf46cbca07f3ce3dc6a1fbfca9354b5eb4
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface__factory.ts
@@ -0,0 +1,267 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  AggregatorV2V3Interface,
+  AggregatorV2V3InterfaceInterface,
+} from "../../../../../../@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "int256",
+        name: "current",
+        type: "int256",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+    ],
+    name: "AnswerUpdated",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "startedBy",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+    ],
+    name: "NewRound",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "decimals",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "",
+        type: "uint8",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "description",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+    ],
+    name: "getAnswer",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint80",
+        name: "_roundId",
+        type: "uint80",
+      },
+    ],
+    name: "getRoundData",
+    outputs: [
+      {
+        internalType: "uint80",
+        name: "roundId",
+        type: "uint80",
+      },
+      {
+        internalType: "int256",
+        name: "answer",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint80",
+        name: "answeredInRound",
+        type: "uint80",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+    ],
+    name: "getTimestamp",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestAnswer",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestRound",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestRoundData",
+    outputs: [
+      {
+        internalType: "uint80",
+        name: "roundId",
+        type: "uint80",
+      },
+      {
+        internalType: "int256",
+        name: "answer",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint80",
+        name: "answeredInRound",
+        type: "uint80",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestTimestamp",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "version",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class AggregatorV2V3Interface__factory {
+  static readonly abi = _abi;
+  static createInterface(): AggregatorV2V3InterfaceInterface {
+    return new Interface(_abi) as AggregatorV2V3InterfaceInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): AggregatorV2V3Interface {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as AggregatorV2V3Interface;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface__factory.ts b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..73a985df1b7fc027e6afa4ff826a1a519ef97640
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface__factory.ts
@@ -0,0 +1,140 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  AggregatorV3Interface,
+  AggregatorV3InterfaceInterface,
+} from "../../../../../../@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "decimals",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "",
+        type: "uint8",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "description",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint80",
+        name: "_roundId",
+        type: "uint80",
+      },
+    ],
+    name: "getRoundData",
+    outputs: [
+      {
+        internalType: "uint80",
+        name: "roundId",
+        type: "uint80",
+      },
+      {
+        internalType: "int256",
+        name: "answer",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint80",
+        name: "answeredInRound",
+        type: "uint80",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestRoundData",
+    outputs: [
+      {
+        internalType: "uint80",
+        name: "roundId",
+        type: "uint80",
+      },
+      {
+        internalType: "int256",
+        name: "answer",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint80",
+        name: "answeredInRound",
+        type: "uint80",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "version",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class AggregatorV3Interface__factory {
+  static readonly abi = _abi;
+  static createInterface(): AggregatorV3InterfaceInterface {
+    return new Interface(_abi) as AggregatorV3InterfaceInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): AggregatorV3Interface {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as AggregatorV3Interface;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/index.ts b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a31260107ccf3a9ca4b2b5736057d34d28840585
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@chainlink/contracts/src/v0.8/interfaces/index.ts
@@ -0,0 +1,6 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { AggregatorInterface__factory } from "./AggregatorInterface__factory";
+export { AggregatorV2V3Interface__factory } from "./AggregatorV2V3Interface__factory";
+export { AggregatorV3Interface__factory } from "./AggregatorV3Interface__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@chainlink/index.ts b/momiji-helpers/utils/typechain-types/factories/@chainlink/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6397da096aa8529bfddbfc8ea26e3e8abd180940
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@chainlink/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as contracts from "./contracts";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..55b539e63598a239b52a7e735d3d5bf0e9a65b41
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts
@@ -0,0 +1,122 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  OwnableUpgradeable,
+  OwnableUpgradeableInterface,
+} from "../../../../@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+    ],
+    name: "OwnableInvalidOwner",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "OwnableUnauthorizedAccount",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "previousOwner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "newOwner",
+        type: "address",
+      },
+    ],
+    name: "OwnershipTransferred",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "owner",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "renounceOwnership",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "newOwner",
+        type: "address",
+      },
+    ],
+    name: "transferOwnership",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class OwnableUpgradeable__factory {
+  static readonly abi = _abi;
+  static createInterface(): OwnableUpgradeableInterface {
+    return new Interface(_abi) as OwnableUpgradeableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): OwnableUpgradeable {
+    return new Contract(address, _abi, runner) as unknown as OwnableUpgradeable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bf4b29cc41f28c06b53e720e2f14fd27168937e7
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { OwnableUpgradeable__factory } from "./OwnableUpgradeable__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2b4c7e65169aecd1bdf6dce46ede4dc3ceecccbf
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.ts
@@ -0,0 +1,6 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as access from "./access";
+export * as proxy from "./proxy";
+export * as utils from "./utils";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..56778f88129ba89690654cf40ff0ab9cea867e35
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as utils from "./utils";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..132c5778849bfe314f32bc86a5b82ac258a130eb
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.ts
@@ -0,0 +1,48 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  Initializable,
+  InitializableInterface,
+} from "../../../../../@openzeppelin/contracts-upgradeable/proxy/utils/Initializable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+] as const;
+
+export class Initializable__factory {
+  static readonly abi = _abi;
+  static createInterface(): InitializableInterface {
+    return new Interface(_abi) as InitializableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): Initializable {
+    return new Contract(address, _abi, runner) as unknown as Initializable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..16b33b6062c75337fb777c3704475f00d15558fc
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.ts
@@ -0,0 +1,153 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  UUPSUpgradeable,
+  UUPSUpgradeableInterface,
+} from "../../../../../@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+    ],
+    name: "AddressEmptyCode",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "implementation",
+        type: "address",
+      },
+    ],
+    name: "ERC1967InvalidImplementation",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "ERC1967NonPayable",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "FailedInnerCall",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "UUPSUnauthorizedCallContext",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "slot",
+        type: "bytes32",
+      },
+    ],
+    name: "UUPSUnsupportedProxiableUUID",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "implementation",
+        type: "address",
+      },
+    ],
+    name: "Upgraded",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "UPGRADE_INTERFACE_VERSION",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "proxiableUUID",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "newImplementation",
+        type: "address",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "upgradeToAndCall",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+] as const;
+
+export class UUPSUpgradeable__factory {
+  static readonly abi = _abi;
+  static createInterface(): UUPSUpgradeableInterface {
+    return new Interface(_abi) as UUPSUpgradeableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): UUPSUpgradeable {
+    return new Contract(address, _abi, runner) as unknown as UUPSUpgradeable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a192d15de5f1f1c356394e4c1f44220244d47145
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { Initializable__factory } from "./Initializable__factory";
+export { UUPSUpgradeable__factory } from "./UUPSUpgradeable__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..60e8cbba669177ebfab9061b7c1728a4fea4695c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.ts
@@ -0,0 +1,48 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  ContextUpgradeable,
+  ContextUpgradeableInterface,
+} from "../../../../@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+] as const;
+
+export class ContextUpgradeable__factory {
+  static readonly abi = _abi;
+  static createInterface(): ContextUpgradeableInterface {
+    return new Interface(_abi) as ContextUpgradeableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): ContextUpgradeable {
+    return new Contract(address, _abi, runner) as unknown as ContextUpgradeable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f43afe92f140f558355d1fa46c0c81e8e23b8235
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable__factory.ts
@@ -0,0 +1,101 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  PausableUpgradeable,
+  PausableUpgradeableInterface,
+} from "../../../../@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "EnforcedPause",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "ExpectedPause",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "Paused",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "Unpaused",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "paused",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class PausableUpgradeable__factory {
+  static readonly abi = _abi;
+  static createInterface(): PausableUpgradeableInterface {
+    return new Interface(_abi) as PausableUpgradeableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): PausableUpgradeable {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as PausableUpgradeable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0c3d33e936290beda29a018cb41e92705c0de601
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable__factory.ts
@@ -0,0 +1,97 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  EIP712Upgradeable,
+  EIP712UpgradeableInterface,
+} from "../../../../../@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [],
+    name: "EIP712DomainChanged",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "eip712Domain",
+    outputs: [
+      {
+        internalType: "bytes1",
+        name: "fields",
+        type: "bytes1",
+      },
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "version",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "chainId",
+        type: "uint256",
+      },
+      {
+        internalType: "address",
+        name: "verifyingContract",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "salt",
+        type: "bytes32",
+      },
+      {
+        internalType: "uint256[]",
+        name: "extensions",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class EIP712Upgradeable__factory {
+  static readonly abi = _abi;
+  static createInterface(): EIP712UpgradeableInterface {
+    return new Interface(_abi) as EIP712UpgradeableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): EIP712Upgradeable {
+    return new Contract(address, _abi, runner) as unknown as EIP712Upgradeable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/cryptography/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/cryptography/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e99ad6af4cdfb180dc2349875d360def035cbe3f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/cryptography/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { EIP712Upgradeable__factory } from "./EIP712Upgradeable__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a5f71c9ffc14779cf5bbe7148e7e4b5a37981207
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.ts
@@ -0,0 +1,6 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as cryptography from "./cryptography";
+export { ContextUpgradeable__factory } from "./ContextUpgradeable__factory";
+export { PausableUpgradeable__factory } from "./PausableUpgradeable__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c01e1f524488396c1c0c3a47bd9d277a7bcac5aa
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts
@@ -0,0 +1,250 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  AccessControl,
+  AccessControlInterface,
+} from "../../../../@openzeppelin/contracts/access/AccessControl";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "AccessControlBadConfirmation",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "neededRole",
+        type: "bytes32",
+      },
+    ],
+    name: "AccessControlUnauthorizedAccount",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "previousAdminRole",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "newAdminRole",
+        type: "bytes32",
+      },
+    ],
+    name: "RoleAdminChanged",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+    ],
+    name: "RoleGranted",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+    ],
+    name: "RoleRevoked",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "DEFAULT_ADMIN_ROLE",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+    ],
+    name: "getRoleAdmin",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "grantRole",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "hasRole",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "callerConfirmation",
+        type: "address",
+      },
+    ],
+    name: "renounceRole",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "revokeRole",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes4",
+        name: "interfaceId",
+        type: "bytes4",
+      },
+    ],
+    name: "supportsInterface",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class AccessControl__factory {
+  static readonly abi = _abi;
+  static createInterface(): AccessControlInterface {
+    return new Interface(_abi) as AccessControlInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): AccessControl {
+    return new Contract(address, _abi, runner) as unknown as AccessControl;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d1e3523318624dfc8012aa4494a5746b60b6331a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts
@@ -0,0 +1,218 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IAccessControl,
+  IAccessControlInterface,
+} from "../../../../@openzeppelin/contracts/access/IAccessControl";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "AccessControlBadConfirmation",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "neededRole",
+        type: "bytes32",
+      },
+    ],
+    name: "AccessControlUnauthorizedAccount",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "previousAdminRole",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "newAdminRole",
+        type: "bytes32",
+      },
+    ],
+    name: "RoleAdminChanged",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+    ],
+    name: "RoleGranted",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+    ],
+    name: "RoleRevoked",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+    ],
+    name: "getRoleAdmin",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "grantRole",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "hasRole",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "callerConfirmation",
+        type: "address",
+      },
+    ],
+    name: "renounceRole",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "revokeRole",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IAccessControl__factory {
+  static readonly abi = _abi;
+  static createInterface(): IAccessControlInterface {
+    return new Interface(_abi) as IAccessControlInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IAccessControl {
+    return new Contract(address, _abi, runner) as unknown as IAccessControl;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/access/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/access/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b42435de5f81e6bd0ac4074d9fcca81a7a85c3c4
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/access/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { AccessControl__factory } from "./AccessControl__factory";
+export { IAccessControl__factory } from "./IAccessControl__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cacd2b7ef4c3afc8b1c9e7eea3e62a335505e9b9
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/index.ts
@@ -0,0 +1,8 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as access from "./access";
+export * as interfaces from "./interfaces";
+export * as proxy from "./proxy";
+export * as token from "./token";
+export * as utils from "./utils";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC5267__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC5267__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0054c0a108d1e08f7af688dddc6af11fc22d70c6
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC5267__factory.ts
@@ -0,0 +1,71 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC5267,
+  IERC5267Interface,
+} from "../../../../@openzeppelin/contracts/interfaces/IERC5267";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [],
+    name: "EIP712DomainChanged",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "eip712Domain",
+    outputs: [
+      {
+        internalType: "bytes1",
+        name: "fields",
+        type: "bytes1",
+      },
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "version",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "chainId",
+        type: "uint256",
+      },
+      {
+        internalType: "address",
+        name: "verifyingContract",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "salt",
+        type: "bytes32",
+      },
+      {
+        internalType: "uint256[]",
+        name: "extensions",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IERC5267__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC5267Interface {
+    return new Interface(_abi) as IERC5267Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IERC5267 {
+    return new Contract(address, _abi, runner) as unknown as IERC5267;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..360f9ed4d6a9c0299754c491a9f78c3f33ec15de
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.ts
@@ -0,0 +1,38 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC1822Proxiable,
+  IERC1822ProxiableInterface,
+} from "../../../../../@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "proxiableUUID",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IERC1822Proxiable__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC1822ProxiableInterface {
+    return new Interface(_abi) as IERC1822ProxiableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IERC1822Proxiable {
+    return new Contract(address, _abi, runner) as unknown as IERC1822Proxiable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ecca13398dad964b1ccf2bc08d4e2ff06814da82
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { IERC1822Proxiable__factory } from "./IERC1822Proxiable__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0413f8c17e8bf81fbf4819500245825f5067dca9
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts
@@ -0,0 +1,127 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC1155Errors,
+  IERC1155ErrorsInterface,
+} from "../../../../../@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "balance",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "needed",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "ERC1155InsufficientBalance",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "approver",
+        type: "address",
+      },
+    ],
+    name: "ERC1155InvalidApprover",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "idsLength",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "valuesLength",
+        type: "uint256",
+      },
+    ],
+    name: "ERC1155InvalidArrayLength",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "operator",
+        type: "address",
+      },
+    ],
+    name: "ERC1155InvalidOperator",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "receiver",
+        type: "address",
+      },
+    ],
+    name: "ERC1155InvalidReceiver",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+    ],
+    name: "ERC1155InvalidSender",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "operator",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+    ],
+    name: "ERC1155MissingApprovalForAll",
+    type: "error",
+  },
+] as const;
+
+export class IERC1155Errors__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC1155ErrorsInterface {
+    return new Interface(_abi) as IERC1155ErrorsInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IERC1155Errors {
+    return new Contract(address, _abi, runner) as unknown as IERC1155Errors;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..695f3f0f48102d21285cdc6b4158920842f9f935
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts
@@ -0,0 +1,111 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC20Errors,
+  IERC20ErrorsInterface,
+} from "../../../../../@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "allowance",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "needed",
+        type: "uint256",
+      },
+    ],
+    name: "ERC20InsufficientAllowance",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "balance",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "needed",
+        type: "uint256",
+      },
+    ],
+    name: "ERC20InsufficientBalance",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "approver",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidApprover",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "receiver",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidReceiver",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidSender",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidSpender",
+    type: "error",
+  },
+] as const;
+
+export class IERC20Errors__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC20ErrorsInterface {
+    return new Interface(_abi) as IERC20ErrorsInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IERC20Errors {
+    return new Contract(address, _abi, runner) as unknown as IERC20Errors;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8615d4ddd8f938a4d788ff0d37ae3c6837c6810a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts
@@ -0,0 +1,128 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC721Errors,
+  IERC721ErrorsInterface,
+} from "../../../../../@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "tokenId",
+        type: "uint256",
+      },
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+    ],
+    name: "ERC721IncorrectOwner",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "operator",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "ERC721InsufficientApproval",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "approver",
+        type: "address",
+      },
+    ],
+    name: "ERC721InvalidApprover",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "operator",
+        type: "address",
+      },
+    ],
+    name: "ERC721InvalidOperator",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+    ],
+    name: "ERC721InvalidOwner",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "receiver",
+        type: "address",
+      },
+    ],
+    name: "ERC721InvalidReceiver",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+    ],
+    name: "ERC721InvalidSender",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "ERC721NonexistentToken",
+    type: "error",
+  },
+] as const;
+
+export class IERC721Errors__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC721ErrorsInterface {
+    return new Interface(_abi) as IERC721ErrorsInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IERC721Errors {
+    return new Contract(address, _abi, runner) as unknown as IERC721Errors;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..571330ea39628b3e937acf6a9d878a1f3655f034
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts
@@ -0,0 +1,6 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { IERC1155Errors__factory } from "./IERC1155Errors__factory";
+export { IERC20Errors__factory } from "./IERC20Errors__factory";
+export { IERC721Errors__factory } from "./IERC721Errors__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5bb946c40c650cad1524e5c105a5fce0fc225a1f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts
@@ -0,0 +1,6 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as draftIerc1822Sol from "./draft-IERC1822.sol";
+export * as draftIerc6093Sol from "./draft-IERC6093.sol";
+export { IERC5267__factory } from "./IERC5267__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fc2c98cf489f793e4833f488e804626db1bf187d
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.ts
@@ -0,0 +1,150 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../common";
+import type {
+  ERC1967Utils,
+  ERC1967UtilsInterface,
+} from "../../../../../@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "admin",
+        type: "address",
+      },
+    ],
+    name: "ERC1967InvalidAdmin",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "beacon",
+        type: "address",
+      },
+    ],
+    name: "ERC1967InvalidBeacon",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "implementation",
+        type: "address",
+      },
+    ],
+    name: "ERC1967InvalidImplementation",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "ERC1967NonPayable",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "previousAdmin",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "address",
+        name: "newAdmin",
+        type: "address",
+      },
+    ],
+    name: "AdminChanged",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "beacon",
+        type: "address",
+      },
+    ],
+    name: "BeaconUpgraded",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "implementation",
+        type: "address",
+      },
+    ],
+    name: "Upgraded",
+    type: "event",
+  },
+] as const;
+
+const _bytecode =
+  "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fdfea264697066735822122001bf7f1fcb512de3186267fcfdc027182586a83c7f36f18aa5ffcfb5f2d5d14364736f6c63430008180033";
+
+type ERC1967UtilsConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: ERC1967UtilsConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class ERC1967Utils__factory extends ContractFactory {
+  constructor(...args: ERC1967UtilsConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      ERC1967Utils & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): ERC1967Utils__factory {
+    return super.connect(runner) as ERC1967Utils__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): ERC1967UtilsInterface {
+    return new Interface(_abi) as ERC1967UtilsInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): ERC1967Utils {
+    return new Contract(address, _abi, runner) as unknown as ERC1967Utils;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..97d6fb3674b51c46996520c6157100276772cf4a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { ERC1967Utils__factory } from "./ERC1967Utils__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..184893de771dbbce3001036da93cea297eb2315a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.ts
@@ -0,0 +1,35 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IBeacon,
+  IBeaconInterface,
+} from "../../../../../@openzeppelin/contracts/proxy/beacon/IBeacon";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "implementation",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IBeacon__factory {
+  static readonly abi = _abi;
+  static createInterface(): IBeaconInterface {
+    return new Interface(_abi) as IBeaconInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IBeacon {
+    return new Contract(address, _abi, runner) as unknown as IBeacon;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4a9d628973a972680814ba4faaffc41fa5eb54b5
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { IBeacon__factory } from "./IBeacon__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ed9d8127b710494752069d023328e53f47919081
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/proxy/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as erc1967 from "./ERC1967";
+export * as beacon from "./beacon";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5d8981a68d275dc3387f161bd6e8043c420227fc
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts
@@ -0,0 +1,330 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  ERC20,
+  ERC20Interface,
+} from "../../../../../@openzeppelin/contracts/token/ERC20/ERC20";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "allowance",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "needed",
+        type: "uint256",
+      },
+    ],
+    name: "ERC20InsufficientAllowance",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "balance",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "needed",
+        type: "uint256",
+      },
+    ],
+    name: "ERC20InsufficientBalance",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "approver",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidApprover",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "receiver",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidReceiver",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidSender",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidSpender",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "allowance",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "decimals",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "",
+        type: "uint8",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "name",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "symbol",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "totalSupply",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "transfer",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class ERC20__factory {
+  static readonly abi = _abi;
+  static createInterface(): ERC20Interface {
+    return new Interface(_abi) as ERC20Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): ERC20 {
+    return new Contract(address, _abi, runner) as unknown as ERC20;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6768448dccddc764129bee19ee270683d8a50fb4
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts
@@ -0,0 +1,205 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC20,
+  IERC20Interface,
+} from "../../../../../@openzeppelin/contracts/token/ERC20/IERC20";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "allowance",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "totalSupply",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "transfer",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IERC20__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC20Interface {
+    return new Interface(_abi) as IERC20Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IERC20 {
+    return new Contract(address, _abi, runner) as unknown as IERC20;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..80abf969610fb599d7048586fd07a96af7c79e03
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts
@@ -0,0 +1,247 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC20Metadata,
+  IERC20MetadataInterface,
+} from "../../../../../../@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "allowance",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "decimals",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "",
+        type: "uint8",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "name",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "symbol",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "totalSupply",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "transfer",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IERC20Metadata__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC20MetadataInterface {
+    return new Interface(_abi) as IERC20MetadataInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IERC20Metadata {
+    return new Contract(address, _abi, runner) as unknown as IERC20Metadata;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b9477f85452f5abec588b8d5474107a77e9280d1
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { IERC20Metadata__factory } from "./IERC20Metadata__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3523dc7a6eb584664019135b476378efea7c3c73
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts
@@ -0,0 +1,6 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as extensions from "./extensions";
+export { ERC20__factory } from "./ERC20__factory";
+export { IERC20__factory } from "./IERC20__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..da1e061ebc834c040b6386a70b939e186ba17149
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/token/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as erc20 from "./ERC20";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bff17aab6ce8704d716ec2b8b6755da06ef5602a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.ts
@@ -0,0 +1,91 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../common";
+import type {
+  Address,
+  AddressInterface,
+} from "../../../../@openzeppelin/contracts/utils/Address";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+    ],
+    name: "AddressEmptyCode",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "AddressInsufficientBalance",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "FailedInnerCall",
+    type: "error",
+  },
+] as const;
+
+const _bytecode =
+  "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fdfea26469706673582212200840f9e1f9824f88730473f7e361aa2384d25b3fab80de78909186debd5c3d7764736f6c63430008180033";
+
+type AddressConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: AddressConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class Address__factory extends ContractFactory {
+  constructor(...args: AddressConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      Address & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): Address__factory {
+    return super.connect(runner) as Address__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): AddressInterface {
+    return new Interface(_abi) as AddressInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): Address {
+    return new Contract(address, _abi, runner) as unknown as Address;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b385bbed8d027acaaaea532bca3f90997b8e3ca9
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.ts
@@ -0,0 +1,80 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../common";
+import type {
+  Strings,
+  StringsInterface,
+} from "../../../../@openzeppelin/contracts/utils/Strings";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "length",
+        type: "uint256",
+      },
+    ],
+    name: "StringsInsufficientHexLength",
+    type: "error",
+  },
+] as const;
+
+const _bytecode =
+  "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fdfea2646970667358221220d703406b548860af6cd304b2e6d0aaf42443297d1e78954b66cf7b1b5f7281a764736f6c63430008180033";
+
+type StringsConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: StringsConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class Strings__factory extends ContractFactory {
+  constructor(...args: StringsConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      Strings & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): Strings__factory {
+    return super.connect(runner) as Strings__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): StringsInterface {
+    return new Interface(_abi) as StringsInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): Strings {
+    return new Contract(address, _abi, runner) as unknown as Strings;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9ff7e7272cb4fc58575f12e7c63b4be76b71d5a5
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.ts
@@ -0,0 +1,91 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../common";
+import type {
+  ECDSA,
+  ECDSAInterface,
+} from "../../../../../@openzeppelin/contracts/utils/cryptography/ECDSA";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "ECDSAInvalidSignature",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "length",
+        type: "uint256",
+      },
+    ],
+    name: "ECDSAInvalidSignatureLength",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    name: "ECDSAInvalidSignatureS",
+    type: "error",
+  },
+] as const;
+
+const _bytecode =
+  "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fdfea26469706673582212209fa0a6305e1235bbe34a2457d0fb6ff19f5e51b93c070b1c33cccb3afe0f0dfc64736f6c63430008180033";
+
+type ECDSAConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: ECDSAConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class ECDSA__factory extends ContractFactory {
+  constructor(...args: ECDSAConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      ECDSA & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): ECDSA__factory {
+    return super.connect(runner) as ECDSA__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): ECDSAInterface {
+    return new Interface(_abi) as ECDSAInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): ECDSA {
+    return new Contract(address, _abi, runner) as unknown as ECDSA;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cac1a8376e43e0084d869bcc96e91083470c1fbd
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { ECDSA__factory } from "./ECDSA__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..64809780edae58adeb5b2da1f85952a787572762
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/index.ts
@@ -0,0 +1,8 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as cryptography from "./cryptography";
+export * as introspection from "./introspection";
+export * as math from "./math";
+export { Address__factory } from "./Address__factory";
+export { Strings__factory } from "./Strings__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/introspection/ERC165__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/introspection/ERC165__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8388afba2eac40ad837dba7518472bfd73967a4f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/introspection/ERC165__factory.ts
@@ -0,0 +1,41 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  ERC165,
+  ERC165Interface,
+} from "../../../../../@openzeppelin/contracts/utils/introspection/ERC165";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "bytes4",
+        name: "interfaceId",
+        type: "bytes4",
+      },
+    ],
+    name: "supportsInterface",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class ERC165__factory {
+  static readonly abi = _abi;
+  static createInterface(): ERC165Interface {
+    return new Interface(_abi) as ERC165Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): ERC165 {
+    return new Contract(address, _abi, runner) as unknown as ERC165;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/introspection/IERC165__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/introspection/IERC165__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5cc03947d70f86c3ec0a5b183a9217dad86ad848
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/introspection/IERC165__factory.ts
@@ -0,0 +1,41 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC165,
+  IERC165Interface,
+} from "../../../../../@openzeppelin/contracts/utils/introspection/IERC165";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "bytes4",
+        name: "interfaceId",
+        type: "bytes4",
+      },
+    ],
+    name: "supportsInterface",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IERC165__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC165Interface {
+    return new Interface(_abi) as IERC165Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IERC165 {
+    return new Contract(address, _abi, runner) as unknown as IERC165;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/introspection/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/introspection/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8523e0a81ae14b4266b1351b0a09b20e3806ba54
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/introspection/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { ERC165__factory } from "./ERC165__factory";
+export { IERC165__factory } from "./IERC165__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/math/Math__factory.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/math/Math__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..33ce2d183762f09bc59bda7cf150d237f0a56c4a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/math/Math__factory.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../common";
+import type {
+  Math,
+  MathInterface,
+} from "../../../../../@openzeppelin/contracts/utils/math/Math";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "MathOverflowedMulDiv",
+    type: "error",
+  },
+] as const;
+
+const _bytecode =
+  "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fdfea26469706673582212209ba02ff6e406b66a96eabb102e6e455d28b9fb285a843e4967b0ded7f297bcad64736f6c63430008180033";
+
+type MathConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: MathConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class Math__factory extends ContractFactory {
+  constructor(...args: MathConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      Math & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): Math__factory {
+    return super.connect(runner) as Math__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): MathInterface {
+    return new Interface(_abi) as MathInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): Math {
+    return new Contract(address, _abi, runner) as unknown as Math;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/math/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/math/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a249c7486df4011a267fc46ec2e0682d35383eff
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/contracts/utils/math/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { Math__factory } from "./Math__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@openzeppelin/index.ts b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6923c15a66cce3a92fe9ae5f5bdc0dcfa21dd97a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@openzeppelin/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as contracts from "./contracts";
+export * as contractsUpgradeable from "./contracts-upgradeable";
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/index.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..546517dcdc1e50b9c5d3a8a856721eab15b17dcf
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as v3Core from "./v3-core";
+export * as v3Periphery from "./v3-periphery";
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/index.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1d3444d5be0d1ab81b293f9a6a1bad64af59bfcc
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as interfaces from "./interfaces";
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback__factory.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2213b0bc331d947d6b7c9d284b479d0701d5e394
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback__factory.ts
@@ -0,0 +1,52 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IUniswapV3SwapCallback,
+  IUniswapV3SwapCallbackInterface,
+} from "../../../../../../@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "amount0Delta",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "amount1Delta",
+        type: "int256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "uniswapV3SwapCallback",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IUniswapV3SwapCallback__factory {
+  static readonly abi = _abi;
+  static createInterface(): IUniswapV3SwapCallbackInterface {
+    return new Interface(_abi) as IUniswapV3SwapCallbackInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IUniswapV3SwapCallback {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as IUniswapV3SwapCallback;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/callback/index.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/callback/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0c401bd07c295aaaff159ddba6bf2fbf394f468b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/callback/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { IUniswapV3SwapCallback__factory } from "./IUniswapV3SwapCallback__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/index.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d5b9085e82c76a20d82f4b74713ec3b3d38e1c54
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as callback from "./callback";
+export * as pool from "./pool";
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions__factory.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..80def3cfdb5c073225f7b272084cee8c137fea58
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions__factory.ts
@@ -0,0 +1,249 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IUniswapV3PoolActions,
+  IUniswapV3PoolActionsInterface,
+} from "../../../../../../@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        internalType: "uint128",
+        name: "amount",
+        type: "uint128",
+      },
+    ],
+    name: "burn",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        internalType: "uint128",
+        name: "amount0Requested",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "amount1Requested",
+        type: "uint128",
+      },
+    ],
+    name: "collect",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "amount0",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "amount1",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "flash",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint16",
+        name: "observationCardinalityNext",
+        type: "uint16",
+      },
+    ],
+    name: "increaseObservationCardinalityNext",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint160",
+        name: "sqrtPriceX96",
+        type: "uint160",
+      },
+    ],
+    name: "initialize",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        internalType: "uint128",
+        name: "amount",
+        type: "uint128",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "mint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "bool",
+        name: "zeroForOne",
+        type: "bool",
+      },
+      {
+        internalType: "int256",
+        name: "amountSpecified",
+        type: "int256",
+      },
+      {
+        internalType: "uint160",
+        name: "sqrtPriceLimitX96",
+        type: "uint160",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "swap",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "amount0",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "amount1",
+        type: "int256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IUniswapV3PoolActions__factory {
+  static readonly abi = _abi;
+  static createInterface(): IUniswapV3PoolActionsInterface {
+    return new Interface(_abi) as IUniswapV3PoolActionsInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IUniswapV3PoolActions {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as IUniswapV3PoolActions;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState__factory.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..640fe94221d9a4f991a604ea8df1aba1ed05d3ae
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState__factory.ts
@@ -0,0 +1,87 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IUniswapV3PoolDerivedState,
+  IUniswapV3PoolDerivedStateInterface,
+} from "../../../../../../@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "uint32[]",
+        name: "secondsAgos",
+        type: "uint32[]",
+      },
+    ],
+    name: "observe",
+    outputs: [
+      {
+        internalType: "int56[]",
+        name: "tickCumulatives",
+        type: "int56[]",
+      },
+      {
+        internalType: "uint160[]",
+        name: "secondsPerLiquidityCumulativeX128s",
+        type: "uint160[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+    ],
+    name: "snapshotCumulativesInside",
+    outputs: [
+      {
+        internalType: "int56",
+        name: "tickCumulativeInside",
+        type: "int56",
+      },
+      {
+        internalType: "uint160",
+        name: "secondsPerLiquidityInsideX128",
+        type: "uint160",
+      },
+      {
+        internalType: "uint32",
+        name: "secondsInside",
+        type: "uint32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IUniswapV3PoolDerivedState__factory {
+  static readonly abi = _abi;
+  static createInterface(): IUniswapV3PoolDerivedStateInterface {
+    return new Interface(_abi) as IUniswapV3PoolDerivedStateInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IUniswapV3PoolDerivedState {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as IUniswapV3PoolDerivedState;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents__factory.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f8fae4a323c951ef0dcd53e3d4c16c0a2bbe7bce
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents__factory.ts
@@ -0,0 +1,356 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IUniswapV3PoolEvents,
+  IUniswapV3PoolEventsInterface,
+} from "../../../../../../@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount",
+        type: "uint128",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+    ],
+    name: "Burn",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount0",
+        type: "uint128",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount1",
+        type: "uint128",
+      },
+    ],
+    name: "Collect",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount0",
+        type: "uint128",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount1",
+        type: "uint128",
+      },
+    ],
+    name: "CollectProtocol",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "paid0",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "paid1",
+        type: "uint256",
+      },
+    ],
+    name: "Flash",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint16",
+        name: "observationCardinalityNextOld",
+        type: "uint16",
+      },
+      {
+        indexed: false,
+        internalType: "uint16",
+        name: "observationCardinalityNextNew",
+        type: "uint16",
+      },
+    ],
+    name: "IncreaseObservationCardinalityNext",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint160",
+        name: "sqrtPriceX96",
+        type: "uint160",
+      },
+      {
+        indexed: false,
+        internalType: "int24",
+        name: "tick",
+        type: "int24",
+      },
+    ],
+    name: "Initialize",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount",
+        type: "uint128",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+    ],
+    name: "Mint",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint8",
+        name: "feeProtocol0Old",
+        type: "uint8",
+      },
+      {
+        indexed: false,
+        internalType: "uint8",
+        name: "feeProtocol1Old",
+        type: "uint8",
+      },
+      {
+        indexed: false,
+        internalType: "uint8",
+        name: "feeProtocol0New",
+        type: "uint8",
+      },
+      {
+        indexed: false,
+        internalType: "uint8",
+        name: "feeProtocol1New",
+        type: "uint8",
+      },
+    ],
+    name: "SetFeeProtocol",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "amount0",
+        type: "int256",
+      },
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "amount1",
+        type: "int256",
+      },
+      {
+        indexed: false,
+        internalType: "uint160",
+        name: "sqrtPriceX96",
+        type: "uint160",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "liquidity",
+        type: "uint128",
+      },
+      {
+        indexed: false,
+        internalType: "int24",
+        name: "tick",
+        type: "int24",
+      },
+    ],
+    name: "Swap",
+    type: "event",
+  },
+] as const;
+
+export class IUniswapV3PoolEvents__factory {
+  static readonly abi = _abi;
+  static createInterface(): IUniswapV3PoolEventsInterface {
+    return new Interface(_abi) as IUniswapV3PoolEventsInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IUniswapV3PoolEvents {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as IUniswapV3PoolEvents;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables__factory.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5e2e49df1342f0d922fabffb00b877bf3be4e050
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables__factory.ts
@@ -0,0 +1,107 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IUniswapV3PoolImmutables,
+  IUniswapV3PoolImmutablesInterface,
+} from "../../../../../../@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "factory",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "fee",
+    outputs: [
+      {
+        internalType: "uint24",
+        name: "",
+        type: "uint24",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "maxLiquidityPerTick",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "tickSpacing",
+    outputs: [
+      {
+        internalType: "int24",
+        name: "",
+        type: "int24",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "token0",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "token1",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IUniswapV3PoolImmutables__factory {
+  static readonly abi = _abi;
+  static createInterface(): IUniswapV3PoolImmutablesInterface {
+    return new Interface(_abi) as IUniswapV3PoolImmutablesInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IUniswapV3PoolImmutables {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as IUniswapV3PoolImmutables;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions__factory.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..95edf9f487fc60391a397b22a3036942e7ddfa16
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions__factory.ts
@@ -0,0 +1,81 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IUniswapV3PoolOwnerActions,
+  IUniswapV3PoolOwnerActionsInterface,
+} from "../../../../../../@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "uint128",
+        name: "amount0Requested",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "amount1Requested",
+        type: "uint128",
+      },
+    ],
+    name: "collectProtocol",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "amount0",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "amount1",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint8",
+        name: "feeProtocol0",
+        type: "uint8",
+      },
+      {
+        internalType: "uint8",
+        name: "feeProtocol1",
+        type: "uint8",
+      },
+    ],
+    name: "setFeeProtocol",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IUniswapV3PoolOwnerActions__factory {
+  static readonly abi = _abi;
+  static createInterface(): IUniswapV3PoolOwnerActionsInterface {
+    return new Interface(_abi) as IUniswapV3PoolOwnerActionsInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IUniswapV3PoolOwnerActions {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as IUniswapV3PoolOwnerActions;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState__factory.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8d93a93760c3b5d40f58157f068f4012fe5d2874
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState__factory.ts
@@ -0,0 +1,275 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IUniswapV3PoolState,
+  IUniswapV3PoolStateInterface,
+} from "../../../../../../@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "feeGrowthGlobal0X128",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "feeGrowthGlobal1X128",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "liquidity",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "index",
+        type: "uint256",
+      },
+    ],
+    name: "observations",
+    outputs: [
+      {
+        internalType: "uint32",
+        name: "blockTimestamp",
+        type: "uint32",
+      },
+      {
+        internalType: "int56",
+        name: "tickCumulative",
+        type: "int56",
+      },
+      {
+        internalType: "uint160",
+        name: "secondsPerLiquidityCumulativeX128",
+        type: "uint160",
+      },
+      {
+        internalType: "bool",
+        name: "initialized",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "key",
+        type: "bytes32",
+      },
+    ],
+    name: "positions",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "_liquidity",
+        type: "uint128",
+      },
+      {
+        internalType: "uint256",
+        name: "feeGrowthInside0LastX128",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "feeGrowthInside1LastX128",
+        type: "uint256",
+      },
+      {
+        internalType: "uint128",
+        name: "tokensOwed0",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "tokensOwed1",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "protocolFees",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "token0",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "token1",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "slot0",
+    outputs: [
+      {
+        internalType: "uint160",
+        name: "sqrtPriceX96",
+        type: "uint160",
+      },
+      {
+        internalType: "int24",
+        name: "tick",
+        type: "int24",
+      },
+      {
+        internalType: "uint16",
+        name: "observationIndex",
+        type: "uint16",
+      },
+      {
+        internalType: "uint16",
+        name: "observationCardinality",
+        type: "uint16",
+      },
+      {
+        internalType: "uint16",
+        name: "observationCardinalityNext",
+        type: "uint16",
+      },
+      {
+        internalType: "uint8",
+        name: "feeProtocol",
+        type: "uint8",
+      },
+      {
+        internalType: "bool",
+        name: "unlocked",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int16",
+        name: "wordPosition",
+        type: "int16",
+      },
+    ],
+    name: "tickBitmap",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int24",
+        name: "tick",
+        type: "int24",
+      },
+    ],
+    name: "ticks",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "liquidityGross",
+        type: "uint128",
+      },
+      {
+        internalType: "int128",
+        name: "liquidityNet",
+        type: "int128",
+      },
+      {
+        internalType: "uint256",
+        name: "feeGrowthOutside0X128",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "feeGrowthOutside1X128",
+        type: "uint256",
+      },
+      {
+        internalType: "int56",
+        name: "tickCumulativeOutside",
+        type: "int56",
+      },
+      {
+        internalType: "uint160",
+        name: "secondsPerLiquidityOutsideX128",
+        type: "uint160",
+      },
+      {
+        internalType: "uint32",
+        name: "secondsOutside",
+        type: "uint32",
+      },
+      {
+        internalType: "bool",
+        name: "initialized",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IUniswapV3PoolState__factory {
+  static readonly abi = _abi;
+  static createInterface(): IUniswapV3PoolStateInterface {
+    return new Interface(_abi) as IUniswapV3PoolStateInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IUniswapV3PoolState {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as IUniswapV3PoolState;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/index.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..eaf5187428d2cbb5ba705271beff8141621158c5
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/contracts/interfaces/pool/index.ts
@@ -0,0 +1,9 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { IUniswapV3PoolActions__factory } from "./IUniswapV3PoolActions__factory";
+export { IUniswapV3PoolDerivedState__factory } from "./IUniswapV3PoolDerivedState__factory";
+export { IUniswapV3PoolEvents__factory } from "./IUniswapV3PoolEvents__factory";
+export { IUniswapV3PoolImmutables__factory } from "./IUniswapV3PoolImmutables__factory";
+export { IUniswapV3PoolOwnerActions__factory } from "./IUniswapV3PoolOwnerActions__factory";
+export { IUniswapV3PoolState__factory } from "./IUniswapV3PoolState__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/index.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6397da096aa8529bfddbfc8ea26e3e8abd180940
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-core/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as contracts from "./contracts";
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/contracts/index.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/contracts/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1d3444d5be0d1ab81b293f9a6a1bad64af59bfcc
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/contracts/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as interfaces from "./interfaces";
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter__factory.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d17d5d7ffbafa535ec223dc45abb60d3ba1d6d4e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter__factory.ts
@@ -0,0 +1,259 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  ISwapRouter,
+  ISwapRouterInterface,
+} from "../../../../../@uniswap/v3-periphery/contracts/interfaces/ISwapRouter";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes",
+            name: "path",
+            type: "bytes",
+          },
+          {
+            internalType: "address",
+            name: "recipient",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "deadline",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountIn",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountOutMinimum",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct ISwapRouter.ExactInputParams",
+        name: "params",
+        type: "tuple",
+      },
+    ],
+    name: "exactInput",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amountOut",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "tokenIn",
+            type: "address",
+          },
+          {
+            internalType: "address",
+            name: "tokenOut",
+            type: "address",
+          },
+          {
+            internalType: "uint24",
+            name: "fee",
+            type: "uint24",
+          },
+          {
+            internalType: "address",
+            name: "recipient",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "deadline",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountIn",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountOutMinimum",
+            type: "uint256",
+          },
+          {
+            internalType: "uint160",
+            name: "sqrtPriceLimitX96",
+            type: "uint160",
+          },
+        ],
+        internalType: "struct ISwapRouter.ExactInputSingleParams",
+        name: "params",
+        type: "tuple",
+      },
+    ],
+    name: "exactInputSingle",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amountOut",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes",
+            name: "path",
+            type: "bytes",
+          },
+          {
+            internalType: "address",
+            name: "recipient",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "deadline",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountOut",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountInMaximum",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct ISwapRouter.ExactOutputParams",
+        name: "params",
+        type: "tuple",
+      },
+    ],
+    name: "exactOutput",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amountIn",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "tokenIn",
+            type: "address",
+          },
+          {
+            internalType: "address",
+            name: "tokenOut",
+            type: "address",
+          },
+          {
+            internalType: "uint24",
+            name: "fee",
+            type: "uint24",
+          },
+          {
+            internalType: "address",
+            name: "recipient",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "deadline",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountOut",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountInMaximum",
+            type: "uint256",
+          },
+          {
+            internalType: "uint160",
+            name: "sqrtPriceLimitX96",
+            type: "uint160",
+          },
+        ],
+        internalType: "struct ISwapRouter.ExactOutputSingleParams",
+        name: "params",
+        type: "tuple",
+      },
+    ],
+    name: "exactOutputSingle",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amountIn",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "amount0Delta",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "amount1Delta",
+        type: "int256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "uniswapV3SwapCallback",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class ISwapRouter__factory {
+  static readonly abi = _abi;
+  static createInterface(): ISwapRouterInterface {
+    return new Interface(_abi) as ISwapRouterInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): ISwapRouter {
+    return new Contract(address, _abi, runner) as unknown as ISwapRouter;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/contracts/interfaces/index.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/contracts/interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..786c846ee832dfb48a5922f4508d97110d641d39
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/contracts/interfaces/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { ISwapRouter__factory } from "./ISwapRouter__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/index.ts b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6397da096aa8529bfddbfc8ea26e3e8abd180940
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/@uniswap/v3-periphery/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as contracts from "./contracts";
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4da18df7955af4717cc065019de33a39ba61848c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface__factory.ts
@@ -0,0 +1,156 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  AggregatorInterface,
+  AggregatorInterfaceInterface,
+} from "../../../../../../../../../contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "int256",
+        name: "current",
+        type: "int256",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+    ],
+    name: "AnswerUpdated",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "startedBy",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+    ],
+    name: "NewRound",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+    ],
+    name: "getAnswer",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+    ],
+    name: "getTimestamp",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestAnswer",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestRound",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestTimestamp",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class AggregatorInterface__factory {
+  static readonly abi = _abi;
+  static createInterface(): AggregatorInterfaceInterface {
+    return new Interface(_abi) as AggregatorInterfaceInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): AggregatorInterface {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as AggregatorInterface;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..19f9f08d051e1ad67e7f68a34e47314d2105743d
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface__factory.ts
@@ -0,0 +1,267 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  AggregatorV2V3Interface,
+  AggregatorV2V3InterfaceInterface,
+} from "../../../../../../../../../contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "int256",
+        name: "current",
+        type: "int256",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+    ],
+    name: "AnswerUpdated",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "startedBy",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+    ],
+    name: "NewRound",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "decimals",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "",
+        type: "uint8",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "description",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+    ],
+    name: "getAnswer",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint80",
+        name: "_roundId",
+        type: "uint80",
+      },
+    ],
+    name: "getRoundData",
+    outputs: [
+      {
+        internalType: "uint80",
+        name: "roundId",
+        type: "uint80",
+      },
+      {
+        internalType: "int256",
+        name: "answer",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint80",
+        name: "answeredInRound",
+        type: "uint80",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "roundId",
+        type: "uint256",
+      },
+    ],
+    name: "getTimestamp",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestAnswer",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestRound",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestRoundData",
+    outputs: [
+      {
+        internalType: "uint80",
+        name: "roundId",
+        type: "uint80",
+      },
+      {
+        internalType: "int256",
+        name: "answer",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint80",
+        name: "answeredInRound",
+        type: "uint80",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestTimestamp",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "version",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class AggregatorV2V3Interface__factory {
+  static readonly abi = _abi;
+  static createInterface(): AggregatorV2V3InterfaceInterface {
+    return new Interface(_abi) as AggregatorV2V3InterfaceInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): AggregatorV2V3Interface {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as AggregatorV2V3Interface;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5047cbadddb7316c59d559c0198a93b6c1efd3b6
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface__factory.ts
@@ -0,0 +1,140 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  AggregatorV3Interface,
+  AggregatorV3InterfaceInterface,
+} from "../../../../../../../../../contracts/.deps/npm/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "decimals",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "",
+        type: "uint8",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "description",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint80",
+        name: "_roundId",
+        type: "uint80",
+      },
+    ],
+    name: "getRoundData",
+    outputs: [
+      {
+        internalType: "uint80",
+        name: "roundId",
+        type: "uint80",
+      },
+      {
+        internalType: "int256",
+        name: "answer",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint80",
+        name: "answeredInRound",
+        type: "uint80",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "latestRoundData",
+    outputs: [
+      {
+        internalType: "uint80",
+        name: "roundId",
+        type: "uint80",
+      },
+      {
+        internalType: "int256",
+        name: "answer",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "startedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "updatedAt",
+        type: "uint256",
+      },
+      {
+        internalType: "uint80",
+        name: "answeredInRound",
+        type: "uint80",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "version",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class AggregatorV3Interface__factory {
+  static readonly abi = _abi;
+  static createInterface(): AggregatorV3InterfaceInterface {
+    return new Interface(_abi) as AggregatorV3InterfaceInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): AggregatorV3Interface {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as AggregatorV3Interface;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ac328a234a6ee6b78b29014252fc4e71ce098954
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts
@@ -0,0 +1,122 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  OwnableUpgradeable,
+  OwnableUpgradeableInterface,
+} from "../../../../../../../contracts/.deps/npm/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+    ],
+    name: "OwnableInvalidOwner",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "OwnableUnauthorizedAccount",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "previousOwner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "newOwner",
+        type: "address",
+      },
+    ],
+    name: "OwnershipTransferred",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "owner",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "renounceOwnership",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "newOwner",
+        type: "address",
+      },
+    ],
+    name: "transferOwnership",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class OwnableUpgradeable__factory {
+  static readonly abi = _abi;
+  static createInterface(): OwnableUpgradeableInterface {
+    return new Interface(_abi) as OwnableUpgradeableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): OwnableUpgradeable {
+    return new Contract(address, _abi, runner) as unknown as OwnableUpgradeable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b5f1163bc85af0a505860793b248092969ad414c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.ts
@@ -0,0 +1,48 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  Initializable,
+  InitializableInterface,
+} from "../../../../../../../../contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+] as const;
+
+export class Initializable__factory {
+  static readonly abi = _abi;
+  static createInterface(): InitializableInterface {
+    return new Interface(_abi) as InitializableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): Initializable {
+    return new Contract(address, _abi, runner) as unknown as Initializable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0b442e0e5751de70d5715ac8a6563ecb4f54689f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.ts
@@ -0,0 +1,153 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  UUPSUpgradeable,
+  UUPSUpgradeableInterface,
+} from "../../../../../../../../contracts/.deps/npm/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+    ],
+    name: "AddressEmptyCode",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "implementation",
+        type: "address",
+      },
+    ],
+    name: "ERC1967InvalidImplementation",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "ERC1967NonPayable",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "FailedInnerCall",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "UUPSUnauthorizedCallContext",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "slot",
+        type: "bytes32",
+      },
+    ],
+    name: "UUPSUnsupportedProxiableUUID",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "implementation",
+        type: "address",
+      },
+    ],
+    name: "Upgraded",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "UPGRADE_INTERFACE_VERSION",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "proxiableUUID",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "newImplementation",
+        type: "address",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "upgradeToAndCall",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+] as const;
+
+export class UUPSUpgradeable__factory {
+  static readonly abi = _abi;
+  static createInterface(): UUPSUpgradeableInterface {
+    return new Interface(_abi) as UUPSUpgradeableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): UUPSUpgradeable {
+    return new Contract(address, _abi, runner) as unknown as UUPSUpgradeable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..59be4b0fed59fe0bb74c68ed285f8b4f60faa212
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.ts
@@ -0,0 +1,48 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  ContextUpgradeable,
+  ContextUpgradeableInterface,
+} from "../../../../../../../contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+] as const;
+
+export class ContextUpgradeable__factory {
+  static readonly abi = _abi;
+  static createInterface(): ContextUpgradeableInterface {
+    return new Interface(_abi) as ContextUpgradeableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): ContextUpgradeable {
+    return new Contract(address, _abi, runner) as unknown as ContextUpgradeable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8d81ae779d7ced08cdd216848ababd4170f3cedc
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable__factory.ts
@@ -0,0 +1,101 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  PausableUpgradeable,
+  PausableUpgradeableInterface,
+} from "../../../../../../../contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "EnforcedPause",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "ExpectedPause",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "Paused",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "Unpaused",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "paused",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class PausableUpgradeable__factory {
+  static readonly abi = _abi;
+  static createInterface(): PausableUpgradeableInterface {
+    return new Interface(_abi) as PausableUpgradeableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): PausableUpgradeable {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as PausableUpgradeable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3c31554ddc74552568c594d04d7976730cb36507
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable__factory.ts
@@ -0,0 +1,97 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  EIP712Upgradeable,
+  EIP712UpgradeableInterface,
+} from "../../../../../../../../contracts/.deps/npm/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [],
+    name: "EIP712DomainChanged",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "eip712Domain",
+    outputs: [
+      {
+        internalType: "bytes1",
+        name: "fields",
+        type: "bytes1",
+      },
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "version",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "chainId",
+        type: "uint256",
+      },
+      {
+        internalType: "address",
+        name: "verifyingContract",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "salt",
+        type: "bytes32",
+      },
+      {
+        internalType: "uint256[]",
+        name: "extensions",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class EIP712Upgradeable__factory {
+  static readonly abi = _abi;
+  static createInterface(): EIP712UpgradeableInterface {
+    return new Interface(_abi) as EIP712UpgradeableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): EIP712Upgradeable {
+    return new Contract(address, _abi, runner) as unknown as EIP712Upgradeable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/interfaces/IERC5267__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/interfaces/IERC5267__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0d5934f879ec6ba87edc8de6e7cc5c6dd0579f88
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/interfaces/IERC5267__factory.ts
@@ -0,0 +1,71 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC5267,
+  IERC5267Interface,
+} from "../../../../../../../contracts/.deps/npm/@openzeppelin/contracts/interfaces/IERC5267";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [],
+    name: "EIP712DomainChanged",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "eip712Domain",
+    outputs: [
+      {
+        internalType: "bytes1",
+        name: "fields",
+        type: "bytes1",
+      },
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "version",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "chainId",
+        type: "uint256",
+      },
+      {
+        internalType: "address",
+        name: "verifyingContract",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "salt",
+        type: "bytes32",
+      },
+      {
+        internalType: "uint256[]",
+        name: "extensions",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IERC5267__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC5267Interface {
+    return new Interface(_abi) as IERC5267Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IERC5267 {
+    return new Contract(address, _abi, runner) as unknown as IERC5267;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..90ed0d6cfbdc99b4a1b075ac49214f73872e12bf
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.ts
@@ -0,0 +1,38 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC1822Proxiable,
+  IERC1822ProxiableInterface,
+} from "../../../../../../../../contracts/.deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "proxiableUUID",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IERC1822Proxiable__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC1822ProxiableInterface {
+    return new Interface(_abi) as IERC1822ProxiableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IERC1822Proxiable {
+    return new Contract(address, _abi, runner) as unknown as IERC1822Proxiable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cde0be7978a00abd609647600341a2617df4856e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.ts
@@ -0,0 +1,150 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../../../../common";
+import type {
+  ERC1967Utils,
+  ERC1967UtilsInterface,
+} from "../../../../../../../../contracts/.deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "admin",
+        type: "address",
+      },
+    ],
+    name: "ERC1967InvalidAdmin",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "beacon",
+        type: "address",
+      },
+    ],
+    name: "ERC1967InvalidBeacon",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "implementation",
+        type: "address",
+      },
+    ],
+    name: "ERC1967InvalidImplementation",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "ERC1967NonPayable",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "previousAdmin",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "address",
+        name: "newAdmin",
+        type: "address",
+      },
+    ],
+    name: "AdminChanged",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "beacon",
+        type: "address",
+      },
+    ],
+    name: "BeaconUpgraded",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "implementation",
+        type: "address",
+      },
+    ],
+    name: "Upgraded",
+    type: "event",
+  },
+] as const;
+
+const _bytecode =
+  "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fdfea2646970667358221220120d8cecfc832be885e6621038cb907cd0c0f967e6db565680db351ff81d5e6264736f6c63430008180033";
+
+type ERC1967UtilsConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: ERC1967UtilsConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class ERC1967Utils__factory extends ContractFactory {
+  constructor(...args: ERC1967UtilsConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      ERC1967Utils & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): ERC1967Utils__factory {
+    return super.connect(runner) as ERC1967Utils__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): ERC1967UtilsInterface {
+    return new Interface(_abi) as ERC1967UtilsInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): ERC1967Utils {
+    return new Contract(address, _abi, runner) as unknown as ERC1967Utils;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ef871212e65d2545ed89940bc59a88d554672a35
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.ts
@@ -0,0 +1,35 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IBeacon,
+  IBeaconInterface,
+} from "../../../../../../../../contracts/.deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "implementation",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IBeacon__factory {
+  static readonly abi = _abi;
+  static createInterface(): IBeaconInterface {
+    return new Interface(_abi) as IBeaconInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IBeacon {
+    return new Contract(address, _abi, runner) as unknown as IBeacon;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/Address__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/Address__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5d71e2ce90a60ae46f2d914fb59371939337fa31
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/Address__factory.ts
@@ -0,0 +1,91 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../../../common";
+import type {
+  Address,
+  AddressInterface,
+} from "../../../../../../../contracts/.deps/npm/@openzeppelin/contracts/utils/Address";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+    ],
+    name: "AddressEmptyCode",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "AddressInsufficientBalance",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "FailedInnerCall",
+    type: "error",
+  },
+] as const;
+
+const _bytecode =
+  "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fdfea26469706673582212205c081c503d44496309a8627a4b95595bcb1a5aed038caff0b9b1c47ec6bff16064736f6c63430008180033";
+
+type AddressConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: AddressConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class Address__factory extends ContractFactory {
+  constructor(...args: AddressConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      Address & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): Address__factory {
+    return super.connect(runner) as Address__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): AddressInterface {
+    return new Interface(_abi) as AddressInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): Address {
+    return new Contract(address, _abi, runner) as unknown as Address;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/Strings__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/Strings__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..490b88c1cf6097aeb4289e49a3ffdaec8bbb1863
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/Strings__factory.ts
@@ -0,0 +1,80 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../../../common";
+import type {
+  Strings,
+  StringsInterface,
+} from "../../../../../../../contracts/.deps/npm/@openzeppelin/contracts/utils/Strings";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "length",
+        type: "uint256",
+      },
+    ],
+    name: "StringsInsufficientHexLength",
+    type: "error",
+  },
+] as const;
+
+const _bytecode =
+  "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fdfea26469706673582212202c1f520b01edeb07856f34716962772915d05b272d66b390c67578d9c81c837d64736f6c63430008180033";
+
+type StringsConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: StringsConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class Strings__factory extends ContractFactory {
+  constructor(...args: StringsConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      Strings & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): Strings__factory {
+    return super.connect(runner) as Strings__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): StringsInterface {
+    return new Interface(_abi) as StringsInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): Strings {
+    return new Contract(address, _abi, runner) as unknown as Strings;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ebd450d97e804491836884ce9cc13d9ad35f81ae
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.ts
@@ -0,0 +1,91 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../../../../common";
+import type {
+  ECDSA,
+  ECDSAInterface,
+} from "../../../../../../../../contracts/.deps/npm/@openzeppelin/contracts/utils/cryptography/ECDSA";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "ECDSAInvalidSignature",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "length",
+        type: "uint256",
+      },
+    ],
+    name: "ECDSAInvalidSignatureLength",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    name: "ECDSAInvalidSignatureS",
+    type: "error",
+  },
+] as const;
+
+const _bytecode =
+  "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fdfea2646970667358221220ab5ff9ea65dd598bf1488fc2916040d1524fd8634021dabae566d8abea6b3d1a64736f6c63430008180033";
+
+type ECDSAConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: ECDSAConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class ECDSA__factory extends ContractFactory {
+  constructor(...args: ECDSAConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      ECDSA & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): ECDSA__factory {
+    return super.connect(runner) as ECDSA__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): ECDSAInterface {
+    return new Interface(_abi) as ECDSAInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): ECDSA {
+    return new Contract(address, _abi, runner) as unknown as ECDSA;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/math/Math__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/math/Math__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cfd556d902f3b316893c4edd567a6a36d0f68243
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@openzeppelin/contracts/utils/math/Math__factory.ts
@@ -0,0 +1,69 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../../../../common";
+import type {
+  Math,
+  MathInterface,
+} from "../../../../../../../../contracts/.deps/npm/@openzeppelin/contracts/utils/math/Math";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "MathOverflowedMulDiv",
+    type: "error",
+  },
+] as const;
+
+const _bytecode =
+  "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fdfea264697066735822122001e1174e6b3d3391e4b45d5e82f86451caacfa45db646cdc27bc4fa114c45abc64736f6c63430008180033";
+
+type MathConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: MathConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class Math__factory extends ContractFactory {
+  constructor(...args: MathConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      Math & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): Math__factory {
+    return super.connect(runner) as Math__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): MathInterface {
+    return new Interface(_abi) as MathInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): Math {
+    return new Contract(address, _abi, runner) as unknown as Math;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bcdd99694ec5b2c6809984faba1251a5e344815f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback__factory.ts
@@ -0,0 +1,52 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IUniswapV3SwapCallback,
+  IUniswapV3SwapCallbackInterface,
+} from "../../../../../../../../../contracts/.deps/npm/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "amount0Delta",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "amount1Delta",
+        type: "int256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "uniswapV3SwapCallback",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IUniswapV3SwapCallback__factory {
+  static readonly abi = _abi;
+  static createInterface(): IUniswapV3SwapCallbackInterface {
+    return new Interface(_abi) as IUniswapV3SwapCallbackInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IUniswapV3SwapCallback {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as IUniswapV3SwapCallback;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d75d103299b0a4d1b62c6ef0a60939cf3e1f0d1b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/.deps/npm/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter__factory.ts
@@ -0,0 +1,259 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  ISwapRouter,
+  ISwapRouterInterface,
+} from "../../../../../../../../contracts/.deps/npm/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes",
+            name: "path",
+            type: "bytes",
+          },
+          {
+            internalType: "address",
+            name: "recipient",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "deadline",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountIn",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountOutMinimum",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct ISwapRouter.ExactInputParams",
+        name: "params",
+        type: "tuple",
+      },
+    ],
+    name: "exactInput",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amountOut",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "tokenIn",
+            type: "address",
+          },
+          {
+            internalType: "address",
+            name: "tokenOut",
+            type: "address",
+          },
+          {
+            internalType: "uint24",
+            name: "fee",
+            type: "uint24",
+          },
+          {
+            internalType: "address",
+            name: "recipient",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "deadline",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountIn",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountOutMinimum",
+            type: "uint256",
+          },
+          {
+            internalType: "uint160",
+            name: "sqrtPriceLimitX96",
+            type: "uint160",
+          },
+        ],
+        internalType: "struct ISwapRouter.ExactInputSingleParams",
+        name: "params",
+        type: "tuple",
+      },
+    ],
+    name: "exactInputSingle",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amountOut",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes",
+            name: "path",
+            type: "bytes",
+          },
+          {
+            internalType: "address",
+            name: "recipient",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "deadline",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountOut",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountInMaximum",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct ISwapRouter.ExactOutputParams",
+        name: "params",
+        type: "tuple",
+      },
+    ],
+    name: "exactOutput",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amountIn",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "tokenIn",
+            type: "address",
+          },
+          {
+            internalType: "address",
+            name: "tokenOut",
+            type: "address",
+          },
+          {
+            internalType: "uint24",
+            name: "fee",
+            type: "uint24",
+          },
+          {
+            internalType: "address",
+            name: "recipient",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "deadline",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountOut",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "amountInMaximum",
+            type: "uint256",
+          },
+          {
+            internalType: "uint160",
+            name: "sqrtPriceLimitX96",
+            type: "uint160",
+          },
+        ],
+        internalType: "struct ISwapRouter.ExactOutputSingleParams",
+        name: "params",
+        type: "tuple",
+      },
+    ],
+    name: "exactOutputSingle",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amountIn",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "amount0Delta",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "amount1Delta",
+        type: "int256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "uniswapV3SwapCallback",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class ISwapRouter__factory {
+  static readonly abi = _abi;
+  static createInterface(): ISwapRouterInterface {
+    return new Interface(_abi) as ISwapRouterInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): ISwapRouter {
+    return new Contract(address, _abi, runner) as unknown as ISwapRouter;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/IERC20__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/IERC20__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4853f227bbc399ac59a203cf7907333d3d309ca4
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/IERC20__factory.ts
@@ -0,0 +1,205 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC20,
+  IERC20Interface,
+} from "../../../contracts/Interfaces/IERC20";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "allowance",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "totalSupply",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "transfer",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IERC20__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC20Interface {
+    return new Interface(_abi) as IERC20Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IERC20 {
+    return new Contract(address, _abi, runner) as unknown as IERC20;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/IElasticERC20__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/IElasticERC20__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d6d10186637f4c04dba01c2c2396fe7b68471c9b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/IElasticERC20__factory.ts
@@ -0,0 +1,244 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IElasticERC20,
+  IElasticERC20Interface,
+} from "../../../contracts/Interfaces/IElasticERC20";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "allowance",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "burn",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "mint",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "totalSupply",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "transfer",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IElasticERC20__factory {
+  static readonly abi = _abi;
+  static createInterface(): IElasticERC20Interface {
+    return new Interface(_abi) as IElasticERC20Interface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IElasticERC20 {
+    return new Contract(address, _abi, runner) as unknown as IElasticERC20;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/IUniswapV3Pool__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/IUniswapV3Pool__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f1f6561b7346d1104a22a3cb713c844013dd3ce9
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/IUniswapV3Pool__factory.ts
@@ -0,0 +1,1006 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IUniswapV3Pool,
+  IUniswapV3PoolInterface,
+} from "../../../contracts/Interfaces/IUniswapV3Pool";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount",
+        type: "uint128",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+    ],
+    name: "Burn",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount0",
+        type: "uint128",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount1",
+        type: "uint128",
+      },
+    ],
+    name: "Collect",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount0",
+        type: "uint128",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount1",
+        type: "uint128",
+      },
+    ],
+    name: "CollectProtocol",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "paid0",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "paid1",
+        type: "uint256",
+      },
+    ],
+    name: "Flash",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint16",
+        name: "observationCardinalityNextOld",
+        type: "uint16",
+      },
+      {
+        indexed: false,
+        internalType: "uint16",
+        name: "observationCardinalityNextNew",
+        type: "uint16",
+      },
+    ],
+    name: "IncreaseObservationCardinalityNext",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint160",
+        name: "sqrtPriceX96",
+        type: "uint160",
+      },
+      {
+        indexed: false,
+        internalType: "int24",
+        name: "tick",
+        type: "int24",
+      },
+    ],
+    name: "Initialize",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        indexed: true,
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "amount",
+        type: "uint128",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+    ],
+    name: "Mint",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint8",
+        name: "feeProtocol0Old",
+        type: "uint8",
+      },
+      {
+        indexed: false,
+        internalType: "uint8",
+        name: "feeProtocol1Old",
+        type: "uint8",
+      },
+      {
+        indexed: false,
+        internalType: "uint8",
+        name: "feeProtocol0New",
+        type: "uint8",
+      },
+      {
+        indexed: false,
+        internalType: "uint8",
+        name: "feeProtocol1New",
+        type: "uint8",
+      },
+    ],
+    name: "SetFeeProtocol",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "amount0",
+        type: "int256",
+      },
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "amount1",
+        type: "int256",
+      },
+      {
+        indexed: false,
+        internalType: "uint160",
+        name: "sqrtPriceX96",
+        type: "uint160",
+      },
+      {
+        indexed: false,
+        internalType: "uint128",
+        name: "liquidity",
+        type: "uint128",
+      },
+      {
+        indexed: false,
+        internalType: "int24",
+        name: "tick",
+        type: "int24",
+      },
+    ],
+    name: "Swap",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        internalType: "uint128",
+        name: "amount",
+        type: "uint128",
+      },
+    ],
+    name: "burn",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        internalType: "uint128",
+        name: "amount0Requested",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "amount1Requested",
+        type: "uint128",
+      },
+    ],
+    name: "collect",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "amount0",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "amount1",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "uint128",
+        name: "amount0Requested",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "amount1Requested",
+        type: "uint128",
+      },
+    ],
+    name: "collectProtocol",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "amount0",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "amount1",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "factory",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "fee",
+    outputs: [
+      {
+        internalType: "uint24",
+        name: "",
+        type: "uint24",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "feeGrowthGlobal0X128",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "feeGrowthGlobal1X128",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "flash",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint16",
+        name: "observationCardinalityNext",
+        type: "uint16",
+      },
+    ],
+    name: "increaseObservationCardinalityNext",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint160",
+        name: "sqrtPriceX96",
+        type: "uint160",
+      },
+    ],
+    name: "initialize",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "liquidity",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "maxLiquidityPerTick",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+      {
+        internalType: "uint128",
+        name: "amount",
+        type: "uint128",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "mint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "amount0",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "amount1",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "index",
+        type: "uint256",
+      },
+    ],
+    name: "observations",
+    outputs: [
+      {
+        internalType: "uint32",
+        name: "blockTimestamp",
+        type: "uint32",
+      },
+      {
+        internalType: "int56",
+        name: "tickCumulative",
+        type: "int56",
+      },
+      {
+        internalType: "uint160",
+        name: "secondsPerLiquidityCumulativeX128",
+        type: "uint160",
+      },
+      {
+        internalType: "bool",
+        name: "initialized",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint32[]",
+        name: "secondsAgos",
+        type: "uint32[]",
+      },
+    ],
+    name: "observe",
+    outputs: [
+      {
+        internalType: "int56[]",
+        name: "tickCumulatives",
+        type: "int56[]",
+      },
+      {
+        internalType: "uint160[]",
+        name: "secondsPerLiquidityCumulativeX128s",
+        type: "uint160[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "key",
+        type: "bytes32",
+      },
+    ],
+    name: "positions",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "_liquidity",
+        type: "uint128",
+      },
+      {
+        internalType: "uint256",
+        name: "feeGrowthInside0LastX128",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "feeGrowthInside1LastX128",
+        type: "uint256",
+      },
+      {
+        internalType: "uint128",
+        name: "tokensOwed0",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "tokensOwed1",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "protocolFees",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "token0",
+        type: "uint128",
+      },
+      {
+        internalType: "uint128",
+        name: "token1",
+        type: "uint128",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint8",
+        name: "feeProtocol0",
+        type: "uint8",
+      },
+      {
+        internalType: "uint8",
+        name: "feeProtocol1",
+        type: "uint8",
+      },
+    ],
+    name: "setFeeProtocol",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "slot0",
+    outputs: [
+      {
+        internalType: "uint160",
+        name: "sqrtPriceX96",
+        type: "uint160",
+      },
+      {
+        internalType: "int24",
+        name: "tick",
+        type: "int24",
+      },
+      {
+        internalType: "uint16",
+        name: "observationIndex",
+        type: "uint16",
+      },
+      {
+        internalType: "uint16",
+        name: "observationCardinality",
+        type: "uint16",
+      },
+      {
+        internalType: "uint16",
+        name: "observationCardinalityNext",
+        type: "uint16",
+      },
+      {
+        internalType: "uint8",
+        name: "feeProtocol",
+        type: "uint8",
+      },
+      {
+        internalType: "bool",
+        name: "unlocked",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int24",
+        name: "tickLower",
+        type: "int24",
+      },
+      {
+        internalType: "int24",
+        name: "tickUpper",
+        type: "int24",
+      },
+    ],
+    name: "snapshotCumulativesInside",
+    outputs: [
+      {
+        internalType: "int56",
+        name: "tickCumulativeInside",
+        type: "int56",
+      },
+      {
+        internalType: "uint160",
+        name: "secondsPerLiquidityInsideX128",
+        type: "uint160",
+      },
+      {
+        internalType: "uint32",
+        name: "secondsInside",
+        type: "uint32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "bool",
+        name: "zeroForOne",
+        type: "bool",
+      },
+      {
+        internalType: "int256",
+        name: "amountSpecified",
+        type: "int256",
+      },
+      {
+        internalType: "uint160",
+        name: "sqrtPriceLimitX96",
+        type: "uint160",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "swap",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "amount0",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "amount1",
+        type: "int256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int16",
+        name: "wordPosition",
+        type: "int16",
+      },
+    ],
+    name: "tickBitmap",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "tickSpacing",
+    outputs: [
+      {
+        internalType: "int24",
+        name: "",
+        type: "int24",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int24",
+        name: "tick",
+        type: "int24",
+      },
+    ],
+    name: "ticks",
+    outputs: [
+      {
+        internalType: "uint128",
+        name: "liquidityGross",
+        type: "uint128",
+      },
+      {
+        internalType: "int128",
+        name: "liquidityNet",
+        type: "int128",
+      },
+      {
+        internalType: "uint256",
+        name: "feeGrowthOutside0X128",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "feeGrowthOutside1X128",
+        type: "uint256",
+      },
+      {
+        internalType: "int56",
+        name: "tickCumulativeOutside",
+        type: "int56",
+      },
+      {
+        internalType: "uint160",
+        name: "secondsPerLiquidityOutsideX128",
+        type: "uint160",
+      },
+      {
+        internalType: "uint32",
+        name: "secondsOutside",
+        type: "uint32",
+      },
+      {
+        internalType: "bool",
+        name: "initialized",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "token0",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "token1",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IUniswapV3Pool__factory {
+  static readonly abi = _abi;
+  static createInterface(): IUniswapV3PoolInterface {
+    return new Interface(_abi) as IUniswapV3PoolInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IUniswapV3Pool {
+    return new Contract(address, _abi, runner) as unknown as IUniswapV3Pool;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/index.ts b/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ea391cdc473dbc0e42cb4d0fe2b278a0c5a15b99
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/Interfaces/index.ts
@@ -0,0 +1,6 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { IERC20__factory } from "./IERC20__factory";
+export { IElasticERC20__factory } from "./IElasticERC20__factory";
+export { IUniswapV3Pool__factory } from "./IUniswapV3Pool__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/XFTmock.sol/XFTMock__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/XFTmock.sol/XFTMock__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aefc4c91efe7d0bf743cbac88bf77e661880277d
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/XFTmock.sol/XFTMock__factory.ts
@@ -0,0 +1,674 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../common";
+import type {
+  XFTMock,
+  XFTMockInterface,
+} from "../../../contracts/XFTmock.sol/XFTMock";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "_vk",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "constructor",
+  },
+  {
+    inputs: [],
+    name: "AccessControlBadConfirmation",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "neededRole",
+        type: "bytes32",
+      },
+    ],
+    name: "AccessControlUnauthorizedAccount",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "allowance",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "needed",
+        type: "uint256",
+      },
+    ],
+    name: "ERC20InsufficientAllowance",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "balance",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "needed",
+        type: "uint256",
+      },
+    ],
+    name: "ERC20InsufficientBalance",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "approver",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidApprover",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "receiver",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidReceiver",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidSender",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "ERC20InvalidSpender",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "previousAdminRole",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "newAdminRole",
+        type: "bytes32",
+      },
+    ],
+    name: "RoleAdminChanged",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+    ],
+    name: "RoleGranted",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+    ],
+    name: "RoleRevoked",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "BURNER_ROLE",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "DEFAULT_ADMIN_ROLE",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "MINTER_ROLE",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "allowance",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "burn",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "decimals",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "",
+        type: "uint8",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+    ],
+    name: "getRoleAdmin",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "grantRole",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "hasRole",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "mint",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "name",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "callerConfirmation",
+        type: "address",
+      },
+    ],
+    name: "renounceRole",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "role",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "revokeRole",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes4",
+        name: "interfaceId",
+        type: "bytes4",
+      },
+    ],
+    name: "supportsInterface",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "symbol",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "totalSupply",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "transfer",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x608060405234801562000010575f80fd5b50604051620012b8380380620012b883398101604081905262000033916200012f565b8080600362000043828262000287565b50600462000052828262000287565b506200006391505f9050336200006b565b505062000353565b5f8281526005602090815260408083206001600160a01b038516845290915281205460ff1662000112575f8381526005602090815260408083206001600160a01b03861684529091529020805460ff19166001179055620000c93390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000115565b505f5b92915050565b634e487b7160e01b5f52604160045260245ffd5b5f602080838503121562000141575f80fd5b82516001600160401b038082111562000158575f80fd5b818501915085601f8301126200016c575f80fd5b8151818111156200018157620001816200011b565b604051601f8201601f19908116603f01168101908382118183101715620001ac57620001ac6200011b565b816040528281528886848701011115620001c4575f80fd5b5f93505b82841015620001e75784840186015181850187015292850192620001c8565b5f86848301015280965050505050505092915050565b600181811c908216806200021257607f821691505b6020821081036200023157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200028257805f5260205f20601f840160051c810160208510156200025e5750805b601f840160051c820191505b818110156200027f575f81556001016200026a565b50505b505050565b81516001600160401b03811115620002a357620002a36200011b565b620002bb81620002b48454620001fd565b8462000237565b602080601f831160018114620002f1575f8415620002d95750858301515b5f19600386901b1c1916600185901b1785556200034b565b5f85815260208120601f198616915b82811015620003215788860151825594840194600190910190840162000300565b50858210156200033f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b610f5780620003615f395ff3fe608060405234801561000f575f80fd5b5060043610610163575f3560e01c806340c10f19116100c7578063a217fddf1161007d578063d539139311610063578063d539139314610304578063d547741f1461032b578063dd62ed3e1461033e575f80fd5b8063a217fddf146102ea578063a9059cbb146102f1575f80fd5b806391d14854116100ad57806391d148541461029757806395d89b41146102cf5780639dc29fac146102d7575f80fd5b806340c10f191461025c57806370a082311461026f575f80fd5b8063248a9ca31161011c5780632f2ff15d116101025780632f2ff15d14610225578063313ce5671461023a57806336568abe14610249575f80fd5b8063248a9ca3146101dc578063282c51f3146101fe575f80fd5b8063095ea7b31161014c578063095ea7b3146101a457806318160ddd146101b757806323b872dd146101c9575f80fd5b806301ffc9a71461016757806306fdde031461018f575b5f80fd5b61017a610175366004610cea565b610376565b60405190151581526020015b60405180910390f35b61019761040e565b6040516101869190610d30565b61017a6101b2366004610db5565b61049e565b6002545b604051908152602001610186565b61017a6101d7366004610ddd565b6104b5565b6101bb6101ea366004610e16565b5f9081526005602052604090206001015490565b6101bb7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b610238610233366004610e2d565b6104d8565b005b60405160128152602001610186565b610238610257366004610e2d565b610502565b61023861026a366004610db5565b610553565b6101bb61027d366004610e57565b6001600160a01b03165f9081526020819052604090205490565b61017a6102a5366004610e2d565b5f9182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6101976105fd565b6102386102e5366004610db5565b61060c565b6101bb5f81565b61017a6102ff366004610db5565b6106ad565b6101bb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610238610339366004610e2d565b6106ba565b6101bb61034c366004610e70565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061040857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606003805461041d90610e98565b80601f016020809104026020016040519081016040528092919081815260200182805461044990610e98565b80156104945780601f1061046b57610100808354040283529160200191610494565b820191905f5260205f20905b81548152906001019060200180831161047757829003601f168201915b5050505050905090565b5f336104ab8185856106de565b5060019392505050565b5f336104c28582856106eb565b6104cd858585610798565b506001949350505050565b5f828152600560205260409020600101546104f281610827565b6104fc8383610834565b50505050565b6001600160a01b0381163314610544576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61054e82826108fd565b505050565b335f9081527f15a28d26fa1bf736cf7edc9922607171ccb09c3c73b808e7772a3013e068a522602052604090205460ff166105ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064015b60405180910390fd5b6105f982826109a0565b5050565b60606004805461041d90610e98565b335f9081527f847f481f687befb06ed3511f1a8dcef57e83007c0147ae5047583d7056170937602052604090205460ff166106a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616c6c6572206973206e6f742061206275726e65720000000000000000000060448201526064016105e6565b6105f982826109ed565b5f336104ab818585610798565b5f828152600560205260409020600101546106d481610827565b6104fc83836108fd565b61054e8383836001610a3a565b6001600160a01b038381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146104fc578181101561078a576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101829052604481018390526064016105e6565b6104fc84848484035f610a3a565b6001600160a01b0383166107da576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f60048201526024016105e6565b6001600160a01b03821661081c576040517fec442f050000000000000000000000000000000000000000000000000000000081525f60048201526024016105e6565b61054e838383610b3e565b6108318133610c7d565b50565b5f8281526005602090815260408083206001600160a01b038516845290915281205460ff166108f6575f8381526005602090815260408083206001600160a01b0386168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556108ae3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610408565b505f610408565b5f8281526005602090815260408083206001600160a01b038516845290915281205460ff16156108f6575f8381526005602090815260408083206001600160a01b038616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610408565b6001600160a01b0382166109e2576040517fec442f050000000000000000000000000000000000000000000000000000000081525f60048201526024016105e6565b6105f95f8383610b3e565b6001600160a01b038216610a2f576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f60048201526024016105e6565b6105f9825f83610b3e565b6001600160a01b038416610a7c576040517fe602df050000000000000000000000000000000000000000000000000000000081525f60048201526024016105e6565b6001600160a01b038316610abe576040517f94280d620000000000000000000000000000000000000000000000000000000081525f60048201526024016105e6565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156104fc57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610b3091815260200190565b60405180910390a350505050565b6001600160a01b038316610b68578060025f828254610b5d9190610ee9565b90915550610bf19050565b6001600160a01b0383165f9081526020819052604090205481811015610bd3576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260248101829052604481018390526064016105e6565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610c0d57600280548290039055610c2b565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610c7091815260200190565b60405180910390a3505050565b5f8281526005602090815260408083206001600160a01b038516845290915290205460ff166105f9576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016105e6565b5f60208284031215610cfa575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610d29575f80fd5b9392505050565b5f602080835283518060208501525f5b81811015610d5c57858101830151858201604001528201610d40565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b80356001600160a01b0381168114610db0575f80fd5b919050565b5f8060408385031215610dc6575f80fd5b610dcf83610d9a565b946020939093013593505050565b5f805f60608486031215610def575f80fd5b610df884610d9a565b9250610e0660208501610d9a565b9150604084013590509250925092565b5f60208284031215610e26575f80fd5b5035919050565b5f8060408385031215610e3e575f80fd5b82359150610e4e60208401610d9a565b90509250929050565b5f60208284031215610e67575f80fd5b610d2982610d9a565b5f8060408385031215610e81575f80fd5b610e8a83610d9a565b9150610e4e60208401610d9a565b600181811c90821680610eac57607f821691505b602082108103610ee3577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b80820180821115610408577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffdfea264697066735822122073d1b7b7dac06ea4d18510a3a11caaa8ada140baf2924585541abde3c8d1631864736f6c63430008180033";
+
+type XFTMockConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: XFTMockConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class XFTMock__factory extends ContractFactory {
+  constructor(...args: XFTMockConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    _vk: string,
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(_vk, overrides || {});
+  }
+  override deploy(
+    _vk: string,
+    overrides?: NonPayableOverrides & { from?: string }
+  ) {
+    return super.deploy(_vk, overrides || {}) as Promise<
+      XFTMock & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): XFTMock__factory {
+    return super.connect(runner) as XFTMock__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): XFTMockInterface {
+    return new Interface(_abi) as XFTMockInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): XFTMock {
+    return new Contract(address, _abi, runner) as unknown as XFTMock;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/XFTmock.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/contracts/XFTmock.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..45bb119b3dca1220138dbfa936cdcb27b6f24ab0
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/XFTmock.sol/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { XFTMock__factory } from "./XFTMock__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/index.ts b/momiji-helpers/utils/typechain-types/factories/contracts/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9e3ac782802d4952ae53a8153296e5455e33e57f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/index.ts
@@ -0,0 +1,7 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as interfaces from "./Interfaces";
+export * as xfTmockSol from "./XFTmock.sol";
+export * as plonkVkSol from "./plonk_vk.sol";
+export * as stateSol from "./state.sol";
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk.sol/BaseUltraVerifier__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk.sol/BaseUltraVerifier__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8c5cff6346a7eda70a415786f43633d8562afc1c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk.sol/BaseUltraVerifier__factory.ts
@@ -0,0 +1,118 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  BaseUltraVerifier,
+  BaseUltraVerifierInterface,
+} from "../../../contracts/plonk_vk.sol/BaseUltraVerifier";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "INVALID_VERIFICATION_KEY",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "MOD_EXP_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "OPENING_COMMITMENT_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PAIRING_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PAIRING_PREAMBLE_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "POINT_NOT_ON_CURVE",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "expected",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "actual",
+        type: "uint256",
+      },
+    ],
+    name: "PUBLIC_INPUT_COUNT_INVALID",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_GE_P",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "_publicInputs",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class BaseUltraVerifier__factory {
+  static readonly abi = _abi;
+  static createInterface(): BaseUltraVerifierInterface {
+    return new Interface(_abi) as BaseUltraVerifierInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): BaseUltraVerifier {
+    return new Contract(address, _abi, runner) as unknown as BaseUltraVerifier;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk.sol/UltraVerifier__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk.sol/UltraVerifier__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6b0f66967ee82f6106ab42b8d8fdfe3e4de5dd4e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk.sol/UltraVerifier__factory.ts
@@ -0,0 +1,160 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../common";
+import type {
+  UltraVerifier,
+  UltraVerifierInterface,
+} from "../../../contracts/plonk_vk.sol/UltraVerifier";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "INVALID_VERIFICATION_KEY",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "MOD_EXP_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "OPENING_COMMITMENT_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PAIRING_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PAIRING_PREAMBLE_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "POINT_NOT_ON_CURVE",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "expected",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "actual",
+        type: "uint256",
+      },
+    ],
+    name: "PUBLIC_INPUT_COUNT_INVALID",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_GE_P",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "_publicInputs",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x608060405234801561000f575f80fd5b50620800006103805260116103a0527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd6103c0527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d82016103e0527f174c5c19a31444028bb6368ff05acd095502e7d022af18c746a364dab4c7346e610400527f2e6d6b74f09bdcf37e2be6f0a05552f34840f8693d1c73edce05639d0698ea36610420527f243678b1fa4062f90887453567ef78c256421a5907513427b5c52aa3cb1e6a17610440527f10425e273dc8dd43dbb983a295f7f990b9475fca570f56f1d7f972166e5bf0d8610460527f23b6836088c547e90ddfdb8146a5f7b3608aad75f4d0d5a050f119e6eea92c22610480527f0cafbde5fed53b2d75343797c5718363f54c3b391730f7b49a8ae09cd79b8b206104a0527f06acf52ef347e83eae253c24631c08d66d76669d97c0cce87b0320363e0188bd6104c0527f1f8257e9bfac704d9b0171c74f4f35ec94c608ae5ff55962db5bc4fd9e1aba896104e0527f11931c54c38fba5131f7a317e782a12a8e3e3726dc2eaa490049ce2ca8ca1cbb610500527f0565f2552174d90b7b0e9645969affd0015d483dffec9d93ede1b63be6dc3c16610520527f0bca92d0bac2e3d19be0265337ec7f4574f8195e313af04d651f342bb3159fb8610540527f1ecb4bbed3bfe4b4e91afe37b7871694eda583ff1d1111be20aa9eb8edf50a77610560527f0c1be01afc0073d9a1f1e23184a1d005a89d087265ea3a85f523ecd062212260610580527f25a9e732ab54e2ebe8d031c166997a26a5d5dc143dc246b4b046b170406da4f16105a0527f2498b2e14394f700cac156f42ef63ba194ed99764e03f2e433cb0be94d0fc89f6105c0527f206103c2ff58564c9a4746efd3fff7637a46052eb129af96844c2d850d11d8f36105e0527f212dfe13df5b9cfb846570ecf8269ed3648c24827e7dceafdeca6235e1dd5e38610600527f284d15304c372e9c33d76628c66bd6c48ef526d08146e9b401dc7d1e373ccd3a610620527f126a3a8e4c678d476c3c864cde50f9776d880443976f62a438b9db897b433ffa610640527f2866186a79faf6dde910250342628d6a7a1c6d32f88b1991b276852874bd73dc610660527f2bd3d50520f90ab39921a0f2ce6c8f5d5cc8a989720e939dbb4a8951d878f579610680527f0b5652d8de0be47d4a6496260931f15984d6cc0eb21e61c15991554eee8bfe916106a0527f135cdf64147af6820b82eff62e1e62efb848f20c81dffc2ed36cc4d3ef9d6ee36106c0527f16ce92a14e25ca8f353781ad6bf4c105139a2029c682b0e62606b721e9d8c8486106e0527f0c9177240c1a64d39bbdc9113347b71c8ad5899a9a617b70450e43ca0f08c0b9610700527f26486bfd9b1989300948793829dda7ebd3c783b85ef797363b15bdf9932d624f610720527f0933b476f487753e6b6a6c07579f099b3bd03e1d4fad080cdf864233e378e6f7610740527f19fa964521f482600ad8f48f2d74204aa35665cefec49c73255bcd7bb9cf1d2e610760527f1cadeb85ec1d913dbbebd04a2e9c216fffb782a908252de688cb3f87a9960239610780527f140ce35846522600428e89cedfc30ef4f906e759e4b262f982f41b11e232bef06107a0527f186c47255bd1cac8572abe17f302a4a778dc042d05b5ad10ec72ccf87db72cbd6107c0527f2696b8ea9abe2e21817826ff8ffdd70455306100f722aee5047d7b61d23be4706107e0527f203c78601f28e6739d2031447af9f5015f00e4a92298c8e0af4906929ce4aa23610800527f0b82d8af3657b8dacf80c03e267415e27c1b22c5b110041433f5f7a0077d6163610820527f1ca5d2fc76408b3d82cd070612b1f00b2910e92b606943f0a66d4064ac05d6f3610840527f12889680e44151655a6fb88176f0eb0e09e60039ec5cbc978bcb081ca4d41c1e610860527f269c3c1e6be15df4cd6e18678103fb6a22fc4e79890d0e7d18259353640bf580610880527f073ef16b8836c3c34ac6e02937c25aaf47728e8aaa50eea7a2a7e2d87b2a051c6108a0527f0642a0979a2c84f7f2c1ae9c5285e8b54bc1a57e51ec50588ec003e5ccaa1ef06108c0527f10759f71ebeb64070c9bde2e55126711646725544ef4273f9a391b9b9b0af13d6108e0527f05107532383658086d131205993b32158da27ddcf4a41708cf50e4e6ca986205610900527f1c67ba6b417eddf6928c56e1fece6ba9c73c4579c446ff0bd86e794121b4957c610920527f030c58a082fe2a8a256a3c7596ca585a024396e2377db7e854bf7f14514759b8610940527f1606bd0cae6fbb354de28025f6deb12a003c43b7dafa272c94b35c752ceaa696610960527f1e1a0bd62a0746fb76e5d6727d5db536662c58d163cf29375fff76b669856e5f610980527f0f786242d4fd388fd0e83bc4074cef1a36162d3403af146af654e72acb72e4c66109a05260016109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e05183828309846003868386090885838409148416935050815f5280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af157637e5769bf60e01b5f5260045ffd5b5050612bd880610b005f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c8063937f6a1014610038578063ea50d0e41461006b575b5f80fd5b6040517f066e0b06b13ec4c45dbeb0b625dbfab874ecdc411cdb43bae4346e880b09e16c81526020015b60405180910390f35b61007e610079366004612ae8565b61008e565b6040519015158152602001610062565b620800006103805260116103a0527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd6103c0527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d82016103e0527f174c5c19a31444028bb6368ff05acd095502e7d022af18c746a364dab4c7346e610400527f2e6d6b74f09bdcf37e2be6f0a05552f34840f8693d1c73edce05639d0698ea36610420527f243678b1fa4062f90887453567ef78c256421a5907513427b5c52aa3cb1e6a17610440527f10425e273dc8dd43dbb983a295f7f990b9475fca570f56f1d7f972166e5bf0d8610460527f23b6836088c547e90ddfdb8146a5f7b3608aad75f4d0d5a050f119e6eea92c22610480527f0cafbde5fed53b2d75343797c5718363f54c3b391730f7b49a8ae09cd79b8b206104a0527f06acf52ef347e83eae253c24631c08d66d76669d97c0cce87b0320363e0188bd6104c0527f1f8257e9bfac704d9b0171c74f4f35ec94c608ae5ff55962db5bc4fd9e1aba896104e0527f11931c54c38fba5131f7a317e782a12a8e3e3726dc2eaa490049ce2ca8ca1cbb610500527f0565f2552174d90b7b0e9645969affd0015d483dffec9d93ede1b63be6dc3c16610520527f0bca92d0bac2e3d19be0265337ec7f4574f8195e313af04d651f342bb3159fb8610540527f1ecb4bbed3bfe4b4e91afe37b7871694eda583ff1d1111be20aa9eb8edf50a77610560527f0c1be01afc0073d9a1f1e23184a1d005a89d087265ea3a85f523ecd062212260610580527f25a9e732ab54e2ebe8d031c166997a26a5d5dc143dc246b4b046b170406da4f16105a0527f2498b2e14394f700cac156f42ef63ba194ed99764e03f2e433cb0be94d0fc89f6105c0527f206103c2ff58564c9a4746efd3fff7637a46052eb129af96844c2d850d11d8f36105e0527f212dfe13df5b9cfb846570ecf8269ed3648c24827e7dceafdeca6235e1dd5e38610600527f284d15304c372e9c33d76628c66bd6c48ef526d08146e9b401dc7d1e373ccd3a610620527f126a3a8e4c678d476c3c864cde50f9776d880443976f62a438b9db897b433ffa610640527f2866186a79faf6dde910250342628d6a7a1c6d32f88b1991b276852874bd73dc610660527f2bd3d50520f90ab39921a0f2ce6c8f5d5cc8a989720e939dbb4a8951d878f579610680527f0b5652d8de0be47d4a6496260931f15984d6cc0eb21e61c15991554eee8bfe916106a0527f135cdf64147af6820b82eff62e1e62efb848f20c81dffc2ed36cc4d3ef9d6ee36106c0527f16ce92a14e25ca8f353781ad6bf4c105139a2029c682b0e62606b721e9d8c8486106e0527f0c9177240c1a64d39bbdc9113347b71c8ad5899a9a617b70450e43ca0f08c0b9610700527f26486bfd9b1989300948793829dda7ebd3c783b85ef797363b15bdf9932d624f610720527f0933b476f487753e6b6a6c07579f099b3bd03e1d4fad080cdf864233e378e6f7610740527f19fa964521f482600ad8f48f2d74204aa35665cefec49c73255bcd7bb9cf1d2e610760527f1cadeb85ec1d913dbbebd04a2e9c216fffb782a908252de688cb3f87a9960239610780527f140ce35846522600428e89cedfc30ef4f906e759e4b262f982f41b11e232bef06107a0527f186c47255bd1cac8572abe17f302a4a778dc042d05b5ad10ec72ccf87db72cbd6107c0527f2696b8ea9abe2e21817826ff8ffdd70455306100f722aee5047d7b61d23be4706107e0527f203c78601f28e6739d2031447af9f5015f00e4a92298c8e0af4906929ce4aa23610800527f0b82d8af3657b8dacf80c03e267415e27c1b22c5b110041433f5f7a0077d6163610820527f1ca5d2fc76408b3d82cd070612b1f00b2910e92b606943f0a66d4064ac05d6f3610840527f12889680e44151655a6fb88176f0eb0e09e60039ec5cbc978bcb081ca4d41c1e610860527f269c3c1e6be15df4cd6e18678103fb6a22fc4e79890d0e7d18259353640bf580610880527f073ef16b8836c3c34ac6e02937c25aaf47728e8aaa50eea7a2a7e2d87b2a051c6108a0527f0642a0979a2c84f7f2c1ae9c5285e8b54bc1a57e51ec50588ec003e5ccaa1ef06108c0527f10759f71ebeb64070c9bde2e55126711646725544ef4273f9a391b9b9b0af13d6108e0527f05107532383658086d131205993b32158da27ddcf4a41708cf50e4e6ca986205610900527f1c67ba6b417eddf6928c56e1fece6ba9c73c4579c446ff0bd86e794121b4957c610920527f030c58a082fe2a8a256a3c7596ca585a024396e2377db7e854bf7f14514759b8610940527f1606bd0cae6fbb354de28025f6deb12a003c43b7dafa272c94b35c752ceaa696610960527f1e1a0bd62a0746fb76e5d6727d5db536662c58d163cf29375fff76b669856e5f610980527f0f786242d4fd388fd0e83bc4074cef1a36162d3403af146af654e72acb72e4c66109a05260016109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321613300525f6103a05182811461089d576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d16576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d10577feba9f4a6000000000000000000000000000000000000000000000000000000005f5260045ffd5b50505050505b6103805160e01b5f526103a05160e01b60045260085f208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250805f526112e0516020526112c051604052611320516060526113005160805260a05f20905081810661260052805f5260016020535060215f90812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250805f526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e05261148051610100526101205f2090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610ece57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e8f565b50505080610efe577f374a972f000000000000000000000000000000000000000000000000000000005f5260045ffd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f3a578483840992508001610f25565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f71578483840992508001610f5c565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760205f526020805260206040528b8b8a0960605260028c036080528b60a05260205f60c05f60055afa611062577ff894a7bc000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f5198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700525f81905260016020538160215f20066127205260026020538160215f20066127405260036020538160215f20066127605260046020538160215f20066127805260056020538160215f20066127a05260066020538160215f20066127c05260076020538160215f20066127e05260086020538160215f20066128005260096020538160215f200661282052600a6020538160215f200661284052600b6020538160215f200661286052600c6020538160215f200661288052600d6020538160215f20066128a052600e6020538160215f20066128c052600f6020538160215f20066128e05260106020538160215f20066129005260116020538160215f20066129205260126020538160215f20066129405260136020538160215f20066129605260146020538160215f20066129805260156020538160215f20066129a05260166020538160215f20066129c05260176020538160215f20066129e05260186020538160215f2006612a005260196020538160215f2006612a2052601a6020538160215f2006612a4052601b6020538160215f2006612a6052601c6020538160215f2006612a8052601d6020538160215f2006612aa052601d6020535060215f908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611cb1576328f6b59560e21b5f5260045ffd5b50613160919091526131805261140051611420518482800985600387838609088683840914611ce9576328f6b59560e21b5f5260045ffd5b50815f528060205250506130405160405260406131a060605f60075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d46576328f6b59560e21b5f5260045ffd5b505f91909152602052613040518290800960405260406131a060605f60075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611da3576328f6b59560e21b5f5260045ffd5b505f91909152602052613040518290818180090960405260406131a060605f60075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e03576328f6b59560e21b5f5260045ffd5b50815f528060205250508161270051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611e67576328f6b59560e21b5f5260045ffd5b50815f528060205250508161272051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611ecb576328f6b59560e21b5f5260045ffd5b50815f528060205250508161274051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f2f576328f6b59560e21b5f5260045ffd5b50815f528060205250508161276051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611f93576328f6b59560e21b5f5260045ffd5b50815f528060205250508161278051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa8116905061134051611360518482830985600387838609088683840914611ff7576328f6b59560e21b5f5260045ffd5b50815f52806020525050816127a051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050611380516113a051848283098560038783860908868384091461205b576328f6b59560e21b5f5260045ffd5b50815f52806020525050816127c051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610400515f52610420516020526127e05160405260406131a060605f60075afa16604061316060808160065afa81169050610440515f52610460516020526128005160405260406131a060605f60075afa16604061316060808160065afa81169050610480515f526104a0516020526128205160405260406131a060605f60075afa16604061316060808160065afa811690506104c0515f526104e0516020526128405160405260406131a060605f60075afa16604061316060808160065afa81169050610500515f52610520516020526128605160405260406131a060605f60075afa16604061316060808160065afa81169050610540515f52610560516020526128805160405260406131a060605f60075afa16604061316060808160065afa81169050610580515f526105a0516020526128a05160405260406131a060605f60075afa16604061316060808160065afa811690506105c0515f526105e0516020526128c05160405260406131a060605f60075afa16604061316060808160065afa81169050610600515f52610620516020526128e05160405260406131a060605f60075afa16604061316060808160065afa81169050610640515f52610660516020526129005160405260406131a060605f60075afa16604061316060808160065afa81169050610680515f526106a0516020526129205160405260406131a060605f60075afa16604061316060808160065afa811690506106c0515f526106e0516020526129405160405260406131a060605f60075afa16604061316060808160065afa81169050610700515f52610720516020526129605160405260406131a060605f60075afa16604061316060808160065afa81169050610740515f52610760516020526129805160405260406131a060605f60075afa16604061316060808160065afa81169050610780515f526107a051602052816129a051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa811690506107c0515f526107e051602052816129c051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610800515f5261082051602052816129e051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610840515f526108605160205281612a0051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610880515f526108a051602052612a205160405260406131a060605f60075afa16604061316060808160065afa811690506108c0515f526108e051602052612a405160405260406131a060605f60075afa16604061316060808160065afa81169050610900515f5261092051602052612a605160405260406131a060605f60075afa16604061316060808160065afa81169050610940515f5261096051602052612a805160405260406131a060605f60075afa16604061316060808160065afa81169050610980515f526109a051602052612aa05160405260406131a060605f60075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa051098208905082613660518208905060015f5260026020528083036040525060406131a060605f60075afa16604061316060808160065afa16806127c3577f4e719763000000000000000000000000000000000000000000000000000000005f5260045ffd5b612b00516126c051612300516123205186828309876003898386090888838409146127f7576328f6b59560e21b5f5260045ffd5b50815f528060205250508060405260406131a060605f60075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612851576328f6b59560e21b5f5260045ffd5b50815f52806020525050836103c05185838509096040525060406131a060605f60075afa821691506040613220608061316060065afa82169150612300515f52612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e060805f60065afa82169150613200518403613200526109c051156129a65761340051613420518582830986600388838609088783840914612908576328f6b59560e21b5f5260045ffd5b505f919091526020528281800960405260406060805f60075afa8216915061344051613460518582830986600388838609088783840914612952576328f6b59560e21b5f5260045ffd5b505f91825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e060805f60065afa821691505b50806129d4577f01882d81000000000000000000000000000000000000000000000000000000005f5260045ffd5b613220515f52613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260205f6101805f60085afa90505f518116612adc577fd71fd263000000000000000000000000000000000000000000000000000000005f5260045ffd5b50505060015f5260205ff35b5f805f8060408587031215612afb575f80fd5b843567ffffffffffffffff80821115612b12575f80fd5b818701915087601f830112612b25575f80fd5b813581811115612b33575f80fd5b886020828501011115612b44575f80fd5b602092830196509450908601359080821115612b5e575f80fd5b818701915087601f830112612b71575f80fd5b813581811115612b7f575f80fd5b8860208260051b8501011115612b93575f80fd5b9598949750506020019450505056fea26469706673582212209a4c49841dc7bcec71646871c34f7848edf65f82a8cd92ccef9f38c78b575a6864736f6c63430008180033";
+
+type UltraVerifierConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: UltraVerifierConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class UltraVerifier__factory extends ContractFactory {
+  constructor(...args: UltraVerifierConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      UltraVerifier & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): UltraVerifier__factory {
+    return super.connect(runner) as UltraVerifier__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): UltraVerifierInterface {
+    return new Interface(_abi) as UltraVerifierInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): UltraVerifier {
+    return new Contract(address, _abi, runner) as unknown as UltraVerifier;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..22c64f0e4f2f3f97f9d11550a44a7621d8a3eca2
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { BaseUltraVerifier__factory } from "./BaseUltraVerifier__factory";
+export { UltraVerifier__factory } from "./UltraVerifier__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/BaseUltraVerifier__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/BaseUltraVerifier__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e611a92736e8ae127df16633b3878305935ec553
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/BaseUltraVerifier__factory.ts
@@ -0,0 +1,104 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Signer, utils } from "ethers";
+import type { Provider } from "@ethersproject/providers";
+import type {
+  BaseUltraVerifier,
+  BaseUltraVerifierInterface,
+} from "../../../contracts/plonk_vk_inner.sol/BaseUltraVerifier";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "EC_SCALAR_MUL_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "MOD_EXP_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PROOF_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "expected",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "actual",
+        type: "uint256",
+      },
+    ],
+    name: "PUBLIC_INPUT_COUNT_INVALID",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_GE_P",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "_publicInputs",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class BaseUltraVerifier__factory {
+  static readonly abi = _abi;
+  static createInterface(): BaseUltraVerifierInterface {
+    return new utils.Interface(_abi) as BaseUltraVerifierInterface;
+  }
+  static connect(
+    address: string,
+    signerOrProvider: Signer | Provider
+  ): BaseUltraVerifier {
+    return new Contract(address, _abi, signerOrProvider) as BaseUltraVerifier;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/UltraVerifierInner__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/UltraVerifierInner__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..78087fdd9ade22cd94005629fc4d503e57e69a8c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/UltraVerifierInner__factory.ts
@@ -0,0 +1,141 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers";
+import type { Provider, TransactionRequest } from "@ethersproject/providers";
+import type { PromiseOrValue } from "../../../common";
+import type {
+  UltraVerifierInner,
+  UltraVerifierInnerInterface,
+} from "../../../contracts/plonk_vk_inner.sol/UltraVerifierInner";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "EC_SCALAR_MUL_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "MOD_EXP_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PROOF_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "expected",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "actual",
+        type: "uint256",
+      },
+    ],
+    name: "PUBLIC_INPUT_COUNT_INVALID",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_GE_P",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "_publicInputs",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x608060405234801561001057600080fd5b50612dea806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f806bdbe413d2c453085803df1c498c6532076ed4d82173fe65c591b77d1fb10481526020015b60405180910390f35b61008161007c366004612cef565b610091565b6040519015158152602001610065565b620200006103805260016103a0527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e56103c0527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f53608016103e0527f105ef4bf7e21c11fe8b11d58f645b1553c7f7173a22221cc3adf994cf8f784db610400527f1f3c3ae7f2b7d98fb7370c4beeb0532b79903ca85ac4d52f7612a264e89ffc31610420527f26350348f73bb6262b6720c63f447efc64cd82f6ba5e4724f64e535bf225b471610440527f2cb87b9c2efcb8a7cf7a9ee2785ba25b7301bce07f7c9f9b66cdd1af678e578f610460527f18ff15b3dd9f466b4489e984d34351d1be03b7a35fe1050fddd7ec021612a048610480527f09ccb52fff357d9602491beb667edebe9647a0b4a3ed10263d8099e516b43d906104a0527f1432b8dc9eb743c28973e0c84d52ce6083de9ce7d86692f4a2bce6e83077b24d6104c0527f2c9be716b9a31aa34ee4a67701fe9b20c3e1c1c9b4590c99ba575546169e9cce6104e0527f0afb97913f91107453646fc32944e6357d08ba096879886c5da447762f0fd530610500527f0dfb0282fd49d8b37e96141e3a325a8e7961eff4df095dcfc8cadefe43a0624b610520527f26986352b3aa00fb5917e27e16e8154ad7f8e909e8223de8b340b280fdb87eda610540527f05274a30479543de8a5e2b1b24a9522f8d149dcc946f151e5126d6b47d9b7a58610560527f2d9f55bbf4fb44dbd8720e3b364c5b4394f61db40a732b8f6b69295aa44ef4f4610580527f12f8b7e313a6a14ac29357e3b7221df2d14eb22ed922d907201b4b09d88de3ea6105a0527f02596518c815477b7cd4871780ee653a1a8ec5be268c12625688963fe53c60106105c0527f258bcb7c4234bc512c332e8f662a29950cc8f54e8b3187f979c6c9490ce900646105e0527f1b44b694a93f315b73d6e68c73e5544e9a090aea17f5a553e44690eaca0ac11d610600527f14334ae3b69a24777b92147432a021e277403ba38fe43a5f3182fda057c7ce29610620527f039447a9c41b41bb11fe1c932de47a160fda876ac52c91023b20ada9b04ed975610640527f19ee437755067885cfb2c8869d78eeeb0668cc74d63ef731d4a2e17527a4ae34610660527f2e3a5a80287c8050c957b544f28f229fa36e087d7b8bf747b37b55d9ccbbfad8610680527f04cf1842c0a8c7f69ce8487f13a0318269ef2aa88522c23dbfa9afb4c598707c6106a0527f12b67554c50d335337a13b91e66b7b7640f0e969830ec5ca8a97c2a38d89c5f26106c0527f131decaa34471bc49a556ca3e38997dcc5aeffbaa9c25b2b10e04cec0b1236bd6106e0527f1583a09a3d2e1e9e0a7da4af8c782d1c56b867dd55b4d0ea75017af4c2ed4feb610700527f04280e6e6bb8a88885b2f6bb31a491c53959a276c0cf9eb24896aaa6d812b55b610720527f0b42c2ea83bf1ebe5675605d27508abbc908279a95d50e49d84f5b7639b95e6f610740527f25db65118207b43afd3979d940420cc28753f56493cf1243d97aadfd8e626630610760527f222f608ba717aacecff8cc0f6d521666955f6a416d7ba509a6f0e87bb79d98b4610780527f20c09c9fa9fd04ea558af3a015c10569b08a558fb5393644098ec898af3f267c6107a0527f0ca7c7bee074a875d03dd2d2ef8595787eb02b4c60da924c054b3a3f2dee2c106107c0527f1383e5e275da0d0535a37e719f0f724c554640e02a9b40382c615d8434fca9bc6107e0527f0692fcc741a1fc3d7b9672f090b8d838e52a83255773b559d41753eaf89658b7610800527f0d3a6cde8eb9f9050b59b8ccfb142167b767d5087fe95dbda8687bee8574936f610820527f2ddefd342b00474b2473682fe22ec5569d7bb6955e880f387b244197180a5b51610840527f1fd976b7def713aa2bf17764839b82e955d00da63770c8031b673b4c8bf462dc610860527f11064f301cb46e9071b2b2aef3524a71718132ee069a86ff76d43485c231e619610880527f198e6b0d4e76fc221c3a10d96384e74da28d928495c03812cecebf6b2e5cae876108a0527f29e7df2c9ab91de919ba07f01696f3fd3a173f67daaf719bda36ace96b800cab6108c0527f11f9a63dfc22114cdb29d5b9b15ac80fa882b1c99ff57d3c50a47f043ff937346108e0527f2f4f753ffa5913992e867209bb5d4cec2070f9f5e2648e446aa8d94e2378a2b1610900527f222c7f781c0113d77e8f850611c352b271f715714f709f2aa0952e3d190c26a6610920527f10c91799ed1e977535dbaa489a23a60766b21a925eadc19fb08950e1ec7115ee610940527f2b8e4ff914483b1fb476cee9e7d01ab1452ab2bcadb1922c5486a929415edb8a610960527f038bedcca5da3cfb5f0bb3d4fb6cb64ce2679c0e7e728f2d7bf27188133913b0610980527f23f69e217da373998ced722e180c761aabb38e070d0be68836037c32f51627616109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22613400526103a0518281146108a1576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1c576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361350052826135205281613540528061356052868110878410168783108886101616610d16577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061358052602480350160206103a05102808260206135800137600435602401915060c0826135a083013760e0016135802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096134205282816134205109613440528281613440510961346052806134805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610edc57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9d565b50505080610f0e577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f4a578483840992508001610f35565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f81578483840992508001610f6c565b50508061304052826001840382089050613400518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611077577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613780528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096134805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096134805109870382089050856126405161348051096134805285868788613060518a0361208051086130c0510961348051098208905085612640516134805109613480528586878860018a036116a051086130a05109613480510982086136005250505050508061264051613480510961348052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161342051098381850383089150836120a05183099150838461314051830983089150508261348051848386038508096136205250508061344051613480510961348052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613480510961364052505080613420516134805109613480526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866134805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516134805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613420516134805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613440516134805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961366052505061346051613480518392500961348052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261348051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613480510984856117605187036001088509099150826117e0518484840809613680525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613480518209905082836126405161348051098309915082611760518209905082611760518309915082836117e0518585850809613680510861368052505080613460516134805109613480528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096136c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096136e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161374052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861372052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161370052505083611620518503612000510892508361164051850385868488036001088609089250836117005161372051099150838461174051850983089150838461176051613740510983089150836116e0518309915083846117a051613700510983089150836136c05183089250836136e05184089250836118005184099250836134805184099250826136a05283613440516134805109613480525050508061378051826136a0518461368051866136605188613640518a61362051613600510808080808096137608190526126e0516137a08190526137c0919091526102e460043501610520816137e03750506105606137a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914935050816131605280602061316001525050611400516114205184828309856003878386090886838409148416935050816000528060205250506130405160405260406131a06060600060075afa16604061316060808160065afa81169050611440516114605184828309856003878386090886838409148416935050816000528060205250508161304051613040510960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a05184828309856003878386090886838409148416935050816000528060205250508161304051836130405161304051090960405260406131a06060600060075afa16604061316060808160065afa81169050611200516112205184828309856003878386090886838409148416935050816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611240516112605184828309856003878386090886838409148416935050816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a05184828309856003878386090886838409148416935050816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e05184828309856003878386090886838409148416935050816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611300516113205184828309856003878386090886838409148416935050816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061134051611360518482830985600387838609088683840914841693505081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a0518482830985600387838609088683840914841693505081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610400516104205184828309856003878386090886838409148416935050816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa81169050610440516104605184828309856003878386090886838409148416935050816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a05184828309856003878386090886838409148416935050816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e05184828309856003878386090886838409148416935050816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa81169050610500516105205184828309856003878386090886838409148416935050816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa81169050610540516105605184828309856003878386090886838409148416935050816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a05184828309856003878386090886838409148416935050816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e05184828309856003878386090886838409148416935050816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa81169050610600516106205184828309856003878386090886838409148416935050816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa81169050610640516106605184828309856003878386090886838409148416935050816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a05184828309856003878386090886838409148416935050816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e05184828309856003878386090886838409148416935050816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa81169050610700516107205184828309856003878386090886838409148416935050816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa81169050610740516107605184828309856003878386090886838409148416935050816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a0518482830985600387838609088683840914841693505081600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e0518482830985600387838609088683840914841693505081600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061080051610820518482830985600387838609088683840914841693505081600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506108405161086051848283098560038783860908868384091484169350508160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a0518482830985600387838609088683840914841693505081600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e0518482830985600387838609088683840914841693505081600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa8116905061090051610920518482830985600387838609088683840914841693505081600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa8116905061094051610960518482830985600387838609088683840914841693505081600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a0518482830985600387838609088683840914841693505081600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826137605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16613360819052612b00516126c05161230051612320518682800987600389838609088883840914955050816000528060205250508060405260406131a06060600060075afa831692506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914861695505081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612b845761350051613520518582830986600388838609088783840914851694505081600052806020525050828182096040526040606080600060075afa8216915061354051613560518582830986600388838609088783840914851694505081600052806020525050604060006060600060075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612bb4577ff755f3690000000000000000000000000000000000000000000000000000000060005260046000fd5b806133805261322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa9050806133a0526000516133c05250505061336051613380516133c0516133a051161616612ce4577f0711fcec0000000000000000000000000000000000000000000000000000000060005260046000fd5b600160005260206000f35b60008060008060408587031215612d0557600080fd5b843567ffffffffffffffff80821115612d1d57600080fd5b818701915087601f830112612d3157600080fd5b813581811115612d4057600080fd5b886020828501011115612d5257600080fd5b602092830196509450908601359080821115612d6d57600080fd5b818701915087601f830112612d8157600080fd5b813581811115612d9057600080fd5b8860208260051b8501011115612da557600080fd5b9598949750506020019450505056fea26469706673582212201f39f713d734646e3cf3d0cfb388213cf2c2c51b3641be3b62e3448dad80c30664736f6c634300080a0033";
+
+type UltraVerifierInnerConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: UltraVerifierInnerConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class UltraVerifierInner__factory extends ContractFactory {
+  constructor(...args: UltraVerifierInnerConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override deploy(
+    overrides?: Overrides & { from?: PromiseOrValue<string> }
+  ): Promise<UltraVerifierInner> {
+    return super.deploy(overrides || {}) as Promise<UltraVerifierInner>;
+  }
+  override getDeployTransaction(
+    overrides?: Overrides & { from?: PromiseOrValue<string> }
+  ): TransactionRequest {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override attach(address: string): UltraVerifierInner {
+    return super.attach(address) as UltraVerifierInner;
+  }
+  override connect(signer: Signer): UltraVerifierInner__factory {
+    return super.connect(signer) as UltraVerifierInner__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): UltraVerifierInnerInterface {
+    return new utils.Interface(_abi) as UltraVerifierInnerInterface;
+  }
+  static connect(
+    address: string,
+    signerOrProvider: Signer | Provider
+  ): UltraVerifierInner {
+    return new Contract(address, _abi, signerOrProvider) as UltraVerifierInner;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/UltraVerifier__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/UltraVerifier__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dabb7e48f63c8acbf4376b2654cbca7f854c8a15
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/UltraVerifier__factory.ts
@@ -0,0 +1,141 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers";
+import type { Provider, TransactionRequest } from "@ethersproject/providers";
+import type { PromiseOrValue } from "../../../common";
+import type {
+  UltraVerifier,
+  UltraVerifierInterface,
+} from "../../../contracts/plonk_vk_inner.sol/UltraVerifier";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "EC_SCALAR_MUL_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "MOD_EXP_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PROOF_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "expected",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "actual",
+        type: "uint256",
+      },
+    ],
+    name: "PUBLIC_INPUT_COUNT_INVALID",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_GE_P",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "_publicInputs",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x608060405234801561001057600080fd5b50612dea806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f806bdbe413d2c453085803df1c498c6532076ed4d82173fe65c591b77d1fb10481526020015b60405180910390f35b61008161007c366004612cef565b610091565b6040519015158152602001610065565b620200006103805260016103a0527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e56103c0527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f53608016103e0527f105ef4bf7e21c11fe8b11d58f645b1553c7f7173a22221cc3adf994cf8f784db610400527f1f3c3ae7f2b7d98fb7370c4beeb0532b79903ca85ac4d52f7612a264e89ffc31610420527f26350348f73bb6262b6720c63f447efc64cd82f6ba5e4724f64e535bf225b471610440527f2cb87b9c2efcb8a7cf7a9ee2785ba25b7301bce07f7c9f9b66cdd1af678e578f610460527f18ff15b3dd9f466b4489e984d34351d1be03b7a35fe1050fddd7ec021612a048610480527f09ccb52fff357d9602491beb667edebe9647a0b4a3ed10263d8099e516b43d906104a0527f1432b8dc9eb743c28973e0c84d52ce6083de9ce7d86692f4a2bce6e83077b24d6104c0527f2c9be716b9a31aa34ee4a67701fe9b20c3e1c1c9b4590c99ba575546169e9cce6104e0527f0afb97913f91107453646fc32944e6357d08ba096879886c5da447762f0fd530610500527f0dfb0282fd49d8b37e96141e3a325a8e7961eff4df095dcfc8cadefe43a0624b610520527f26986352b3aa00fb5917e27e16e8154ad7f8e909e8223de8b340b280fdb87eda610540527f05274a30479543de8a5e2b1b24a9522f8d149dcc946f151e5126d6b47d9b7a58610560527f2d9f55bbf4fb44dbd8720e3b364c5b4394f61db40a732b8f6b69295aa44ef4f4610580527f12f8b7e313a6a14ac29357e3b7221df2d14eb22ed922d907201b4b09d88de3ea6105a0527f02596518c815477b7cd4871780ee653a1a8ec5be268c12625688963fe53c60106105c0527f258bcb7c4234bc512c332e8f662a29950cc8f54e8b3187f979c6c9490ce900646105e0527f1b44b694a93f315b73d6e68c73e5544e9a090aea17f5a553e44690eaca0ac11d610600527f14334ae3b69a24777b92147432a021e277403ba38fe43a5f3182fda057c7ce29610620527f039447a9c41b41bb11fe1c932de47a160fda876ac52c91023b20ada9b04ed975610640527f19ee437755067885cfb2c8869d78eeeb0668cc74d63ef731d4a2e17527a4ae34610660527f2e3a5a80287c8050c957b544f28f229fa36e087d7b8bf747b37b55d9ccbbfad8610680527f04cf1842c0a8c7f69ce8487f13a0318269ef2aa88522c23dbfa9afb4c598707c6106a0527f12b67554c50d335337a13b91e66b7b7640f0e969830ec5ca8a97c2a38d89c5f26106c0527f131decaa34471bc49a556ca3e38997dcc5aeffbaa9c25b2b10e04cec0b1236bd6106e0527f1583a09a3d2e1e9e0a7da4af8c782d1c56b867dd55b4d0ea75017af4c2ed4feb610700527f04280e6e6bb8a88885b2f6bb31a491c53959a276c0cf9eb24896aaa6d812b55b610720527f0b42c2ea83bf1ebe5675605d27508abbc908279a95d50e49d84f5b7639b95e6f610740527f25db65118207b43afd3979d940420cc28753f56493cf1243d97aadfd8e626630610760527f222f608ba717aacecff8cc0f6d521666955f6a416d7ba509a6f0e87bb79d98b4610780527f20c09c9fa9fd04ea558af3a015c10569b08a558fb5393644098ec898af3f267c6107a0527f0ca7c7bee074a875d03dd2d2ef8595787eb02b4c60da924c054b3a3f2dee2c106107c0527f1383e5e275da0d0535a37e719f0f724c554640e02a9b40382c615d8434fca9bc6107e0527f0692fcc741a1fc3d7b9672f090b8d838e52a83255773b559d41753eaf89658b7610800527f0d3a6cde8eb9f9050b59b8ccfb142167b767d5087fe95dbda8687bee8574936f610820527f2ddefd342b00474b2473682fe22ec5569d7bb6955e880f387b244197180a5b51610840527f1fd976b7def713aa2bf17764839b82e955d00da63770c8031b673b4c8bf462dc610860527f11064f301cb46e9071b2b2aef3524a71718132ee069a86ff76d43485c231e619610880527f198e6b0d4e76fc221c3a10d96384e74da28d928495c03812cecebf6b2e5cae876108a0527f29e7df2c9ab91de919ba07f01696f3fd3a173f67daaf719bda36ace96b800cab6108c0527f11f9a63dfc22114cdb29d5b9b15ac80fa882b1c99ff57d3c50a47f043ff937346108e0527f2f4f753ffa5913992e867209bb5d4cec2070f9f5e2648e446aa8d94e2378a2b1610900527f222c7f781c0113d77e8f850611c352b271f715714f709f2aa0952e3d190c26a6610920527f10c91799ed1e977535dbaa489a23a60766b21a925eadc19fb08950e1ec7115ee610940527f2b8e4ff914483b1fb476cee9e7d01ab1452ab2bcadb1922c5486a929415edb8a610960527f038bedcca5da3cfb5f0bb3d4fb6cb64ce2679c0e7e728f2d7bf27188133913b0610980527f23f69e217da373998ced722e180c761aabb38e070d0be68836037c32f51627616109a05260006109c08190526109e08190527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22613400526103a0518281146108a1576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1c576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361350052826135205281613540528061356052868110878410168783108886101616610d16577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061358052602480350160206103a05102808260206135800137600435602401915060c0826135a083013760e0016135802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096134205282816134205109613440528281613440510961346052806134805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610edc57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9d565b50505080610f0e577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f4a578483840992508001610f35565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f81578483840992508001610f6c565b50508061304052826001840382089050613400518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611077577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613780528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096134805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096134805109870382089050856126405161348051096134805285868788613060518a0361208051086130c0510961348051098208905085612640516134805109613480528586878860018a036116a051086130a05109613480510982086136005250505050508061264051613480510961348052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161342051098381850383089150836120a05183099150838461314051830983089150508261348051848386038508096136205250508061344051613480510961348052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613480510961364052505080613420516134805109613480526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866134805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516134805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613420516134805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613440516134805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961366052505061346051613480518392500961348052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261348051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613480510984856117605187036001088509099150826117e0518484840809613680525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613480518209905082836126405161348051098309915082611760518209905082611760518309915082836117e0518585850809613680510861368052505080613460516134805109613480528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096136c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096136e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161374052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861372052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161370052505083611620518503612000510892508361164051850385868488036001088609089250836117005161372051099150838461174051850983089150838461176051613740510983089150836116e0518309915083846117a051613700510983089150836136c05183089250836136e05184089250836118005184099250836134805184099250826136a05283613440516134805109613480525050508061378051826136a0518461368051866136605188613640518a61362051613600510808080808096137608190526126e0516137a08190526137c0919091526102e460043501610520816137e03750506105606137a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914935050816131605280602061316001525050611400516114205184828309856003878386090886838409148416935050816000528060205250506130405160405260406131a06060600060075afa16604061316060808160065afa81169050611440516114605184828309856003878386090886838409148416935050816000528060205250508161304051613040510960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a05184828309856003878386090886838409148416935050816000528060205250508161304051836130405161304051090960405260406131a06060600060075afa16604061316060808160065afa81169050611200516112205184828309856003878386090886838409148416935050816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611240516112605184828309856003878386090886838409148416935050816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a05184828309856003878386090886838409148416935050816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e05184828309856003878386090886838409148416935050816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611300516113205184828309856003878386090886838409148416935050816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061134051611360518482830985600387838609088683840914841693505081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a0518482830985600387838609088683840914841693505081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610400516104205184828309856003878386090886838409148416935050816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa81169050610440516104605184828309856003878386090886838409148416935050816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a05184828309856003878386090886838409148416935050816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e05184828309856003878386090886838409148416935050816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa81169050610500516105205184828309856003878386090886838409148416935050816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa81169050610540516105605184828309856003878386090886838409148416935050816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a05184828309856003878386090886838409148416935050816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e05184828309856003878386090886838409148416935050816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa81169050610600516106205184828309856003878386090886838409148416935050816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa81169050610640516106605184828309856003878386090886838409148416935050816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a05184828309856003878386090886838409148416935050816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e05184828309856003878386090886838409148416935050816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa81169050610700516107205184828309856003878386090886838409148416935050816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa81169050610740516107605184828309856003878386090886838409148416935050816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a0518482830985600387838609088683840914841693505081600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e0518482830985600387838609088683840914841693505081600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061080051610820518482830985600387838609088683840914841693505081600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506108405161086051848283098560038783860908868384091484169350508160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a0518482830985600387838609088683840914841693505081600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e0518482830985600387838609088683840914841693505081600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa8116905061090051610920518482830985600387838609088683840914841693505081600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa8116905061094051610960518482830985600387838609088683840914841693505081600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a0518482830985600387838609088683840914841693505081600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826137605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16613360819052612b00516126c05161230051612320518682800987600389838609088883840914955050816000528060205250508060405260406131a06060600060075afa831692506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914861695505081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612b845761350051613520518582830986600388838609088783840914851694505081600052806020525050828182096040526040606080600060075afa8216915061354051613560518582830986600388838609088783840914851694505081600052806020525050604060006060600060075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612bb4577ff755f3690000000000000000000000000000000000000000000000000000000060005260046000fd5b806133805261322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa9050806133a0526000516133c05250505061336051613380516133c0516133a051161616612ce4577f0711fcec0000000000000000000000000000000000000000000000000000000060005260046000fd5b600160005260206000f35b60008060008060408587031215612d0557600080fd5b843567ffffffffffffffff80821115612d1d57600080fd5b818701915087601f830112612d3157600080fd5b813581811115612d4057600080fd5b886020828501011115612d5257600080fd5b602092830196509450908601359080821115612d6d57600080fd5b818701915087601f830112612d8157600080fd5b813581811115612d9057600080fd5b8860208260051b8501011115612da557600080fd5b9598949750506020019450505056fea2646970667358221220536df524766df9ac106c474560104536011df9c395f863a42c144680ca3d78fd64736f6c634300080a0033";
+
+type UltraVerifierConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: UltraVerifierConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class UltraVerifier__factory extends ContractFactory {
+  constructor(...args: UltraVerifierConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override deploy(
+    overrides?: Overrides & { from?: PromiseOrValue<string> }
+  ): Promise<UltraVerifier> {
+    return super.deploy(overrides || {}) as Promise<UltraVerifier>;
+  }
+  override getDeployTransaction(
+    overrides?: Overrides & { from?: PromiseOrValue<string> }
+  ): TransactionRequest {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override attach(address: string): UltraVerifier {
+    return super.attach(address) as UltraVerifier;
+  }
+  override connect(signer: Signer): UltraVerifier__factory {
+    return super.connect(signer) as UltraVerifier__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): UltraVerifierInterface {
+    return new utils.Interface(_abi) as UltraVerifierInterface;
+  }
+  static connect(
+    address: string,
+    signerOrProvider: Signer | Provider
+  ): UltraVerifier {
+    return new Contract(address, _abi, signerOrProvider) as UltraVerifier;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f4b6f5f2d0f26ab06bac7792f96e8f0be5b35456
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_inner.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { BaseUltraVerifier__factory } from "./BaseUltraVerifier__factory";
+export { UltraVerifierInner__factory } from "./UltraVerifierInner__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/BaseUltraVerifier__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/BaseUltraVerifier__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9d5c7c6d63b867b5ca51b9044dffcde533b16719
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/BaseUltraVerifier__factory.ts
@@ -0,0 +1,104 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Signer, utils } from "ethers";
+import type { Provider } from "@ethersproject/providers";
+import type {
+  BaseUltraVerifier,
+  BaseUltraVerifierInterface,
+} from "../../../contracts/plonk_vk_outer.sol/BaseUltraVerifier";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "EC_SCALAR_MUL_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "MOD_EXP_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PROOF_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "expected",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "actual",
+        type: "uint256",
+      },
+    ],
+    name: "PUBLIC_INPUT_COUNT_INVALID",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_GE_P",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "_publicInputs",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class BaseUltraVerifier__factory {
+  static readonly abi = _abi;
+  static createInterface(): BaseUltraVerifierInterface {
+    return new utils.Interface(_abi) as BaseUltraVerifierInterface;
+  }
+  static connect(
+    address: string,
+    signerOrProvider: Signer | Provider
+  ): BaseUltraVerifier {
+    return new Contract(address, _abi, signerOrProvider) as BaseUltraVerifier;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/UltraVerifierOuter__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/UltraVerifierOuter__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..642ea34600d5f6a28bae617e5ca1037694d87935
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/UltraVerifierOuter__factory.ts
@@ -0,0 +1,141 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers";
+import type { Provider, TransactionRequest } from "@ethersproject/providers";
+import type { PromiseOrValue } from "../../../common";
+import type {
+  UltraVerifierOuter,
+  UltraVerifierOuterInterface,
+} from "../../../contracts/plonk_vk_outer.sol/UltraVerifierOuter";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "EC_SCALAR_MUL_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "MOD_EXP_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PROOF_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "expected",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "actual",
+        type: "uint256",
+      },
+    ],
+    name: "PUBLIC_INPUT_COUNT_INVALID",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_GE_P",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "_publicInputs",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x608060405234801561001057600080fd5b50612dea806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f8352d37a558fdedcdfc81147e8d52b2703b3ef7c0d8f9b33959496261e898a0481526020015b60405180910390f35b61008161007c366004612cef565b610091565b6040519015158152602001610065565b620800006103805260116103a0527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd6103c0527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d82016103e0527f2f01c4ff7bcf64d6737e51c0e6bcdd1cb75d604f1357497a22223e220dafeb5f610400527f131c602f657d8bc07cd86629877cc206a4b71f8efe38162635c945af48bf8421610420527f2cd39d3aa011bc980379d89c926fbaa4ad476cc3cc3c4747bd15fdf67bf39c66610440527f0b54d9d61011224a78310dca359d0003bc8048b092d71dfc7141c1e44b691278610460527f028202acd9b70aa443cfc9856f1beab05680b79d16a84af8781345dccba50785610480527f2b962a0406e189dad5b6a67b07dfd36724fdd9ba4e24f09c09f73db87b8052f76104a0527f1b2546695231b99d3371803a2669102c08c20253ff1e8bbd1fc713f6394a28c66104c0527f013648d6a1a858dd8a354300a46742d513b8e3e202df2bdc127b0eb96533d74c6104e0527f29f34a0a4e607143946f3860402716b510716d93a4507036d0fce0f1e721fa0b610500527f2476c2f4548052b9cba2489b747d172394195f16a6b0fffc6c12862f5a45284c610520527f1cac590393951509f6cda74c176df36a01a195871f31eee37fe308ee2c45106a610540527f26478cbd3443a9fd1888309ad1b91746b29a876cd36a11da695aeaa3f89179a1610560527f166a40651bd5eda1692d07866511909391017e4686aebf32cdfd5cb164ffdcd6610580527f124616afe7a9b67e073ac6ad8ef2e6a7561cf56b6421f102db6ce16e9cd6eeb76105a0527f02bdce0743e4c073899da240139644a5cf9cdfc7ee95ebd01caf89d18d1df9466105c0527f3011dbfbec90f92312c6091b37ba98e0e63c3858073e35c5fc6245f441c9206a6105e0527f0280beb4de85fc064e185999662b8c5ff8ae40883c3bb888922d20efeb574955610600527f114cb9dced0a0d3abd1b7267a11c3db4f62173e5bcaeda0761499ff4d7ec1c11610620527f0e07c8f9c66159d2f9dfa63d8da7f38b8e88f6e879d22ec46f50efa7a9a9e22e610640527f203b938d851d88566b121067939e4bfacfe52421297557862cafc77801364eb4610660527f0fca7eb0f2a339343150f9b51b5cb6516a19b5baeb91ffaea8e3f7915196e0e5610680527f29532eaec020e339322ff0378240c90298f99b4d84dedb46c436682d1fff87ae6106a0527f169958bc5af2a15f0984ec5d936c07bed333bab5acb62c37d801f749053480196106c0527f2cbec49069bfb20e7726ca1ff28d68b64b46b7ac7ee619c084714770edc75d956106e0527f20fc6dabb3cdded4a910ddd200db071067b44a36d6efceec219d4e71e29d1adc610700527f2390574fae39d24b930e9a1ac12f5828605a2b3b12100d6eb2d328b439cae520610720527f192de3ff3c6b0ce5e01a534b8e9ec852005d2f3634fc5aa1748494d5add00c09610740527f22fe04d69c4c7f938196dffd2552ce8c4f15ab038f2779f76cb596b575a7c037610760527f1cadeb85ec1d913dbbebd04a2e9c216fffb782a908252de688cb3f87a9960239610780527f140ce35846522600428e89cedfc30ef4f906e759e4b262f982f41b11e232bef06107a0527f186c47255bd1cac8572abe17f302a4a778dc042d05b5ad10ec72ccf87db72cbd6107c0527f2696b8ea9abe2e21817826ff8ffdd70455306100f722aee5047d7b61d23be4706107e0527f203c78601f28e6739d2031447af9f5015f00e4a92298c8e0af4906929ce4aa23610800527f0b82d8af3657b8dacf80c03e267415e27c1b22c5b110041433f5f7a0077d6163610820527f1ca5d2fc76408b3d82cd070612b1f00b2910e92b606943f0a66d4064ac05d6f3610840527f12889680e44151655a6fb88176f0eb0e09e60039ec5cbc978bcb081ca4d41c1e610860527f02f575b94cf1709447ed1f42c9334e6573674f64a6b093893e6ca6e3cff758f8610880527f093057b2f2daa6dcd3a1731731824f77fdaffd03b4642fd19d422a0eba3d3ca16108a0527f16976448b1d98c419b4199f963ed6e7c577b86fd643944636aebe9415c6c23926108c0527f1e752da483356c3ffe692d039747ffc95887801c2e4d9d311aa6711554c1d07a6108e0527f0c03d48c2216fbe761d33e94f12bb90e29c5e102076fa4fce16e99d638555f96610900527f1ee6af66806a0e0ae56ec149a0c80e5e2304d2e8f326b46bd8776e02dec4d14f610920527f086e4e6fe2b03022ac2c432ae1041bdc5521e93b6385153d87d585d2c286e437610940527f1f19610be242456719151038ced2e3f37af595dce25bed42930cc45dc4439642610960527f0aa7e407c3f13a1e954805f23c39703b03d02dbe88bcbc9b584082ee018192fa610980527f0767689123d0dd000f36a05c1cd5494e36fd8bc82299ea290d5b4e892ced4ec86109a05260016109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca5353216134005260006103a0518281146108a1576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1c576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361350052826135205281613540528061356052868110878410168783108886101616610d16577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061358052602480350160206103a05102808260206135800137600435602401915060c0826135a083013760e0016135802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096134205282816134205109613440528281613440510961346052806134805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610edc57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9d565b50505080610f0e577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f4a578483840992508001610f35565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f81578483840992508001610f6c565b50508061304052826001840382089050613400518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611077577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613780528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096134805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096134805109870382089050856126405161348051096134805285868788613060518a0361208051086130c0510961348051098208905085612640516134805109613480528586878860018a036116a051086130a05109613480510982086136005250505050508061264051613480510961348052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161342051098381850383089150836120a05183099150838461314051830983089150508261348051848386038508096136205250508061344051613480510961348052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613480510961364052505080613420516134805109613480526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866134805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516134805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613420516134805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613440516134805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961366052505061346051613480518392500961348052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261348051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613480510984856117605187036001088509099150826117e0518484840809613680525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613480518209905082836126405161348051098309915082611760518209905082611760518309915082836117e0518585850809613680510861368052505080613460516134805109613480528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096136c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096136e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161374052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861372052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161370052505083611620518503612000510892508361164051850385868488036001088609089250836117005161372051099150838461174051850983089150838461176051613740510983089150836116e0518309915083846117a051613700510983089150836136c05183089250836136e05184089250836118005184099250836134805184099250826136a05283613440516134805109613480525050508061378051826136a0518461368051866136605188613640518a61362051613600510808080808096137608190526126e0516137a08190526137c0919091526102e460043501610520816137e03750506105606137a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914935050816131605280602061316001525050611400516114205184828309856003878386090886838409148416935050816000528060205250506130405160405260406131a06060600060075afa16604061316060808160065afa81169050611440516114605184828309856003878386090886838409148416935050816000528060205250508161304051613040510960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a05184828309856003878386090886838409148416935050816000528060205250508161304051836130405161304051090960405260406131a06060600060075afa16604061316060808160065afa81169050611200516112205184828309856003878386090886838409148416935050816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611240516112605184828309856003878386090886838409148416935050816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a05184828309856003878386090886838409148416935050816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e05184828309856003878386090886838409148416935050816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611300516113205184828309856003878386090886838409148416935050816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061134051611360518482830985600387838609088683840914841693505081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a0518482830985600387838609088683840914841693505081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610400516104205184828309856003878386090886838409148416935050816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa81169050610440516104605184828309856003878386090886838409148416935050816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a05184828309856003878386090886838409148416935050816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e05184828309856003878386090886838409148416935050816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa81169050610500516105205184828309856003878386090886838409148416935050816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa81169050610540516105605184828309856003878386090886838409148416935050816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a05184828309856003878386090886838409148416935050816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e05184828309856003878386090886838409148416935050816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa81169050610600516106205184828309856003878386090886838409148416935050816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa81169050610640516106605184828309856003878386090886838409148416935050816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a05184828309856003878386090886838409148416935050816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e05184828309856003878386090886838409148416935050816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa81169050610700516107205184828309856003878386090886838409148416935050816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa81169050610740516107605184828309856003878386090886838409148416935050816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a0518482830985600387838609088683840914841693505081600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e0518482830985600387838609088683840914841693505081600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061080051610820518482830985600387838609088683840914841693505081600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506108405161086051848283098560038783860908868384091484169350508160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a0518482830985600387838609088683840914841693505081600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e0518482830985600387838609088683840914841693505081600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa8116905061090051610920518482830985600387838609088683840914841693505081600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa8116905061094051610960518482830985600387838609088683840914841693505081600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a0518482830985600387838609088683840914841693505081600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826137605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16613360819052612b00516126c05161230051612320518682800987600389838609088883840914955050816000528060205250508060405260406131a06060600060075afa831692506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914861695505081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612b845761350051613520518582830986600388838609088783840914851694505081600052806020525050828182096040526040606080600060075afa8216915061354051613560518582830986600388838609088783840914851694505081600052806020525050604060006060600060075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612bb4577ff755f3690000000000000000000000000000000000000000000000000000000060005260046000fd5b806133805261322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa9050806133a0526000516133c05250505061336051613380516133c0516133a051161616612ce4577f0711fcec0000000000000000000000000000000000000000000000000000000060005260046000fd5b600160005260206000f35b60008060008060408587031215612d0557600080fd5b843567ffffffffffffffff80821115612d1d57600080fd5b818701915087601f830112612d3157600080fd5b813581811115612d4057600080fd5b886020828501011115612d5257600080fd5b602092830196509450908601359080821115612d6d57600080fd5b818701915087601f830112612d8157600080fd5b813581811115612d9057600080fd5b8860208260051b8501011115612da557600080fd5b9598949750506020019450505056fea2646970667358221220daa8e5f0080f5a9dffa4bfcb2d7a2d6817898ca1de663f2ea393d498690d116664736f6c634300080a0033";
+
+type UltraVerifierOuterConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: UltraVerifierOuterConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class UltraVerifierOuter__factory extends ContractFactory {
+  constructor(...args: UltraVerifierOuterConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override deploy(
+    overrides?: Overrides & { from?: PromiseOrValue<string> }
+  ): Promise<UltraVerifierOuter> {
+    return super.deploy(overrides || {}) as Promise<UltraVerifierOuter>;
+  }
+  override getDeployTransaction(
+    overrides?: Overrides & { from?: PromiseOrValue<string> }
+  ): TransactionRequest {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override attach(address: string): UltraVerifierOuter {
+    return super.attach(address) as UltraVerifierOuter;
+  }
+  override connect(signer: Signer): UltraVerifierOuter__factory {
+    return super.connect(signer) as UltraVerifierOuter__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): UltraVerifierOuterInterface {
+    return new utils.Interface(_abi) as UltraVerifierOuterInterface;
+  }
+  static connect(
+    address: string,
+    signerOrProvider: Signer | Provider
+  ): UltraVerifierOuter {
+    return new Contract(address, _abi, signerOrProvider) as UltraVerifierOuter;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/UltraVerifier__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/UltraVerifier__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bfb101411607ccd3f89412c219e09b447df82207
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/UltraVerifier__factory.ts
@@ -0,0 +1,141 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers";
+import type { Provider, TransactionRequest } from "@ethersproject/providers";
+import type { PromiseOrValue } from "../../../common";
+import type {
+  UltraVerifier,
+  UltraVerifierInterface,
+} from "../../../contracts/plonk_vk_outer.sol/UltraVerifier";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "EC_SCALAR_MUL_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "MOD_EXP_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PROOF_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "expected",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "actual",
+        type: "uint256",
+      },
+    ],
+    name: "PUBLIC_INPUT_COUNT_INVALID",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_GE_P",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "_publicInputs",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x608060405234801561001057600080fd5b50612dea806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063937f6a101461003b578063ea50d0e41461006e575b600080fd5b6040517f8352d37a558fdedcdfc81147e8d52b2703b3ef7c0d8f9b33959496261e898a0481526020015b60405180910390f35b61008161007c366004612cef565b610091565b6040519015158152602001610065565b620800006103805260116103a0527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd6103c0527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d82016103e0527f2f01c4ff7bcf64d6737e51c0e6bcdd1cb75d604f1357497a22223e220dafeb5f610400527f131c602f657d8bc07cd86629877cc206a4b71f8efe38162635c945af48bf8421610420527f2cd39d3aa011bc980379d89c926fbaa4ad476cc3cc3c4747bd15fdf67bf39c66610440527f0b54d9d61011224a78310dca359d0003bc8048b092d71dfc7141c1e44b691278610460527f028202acd9b70aa443cfc9856f1beab05680b79d16a84af8781345dccba50785610480527f2b962a0406e189dad5b6a67b07dfd36724fdd9ba4e24f09c09f73db87b8052f76104a0527f1b2546695231b99d3371803a2669102c08c20253ff1e8bbd1fc713f6394a28c66104c0527f013648d6a1a858dd8a354300a46742d513b8e3e202df2bdc127b0eb96533d74c6104e0527f29f34a0a4e607143946f3860402716b510716d93a4507036d0fce0f1e721fa0b610500527f2476c2f4548052b9cba2489b747d172394195f16a6b0fffc6c12862f5a45284c610520527f1cac590393951509f6cda74c176df36a01a195871f31eee37fe308ee2c45106a610540527f26478cbd3443a9fd1888309ad1b91746b29a876cd36a11da695aeaa3f89179a1610560527f166a40651bd5eda1692d07866511909391017e4686aebf32cdfd5cb164ffdcd6610580527f124616afe7a9b67e073ac6ad8ef2e6a7561cf56b6421f102db6ce16e9cd6eeb76105a0527f02bdce0743e4c073899da240139644a5cf9cdfc7ee95ebd01caf89d18d1df9466105c0527f3011dbfbec90f92312c6091b37ba98e0e63c3858073e35c5fc6245f441c9206a6105e0527f0280beb4de85fc064e185999662b8c5ff8ae40883c3bb888922d20efeb574955610600527f114cb9dced0a0d3abd1b7267a11c3db4f62173e5bcaeda0761499ff4d7ec1c11610620527f0e07c8f9c66159d2f9dfa63d8da7f38b8e88f6e879d22ec46f50efa7a9a9e22e610640527f203b938d851d88566b121067939e4bfacfe52421297557862cafc77801364eb4610660527f0fca7eb0f2a339343150f9b51b5cb6516a19b5baeb91ffaea8e3f7915196e0e5610680527f29532eaec020e339322ff0378240c90298f99b4d84dedb46c436682d1fff87ae6106a0527f169958bc5af2a15f0984ec5d936c07bed333bab5acb62c37d801f749053480196106c0527f2cbec49069bfb20e7726ca1ff28d68b64b46b7ac7ee619c084714770edc75d956106e0527f20fc6dabb3cdded4a910ddd200db071067b44a36d6efceec219d4e71e29d1adc610700527f2390574fae39d24b930e9a1ac12f5828605a2b3b12100d6eb2d328b439cae520610720527f192de3ff3c6b0ce5e01a534b8e9ec852005d2f3634fc5aa1748494d5add00c09610740527f22fe04d69c4c7f938196dffd2552ce8c4f15ab038f2779f76cb596b575a7c037610760527f1cadeb85ec1d913dbbebd04a2e9c216fffb782a908252de688cb3f87a9960239610780527f140ce35846522600428e89cedfc30ef4f906e759e4b262f982f41b11e232bef06107a0527f186c47255bd1cac8572abe17f302a4a778dc042d05b5ad10ec72ccf87db72cbd6107c0527f2696b8ea9abe2e21817826ff8ffdd70455306100f722aee5047d7b61d23be4706107e0527f203c78601f28e6739d2031447af9f5015f00e4a92298c8e0af4906929ce4aa23610800527f0b82d8af3657b8dacf80c03e267415e27c1b22c5b110041433f5f7a0077d6163610820527f1ca5d2fc76408b3d82cd070612b1f00b2910e92b606943f0a66d4064ac05d6f3610840527f12889680e44151655a6fb88176f0eb0e09e60039ec5cbc978bcb081ca4d41c1e610860527f02f575b94cf1709447ed1f42c9334e6573674f64a6b093893e6ca6e3cff758f8610880527f093057b2f2daa6dcd3a1731731824f77fdaffd03b4642fd19d422a0eba3d3ca16108a0527f16976448b1d98c419b4199f963ed6e7c577b86fd643944636aebe9415c6c23926108c0527f1e752da483356c3ffe692d039747ffc95887801c2e4d9d311aa6711554c1d07a6108e0527f0c03d48c2216fbe761d33e94f12bb90e29c5e102076fa4fce16e99d638555f96610900527f1ee6af66806a0e0ae56ec149a0c80e5e2304d2e8f326b46bd8776e02dec4d14f610920527f086e4e6fe2b03022ac2c432ae1041bdc5521e93b6385153d87d585d2c286e437610940527f1f19610be242456719151038ced2e3f37af595dce25bed42930cc45dc4439642610960527f0aa7e407c3f13a1e954805f23c39703b03d02dbe88bcbc9b584082ee018192fa610980527f0767689123d0dd000f36a05c1cd5494e36fd8bc82299ea290d5b4e892ced4ec86109a05260016109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca5353216134005260006103a0518281146108a1576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d1c576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361350052826135205281613540528061356052868110878410168783108886101616610d16577feba9f4a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050505b6103805160e01b6000526103a05160e01b60045260086000208061358052602480350160206103a05102808260206135800137600435602401915060c0826135a083013760e0016135802083810661266081905290925090508281800961268052828161268051096126a05250806000526112e0516020526112c051604052611320516060526113005160805260a0600020905081810661260052806000526001602053506021600090812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096134205282816134205109613440528281613440510961346052806134805250806000526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e052611480516101005261012060002090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610edc57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e9d565b50505080610f0e577f374a972f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f4a578483840992508001610f35565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f81578483840992508001610f6c565b50508061304052826001840382089050613400518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760206000526020805260206040528b8b8a0960605260028c036080528b60a0526020600060c0600060055afa611077577ff894a7bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b60005198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613780528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096134805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096134805109870382089050856126405161348051096134805285868788613060518a0361208051086130c0510961348051098208905085612640516134805109613480528586878860018a036116a051086130a05109613480510982086136005250505050508061264051613480510961348052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161342051098381850383089150836120a05183099150838461314051830983089150508261348051848386038508096136205250508061344051613480510961348052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613480510961364052505080613420516134805109613480526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866134805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516134805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613420516134805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613440516134805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961366052505061346051613480518392500961348052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261348051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613480510984856117605187036001088509099150826117e0518484840809613680525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613480518209905082836126405161348051098309915082611760518209905082611760518309915082836117e0518585850809613680510861368052505080613460516134805109613480528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096136c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096136e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161374052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861372052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161370052505083611620518503612000510892508361164051850385868488036001088609089250836117005161372051099150838461174051850983089150838461176051613740510983089150836116e0518309915083846117a051613700510983089150836136c05183089250836136e05184089250836118005184099250836134805184099250826136a05283613440516134805109613480525050508061378051826136a0518461368051866136605188613640518a61362051613600510808080808096137608190526126e0516137a08190526137c0919091526102e460043501610520816137e03750506105606137a020818106612700526000819052600160205381602160002006612720526002602053816021600020066127405260036020538160216000200661276052600460205381602160002006612780526005602053816021600020066127a0526006602053816021600020066127c0526007602053816021600020066127e0526008602053816021600020066128005260096020538160216000200661282052600a6020538160216000200661284052600b6020538160216000200661286052600c6020538160216000200661288052600d602053816021600020066128a052600e602053816021600020066128c052600f602053816021600020066128e05260106020538160216000200661290052601160205381602160002006612920526012602053816021600020066129405260136020538160216000200661296052601460205381602160002006612980526015602053816021600020066129a0526016602053816021600020066129c0526017602053816021600020066129e052601860205381602160002006612a0052601960205381602160002006612a2052601a60205381602160002006612a4052601b60205381602160002006612a6052601c60205381602160002006612a8052601d60205381602160002006612aa052601d6020535060216000908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914935050816131605280602061316001525050611400516114205184828309856003878386090886838409148416935050816000528060205250506130405160405260406131a06060600060075afa16604061316060808160065afa81169050611440516114605184828309856003878386090886838409148416935050816000528060205250508161304051613040510960405260406131a06060600060075afa16604061316060808160065afa81169050611480516114a05184828309856003878386090886838409148416935050816000528060205250508161304051836130405161304051090960405260406131a06060600060075afa16604061316060808160065afa81169050611200516112205184828309856003878386090886838409148416935050816000528060205250508161270051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611240516112605184828309856003878386090886838409148416935050816000528060205250508161272051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611280516112a05184828309856003878386090886838409148416935050816000528060205250508161274051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506112c0516112e05184828309856003878386090886838409148416935050816000528060205250508161276051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611300516113205184828309856003878386090886838409148416935050816000528060205250508161278051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061134051611360518482830985600387838609088683840914841693505081600052806020525050816127a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050611380516113a0518482830985600387838609088683840914841693505081600052806020525050816127c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610400516104205184828309856003878386090886838409148416935050816000528060205250506127e05160405260406131a06060600060075afa16604061316060808160065afa81169050610440516104605184828309856003878386090886838409148416935050816000528060205250506128005160405260406131a06060600060075afa16604061316060808160065afa81169050610480516104a05184828309856003878386090886838409148416935050816000528060205250506128205160405260406131a06060600060075afa16604061316060808160065afa811690506104c0516104e05184828309856003878386090886838409148416935050816000528060205250506128405160405260406131a06060600060075afa16604061316060808160065afa81169050610500516105205184828309856003878386090886838409148416935050816000528060205250506128605160405260406131a06060600060075afa16604061316060808160065afa81169050610540516105605184828309856003878386090886838409148416935050816000528060205250506128805160405260406131a06060600060075afa16604061316060808160065afa81169050610580516105a05184828309856003878386090886838409148416935050816000528060205250506128a05160405260406131a06060600060075afa16604061316060808160065afa811690506105c0516105e05184828309856003878386090886838409148416935050816000528060205250506128c05160405260406131a06060600060075afa16604061316060808160065afa81169050610600516106205184828309856003878386090886838409148416935050816000528060205250506128e05160405260406131a06060600060075afa16604061316060808160065afa81169050610640516106605184828309856003878386090886838409148416935050816000528060205250506129005160405260406131a06060600060075afa16604061316060808160065afa81169050610680516106a05184828309856003878386090886838409148416935050816000528060205250506129205160405260406131a06060600060075afa16604061316060808160065afa811690506106c0516106e05184828309856003878386090886838409148416935050816000528060205250506129405160405260406131a06060600060075afa16604061316060808160065afa81169050610700516107205184828309856003878386090886838409148416935050816000528060205250506129605160405260406131a06060600060075afa16604061316060808160065afa81169050610740516107605184828309856003878386090886838409148416935050816000528060205250506129805160405260406131a06060600060075afa16604061316060808160065afa81169050610780516107a0518482830985600387838609088683840914841693505081600052806020525050816129a051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506107c0516107e0518482830985600387838609088683840914841693505081600052806020525050816129c051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa8116905061080051610820518482830985600387838609088683840914841693505081600052806020525050816129e051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa811690506108405161086051848283098560038783860908868384091484169350508160005280602052505081612a0051836001612b0051080960405260406131a06060600060075afa16604061316060808160065afa81169050610880516108a0518482830985600387838609088683840914841693505081600052806020525050612a205160405260406131a06060600060075afa16604061316060808160065afa811690506108c0516108e0518482830985600387838609088683840914841693505081600052806020525050612a405160405260406131a06060600060075afa16604061316060808160065afa8116905061090051610920518482830985600387838609088683840914841693505081600052806020525050612a605160405260406131a06060600060075afa16604061316060808160065afa8116905061094051610960518482830985600387838609088683840914841693505081600052806020525050612a805160405260406131a06060600060075afa16604061316060808160065afa81169050610980516109a0518482830985600387838609088683840914841693505081600052806020525050612aa05160405260406131a06060600060075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa0510982089050826137605182089050600160005260026020528083036040525060406131a06060600060075afa16604061316060808160065afa16613360819052612b00516126c05161230051612320518682800987600389838609088883840914955050816000528060205250508060405260406131a06060600060075afa831692506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914861695505081600052806020525050836103c05185838509096040525060406131a06060600060075afa821691506040613220608061316060065afa8216915061230051600052612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e06080600060065afa82169150613200518403613200526109c05115612b845761350051613520518582830986600388838609088783840914851694505081600052806020525050828182096040526040606080600060075afa8216915061354051613560518582830986600388838609088783840914851694505081600052806020525050604060006060600060075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e06080600060065afa821691505b5080612bb4577ff755f3690000000000000000000000000000000000000000000000000000000060005260046000fd5b806133805261322051600052613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260206000610180600060085afa9050806133a0526000516133c05250505061336051613380516133c0516133a051161616612ce4577f0711fcec0000000000000000000000000000000000000000000000000000000060005260046000fd5b600160005260206000f35b60008060008060408587031215612d0557600080fd5b843567ffffffffffffffff80821115612d1d57600080fd5b818701915087601f830112612d3157600080fd5b813581811115612d4057600080fd5b886020828501011115612d5257600080fd5b602092830196509450908601359080821115612d6d57600080fd5b818701915087601f830112612d8157600080fd5b813581811115612d9057600080fd5b8860208260051b8501011115612da557600080fd5b9598949750506020019450505056fea26469706673582212200634ec9dfa89ef811eb49b9db024d4f9927d0b326ba07d7e8d6143610128dc8164736f6c634300080a0033";
+
+type UltraVerifierConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: UltraVerifierConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class UltraVerifier__factory extends ContractFactory {
+  constructor(...args: UltraVerifierConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override deploy(
+    overrides?: Overrides & { from?: PromiseOrValue<string> }
+  ): Promise<UltraVerifier> {
+    return super.deploy(overrides || {}) as Promise<UltraVerifier>;
+  }
+  override getDeployTransaction(
+    overrides?: Overrides & { from?: PromiseOrValue<string> }
+  ): TransactionRequest {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override attach(address: string): UltraVerifier {
+    return super.attach(address) as UltraVerifier;
+  }
+  override connect(signer: Signer): UltraVerifier__factory {
+    return super.connect(signer) as UltraVerifier__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): UltraVerifierInterface {
+    return new utils.Interface(_abi) as UltraVerifierInterface;
+  }
+  static connect(
+    address: string,
+    signerOrProvider: Signer | Provider
+  ): UltraVerifier {
+    return new Contract(address, _abi, signerOrProvider) as UltraVerifier;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f9b5ff09631ff0f8217c66c690d5f64245cb6aa0
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_outer.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { BaseUltraVerifier__factory } from "./BaseUltraVerifier__factory";
+export { UltraVerifierOuter__factory } from "./UltraVerifierOuter__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/BaseUltraVerifier__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/BaseUltraVerifier__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1d9fd7e65623f69ff77ebffb10b308df277db7fb
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/BaseUltraVerifier__factory.ts
@@ -0,0 +1,118 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  BaseUltraVerifier,
+  BaseUltraVerifierInterface,
+} from "../../../contracts/plonk_vk_publish.sol/BaseUltraVerifier";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "INVALID_VERIFICATION_KEY",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "MOD_EXP_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "OPENING_COMMITMENT_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PAIRING_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PAIRING_PREAMBLE_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "POINT_NOT_ON_CURVE",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "expected",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "actual",
+        type: "uint256",
+      },
+    ],
+    name: "PUBLIC_INPUT_COUNT_INVALID",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_GE_P",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "_publicInputs",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class BaseUltraVerifier__factory {
+  static readonly abi = _abi;
+  static createInterface(): BaseUltraVerifierInterface {
+    return new Interface(_abi) as BaseUltraVerifierInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): BaseUltraVerifier {
+    return new Contract(address, _abi, runner) as unknown as BaseUltraVerifier;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/PublishVerifier__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/PublishVerifier__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9d629415e667fb25e9b9c070be2b84db55d53037
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/PublishVerifier__factory.ts
@@ -0,0 +1,160 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../common";
+import type {
+  PublishVerifier,
+  PublishVerifierInterface,
+} from "../../../contracts/plonk_vk_publish.sol/PublishVerifier";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "INVALID_VERIFICATION_KEY",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "MOD_EXP_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "OPENING_COMMITMENT_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PAIRING_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PAIRING_PREAMBLE_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "POINT_NOT_ON_CURVE",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "expected",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "actual",
+        type: "uint256",
+      },
+    ],
+    name: "PUBLIC_INPUT_COUNT_INVALID",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_GE_P",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "_publicInputs",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x608060405234801561000f575f80fd5b50620800006103805260116103a0527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd6103c0527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d82016103e0527f2a5b5bf4e7267f65b4bc16ebad756c9e8ea69d65324fd0b48c0a8935ceda3f09610400527f28d9ed9f770dda271b50e8bf612c8325af26f5b22daa240f765fd834f210cb66610420527f18f82d2b924c0c048c2701e6f5ef80fed1fb8f93a7a79e028bf102801d9e3404610440527f09a86ae0a27903558e9511df7d83557e893f6564269f0bd2f446cce658bdd08a610460527f05cb49b1cbd78a34a6182bb578413a72506aa0e0b99c4ba71d0e9663c705ee94610480527f2d051db35e46746c0de60c6d587390a06b0ddb595fe8b36b461d82bfd625cbd66104a0527f0eeb312fd1ec27f2fe48713f4c99122590d47a4dbbcc424eed2525b33fb532d06104c0527f1a16a911760308f962276d1fe9212e9596e98065293414704963cee301fada6e6104e0527f214b05389e57197c3ffc44bb35debedddb08582c14efc17647380fcae70a0ba1610500527f278a1005120f4463fea60134d8d6135949a8c9c6a0bce553b64bd1da3dddd889610520527f1b28205eeb0afc520cc4ac77ecd48b53c718c44335244a942ded4488cf9732ce610540527f2b330bd9c2362c91beb188359e2b87ff9fadcbd93974913bdaeb1b6f075ef282610560527f20aec68b3b146d5e85259f91d45937646f683f6fada689d126f879a3f933e807610580527f24f7361950431d536c65746c3ca993f56cb5e3482b0458720dd97ba01fd8b4b06105a0527f2b7ce712bbf3283143653fcbd30336a53416a141b9106eb2442f9d779b4c86076105c0527f12ac9c66861d59f4662a745bec369ecc04fae51db675db345a72dc84b20105316105e0527f09ff259f85dd98b6cb1eec8c76aa80a4a2b9c3c022f2000e80eccf9f305bac9b610600527f2aa9e234b057fb299767f460d957e48a787da8c2b048e98563121c36986305d2610620527f0800fa47b432ed509e4f400f9f76dc25895b67cb83fc2d9db5bfc3a853930622610640527f187a336e03e524392b23db3c2525d34394d01302c5eaae304f22f13b365c8acc610660527f1558a8d17bcdfed02060e0b1ab6d554b5d59a94d0f6efbdeb6def252e5209fbb610680527f04ae065def60d2152523c04bba4c03e858b97458f4faef771eeee8f4056b44a06106a0527f2e36b7bc916a734f07f0c43817606371a34de55642a5323f35144ce7f9fe0f6f6106c0527f12196bb5ad74f35c8232f2b36bc20a7881c126cafe49801e3db7c961ff7263fa6106e0527f2ca098aa8621bb667feae735f2378c3b6bb07670ea4cf6635c8359758a46f642610700527f1b070233d2b2896616e5c21ba1d98d758282f57c0fd7e9a98e49cb9e5badfd23610720527f0d10934d3100cb4bf50337bff2b92a846840995a6468fab579a9408654903f4a610740527f18f2f2b029ef8498569e16deea735fa509a4d0fe794f4ad55cdfd9d326edaa7d610760527f1cadeb85ec1d913dbbebd04a2e9c216fffb782a908252de688cb3f87a9960239610780527f140ce35846522600428e89cedfc30ef4f906e759e4b262f982f41b11e232bef06107a0527f186c47255bd1cac8572abe17f302a4a778dc042d05b5ad10ec72ccf87db72cbd6107c0527f2696b8ea9abe2e21817826ff8ffdd70455306100f722aee5047d7b61d23be4706107e0527f203c78601f28e6739d2031447af9f5015f00e4a92298c8e0af4906929ce4aa23610800527f0b82d8af3657b8dacf80c03e267415e27c1b22c5b110041433f5f7a0077d6163610820527f1ca5d2fc76408b3d82cd070612b1f00b2910e92b606943f0a66d4064ac05d6f3610840527f12889680e44151655a6fb88176f0eb0e09e60039ec5cbc978bcb081ca4d41c1e610860527f090ae8569cf1a6846ca61a5ec3c71a4d3afded282c40ee2b8a529972bd62c272610880527f124114fedbb1979cd8917db111b0e637315b15399dee3b5408aa8a7ebab4e5fc6108a0527f0a49a7bdde09ed6fd2f6fb1de195fd82a185e8352c13414f41228365c0534cff6108c0527f2e229d9cc04adebd694bb8ac9ba5e0fc813ccf9195eeb2ad2125cca51edd61676108e0527f04e24b4e8087647d359a9c5e3285b56199b6cd7ac6471e429f5b059dd5fc0429610900527f136eb350f947a7eae3a5c681360a2e87e3568fb34df150ef29a479d723f0e7b6610920527f2f99072f396d78ac2878d170a38b39f173d272f2b3b9fa855e1f72594edfbe19610940527f0b27df54abad34fbd56dbecfc3be7479db9d99565e9fce1ff5ad8baa6e655a16610960527f2a84e367c769cb9176200a3d76b61149b52397060404e54ee38615726805901f610980527f2531b90ff29dd81e0070bad84e0060177c21dbb50e791e1b0aba5140af1962386109a05260016109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e05183828309846003868386090885838409148416935050815f5280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af157637e5769bf60e01b5f5260045ffd5b5050612bd880610b005f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c8063937f6a1014610038578063ea50d0e41461006b575b5f80fd5b6040517f4562b89f642757a8401910058432df6901f591b23ef2930203bc20db8d6635dc81526020015b60405180910390f35b61007e610079366004612ae8565b61008e565b6040519015158152602001610062565b620800006103805260116103a0527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd6103c0527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d82016103e0527f2a5b5bf4e7267f65b4bc16ebad756c9e8ea69d65324fd0b48c0a8935ceda3f09610400527f28d9ed9f770dda271b50e8bf612c8325af26f5b22daa240f765fd834f210cb66610420527f18f82d2b924c0c048c2701e6f5ef80fed1fb8f93a7a79e028bf102801d9e3404610440527f09a86ae0a27903558e9511df7d83557e893f6564269f0bd2f446cce658bdd08a610460527f05cb49b1cbd78a34a6182bb578413a72506aa0e0b99c4ba71d0e9663c705ee94610480527f2d051db35e46746c0de60c6d587390a06b0ddb595fe8b36b461d82bfd625cbd66104a0527f0eeb312fd1ec27f2fe48713f4c99122590d47a4dbbcc424eed2525b33fb532d06104c0527f1a16a911760308f962276d1fe9212e9596e98065293414704963cee301fada6e6104e0527f214b05389e57197c3ffc44bb35debedddb08582c14efc17647380fcae70a0ba1610500527f278a1005120f4463fea60134d8d6135949a8c9c6a0bce553b64bd1da3dddd889610520527f1b28205eeb0afc520cc4ac77ecd48b53c718c44335244a942ded4488cf9732ce610540527f2b330bd9c2362c91beb188359e2b87ff9fadcbd93974913bdaeb1b6f075ef282610560527f20aec68b3b146d5e85259f91d45937646f683f6fada689d126f879a3f933e807610580527f24f7361950431d536c65746c3ca993f56cb5e3482b0458720dd97ba01fd8b4b06105a0527f2b7ce712bbf3283143653fcbd30336a53416a141b9106eb2442f9d779b4c86076105c0527f12ac9c66861d59f4662a745bec369ecc04fae51db675db345a72dc84b20105316105e0527f09ff259f85dd98b6cb1eec8c76aa80a4a2b9c3c022f2000e80eccf9f305bac9b610600527f2aa9e234b057fb299767f460d957e48a787da8c2b048e98563121c36986305d2610620527f0800fa47b432ed509e4f400f9f76dc25895b67cb83fc2d9db5bfc3a853930622610640527f187a336e03e524392b23db3c2525d34394d01302c5eaae304f22f13b365c8acc610660527f1558a8d17bcdfed02060e0b1ab6d554b5d59a94d0f6efbdeb6def252e5209fbb610680527f04ae065def60d2152523c04bba4c03e858b97458f4faef771eeee8f4056b44a06106a0527f2e36b7bc916a734f07f0c43817606371a34de55642a5323f35144ce7f9fe0f6f6106c0527f12196bb5ad74f35c8232f2b36bc20a7881c126cafe49801e3db7c961ff7263fa6106e0527f2ca098aa8621bb667feae735f2378c3b6bb07670ea4cf6635c8359758a46f642610700527f1b070233d2b2896616e5c21ba1d98d758282f57c0fd7e9a98e49cb9e5badfd23610720527f0d10934d3100cb4bf50337bff2b92a846840995a6468fab579a9408654903f4a610740527f18f2f2b029ef8498569e16deea735fa509a4d0fe794f4ad55cdfd9d326edaa7d610760527f1cadeb85ec1d913dbbebd04a2e9c216fffb782a908252de688cb3f87a9960239610780527f140ce35846522600428e89cedfc30ef4f906e759e4b262f982f41b11e232bef06107a0527f186c47255bd1cac8572abe17f302a4a778dc042d05b5ad10ec72ccf87db72cbd6107c0527f2696b8ea9abe2e21817826ff8ffdd70455306100f722aee5047d7b61d23be4706107e0527f203c78601f28e6739d2031447af9f5015f00e4a92298c8e0af4906929ce4aa23610800527f0b82d8af3657b8dacf80c03e267415e27c1b22c5b110041433f5f7a0077d6163610820527f1ca5d2fc76408b3d82cd070612b1f00b2910e92b606943f0a66d4064ac05d6f3610840527f12889680e44151655a6fb88176f0eb0e09e60039ec5cbc978bcb081ca4d41c1e610860527f090ae8569cf1a6846ca61a5ec3c71a4d3afded282c40ee2b8a529972bd62c272610880527f124114fedbb1979cd8917db111b0e637315b15399dee3b5408aa8a7ebab4e5fc6108a0527f0a49a7bdde09ed6fd2f6fb1de195fd82a185e8352c13414f41228365c0534cff6108c0527f2e229d9cc04adebd694bb8ac9ba5e0fc813ccf9195eeb2ad2125cca51edd61676108e0527f04e24b4e8087647d359a9c5e3285b56199b6cd7ac6471e429f5b059dd5fc0429610900527f136eb350f947a7eae3a5c681360a2e87e3568fb34df150ef29a479d723f0e7b6610920527f2f99072f396d78ac2878d170a38b39f173d272f2b3b9fa855e1f72594edfbe19610940527f0b27df54abad34fbd56dbecfc3be7479db9d99565e9fce1ff5ad8baa6e655a16610960527f2a84e367c769cb9176200a3d76b61149b52397060404e54ee38615726805901f610980527f2531b90ff29dd81e0070bad84e0060177c21dbb50e791e1b0aba5140af1962386109a05260016109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321613300525f6103a05182811461089d576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d16576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d10577feba9f4a6000000000000000000000000000000000000000000000000000000005f5260045ffd5b50505050505b6103805160e01b5f526103a05160e01b60045260085f208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250805f526112e0516020526112c051604052611320516060526113005160805260a05f20905081810661260052805f5260016020535060215f90812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250805f526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e05261148051610100526101205f2090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610ece57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e8f565b50505080610efe577f374a972f000000000000000000000000000000000000000000000000000000005f5260045ffd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f3a578483840992508001610f25565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f71578483840992508001610f5c565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760205f526020805260206040528b8b8a0960605260028c036080528b60a05260205f60c05f60055afa611062577ff894a7bc000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f5198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700525f81905260016020538160215f20066127205260026020538160215f20066127405260036020538160215f20066127605260046020538160215f20066127805260056020538160215f20066127a05260066020538160215f20066127c05260076020538160215f20066127e05260086020538160215f20066128005260096020538160215f200661282052600a6020538160215f200661284052600b6020538160215f200661286052600c6020538160215f200661288052600d6020538160215f20066128a052600e6020538160215f20066128c052600f6020538160215f20066128e05260106020538160215f20066129005260116020538160215f20066129205260126020538160215f20066129405260136020538160215f20066129605260146020538160215f20066129805260156020538160215f20066129a05260166020538160215f20066129c05260176020538160215f20066129e05260186020538160215f2006612a005260196020538160215f2006612a2052601a6020538160215f2006612a4052601b6020538160215f2006612a6052601c6020538160215f2006612a8052601d6020538160215f2006612aa052601d6020535060215f908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611cb1576328f6b59560e21b5f5260045ffd5b50613160919091526131805261140051611420518482800985600387838609088683840914611ce9576328f6b59560e21b5f5260045ffd5b50815f528060205250506130405160405260406131a060605f60075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d46576328f6b59560e21b5f5260045ffd5b505f91909152602052613040518290800960405260406131a060605f60075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611da3576328f6b59560e21b5f5260045ffd5b505f91909152602052613040518290818180090960405260406131a060605f60075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e03576328f6b59560e21b5f5260045ffd5b50815f528060205250508161270051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611e67576328f6b59560e21b5f5260045ffd5b50815f528060205250508161272051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611ecb576328f6b59560e21b5f5260045ffd5b50815f528060205250508161274051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f2f576328f6b59560e21b5f5260045ffd5b50815f528060205250508161276051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611f93576328f6b59560e21b5f5260045ffd5b50815f528060205250508161278051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa8116905061134051611360518482830985600387838609088683840914611ff7576328f6b59560e21b5f5260045ffd5b50815f52806020525050816127a051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050611380516113a051848283098560038783860908868384091461205b576328f6b59560e21b5f5260045ffd5b50815f52806020525050816127c051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610400515f52610420516020526127e05160405260406131a060605f60075afa16604061316060808160065afa81169050610440515f52610460516020526128005160405260406131a060605f60075afa16604061316060808160065afa81169050610480515f526104a0516020526128205160405260406131a060605f60075afa16604061316060808160065afa811690506104c0515f526104e0516020526128405160405260406131a060605f60075afa16604061316060808160065afa81169050610500515f52610520516020526128605160405260406131a060605f60075afa16604061316060808160065afa81169050610540515f52610560516020526128805160405260406131a060605f60075afa16604061316060808160065afa81169050610580515f526105a0516020526128a05160405260406131a060605f60075afa16604061316060808160065afa811690506105c0515f526105e0516020526128c05160405260406131a060605f60075afa16604061316060808160065afa81169050610600515f52610620516020526128e05160405260406131a060605f60075afa16604061316060808160065afa81169050610640515f52610660516020526129005160405260406131a060605f60075afa16604061316060808160065afa81169050610680515f526106a0516020526129205160405260406131a060605f60075afa16604061316060808160065afa811690506106c0515f526106e0516020526129405160405260406131a060605f60075afa16604061316060808160065afa81169050610700515f52610720516020526129605160405260406131a060605f60075afa16604061316060808160065afa81169050610740515f52610760516020526129805160405260406131a060605f60075afa16604061316060808160065afa81169050610780515f526107a051602052816129a051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa811690506107c0515f526107e051602052816129c051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610800515f5261082051602052816129e051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610840515f526108605160205281612a0051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610880515f526108a051602052612a205160405260406131a060605f60075afa16604061316060808160065afa811690506108c0515f526108e051602052612a405160405260406131a060605f60075afa16604061316060808160065afa81169050610900515f5261092051602052612a605160405260406131a060605f60075afa16604061316060808160065afa81169050610940515f5261096051602052612a805160405260406131a060605f60075afa16604061316060808160065afa81169050610980515f526109a051602052612aa05160405260406131a060605f60075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa051098208905082613660518208905060015f5260026020528083036040525060406131a060605f60075afa16604061316060808160065afa16806127c3577f4e719763000000000000000000000000000000000000000000000000000000005f5260045ffd5b612b00516126c051612300516123205186828309876003898386090888838409146127f7576328f6b59560e21b5f5260045ffd5b50815f528060205250508060405260406131a060605f60075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612851576328f6b59560e21b5f5260045ffd5b50815f52806020525050836103c05185838509096040525060406131a060605f60075afa821691506040613220608061316060065afa82169150612300515f52612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e060805f60065afa82169150613200518403613200526109c051156129a65761340051613420518582830986600388838609088783840914612908576328f6b59560e21b5f5260045ffd5b505f919091526020528281800960405260406060805f60075afa8216915061344051613460518582830986600388838609088783840914612952576328f6b59560e21b5f5260045ffd5b505f91825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e060805f60065afa821691505b50806129d4577f01882d81000000000000000000000000000000000000000000000000000000005f5260045ffd5b613220515f52613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260205f6101805f60085afa90505f518116612adc577fd71fd263000000000000000000000000000000000000000000000000000000005f5260045ffd5b50505060015f5260205ff35b5f805f8060408587031215612afb575f80fd5b843567ffffffffffffffff80821115612b12575f80fd5b818701915087601f830112612b25575f80fd5b813581811115612b33575f80fd5b886020828501011115612b44575f80fd5b602092830196509450908601359080821115612b5e575f80fd5b818701915087601f830112612b71575f80fd5b813581811115612b7f575f80fd5b8860208260051b8501011115612b93575f80fd5b9598949750506020019450505056fea26469706673582212202d9209f47ff8d2cb233fabbb43b9097da1378b5f809a38a93bd5039636dc744764736f6c63430008180033";
+
+type PublishVerifierConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: PublishVerifierConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class PublishVerifier__factory extends ContractFactory {
+  constructor(...args: PublishVerifierConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      PublishVerifier & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): PublishVerifier__factory {
+    return super.connect(runner) as PublishVerifier__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): PublishVerifierInterface {
+    return new Interface(_abi) as PublishVerifierInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): PublishVerifier {
+    return new Contract(address, _abi, runner) as unknown as PublishVerifier;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/Publisher__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/Publisher__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..914321ef9ab6c12dde69075803cf882c27068078
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/Publisher__factory.ts
@@ -0,0 +1,157 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../common";
+import type {
+  Publisher,
+  PublisherInterface,
+} from "../../../contracts/plonk_vk_publish.sol/Publisher";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "INVALID_VERIFICATION_KEY",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "MOD_EXP_FAILURE",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "OPENING_COMMITMENT_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PAIRING_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PAIRING_PREAMBLE_FAILED",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "POINT_NOT_ON_CURVE",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "expected",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "actual",
+        type: "uint256",
+      },
+    ],
+    name: "PUBLIC_INPUT_COUNT_INVALID",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_GE_P",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "PUBLIC_INPUT_INVALID_BN128_G1_POINT",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "_publicInputs",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x608060405234801561000f575f80fd5b50620800006103805260116103a0527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd6103c0527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d82016103e0527f153276dac53dd4181ccdb78066e70b33ba1da5c8f5695afd4a09d827ebed58a4610400527f1c40ed2b5ef331bb6f783d0d8b2f5e19c45ed5387241ee9d07c93010cdc07210610420527f19b2c4e61592e8bfcc2ad638779cebd1d33eee067ef0ed99e357bdb95d078e31610440527f042a4db7618b767951ad45e3e9550213ce51c7ff2df97573d1b574c3410067b4610460527f06f64deb121c3b4ca8849175b9efce0305f05624c44334352009b89d0a677142610480527f18830b8f38e8ac2aa4c465ec463159f3bb6e3372caa4161b9309328902b4f19c6104a0527f1450ef78e947bd04e3c1e211d04ad03364e8719a4b790aa1653a853c7a2642516104c0527e3f13559c163f3571ea2c45d306829a7d228428531ced2c7f2ce6b3584c4a026104e0527f0871da7efc0dd095821ad1c7aa2e5afba789bae3da7d0d41e137f9eac7128525610500527f290983741ce5b84e9f1c8d27c0385bd8653d4ec4b5e7dfef4dfaafa867496802610520527f177a293835faea48a960fb8cc9d73d23d3bb682b8557d4931ac4b5945caeb97a610540527f1ba0e9a598d06defc65e04f2715a3ac1e93a0480e735296c058352ebb3c5cd15610560527f1fb6966f21879d8b2d2c019ce6b63df740808b2162d7a72fa3eb4d70b7d2b923610580527f279b0593976391dec15c64c6d2f5d15097dd7a745cf9c8b1ea1f9e92037bd7c16105a0527f112ea4fd46ae165602f9696edcb2c3c6622c0cfae4a62932628d5ff30be865236105c0527f1b76903718d984c8d49427603fb46d9c86d64358701683489ae51c1d8481b8a56105e0527f0e6cf11b9887b57bb8d3aef997d5eb9e9847efadc8313a50c44701f361ef41c7610600527f15e0b8d390a2f44808e2c179121f3a9e96a99f5202b4cdd854f94437d5adcdb7610620527f119da73c18c91ec2ff36e1d9346df47b3d82d3eeb6e069399500e334cf18f036610640527f077858118854a086b39698da6353b57f8671d3b1f65e5f425e6b41ac883d3582610660527f1be57a887198c9641d56c7c98e3cdfbb92622485ff74a53dad7dd9941fec7231610680527f1341647cf29c7dd8c7ddf5ae10803677894cd16fa08145977a11817f518514ef6106a0527f228a4ed3a86f0bc8df569b2c43aa8070a88a0ee7f5871c37f77df8c318ca541b6106c0527f10f7eaa66eca402f6aabf12eea5adf281ddff592f639660cf6b7d93528ceae156106e0527f211d602f4b4688b65f5076a70ead2dbfc3d7e00006d2c8288aaa6f1f47d0b77b610700527f12435537c7c949e8591c56dc3b70dcc21230d4a1a2d525823498404c393b42c0610720527f1eaa117ef7dd1d0e34590a7bd477477319a781471c0d8987aa8727c26e07356e610740527f021b999453ce0c95591c2912b72890c1a990b86c7da0cc9369aa3ec7182f7837610760527f1cadeb85ec1d913dbbebd04a2e9c216fffb782a908252de688cb3f87a9960239610780527f140ce35846522600428e89cedfc30ef4f906e759e4b262f982f41b11e232bef06107a0527f186c47255bd1cac8572abe17f302a4a778dc042d05b5ad10ec72ccf87db72cbd6107c0527f2696b8ea9abe2e21817826ff8ffdd70455306100f722aee5047d7b61d23be4706107e0527f203c78601f28e6739d2031447af9f5015f00e4a92298c8e0af4906929ce4aa23610800527f0b82d8af3657b8dacf80c03e267415e27c1b22c5b110041433f5f7a0077d6163610820527f1ca5d2fc76408b3d82cd070612b1f00b2910e92b606943f0a66d4064ac05d6f3610840527f12889680e44151655a6fb88176f0eb0e09e60039ec5cbc978bcb081ca4d41c1e610860527f1dd8acaae004b3ba90ef3a69afed972d761ee5cc64438b5a52aeb1c35ecba380610880527f29915e1847945a3eb4055f15383057b3ee407e836e4ad026c2502b29c403fcac6108a0527f0daa131cea444d72b170d2b3deafbca6c670eefeb13e1a80f41501d8ff9f64ac6108c0527f105da9886cb83a39ce88b45a0afed116a5b1bcee0ed339dfb0a94bd1ccfa3d206108e0527f08440ed02d94a1e2526a9539b5cd1a8400d043d345f73bf26f943293f10a763e610900527f0813d6f3efe71b00d8f15f38db1a0d863a0b6b30141de2730487a74eeb9d59c7610920527f039e036e64c771f68b239e587feea6791a5230f06080255549f39233f147665c610940527f0dc07fc3dc7fb222decdb85127fce891d2964f6f57d745b5cffe8f15f441ce64610960527f0c35406b338a0d957851037981ffccc9a0359d9ada4f462dec1c672ef924538b610980527f293dedff19cd3669abd6d3056550589b06e5ca0a866e5ec8f1a128173ea1b4316109a05260016109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321613300527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47600161040051610420518382830984600386838609088583840914841693505050506104405161046051838283098460038683860908858384091484169350505050610480516104a0518382830984600386838609088583840914841693505050506104c0516104e05183828309846003868386090885838409148416935050815f5280602052505061050051610520518382830984600386838609088583840914841693505050506105405161056051838283098460038683860908858384091484169350505050610580516105a0518382830984600386838609088583840914841693505050506105c0516105e05183828309846003868386090885838409148416935050505061060051610620518382830984600386838609088583840914841693505050506106405161066051838283098460038683860908858384091484169350505050610680516106a0518382830984600386838609088583840914841693505050506106c0516106e05183828309846003868386090885838409148416935050505061070051610720518382830984600386838609088583840914841693505050506107405161076051838283098460038683860908858384091484169350505050610780516107a0518382830984600386838609088583840914841693505050506107c0516107e05183828309846003868386090885838409148416935050505061080051610820518382830984600386838609088583840914841693505050506108405161086051838283098460038683860908858384091484169350505050610880516108a0518382830984600386838609088583840914841693505050506108c0516108e05183828309846003868386090885838409148416935050505061090051610920518382830984600386838609088583840914841693505050506109405161096051838283098460038683860908858384091484169350505050610980516109a05183828309846003868386090885838409148416935050505080610af057637e5769bf60e01b5f5260045ffd5b5050612bd780610aff5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c8063937f6a1014610038578063ea50d0e41461006b575b5f80fd5b6040517fee283e9ca1cda0039f2eca5f7d1d8c27adec45a52a331706551dcccbc2c2668881526020015b60405180910390f35b61007e610079366004612ae7565b61008e565b6040519015158152602001610062565b620800006103805260116103a0527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd6103c0527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d82016103e0527f153276dac53dd4181ccdb78066e70b33ba1da5c8f5695afd4a09d827ebed58a4610400527f1c40ed2b5ef331bb6f783d0d8b2f5e19c45ed5387241ee9d07c93010cdc07210610420527f19b2c4e61592e8bfcc2ad638779cebd1d33eee067ef0ed99e357bdb95d078e31610440527f042a4db7618b767951ad45e3e9550213ce51c7ff2df97573d1b574c3410067b4610460527f06f64deb121c3b4ca8849175b9efce0305f05624c44334352009b89d0a677142610480527f18830b8f38e8ac2aa4c465ec463159f3bb6e3372caa4161b9309328902b4f19c6104a0527f1450ef78e947bd04e3c1e211d04ad03364e8719a4b790aa1653a853c7a2642516104c0527e3f13559c163f3571ea2c45d306829a7d228428531ced2c7f2ce6b3584c4a026104e0527f0871da7efc0dd095821ad1c7aa2e5afba789bae3da7d0d41e137f9eac7128525610500527f290983741ce5b84e9f1c8d27c0385bd8653d4ec4b5e7dfef4dfaafa867496802610520527f177a293835faea48a960fb8cc9d73d23d3bb682b8557d4931ac4b5945caeb97a610540527f1ba0e9a598d06defc65e04f2715a3ac1e93a0480e735296c058352ebb3c5cd15610560527f1fb6966f21879d8b2d2c019ce6b63df740808b2162d7a72fa3eb4d70b7d2b923610580527f279b0593976391dec15c64c6d2f5d15097dd7a745cf9c8b1ea1f9e92037bd7c16105a0527f112ea4fd46ae165602f9696edcb2c3c6622c0cfae4a62932628d5ff30be865236105c0527f1b76903718d984c8d49427603fb46d9c86d64358701683489ae51c1d8481b8a56105e0527f0e6cf11b9887b57bb8d3aef997d5eb9e9847efadc8313a50c44701f361ef41c7610600527f15e0b8d390a2f44808e2c179121f3a9e96a99f5202b4cdd854f94437d5adcdb7610620527f119da73c18c91ec2ff36e1d9346df47b3d82d3eeb6e069399500e334cf18f036610640527f077858118854a086b39698da6353b57f8671d3b1f65e5f425e6b41ac883d3582610660527f1be57a887198c9641d56c7c98e3cdfbb92622485ff74a53dad7dd9941fec7231610680527f1341647cf29c7dd8c7ddf5ae10803677894cd16fa08145977a11817f518514ef6106a0527f228a4ed3a86f0bc8df569b2c43aa8070a88a0ee7f5871c37f77df8c318ca541b6106c0527f10f7eaa66eca402f6aabf12eea5adf281ddff592f639660cf6b7d93528ceae156106e0527f211d602f4b4688b65f5076a70ead2dbfc3d7e00006d2c8288aaa6f1f47d0b77b610700527f12435537c7c949e8591c56dc3b70dcc21230d4a1a2d525823498404c393b42c0610720527f1eaa117ef7dd1d0e34590a7bd477477319a781471c0d8987aa8727c26e07356e610740527f021b999453ce0c95591c2912b72890c1a990b86c7da0cc9369aa3ec7182f7837610760527f1cadeb85ec1d913dbbebd04a2e9c216fffb782a908252de688cb3f87a9960239610780527f140ce35846522600428e89cedfc30ef4f906e759e4b262f982f41b11e232bef06107a0527f186c47255bd1cac8572abe17f302a4a778dc042d05b5ad10ec72ccf87db72cbd6107c0527f2696b8ea9abe2e21817826ff8ffdd70455306100f722aee5047d7b61d23be4706107e0527f203c78601f28e6739d2031447af9f5015f00e4a92298c8e0af4906929ce4aa23610800527f0b82d8af3657b8dacf80c03e267415e27c1b22c5b110041433f5f7a0077d6163610820527f1ca5d2fc76408b3d82cd070612b1f00b2910e92b606943f0a66d4064ac05d6f3610840527f12889680e44151655a6fb88176f0eb0e09e60039ec5cbc978bcb081ca4d41c1e610860527f1dd8acaae004b3ba90ef3a69afed972d761ee5cc64438b5a52aeb1c35ecba380610880527f29915e1847945a3eb4055f15383057b3ee407e836e4ad026c2502b29c403fcac6108a0527f0daa131cea444d72b170d2b3deafbca6c670eefeb13e1a80f41501d8ff9f64ac6108c0527f105da9886cb83a39ce88b45a0afed116a5b1bcee0ed339dfb0a94bd1ccfa3d206108e0527f08440ed02d94a1e2526a9539b5cd1a8400d043d345f73bf26f943293f10a763e610900527f0813d6f3efe71b00d8f15f38db1a0d863a0b6b30141de2730487a74eeb9d59c7610920527f039e036e64c771f68b239e587feea6791a5230f06080255549f39233f147665c610940527f0dc07fc3dc7fb222decdb85127fce891d2964f6f57d745b5cffe8f15f441ce64610960527f0c35406b338a0d957851037981ffccc9a0359d9ada4f462dec1c672ef924538b610980527f293dedff19cd3669abd6d3056550589b06e5ca0a866e5ec8f1a128173ea1b4316109a05260016109c08190526109e0527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1610a00527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0610a20527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4610a40527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55610a60527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321613300525f6103a05182811461089c576040517f7667dc9b000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440160405180910390fd5b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024600435018281350661122052826020820135066112005282604082013506611260528260608201350661124052826080820135066112a0528260a082013506611280528260c0820135066112e0528260e0820135066112c05282610100820135066113205282610120820135066113005282610140820135066113605282610160820135066113405282610180820135066113a052826101a08201350661138052826101c0820135066113e052826101e0820135066113c05282610200820135066114205282610220820135066114005282610240820135066114605282610260820135066114405282610280820135066114a052826102a08201350661148052816102c08201350661160052816102e0820135066116205281610300820135066116405281610320820135066116605281610340820135066116805281610360820135066116a05281610380820135066116c052816103a0820135066116e052816103c08201350661170052816103e0820135066117205281610400820135066117405281610420820135066117605281610440820135066117805281610460820135066117a05281610480820135066117c052816104a0820135066117e052816104c08201350661180052816104e0820135066119605281610500820135066119805281610520820135066119a05281610540820135066119c052816105608201350661184052816105808201350661186052816105a08201350661188052816105c0820135066118a052816105e0820135066118c05281610600820135066118e05281610620820135066119005281610640820135066119205281610660820135066119405281610680820135066119e052816106a08201350661200052816106c08201350661202052816106e0820135066120405281610700820135066120605281610720820135066120805281610740820135066120a05281610760820135066120c05281610780820135066120e052816107a08201350661210052816107c08201350661212052826107e08201350661232052826108008201350661230052826108208201350661236052826108408201350661234052506109c05115610d15576024803501806109e05160051b0190508035602082013560441b81019050604082013560881b81019050606082013560cc1b81019050608082013560a083013560441b8101905060c083013560881b8101905060e083013560cc1b8101905061010083013561012084013560441b8101905061014084013560881b8101905061016084013560cc1b810190506101808401356101a085013560441b810190506101c085013560881b810190506101e085013560cc1b810190508361340052826134205281613440528061346052868110878410168783108886101616610d0f577feba9f4a6000000000000000000000000000000000000000000000000000000005f5260045ffd5b50505050505b6103805160e01b5f526103a05160e01b60045260085f208061348052602480350160206103a05102808260206134800137600435602401915060c0826134a083013760e0016134802083810661266081905290925090508281800961268052828161268051096126a05250805f526112e0516020526112c051604052611320516060526113005160805260a05f20905081810661260052805f5260016020535060215f90812082810661262052815261136051602052611340516040526113a0516060526113805160805260a09020818106612640819052828180096133205282816133205109613340528281613340510961336052806133805250805f526113e0516020526113c05160405261142051606052611400516080526114605160a0526114405160c0526114a05160e05261148051610100526101205f2090508181066126c052806126e0525061260051612620516103c051600180856001602480350160206103a0510281018360058a0984600c8b0999505b81831015610ecd57823585811085169450858a82089050858183018909975085818c01880996505084888209905084888b099950602083019250610e8e565b50505080610efd577f374a972f000000000000000000000000000000000000000000000000000000005f5260045ffd5b50508161300052806130205250505050508081600161260051086126205109806103805160015b81811015610f39578483840992508001610f24565b5050613100528181800990508181820961312052506126c05161038051819060015b81811015610f70578483840992508001610f5b565b50508061304052826001840382089050613300518084036103e051858286088684840992508687848808820990508684840992508687848808820990508687888686098808820990506103c051925086828609915086600188038708878485099450876001890389898b888d8b8c0909090896506130205194508493508782860994508488878709955085898388099650868a61312051890997508760205f526020805260206040528b8b8a0960605260028c036080528b60a05260205f60c05f60055afa611061577ff894a7bc000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f5198508b818a0990508b8b8a0998508b828a0991508b613120518a0998508b838a0992508b858a0998508b848a0993508b8a8a0998508b888a0997508b868a0998508b613020518d8b8c090998508b896130005109613060528b888b09613080528b848709613680528b8388096130a0528b826131005109613140528b8188096130c052505050505050505050505061264051506126005161262051828361190051840982611620510101846118e051850983611600510101098384611940518509836116605101018561192051860984611640510101098485868385096116a051096133805109858661198051870985611620510101876119605188098661160051010109925085866119c051870985611660510101876119a0518809866116405101010991508586878885870961208051096133805109870382089050856126405161338051096133805285868788613060518a0361208051086130c0510961338051098208905085612640516133805109613380528586878860018a036116a051086130a05109613380510982086135005250505050508061264051613380510961338052806117205161266051098182836120205161178051096116405108820890508161266051820990508182836120005161176051096116205108820890508161266051820990508182836119e0516117005109611600510882089050816118405183846126605161186051098586612680516118805109876126a0516118a05109080808826120c0518485612660516120e051098687612680516121005109886126a051612120510908080883846001612600510861262051098461262051866118c051870908935084818687612600518609860808925084838509935084856001612600510885099350846130a05161264051099250848385089350846116c0518509935084838603850893508481868761260051612060510961168051080892505050826130c05161332051098381850383089150836120a05183099150838461314051830983089150508261338051848386038508096135205250508061334051613380510961338052806116e0516116005109816117005161162051098261172051611640510983611740516116605109847f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008687600389036117a0510888611760518a6116205161160051090909098586878889858a08880886088408611780510894505050505081828384856116605161160051086119e051870308611760510884600286036117a05108096126405109828384858685612040510887600189036117a051080985086117a05109613380510961354052505080613320516133805109613380526002810360038203826116005184036116205108836116205185036116405108846116405186036116605108856116605187036119e05108866133805188898888088a8b8b8a088c8a8e038e8c8d09080909099350868788612640516133805109898a8988088b8c8c8a088d8a8f038f8c8d090809090985089350868788613320516133805109898a8987088b8c8c89088d898f038f8b8c090809090985089350868788613340516133805109898a8986088b8c8c88088d888f038f8a8b090809090985089350505050836117c051820961356052505061336051613380518392500961338052806116205182036119e051088161204051612040510982611640516116405109836116e05185612040516116405109098485868384088785870888030886878788098889611620516119e0510861200051080908925050508261338051848561176051870360010884090990508261202051611640510883611640518503856116e05161204051090884858287611620518903612000510809868685090893505050828361264051613380510984856117605187036001088509099150826117e0518484840809613580525050806116205161162051098161164051611640510982611620518460118408098360048309915083600982099050836003840992508381850385848788611620516116205108612000510809089150508283846120205161164051088561164051611640510809840384856120005187036116205108850908915082613380518209905082836126405161338051098309915082611760518209905082611760518309915082836117e0518585850809613580510861358052505080613360516133805109613380528081611620516119e05109826120005161160051090881612020518303838461164051611620510985611660516116005109080882681000000000000000008209905082612040518403820890508282820890508261174051820990508268100000000000000000830991508283612000516119e05109830891508261172051848561166051611640510886038508098361176051858661204051612020510887038761166051880808099250836117005185858786860808096135c0525050612000518291506140009009816119e0518208905081614000820990508161164051820890508161400082099050816116205182089050816140008209905081611600518208905081611660518303820890508161174051820990508161400061202051098261200051820890508261400082099050826119e05182089050826140008209905082611660518208905082614000820990508261164051820890508261204051840382089050826117605182099050826117205184838508096135e0525050806126605161164051098161162051820890508161266051820990508161160051820890508161266051820990508161178051820890508082611660518403830891508161364052826116005184036119e05108836116605185036120405108848560018703840883098586848803600108830991508585876126405189858b61264051890908090861362052856126605161202051099450856120005186089450856126605186099450856119e0518608945085612660518609945085858703612040510894508561164051870361202051089150858687878903600108840987858903600108099150858487036116605108868760018903830882099050868760018903880887099550866126405184099250868284089250866126405184099250868684089250866126405184099250868184089250508161360052505083611620518503612000510892508361164051850385868488036001088609089250836117005161362051099150838461174051850983089150838461176051613640510983089150836116e0518309915083846117a051613600510983089150836135c05183089250836135e05184089250836118005184099250836133805184099250826135a05283613340516133805109613380525050508061368051826135a0518461358051866135605188613540518a61352051613500510808080808096136608190526126e0516136a08190526136c0919091526102e460043501610520816136e03750506105606136a020818106612700525f81905260016020538160215f20066127205260026020538160215f20066127405260036020538160215f20066127605260046020538160215f20066127805260056020538160215f20066127a05260066020538160215f20066127c05260076020538160215f20066127e05260086020538160215f20066128005260096020538160215f200661282052600a6020538160215f200661284052600b6020538160215f200661286052600c6020538160215f200661288052600d6020538160215f20066128a052600e6020538160215f20066128c052600f6020538160215f20066128e05260106020538160215f20066129005260116020538160215f20066129205260126020538160215f20066129405260136020538160215f20066129605260146020538160215f20066129805260156020538160215f20066129a05260166020538160215f20066129c05260176020538160215f20066129e05260186020538160215f2006612a005260196020538160215f2006612a2052601a6020538160215f2006612a4052601b6020538160215f2006612a6052601c6020538160215f2006612a8052601d6020538160215f2006612aa052601d6020535060215f908120828106612ac05281526123205160205261230051604052612360516060526123405160805260a08120829006612b00526113c0516113e0518482800985600387838609088683840914611cb0576328f6b59560e21b5f5260045ffd5b50613160919091526131805261140051611420518482800985600387838609088683840914611ce8576328f6b59560e21b5f5260045ffd5b50815f528060205250506130405160405260406131a060605f60075afa90506040613160608061316060065afa8116905061144051611460518482830985600387838609088683840914611d45576328f6b59560e21b5f5260045ffd5b505f91909152602052613040518290800960405260406131a060605f60075afa16604061316060808160065afa81169050611480516114a0518482830985600387838609088683840914611da2576328f6b59560e21b5f5260045ffd5b505f91909152602052613040518290818180090960405260406131a060605f60075afa16604061316060808160065afa8116905061120051611220518482830985600387838609088683840914611e02576328f6b59560e21b5f5260045ffd5b50815f528060205250508161270051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa8116905061124051611260518482830985600387838609088683840914611e66576328f6b59560e21b5f5260045ffd5b50815f528060205250508161272051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050611280516112a0518482830985600387838609088683840914611eca576328f6b59560e21b5f5260045ffd5b50815f528060205250508161274051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa811690506112c0516112e0518482830985600387838609088683840914611f2e576328f6b59560e21b5f5260045ffd5b50815f528060205250508161276051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa8116905061130051611320518482830985600387838609088683840914611f92576328f6b59560e21b5f5260045ffd5b50815f528060205250508161278051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa8116905061134051611360518482830985600387838609088683840914611ff6576328f6b59560e21b5f5260045ffd5b50815f52806020525050816127a051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050611380516113a051848283098560038783860908868384091461205a576328f6b59560e21b5f5260045ffd5b50815f52806020525050816127c051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610400515f52610420516020526127e05160405260406131a060605f60075afa16604061316060808160065afa81169050610440515f52610460516020526128005160405260406131a060605f60075afa16604061316060808160065afa81169050610480515f526104a0516020526128205160405260406131a060605f60075afa16604061316060808160065afa811690506104c0515f526104e0516020526128405160405260406131a060605f60075afa16604061316060808160065afa81169050610500515f52610520516020526128605160405260406131a060605f60075afa16604061316060808160065afa81169050610540515f52610560516020526128805160405260406131a060605f60075afa16604061316060808160065afa81169050610580515f526105a0516020526128a05160405260406131a060605f60075afa16604061316060808160065afa811690506105c0515f526105e0516020526128c05160405260406131a060605f60075afa16604061316060808160065afa81169050610600515f52610620516020526128e05160405260406131a060605f60075afa16604061316060808160065afa81169050610640515f52610660516020526129005160405260406131a060605f60075afa16604061316060808160065afa81169050610680515f526106a0516020526129205160405260406131a060605f60075afa16604061316060808160065afa811690506106c0515f526106e0516020526129405160405260406131a060605f60075afa16604061316060808160065afa81169050610700515f52610720516020526129605160405260406131a060605f60075afa16604061316060808160065afa81169050610740515f52610760516020526129805160405260406131a060605f60075afa16604061316060808160065afa81169050610780515f526107a051602052816129a051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa811690506107c0515f526107e051602052816129c051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610800515f5261082051602052816129e051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610840515f526108605160205281612a0051836001612b0051080960405260406131a060605f60075afa16604061316060808160065afa81169050610880515f526108a051602052612a205160405260406131a060605f60075afa16604061316060808160065afa811690506108c0515f526108e051602052612a405160405260406131a060605f60075afa16604061316060808160065afa81169050610900515f5261092051602052612a605160405260406131a060605f60075afa16604061316060808160065afa81169050610940515f5261096051602052612a805160405260406131a060605f60075afa16604061316060808160065afa81169050610980515f526109a051602052612aa05160405260406131a060605f60075afa16604061316060808160065afa8116905081826116005184612b00516119e051090861270051098283846116205186612b00516120005109086127205109820890508283846116405186612b00516120205109086127405109820890508283846116605186612b00516120405109086127605109820890508283846116805186612b00516120605109086127805109820890508283846116a05186612b00516120805109086127a05109820890508283846116c05186612b00516120a05109086127c051098208905082836116e0516127e051098208905082836117005161280051098208905082836117205161282051098208905082836117405161284051098208905082836117605161286051098208905082836117805161288051098208905082836117a0516128a051098208905082836117c0516128c051098208905082836117e0516128e051098208905082836118005161290051098208905082836119605161292051098208905082836119805161294051098208905082836119a05161296051098208905082836119c0516129805109820890508283846118405186612b00516120c05109086129a05109820890508283846118605186612b00516120e05109086129c05109820890508283846118805186612b00516121005109086129e05109820890508283846118a05186612b0051612120510908612a0051098208905082836118c051612a2051098208905082836118e051612a40510982089050828361190051612a60510982089050828361192051612a80510982089050828361194051612aa051098208905082613660518208905060015f5260026020528083036040525060406131a060605f60075afa16604061316060808160065afa16806127c2577f4e719763000000000000000000000000000000000000000000000000000000005f5260045ffd5b612b00516126c051612300516123205186828309876003898386090888838409146127f6576328f6b59560e21b5f5260045ffd5b50815f528060205250508060405260406131a060605f60075afa92506040613160608061316060065afa8316925061234051612360518682830987600389838609088883840914612850576328f6b59560e21b5f5260045ffd5b50815f52806020525050836103c05185838509096040525060406131a060605f60075afa821691506040613220608061316060065afa82169150612300515f52612320516020526123405160405261236051606052806080526040806060604060075afa8216915060406131e060805f60065afa82169150613200518403613200526109c051156129a55761340051613420518582830986600388838609088783840914612907576328f6b59560e21b5f5260045ffd5b505f919091526020528281800960405260406060805f60075afa8216915061344051613460518582830986600388838609088783840914612951576328f6b59560e21b5f5260045ffd5b505f91825260205260409060608160075afa821691506132205160a0526132405160c05260406132206080606060065afa821691506131e0516040526132005160605260406131e060805f60065afa821691505b50806129d3577f01882d81000000000000000000000000000000000000000000000000000000005f5260045ffd5b613220515f52613240516020527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26040527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6080527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0526131e05160c0526132005160e052610a005161010052610a205161012052610a405161014052610a60516101605260205f6101805f60085afa90505f518116612adb577fd71fd263000000000000000000000000000000000000000000000000000000005f5260045ffd5b50505060015f5260205ff35b5f805f8060408587031215612afa575f80fd5b843567ffffffffffffffff80821115612b11575f80fd5b818701915087601f830112612b24575f80fd5b813581811115612b32575f80fd5b886020828501011115612b43575f80fd5b602092830196509450908601359080821115612b5d575f80fd5b818701915087601f830112612b70575f80fd5b813581811115612b7e575f80fd5b8860208260051b8501011115612b92575f80fd5b9598949750506020019450505056fea26469706673582212202bb9cbf1075b77cd7d3457bbca3de261272d2c895378d565b7e60406baf36f3064736f6c63430008180033";
+
+type PublisherConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: PublisherConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class Publisher__factory extends ContractFactory {
+  constructor(...args: PublisherConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      Publisher & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): Publisher__factory {
+    return super.connect(runner) as Publisher__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): PublisherInterface {
+    return new Interface(_abi) as PublisherInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): Publisher {
+    return new Contract(address, _abi, runner) as unknown as Publisher;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3812d87b5f80db97ba62f17c3485b1ba65435f0d
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/plonk_vk_publish.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { BaseUltraVerifier__factory } from "./BaseUltraVerifier__factory";
+export { PublishVerifier__factory } from "./PublishVerifier__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IMomiji__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IMomiji__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..785b60b991cd193635f910e8b1d24a1d5d37ec6d
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IMomiji__factory.ts
@@ -0,0 +1,193 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IMomiji,
+  IMomijiInterface,
+} from "../../../contracts/state.sol/IMomiji";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "tx_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "recursive_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "old_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "oracle",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32[20]",
+            name: "historic_path",
+            type: "bytes32[20]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "aggregation_object",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "current_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "utxo_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "price_limit",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "timestamp",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "deadline",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes32",
+                    name: "secret",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "amount",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "data",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct EncryptedUTXO[16]",
+                name: "encrypted_utxo",
+                type: "tuple[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "withdrawals",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments_in",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "recipients",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "nullifier_hashes",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "uids",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "swap_amounts",
+                type: "bytes32[16]",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes",
+                    name: "signature",
+                    type: "bytes",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "pi_hash",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct Deposit",
+                name: "deposit",
+                type: "tuple",
+              },
+            ],
+            internalType: "struct Transaction[]",
+            name: "transactions",
+            type: "tuple[]",
+          },
+        ],
+        internalType: "struct Batch",
+        name: "_batch",
+        type: "tuple",
+      },
+    ],
+    name: "publish",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IMomiji__factory {
+  static readonly abi = _abi;
+  static createInterface(): IMomijiInterface {
+    return new Interface(_abi) as IMomijiInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IMomiji {
+    return new Contract(address, _abi, runner) as unknown as IMomiji;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IOracle__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IOracle__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bee1fdaa4e58222401362740c546f63faf339e5e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IOracle__factory.ts
@@ -0,0 +1,70 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IOracle,
+  IOracleInterface,
+} from "../../../contracts/state.sol/IOracle";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_chainlinkFeed",
+        type: "address",
+      },
+    ],
+    name: "chainlinkPrice",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_amount",
+        type: "uint256",
+      },
+      {
+        internalType: "address",
+        name: "_chainlinkFeed",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_xftPool",
+        type: "address",
+      },
+    ],
+    name: "getCost",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IOracle__factory {
+  static readonly abi = _abi;
+  static createInterface(): IOracleInterface {
+    return new Interface(_abi) as IOracleInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IOracle {
+    return new Contract(address, _abi, runner) as unknown as IOracle;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IVerifier__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IVerifier__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e5ed95caad783ebbda78130a3502c42019a82b5f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IVerifier__factory.ts
@@ -0,0 +1,59 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IVerifier,
+  IVerifierInterface,
+} from "../../../contracts/state.sol/IVerifier";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "getVerificationKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "",
+        type: "bytes32[]",
+      },
+    ],
+    name: "verify",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IVerifier__factory {
+  static readonly abi = _abi;
+  static createInterface(): IVerifierInterface {
+    return new Interface(_abi) as IVerifierInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IVerifier {
+    return new Contract(address, _abi, runner) as unknown as IVerifier;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IWETH9__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IWETH9__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9714327722d8776b89f269d29b92a14012380858
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/IWETH9__factory.ts
@@ -0,0 +1,225 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IWETH9,
+  IWETH9Interface,
+} from "../../../contracts/state.sol/IWETH9";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "allowance",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "deposit",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "totalSupply",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "transfer",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "sender",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "recipient",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_amount",
+        type: "uint256",
+      },
+    ],
+    name: "withdraw",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IWETH9__factory {
+  static readonly abi = _abi;
+  static createInterface(): IWETH9Interface {
+    return new Interface(_abi) as IWETH9Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IWETH9 {
+    return new Contract(address, _abi, runner) as unknown as IWETH9;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/Momiji__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/Momiji__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f241f283221239857b2351063f0aeaa31d620578
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/Momiji__factory.ts
@@ -0,0 +1,2917 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../common";
+import type {
+  Momiji,
+  MomijiInterface,
+} from "../../../contracts/state.sol/Momiji";
+
+const _abi = [
+  {
+    inputs: [],
+    stateMutability: "nonpayable",
+    type: "constructor",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+    ],
+    name: "AddressEmptyCode",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "ECDSAInvalidSignature",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "length",
+        type: "uint256",
+      },
+    ],
+    name: "ECDSAInvalidSignatureLength",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    name: "ECDSAInvalidSignatureS",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "implementation",
+        type: "address",
+      },
+    ],
+    name: "ERC1967InvalidImplementation",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "ERC1967NonPayable",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "EnforcedPause",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "ExpectedPause",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "FailedInnerCall",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "InvalidInitialization",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "NotInitializing",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+    ],
+    name: "OwnableInvalidOwner",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "OwnableUnauthorizedAccount",
+    type: "error",
+  },
+  {
+    inputs: [],
+    name: "UUPSUnauthorizedCallContext",
+    type: "error",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "slot",
+        type: "bytes32",
+      },
+    ],
+    name: "UUPSUnsupportedProxiableUUID",
+    type: "error",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_batchNumber",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "bytes32",
+        name: "_oldRoot",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "_newRoot",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "_oracle",
+        type: "bytes32",
+      },
+      {
+        indexed: false,
+        internalType: "bytes32[20]",
+        name: "_historicPath",
+        type: "bytes32[20]",
+      },
+    ],
+    name: "BatchPublish",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "_merkleRoot",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "string",
+        name: "_address",
+        type: "string",
+      },
+    ],
+    name: "BroadcastAddress",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_oldPercentage",
+        type: "uint256",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_newPercentage",
+        type: "uint256",
+      },
+    ],
+    name: "BurnPercentageChanged",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_oldCap",
+        type: "uint256",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_newCap",
+        type: "uint256",
+      },
+    ],
+    name: "DailyCapChanged",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [],
+    name: "EIP712DomainChanged",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "_oldRoot",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "_utxoId",
+        type: "bytes32",
+      },
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "secret",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "amount",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "data",
+            type: "bytes32",
+          },
+        ],
+        indexed: false,
+        internalType: "struct EncryptedUTXO",
+        name: "_encryptedUTXO",
+        type: "tuple",
+      },
+    ],
+    name: "EncryptedUTXOBroadcast",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint64",
+        name: "version",
+        type: "uint64",
+      },
+    ],
+    name: "Initialized",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "previousOwner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "newOwner",
+        type: "address",
+      },
+    ],
+    name: "OwnershipTransferred",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "Paused",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        components: [
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "current_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "utxo_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "price_limit",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "timestamp",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "deadline",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes32",
+                    name: "secret",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "amount",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "data",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct EncryptedUTXO[16]",
+                name: "encrypted_utxo",
+                type: "tuple[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "withdrawals",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments_in",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "recipients",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "nullifier_hashes",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "uids",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "swap_amounts",
+                type: "bytes32[16]",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes",
+                    name: "signature",
+                    type: "bytes",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "pi_hash",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct Deposit",
+                name: "deposit",
+                type: "tuple",
+              },
+            ],
+            internalType: "struct Transaction",
+            name: "transaction",
+            type: "tuple",
+          },
+          {
+            internalType: "bytes32[93]",
+            name: "proof",
+            type: "bytes32[93]",
+          },
+          {
+            internalType: "bytes",
+            name: "proofU8",
+            type: "bytes",
+          },
+        ],
+        indexed: false,
+        internalType: "struct TransactionWithProof",
+        name: "_tx",
+        type: "tuple",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "_merkleRoot",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "_txId",
+        type: "bytes32",
+      },
+    ],
+    name: "TransactionBroadcast",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "current_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "utxo_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "price_limit",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "timestamp",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "deadline",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "amount",
+            type: "bytes32",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "secret",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "data",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct EncryptedUTXO[16]",
+            name: "encrypted_utxo",
+            type: "tuple[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "withdrawals",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments_in",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "recipients",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "nullifier_hashes",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "uids",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "swap_amounts",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes",
+                name: "signature",
+                type: "bytes",
+              },
+              {
+                internalType: "bytes32",
+                name: "pi_hash",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct Deposit",
+            name: "deposit",
+            type: "tuple",
+          },
+        ],
+        indexed: false,
+        internalType: "struct Transaction",
+        name: "_tx",
+        type: "tuple",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "_merkleRoot",
+        type: "bytes32",
+      },
+      {
+        indexed: true,
+        internalType: "bytes32",
+        name: "_txId",
+        type: "bytes32",
+      },
+    ],
+    name: "TransactionPublish",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "Unpaused",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "implementation",
+        type: "address",
+      },
+    ],
+    name: "Upgraded",
+    type: "event",
+  },
+  {
+    stateMutability: "payable",
+    type: "fallback",
+  },
+  {
+    inputs: [],
+    name: "MAX_ITEMS",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "MAX_UTXOS",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "STATE_DEPTH",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "UPGRADE_INTERFACE_VERSION",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "_previousAccumulator",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "_publicInputsHash",
+        type: "bytes32",
+      },
+    ],
+    name: "_accumulatePublicInputs",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "current_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "utxo_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "price_limit",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "timestamp",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "deadline",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "amount",
+            type: "bytes32",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "secret",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "data",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct EncryptedUTXO[16]",
+            name: "encrypted_utxo",
+            type: "tuple[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "withdrawals",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments_in",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "recipients",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "nullifier_hashes",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "uids",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "swap_amounts",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes",
+                name: "signature",
+                type: "bytes",
+              },
+              {
+                internalType: "bytes32",
+                name: "pi_hash",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct Deposit",
+            name: "deposit",
+            type: "tuple",
+          },
+        ],
+        internalType: "struct Transaction",
+        name: "_transaction",
+        type: "tuple",
+      },
+    ],
+    name: "_getSignatureHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "_signatureHash",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "batchNumber",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "_address",
+        type: "string",
+      },
+    ],
+    name: "broadcastAddress",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "current_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "utxo_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "price_limit",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "timestamp",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "deadline",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes32",
+                    name: "secret",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "amount",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "data",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct EncryptedUTXO[16]",
+                name: "encrypted_utxo",
+                type: "tuple[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "withdrawals",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments_in",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "recipients",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "nullifier_hashes",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "uids",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "swap_amounts",
+                type: "bytes32[16]",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes",
+                    name: "signature",
+                    type: "bytes",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "pi_hash",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct Deposit",
+                name: "deposit",
+                type: "tuple",
+              },
+            ],
+            internalType: "struct Transaction",
+            name: "transaction",
+            type: "tuple",
+          },
+          {
+            internalType: "bytes32[93]",
+            name: "proof",
+            type: "bytes32[93]",
+          },
+          {
+            internalType: "bytes",
+            name: "proofU8",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct TransactionWithProof",
+        name: "_tx",
+        type: "tuple",
+      },
+      {
+        internalType: "bytes32",
+        name: "_recipient",
+        type: "bytes32",
+      },
+    ],
+    name: "broadcastTransaction",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "burnPercentageSwap",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_percentage",
+        type: "uint256",
+      },
+    ],
+    name: "changeBurnPercentage",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_cap",
+        type: "uint256",
+      },
+    ],
+    name: "changeCap",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address[]",
+        name: "_addrs",
+        type: "address[]",
+      },
+    ],
+    name: "changePools",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "dailyCap",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "dailyMint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "_hash",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes",
+        name: "_signature",
+        type: "bytes",
+      },
+    ],
+    name: "ecRecover",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "eip712Domain",
+    outputs: [
+      {
+        internalType: "bytes1",
+        name: "fields",
+        type: "bytes1",
+      },
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "version",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "chainId",
+        type: "uint256",
+      },
+      {
+        internalType: "address",
+        name: "verifyingContract",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "salt",
+        type: "bytes32",
+      },
+      {
+        internalType: "uint256[]",
+        name: "extensions",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "emergencyPause",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "emergencyUnpause",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "fee",
+    outputs: [
+      {
+        internalType: "uint24",
+        name: "",
+        type: "uint24",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32[]",
+        name: "_nullifierHashes",
+        type: "bytes32[]",
+      },
+    ],
+    name: "getSpentNullifiers",
+    outputs: [
+      {
+        internalType: "bool[]",
+        name: "spent",
+        type: "bool[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_index",
+        type: "uint256",
+      },
+    ],
+    name: "getValidRootAtIndex",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getValidRoots",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_start",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "_end",
+        type: "uint256",
+      },
+    ],
+    name: "getValidRootsPaginated",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "current_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "utxo_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "price_limit",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "timestamp",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "deadline",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "amount",
+            type: "bytes32",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "secret",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "data",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct EncryptedUTXO[16]",
+            name: "encrypted_utxo",
+            type: "tuple[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "withdrawals",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments_in",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "recipients",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "nullifier_hashes",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "uids",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "swap_amounts",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes",
+                name: "signature",
+                type: "bytes",
+              },
+              {
+                internalType: "bytes32",
+                name: "pi_hash",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct Deposit",
+            name: "deposit",
+            type: "tuple",
+          },
+        ],
+        internalType: "struct Transaction",
+        name: "_tx",
+        type: "tuple",
+      },
+      {
+        internalType: "bytes32",
+        name: "_signatureHash",
+        type: "bytes32",
+      },
+    ],
+    name: "hashCircuitInputsForTx",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "current_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "utxo_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "price_limit",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "timestamp",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "deadline",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "amount",
+            type: "bytes32",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "secret",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "data",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct EncryptedUTXO[16]",
+            name: "encrypted_utxo",
+            type: "tuple[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "withdrawals",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments_in",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "recipients",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "nullifier_hashes",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "uids",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "swap_amounts",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes",
+                name: "signature",
+                type: "bytes",
+              },
+              {
+                internalType: "bytes32",
+                name: "pi_hash",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct Deposit",
+            name: "deposit",
+            type: "tuple",
+          },
+        ],
+        internalType: "struct Transaction",
+        name: "_tx",
+        type: "tuple",
+      },
+    ],
+    name: "hashCircuitInputsForTxWithoutDeposit",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "current_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "utxo_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "price_limit",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "timestamp",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "deadline",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "amount",
+            type: "bytes32",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "secret",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "data",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct EncryptedUTXO[16]",
+            name: "encrypted_utxo",
+            type: "tuple[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "withdrawals",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments_in",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "recipients",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "nullifier_hashes",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "uids",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "swap_amounts",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes",
+                name: "signature",
+                type: "bytes",
+              },
+              {
+                internalType: "bytes32",
+                name: "pi_hash",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct Deposit",
+            name: "deposit",
+            type: "tuple",
+          },
+        ],
+        internalType: "struct Transaction",
+        name: "_tx",
+        type: "tuple",
+      },
+      {
+        internalType: "bytes32",
+        name: "_signatureHash",
+        type: "bytes32",
+      },
+    ],
+    name: "hashContractOnlyInputsForTx",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "current_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "utxo_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "price_limit",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "timestamp",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "deadline",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "amount",
+            type: "bytes32",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "secret",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "data",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct EncryptedUTXO[16]",
+            name: "encrypted_utxo",
+            type: "tuple[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "withdrawals",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments_in",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "commitments",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "recipients",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "nullifier_hashes",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "uids",
+            type: "bytes32[16]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "swap_amounts",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes",
+                name: "signature",
+                type: "bytes",
+              },
+              {
+                internalType: "bytes32",
+                name: "pi_hash",
+                type: "bytes32",
+              },
+            ],
+            internalType: "struct Deposit",
+            name: "deposit",
+            type: "tuple",
+          },
+        ],
+        internalType: "struct Transaction",
+        name: "_tx",
+        type: "tuple",
+      },
+    ],
+    name: "hashContractOnlyInputsForTxWithoutDeposit",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes",
+            name: "signature",
+            type: "bytes",
+          },
+          {
+            internalType: "bytes32",
+            name: "pi_hash",
+            type: "bytes32",
+          },
+        ],
+        internalType: "struct Deposit",
+        name: "_deposit",
+        type: "tuple",
+      },
+    ],
+    name: "hashTypedDataV4",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "histRoot",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "contract IVerifier",
+        name: "_verifier",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_token",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "_txKeyHash",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "_txWrapperKeyHash",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "_recursiveKeyHash",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "_xftPool",
+        type: "address",
+      },
+    ],
+    name: "initialize",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "_nullifierHash",
+        type: "bytes32",
+      },
+    ],
+    name: "isSpent",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "lastCapReset",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "merkleRoot",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    name: "nullifierHashes",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "oracle",
+    outputs: [
+      {
+        internalType: "contract IOracle",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "owner",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "paused",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "tx_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "recursive_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "old_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "oracle",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32[20]",
+            name: "historic_path",
+            type: "bytes32[20]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "aggregation_object",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "current_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "utxo_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "price_limit",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "timestamp",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "deadline",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes32",
+                    name: "secret",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "amount",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "data",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct EncryptedUTXO[16]",
+                name: "encrypted_utxo",
+                type: "tuple[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "withdrawals",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments_in",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "recipients",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "nullifier_hashes",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "uids",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "swap_amounts",
+                type: "bytes32[16]",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes",
+                    name: "signature",
+                    type: "bytes",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "pi_hash",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct Deposit",
+                name: "deposit",
+                type: "tuple",
+              },
+            ],
+            internalType: "struct Transaction[]",
+            name: "transactions",
+            type: "tuple[]",
+          },
+        ],
+        internalType: "struct Batch",
+        name: "_batch",
+        type: "tuple",
+      },
+      {
+        internalType: "bytes32",
+        name: "_accumulator",
+        type: "bytes32",
+      },
+    ],
+    name: "prepareBatchPublicInputs",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "proxiableUUID",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "tx_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "recursive_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "old_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "oracle",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32[20]",
+            name: "historic_path",
+            type: "bytes32[20]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "aggregation_object",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "current_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "utxo_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "price_limit",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "timestamp",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "deadline",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes32",
+                    name: "secret",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "amount",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "data",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct EncryptedUTXO[16]",
+                name: "encrypted_utxo",
+                type: "tuple[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "withdrawals",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments_in",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "recipients",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "nullifier_hashes",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "uids",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "swap_amounts",
+                type: "bytes32[16]",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes",
+                    name: "signature",
+                    type: "bytes",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "pi_hash",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct Deposit",
+                name: "deposit",
+                type: "tuple",
+              },
+            ],
+            internalType: "struct Transaction[]",
+            name: "transactions",
+            type: "tuple[]",
+          },
+        ],
+        internalType: "struct Batch",
+        name: "_batch",
+        type: "tuple",
+      },
+    ],
+    name: "publish",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "recursiveKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    name: "relay",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "renounceOwnership",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "tx_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "recursive_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "old_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "oracle",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32[20]",
+            name: "historic_path",
+            type: "bytes32[20]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "aggregation_object",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "current_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "utxo_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "price_limit",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "timestamp",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "deadline",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes32",
+                    name: "secret",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "amount",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "data",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct EncryptedUTXO[16]",
+                name: "encrypted_utxo",
+                type: "tuple[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "withdrawals",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments_in",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "recipients",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "nullifier_hashes",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "uids",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "swap_amounts",
+                type: "bytes32[16]",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes",
+                    name: "signature",
+                    type: "bytes",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "pi_hash",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct Deposit",
+                name: "deposit",
+                type: "tuple",
+              },
+            ],
+            internalType: "struct Transaction[]",
+            name: "transactions",
+            type: "tuple[]",
+          },
+        ],
+        internalType: "struct Batch",
+        name: "_batch",
+        type: "tuple",
+      },
+    ],
+    name: "simulatePublish",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "swapRouter",
+    outputs: [
+      {
+        internalType: "contract ISwapRouter",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "token",
+    outputs: [
+      {
+        internalType: "contract IElasticERC20",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "newOwner",
+        type: "address",
+      },
+    ],
+    name: "transferOwnership",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "txKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "txWrapperKeyHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32[]",
+        name: "_circuits",
+        type: "bytes32[]",
+      },
+    ],
+    name: "updateCircuits",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "newImplementation",
+        type: "address",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "upgradeToAndCall",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    name: "utxoPrevRoots",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    name: "validRoots",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "verifier",
+    outputs: [
+      {
+        internalType: "contract IVerifier",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "tx_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "recursive_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "old_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "oracle",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32[20]",
+            name: "historic_path",
+            type: "bytes32[20]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "aggregation_object",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "current_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "utxo_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "price_limit",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "timestamp",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "deadline",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes32",
+                    name: "secret",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "amount",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "data",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct EncryptedUTXO[16]",
+                name: "encrypted_utxo",
+                type: "tuple[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "withdrawals",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments_in",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "recipients",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "nullifier_hashes",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "uids",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "swap_amounts",
+                type: "bytes32[16]",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes",
+                    name: "signature",
+                    type: "bytes",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "pi_hash",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct Deposit",
+                name: "deposit",
+                type: "tuple",
+              },
+            ],
+            internalType: "struct Transaction[]",
+            name: "transactions",
+            type: "tuple[]",
+          },
+        ],
+        internalType: "struct Batch",
+        name: "_batch",
+        type: "tuple",
+      },
+      {
+        internalType: "bytes32",
+        name: "_accumulator",
+        type: "bytes32",
+      },
+    ],
+    name: "verifyProof",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "xft",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "xftPool",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    stateMutability: "payable",
+    type: "receive",
+  },
+] as const;
+
+const _bytecode =
+  "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051616465620001005f395f81816141470152818161417001526143bb01526164655ff3fe608060405260043610610384575f3560e01c806371919408116101d0578063af95daca11610101578063ddca3f431161009f578063f0b02d1c1161006e578063f0b02d1c14610b19578063f2fde38b14610b2e578063f6f6bc5e14610b4d578063fc0c546a14610b6c576103f8565b8063ddca3f4314610a64578063e39c9eb214610aab578063e5285dcc14610ad6578063eb33939114610b04576103f8565b8063c31c9c07116100db578063c31c9c07146109f2578063c50a53eb14610a11578063d050786514610a30578063d419f58414610a4f576103f8565b8063af95daca14610992578063afbd8bd3146109b1578063ba873065146109dd576103f8565b806389aa6e081161016e57806395a4f7c21161014857806395a4f7c2146108ea578063993544bb146108ff578063aa2d61db1461091e578063ad3cb1cc1461093d576103f8565b806389aa6e081461087a5780638c17d367146108995780638da5cb5b146108ae576103f8565b8063800edb9d116101aa578063800edb9d14610800578063848090e81461081f57806384b0196e1461083457806384e2ad141461085b576103f8565b806371919408146107ad5780637b996fd6146107cc5780637dc0d1d0146107e1576103f8565b80634a4e3bd5116102b557806355330a9a1161025357806363f132ff1161022257806363f132ff1461073c578063671094c61461075b5780636d8550651461077a578063715018a614610799576103f8565b806355330a9a146106a757806357d4c4ee146106c65780635ab573d5146106db5780635c975abb14610706576103f8565b80634f1ef2861161028f5780634f1ef2861461064d578063514b3d151461066057806351858e271461067f57806352d1902d14610693576103f8565b80634a4e3bd5146106105780634cfb149e146106245780634ef548f114610639576103f8565b80632eb4a7ab116103225780633ddfbceb116102fc5780633ddfbceb1461059e5780634382e92a146105bd57806345e833e8146105dc5780634a0415f7146105fb576103f8565b80632eb4a7ab1461054b578063306520471461056057806335db62f31461057f576103f8565b80631f8c449d1161035e5780631f8c449d146104ab5780631fbcb0d5146104ca5780632b7ac3f3146104f65780632c58f4ed1461052c576103f8565b80631103d1f614610426578063161a054b1461044e57806317cc915c1461046d576103f8565b366103f8573373c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146103f657336001600160a01b0316346040515b5f6040518083038185875af1925050503d805f81146103ed576040519150601f19603f3d011682016040523d82523d5f602084013e6103f2565b606091505b5050505b005b3373c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146103f657336001600160a01b0316346040516103b3565b348015610431575f80fd5b5061043b600a5481565b6040519081526020015b60405180910390f35b348015610459575f80fd5b506103f6610468366004614fa5565b610b8b565b348015610478575f80fd5b5061049b610487366004615009565b60116020525f908152604090205460ff1681565b6040519015158152602001610445565b3480156104b6575f80fd5b506103f66104c5366004615020565b6114bd565b3480156104d5575f80fd5b506104e96104e4366004615052565b611593565b60405161044591906150ac565b348015610501575f80fd5b505f54610514906001600160a01b031681565b6040516001600160a01b039091168152602001610445565b348015610537575f80fd5b5061043b6105463660046150be565b6116f3565b348015610556575f80fd5b5061043b600b5481565b34801561056b575f80fd5b506103f661057a366004615141565b611852565b34801561058a575f80fd5b506103f6610599366004615141565b6119b1565b3480156105a9575f80fd5b5061043b6105b8366004615009565b611a65565b3480156105c8575f80fd5b5061043b6105d7366004615191565b611a89565b3480156105e7575f80fd5b5061049b6105f63660046151c3565b611af6565b348015610606575f80fd5b5061043b60065481565b34801561061b575f80fd5b506103f6611c30565b34801561062f575f80fd5b5061043b600c5481565b348015610644575f80fd5b506104e9611c42565b6103f661065b3660046153a2565b611c98565b34801561066b575f80fd5b506103f661067a3660046153ef565b611cb7565b34801561068a575f80fd5b506103f6612017565b34801561069e575f80fd5b5061043b612027565b3480156106b2575f80fd5b5061043b6106c1366004615452565b612055565b3480156106d1575f80fd5b5061043b60095481565b3480156106e6575f80fd5b5061043b6106f5366004615009565b60136020525f908152604090205481565b348015610711575f80fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1661049b565b348015610747575f80fd5b5061043b610756366004615191565b61224f565b348015610766575f80fd5b506103f6610775366004615485565b612459565b348015610785575f80fd5b506103f6610794366004615009565b6124b2565b3480156107a4575f80fd5b506103f6612563565b3480156107b8575f80fd5b506105146107c73660046154b8565b612574565b3480156107d7575f80fd5b5061043b600e5481565b3480156107ec575f80fd5b50600254610514906001600160a01b031681565b34801561080b575f80fd5b506103f661081a366004615009565b6125b4565b34801561082a575f80fd5b5061043b60105481565b34801561083f575f80fd5b50610848612666565b604051610445979695949392919061554d565b348015610866575f80fd5b5061043b610875366004615600565b612746565b348015610885575f80fd5b50601654610514906001600160a01b031681565b3480156108a4575f80fd5b5061043b60075481565b3480156108b9575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610514565b3480156108f5575f80fd5b5061043b60085481565b34801561090a575f80fd5b5061043b610919366004615191565b61278a565b348015610929575f80fd5b5061043b610938366004615009565b6129e8565b348015610948575f80fd5b506109856040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516104459190615637565b34801561099d575f80fd5b5061043b6109ac366004615452565b612a07565b3480156109bc575f80fd5b506109d06109cb366004615141565b612cba565b6040516104459190615649565b3480156109e8575f80fd5b5061043b60145481565b3480156109fd575f80fd5b50600354610514906001600160a01b031681565b348015610a1c575f80fd5b5061043b610a2b366004615052565b612d76565b348015610a3b575f80fd5b50601554610514906001600160a01b031681565b348015610a5a575f80fd5b5061043b60055481565b348015610a6f575f80fd5b50601654610a979074010000000000000000000000000000000000000000900462ffffff1681565b60405162ffffff9091168152602001610445565b348015610ab6575f80fd5b5061043b610ac5366004615009565b60126020525f908152604090205481565b348015610ae1575f80fd5b5061049b610af0366004615009565b5f9081526011602052604090205460ff1690565b348015610b0f575f80fd5b5061043b600d5481565b348015610b24575f80fd5b5061043b600f5481565b348015610b39575f80fd5b506103f6610b4836600461568e565b612e56565b348015610b58575f80fd5b506103f6610b673660046156a9565b612eac565b348015610b77575f80fd5b50600154610514906001600160a01b031681565b5f5c15610b96575f80fd5b60015f5d610ba261305c565b600854610bb09060026157fd565b60145410610c2b5760405162461bcd60e51b815260206004820152602360248201527f6d6f6d696a692e7075626c6973683a207374617465206465707468207265616360448201527f686564000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600554813514610ca35760405162461bcd60e51b815260206004820152602260248201527f6d6f6d696a692e7075626c6973683a20696e76616c6964207478206b6579486160448201527f73680000000000000000000000000000000000000000000000000000000000006064820152608401610c22565b600754816020013514610d1e5760405162461bcd60e51b815260206004820152602960248201527f6d6f6d696a692e7075626c6973683a20696e76616c696420726563757273697660448201527f65206b65794861736800000000000000000000000000000000000000000000006064820152608401610c22565b600c54816060013514610d995760405162461bcd60e51b815260206004820152602560248201527f6d6f6d696a692e7075626c6973683a20696e76616c696420686973746f72696360448201527f20726f6f740000000000000000000000000000000000000000000000000000006064820152608401610c22565b5f610da8610540830183615808565b600a546009549193507f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f72092505f91610de0919061584e565b67ffffffffffffffff811115610df857610df8615243565b604051908082528060200260200182016040528015610e4857816020015b604080516080810182525f8082526020808301829052928201819052606082015282525f19909201910181610e165790505b5090505f5b838110156113f3577f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720610e84610540870187615808565b83818110610e9457610e94615865565b9050602002810190610ea69190615892565b6020013503610f1c5760405162461bcd60e51b8152602060048201526024808201527f6d6f6d696a692e7075626c6973683a207478206d757374206e6f74206265206560448201527f6d707479000000000000000000000000000000000000000000000000000000006064820152608401610c22565b7f11d25ff6aa8a431fbce8e8d9a87a2d7986adf38e724fbe47f15752d0931f14d8610f4b610540870187615808565b83818110610f5b57610f5b615865565b9050602002810190610f6d9190615892565b6020013503610fe45760405162461bcd60e51b815260206004820152602a60248201527f6d6f6d696a692e7075626c6973683a207478207574786f73206d757374206e6f60448201527f7420626520656d707479000000000000000000000000000000000000000000006064820152608401610c22565b603c610ff4610540870187615808565b8381811061100457611004615865565b90506020028101906110169190615892565b6110249190606001356158fb565b156110975760405162461bcd60e51b815260206004820152603160248201527f6d6f6d696a692e7075626c6973683a2074696d657374616d70206d757374206260448201527f6520646976697369626c652062792036300000000000000000000000000000006064820152608401610c22565b426110a6610540870187615808565b838181106110b6576110b6615865565b90506020028101906110c89190615892565b60600135106111195760405162461bcd60e51b815260206004820181905260248201527f6d6f6d696a692e7075626c6973683a207478206e6f74207965742076616c69646044820152606401610c22565b603c611129610540870187615808565b8381811061113957611139615865565b905060200281019061114b9190615892565b6111599190608001356158fb565b156111cc5760405162461bcd60e51b815260206004820152603060248201527f6d6f6d696a692e7075626c6973683a20646561646c696e65206d75737420626560448201527f20646976697369626c65206279203630000000000000000000000000000000006064820152608401610c22565b426111db610540870187615808565b838181106111eb576111eb615865565b90506020028101906111fd9190615892565b608001351161124e5760405162461bcd60e51b815260206004820152601e60248201527f6d6f6d696a692e7075626c6973683a20747820686173206578706972656400006044820152606401610c22565b5f611282611260610540880188615808565b8481811061127057611270615865565b90506020028101906105d79190615892565b90505f6112be611296610540890189615808565b858181106112a6576112a6615865565b90506020028101906112b89190615892565b83612055565b90506112ca8582612d76565b9450811561130b5761130b6112e3610540890189615808565b858181106112f3576112f3615865565b90506020028101906113059190615892565b836130b8565b61134361131c610540890189615808565b8581811061132c5761132c615865565b905060200281019061133e9190615892565b613259565b61137e611354610540890189615808565b8581811061136457611364615865565b90506020028101906113769190615892565b8583866135fd565b600b5481907f48aca1b0c57ac5ec7c6882f807fc4b69f9dbe52279cf980f541149e13cebdf476113b26105408b018b615808565b878181106113c2576113c2615865565b90506020028101906113d49190615892565b6040516113e19190615b16565b60405180910390a35050600101610e4d565b506113fe81846137bc565b61140f61140a85615e6b565b613f50565b8360a0013584604001356014547fad6428c585490bbbc6ea9b4a1d150f301530bd4f6374ce30d6a4c44f547d9458600b548860c001604051611452929190615f12565b60405180910390a461146686868685611af6565b6114b25760405162461bcd60e51b815260206004820152601d60248201527f6d6f6d696a692e7075626c6973683a20696e76616c69642070726f6f660000006044820152606401610c22565b5050505f805d505050565b5f80306001600160a01b031663161a054b60e01b846040516024016114e29190615ffc565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161154d91906160bd565b5f604051808303815f865af19150503d805f8114611586576040519150601f19603f3d011682016040523d82523d5f602084013e61158b565b606091505b505050505050565b60608183106115e45760405162461bcd60e51b815260206004820152600d60248201527f496e76616c69642072616e6765000000000000000000000000000000000000006044820152606401610c22565b60045482106116355760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420656e6420696e6465780000000000000000000000000000006044820152606401610c22565b5f61164084846160ce565b67ffffffffffffffff81111561165857611658615243565b604051908082528060200260200182016040528015611681578160200160208202803683370190505b5090505f845b8481116116e757600481815481106116a1576116a1615865565b905f5260205f2001548383815181106116bc576116bc615865565b6020908102919091010152816116d1816160e1565b92505080806116df906160e1565b915050611687565b50909150505b92915050565b60408051601a80825261036082019092525f9182919060208201610340803683370190505090508360400135815f8151811061173157611731615865565b60200260200101818152505083606001358160018151811061175557611755615865565b60200260200101818152505083608001358160028151811061177957611779615865565b602002602001018181525050828160038151811061179957611799615865565b602002602001018181525050835f0135816004815181106117bc576117bc615865565b6020026020010181815250508360200135816005815181106117e0576117e0615865565b6020026020010181815250505f5b6014811015611840578460c001816014811061180c5761180c615865565b60200201358261181d8360066160f9565b8151811061182d5761182d615865565b60209081029190910101526001016117ee565b5061184a81613fad565b949350505050565b61185a61400f565b81815f81811061186c5761186c615865565b9050602002016020810190611881919061568e565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055818160018181106118c1576118c1615865565b90506020020160208101906118d6919061568e565b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790558181600281811061191657611916615865565b905060200201602081019061192b919061568e565b6016805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790558181600281811061196b5761196b615865565b9050602002016020810190611980919061568e565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555050565b6119b961400f565b81815f8181106119cb576119cb615865565b602002919091013560055550818160018181106119ea576119ea615865565b60200291909101356006555081816002818110611a0957611a09615865565b602002919091013560075550611a3582826003818110611a2b57611a2b615865565b9050602002013590565b5f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555050565b5f60048281548110611a7957611a79615865565b905f5260205f2001549050919050565b5f60a082013515611aef576116ed7fc4dd6012c4600edff964806e010811c5cddd87247d2494b9719d8bae55445435611ac18461224f565b6040805160208101939093528201526060015b60405160208183030381529060405280519060200120614083565b505f919050565b60408051601180825261024082019092525f918291906020820161022080368337019050509050611b2784846116f3565b815f81518110611b3957611b39615865565b6020026020010181815250505f5b6010811015611b9a5784610340018160108110611b6657611b66615865565b602002013582611b778360016160f9565b81518110611b8757611b87615865565b6020908102919091010152600101611b47565b505f546040517fea50d0e40000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063ea50d0e490611be79089908990869060040161610c565b602060405180830381865afa158015611c02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c269190616131565b9695505050505050565b611c3861400f565b611c406140ca565b565b60606004805480602002602001604051908101604052809291908181526020018280548015611c8e57602002820191905f5260205f20905b815481526020019060010190808311611c7a575b5050505050905090565b611ca061413c565b611ca98261420c565b611cb38282614214565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015611d015750825b90505f8267ffffffffffffffff166001148015611d1d5750303b155b905081158015611d2b575080155b15611d62576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315611dc35784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b611dcb61431a565b611dd43361432a565b611ddc61433b565b5f80546001600160a01b03808e1673ffffffffffffffffffffffffffffffffffffffff19928316178355600180548e831690841681178255601680548516909117815560058e815560068e815560078e905560158054958e16958716959095179094556003805490951673e592427a0aece92de3edee1f18e0157c0586156417909455601460085560106009819055600a8190557f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720600b81905560048054808601825597527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909601959095557f06f93f503e77fcdcacfe622e66adc639b63e8c0083f5cab5d71d461aa4562c92600c558054750bb800000000000000000000000000000000000000007fffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff90911617905591909255600d8190556040805180820182529283527f4d6f6d696a69000000000000000000000000000000000000000000000000000060208481019190915281518083019092529181527f310000000000000000000000000000000000000000000000000000000000000091810191909152611fa99190614343565b831561200a5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b61201f61400f565b611c40614355565b5f6120306143b0565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b6040805160358082526106c082019092525f91829190602082016106a080368337019050509050835f0135815f8151811061209257612092615865565b6020026020010181815250508360200135816001815181106120b6576120b6615865565b6020026020010181815250508360a00135816002815181106120da576120da615865565b6020026020010181815250506120f08484612a07565b8160038151811061210357612103615865565b6020026020010181815250505f5b601081101561184057846106c001816010811061213057612130615865565b60200201355f1c8260048151811061214a5761214a615865565b60200260200101515f1c61215e91906160f9565b5f1b8260048151811061217357612173615865565b602002602001018181525050846108c001816010811061219557612195615865565b6020020135826121a68360056160f9565b815181106121b6576121b6615865565b60200260200101818152505084610ac00181601081106121d8576121d8615865565b6020020135826121e98360156160f9565b815181106121f9576121f9615865565b60200260200101818152505084610ec001816010811061221b5761221b615865565b60200201358261222c8360256160f9565b8151811061223c5761223c615865565b6020908102919091010152600101612111565b6040805160358082526106c082019092525f91829190602082016106a080368337019050509050825f0135815f8151811061228c5761228c615865565b6020026020010181815250508260200135816001815181106122b0576122b0615865565b6020026020010181815250508260a00135816002815181106122d4576122d4615865565b6020026020010181815250506122e98361278a565b816003815181106122fc576122fc615865565b6020026020010181815250505f5b601081101561244857836106c001816010811061232957612329615865565b60200201355f1c8260048151811061234357612343615865565b60200260200101515f1c61235791906160f9565b5f1b8260048151811061236c5761236c615865565b602002602001018181525050836108c001816010811061238e5761238e615865565b60200201358261239f8360056160f9565b815181106123af576123af615865565b60200260200101818152505083610ac00181601081106123d1576123d1615865565b6020020135826123e28360156160f9565b815181106123f2576123f2615865565b60200260200101818152505083610ec001816010811061241457612414615865565b6020020135826124258360256160f9565b8151811061243557612435615865565b602090810291909101015260010161230a565b5061245281613fad565b9392505050565b5f5c15612464575f80fd5b60015f5d8181604051612478929190616150565b604051908190038120600b5490917ffc72adab542ee24184b61a98f915fe9c57b47d6ac9d0e321bef8688088d8e407905f90a35f805d5050565b6124ba61400f565b606481106125305760405162461bcd60e51b815260206004820152602f60248201527f6d6f6d696a692e6368616e67654275726e50657263656e746167653a2043616e60448201527f6e6f7420657863656564203130302500000000000000000000000000000000006064820152608401610c22565b6010546040518291907f4edd9592d353a646c5be3fa8a62e97e4db7b3237a92805a5b1e5b0b54c749fda905f90a3601055565b61256b61400f565b611c405f614412565b5f61184a8484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061448f92505050565b6125bc61400f565b6103e881106126335760405162461bcd60e51b815260206004820152602860248201527f6d6f6d696a692e6368616e67654361703a2043616e6e6f74206578636565642060448201527f31303030206270730000000000000000000000000000000000000000000000006064820152608401610c22565b600d546040518291907f6e8bb5be61baafba8ec82417b4affe3b5f010b01fe01e4dd798a605f93e82f9b905f90a3600d55565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10080549091501580156126a457506001810154155b6126f05760405162461bcd60e51b815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152606401610c22565b6126f86144ad565b612700614580565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b5f6116ed7fc4dd6012c4600edff964806e010811c5cddd87247d2494b9719d8bae554454358360200135604051602001611ad4929190918252602082015260400190565b604080516063808252610c8082019092525f9182919060208201610c60803683370190505090508260600135815f815181106127c8576127c8615865565b6020026020010181815250508260800135816001815181106127ec576127ec615865565b60200260200101818152505082604001358160028151811061281057612810615865565b6020026020010181815250505f5b60108110156124485783610cc001816010811061283d5761283d615865565b60200201358261284e8360036160f9565b8151811061285e5761285e615865565b602002602001018181525050836112c001816010811061288057612880615865565b6020020135826128918360136160f9565b815181106128a1576128a1615865565b602002602001018181525050836110c00181601081106128c3576128c3615865565b6020020135826128d48360236160f9565b815181106128e4576128e4615865565b6020026020010181815250508360c001816010811061290557612905615865565b60600201358261291683600361584e565b6129219060336160f9565b8151811061293157612931615865565b6020026020010181815250508360c001816010811061295257612952615865565b606002016020013582826003612968919061584e565b6129739060346160f9565b8151811061298357612983615865565b6020026020010181815250508360c00181601081106129a4576129a4615865565b6060020160400135828260036129ba919061584e565b6129c59060356160f9565b815181106129d5576129d5615865565b602090810291909101015260010161281e565b600481815481106129f7575f80fd5b5f91825260209091200154905081565b604080516064808252610ca082019092525f9182919060208201610c80803683370190505090508360600135815f81518110612a4557612a45615865565b602002602001018181525050836080013581600181518110612a6957612a69615865565b6020908102919091010152612a9f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060016160f9565b612aa990846158fb565b5f1b81600281518110612abe57612abe615865565b602002602001018181525050836040013581600381518110612ae257612ae2615865565b6020026020010181815250505f5b60108110156118405784610cc0018160108110612b0f57612b0f615865565b602002013582612b208360046160f9565b81518110612b3057612b30615865565b602002602001018181525050846112c0018160108110612b5257612b52615865565b602002013582612b638360146160f9565b81518110612b7357612b73615865565b602002602001018181525050846110c0018160108110612b9557612b95615865565b602002013582612ba68360246160f9565b81518110612bb657612bb6615865565b6020026020010181815250508460c0018160108110612bd757612bd7615865565b606002013582612be883600361584e565b612bf39060346160f9565b81518110612c0357612c03615865565b6020026020010181815250508460c0018160108110612c2457612c24615865565b606002016020013582826003612c3a919061584e565b612c459060356160f9565b81518110612c5557612c55615865565b6020026020010181815250508460c0018160108110612c7657612c76615865565b606002016040013582826003612c8c919061584e565b612c979060366160f9565b81518110612ca757612ca7615865565b6020908102919091010152600101612af0565b6060818067ffffffffffffffff811115612cd657612cd6615243565b604051908082528060200260200182016040528015612cff578160200160208202803683370190505b5091505f5b81811015612d6e57612d3c858583818110612d2157612d21615865565b905060200201355f9081526011602052604090205460ff1690565b15612d66576001838281518110612d5557612d55615865565b911515602092830291909101909101525b600101612d04565b505092915050565b60408051600480825260a082019092525f918291906020820160808036833701905050905083815f81518110612dae57612dae615865565b6020026020010181815250508281600181518110612dce57612dce615865565b60200260200101818152505060055481600281518110612df057612df0615865565b60209081029190910101527f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f7208414612e2a57600754612e2e565b6006545b81600381518110612e4157612e41615865565b60200260200101818152505061184a81613fad565b612e5e61400f565b6001600160a01b038116612ea0576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610c22565b612ea981614412565b50565b5f5c15612eb7575f80fd5b60015f5d5f80612ec78480615892565b60a001351115612f3357612f2c7fc4dd6012c4600edff964806e010811c5cddd87247d2494b9719d8bae55445435612eff8580615892565b612f0e906114c081019061615f565b60200135604051602001611ad4929190918252602082015260400190565b9050612f36565b505f5b5f612f446112b88580615892565b5f8181526013602052604090205490915015612fc85760405162461bcd60e51b815260206004820152602560248201527f6d6f6d696a692e62726f6164636173743a20616c72656164792062726f61646360448201527f61737465640000000000000000000000000000000000000000000000000000006064820152608401610c22565b5f5b6010811015613017576002612fdf8680615892565b610cc0018260108110612ff457612ff4615865565b60200201350361300f575f8281526013602052604090208490555b600101612fca565b5080600b547f91efbe0215cd10bb052900975342af064e302eb66071e2a5c31632991497b9b58660405161304b9190616191565b60405180910390a350505f805d5050565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611c40576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6130d5826130cb6114c086018661615f565b6107c790806161f4565b6001546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015292935060a086013592909116906370a0823190602401602060405180830381865afa15801561313f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131639190616237565b10156131d75760405162461bcd60e51b815260206004820152602c60248201527f6d6f6d696a692e5f7075626c6973684465706f7369743a20696e73756666696360448201527f69656e742062616c616e636500000000000000000000000000000000000000006064820152608401610c22565b6001546040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260a0860135602483015290911690639dc29fac906044015f604051808303815f87803b15801561323e575f80fd5b505af1158015613250573d5f803e3d5ffd5b50505050505050565b5f5b6010811015611cb3577f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720610ec08301826010811061329b5761329b615865565b6020020135146133905760115f83610ec00183601081106132be576132be615865565b6020908102919091013582528101919091526040015f205460ff161561334c5760405162461bcd60e51b815260206004820152602860248201527f6d6f6d696a692e5f7075626c69736857697468647261773a206e756c6c69666960448201527f6572207370656e740000000000000000000000000000000000000000000000006064820152608401610c22565b600160115f84610ec001846010811061336757613367615865565b602002013581526020019081526020015f205f6101000a81548160ff0219169083151502179055505b7f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720610ac0830182601081106133c7576133c7615865565b6020020135146135125760125f83610ac00183601081106133ea576133ea615865565b602002013581526020019081526020015f20545f801b146134725760405162461bcd60e51b8152602060048201526024808201527f6d6f6d696a692e5f7075626c69736857697468647261773a207574786f20657860448201527f69737473000000000000000000000000000000000000000000000000000000006064820152608401610c22565b600b5460125f84610ac001846010811061348e5761348e615865565b602002013581526020019081526020015f2081905550816110c00181601081106134ba576134ba615865565b6020020135600b547fec4ce5084cd118adcfcc534001c121cc3f04525ef85b0c342ed2fe88e629286b8460c00184601081106134f8576134f8615865565b60600201604051613509919061624e565b60405180910390a35b7f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f7206108c08301826010811061354957613549615865565b6020020135146135f55760125f836108c001836010811061356c5761356c615865565b602002013581526020019081526020015f20545f801b036135f55760405162461bcd60e51b815260206004820152602860248201527f6d6f6d696a692e7075626c6973683a20636f6d6d69746d656e7420646f65736e60448201527f27742065786973740000000000000000000000000000000000000000000000006064820152608401610c22565b60010161325b565b5f5b600a548110156137b5577f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f72080610cc08701836010811061364157613641615865565b6020020135146137ac576002610cc08701836010811061366357613663615865565b60200201350361368157505f8381526013602052604090205461369f565b85610cc001826010811061369757613697615865565b602002013590505b5f866112c00183601081106136b6576136b6615865565b602002013590505f816106c0890185601081106136d5576136d5615865565b60200201355f1c6136e691906160ce565b9050606460105460646136f991906160ce565b613703908461584e565b61370d919061626f565b91505f60408901357f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f72014613745576040890135613747565b5f5b90506040518060800160405280858152602001838152602001848152602001826001600160a01b03168152508886600a5489613783919061584e565b61378d91906160f9565b8151811061379d5761379d615865565b60200260200101819052505050505b506001016135ff565b5050505050565b5f600190505f805f600a54856137d2919061584e565b6137dd9060016160f9565b67ffffffffffffffff8111156137f5576137f5615243565b60405190808252806020026020018201604052801561381e578160200160208202803683370190505b50604080516080810182525f80825260208201819052918101829052606081018290529192505b86811015613a86575f5b600a54811015613a7d578881600a5484613869919061584e565b61387391906160f9565b8151811061388357613883615865565b602002602001015192507f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f7205f1b835f0151141580156138c25750825115155b15613a755782517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd016138f3574183525b82515f1901613900573383525b82606001516001600160a01b0316856001600160a01b0316101561392657826060015194505b8251805c905f82900361398557845f0151868a8151811061394957613949615865565b60200260200101818152505082600a5485613964919061584e565b61396e91906160f9565b915081815d8861397d816160e1565b995050613a61565b6020850151156139c25784602001518b83815181106139a6576139a6615865565b60200260200101516020018181516139be91906160f9565b9052505b6040850151156139ff5784604001518b83815181106139e3576139e3615865565b60200260200101516040018181516139fb91906160f9565b9052505b60405180608001604052805f801b81526020015f81526020015f81526020015f6001600160a01b03168152508b84600a5487613a3b919061584e565b613a4591906160f9565b81518110613a5557613a55615865565b60200260200101819052505b6040850151613a7090896160f9565b975050505b60010161384f565b50600101613845565b50600f5442906201518090613a9b90836160ce565b1115613aab57600f8190555f600e555b5f8515613f4557600154604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516103e8926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015613b14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b389190616237565b600d54613b45919061584e565b613b4f919061626f565b600e54613b5c90886160f9565b1115613bd05760405162461bcd60e51b815260206004820152602a60248201527f6d6f6d696a692e5f68616e646c655061796d656e74733a206461696c7920636160448201527f70206578636565646564000000000000000000000000000000000000000000006064820152608401610c22565b85600e5f828254613be191906160f9565b90915550506001546040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018890526001600160a01b03909116906340c10f19906044015f604051808303815f87803b158015613c48575f80fd5b505af1158015613c5a573d5f803e3d5ffd5b50505050613c6886866145d1565b905060015b87811015613f43575f801b858281518110613c8a57613c8a615865565b602002602001015114613f3b575f80868381518110613cab57613cab615865565b60200260200101519050805c91508b8281518110613ccb57613ccb615865565b602002602001015195505f8087604001511115613d565789858860400151613cf3919061584e565b613cfd919061626f565b9050613d1f888581518110613d1457613d14615865565b602002602001015190565b6001600160a01b03166108fc8290811502906040515f60405180830381858888f19350505050158015613d54573d5f803e3d5ffd5b505b60208701518015613f3657600154604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516103e8926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015613dc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613de79190616237565b600d54613df4919061584e565b613dfe919061626f565b600e54613e0b90836160f9565b1115613e7f5760405162461bcd60e51b815260206004820152602a60248201527f6d6f6d696a692e5f68616e646c655061796d656e74733a206461696c7920636160448201527f70206578636565646564000000000000000000000000000000000000000000006064820152608401610c22565b80600e5f828254613e9091906160f9565b909155505060015489516001600160a01b03909116906340c10f1990613ec2908c9089908110613d1457613d14615865565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b158015613f1f575f80fd5b505af1158015613f31573d5f803e3d5ffd5b505050505b505050505b600101613c6d565b505b505050505050505050565b604081018051600480546001810182555f9182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01919091559051600b556080820151600c556014805491613fa5836160e1565b919050555050565b5f8082604051602001613fc09190616282565b6040516020818303038152906040528051906020012090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000600161400591906160f9565b61245290826158fb565b336140417f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614611c40576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610c22565b5f6116ed61408f614823565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6140d2614831565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806141d557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166141c97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611c40576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ea961400f565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561426e575060408051601f3d908101601f1916820190925261426b91810190616237565b60015b6142af576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610c22565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461430b576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610c22565b614315838361488c565b505050565b6143226148e1565b611c40614948565b6143326148e1565b612ea98161497b565b611c406148e1565b61434b6148e1565b611cb38282614983565b61435d61305c565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583361411e565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c40576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f805f8061449d86866149f5565b9250925092506116e78282614a3e565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100916144fe906162b7565b80601f016020809104026020016040519081016040528092919081815260200182805461452a906162b7565b80156145755780601f1061454c57610100808354040283529160200191614575565b820191905f5260205f20905b81548152906001019060200180831161455857829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100916144fe906162b7565b6001546003546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018590525f92919091169063095ea7b3906044016020604051808303815f875af1158015614640573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146649190616131565b5060035460408051610100810182526016546001600160a01b03808216835273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2602084019081527401000000000000000000000000000000000000000090920462ffffff9081168486019081523060608601908152426080870190815260a087018c81525f60c089019081528c871660e08a0190815299517f414bf3890000000000000000000000000000000000000000000000000000000081529851871660048a0152965186166024890152925190931660448701525183166064860152905160848501525160a4840152905160c48301529151821660e482015291169063414bf38990610104016020604051808303815f875af115801561477d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147a19190616237565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905290915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d906024015f604051808303815f87803b158015614807575f80fd5b505af1158015614819573d5f803e3d5ffd5b5050505092915050565b5f61482c614b41565b905090565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611c40576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61489582614bb4565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156148d9576143158282614c50565b611cb3614cc2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611c40576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6149506148e1565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300805460ff19169055565b612e5e6148e1565b61498b6148e1565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1026149d78482616346565b50600381016149e68382616346565b505f8082556001909101555050565b5f805f8351604103614a2c576020840151604085015160608601515f1a614a1e88828585614cfa565b955095509550505050614a37565b505081515f91506002905b9250925092565b5f826003811115614a5157614a51616402565b03614a5a575050565b6001826003811115614a6e57614a6e616402565b03614aa5576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115614ab957614ab9616402565b03614af3576040517ffce698f700000000000000000000000000000000000000000000000000000000815260048101829052602401610c22565b6003826003811115614b0757614b07616402565b03611cb3576040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260048101829052602401610c22565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614b6b614dc2565b614b73614e3d565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b806001600160a01b03163b5f03614c02576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610c22565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051614c6c91906160bd565b5f60405180830381855af49150503d805f8114614ca4576040519150601f19603f3d011682016040523d82523d5f602084013e614ca9565b606091505b5091509150614cb9858383614e92565b95945050505050565b3415611c40576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115614d3357505f91506003905082614db8565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015614d84573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116614daf57505f925060019150829050614db8565b92505f91508190505b9450945094915050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081614ded6144ad565b805190915015614e0557805160209091012092915050565b81548015614e14579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081614e68614580565b805190915015614e8057805160209091012092915050565b60018201548015614e14579392505050565b606082614ea757614ea282614f07565b612452565b8151158015614ebe57506001600160a01b0384163b155b15614f00576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610c22565b5080612452565b805115614f175780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8083601f840112614f59575f80fd5b50813567ffffffffffffffff811115614f70575f80fd5b602083019150836020828501011115614f87575f80fd5b9250929050565b5f6105608284031215614f9f575f80fd5b50919050565b5f805f60408486031215614fb7575f80fd5b833567ffffffffffffffff80821115614fce575f80fd5b614fda87838801614f49565b90955093506020860135915080821115614ff2575f80fd5b50614fff86828701614f8e565b9150509250925092565b5f60208284031215615019575f80fd5b5035919050565b5f60208284031215615030575f80fd5b813567ffffffffffffffff811115615046575f80fd5b61184a84828501614f8e565b5f8060408385031215615063575f80fd5b50508035926020909101359150565b5f815180845260208085019450602084015f5b838110156150a157815187529582019590820190600101615085565b509495945050505050565b602081525f6124526020830184615072565b5f80604083850312156150cf575f80fd5b823567ffffffffffffffff8111156150e5575f80fd5b6150f185828601614f8e565b95602094909401359450505050565b5f8083601f840112615110575f80fd5b50813567ffffffffffffffff811115615127575f80fd5b6020830191508360208260051b8501011115614f87575f80fd5b5f8060208385031215615152575f80fd5b823567ffffffffffffffff811115615168575f80fd5b61517485828601615100565b90969095509350505050565b5f6114e08284031215614f9f575f80fd5b5f602082840312156151a1575f80fd5b813567ffffffffffffffff8111156151b7575f80fd5b61184a84828501615180565b5f805f80606085870312156151d6575f80fd5b843567ffffffffffffffff808211156151ed575f80fd5b6151f988838901614f49565b90965094506020870135915080821115615211575f80fd5b5061521e87828801614f8e565b949793965093946040013593505050565b6001600160a01b0381168114612ea9575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561529357615293615243565b60405290565b6040516101e0810167ffffffffffffffff8111828210171561529357615293615243565b604051610120810167ffffffffffffffff8111828210171561529357615293615243565b604051610200810167ffffffffffffffff8111828210171561529357615293615243565b604051601f8201601f1916810167ffffffffffffffff8111828210171561532e5761532e615243565b604052919050565b5f82601f830112615345575f80fd5b813567ffffffffffffffff81111561535f5761535f615243565b6153726020601f19601f84011601615305565b818152846020838601011115615386575f80fd5b816020850160208301375f918101602001919091529392505050565b5f80604083850312156153b3575f80fd5b82356153be8161522f565b9150602083013567ffffffffffffffff8111156153d9575f80fd5b6153e585828601615336565b9150509250929050565b5f805f805f8060c08789031215615404575f80fd5b863561540f8161522f565b9550602087013561541f8161522f565b945060408701359350606087013592506080870135915060a08701356154448161522f565b809150509295509295509295565b5f8060408385031215615463575f80fd5b823567ffffffffffffffff811115615479575f80fd5b6150f185828601615180565b5f8060208385031215615496575f80fd5b823567ffffffffffffffff8111156154ac575f80fd5b61517485828601614f49565b5f805f604084860312156154ca575f80fd5b83359250602084013567ffffffffffffffff8111156154e7575f80fd5b6154f386828701614f49565b9497909650939450505050565b5f5b8381101561551a578181015183820152602001615502565b50505f910152565b5f8151808452615539816020860160208601615500565b601f01601f19169290920160200192915050565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0602084015261558960e084018a615522565b838103604085015261559b818a615522565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b818110156155ee578351835292840192918401916001016155d2565b50909c9b505050505050505050505050565b5f60208284031215615610575f80fd5b813567ffffffffffffffff811115615626575f80fd5b820160408185031215612452575f80fd5b602081525f6124526020830184615522565b602080825282518282018190525f9190848201906040850190845b81811015615682578351151583529284019291840191600101615664565b50909695505050505050565b5f6020828403121561569e575f80fd5b81356124528161522f565b5f80604083850312156156ba575f80fd5b823567ffffffffffffffff8111156156d0575f80fd5b8301610be081860312156156e2575f80fd5b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b600181815b8085111561575757815f190482111561573d5761573d6156f0565b8085161561574a57918102915b93841c9390800290615722565b509250929050565b5f8261576d575060016116ed565b8161577957505f6116ed565b816001811461578f5760028114615799576157b5565b60019150506116ed565b60ff8411156157aa576157aa6156f0565b50506001821b6116ed565b5060208310610133831016604e8410600b84101617156157d8575081810a6116ed565b6157e2838361571d565b805f19048211156157f5576157f56156f0565b029392505050565b5f612452838361575f565b5f808335601e1984360301811261581d575f80fd5b83018035915067ffffffffffffffff821115615837575f80fd5b6020019150600581901b3603821315614f87575f80fd5b80820281158282048414176116ed576116ed6156f0565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb218336030181126158c4575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82615909576159096158ce565b500690565b805f5b60108110156159445781358452602080830135908501526040808301359085015260609384019390910190600101615911565b50505050565b6102008183375050565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112615986575f80fd5b90910192915050565b5f808335601e198436030181126159a4575f80fd5b830160208101925035905067ffffffffffffffff8111156159c3575f80fd5b803603821315614f87575f80fd5b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b5f615a05828361598f565b60408552615a176040860182846159d1565b915050602083013560208501528091505092915050565b5f6114e0823584526020830135602085015260408301356040850152606083013560608501526080830135608085015260a083013560a0850152615a7860c0850160c0850161590e565b6106c0615a8981860182860161594a565b506108c0615a9b81860182860161594a565b50610ac0615aad81860182860161594a565b50610cc0615abf81860182860161594a565b50610ec0615ad181860182860161594a565b506110c0615ae381860182860161594a565b506112c0615af581860182860161594a565b506114c0615b0581850185615954565b8282870152611c26838701826159fa565b602081525f6124526020830184615a2e565b5f82601f830112615b37575f80fd5b60405161028080820182811067ffffffffffffffff82111715615b5c57615b5c615243565b60405283018185821115615b6e575f80fd5b845b82811015615b88578035825260209182019101615b70565b509195945050505050565b5f82601f830112615ba2575f80fd5b615baa6152e1565b80610200840185811115615bbc575f80fd5b845b81811015615bd6578035845260209384019301615bbe565b509095945050505050565b5f82601f830112615bf0575f80fd5b615bf86152e1565b80610600840185811115615c0a575f80fd5b845b81811015615bd65760608188031215615c23575f80fd5b615c2b615270565b8135815260208083013581830152604080840135908301529085529390930192606001615c0c565b5f60408284031215615c63575f80fd5b6040516040810167ffffffffffffffff8282108183111715615c8757615c87615243565b816040528293508435915080821115615c9e575f80fd5b50615cab85828601615336565b825250602083013560208201525092915050565b5f82601f830112615cce575f80fd5b8135602067ffffffffffffffff80831115615ceb57615ceb615243565b8260051b615cfa838201615305565b9384528581018301938381019088861115615d13575f80fd5b84880192505b85831015615e5f57823584811115615d2f575f80fd5b88016114e0818b03601f1901811315615d46575f80fd5b615d4e615299565b87830135815260408084013589830152606080850135828401526080915081850135818401525060a0808501358284015260c0915081850135818401525060e0615d9a8e828701615be1565b82840152615dac8e6106e08701615b93565b9083015250615dbf8c6108e08501615b93565b610100820152615dd38c610ae08501615b93565b610120820152615de78c610ce08501615b93565b610140820152615dfb8c610ee08501615b93565b610160820152615e0f8c6110e08501615b93565b610180820152615e238c6112e08501615b93565b6101a0820152908201359086821115615e3a575f80fd5b615e488c8984860101615c53565b6101c0820152845250509184019190840190615d19565b98975050505050505050565b5f6105608236031215615e7c575f80fd5b615e846152bd565b823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a0820152615ec73660c08501615b28565b60c0820152615eda366103408501615b93565b60e082015261054083013567ffffffffffffffff811115615ef9575f80fd5b615f0536828601615cbf565b6101008301525092915050565b8281526102a081016102808360208401379392505050565b5f808335601e19843603018112615f3f575f80fd5b830160208101925035905067ffffffffffffffff811115615f5e575f80fd5b8060051b3603821315614f87575f80fd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb21833603018112615986575f80fd5b5f838385526020808601955060208560051b830101845f5b87811015615fef57601f19858403018952615fdd83615fd8848a615f6f565b615a2e565b98840198925090830190600101615fb9565b5090979650505050505050565b604081526040808201525f7f30303030303030303030303030303030303030303030303030303030303030308060608401528060808401525060a06020830152823560a0830152602083013560c0830152604083013560e08301526060830135610100830152608083013561012083015260a083013561014083015261028060c084016101608401376160976103e08301610340850161594a565b6160a5610540840184615f2a565b6105606105e0850152614cb961060085018284615fa1565b5f82516158c4818460208701615500565b818103818111156116ed576116ed6156f0565b5f5f1982036160f2576160f26156f0565b5060010190565b808201808211156116ed576116ed6156f0565b604081525f61611f6040830185876159d1565b8281036020840152611c268185615072565b5f60208284031215616141575f80fd5b81518015158114612452575f80fd5b818382375f9101908152919050565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126158c4575f80fd5b602081525f6161a08384615f6f565b610be08060208501526161b7610c00850183615a2e565b9150610ba06020860160408601376161d3610bc086018661598f565b601f1986850301838701526161e98482846159d1565b979650505050505050565b5f808335601e19843603018112616209575f80fd5b83018035915067ffffffffffffffff821115616223575f80fd5b602001915036819003821315614f87575f80fd5b5f60208284031215616247575f80fd5b5051919050565b813581526020808301359082015260408083013590820152606081016116ed565b5f8261627d5761627d6158ce565b500490565b81515f9082906020808601845b838110156162ab5781518552938201939082019060010161628f565b50929695505050505050565b600181811c908216806162cb57607f821691505b602082108103614f9f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b601f82111561431557805f5260205f20601f840160051c810160208510156163275750805b601f840160051c820191505b818110156137b5575f8155600101616333565b815167ffffffffffffffff81111561636057616360615243565b6163748161636e84546162b7565b84616302565b602080601f8311600181146163a7575f84156163905750858301515b5f19600386901b1c1916600185901b17855561158b565b5f85815260208120601f198616915b828110156163d5578886015182559484019460019091019084016163b6565b50858210156163f257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea2646970667358221220a64b7938a5c1e4af6e517810f07c91033292aec4d6520e2dece78171ee009aba64736f6c63430008180033";
+
+type MomijiConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: MomijiConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class Momiji__factory extends ContractFactory {
+  constructor(...args: MomijiConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      Momiji & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): Momiji__factory {
+    return super.connect(runner) as Momiji__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): MomijiInterface {
+    return new Interface(_abi) as MomijiInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): Momiji {
+    return new Contract(address, _abi, runner) as unknown as Momiji;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/TechnicalPreviewTest__factory.ts b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/TechnicalPreviewTest__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c9a2282d5fe8e2372b8ee15c9fc36d856a98c526
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/TechnicalPreviewTest__factory.ts
@@ -0,0 +1,843 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../common";
+import type {
+  TechnicalPreviewTest,
+  TechnicalPreviewTestInterface,
+} from "../../../contracts/TechnicalPreview.sol/TechnicalPreviewTest";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    name: "log",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    name: "log_address",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint256[]",
+        name: "val",
+        type: "uint256[]",
+      },
+    ],
+    name: "log_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "int256[]",
+        name: "val",
+        type: "int256[]",
+      },
+    ],
+    name: "log_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address[]",
+        name: "val",
+        type: "address[]",
+      },
+    ],
+    name: "log_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    name: "log_bytes",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    name: "log_bytes32",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    name: "log_int",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "address",
+        name: "val",
+        type: "address",
+      },
+    ],
+    name: "log_named_address",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "uint256[]",
+        name: "val",
+        type: "uint256[]",
+      },
+    ],
+    name: "log_named_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "int256[]",
+        name: "val",
+        type: "int256[]",
+      },
+    ],
+    name: "log_named_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "address[]",
+        name: "val",
+        type: "address[]",
+      },
+    ],
+    name: "log_named_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "bytes",
+        name: "val",
+        type: "bytes",
+      },
+    ],
+    name: "log_named_bytes",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "bytes32",
+        name: "val",
+        type: "bytes32",
+      },
+    ],
+    name: "log_named_bytes32",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "val",
+        type: "int256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "log_named_decimal_int",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "val",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "log_named_decimal_uint",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "val",
+        type: "int256",
+      },
+    ],
+    name: "log_named_int",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "string",
+        name: "val",
+        type: "string",
+      },
+    ],
+    name: "log_named_string",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "val",
+        type: "uint256",
+      },
+    ],
+    name: "log_named_uint",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    name: "log_string",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    name: "log_uint",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    name: "logs",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "IS_TEST",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_address",
+        type: "address",
+      },
+      {
+        internalType: "bytes",
+        name: "_proof",
+        type: "bytes",
+      },
+      {
+        components: [
+          {
+            internalType: "bytes32",
+            name: "tx_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "recursive_key_hash",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "old_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "new_hist_root",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32",
+            name: "oracle",
+            type: "bytes32",
+          },
+          {
+            internalType: "bytes32[20]",
+            name: "historic_path",
+            type: "bytes32[20]",
+          },
+          {
+            internalType: "bytes32[16]",
+            name: "aggregation_object",
+            type: "bytes32[16]",
+          },
+          {
+            components: [
+              {
+                internalType: "bytes32",
+                name: "current_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "utxo_root",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "price_limit",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "timestamp",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "deadline",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "amount",
+                type: "bytes32",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes32",
+                    name: "secret",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "amount",
+                    type: "bytes32",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "data",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct EncryptedUTXO[16]",
+                name: "encrypted_utxo",
+                type: "tuple[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "withdrawals",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments_in",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "commitments",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "recipients",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "nullifier_hashes",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "uids",
+                type: "bytes32[16]",
+              },
+              {
+                internalType: "bytes32[16]",
+                name: "swap_amounts",
+                type: "bytes32[16]",
+              },
+              {
+                components: [
+                  {
+                    internalType: "bytes",
+                    name: "signature",
+                    type: "bytes",
+                  },
+                  {
+                    internalType: "bytes32",
+                    name: "pi_hash",
+                    type: "bytes32",
+                  },
+                ],
+                internalType: "struct Deposit",
+                name: "deposit",
+                type: "tuple",
+              },
+            ],
+            internalType: "struct Transaction[]",
+            name: "transactions",
+            type: "tuple[]",
+          },
+        ],
+        internalType: "struct Batch",
+        name: "_batch",
+        type: "tuple",
+      },
+    ],
+    name: "coinbaseTest",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "contractInstance",
+    outputs: [
+      {
+        internalType: "contract TechnicalPreview",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "excludeArtifacts",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "excludedArtifacts_",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "excludeContracts",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "excludedContracts_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "excludeSenders",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "excludedSenders_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "failed",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "contract IVerifier",
+        name: "_outerVerifier",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_token",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "_txKeyHash",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "_txWrapperKeyHash",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "_recursiveKeyHash",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "_xftPool",
+        type: "address",
+      },
+    ],
+    name: "setUp",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetArtifactSelectors",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "string",
+            name: "artifact",
+            type: "string",
+          },
+          {
+            internalType: "bytes4[]",
+            name: "selectors",
+            type: "bytes4[]",
+          },
+        ],
+        internalType: "struct StdInvariant.FuzzArtifactSelector[]",
+        name: "targetedArtifactSelectors_",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetArtifacts",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "targetedArtifacts_",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetContracts",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "targetedContracts_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetInterfaces",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "string[]",
+            name: "artifacts",
+            type: "string[]",
+          },
+        ],
+        internalType: "struct StdInvariant.FuzzInterface[]",
+        name: "targetedInterfaces_",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetSelectors",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "bytes4[]",
+            name: "selectors",
+            type: "bytes4[]",
+          },
+        ],
+        internalType: "struct StdInvariant.FuzzSelector[]",
+        name: "targetedSelectors_",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetSenders",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "targetedSenders_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x6080604052600c8054600160ff199182168117909255601e8054909116909117905534801561002c575f80fd5b5061649b8061003a5f395ff3fe608060405234801562000010575f80fd5b5060043610620000f8575f3560e01c80637c6b2fc41162000093578063b5508aa9116200006b578063b5508aa91462000212578063ba414fa6146200021c578063e20c9f711462000237578063fa7626d41462000241575f80fd5b80637c6b2fc414620001c957806385226c8114620001e0578063916a17c614620001f9575f80fd5b80633e5e3c2311620000d35780633e5e3c2314620001835780633f7286f4146200018d5780636577d07a146200019757806366d9a9a014620001b0575f80fd5b80631ed7831c14620000fc57806329fa6a6f146200011e5780632ade3880146200016a575b5f80fd5b620001066200024f565b60405162000115919062000d03565b60405180910390f35b601e546200014490610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000115565b62000174620002be565b60405162000115919062000da3565b6200010662000413565b6200010662000480565b620001ae620001a836600462000eb3565b620004ed565b005b620001ba6200061d565b60405162000115919062000fc1565b620001ae620001da3660046200104c565b620007a2565b620001ea6200085b565b604051620001159190620010b6565b6200020362000930565b6040516200011591906200111c565b620001ea62000a37565b6200022662000b0c565b604051901515815260200162000115565b6200010662000be0565b601e54620002269060ff1681565b60606016805480602002602001604051908101604052809291908181526020018280548015620002b457602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831162000288575b5050505050905090565b6060601d805480602002602001604051908101604052809291908181526020015f905b828210156200040a575f848152602080822060408051808201825260028702909201805473ffffffffffffffffffffffffffffffffffffffff168352600181018054835181870281018701909452808452939591948681019491929084015b82821015620003f2578382905f5260205f2001805462000360906200119c565b80601f01602080910402602001604051908101604052809291908181526020018280546200038e906200119c565b8015620003dd5780601f10620003b357610100808354040283529160200191620003dd565b820191905f5260205f20905b815481529060010190602001808311620003bf57829003601f168201915b50505050508152602001906001019062000340565b505050508152505081526020019060010190620002e1565b50505050905090565b60606018805480602002602001604051908101604052809291908181526020018280548015620002b457602002820191905f5260205f2090815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831162000288575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015620002b457602002820191905f5260205f2090815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831162000288575050505050905090565b6040517fff483c5400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ff483c54906024015f604051808303815f87803b15801562000566575f80fd5b505af115801562000579573d5f803e3d5ffd5b50505050620005884162000c4d565b601e546040517f161a054b00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063161a054b90620005e8908690869086906004016200150f565b5f604051808303815f87803b15801562000600575f80fd5b505af115801562000613573d5f803e3d5ffd5b5050505050505050565b6060601b805480602002602001604051908101604052809291908181526020015f905b828210156200040a578382905f5260205f2090600202016040518060400160405290815f8201805462000673906200119c565b80601f0160208091040260200160405190810160405280929190818152602001828054620006a1906200119c565b8015620006f05780601f10620006c657610100808354040283529160200191620006f0565b820191905f5260205f20905b815481529060010190602001808311620006d257829003601f168201915b50505050508152602001600182018054806020026020016040519081016040528092919081815260200182805480156200078957602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411620007355790505b5050505050815250508152602001906001019062000640565b858585858585604051620007b69062000cf5565b73ffffffffffffffffffffffffffffffffffffffff9687168152948616602086015260408501939093526060840191909152608083015290911660a082015260c001604051809103905ff08015801562000812573d5f803e3d5ffd5b50601e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b6060601a805480602002602001604051908101604052809291908181526020015f905b828210156200040a578382905f5260205f200180546200089e906200119c565b80601f0160208091040260200160405190810160405280929190818152602001828054620008cc906200119c565b80156200091b5780601f10620008f1576101008083540402835291602001916200091b565b820191905f5260205f20905b815481529060010190602001808311620008fd57829003601f168201915b5050505050815260200190600101906200087e565b6060601c805480602002602001604051908101604052809291908181526020015f905b828210156200040a575f84815260209081902060408051808201825260028602909201805473ffffffffffffffffffffffffffffffffffffffff16835260018101805483518187028101870190945280845293949193858301939283018282801562000a1e57602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411620009ca5790505b5050505050815250508152602001906001019062000953565b60606019805480602002602001604051908101604052809291908181526020015f905b828210156200040a578382905f5260205f2001805462000a7a906200119c565b80601f016020809104026020016040519081016040528092919081815260200182805462000aa8906200119c565b801562000af75780601f1062000acd5761010080835404028352916020019162000af7565b820191905f5260205f20905b81548152906001019060200180831162000ad957829003601f168201915b50505050508152602001906001019062000a5a565b6008545f9060ff161562000b24575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c6564000000000000000000000000000000000000000000000000000060248301525f9163667f9d7090604401602060405180830381865afa15801562000bb3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000bd99190620015b8565b1415905090565b60606015805480602002602001604051908101604052809291908181526020018280548015620002b457602002820191905f5260205f2090815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831162000288575050505050905090565b60405173ffffffffffffffffffffffffffffffffffffffff8216602482015262000cd29060440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2c2ecbc20000000000000000000000000000000000000000000000000000000017905262000cd5565b50565b80516a636f6e736f6c652e6c6f67602083015f808483855afa5050505050565b614e9580620015d183390190565b602080825282518282018190525f9190848201906040850190845b8181101562000d5257835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010162000d1e565b50909695505050505050565b5f81518084525f5b8181101562000d845760208185018101518683018201520162000d66565b505f602082860101526020601f19601f83011685010191505092915050565b602080825282518282018190525f919060409081850190600581811b87018401888601875b8481101562000e8257603f198a84030186528151805173ffffffffffffffffffffffffffffffffffffffff168452880151888401889052805188850181905290890190606081871b8601810191908601905f5b8181101562000e6b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa088850301835262000e5884865162000d5e565b948d01949350918c019160010162000e1b565b505050968901969350509087019060010162000dc8565b50909998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000cd2575f80fd5b5f805f806060858703121562000ec7575f80fd5b843562000ed48162000e91565b9350602085013567ffffffffffffffff8082111562000ef1575f80fd5b818701915087601f83011262000f05575f80fd5b81358181111562000f14575f80fd5b88602082850101111562000f26575f80fd5b60208301955080945050604087013591508082111562000f44575f80fd5b508501610560818803121562000f58575f80fd5b939692955090935050565b5f815180845260208085019450602084015f5b8381101562000fb65781517fffffffff00000000000000000000000000000000000000000000000000000000168752958201959082019060010162000f76565b509495945050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156200103e57603f19898403018552815180518785526200100f8886018262000d5e565b91890151858303868b015291905062001029818362000f63565b96890196945050509086019060010162000fe8565b509098975050505050505050565b5f805f805f8060c0878903121562001062575f80fd5b86356200106f8162000e91565b95506020870135620010818162000e91565b945060408701359350606087013592506080870135915060a0870135620010a88162000e91565b809150509295509295509295565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b828110156200110f57603f19888603018452620010fc85835162000d5e565b94509285019290850190600101620010dd565b5092979650505050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156200103e57888303603f190185528151805173ffffffffffffffffffffffffffffffffffffffff168452870151878401879052620011888785018262000f63565b958801959350509086019060010162001143565b600181811c90821680620011b157607f821691505b602082108103620011e9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b6102008183375050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811262001256575f80fd5b830160208101925035905067ffffffffffffffff81111562001276575f80fd5b8060051b360382131562001288575f80fd5b9250929050565b805f5b6010811015620012c7578135845260208083013590850152604080830135908501526060938401939091019060010162001292565b50505050565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811262001300575f80fd5b90910192915050565b5f81357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18336030181126200133c575f80fd5b820160208101903567ffffffffffffffff81111562001359575f80fd5b80360382131562001368575f80fd5b604085526200137c604086018284620011ef565b915050602083013560208501528091505092915050565b5f8383855260208086019550808560051b830101845f5b878110156200150257601f1985840301895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb21883603018112620013ee575f80fd5b870180358452848101358585015260408082013590850152606080820135908501526080808201359085015260a080820135908501526114e060c0620014398187018285016200128f565b506106c06200144d81870182850162001218565b506108c06200146181870182850162001218565b50610ac06200147581870182850162001218565b50610cc06200148981870182850162001218565b50610ec06200149d81870182850162001218565b506110c0620014b181870182850162001218565b506112c0620014c581870182850162001218565b506114c0620014d781840184620012cd565b9250818187015250620014ed8186018362001309565b9a86019a9450505090830190600101620013aa565b5090979650505050505050565b604081525f62001524604083018587620011ef565b8281036020840152610560843582526020850135602083015260408501356040830152606085013560608301526080850135608083015260a085013560a083015261028060c0860160c08401376103406200158481840182880162001218565b50610540620015968187018762001222565b8383860152620015aa848601828462001393565b9a9950505050505050505050565b5f60208284031215620015c9575f80fd5b505191905056fe610160604052600580546001600160a01b03191673e592427a0aece92de3edee1f18e0157c058615641781556014600a556010600b819055600c8190557f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720600d557f06f93f503e77fcdcacfe622e66adc639b63e8c0083f5cab5d71d461aa4562c92600e556003600f5560029055600160118190555f601281905560168190556018556019805461017760a31b62ffffff60a01b19909116179055601a55601b55348015620000cc575f80fd5b5060405162004e9538038062004e95833981016040819052620000ef916200030d565b604080518082018252601081526f546563686e6963616c5072657669657760801b602080830191909152825180840190935260018352603160f81b90830152906200013b825f62000272565b610120526200014c81600162000272565b61014052815160208084019190912060e052815190820120610100524660a052620001d960e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c052600280546001600160a01b039788166001600160a01b0319918216179091556003805496881696821687179055601980548216909617909555600d54600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01556007939093556008919091556009556017805491909316911617905562000556565b5f60208351101562000291576200028983620002aa565b9050620002a4565b816200029e848262000418565b5060ff90505b92915050565b5f80829050601f81511115620002e0578260405163305a27a960e01b8152600401620002d79190620004e4565b60405180910390fd5b8051620002ed8262000532565b179392505050565b6001600160a01b03811681146200030a575f80fd5b50565b5f805f805f8060c0878903121562000323575f80fd5b86516200033081620002f5565b60208801519096506200034381620002f5565b8095505060408701519350606087015192506080870151915060a08701516200036c81620002f5565b809150509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620003a357607f821691505b602082108103620003c257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200041357805f5260205f20601f840160051c81016020851015620003ef5750805b601f840160051c820191505b8181101562000410575f8155600101620003fb565b50505b505050565b81516001600160401b038111156200043457620004346200037a565b6200044c816200044584546200038e565b84620003c8565b602080601f83116001811462000482575f84156200046a5750858301515b5f19600386901b1c1916600185901b178555620004dc565b5f85815260208120601f198616915b82811015620004b25788860151825594840194600190910190840162000491565b5085821015620004d057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602080835283518060208501525f5b818110156200051257858101830151858201604001528201620004f4565b505f604082860101526040601f19601f8301168501019250505092915050565b80516020808301519190811015620003c2575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516148ed620005a85f395f611b9601525f611b6c01525f61359a01525f61357201525f6134cd01525f6134f701525f61352101526148ed5ff3fe6080604052600436106102f5575f3560e01c806384b0196e1161018e578063ba873065116100e0578063ddca3f4311610089578063ed6839f011610063578063ed6839f0146108d1578063f01f20df146108e6578063fc0c546a146108fb57610369565b8063ddca3f4314610831578063e39c9eb214610878578063e5285dcc146108a357610369565b8063c7c28b0b116100ba578063c7c28b0b146107e8578063d0507865146107fd578063d419f5841461081c57610369565b8063ba87306514610795578063c31c9c07146107aa578063c50a53eb146107c957610369565b8063993544bb11610142578063af95daca1161011c578063af95daca14610735578063afbd8bd314610754578063b42274bc1461078057610369565b8063993544bb146106d8578063aa2d61db146106f7578063ab67560e1461071657610369565b806389aa6e081161017357806389aa6e081461068f5780638c17d367146106ae57806395a4f7c2146106c357610369565b806384b0196e1461064957806384e2ad141461067057610369565b80634a0415f7116102475780635ab573d5116101fb5780637dc0d1d0116101d55780637dc0d1d014610600578063848090e81461061f57806384af63c51461063457610369565b80635ab573d51461059757806363f132ff146105c257806371919408146105e157610369565b80634ef548f11161022c5780634ef548f11461054f57806355330a9a1461056357806357d4c4ee1461058257610369565b80634a0415f7146105255780634cfb149e1461053a57610369565b80632b7ac3f3116102a95780633ddfbceb116102835780633ddfbceb146104c85780634382e92a146104e757806345e833e81461050657610369565b80632b7ac3f31461045d5780632c58f4ed146104945780632eb4a7ab146104b357610369565b8063161a054b116102da578063161a054b146103d457806317cc915c146103f35780631fbcb0d51461043157610369565b80630c20f5a1146103975780631103d1f6146103bf57610369565b36610369573373c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21461036757336001600160a01b0316346040515b5f6040518083038185875af1925050503d805f811461035e576040519150601f19603f3d011682016040523d82523d5f602084013e610363565b606091505b5050505b005b3373c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21461036757336001600160a01b031634604051610324565b3480156103a2575f80fd5b506103ac60125481565b6040519081526020015b60405180910390f35b3480156103ca575f80fd5b506103ac600c5481565b3480156103df575f80fd5b506103676103ee366004613927565b61091a565b3480156103fe575f80fd5b5061042161040d36600461398b565b60136020525f908152604090205460ff1681565b60405190151581526020016103b6565b34801561043c575f80fd5b5061045061044b3660046139a2565b611244565b6040516103b691906139fc565b348015610468575f80fd5b5060025461047c906001600160a01b031681565b6040516001600160a01b0390911681526020016103b6565b34801561049f575f80fd5b506103ac6104ae366004613a0e565b61139a565b3480156104be575f80fd5b506103ac600d5481565b3480156104d3575f80fd5b506103ac6104e236600461398b565b6114f9565b3480156104f2575f80fd5b506103ac610501366004613a61565b61151d565b348015610511575f80fd5b50610421610520366004613a93565b61158a565b348015610530575f80fd5b506103ac60085481565b348015610545575f80fd5b506103ac600e5481565b34801561055a575f80fd5b506104506116c5565b34801561056e575f80fd5b506103ac61057d366004613aff565b61171b565b34801561058d575f80fd5b506103ac600b5481565b3480156105a2575f80fd5b506103ac6105b136600461398b565b60156020525f908152604090205481565b3480156105cd575f80fd5b506103ac6105dc366004613a61565b611915565b3480156105ec575f80fd5b5061047c6105fb366004613b32565b611b1f565b34801561060b575f80fd5b5060045461047c906001600160a01b031681565b34801561062a575f80fd5b506103ac601b5481565b34801561063f575f80fd5b506103ac600f5481565b348015610654575f80fd5b5061065d611b5f565b6040516103b69796959493929190613bbd565b34801561067b575f80fd5b506103ac61068a366004613c70565b611c01565b34801561069a575f80fd5b5060195461047c906001600160a01b031681565b3480156106b9575f80fd5b506103ac60095481565b3480156106ce575f80fd5b506103ac600a5481565b3480156106e3575f80fd5b506103ac6106f2366004613a61565b611c45565b348015610702575f80fd5b506103ac61071136600461398b565b611ea3565b348015610721575f80fd5b50610367610730366004613aff565b611ec2565b348015610740575f80fd5b506103ac61074f366004613aff565b612051565b34801561075f575f80fd5b5061077361076e366004613ca7565b612304565b6040516103b69190613d16565b34801561078b575f80fd5b506103ac60185481565b3480156107a0575f80fd5b506103ac60165481565b3480156107b5575f80fd5b5060055461047c906001600160a01b031681565b3480156107d4575f80fd5b506103ac6107e33660046139a2565b6123c0565b3480156107f3575f80fd5b506103ac60105481565b348015610808575f80fd5b5060175461047c906001600160a01b031681565b348015610827575f80fd5b506103ac60075481565b34801561083c575f80fd5b506019546108649074010000000000000000000000000000000000000000900462ffffff1681565b60405162ffffff90911681526020016103b6565b348015610883575f80fd5b506103ac61089236600461398b565b60146020525f908152604090205481565b3480156108ae575f80fd5b506104216108bd36600461398b565b5f9081526013602052604090205460ff1690565b3480156108dc575f80fd5b506103ac60115481565b3480156108f1575f80fd5b506103ac601a5481565b348015610906575f80fd5b5060035461047c906001600160a01b031681565b5f5c15610925575f80fd5b60015f5d600a54610937906002613e68565b601654106109b25760405162461bcd60e51b815260206004820152602360248201527f6d6f6d696a692e7075626c6973683a207374617465206465707468207265616360448201527f686564000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600754813514610a2a5760405162461bcd60e51b815260206004820152602260248201527f6d6f6d696a692e7075626c6973683a20696e76616c6964207478206b6579486160448201527f736800000000000000000000000000000000000000000000000000000000000060648201526084016109a9565b600954816020013514610aa55760405162461bcd60e51b815260206004820152602960248201527f6d6f6d696a692e7075626c6973683a20696e76616c696420726563757273697660448201527f65206b657948617368000000000000000000000000000000000000000000000060648201526084016109a9565b600e54816060013514610b205760405162461bcd60e51b815260206004820152602560248201527f6d6f6d696a692e7075626c6973683a20696e76616c696420686973746f72696360448201527f20726f6f7400000000000000000000000000000000000000000000000000000060648201526084016109a9565b5f610b2f610540830183613e73565b600c54600b549193507f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f72092505f91610b679190613eb9565b67ffffffffffffffff811115610b7f57610b7f613ed0565b604051908082528060200260200182016040528015610bcf57816020015b604080516080810182525f8082526020808301829052928201819052606082015282525f19909201910181610b9d5790505b5090505f5b8381101561117a577f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720610c0b610540870187613e73565b83818110610c1b57610c1b613efd565b9050602002810190610c2d9190613f2a565b6020013503610ca35760405162461bcd60e51b8152602060048201526024808201527f6d6f6d696a692e7075626c6973683a207478206d757374206e6f74206265206560448201527f6d7074790000000000000000000000000000000000000000000000000000000060648201526084016109a9565b7f11d25ff6aa8a431fbce8e8d9a87a2d7986adf38e724fbe47f15752d0931f14d8610cd2610540870187613e73565b83818110610ce257610ce2613efd565b9050602002810190610cf49190613f2a565b6020013503610d6b5760405162461bcd60e51b815260206004820152602a60248201527f6d6f6d696a692e7075626c6973683a207478207574786f73206d757374206e6f60448201527f7420626520656d7074790000000000000000000000000000000000000000000060648201526084016109a9565b603c610d7b610540870187613e73565b83818110610d8b57610d8b613efd565b9050602002810190610d9d9190613f2a565b610dab919060600135613f93565b15610e1e5760405162461bcd60e51b815260206004820152603160248201527f6d6f6d696a692e7075626c6973683a2074696d657374616d70206d757374206260448201527f6520646976697369626c6520627920363000000000000000000000000000000060648201526084016109a9565b42610e2d610540870187613e73565b83818110610e3d57610e3d613efd565b9050602002810190610e4f9190613f2a565b6060013510610ea05760405162461bcd60e51b815260206004820181905260248201527f6d6f6d696a692e7075626c6973683a207478206e6f74207965742076616c696460448201526064016109a9565b603c610eb0610540870187613e73565b83818110610ec057610ec0613efd565b9050602002810190610ed29190613f2a565b610ee0919060800135613f93565b15610f535760405162461bcd60e51b815260206004820152603060248201527f6d6f6d696a692e7075626c6973683a20646561646c696e65206d75737420626560448201527f20646976697369626c652062792036300000000000000000000000000000000060648201526084016109a9565b42610f62610540870187613e73565b83818110610f7257610f72613efd565b9050602002810190610f849190613f2a565b6080013511610fd55760405162461bcd60e51b815260206004820152601e60248201527f6d6f6d696a692e7075626c6973683a207478206861732065787069726564000060448201526064016109a9565b5f611009610fe7610540880188613e73565b84818110610ff757610ff7613efd565b90506020028101906105019190613f2a565b90505f61104561101d610540890189613e73565b8581811061102d5761102d613efd565b905060200281019061103f9190613f2a565b8361171b565b905061105185826123c0565b945081156110925761109261106a610540890189613e73565b8581811061107a5761107a613efd565b905060200281019061108c9190613f2a565b836124a0565b6110ca6110a3610540890189613e73565b858181106110b3576110b3613efd565b90506020028101906110c59190613f2a565b612641565b6111056110db610540890189613e73565b858181106110eb576110eb613efd565b90506020028101906110fd9190613f2a565b8583866129e9565b600d5481907f48aca1b0c57ac5ec7c6882f807fc4b69f9dbe52279cf980f541149e13cebdf476111396105408b018b613e73565b8781811061114957611149613efd565b905060200281019061115b9190613f2a565b60405161116891906140b7565b60405180910390a35050600101610bd4565b506111858184612ba9565b8360a0013584604001356016547fad6428c585490bbbc6ea9b4a1d150f301530bd4f6374ce30d6a4c44f547d9458600d548860c0016040516111c89291906141a6565b60405180910390a46111dc8686868561158a565b6112285760405162461bcd60e51b815260206004820152601d60248201527f6d6f6d696a692e7075626c6973683a20696e76616c69642070726f6f6600000060448201526064016109a9565b61123961123485614621565b61309e565b5050505f805d505050565b60608183106112955760405162461bcd60e51b815260206004820152600d60248201527f496e76616c69642072616e67650000000000000000000000000000000000000060448201526064016109a9565b60065482106112e65760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420656e6420696e64657800000000000000000000000000000060448201526064016109a9565b5f6112f184846146c8565b67ffffffffffffffff81111561130957611309613ed0565b604051908082528060200260200182016040528015611332578160200160208202803683370190505b5090505f845b8481101561138e576006818154811061135357611353613efd565b905f5260205f20015483838151811061136e5761136e613efd565b602090810291909101015281611383816146db565b925050600101611338565b50909150505b92915050565b60408051601a80825261036082019092525f9182919060208201610340803683370190505090508360400135815f815181106113d8576113d8613efd565b6020026020010181815250508360600135816001815181106113fc576113fc613efd565b60200260200101818152505083608001358160028151811061142057611420613efd565b602002602001018181525050828160038151811061144057611440613efd565b602002602001018181525050835f01358160048151811061146357611463613efd565b60200260200101818152505083602001358160058151811061148757611487613efd565b6020026020010181815250505f5b60148110156114e7578460c00181601481106114b3576114b3613efd565b6020020135826114c48360066146f3565b815181106114d4576114d4613efd565b6020908102919091010152600101611495565b506114f1816130fb565b949350505050565b5f6006828154811061150d5761150d613efd565b905f5260205f2001549050919050565b5f60a082013515611583576113947fc4dd6012c4600edff964806e010811c5cddd87247d2494b9719d8bae5544543561155584611915565b6040805160208101939093528201526060015b6040516020818303038152906040528051906020012061315d565b505f919050565b60408051601180825261024082019092525f9182919060208201610220803683370190505090506115bb848461139a565b815f815181106115cd576115cd613efd565b6020026020010181815250505f5b601081101561162e57846103400181601081106115fa576115fa613efd565b60200201358261160b8360016146f3565b8151811061161b5761161b613efd565b60209081029190910101526001016115db565b506002546040517fea50d0e40000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063ea50d0e49061167c90899089908690600401614706565b602060405180830381865afa158015611697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116bb919061472b565b9695505050505050565b6060600680548060200260200160405190810160405280929190818152602001828054801561171157602002820191905f5260205f20905b8154815260200190600101908083116116fd575b5050505050905090565b6040805160358082526106c082019092525f91829190602082016106a080368337019050509050835f0135815f8151811061175857611758613efd565b60200260200101818152505083602001358160018151811061177c5761177c613efd565b6020026020010181815250508360a00135816002815181106117a0576117a0613efd565b6020026020010181815250506117b68484612051565b816003815181106117c9576117c9613efd565b6020026020010181815250505f5b60108110156114e757846106c00181601081106117f6576117f6613efd565b60200201355f1c8260048151811061181057611810613efd565b60200260200101515f1c61182491906146f3565b5f1b8260048151811061183957611839613efd565b602002602001018181525050846108c001816010811061185b5761185b613efd565b60200201358261186c8360056146f3565b8151811061187c5761187c613efd565b60200260200101818152505084610ac001816010811061189e5761189e613efd565b6020020135826118af8360156146f3565b815181106118bf576118bf613efd565b60200260200101818152505084610ec00181601081106118e1576118e1613efd565b6020020135826118f28360256146f3565b8151811061190257611902613efd565b60209081029190910101526001016117d7565b6040805160358082526106c082019092525f91829190602082016106a080368337019050509050825f0135815f8151811061195257611952613efd565b60200260200101818152505082602001358160018151811061197657611976613efd565b6020026020010181815250508260a001358160028151811061199a5761199a613efd565b6020026020010181815250506119af83611c45565b816003815181106119c2576119c2613efd565b6020026020010181815250505f5b6010811015611b0e57836106c00181601081106119ef576119ef613efd565b60200201355f1c82600481518110611a0957611a09613efd565b60200260200101515f1c611a1d91906146f3565b5f1b82600481518110611a3257611a32613efd565b602002602001018181525050836108c0018160108110611a5457611a54613efd565b602002013582611a658360056146f3565b81518110611a7557611a75613efd565b60200260200101818152505083610ac0018160108110611a9757611a97613efd565b602002013582611aa88360156146f3565b81518110611ab857611ab8613efd565b60200260200101818152505083610ec0018160108110611ada57611ada613efd565b602002013582611aeb8360256146f3565b81518110611afb57611afb613efd565b60209081029190910101526001016119d0565b50611b18816130fb565b9392505050565b5f6114f18484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506131a492505050565b5f60608082808083611b917f0000000000000000000000000000000000000000000000000000000000000000836131c6565b611bbc7f000000000000000000000000000000000000000000000000000000000000000060016131c6565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b5f6113947fc4dd6012c4600edff964806e010811c5cddd87247d2494b9719d8bae554454358360200135604051602001611568929190918252602082015260400190565b604080516063808252610c8082019092525f9182919060208201610c60803683370190505090508260600135815f81518110611c8357611c83613efd565b602002602001018181525050826080013581600181518110611ca757611ca7613efd565b602002602001018181525050826040013581600281518110611ccb57611ccb613efd565b6020026020010181815250505f5b6010811015611b0e5783610cc0018160108110611cf857611cf8613efd565b602002013582611d098360036146f3565b81518110611d1957611d19613efd565b602002602001018181525050836112c0018160108110611d3b57611d3b613efd565b602002013582611d4c8360136146f3565b81518110611d5c57611d5c613efd565b602002602001018181525050836110c0018160108110611d7e57611d7e613efd565b602002013582611d8f8360236146f3565b81518110611d9f57611d9f613efd565b6020026020010181815250508360c0018160108110611dc057611dc0613efd565b606002013582611dd1836003613eb9565b611ddc9060336146f3565b81518110611dec57611dec613efd565b6020026020010181815250508360c0018160108110611e0d57611e0d613efd565b606002016020013582826003611e239190613eb9565b611e2e9060346146f3565b81518110611e3e57611e3e613efd565b6020026020010181815250508360c0018160108110611e5f57611e5f613efd565b606002016040013582826003611e759190613eb9565b611e809060356146f3565b81518110611e9057611e90613efd565b6020908102919091010152600101611cd9565b60068181548110611eb2575f80fd5b5f91825260209091200154905081565b5f5c15611ecd575f80fd5b60015f5d5f60a083013515611f3357611f2c7fc4dd6012c4600edff964806e010811c5cddd87247d2494b9719d8bae55445435611f0e6114c086018661474a565b60200135604051602001611568929190918252602082015260400190565b9050611f36565b505f5b5f611f41848361171b565b5f8181526015602052604090205490915015611fc55760405162461bcd60e51b815260206004820152602560248201527f6d6f6d696a692e62726f6164636173743a20616c72656164792062726f61646360448201527f617374656400000000000000000000000000000000000000000000000000000060648201526084016109a9565b5f5b601081101561200c5760105485610cc0018260108110611fe957611fe9613efd565b602002013503612004575f8281526015602052604090208490555b600101611fc7565b5080600d547f4272ab98363027330bc7eaf7c24d25a397f0c903a7fda26bd253e54f6498fd898660405161204091906140b7565b60405180910390a350505f805d5050565b604080516064808252610ca082019092525f9182919060208201610c80803683370190505090508360600135815f8151811061208f5761208f613efd565b6020026020010181815250508360800135816001815181106120b3576120b3613efd565b60209081029190910101526120e97f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060016146f3565b6120f39084613f93565b5f1b8160028151811061210857612108613efd565b60200260200101818152505083604001358160038151811061212c5761212c613efd565b6020026020010181815250505f5b60108110156114e75784610cc001816010811061215957612159613efd565b60200201358261216a8360046146f3565b8151811061217a5761217a613efd565b602002602001018181525050846112c001816010811061219c5761219c613efd565b6020020135826121ad8360146146f3565b815181106121bd576121bd613efd565b602002602001018181525050846110c00181601081106121df576121df613efd565b6020020135826121f08360246146f3565b8151811061220057612200613efd565b6020026020010181815250508460c001816010811061222157612221613efd565b606002013582612232836003613eb9565b61223d9060346146f3565b8151811061224d5761224d613efd565b6020026020010181815250508460c001816010811061226e5761226e613efd565b6060020160200135828260036122849190613eb9565b61228f9060356146f3565b8151811061229f5761229f613efd565b6020026020010181815250508460c00181601081106122c0576122c0613efd565b6060020160400135828260036122d69190613eb9565b6122e19060366146f3565b815181106122f1576122f1613efd565b602090810291909101015260010161213a565b6060818067ffffffffffffffff81111561232057612320613ed0565b604051908082528060200260200182016040528015612349578160200160208202803683370190505b5091505f5b818110156123b85761238685858381811061236b5761236b613efd565b905060200201355f9081526013602052604090205460ff1690565b156123b057600183828151811061239f5761239f613efd565b911515602092830291909101909101525b60010161234e565b505092915050565b60408051600480825260a082019092525f918291906020820160808036833701905050905083815f815181106123f8576123f8613efd565b602002602001018181525050828160018151811061241857612418613efd565b6020026020010181815250506007548160028151811061243a5761243a613efd565b60209081029190910101527f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720841461247457600954612478565b6008545b8160038151811061248b5761248b613efd565b6020026020010181815250506114f1816130fb565b5f6124bd826124b36114c086018661474a565b6105fb908061477c565b6003546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015292935060a086013592909116906370a0823190602401602060405180830381865afa158015612527573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254b91906147bf565b10156125bf5760405162461bcd60e51b815260206004820152602c60248201527f6d6f6d696a692e5f7075626c6973684465706f7369743a20696e73756666696360448201527f69656e742062616c616e6365000000000000000000000000000000000000000060648201526084016109a9565b6003546040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260a0860135602483015290911690639dc29fac906044015f604051808303815f87803b158015612626575f80fd5b505af1158015612638573d5f803e3d5ffd5b50505050505050565b5f5b60108110156129e5577f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720610ec08301826010811061268357612683613efd565b6020020135146127785760135f83610ec00183601081106126a6576126a6613efd565b6020908102919091013582528101919091526040015f205460ff16156127345760405162461bcd60e51b815260206004820152602860248201527f6d6f6d696a692e5f7075626c69736857697468647261773a206e756c6c69666960448201527f6572207370656e7400000000000000000000000000000000000000000000000060648201526084016109a9565b600160135f84610ec001846010811061274f5761274f613efd565b602002013581526020019081526020015f205f6101000a81548160ff0219169083151502179055505b7f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720610ac0830182601081106127af576127af613efd565b6020020135146128fa5760145f83610ac00183601081106127d2576127d2613efd565b602002013581526020019081526020015f20545f801b1461285a5760405162461bcd60e51b8152602060048201526024808201527f6d6f6d696a692e5f7075626c69736857697468647261773a207574786f20657860448201527f697374730000000000000000000000000000000000000000000000000000000060648201526084016109a9565b600d5460145f84610ac001846010811061287657612876613efd565b602002013581526020019081526020015f2081905550816110c00181601081106128a2576128a2613efd565b6020020135600d547fec4ce5084cd118adcfcc534001c121cc3f04525ef85b0c342ed2fe88e629286b8460c00184601081106128e0576128e0613efd565b606002016040516128f191906147d6565b60405180910390a35b7f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f7206108c08301826010811061293157612931613efd565b6020020135146129dd5760145f836108c001836010811061295457612954613efd565b602002013581526020019081526020015f20545f801b036129dd5760405162461bcd60e51b815260206004820152602860248201527f6d6f6d696a692e7075626c6973683a20636f6d6d69746d656e7420646f65736e60448201527f277420657869737400000000000000000000000000000000000000000000000060648201526084016109a9565b600101612643565b5050565b5f5b600c54811015612ba2577f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f72080610cc087018360108110612a2d57612a2d613efd565b602002013514612b995760105486610cc0018360108110612a5057612a50613efd565b602002013503612a6e57505f83815260156020526040902054612a8c565b85610cc0018260108110612a8457612a84613efd565b602002013590505b5f866112c0018360108110612aa357612aa3613efd565b602002013590505f816106c089018560108110612ac257612ac2613efd565b60200201355f1c612ad391906146c8565b90506064601b546064612ae691906146c8565b612af09084613eb9565b612afa91906147f7565b91505f60408901357f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f72014612b32576040890135612b34565b5f5b90506040518060800160405280858152602001838152602001848152602001826001600160a01b03168152508886600c5489612b709190613eb9565b612b7a91906146f3565b81518110612b8a57612b8a613efd565b60200260200101819052505050505b506001016129eb565b5050505050565b5f600190505f805f600c5485612bbf9190613eb9565b612bca9060016146f3565b67ffffffffffffffff811115612be257612be2613ed0565b604051908082528060200260200182016040528015612c0b578160200160208202803683370190505b50604080516080810182525f80825260208201819052918101829052606081018290529192505b86811015612e61575f5b600c54811015612e58578881600c5484612c569190613eb9565b612c6091906146f3565b81518110612c7057612c70613efd565b602002602001015192505f83604001511115612e505782517f016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f72014801590612cba5750601254835114155b15612e5057600f54835103612ccd574183525b601154835103612cdb573383525b82606001516001600160a01b0316856001600160a01b03161015612d0157826060015194505b8251805c905f829003612d6057845f0151868a81518110612d2457612d24613efd565b60200260200101818152505082600c5485612d3f9190613eb9565b612d4991906146f3565b915081815d88612d58816146db565b995050612e3c565b602085015115612d9d5784602001518b8381518110612d8157612d81613efd565b6020026020010151602001818151612d9991906146f3565b9052505b604085015115612dda5784604001518b8381518110612dbe57612dbe613efd565b6020026020010151604001818151612dd691906146f3565b9052505b604051806080016040528060125481526020015f81526020015f81526020015f6001600160a01b03168152508b84600c5487612e169190613eb9565b612e2091906146f3565b81518110612e3057612e30613efd565b60200260200101819052505b6040850151612e4b90896146f3565b975050505b600101612c3c565b50600101612c32565b505f8415613094576003546040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018790526001600160a01b03909116906340c10f19906044015f604051808303815f87803b158015612ecb575f80fd5b505af1158015612edd573d5f803e3d5ffd5b50505050612eeb858561326f565b905060015b8681101561309257601254848281518110612f0d57612f0d613efd565b60200260200101511461308a575f80858381518110612f2e57612f2e613efd565b60200260200101519050805c91508a8281518110612f4e57612f4e613efd565b602002602001015194505f8086604001511115612fd95788858760400151612f769190613eb9565b612f8091906147f7565b9050612fa2878581518110612f9757612f97613efd565b602002602001015190565b6001600160a01b03166108fc8290811502906040515f60405180830381858888f19350505050158015612fd7573d5f803e3d5ffd5b505b602086015180156130855760035488516001600160a01b03909116906340c10f1990613011908b9089908110612f9757612f97613efd565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b15801561306e575f80fd5b505af1158015613080573d5f803e3d5ffd5b505050505b505050505b600101612ef0565b505b5050505050505050565b604081018051600680546001810182555f9182527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01919091559051600d556080820151600e5560168054916130f3836146db565b919050555050565b5f808260405160200161310e919061480a565b6040516020818303038152906040528051906020012090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000600161315391906146f3565b611b189082613f93565b5f6113946131696134c1565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f805f6131b185856135ef565b915091506131be81613631565b509392505050565b606060ff83146131e0576131d983613798565b9050611394565b8180546131ec9061483f565b80601f01602080910402602001604051908101604052809291908181526020018280546132189061483f565b80156132635780601f1061323a57610100808354040283529160200191613263565b820191905f5260205f20905b81548152906001019060200180831161324657829003601f168201915b50505050509050611394565b6003546005546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018590525f92919091169063095ea7b3906044016020604051808303815f875af11580156132de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613302919061472b565b5060055460408051610100810182526019546001600160a01b03808216835273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2602084019081527401000000000000000000000000000000000000000090920462ffffff9081168486019081523060608601908152426080870190815260a087018c81525f60c089019081528c871660e08a0190815299517f414bf3890000000000000000000000000000000000000000000000000000000081529851871660048a0152965186166024890152925190931660448701525183166064860152905160848501525160a4840152905160c48301529151821660e482015291169063414bf38990610104016020604051808303815f875af115801561341b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061343f91906147bf565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905290915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d906024015f604051808303815f87803b1580156134a5575f80fd5b505af11580156134b7573d5f803e3d5ffd5b5050505092915050565b5f306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561351957507f000000000000000000000000000000000000000000000000000000000000000046145b1561354357507f000000000000000000000000000000000000000000000000000000000000000090565b6135ea604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b5f808251604103613623576020830151604084015160608501515f1a613617878285856137d5565b9450945050505061362a565b505f905060025b9250929050565b5f8160048111156136445761364461488a565b0361364c5750565b60018160048111156136605761366061488a565b036136ad5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109a9565b60028160048111156136c1576136c161488a565b0361370e5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109a9565b60038160048111156137225761372261488a565b036137955760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016109a9565b50565b60605f6137a483613892565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561380a57505f90506003613889565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561385b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116613883575f60019250925050613889565b91505f90505b94509492505050565b5f60ff8216601f811115611394576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8083601f8401126138e2575f80fd5b50813567ffffffffffffffff8111156138f9575f80fd5b60208301915083602082850101111561362a575f80fd5b5f6105608284031215613921575f80fd5b50919050565b5f805f60408486031215613939575f80fd5b833567ffffffffffffffff80821115613950575f80fd5b61395c878388016138d2565b90955093506020860135915080821115613974575f80fd5b5061398186828701613910565b9150509250925092565b5f6020828403121561399b575f80fd5b5035919050565b5f80604083850312156139b3575f80fd5b50508035926020909101359150565b5f815180845260208085019450602084015f5b838110156139f1578151875295820195908201906001016139d5565b509495945050505050565b602081525f611b1860208301846139c2565b5f8060408385031215613a1f575f80fd5b823567ffffffffffffffff811115613a35575f80fd5b613a4185828601613910565b95602094909401359450505050565b5f6114e08284031215613921575f80fd5b5f60208284031215613a71575f80fd5b813567ffffffffffffffff811115613a87575f80fd5b6114f184828501613a50565b5f805f8060608587031215613aa6575f80fd5b843567ffffffffffffffff80821115613abd575f80fd5b613ac9888389016138d2565b90965094506020870135915080821115613ae1575f80fd5b50613aee87828801613910565b949793965093946040013593505050565b5f8060408385031215613b10575f80fd5b823567ffffffffffffffff811115613b26575f80fd5b613a4185828601613a50565b5f805f60408486031215613b44575f80fd5b83359250602084013567ffffffffffffffff811115613b61575f80fd5b613b6d868287016138d2565b9497909650939450505050565b5f81518084525f5b81811015613b9e57602081850181015186830182015201613b82565b505f602082860101526020601f19601f83011685010191505092915050565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e06020840152613bf960e084018a613b7a565b8381036040850152613c0b818a613b7a565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b81811015613c5e57835183529284019291840191600101613c42565b50909c9b505050505050505050505050565b5f60208284031215613c80575f80fd5b813567ffffffffffffffff811115613c96575f80fd5b820160408185031215611b18575f80fd5b5f8060208385031215613cb8575f80fd5b823567ffffffffffffffff80821115613ccf575f80fd5b818501915085601f830112613ce2575f80fd5b813581811115613cf0575f80fd5b8660208260051b8501011115613d04575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f9190848201906040850190845b81811015613d4f578351151583529284019291840191600101613d31565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b600181815b80851115613dc257815f1904821115613da857613da8613d5b565b80851615613db557918102915b93841c9390800290613d8d565b509250929050565b5f82613dd857506001611394565b81613de457505f611394565b8160018114613dfa5760028114613e0457613e20565b6001915050611394565b60ff841115613e1557613e15613d5b565b50506001821b611394565b5060208310610133831016604e8410600b8410161715613e43575081810a611394565b613e4d8383613d88565b805f1904821115613e6057613e60613d5b565b029392505050565b5f611b188383613dca565b5f808335601e19843603018112613e88575f80fd5b83018035915067ffffffffffffffff821115613ea2575f80fd5b6020019150600581901b360382131561362a575f80fd5b808202811582820484141761139457611394613d5b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb21833603018112613f5c575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82613fa157613fa1613f66565b500690565b805f5b6010811015613fdc5781358452602080830135908501526040808301359085015260609384019390910190600101613fa9565b50505050565b6102008183375050565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261401e575f80fd5b90910192915050565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b5f8135601e19833603018112614064575f80fd5b820160208101903567ffffffffffffffff811115614080575f80fd5b80360382131561408e575f80fd5b604085526140a0604086018284614027565b915050602083013560208501528091505092915050565b6020815281356020820152602082013560408201526040820135606082015260608201356080820152608082013560a082015260a082013560c082015261410460e0820160c08401613fa6565b6141166106e082016106c08401613fe2565b6141286108e082016108c08401613fe2565b61413a610ae08201610ac08401613fe2565b61414c610ce08201610cc08401613fe2565b61415e610ee08201610ec08401613fe2565b6141706110e082016110c08401613fe2565b6141826112e082016112c08401613fe2565b5f6141916114c0840184613fec565b6114e0838101526114f1611500840182614050565b8281526102a081016102808360208401379392505050565b6040516060810167ffffffffffffffff811182821017156141e1576141e1613ed0565b60405290565b6040805190810167ffffffffffffffff811182821017156141e1576141e1613ed0565b6040516101e0810167ffffffffffffffff811182821017156141e1576141e1613ed0565b604051610120810167ffffffffffffffff811182821017156141e1576141e1613ed0565b604051610200810167ffffffffffffffff811182821017156141e1576141e1613ed0565b604051601f8201601f1916810167ffffffffffffffff8111828210171561429f5761429f613ed0565b604052919050565b5f82601f8301126142b6575f80fd5b60405161028080820182811067ffffffffffffffff821117156142db576142db613ed0565b604052830181858211156142ed575f80fd5b845b828110156143075780358252602091820191016142ef565b509195945050505050565b5f82601f830112614321575f80fd5b614329614252565b8061020084018581111561433b575f80fd5b845b8181101561435557803584526020938401930161433d565b509095945050505050565b5f82601f83011261436f575f80fd5b614377614252565b80610600840185811115614389575f80fd5b845b8181101561435557606081880312156143a2575f80fd5b6143aa6141be565b813581526020808301358183015260408084013590830152908552939093019260600161438b565b5f604082840312156143e2575f80fd5b6143ea6141e7565b9050813567ffffffffffffffff80821115614403575f80fd5b818401915084601f830112614416575f80fd5b813560208282111561442a5761442a613ed0565b61443c81601f19601f85011601614276565b92508183528681838601011115614451575f80fd5b81818501828501375f81838501015282855280860135818601525050505092915050565b5f82601f830112614484575f80fd5b8135602067ffffffffffffffff808311156144a1576144a1613ed0565b8260051b6144b0838201614276565b93845285810183019383810190888611156144c9575f80fd5b84880192505b85831015614615578235848111156144e5575f80fd5b88016114e0818b03601f19018113156144fc575f80fd5b61450461420a565b87830135815260408084013589830152606080850135828401526080915081850135818401525060a0808501358284015260c0915081850135818401525060e06145508e828701614360565b828401526145628e6106e08701614312565b90830152506145758c6108e08501614312565b6101008201526145898c610ae08501614312565b61012082015261459d8c610ce08501614312565b6101408201526145b18c610ee08501614312565b6101608201526145c58c6110e08501614312565b6101808201526145d98c6112e08501614312565b6101a08201529082013590868211156145f0575f80fd5b6145fe8c89848601016143d2565b6101c08201528452505091840191908401906144cf565b98975050505050505050565b5f6105608236031215614632575f80fd5b61463a61422e565b823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a082015261467d3660c085016142a7565b60c0820152614690366103408501614312565b60e082015261054083013567ffffffffffffffff8111156146af575f80fd5b6146bb36828601614475565b6101008301525092915050565b8181038181111561139457611394613d5b565b5f5f1982036146ec576146ec613d5b565b5060010190565b8082018082111561139457611394613d5b565b604081525f614719604083018587614027565b82810360208401526116bb81856139c2565b5f6020828403121561473b575f80fd5b81518015158114611b18575f80fd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613f5c575f80fd5b5f808335601e19843603018112614791575f80fd5b83018035915067ffffffffffffffff8211156147ab575f80fd5b60200191503681900382131561362a575f80fd5b5f602082840312156147cf575f80fd5b5051919050565b81358152602080830135908201526040808301359082015260608101611394565b5f8261480557614805613f66565b500490565b81515f9082906020808601845b8381101561483357815185529382019390820190600101614817565b50929695505050505050565b600181811c9082168061485357607f821691505b602082108103613921577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea26469706673582212206d51acca634be4573391186c7cbdb604db76bc3a751f7c9d3ad39d0319f4f6c664736f6c63430008180033a26469706673582212207a7b732fb286b2eb3181ad7a784473656109370d1bb9e9cf4d8fd9e8c8854eb564736f6c63430008180033";
+
+type TechnicalPreviewTestConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: TechnicalPreviewTestConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class TechnicalPreviewTest__factory extends ContractFactory {
+  constructor(...args: TechnicalPreviewTestConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      TechnicalPreviewTest & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(
+    runner: ContractRunner | null
+  ): TechnicalPreviewTest__factory {
+    return super.connect(runner) as TechnicalPreviewTest__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): TechnicalPreviewTestInterface {
+    return new Interface(_abi) as TechnicalPreviewTestInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): TechnicalPreviewTest {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as TechnicalPreviewTest;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..24684b5b5d59bbe8dad4cbef4160c9da91bd4a37
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/contracts/state.sol/index.ts
@@ -0,0 +1,8 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { IMomiji__factory } from "./IMomiji__factory";
+export { IOracle__factory } from "./IOracle__factory";
+export { IVerifier__factory } from "./IVerifier__factory";
+export { IWETH9__factory } from "./IWETH9__factory";
+export { Momiji__factory } from "./Momiji__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/index.ts b/momiji-helpers/utils/typechain-types/factories/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..74275f3e35fbde6ae12cf9f57252ff48a6179426
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/index.ts
@@ -0,0 +1,7 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as chainlink from "./@chainlink";
+export * as openzeppelin from "./@openzeppelin";
+export * as uniswap from "./@uniswap";
+export * as contracts from "./contracts";
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/index.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ba4b10744625eda63009597ce1571a4fd270ea92
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as src from "./src";
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdAssertions__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdAssertions__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aeb0ebbff44861aab9697b106f090e1c217de831
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdAssertions__factory.ts
@@ -0,0 +1,402 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  StdAssertions,
+  StdAssertionsInterface,
+} from "../../../../lib/forge-std/src/StdAssertions";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    name: "log",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    name: "log_address",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint256[]",
+        name: "val",
+        type: "uint256[]",
+      },
+    ],
+    name: "log_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "int256[]",
+        name: "val",
+        type: "int256[]",
+      },
+    ],
+    name: "log_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address[]",
+        name: "val",
+        type: "address[]",
+      },
+    ],
+    name: "log_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    name: "log_bytes",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    name: "log_bytes32",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    name: "log_int",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "address",
+        name: "val",
+        type: "address",
+      },
+    ],
+    name: "log_named_address",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "uint256[]",
+        name: "val",
+        type: "uint256[]",
+      },
+    ],
+    name: "log_named_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "int256[]",
+        name: "val",
+        type: "int256[]",
+      },
+    ],
+    name: "log_named_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "address[]",
+        name: "val",
+        type: "address[]",
+      },
+    ],
+    name: "log_named_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "bytes",
+        name: "val",
+        type: "bytes",
+      },
+    ],
+    name: "log_named_bytes",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "bytes32",
+        name: "val",
+        type: "bytes32",
+      },
+    ],
+    name: "log_named_bytes32",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "val",
+        type: "int256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "log_named_decimal_int",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "val",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "log_named_decimal_uint",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "val",
+        type: "int256",
+      },
+    ],
+    name: "log_named_int",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "string",
+        name: "val",
+        type: "string",
+      },
+    ],
+    name: "log_named_string",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "val",
+        type: "uint256",
+      },
+    ],
+    name: "log_named_uint",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    name: "log_string",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    name: "log_uint",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    name: "logs",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "failed",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class StdAssertions__factory {
+  static readonly abi = _abi;
+  static createInterface(): StdAssertionsInterface {
+    return new Interface(_abi) as StdAssertionsInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): StdAssertions {
+    return new Contract(address, _abi, runner) as unknown as StdAssertions;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdError.sol/StdError__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdError.sol/StdError__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f53e25ffbdba9e83da6d195ff4e5f08ee0866916
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdError.sol/StdError__factory.ts
@@ -0,0 +1,181 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../common";
+import type {
+  StdError,
+  StdErrorInterface,
+} from "../../../../../lib/forge-std/src/StdError.sol/StdError";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "arithmeticError",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "assertionError",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "divisionError",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "encodeStorageError",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "enumConversionError",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "indexOOBError",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "memOverflowError",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "popError",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "zeroVarError",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x6102c3610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100aa575f3560e01c8063986c5f681161007d578063b67689da11610063578063b67689da146100f4578063d160e4de146100fc578063fa784a4414610104575f80fd5b8063986c5f68146100e4578063b22dc54d146100ec575f80fd5b806305ee8612146100ae57806310332977146100cc5780631de45560146100d45780638995290f146100dc575b5f80fd5b6100b661010c565b6040516100c39190610223565b60405180910390f35b6100b6610193565b6100b66101a5565b6100b66101b7565b6100b66101c9565b6100b66101db565b6100b66101ed565b6100b66101ff565b6100b6610211565b604051603260248201526044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4e487b710000000000000000000000000000000000000000000000000000000017905281565b6040516001602482015260440161011a565b6040516021602482015260440161011a565b6040516011602482015260440161011a565b6040516041602482015260440161011a565b6040516031602482015260440161011a565b6040516051602482015260440161011a565b6040516022602482015260440161011a565b6040516012602482015260440161011a565b5f602080835283518060208501525f5b8181101561024f57858101830151858201604001528201610233565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509291505056fea2646970667358221220b6d1ea483d569e9e77d273822a87fc08c1a13dbcf1ba8683adf3c889f53e9fbc64736f6c63430008180033";
+
+type StdErrorConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: StdErrorConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class StdError__factory extends ContractFactory {
+  constructor(...args: StdErrorConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      StdError & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): StdError__factory {
+    return super.connect(runner) as StdError__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): StdErrorInterface {
+    return new Interface(_abi) as StdErrorInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): StdError {
+    return new Contract(address, _abi, runner) as unknown as StdError;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdError.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdError.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5c898ac1bb6bb7da02ee98acc5a35b69772d7f15
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdError.sol/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { StdError__factory } from "./StdError__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdInvariant__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdInvariant__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..17e7b612f9eb8d598b0806466cdb1504d35dcb24
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdInvariant__factory.ts
@@ -0,0 +1,178 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  StdInvariant,
+  StdInvariantInterface,
+} from "../../../../lib/forge-std/src/StdInvariant";
+
+const _abi = [
+  {
+    inputs: [],
+    name: "excludeArtifacts",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "excludedArtifacts_",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "excludeContracts",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "excludedContracts_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "excludeSenders",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "excludedSenders_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetArtifactSelectors",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "string",
+            name: "artifact",
+            type: "string",
+          },
+          {
+            internalType: "bytes4[]",
+            name: "selectors",
+            type: "bytes4[]",
+          },
+        ],
+        internalType: "struct StdInvariant.FuzzArtifactSelector[]",
+        name: "targetedArtifactSelectors_",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetArtifacts",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "targetedArtifacts_",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetContracts",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "targetedContracts_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetInterfaces",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "string[]",
+            name: "artifacts",
+            type: "string[]",
+          },
+        ],
+        internalType: "struct StdInvariant.FuzzInterface[]",
+        name: "targetedInterfaces_",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetSelectors",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "bytes4[]",
+            name: "selectors",
+            type: "bytes4[]",
+          },
+        ],
+        internalType: "struct StdInvariant.FuzzSelector[]",
+        name: "targetedSelectors_",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetSenders",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "targetedSenders_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class StdInvariant__factory {
+  static readonly abi = _abi;
+  static createInterface(): StdInvariantInterface {
+    return new Interface(_abi) as StdInvariantInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): StdInvariant {
+    return new Contract(address, _abi, runner) as unknown as StdInvariant;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdStorage.sol/StdStorageSafe__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdStorage.sol/StdStorageSafe__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a0038101d513ddce026e80b279450dac11d6d2fa
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdStorage.sol/StdStorageSafe__factory.ts
@@ -0,0 +1,117 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../common";
+import type {
+  StdStorageSafe,
+  StdStorageSafeInterface,
+} from "../../../../../lib/forge-std/src/StdStorage.sol/StdStorageSafe";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "who",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "bytes4",
+        name: "fsig",
+        type: "bytes4",
+      },
+      {
+        indexed: false,
+        internalType: "bytes32",
+        name: "keysHash",
+        type: "bytes32",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "slot",
+        type: "uint256",
+      },
+    ],
+    name: "SlotFound",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "who",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "slot",
+        type: "uint256",
+      },
+    ],
+    name: "WARNING_UninitedSlot",
+    type: "event",
+  },
+] as const;
+
+const _bytecode =
+  "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fdfea2646970667358221220447bd53e161ce5bf71fc508bef4d63be1e0a791832683bc4af3351410193199264736f6c63430008180033";
+
+type StdStorageSafeConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: StdStorageSafeConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class StdStorageSafe__factory extends ContractFactory {
+  constructor(...args: StdStorageSafeConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      StdStorageSafe & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): StdStorageSafe__factory {
+    return super.connect(runner) as StdStorageSafe__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): StdStorageSafeInterface {
+    return new Interface(_abi) as StdStorageSafeInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): StdStorageSafe {
+    return new Contract(address, _abi, runner) as unknown as StdStorageSafe;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdStorage.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdStorage.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4f4de1e267f54e08fbbc1a8d8b652d0d7d1498e7
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/StdStorage.sol/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { StdStorageSafe__factory } from "./StdStorageSafe__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Test__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Test__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d4b5a2cc2d5e07327f2bd61d962544fd052ca52a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Test__factory.ts
@@ -0,0 +1,562 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type { Test, TestInterface } from "../../../../lib/forge-std/src/Test";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    name: "log",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    name: "log_address",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint256[]",
+        name: "val",
+        type: "uint256[]",
+      },
+    ],
+    name: "log_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "int256[]",
+        name: "val",
+        type: "int256[]",
+      },
+    ],
+    name: "log_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "address[]",
+        name: "val",
+        type: "address[]",
+      },
+    ],
+    name: "log_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    name: "log_bytes",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    name: "log_bytes32",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    name: "log_int",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "address",
+        name: "val",
+        type: "address",
+      },
+    ],
+    name: "log_named_address",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "uint256[]",
+        name: "val",
+        type: "uint256[]",
+      },
+    ],
+    name: "log_named_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "int256[]",
+        name: "val",
+        type: "int256[]",
+      },
+    ],
+    name: "log_named_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "address[]",
+        name: "val",
+        type: "address[]",
+      },
+    ],
+    name: "log_named_array",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "bytes",
+        name: "val",
+        type: "bytes",
+      },
+    ],
+    name: "log_named_bytes",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "bytes32",
+        name: "val",
+        type: "bytes32",
+      },
+    ],
+    name: "log_named_bytes32",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "val",
+        type: "int256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "log_named_decimal_int",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "val",
+        type: "uint256",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "log_named_decimal_uint",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "int256",
+        name: "val",
+        type: "int256",
+      },
+    ],
+    name: "log_named_int",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "string",
+        name: "val",
+        type: "string",
+      },
+    ],
+    name: "log_named_string",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "val",
+        type: "uint256",
+      },
+    ],
+    name: "log_named_uint",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    name: "log_string",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    name: "log_uint",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    name: "logs",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "IS_TEST",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "excludeArtifacts",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "excludedArtifacts_",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "excludeContracts",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "excludedContracts_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "excludeSenders",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "excludedSenders_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "failed",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetArtifactSelectors",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "string",
+            name: "artifact",
+            type: "string",
+          },
+          {
+            internalType: "bytes4[]",
+            name: "selectors",
+            type: "bytes4[]",
+          },
+        ],
+        internalType: "struct StdInvariant.FuzzArtifactSelector[]",
+        name: "targetedArtifactSelectors_",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetArtifacts",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "targetedArtifacts_",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetContracts",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "targetedContracts_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetInterfaces",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "string[]",
+            name: "artifacts",
+            type: "string[]",
+          },
+        ],
+        internalType: "struct StdInvariant.FuzzInterface[]",
+        name: "targetedInterfaces_",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetSelectors",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "bytes4[]",
+            name: "selectors",
+            type: "bytes4[]",
+          },
+        ],
+        internalType: "struct StdInvariant.FuzzSelector[]",
+        name: "targetedSelectors_",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "targetSenders",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "targetedSenders_",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class Test__factory {
+  static readonly abi = _abi;
+  static createInterface(): TestInterface {
+    return new Interface(_abi) as TestInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): Test {
+    return new Contract(address, _abi, runner) as unknown as Test;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Vm.sol/VmSafe__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Vm.sol/VmSafe__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cb2b8d309a8d3d0689d5d6f1763494178e8d8be0
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Vm.sol/VmSafe__factory.ts
@@ -0,0 +1,7248 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  VmSafe,
+  VmSafeInterface,
+} from "../../../../../lib/forge-std/src/Vm.sol/VmSafe";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+    ],
+    name: "accesses",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "readSlots",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "writeSlots",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    name: "addr",
+    outputs: [
+      {
+        internalType: "address",
+        name: "keyAddr",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqAbs",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqAbs",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqAbs",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqAbs",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqAbsDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqAbsDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqAbsDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqAbsDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqRel",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqRel",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqRel",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqRel",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqRelDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqRelDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqRelDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqRelDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32[]",
+        name: "left",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "right",
+        type: "bytes32[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256[]",
+        name: "left",
+        type: "int256[]",
+      },
+      {
+        internalType: "int256[]",
+        name: "right",
+        type: "int256[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "left",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "right",
+        type: "address",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "left",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "right",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address[]",
+        name: "left",
+        type: "address[]",
+      },
+      {
+        internalType: "address[]",
+        name: "right",
+        type: "address[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address[]",
+        name: "left",
+        type: "address[]",
+      },
+      {
+        internalType: "address[]",
+        name: "right",
+        type: "address[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "left",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "right",
+        type: "bool",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "left",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "right",
+        type: "address",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256[]",
+        name: "left",
+        type: "uint256[]",
+      },
+      {
+        internalType: "uint256[]",
+        name: "right",
+        type: "uint256[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool[]",
+        name: "left",
+        type: "bool[]",
+      },
+      {
+        internalType: "bool[]",
+        name: "right",
+        type: "bool[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256[]",
+        name: "left",
+        type: "int256[]",
+      },
+      {
+        internalType: "int256[]",
+        name: "right",
+        type: "int256[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "left",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "right",
+        type: "bytes32",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256[]",
+        name: "left",
+        type: "uint256[]",
+      },
+      {
+        internalType: "uint256[]",
+        name: "right",
+        type: "uint256[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "left",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "right",
+        type: "bytes",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "left",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "right",
+        type: "bytes32",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "left",
+        type: "string[]",
+      },
+      {
+        internalType: "string[]",
+        name: "right",
+        type: "string[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32[]",
+        name: "left",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "right",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "left",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "right",
+        type: "bytes",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool[]",
+        name: "left",
+        type: "bool[]",
+      },
+      {
+        internalType: "bool[]",
+        name: "right",
+        type: "bool[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes[]",
+        name: "left",
+        type: "bytes[]",
+      },
+      {
+        internalType: "bytes[]",
+        name: "right",
+        type: "bytes[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "left",
+        type: "string[]",
+      },
+      {
+        internalType: "string[]",
+        name: "right",
+        type: "string[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "left",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "right",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes[]",
+        name: "left",
+        type: "bytes[]",
+      },
+      {
+        internalType: "bytes[]",
+        name: "right",
+        type: "bytes[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "left",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "right",
+        type: "bool",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "condition",
+        type: "bool",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertFalse",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "condition",
+        type: "bool",
+      },
+    ],
+    name: "assertFalse",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertGe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertGe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertGeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertGeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertGt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertGt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertGtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertGtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertLe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertLe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertLeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertLeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertLt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertLt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertLtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertLtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32[]",
+        name: "left",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "right",
+        type: "bytes32[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256[]",
+        name: "left",
+        type: "int256[]",
+      },
+      {
+        internalType: "int256[]",
+        name: "right",
+        type: "int256[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "left",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "right",
+        type: "bool",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes[]",
+        name: "left",
+        type: "bytes[]",
+      },
+      {
+        internalType: "bytes[]",
+        name: "right",
+        type: "bytes[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "left",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "right",
+        type: "bool",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool[]",
+        name: "left",
+        type: "bool[]",
+      },
+      {
+        internalType: "bool[]",
+        name: "right",
+        type: "bool[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "left",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "right",
+        type: "bytes",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address[]",
+        name: "left",
+        type: "address[]",
+      },
+      {
+        internalType: "address[]",
+        name: "right",
+        type: "address[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256[]",
+        name: "left",
+        type: "uint256[]",
+      },
+      {
+        internalType: "uint256[]",
+        name: "right",
+        type: "uint256[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool[]",
+        name: "left",
+        type: "bool[]",
+      },
+      {
+        internalType: "bool[]",
+        name: "right",
+        type: "bool[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "left",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "right",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address[]",
+        name: "left",
+        type: "address[]",
+      },
+      {
+        internalType: "address[]",
+        name: "right",
+        type: "address[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "left",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "right",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "left",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "right",
+        type: "address",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "left",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "right",
+        type: "bytes32",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "left",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "right",
+        type: "bytes",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256[]",
+        name: "left",
+        type: "uint256[]",
+      },
+      {
+        internalType: "uint256[]",
+        name: "right",
+        type: "uint256[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "left",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "right",
+        type: "address",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "left",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "right",
+        type: "bytes32",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "left",
+        type: "string[]",
+      },
+      {
+        internalType: "string[]",
+        name: "right",
+        type: "string[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32[]",
+        name: "left",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "right",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "left",
+        type: "string[]",
+      },
+      {
+        internalType: "string[]",
+        name: "right",
+        type: "string[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256[]",
+        name: "left",
+        type: "int256[]",
+      },
+      {
+        internalType: "int256[]",
+        name: "right",
+        type: "int256[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes[]",
+        name: "left",
+        type: "bytes[]",
+      },
+      {
+        internalType: "bytes[]",
+        name: "right",
+        type: "bytes[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertNotEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertNotEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "condition",
+        type: "bool",
+      },
+    ],
+    name: "assertTrue",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "condition",
+        type: "bool",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertTrue",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "condition",
+        type: "bool",
+      },
+    ],
+    name: "assume",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "char",
+        type: "string",
+      },
+    ],
+    name: "breakpoint",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "char",
+        type: "string",
+      },
+      {
+        internalType: "bool",
+        name: "value",
+        type: "bool",
+      },
+    ],
+    name: "breakpoint",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "broadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "signer",
+        type: "address",
+      },
+    ],
+    name: "broadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    name: "broadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "closeFile",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "salt",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "initCodeHash",
+        type: "bytes32",
+      },
+    ],
+    name: "computeCreate2Address",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "salt",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "initCodeHash",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "deployer",
+        type: "address",
+      },
+    ],
+    name: "computeCreate2Address",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "deployer",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "nonce",
+        type: "uint256",
+      },
+    ],
+    name: "computeCreateAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "from",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "to",
+        type: "string",
+      },
+    ],
+    name: "copyFile",
+    outputs: [
+      {
+        internalType: "uint64",
+        name: "copied",
+        type: "uint64",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "bool",
+        name: "recursive",
+        type: "bool",
+      },
+    ],
+    name: "createDir",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "walletLabel",
+        type: "string",
+      },
+    ],
+    name: "createWallet",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyX",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyY",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "privateKey",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.Wallet",
+        name: "wallet",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    name: "createWallet",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyX",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyY",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "privateKey",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.Wallet",
+        name: "wallet",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "walletLabel",
+        type: "string",
+      },
+    ],
+    name: "createWallet",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyX",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyY",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "privateKey",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.Wallet",
+        name: "wallet",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "mnemonic",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "derivationPath",
+        type: "string",
+      },
+      {
+        internalType: "uint32",
+        name: "index",
+        type: "uint32",
+      },
+      {
+        internalType: "string",
+        name: "language",
+        type: "string",
+      },
+    ],
+    name: "deriveKey",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "mnemonic",
+        type: "string",
+      },
+      {
+        internalType: "uint32",
+        name: "index",
+        type: "uint32",
+      },
+      {
+        internalType: "string",
+        name: "language",
+        type: "string",
+      },
+    ],
+    name: "deriveKey",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "mnemonic",
+        type: "string",
+      },
+      {
+        internalType: "uint32",
+        name: "index",
+        type: "uint32",
+      },
+    ],
+    name: "deriveKey",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "mnemonic",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "derivationPath",
+        type: "string",
+      },
+      {
+        internalType: "uint32",
+        name: "index",
+        type: "uint32",
+      },
+    ],
+    name: "deriveKey",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "ensNamehash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "value",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envAddress",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "value",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envBool",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "value",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envBool",
+    outputs: [
+      {
+        internalType: "bool[]",
+        name: "value",
+        type: "bool[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envBytes",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "value",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envBytes",
+    outputs: [
+      {
+        internalType: "bytes[]",
+        name: "value",
+        type: "bytes[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envBytes32",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "value",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envBytes32",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "value",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envExists",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "result",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envInt",
+    outputs: [
+      {
+        internalType: "int256[]",
+        name: "value",
+        type: "int256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envInt",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "value",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "defaultValue",
+        type: "bytes32[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "value",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "int256[]",
+        name: "defaultValue",
+        type: "int256[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "int256[]",
+        name: "value",
+        type: "int256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "bool",
+        name: "defaultValue",
+        type: "bool",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "value",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "address",
+        name: "defaultValue",
+        type: "address",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "address",
+        name: "value",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "defaultValue",
+        type: "uint256",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "bytes[]",
+        name: "defaultValue",
+        type: "bytes[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bytes[]",
+        name: "value",
+        type: "bytes[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "uint256[]",
+        name: "defaultValue",
+        type: "uint256[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "uint256[]",
+        name: "value",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "string[]",
+        name: "defaultValue",
+        type: "string[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "value",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "bytes",
+        name: "defaultValue",
+        type: "bytes",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "value",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "bytes32",
+        name: "defaultValue",
+        type: "bytes32",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "value",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "int256",
+        name: "defaultValue",
+        type: "int256",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "value",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "address[]",
+        name: "defaultValue",
+        type: "address[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "value",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "defaultValue",
+        type: "string",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "string",
+        name: "value",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "bool[]",
+        name: "defaultValue",
+        type: "bool[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bool[]",
+        name: "value",
+        type: "bool[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envString",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "value",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "value",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envUint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envUint",
+    outputs: [
+      {
+        internalType: "uint256[]",
+        name: "value",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "fromBlock",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "toBlock",
+        type: "uint256",
+      },
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "topics",
+        type: "bytes32[]",
+      },
+    ],
+    name: "eth_getLogs",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "emitter",
+            type: "address",
+          },
+          {
+            internalType: "bytes32[]",
+            name: "topics",
+            type: "bytes32[]",
+          },
+          {
+            internalType: "bytes",
+            name: "data",
+            type: "bytes",
+          },
+          {
+            internalType: "bytes32",
+            name: "blockHash",
+            type: "bytes32",
+          },
+          {
+            internalType: "uint64",
+            name: "blockNumber",
+            type: "uint64",
+          },
+          {
+            internalType: "bytes32",
+            name: "transactionHash",
+            type: "bytes32",
+          },
+          {
+            internalType: "uint64",
+            name: "transactionIndex",
+            type: "uint64",
+          },
+          {
+            internalType: "uint256",
+            name: "logIndex",
+            type: "uint256",
+          },
+          {
+            internalType: "bool",
+            name: "removed",
+            type: "bool",
+          },
+        ],
+        internalType: "struct VmSafe.EthGetLogs[]",
+        name: "logs",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "exists",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "result",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "commandInput",
+        type: "string[]",
+      },
+    ],
+    name: "ffi",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "result",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "fsMetadata",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "bool",
+            name: "isDir",
+            type: "bool",
+          },
+          {
+            internalType: "bool",
+            name: "isSymlink",
+            type: "bool",
+          },
+          {
+            internalType: "uint256",
+            name: "length",
+            type: "uint256",
+          },
+          {
+            internalType: "bool",
+            name: "readOnly",
+            type: "bool",
+          },
+          {
+            internalType: "uint256",
+            name: "modified",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "accessed",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "created",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.FsMetadata",
+        name: "metadata",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getBlobBaseFee",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "blobBaseFee",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getBlockNumber",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "height",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getBlockTimestamp",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "timestamp",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "artifactPath",
+        type: "string",
+      },
+    ],
+    name: "getCode",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "creationBytecode",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "artifactPath",
+        type: "string",
+      },
+    ],
+    name: "getDeployedCode",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "runtimeBytecode",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "getLabel",
+    outputs: [
+      {
+        internalType: "string",
+        name: "currentLabel",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "elementSlot",
+        type: "bytes32",
+      },
+    ],
+    name: "getMappingKeyAndParentOf",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "found",
+        type: "bool",
+      },
+      {
+        internalType: "bytes32",
+        name: "key",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "parent",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "mappingSlot",
+        type: "bytes32",
+      },
+    ],
+    name: "getMappingLength",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "length",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "mappingSlot",
+        type: "bytes32",
+      },
+      {
+        internalType: "uint256",
+        name: "idx",
+        type: "uint256",
+      },
+    ],
+    name: "getMappingSlotAt",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "value",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "getNonce",
+    outputs: [
+      {
+        internalType: "uint64",
+        name: "nonce",
+        type: "uint64",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyX",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyY",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "privateKey",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.Wallet",
+        name: "wallet",
+        type: "tuple",
+      },
+    ],
+    name: "getNonce",
+    outputs: [
+      {
+        internalType: "uint64",
+        name: "nonce",
+        type: "uint64",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getRecordedLogs",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "bytes32[]",
+            name: "topics",
+            type: "bytes32[]",
+          },
+          {
+            internalType: "bytes",
+            name: "data",
+            type: "bytes",
+          },
+          {
+            internalType: "address",
+            name: "emitter",
+            type: "address",
+          },
+        ],
+        internalType: "struct VmSafe.Log[]",
+        name: "logs",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "indexOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "enum VmSafe.ForgeContext",
+        name: "context",
+        type: "uint8",
+      },
+    ],
+    name: "isContext",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "result",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "isDir",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "result",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "isFile",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "result",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "keyExists",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "keyExistsJson",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "keyExistsToml",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        internalType: "string",
+        name: "newLabel",
+        type: "string",
+      },
+    ],
+    name: "label",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "lastCallGas",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "uint64",
+            name: "gasLimit",
+            type: "uint64",
+          },
+          {
+            internalType: "uint64",
+            name: "gasTotalUsed",
+            type: "uint64",
+          },
+          {
+            internalType: "uint64",
+            name: "gasMemoryUsed",
+            type: "uint64",
+          },
+          {
+            internalType: "int64",
+            name: "gasRefunded",
+            type: "int64",
+          },
+          {
+            internalType: "uint64",
+            name: "gasRemaining",
+            type: "uint64",
+          },
+        ],
+        internalType: "struct VmSafe.Gas",
+        name: "gas",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "slot",
+        type: "bytes32",
+      },
+    ],
+    name: "load",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "data",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "parsedValue",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseBool",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "parsedValue",
+        type: "bool",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseBytes",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "parsedValue",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseBytes32",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "parsedValue",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseInt",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "parsedValue",
+        type: "int256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    name: "parseJson",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "abiEncodedData",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJson",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "abiEncodedData",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonAddressArray",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBool",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBoolArray",
+    outputs: [
+      {
+        internalType: "bool[]",
+        name: "",
+        type: "bool[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBytes",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBytes32",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBytes32Array",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBytesArray",
+    outputs: [
+      {
+        internalType: "bytes[]",
+        name: "",
+        type: "bytes[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonInt",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonIntArray",
+    outputs: [
+      {
+        internalType: "int256[]",
+        name: "",
+        type: "int256[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonKeys",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "keys",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonStringArray",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonUint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonUintArray",
+    outputs: [
+      {
+        internalType: "uint256[]",
+        name: "",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseToml",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "abiEncodedData",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+    ],
+    name: "parseToml",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "abiEncodedData",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlAddressArray",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBool",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBoolArray",
+    outputs: [
+      {
+        internalType: "bool[]",
+        name: "",
+        type: "bool[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBytes",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBytes32",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBytes32Array",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBytesArray",
+    outputs: [
+      {
+        internalType: "bytes[]",
+        name: "",
+        type: "bytes[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlInt",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlIntArray",
+    outputs: [
+      {
+        internalType: "int256[]",
+        name: "",
+        type: "int256[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlKeys",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "keys",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlStringArray",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlUint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlUintArray",
+    outputs: [
+      {
+        internalType: "uint256[]",
+        name: "",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseUint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "parsedValue",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "pauseGasMetering",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "projectRoot",
+    outputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "promptText",
+        type: "string",
+      },
+    ],
+    name: "prompt",
+    outputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "promptText",
+        type: "string",
+      },
+    ],
+    name: "promptAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "promptText",
+        type: "string",
+      },
+    ],
+    name: "promptSecret",
+    outputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "promptText",
+        type: "string",
+      },
+    ],
+    name: "promptUint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "uint64",
+        name: "maxDepth",
+        type: "uint64",
+      },
+    ],
+    name: "readDir",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "string",
+            name: "errorMessage",
+            type: "string",
+          },
+          {
+            internalType: "string",
+            name: "path",
+            type: "string",
+          },
+          {
+            internalType: "uint64",
+            name: "depth",
+            type: "uint64",
+          },
+          {
+            internalType: "bool",
+            name: "isDir",
+            type: "bool",
+          },
+          {
+            internalType: "bool",
+            name: "isSymlink",
+            type: "bool",
+          },
+        ],
+        internalType: "struct VmSafe.DirEntry[]",
+        name: "entries",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "uint64",
+        name: "maxDepth",
+        type: "uint64",
+      },
+      {
+        internalType: "bool",
+        name: "followLinks",
+        type: "bool",
+      },
+    ],
+    name: "readDir",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "string",
+            name: "errorMessage",
+            type: "string",
+          },
+          {
+            internalType: "string",
+            name: "path",
+            type: "string",
+          },
+          {
+            internalType: "uint64",
+            name: "depth",
+            type: "uint64",
+          },
+          {
+            internalType: "bool",
+            name: "isDir",
+            type: "bool",
+          },
+          {
+            internalType: "bool",
+            name: "isSymlink",
+            type: "bool",
+          },
+        ],
+        internalType: "struct VmSafe.DirEntry[]",
+        name: "entries",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "readDir",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "string",
+            name: "errorMessage",
+            type: "string",
+          },
+          {
+            internalType: "string",
+            name: "path",
+            type: "string",
+          },
+          {
+            internalType: "uint64",
+            name: "depth",
+            type: "uint64",
+          },
+          {
+            internalType: "bool",
+            name: "isDir",
+            type: "bool",
+          },
+          {
+            internalType: "bool",
+            name: "isSymlink",
+            type: "bool",
+          },
+        ],
+        internalType: "struct VmSafe.DirEntry[]",
+        name: "entries",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "readFile",
+    outputs: [
+      {
+        internalType: "string",
+        name: "data",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "readFileBinary",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "readLine",
+    outputs: [
+      {
+        internalType: "string",
+        name: "line",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "linkPath",
+        type: "string",
+      },
+    ],
+    name: "readLink",
+    outputs: [
+      {
+        internalType: "string",
+        name: "targetPath",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "record",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "recordLogs",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    name: "rememberKey",
+    outputs: [
+      {
+        internalType: "address",
+        name: "keyAddr",
+        type: "address",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "bool",
+        name: "recursive",
+        type: "bool",
+      },
+    ],
+    name: "removeDir",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "removeFile",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "from",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "to",
+        type: "string",
+      },
+    ],
+    name: "replace",
+    outputs: [
+      {
+        internalType: "string",
+        name: "output",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "resumeGasMetering",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "method",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "params",
+        type: "string",
+      },
+    ],
+    name: "rpc",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "rpcAlias",
+        type: "string",
+      },
+    ],
+    name: "rpcUrl",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "rpcUrlStructs",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "string",
+            name: "key",
+            type: "string",
+          },
+          {
+            internalType: "string",
+            name: "url",
+            type: "string",
+          },
+        ],
+        internalType: "struct VmSafe.Rpc[]",
+        name: "urls",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "rpcUrls",
+    outputs: [
+      {
+        internalType: "string[2][]",
+        name: "urls",
+        type: "string[2][]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "address[]",
+        name: "values",
+        type: "address[]",
+      },
+    ],
+    name: "serializeAddress",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "address",
+        name: "value",
+        type: "address",
+      },
+    ],
+    name: "serializeAddress",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bool[]",
+        name: "values",
+        type: "bool[]",
+      },
+    ],
+    name: "serializeBool",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bool",
+        name: "value",
+        type: "bool",
+      },
+    ],
+    name: "serializeBool",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bytes[]",
+        name: "values",
+        type: "bytes[]",
+      },
+    ],
+    name: "serializeBytes",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bytes",
+        name: "value",
+        type: "bytes",
+      },
+    ],
+    name: "serializeBytes",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "values",
+        type: "bytes32[]",
+      },
+    ],
+    name: "serializeBytes32",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bytes32",
+        name: "value",
+        type: "bytes32",
+      },
+    ],
+    name: "serializeBytes32",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "int256",
+        name: "value",
+        type: "int256",
+      },
+    ],
+    name: "serializeInt",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "int256[]",
+        name: "values",
+        type: "int256[]",
+      },
+    ],
+    name: "serializeInt",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "value",
+        type: "string",
+      },
+    ],
+    name: "serializeJson",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "string[]",
+        name: "values",
+        type: "string[]",
+      },
+    ],
+    name: "serializeString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "value",
+        type: "string",
+      },
+    ],
+    name: "serializeString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "serializeUint",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "uint256[]",
+        name: "values",
+        type: "uint256[]",
+      },
+    ],
+    name: "serializeUint",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "serializeUintToHex",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "value",
+        type: "string",
+      },
+    ],
+    name: "setEnv",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "digest",
+        type: "bytes32",
+      },
+    ],
+    name: "sign",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "v",
+        type: "uint8",
+      },
+      {
+        internalType: "bytes32",
+        name: "r",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "signer",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "digest",
+        type: "bytes32",
+      },
+    ],
+    name: "sign",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "v",
+        type: "uint8",
+      },
+      {
+        internalType: "bytes32",
+        name: "r",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyX",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyY",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "privateKey",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.Wallet",
+        name: "wallet",
+        type: "tuple",
+      },
+      {
+        internalType: "bytes32",
+        name: "digest",
+        type: "bytes32",
+      },
+    ],
+    name: "sign",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "v",
+        type: "uint8",
+      },
+      {
+        internalType: "bytes32",
+        name: "r",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes32",
+        name: "digest",
+        type: "bytes32",
+      },
+    ],
+    name: "sign",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "v",
+        type: "uint8",
+      },
+      {
+        internalType: "bytes32",
+        name: "r",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes32",
+        name: "digest",
+        type: "bytes32",
+      },
+    ],
+    name: "signP256",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "r",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "duration",
+        type: "uint256",
+      },
+    ],
+    name: "sleep",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delimiter",
+        type: "string",
+      },
+    ],
+    name: "split",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "outputs",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "startBroadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "signer",
+        type: "address",
+      },
+    ],
+    name: "startBroadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    name: "startBroadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "startMappingRecording",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "startStateDiffRecording",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "stopAndReturnStateDiff",
+    outputs: [
+      {
+        components: [
+          {
+            components: [
+              {
+                internalType: "uint256",
+                name: "forkId",
+                type: "uint256",
+              },
+              {
+                internalType: "uint256",
+                name: "chainId",
+                type: "uint256",
+              },
+            ],
+            internalType: "struct VmSafe.ChainInfo",
+            name: "chainInfo",
+            type: "tuple",
+          },
+          {
+            internalType: "enum VmSafe.AccountAccessKind",
+            name: "kind",
+            type: "uint8",
+          },
+          {
+            internalType: "address",
+            name: "account",
+            type: "address",
+          },
+          {
+            internalType: "address",
+            name: "accessor",
+            type: "address",
+          },
+          {
+            internalType: "bool",
+            name: "initialized",
+            type: "bool",
+          },
+          {
+            internalType: "uint256",
+            name: "oldBalance",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "newBalance",
+            type: "uint256",
+          },
+          {
+            internalType: "bytes",
+            name: "deployedCode",
+            type: "bytes",
+          },
+          {
+            internalType: "uint256",
+            name: "value",
+            type: "uint256",
+          },
+          {
+            internalType: "bytes",
+            name: "data",
+            type: "bytes",
+          },
+          {
+            internalType: "bool",
+            name: "reverted",
+            type: "bool",
+          },
+          {
+            components: [
+              {
+                internalType: "address",
+                name: "account",
+                type: "address",
+              },
+              {
+                internalType: "bytes32",
+                name: "slot",
+                type: "bytes32",
+              },
+              {
+                internalType: "bool",
+                name: "isWrite",
+                type: "bool",
+              },
+              {
+                internalType: "bytes32",
+                name: "previousValue",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "newValue",
+                type: "bytes32",
+              },
+              {
+                internalType: "bool",
+                name: "reverted",
+                type: "bool",
+              },
+            ],
+            internalType: "struct VmSafe.StorageAccess[]",
+            name: "storageAccesses",
+            type: "tuple[]",
+          },
+          {
+            internalType: "uint64",
+            name: "depth",
+            type: "uint64",
+          },
+        ],
+        internalType: "struct VmSafe.AccountAccess[]",
+        name: "accountAccesses",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "stopBroadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "stopMappingRecording",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "data",
+        type: "string",
+      },
+    ],
+    name: "toBase64",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "toBase64",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "data",
+        type: "string",
+      },
+    ],
+    name: "toBase64URL",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "toBase64URL",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+    ],
+    name: "toLowercase",
+    outputs: [
+      {
+        internalType: "string",
+        name: "output",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "value",
+        type: "address",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "value",
+        type: "bytes",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "value",
+        type: "bool",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "value",
+        type: "int256",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "value",
+        type: "bytes32",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+    ],
+    name: "toUppercase",
+    outputs: [
+      {
+        internalType: "string",
+        name: "output",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+    ],
+    name: "trim",
+    outputs: [
+      {
+        internalType: "string",
+        name: "output",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "commandInput",
+        type: "string[]",
+      },
+    ],
+    name: "tryFfi",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "int32",
+            name: "exitCode",
+            type: "int32",
+          },
+          {
+            internalType: "bytes",
+            name: "stdout",
+            type: "bytes",
+          },
+          {
+            internalType: "bytes",
+            name: "stderr",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct VmSafe.FfiResult",
+        name: "result",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "unixTime",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "milliseconds",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "data",
+        type: "string",
+      },
+    ],
+    name: "writeFile",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "writeFileBinary",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+    ],
+    name: "writeJson",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "writeJson",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "data",
+        type: "string",
+      },
+    ],
+    name: "writeLine",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+    ],
+    name: "writeToml",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "writeToml",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class VmSafe__factory {
+  static readonly abi = _abi;
+  static createInterface(): VmSafeInterface {
+    return new Interface(_abi) as VmSafeInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): VmSafe {
+    return new Contract(address, _abi, runner) as unknown as VmSafe;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Vm.sol/Vm__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Vm.sol/Vm__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b87dc1edec45b82a343735b789d4cf0351235669
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Vm.sol/Vm__factory.ts
@@ -0,0 +1,8578 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  Vm,
+  VmInterface,
+} from "../../../../../lib/forge-std/src/Vm.sol/Vm";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+    ],
+    name: "accesses",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "readSlots",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "writeSlots",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "activeFork",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "forkId",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    name: "addr",
+    outputs: [
+      {
+        internalType: "address",
+        name: "keyAddr",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "allowCheatcodes",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqAbs",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqAbs",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqAbs",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqAbs",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqAbsDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqAbsDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqAbsDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqAbsDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqRel",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqRel",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqRel",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqRel",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqRelDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqRelDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertApproxEqRelDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "maxPercentDelta",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertApproxEqRelDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32[]",
+        name: "left",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "right",
+        type: "bytes32[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256[]",
+        name: "left",
+        type: "int256[]",
+      },
+      {
+        internalType: "int256[]",
+        name: "right",
+        type: "int256[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "left",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "right",
+        type: "address",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "left",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "right",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address[]",
+        name: "left",
+        type: "address[]",
+      },
+      {
+        internalType: "address[]",
+        name: "right",
+        type: "address[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address[]",
+        name: "left",
+        type: "address[]",
+      },
+      {
+        internalType: "address[]",
+        name: "right",
+        type: "address[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "left",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "right",
+        type: "bool",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "left",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "right",
+        type: "address",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256[]",
+        name: "left",
+        type: "uint256[]",
+      },
+      {
+        internalType: "uint256[]",
+        name: "right",
+        type: "uint256[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool[]",
+        name: "left",
+        type: "bool[]",
+      },
+      {
+        internalType: "bool[]",
+        name: "right",
+        type: "bool[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256[]",
+        name: "left",
+        type: "int256[]",
+      },
+      {
+        internalType: "int256[]",
+        name: "right",
+        type: "int256[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "left",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "right",
+        type: "bytes32",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256[]",
+        name: "left",
+        type: "uint256[]",
+      },
+      {
+        internalType: "uint256[]",
+        name: "right",
+        type: "uint256[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "left",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "right",
+        type: "bytes",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "left",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "right",
+        type: "bytes32",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "left",
+        type: "string[]",
+      },
+      {
+        internalType: "string[]",
+        name: "right",
+        type: "string[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32[]",
+        name: "left",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "right",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "left",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "right",
+        type: "bytes",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool[]",
+        name: "left",
+        type: "bool[]",
+      },
+      {
+        internalType: "bool[]",
+        name: "right",
+        type: "bool[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes[]",
+        name: "left",
+        type: "bytes[]",
+      },
+      {
+        internalType: "bytes[]",
+        name: "right",
+        type: "bytes[]",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "left",
+        type: "string[]",
+      },
+      {
+        internalType: "string[]",
+        name: "right",
+        type: "string[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "left",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "right",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes[]",
+        name: "left",
+        type: "bytes[]",
+      },
+      {
+        internalType: "bytes[]",
+        name: "right",
+        type: "bytes[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "left",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "right",
+        type: "bool",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "condition",
+        type: "bool",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertFalse",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "condition",
+        type: "bool",
+      },
+    ],
+    name: "assertFalse",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertGe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertGe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertGeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertGeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertGt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertGt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertGtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertGtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertGtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertLe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertLe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLe",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertLeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertLeDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertLt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertLt",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertLtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertLtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertLtDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32[]",
+        name: "left",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "right",
+        type: "bytes32[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256[]",
+        name: "left",
+        type: "int256[]",
+      },
+      {
+        internalType: "int256[]",
+        name: "right",
+        type: "int256[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "left",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "right",
+        type: "bool",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes[]",
+        name: "left",
+        type: "bytes[]",
+      },
+      {
+        internalType: "bytes[]",
+        name: "right",
+        type: "bytes[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "left",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "right",
+        type: "bool",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool[]",
+        name: "left",
+        type: "bool[]",
+      },
+      {
+        internalType: "bool[]",
+        name: "right",
+        type: "bool[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "left",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "right",
+        type: "bytes",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address[]",
+        name: "left",
+        type: "address[]",
+      },
+      {
+        internalType: "address[]",
+        name: "right",
+        type: "address[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256[]",
+        name: "left",
+        type: "uint256[]",
+      },
+      {
+        internalType: "uint256[]",
+        name: "right",
+        type: "uint256[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool[]",
+        name: "left",
+        type: "bool[]",
+      },
+      {
+        internalType: "bool[]",
+        name: "right",
+        type: "bool[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "left",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "right",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address[]",
+        name: "left",
+        type: "address[]",
+      },
+      {
+        internalType: "address[]",
+        name: "right",
+        type: "address[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "left",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "right",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "left",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "right",
+        type: "address",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "left",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "right",
+        type: "bytes32",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "left",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "right",
+        type: "bytes",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256[]",
+        name: "left",
+        type: "uint256[]",
+      },
+      {
+        internalType: "uint256[]",
+        name: "right",
+        type: "uint256[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "left",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "right",
+        type: "address",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "left",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "right",
+        type: "bytes32",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "left",
+        type: "string[]",
+      },
+      {
+        internalType: "string[]",
+        name: "right",
+        type: "string[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32[]",
+        name: "left",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "right",
+        type: "bytes32[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "left",
+        type: "string[]",
+      },
+      {
+        internalType: "string[]",
+        name: "right",
+        type: "string[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256[]",
+        name: "left",
+        type: "int256[]",
+      },
+      {
+        internalType: "int256[]",
+        name: "right",
+        type: "int256[]",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes[]",
+        name: "left",
+        type: "bytes[]",
+      },
+      {
+        internalType: "bytes[]",
+        name: "right",
+        type: "bytes[]",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+    ],
+    name: "assertNotEq",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertNotEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "left",
+        type: "int256",
+      },
+      {
+        internalType: "int256",
+        name: "right",
+        type: "int256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+    ],
+    name: "assertNotEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "left",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "right",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "decimals",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertNotEqDecimal",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "condition",
+        type: "bool",
+      },
+    ],
+    name: "assertTrue",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "condition",
+        type: "bool",
+      },
+      {
+        internalType: "string",
+        name: "error",
+        type: "string",
+      },
+    ],
+    name: "assertTrue",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "condition",
+        type: "bool",
+      },
+    ],
+    name: "assume",
+    outputs: [],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "newBlobBaseFee",
+        type: "uint256",
+      },
+    ],
+    name: "blobBaseFee",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32[]",
+        name: "hashes",
+        type: "bytes32[]",
+      },
+    ],
+    name: "blobhashes",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "char",
+        type: "string",
+      },
+    ],
+    name: "breakpoint",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "char",
+        type: "string",
+      },
+      {
+        internalType: "bool",
+        name: "value",
+        type: "bool",
+      },
+    ],
+    name: "breakpoint",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "broadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "signer",
+        type: "address",
+      },
+    ],
+    name: "broadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    name: "broadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "newChainId",
+        type: "uint256",
+      },
+    ],
+    name: "chainId",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "clearMockedCalls",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "closeFile",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "newCoinbase",
+        type: "address",
+      },
+    ],
+    name: "coinbase",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "salt",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "initCodeHash",
+        type: "bytes32",
+      },
+    ],
+    name: "computeCreate2Address",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "salt",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "initCodeHash",
+        type: "bytes32",
+      },
+      {
+        internalType: "address",
+        name: "deployer",
+        type: "address",
+      },
+    ],
+    name: "computeCreate2Address",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "deployer",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "nonce",
+        type: "uint256",
+      },
+    ],
+    name: "computeCreateAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "from",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "to",
+        type: "string",
+      },
+    ],
+    name: "copyFile",
+    outputs: [
+      {
+        internalType: "uint64",
+        name: "copied",
+        type: "uint64",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "bool",
+        name: "recursive",
+        type: "bool",
+      },
+    ],
+    name: "createDir",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "urlOrAlias",
+        type: "string",
+      },
+    ],
+    name: "createFork",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "forkId",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "urlOrAlias",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "blockNumber",
+        type: "uint256",
+      },
+    ],
+    name: "createFork",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "forkId",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "urlOrAlias",
+        type: "string",
+      },
+      {
+        internalType: "bytes32",
+        name: "txHash",
+        type: "bytes32",
+      },
+    ],
+    name: "createFork",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "forkId",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "urlOrAlias",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "blockNumber",
+        type: "uint256",
+      },
+    ],
+    name: "createSelectFork",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "forkId",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "urlOrAlias",
+        type: "string",
+      },
+      {
+        internalType: "bytes32",
+        name: "txHash",
+        type: "bytes32",
+      },
+    ],
+    name: "createSelectFork",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "forkId",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "urlOrAlias",
+        type: "string",
+      },
+    ],
+    name: "createSelectFork",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "forkId",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "walletLabel",
+        type: "string",
+      },
+    ],
+    name: "createWallet",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyX",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyY",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "privateKey",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.Wallet",
+        name: "wallet",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    name: "createWallet",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyX",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyY",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "privateKey",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.Wallet",
+        name: "wallet",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+      {
+        internalType: "string",
+        name: "walletLabel",
+        type: "string",
+      },
+    ],
+    name: "createWallet",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyX",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyY",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "privateKey",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.Wallet",
+        name: "wallet",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "newBalance",
+        type: "uint256",
+      },
+    ],
+    name: "deal",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "snapshotId",
+        type: "uint256",
+      },
+    ],
+    name: "deleteSnapshot",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "success",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "deleteSnapshots",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "mnemonic",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "derivationPath",
+        type: "string",
+      },
+      {
+        internalType: "uint32",
+        name: "index",
+        type: "uint32",
+      },
+      {
+        internalType: "string",
+        name: "language",
+        type: "string",
+      },
+    ],
+    name: "deriveKey",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "mnemonic",
+        type: "string",
+      },
+      {
+        internalType: "uint32",
+        name: "index",
+        type: "uint32",
+      },
+      {
+        internalType: "string",
+        name: "language",
+        type: "string",
+      },
+    ],
+    name: "deriveKey",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "mnemonic",
+        type: "string",
+      },
+      {
+        internalType: "uint32",
+        name: "index",
+        type: "uint32",
+      },
+    ],
+    name: "deriveKey",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "mnemonic",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "derivationPath",
+        type: "string",
+      },
+      {
+        internalType: "uint32",
+        name: "index",
+        type: "uint32",
+      },
+    ],
+    name: "deriveKey",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "newDifficulty",
+        type: "uint256",
+      },
+    ],
+    name: "difficulty",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "pathToStateJson",
+        type: "string",
+      },
+    ],
+    name: "dumpState",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "ensNamehash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "value",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envAddress",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "value",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envBool",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "value",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envBool",
+    outputs: [
+      {
+        internalType: "bool[]",
+        name: "value",
+        type: "bool[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envBytes",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "value",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envBytes",
+    outputs: [
+      {
+        internalType: "bytes[]",
+        name: "value",
+        type: "bytes[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envBytes32",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "value",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envBytes32",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "value",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envExists",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "result",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envInt",
+    outputs: [
+      {
+        internalType: "int256[]",
+        name: "value",
+        type: "int256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envInt",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "value",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "defaultValue",
+        type: "bytes32[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "value",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "int256[]",
+        name: "defaultValue",
+        type: "int256[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "int256[]",
+        name: "value",
+        type: "int256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "bool",
+        name: "defaultValue",
+        type: "bool",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "value",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "address",
+        name: "defaultValue",
+        type: "address",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "address",
+        name: "value",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "defaultValue",
+        type: "uint256",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "bytes[]",
+        name: "defaultValue",
+        type: "bytes[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bytes[]",
+        name: "value",
+        type: "bytes[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "uint256[]",
+        name: "defaultValue",
+        type: "uint256[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "uint256[]",
+        name: "value",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "string[]",
+        name: "defaultValue",
+        type: "string[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "value",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "bytes",
+        name: "defaultValue",
+        type: "bytes",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "value",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "bytes32",
+        name: "defaultValue",
+        type: "bytes32",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "value",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "int256",
+        name: "defaultValue",
+        type: "int256",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "value",
+        type: "int256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "address[]",
+        name: "defaultValue",
+        type: "address[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "value",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "defaultValue",
+        type: "string",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "string",
+        name: "value",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+      {
+        internalType: "bool[]",
+        name: "defaultValue",
+        type: "bool[]",
+      },
+    ],
+    name: "envOr",
+    outputs: [
+      {
+        internalType: "bool[]",
+        name: "value",
+        type: "bool[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envString",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "value",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "value",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+    ],
+    name: "envUint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delim",
+        type: "string",
+      },
+    ],
+    name: "envUint",
+    outputs: [
+      {
+        internalType: "uint256[]",
+        name: "value",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes",
+        name: "newRuntimeBytecode",
+        type: "bytes",
+      },
+    ],
+    name: "etch",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "fromBlock",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "toBlock",
+        type: "uint256",
+      },
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "topics",
+        type: "bytes32[]",
+      },
+    ],
+    name: "eth_getLogs",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "emitter",
+            type: "address",
+          },
+          {
+            internalType: "bytes32[]",
+            name: "topics",
+            type: "bytes32[]",
+          },
+          {
+            internalType: "bytes",
+            name: "data",
+            type: "bytes",
+          },
+          {
+            internalType: "bytes32",
+            name: "blockHash",
+            type: "bytes32",
+          },
+          {
+            internalType: "uint64",
+            name: "blockNumber",
+            type: "uint64",
+          },
+          {
+            internalType: "bytes32",
+            name: "transactionHash",
+            type: "bytes32",
+          },
+          {
+            internalType: "uint64",
+            name: "transactionIndex",
+            type: "uint64",
+          },
+          {
+            internalType: "uint256",
+            name: "logIndex",
+            type: "uint256",
+          },
+          {
+            internalType: "bool",
+            name: "removed",
+            type: "bool",
+          },
+        ],
+        internalType: "struct VmSafe.EthGetLogs[]",
+        name: "logs",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "exists",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "result",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "msgValue",
+        type: "uint256",
+      },
+      {
+        internalType: "uint64",
+        name: "gas",
+        type: "uint64",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "expectCall",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "msgValue",
+        type: "uint256",
+      },
+      {
+        internalType: "uint64",
+        name: "gas",
+        type: "uint64",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+      {
+        internalType: "uint64",
+        name: "count",
+        type: "uint64",
+      },
+    ],
+    name: "expectCall",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "msgValue",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+      {
+        internalType: "uint64",
+        name: "count",
+        type: "uint64",
+      },
+    ],
+    name: "expectCall",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "expectCall",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+      {
+        internalType: "uint64",
+        name: "count",
+        type: "uint64",
+      },
+    ],
+    name: "expectCall",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "msgValue",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "expectCall",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "msgValue",
+        type: "uint256",
+      },
+      {
+        internalType: "uint64",
+        name: "minGas",
+        type: "uint64",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "expectCallMinGas",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "msgValue",
+        type: "uint256",
+      },
+      {
+        internalType: "uint64",
+        name: "minGas",
+        type: "uint64",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+      {
+        internalType: "uint64",
+        name: "count",
+        type: "uint64",
+      },
+    ],
+    name: "expectCallMinGas",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "expectEmit",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "checkTopic1",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "checkTopic2",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "checkTopic3",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "checkData",
+        type: "bool",
+      },
+    ],
+    name: "expectEmit",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "checkTopic1",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "checkTopic2",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "checkTopic3",
+        type: "bool",
+      },
+      {
+        internalType: "bool",
+        name: "checkData",
+        type: "bool",
+      },
+      {
+        internalType: "address",
+        name: "emitter",
+        type: "address",
+      },
+    ],
+    name: "expectEmit",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "emitter",
+        type: "address",
+      },
+    ],
+    name: "expectEmit",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes4",
+        name: "revertData",
+        type: "bytes4",
+      },
+    ],
+    name: "expectRevert",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "revertData",
+        type: "bytes",
+      },
+    ],
+    name: "expectRevert",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "expectRevert",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint64",
+        name: "min",
+        type: "uint64",
+      },
+      {
+        internalType: "uint64",
+        name: "max",
+        type: "uint64",
+      },
+    ],
+    name: "expectSafeMemory",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint64",
+        name: "min",
+        type: "uint64",
+      },
+      {
+        internalType: "uint64",
+        name: "max",
+        type: "uint64",
+      },
+    ],
+    name: "expectSafeMemoryCall",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "newBasefee",
+        type: "uint256",
+      },
+    ],
+    name: "fee",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "commandInput",
+        type: "string[]",
+      },
+    ],
+    name: "ffi",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "result",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "fsMetadata",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "bool",
+            name: "isDir",
+            type: "bool",
+          },
+          {
+            internalType: "bool",
+            name: "isSymlink",
+            type: "bool",
+          },
+          {
+            internalType: "uint256",
+            name: "length",
+            type: "uint256",
+          },
+          {
+            internalType: "bool",
+            name: "readOnly",
+            type: "bool",
+          },
+          {
+            internalType: "uint256",
+            name: "modified",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "accessed",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "created",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.FsMetadata",
+        name: "metadata",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getBlobBaseFee",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "blobBaseFee",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getBlobhashes",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "hashes",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getBlockNumber",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "height",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getBlockTimestamp",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "timestamp",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "artifactPath",
+        type: "string",
+      },
+    ],
+    name: "getCode",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "creationBytecode",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "artifactPath",
+        type: "string",
+      },
+    ],
+    name: "getDeployedCode",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "runtimeBytecode",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "getLabel",
+    outputs: [
+      {
+        internalType: "string",
+        name: "currentLabel",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "elementSlot",
+        type: "bytes32",
+      },
+    ],
+    name: "getMappingKeyAndParentOf",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "found",
+        type: "bool",
+      },
+      {
+        internalType: "bytes32",
+        name: "key",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "parent",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "mappingSlot",
+        type: "bytes32",
+      },
+    ],
+    name: "getMappingLength",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "length",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "mappingSlot",
+        type: "bytes32",
+      },
+      {
+        internalType: "uint256",
+        name: "idx",
+        type: "uint256",
+      },
+    ],
+    name: "getMappingSlotAt",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "value",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "getNonce",
+    outputs: [
+      {
+        internalType: "uint64",
+        name: "nonce",
+        type: "uint64",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyX",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyY",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "privateKey",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.Wallet",
+        name: "wallet",
+        type: "tuple",
+      },
+    ],
+    name: "getNonce",
+    outputs: [
+      {
+        internalType: "uint64",
+        name: "nonce",
+        type: "uint64",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getRecordedLogs",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "bytes32[]",
+            name: "topics",
+            type: "bytes32[]",
+          },
+          {
+            internalType: "bytes",
+            name: "data",
+            type: "bytes",
+          },
+          {
+            internalType: "address",
+            name: "emitter",
+            type: "address",
+          },
+        ],
+        internalType: "struct VmSafe.Log[]",
+        name: "logs",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "indexOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "enum VmSafe.ForgeContext",
+        name: "context",
+        type: "uint8",
+      },
+    ],
+    name: "isContext",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "result",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "isDir",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "result",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "isFile",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "result",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "isPersistent",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "persistent",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "keyExists",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "keyExistsJson",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "keyExistsToml",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        internalType: "string",
+        name: "newLabel",
+        type: "string",
+      },
+    ],
+    name: "label",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "lastCallGas",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "uint64",
+            name: "gasLimit",
+            type: "uint64",
+          },
+          {
+            internalType: "uint64",
+            name: "gasTotalUsed",
+            type: "uint64",
+          },
+          {
+            internalType: "uint64",
+            name: "gasMemoryUsed",
+            type: "uint64",
+          },
+          {
+            internalType: "int64",
+            name: "gasRefunded",
+            type: "int64",
+          },
+          {
+            internalType: "uint64",
+            name: "gasRemaining",
+            type: "uint64",
+          },
+        ],
+        internalType: "struct VmSafe.Gas",
+        name: "gas",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "slot",
+        type: "bytes32",
+      },
+    ],
+    name: "load",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "data",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "pathToAllocsJson",
+        type: "string",
+      },
+    ],
+    name: "loadAllocs",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address[]",
+        name: "accounts",
+        type: "address[]",
+      },
+    ],
+    name: "makePersistent",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account0",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "account1",
+        type: "address",
+      },
+    ],
+    name: "makePersistent",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "makePersistent",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account0",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "account1",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "account2",
+        type: "address",
+      },
+    ],
+    name: "makePersistent",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "msgValue",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "returnData",
+        type: "bytes",
+      },
+    ],
+    name: "mockCall",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "returnData",
+        type: "bytes",
+      },
+    ],
+    name: "mockCall",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "msgValue",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "revertData",
+        type: "bytes",
+      },
+    ],
+    name: "mockCallRevert",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "callee",
+        type: "address",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+      {
+        internalType: "bytes",
+        name: "revertData",
+        type: "bytes",
+      },
+    ],
+    name: "mockCallRevert",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "parsedValue",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseBool",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "parsedValue",
+        type: "bool",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseBytes",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "parsedValue",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseBytes32",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "parsedValue",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseInt",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "parsedValue",
+        type: "int256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    name: "parseJson",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "abiEncodedData",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJson",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "abiEncodedData",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonAddressArray",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBool",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBoolArray",
+    outputs: [
+      {
+        internalType: "bool[]",
+        name: "",
+        type: "bool[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBytes",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBytes32",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBytes32Array",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonBytesArray",
+    outputs: [
+      {
+        internalType: "bytes[]",
+        name: "",
+        type: "bytes[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonInt",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonIntArray",
+    outputs: [
+      {
+        internalType: "int256[]",
+        name: "",
+        type: "int256[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonKeys",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "keys",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonStringArray",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonUint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseJsonUintArray",
+    outputs: [
+      {
+        internalType: "uint256[]",
+        name: "",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseToml",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "abiEncodedData",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+    ],
+    name: "parseToml",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "abiEncodedData",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlAddressArray",
+    outputs: [
+      {
+        internalType: "address[]",
+        name: "",
+        type: "address[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBool",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBoolArray",
+    outputs: [
+      {
+        internalType: "bool[]",
+        name: "",
+        type: "bool[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBytes",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBytes32",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBytes32Array",
+    outputs: [
+      {
+        internalType: "bytes32[]",
+        name: "",
+        type: "bytes32[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlBytesArray",
+    outputs: [
+      {
+        internalType: "bytes[]",
+        name: "",
+        type: "bytes[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlInt",
+    outputs: [
+      {
+        internalType: "int256",
+        name: "",
+        type: "int256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlIntArray",
+    outputs: [
+      {
+        internalType: "int256[]",
+        name: "",
+        type: "int256[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlKeys",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "keys",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlStringArray",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlUint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "toml",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "key",
+        type: "string",
+      },
+    ],
+    name: "parseTomlUintArray",
+    outputs: [
+      {
+        internalType: "uint256[]",
+        name: "",
+        type: "uint256[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    name: "parseUint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "parsedValue",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "pauseGasMetering",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "msgSender",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "txOrigin",
+        type: "address",
+      },
+    ],
+    name: "prank",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "msgSender",
+        type: "address",
+      },
+    ],
+    name: "prank",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "newPrevrandao",
+        type: "bytes32",
+      },
+    ],
+    name: "prevrandao",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "newPrevrandao",
+        type: "uint256",
+      },
+    ],
+    name: "prevrandao",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "projectRoot",
+    outputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "promptText",
+        type: "string",
+      },
+    ],
+    name: "prompt",
+    outputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "promptText",
+        type: "string",
+      },
+    ],
+    name: "promptAddress",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "promptText",
+        type: "string",
+      },
+    ],
+    name: "promptSecret",
+    outputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "promptText",
+        type: "string",
+      },
+    ],
+    name: "promptUint",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "readCallers",
+    outputs: [
+      {
+        internalType: "enum VmSafe.CallerMode",
+        name: "callerMode",
+        type: "uint8",
+      },
+      {
+        internalType: "address",
+        name: "msgSender",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "txOrigin",
+        type: "address",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "uint64",
+        name: "maxDepth",
+        type: "uint64",
+      },
+    ],
+    name: "readDir",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "string",
+            name: "errorMessage",
+            type: "string",
+          },
+          {
+            internalType: "string",
+            name: "path",
+            type: "string",
+          },
+          {
+            internalType: "uint64",
+            name: "depth",
+            type: "uint64",
+          },
+          {
+            internalType: "bool",
+            name: "isDir",
+            type: "bool",
+          },
+          {
+            internalType: "bool",
+            name: "isSymlink",
+            type: "bool",
+          },
+        ],
+        internalType: "struct VmSafe.DirEntry[]",
+        name: "entries",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "uint64",
+        name: "maxDepth",
+        type: "uint64",
+      },
+      {
+        internalType: "bool",
+        name: "followLinks",
+        type: "bool",
+      },
+    ],
+    name: "readDir",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "string",
+            name: "errorMessage",
+            type: "string",
+          },
+          {
+            internalType: "string",
+            name: "path",
+            type: "string",
+          },
+          {
+            internalType: "uint64",
+            name: "depth",
+            type: "uint64",
+          },
+          {
+            internalType: "bool",
+            name: "isDir",
+            type: "bool",
+          },
+          {
+            internalType: "bool",
+            name: "isSymlink",
+            type: "bool",
+          },
+        ],
+        internalType: "struct VmSafe.DirEntry[]",
+        name: "entries",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "readDir",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "string",
+            name: "errorMessage",
+            type: "string",
+          },
+          {
+            internalType: "string",
+            name: "path",
+            type: "string",
+          },
+          {
+            internalType: "uint64",
+            name: "depth",
+            type: "uint64",
+          },
+          {
+            internalType: "bool",
+            name: "isDir",
+            type: "bool",
+          },
+          {
+            internalType: "bool",
+            name: "isSymlink",
+            type: "bool",
+          },
+        ],
+        internalType: "struct VmSafe.DirEntry[]",
+        name: "entries",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "readFile",
+    outputs: [
+      {
+        internalType: "string",
+        name: "data",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "readFileBinary",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "readLine",
+    outputs: [
+      {
+        internalType: "string",
+        name: "line",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "linkPath",
+        type: "string",
+      },
+    ],
+    name: "readLink",
+    outputs: [
+      {
+        internalType: "string",
+        name: "targetPath",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "record",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "recordLogs",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    name: "rememberKey",
+    outputs: [
+      {
+        internalType: "address",
+        name: "keyAddr",
+        type: "address",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "bool",
+        name: "recursive",
+        type: "bool",
+      },
+    ],
+    name: "removeDir",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "removeFile",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "from",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "to",
+        type: "string",
+      },
+    ],
+    name: "replace",
+    outputs: [
+      {
+        internalType: "string",
+        name: "output",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "resetNonce",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "resumeGasMetering",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "snapshotId",
+        type: "uint256",
+      },
+    ],
+    name: "revertTo",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "success",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "snapshotId",
+        type: "uint256",
+      },
+    ],
+    name: "revertToAndDelete",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "success",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address[]",
+        name: "accounts",
+        type: "address[]",
+      },
+    ],
+    name: "revokePersistent",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "revokePersistent",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "newHeight",
+        type: "uint256",
+      },
+    ],
+    name: "roll",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "txHash",
+        type: "bytes32",
+      },
+    ],
+    name: "rollFork",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "forkId",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "blockNumber",
+        type: "uint256",
+      },
+    ],
+    name: "rollFork",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "blockNumber",
+        type: "uint256",
+      },
+    ],
+    name: "rollFork",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "forkId",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes32",
+        name: "txHash",
+        type: "bytes32",
+      },
+    ],
+    name: "rollFork",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "method",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "params",
+        type: "string",
+      },
+    ],
+    name: "rpc",
+    outputs: [
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "rpcAlias",
+        type: "string",
+      },
+    ],
+    name: "rpcUrl",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "rpcUrlStructs",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "string",
+            name: "key",
+            type: "string",
+          },
+          {
+            internalType: "string",
+            name: "url",
+            type: "string",
+          },
+        ],
+        internalType: "struct VmSafe.Rpc[]",
+        name: "urls",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "rpcUrls",
+    outputs: [
+      {
+        internalType: "string[2][]",
+        name: "urls",
+        type: "string[2][]",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "forkId",
+        type: "uint256",
+      },
+    ],
+    name: "selectFork",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "address[]",
+        name: "values",
+        type: "address[]",
+      },
+    ],
+    name: "serializeAddress",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "address",
+        name: "value",
+        type: "address",
+      },
+    ],
+    name: "serializeAddress",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bool[]",
+        name: "values",
+        type: "bool[]",
+      },
+    ],
+    name: "serializeBool",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bool",
+        name: "value",
+        type: "bool",
+      },
+    ],
+    name: "serializeBool",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bytes[]",
+        name: "values",
+        type: "bytes[]",
+      },
+    ],
+    name: "serializeBytes",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bytes",
+        name: "value",
+        type: "bytes",
+      },
+    ],
+    name: "serializeBytes",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bytes32[]",
+        name: "values",
+        type: "bytes32[]",
+      },
+    ],
+    name: "serializeBytes32",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "bytes32",
+        name: "value",
+        type: "bytes32",
+      },
+    ],
+    name: "serializeBytes32",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "int256",
+        name: "value",
+        type: "int256",
+      },
+    ],
+    name: "serializeInt",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "int256[]",
+        name: "values",
+        type: "int256[]",
+      },
+    ],
+    name: "serializeInt",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "value",
+        type: "string",
+      },
+    ],
+    name: "serializeJson",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "string[]",
+        name: "values",
+        type: "string[]",
+      },
+    ],
+    name: "serializeString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "value",
+        type: "string",
+      },
+    ],
+    name: "serializeString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "serializeUint",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "uint256[]",
+        name: "values",
+        type: "uint256[]",
+      },
+    ],
+    name: "serializeUint",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "objectKey",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "serializeUintToHex",
+    outputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "value",
+        type: "string",
+      },
+    ],
+    name: "setEnv",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        internalType: "uint64",
+        name: "newNonce",
+        type: "uint64",
+      },
+    ],
+    name: "setNonce",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+      {
+        internalType: "uint64",
+        name: "newNonce",
+        type: "uint64",
+      },
+    ],
+    name: "setNonceUnsafe",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "digest",
+        type: "bytes32",
+      },
+    ],
+    name: "sign",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "v",
+        type: "uint8",
+      },
+      {
+        internalType: "bytes32",
+        name: "r",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "signer",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "digest",
+        type: "bytes32",
+      },
+    ],
+    name: "sign",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "v",
+        type: "uint8",
+      },
+      {
+        internalType: "bytes32",
+        name: "r",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "addr",
+            type: "address",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyX",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "publicKeyY",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "privateKey",
+            type: "uint256",
+          },
+        ],
+        internalType: "struct VmSafe.Wallet",
+        name: "wallet",
+        type: "tuple",
+      },
+      {
+        internalType: "bytes32",
+        name: "digest",
+        type: "bytes32",
+      },
+    ],
+    name: "sign",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "v",
+        type: "uint8",
+      },
+      {
+        internalType: "bytes32",
+        name: "r",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes32",
+        name: "digest",
+        type: "bytes32",
+      },
+    ],
+    name: "sign",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "v",
+        type: "uint8",
+      },
+      {
+        internalType: "bytes32",
+        name: "r",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes32",
+        name: "digest",
+        type: "bytes32",
+      },
+    ],
+    name: "signP256",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "r",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "skipTest",
+        type: "bool",
+      },
+    ],
+    name: "skip",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "duration",
+        type: "uint256",
+      },
+    ],
+    name: "sleep",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "snapshot",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "snapshotId",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "delimiter",
+        type: "string",
+      },
+    ],
+    name: "split",
+    outputs: [
+      {
+        internalType: "string[]",
+        name: "outputs",
+        type: "string[]",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "startBroadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "signer",
+        type: "address",
+      },
+    ],
+    name: "startBroadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "privateKey",
+        type: "uint256",
+      },
+    ],
+    name: "startBroadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "startMappingRecording",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "msgSender",
+        type: "address",
+      },
+    ],
+    name: "startPrank",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "msgSender",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "txOrigin",
+        type: "address",
+      },
+    ],
+    name: "startPrank",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "startStateDiffRecording",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "stopAndReturnStateDiff",
+    outputs: [
+      {
+        components: [
+          {
+            components: [
+              {
+                internalType: "uint256",
+                name: "forkId",
+                type: "uint256",
+              },
+              {
+                internalType: "uint256",
+                name: "chainId",
+                type: "uint256",
+              },
+            ],
+            internalType: "struct VmSafe.ChainInfo",
+            name: "chainInfo",
+            type: "tuple",
+          },
+          {
+            internalType: "enum VmSafe.AccountAccessKind",
+            name: "kind",
+            type: "uint8",
+          },
+          {
+            internalType: "address",
+            name: "account",
+            type: "address",
+          },
+          {
+            internalType: "address",
+            name: "accessor",
+            type: "address",
+          },
+          {
+            internalType: "bool",
+            name: "initialized",
+            type: "bool",
+          },
+          {
+            internalType: "uint256",
+            name: "oldBalance",
+            type: "uint256",
+          },
+          {
+            internalType: "uint256",
+            name: "newBalance",
+            type: "uint256",
+          },
+          {
+            internalType: "bytes",
+            name: "deployedCode",
+            type: "bytes",
+          },
+          {
+            internalType: "uint256",
+            name: "value",
+            type: "uint256",
+          },
+          {
+            internalType: "bytes",
+            name: "data",
+            type: "bytes",
+          },
+          {
+            internalType: "bool",
+            name: "reverted",
+            type: "bool",
+          },
+          {
+            components: [
+              {
+                internalType: "address",
+                name: "account",
+                type: "address",
+              },
+              {
+                internalType: "bytes32",
+                name: "slot",
+                type: "bytes32",
+              },
+              {
+                internalType: "bool",
+                name: "isWrite",
+                type: "bool",
+              },
+              {
+                internalType: "bytes32",
+                name: "previousValue",
+                type: "bytes32",
+              },
+              {
+                internalType: "bytes32",
+                name: "newValue",
+                type: "bytes32",
+              },
+              {
+                internalType: "bool",
+                name: "reverted",
+                type: "bool",
+              },
+            ],
+            internalType: "struct VmSafe.StorageAccess[]",
+            name: "storageAccesses",
+            type: "tuple[]",
+          },
+          {
+            internalType: "uint64",
+            name: "depth",
+            type: "uint64",
+          },
+        ],
+        internalType: "struct VmSafe.AccountAccess[]",
+        name: "accountAccesses",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "stopBroadcast",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "stopExpectSafeMemory",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "stopMappingRecording",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "stopPrank",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "target",
+        type: "address",
+      },
+      {
+        internalType: "bytes32",
+        name: "slot",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "value",
+        type: "bytes32",
+      },
+    ],
+    name: "store",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "data",
+        type: "string",
+      },
+    ],
+    name: "toBase64",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "toBase64",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "data",
+        type: "string",
+      },
+    ],
+    name: "toBase64URL",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "toBase64URL",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+    ],
+    name: "toLowercase",
+    outputs: [
+      {
+        internalType: "string",
+        name: "output",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "value",
+        type: "address",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes",
+        name: "value",
+        type: "bytes",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "value",
+        type: "bool",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "int256",
+        name: "value",
+        type: "int256",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "value",
+        type: "bytes32",
+      },
+    ],
+    name: "toString",
+    outputs: [
+      {
+        internalType: "string",
+        name: "stringifiedValue",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+    ],
+    name: "toUppercase",
+    outputs: [
+      {
+        internalType: "string",
+        name: "output",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "forkId",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes32",
+        name: "txHash",
+        type: "bytes32",
+      },
+    ],
+    name: "transact",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes32",
+        name: "txHash",
+        type: "bytes32",
+      },
+    ],
+    name: "transact",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "input",
+        type: "string",
+      },
+    ],
+    name: "trim",
+    outputs: [
+      {
+        internalType: "string",
+        name: "output",
+        type: "string",
+      },
+    ],
+    stateMutability: "pure",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string[]",
+        name: "commandInput",
+        type: "string[]",
+      },
+    ],
+    name: "tryFfi",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "int32",
+            name: "exitCode",
+            type: "int32",
+          },
+          {
+            internalType: "bytes",
+            name: "stdout",
+            type: "bytes",
+          },
+          {
+            internalType: "bytes",
+            name: "stderr",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct VmSafe.FfiResult",
+        name: "result",
+        type: "tuple",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "newGasPrice",
+        type: "uint256",
+      },
+    ],
+    name: "txGasPrice",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "unixTime",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "milliseconds",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "newTimestamp",
+        type: "uint256",
+      },
+    ],
+    name: "warp",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "data",
+        type: "string",
+      },
+    ],
+    name: "writeFile",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "writeFileBinary",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+    ],
+    name: "writeJson",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "writeJson",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "data",
+        type: "string",
+      },
+    ],
+    name: "writeLine",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "valueKey",
+        type: "string",
+      },
+    ],
+    name: "writeToml",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "json",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "path",
+        type: "string",
+      },
+    ],
+    name: "writeToml",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class Vm__factory {
+  static readonly abi = _abi;
+  static createInterface(): VmInterface {
+    return new Interface(_abi) as VmInterface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): Vm {
+    return new Contract(address, _abi, runner) as unknown as Vm;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Vm.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Vm.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fcea6ed4e9195eb8ef48c0ad3b5fd67a3d94434d
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/Vm.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { Vm__factory } from "./Vm__factory";
+export { VmSafe__factory } from "./VmSafe__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/index.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cfff7dbdccfb6d6816e6498ee119ccea944bdbb9
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/index.ts
@@ -0,0 +1,11 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as stdErrorSol from "./StdError.sol";
+export * as stdStorageSol from "./StdStorage.sol";
+export * as vmSol from "./Vm.sol";
+export * as interfaces from "./interfaces";
+export * as mocks from "./mocks";
+export { StdAssertions__factory } from "./StdAssertions__factory";
+export { StdInvariant__factory } from "./StdInvariant__factory";
+export { Test__factory } from "./Test__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC165__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC165__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6dfe69a72a8bad63cbb563bec7212cd0aede9155
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC165__factory.ts
@@ -0,0 +1,41 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC165,
+  IERC165Interface,
+} from "../../../../../lib/forge-std/src/interfaces/IERC165";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "bytes4",
+        name: "interfaceID",
+        type: "bytes4",
+      },
+    ],
+    name: "supportsInterface",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+] as const;
+
+export class IERC165__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC165Interface {
+    return new Interface(_abi) as IERC165Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IERC165 {
+    return new Contract(address, _abi, runner) as unknown as IERC165;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC20__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC20__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0df65e3795af8bca81e956ad074c8c7745a13170
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC20__factory.ts
@@ -0,0 +1,244 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC20,
+  IERC20Interface,
+} from "../../../../../lib/forge-std/src/interfaces/IERC20";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "allowance",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "account",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "decimals",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "",
+        type: "uint8",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "name",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "symbol",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "totalSupply",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "transfer",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IERC20__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC20Interface {
+    return new Interface(_abi) as IERC20Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IERC20 {
+    return new Contract(address, _abi, runner) as unknown as IERC20;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721Enumerable__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721Enumerable__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..708bd6de4e2b3937de19521c923620be55355f79
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721Enumerable__factory.ts
@@ -0,0 +1,366 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC721Enumerable,
+  IERC721EnumerableInterface,
+} from "../../../../../../lib/forge-std/src/interfaces/IERC721.sol/IERC721Enumerable";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_approved",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_operator",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "bool",
+        name: "_approved",
+        type: "bool",
+      },
+    ],
+    name: "ApprovalForAll",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_approved",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "getApproved",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_operator",
+        type: "address",
+      },
+    ],
+    name: "isApprovedForAll",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "ownerOf",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "safeTransferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "safeTransferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_operator",
+        type: "address",
+      },
+      {
+        internalType: "bool",
+        name: "_approved",
+        type: "bool",
+      },
+    ],
+    name: "setApprovalForAll",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes4",
+        name: "interfaceID",
+        type: "bytes4",
+      },
+    ],
+    name: "supportsInterface",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_index",
+        type: "uint256",
+      },
+    ],
+    name: "tokenByIndex",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_index",
+        type: "uint256",
+      },
+    ],
+    name: "tokenOfOwnerByIndex",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "totalSupply",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+] as const;
+
+export class IERC721Enumerable__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC721EnumerableInterface {
+    return new Interface(_abi) as IERC721EnumerableInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IERC721Enumerable {
+    return new Contract(address, _abi, runner) as unknown as IERC721Enumerable;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721Metadata__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721Metadata__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..88fb6a38ba22ea5813b3b7b236d8ac7b70f7d932
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721Metadata__factory.ts
@@ -0,0 +1,355 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC721Metadata,
+  IERC721MetadataInterface,
+} from "../../../../../../lib/forge-std/src/interfaces/IERC721.sol/IERC721Metadata";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_approved",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_operator",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "bool",
+        name: "_approved",
+        type: "bool",
+      },
+    ],
+    name: "ApprovalForAll",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_approved",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "getApproved",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_operator",
+        type: "address",
+      },
+    ],
+    name: "isApprovedForAll",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "name",
+    outputs: [
+      {
+        internalType: "string",
+        name: "_name",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "ownerOf",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "safeTransferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "safeTransferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_operator",
+        type: "address",
+      },
+      {
+        internalType: "bool",
+        name: "_approved",
+        type: "bool",
+      },
+    ],
+    name: "setApprovalForAll",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes4",
+        name: "interfaceID",
+        type: "bytes4",
+      },
+    ],
+    name: "supportsInterface",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "symbol",
+    outputs: [
+      {
+        internalType: "string",
+        name: "_symbol",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "tokenURI",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+] as const;
+
+export class IERC721Metadata__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC721MetadataInterface {
+    return new Interface(_abi) as IERC721MetadataInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IERC721Metadata {
+    return new Contract(address, _abi, runner) as unknown as IERC721Metadata;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721TokenReceiver__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721TokenReceiver__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..706f4f311b42d99d00ce6e40ac342fd1a3911664
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721TokenReceiver__factory.ts
@@ -0,0 +1,63 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC721TokenReceiver,
+  IERC721TokenReceiverInterface,
+} from "../../../../../../lib/forge-std/src/interfaces/IERC721.sol/IERC721TokenReceiver";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_operator",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "_data",
+        type: "bytes",
+      },
+    ],
+    name: "onERC721Received",
+    outputs: [
+      {
+        internalType: "bytes4",
+        name: "",
+        type: "bytes4",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IERC721TokenReceiver__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC721TokenReceiverInterface {
+    return new Interface(_abi) as IERC721TokenReceiverInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IERC721TokenReceiver {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as IERC721TokenReceiver;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..084afa0f5f970cd2cbafdf07dd36c29dee7dd76c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/IERC721__factory.ts
@@ -0,0 +1,307 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC721,
+  IERC721Interface,
+} from "../../../../../../lib/forge-std/src/interfaces/IERC721.sol/IERC721";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_approved",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_operator",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "bool",
+        name: "_approved",
+        type: "bool",
+      },
+    ],
+    name: "ApprovalForAll",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_approved",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "getApproved",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_operator",
+        type: "address",
+      },
+    ],
+    name: "isApprovedForAll",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "ownerOf",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "safeTransferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "safeTransferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_operator",
+        type: "address",
+      },
+      {
+        internalType: "bool",
+        name: "_approved",
+        type: "bool",
+      },
+    ],
+    name: "setApprovalForAll",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes4",
+        name: "interfaceID",
+        type: "bytes4",
+      },
+    ],
+    name: "supportsInterface",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+] as const;
+
+export class IERC721__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC721Interface {
+    return new Interface(_abi) as IERC721Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IERC721 {
+    return new Contract(address, _abi, runner) as unknown as IERC721;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..93147b212bc69e7e7f856c0dfa04f52710c17748
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IERC721.sol/index.ts
@@ -0,0 +1,7 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { IERC721__factory } from "./IERC721__factory";
+export { IERC721Enumerable__factory } from "./IERC721Enumerable__factory";
+export { IERC721Metadata__factory } from "./IERC721Metadata__factory";
+export { IERC721TokenReceiver__factory } from "./IERC721TokenReceiver__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IMulticall3__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IMulticall3__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c9c83ce41ea53b04627da7be161f34b8aa160e90
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/IMulticall3__factory.ts
@@ -0,0 +1,460 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IMulticall3,
+  IMulticall3Interface,
+} from "../../../../../lib/forge-std/src/interfaces/IMulticall3";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "target",
+            type: "address",
+          },
+          {
+            internalType: "bytes",
+            name: "callData",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct IMulticall3.Call[]",
+        name: "calls",
+        type: "tuple[]",
+      },
+    ],
+    name: "aggregate",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "blockNumber",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes[]",
+        name: "returnData",
+        type: "bytes[]",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "target",
+            type: "address",
+          },
+          {
+            internalType: "bool",
+            name: "allowFailure",
+            type: "bool",
+          },
+          {
+            internalType: "bytes",
+            name: "callData",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct IMulticall3.Call3[]",
+        name: "calls",
+        type: "tuple[]",
+      },
+    ],
+    name: "aggregate3",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "bool",
+            name: "success",
+            type: "bool",
+          },
+          {
+            internalType: "bytes",
+            name: "returnData",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct IMulticall3.Result[]",
+        name: "returnData",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "target",
+            type: "address",
+          },
+          {
+            internalType: "bool",
+            name: "allowFailure",
+            type: "bool",
+          },
+          {
+            internalType: "uint256",
+            name: "value",
+            type: "uint256",
+          },
+          {
+            internalType: "bytes",
+            name: "callData",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct IMulticall3.Call3Value[]",
+        name: "calls",
+        type: "tuple[]",
+      },
+    ],
+    name: "aggregate3Value",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "bool",
+            name: "success",
+            type: "bool",
+          },
+          {
+            internalType: "bytes",
+            name: "returnData",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct IMulticall3.Result[]",
+        name: "returnData",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "target",
+            type: "address",
+          },
+          {
+            internalType: "bytes",
+            name: "callData",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct IMulticall3.Call[]",
+        name: "calls",
+        type: "tuple[]",
+      },
+    ],
+    name: "blockAndAggregate",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "blockNumber",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes32",
+        name: "blockHash",
+        type: "bytes32",
+      },
+      {
+        components: [
+          {
+            internalType: "bool",
+            name: "success",
+            type: "bool",
+          },
+          {
+            internalType: "bytes",
+            name: "returnData",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct IMulticall3.Result[]",
+        name: "returnData",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getBasefee",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "basefee",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "blockNumber",
+        type: "uint256",
+      },
+    ],
+    name: "getBlockHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "blockHash",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getBlockNumber",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "blockNumber",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getChainId",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "chainid",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getCurrentBlockCoinbase",
+    outputs: [
+      {
+        internalType: "address",
+        name: "coinbase",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getCurrentBlockDifficulty",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "difficulty",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getCurrentBlockGasLimit",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "gaslimit",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getCurrentBlockTimestamp",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "timestamp",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "addr",
+        type: "address",
+      },
+    ],
+    name: "getEthBalance",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "balance",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "getLastBlockHash",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "blockHash",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "requireSuccess",
+        type: "bool",
+      },
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "target",
+            type: "address",
+          },
+          {
+            internalType: "bytes",
+            name: "callData",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct IMulticall3.Call[]",
+        name: "calls",
+        type: "tuple[]",
+      },
+    ],
+    name: "tryAggregate",
+    outputs: [
+      {
+        components: [
+          {
+            internalType: "bool",
+            name: "success",
+            type: "bool",
+          },
+          {
+            internalType: "bytes",
+            name: "returnData",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct IMulticall3.Result[]",
+        name: "returnData",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bool",
+        name: "requireSuccess",
+        type: "bool",
+      },
+      {
+        components: [
+          {
+            internalType: "address",
+            name: "target",
+            type: "address",
+          },
+          {
+            internalType: "bytes",
+            name: "callData",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct IMulticall3.Call[]",
+        name: "calls",
+        type: "tuple[]",
+      },
+    ],
+    name: "tryBlockAndAggregate",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "blockNumber",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes32",
+        name: "blockHash",
+        type: "bytes32",
+      },
+      {
+        components: [
+          {
+            internalType: "bool",
+            name: "success",
+            type: "bool",
+          },
+          {
+            internalType: "bytes",
+            name: "returnData",
+            type: "bytes",
+          },
+        ],
+        internalType: "struct IMulticall3.Result[]",
+        name: "returnData",
+        type: "tuple[]",
+      },
+    ],
+    stateMutability: "payable",
+    type: "function",
+  },
+] as const;
+
+export class IMulticall3__factory {
+  static readonly abi = _abi;
+  static createInterface(): IMulticall3Interface {
+    return new Interface(_abi) as IMulticall3Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): IMulticall3 {
+    return new Contract(address, _abi, runner) as unknown as IMulticall3;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/index.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..174beea6b3cea55e0c5520c3d27bb962d728b36b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/interfaces/index.ts
@@ -0,0 +1,7 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as ierc721Sol from "./IERC721.sol";
+export { IERC165__factory } from "./IERC165__factory";
+export { IERC20__factory } from "./IERC20__factory";
+export { IMulticall3__factory } from "./IMulticall3__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC20__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC20__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6e2ec66ad409c5c4ab8f9dac5e63223910926726
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC20__factory.ts
@@ -0,0 +1,384 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../common";
+import type {
+  MockERC20,
+  MockERC20Interface,
+} from "../../../../../lib/forge-std/src/mocks/MockERC20";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [],
+    name: "DOMAIN_SEPARATOR",
+    outputs: [
+      {
+        internalType: "bytes32",
+        name: "",
+        type: "bytes32",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+    ],
+    name: "allowance",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "decimals",
+    outputs: [
+      {
+        internalType: "uint8",
+        name: "",
+        type: "uint8",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name_",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "symbol_",
+        type: "string",
+      },
+      {
+        internalType: "uint8",
+        name: "decimals_",
+        type: "uint8",
+      },
+    ],
+    name: "initialize",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "name",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    name: "nonces",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "value",
+        type: "uint256",
+      },
+      {
+        internalType: "uint256",
+        name: "deadline",
+        type: "uint256",
+      },
+      {
+        internalType: "uint8",
+        name: "v",
+        type: "uint8",
+      },
+      {
+        internalType: "bytes32",
+        name: "r",
+        type: "bytes32",
+      },
+      {
+        internalType: "bytes32",
+        name: "s",
+        type: "bytes32",
+      },
+    ],
+    name: "permit",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "symbol",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "totalSupply",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "transfer",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "amount",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x608060405234801561000f575f80fd5b506110178061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106100da575f3560e01c80633644e5151161008857806395d89b411161006357806395d89b41146101ca578063a9059cbb146101d2578063d505accf146101e5578063dd62ed3e146101f8575f80fd5b80633644e5151461016e57806370a08231146101765780637ecebe00146101ab575f80fd5b806318160ddd116100b857806318160ddd1461013457806323b872dd14610146578063313ce56714610159575f80fd5b806306fdde03146100de578063095ea7b3146100fc5780631624f6c61461011f575b5f80fd5b6100e661023d565b6040516100f39190610aee565b60405180910390f35b61010f61010a366004610b62565b6102cc565b60405190151581526020016100f3565b61013261012d366004610c50565b610345565b005b6003545b6040519081526020016100f3565b61010f610154366004610cbf565b610407565b60025460405160ff90911681526020016100f3565b610138610557565b610138610184366004610cf8565b73ffffffffffffffffffffffffffffffffffffffff165f9081526004602052604090205490565b6101386101b9366004610cf8565b60086020525f908152604090205481565b6100e661057c565b61010f6101e0366004610b62565b61058b565b6101326101f3366004610d11565b610639565b610138610206366004610d76565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260056020908152604080832093909416825291909152205490565b60605f805461024b90610da7565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610da7565b80156102c25780601f10610299576101008083540402835291602001916102c2565b820191905f5260205f20905b8154815290600101906020018083116102a557829003601f168201915b5050505050905090565b335f81815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103339086815260200190565b60405180910390a35060015b92915050565b60095460ff16156103b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f414c52454144595f494e495449414c495a45440000000000000000000000000060448201526064015b60405180910390fd5b5f6103c28482610e44565b5060016103cf8382610e44565b506002805460ff191660ff83161790556103e761093d565b6006556103f2610955565b60075550506009805460ff1916600117905550565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526005602090815260408083203384529091528120545f19811461047a5761044981846109f6565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526005602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f908152600460205260409020546104a990846109f6565b73ffffffffffffffffffffffffffffffffffffffff8087165f9081526004602052604080822093909355908616815220546104e49084610a72565b73ffffffffffffffffffffffffffffffffffffffff8086165f8181526004602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906105449087815260200190565b60405180910390a3506001949350505050565b5f60065461056361093d565b1461057557610570610955565b905090565b5060075490565b60606001805461024b90610da7565b335f908152600460205260408120546105a490836109f6565b335f908152600460205260408082209290925573ffffffffffffffffffffffffffffffffffffffff8516815220546105dc9083610a72565b73ffffffffffffffffffffffffffffffffffffffff84165f818152600460205260409081902092909255905133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103339086815260200190565b428410156106a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016103ae565b5f60016106ae610557565b73ffffffffffffffffffffffffffffffffffffffff8a165f90815260086020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d9290919061070883610f31565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810188905260e001604051602081830303815290604052805190602001206040516020016107a99291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610804573d5f803e3d5ffd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061086157508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6108c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016103ae565b73ffffffffffffffffffffffffffffffffffffffff8181165f9081526005602090815260408083208b8516808552908352928190208a90555189815291928b16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050505050505050565b5f610aea8061094e63ffffffff8216565b9250505090565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516109859190610f49565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66109b661093d565b604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f81831015610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45524332303a207375627472616374696f6e20756e646572666c6f770000000060448201526064016103ae565b610a6b8284610fbb565b9392505050565b5f80610a7e8385610fce565b905083811015610a6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45524332303a206164646974696f6e206f766572666c6f77000000000000000060448201526064016103ae565b4690565b5f602080835283518060208501525f5b81811015610b1a57858101830151858201604001528201610afe565b505f604082860101526040601f19601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b5d575f80fd5b919050565b5f8060408385031215610b73575f80fd5b610b7c83610b3a565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610bc6575f80fd5b813567ffffffffffffffff80821115610be157610be1610b8a565b604051601f8301601f19908116603f01168101908282118183101715610c0957610c09610b8a565b81604052838152866020858801011115610c21575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803560ff81168114610b5d575f80fd5b5f805f60608486031215610c62575f80fd5b833567ffffffffffffffff80821115610c79575f80fd5b610c8587838801610bb7565b94506020860135915080821115610c9a575f80fd5b50610ca786828701610bb7565b925050610cb660408501610c40565b90509250925092565b5f805f60608486031215610cd1575f80fd5b610cda84610b3a565b9250610ce860208501610b3a565b9150604084013590509250925092565b5f60208284031215610d08575f80fd5b610a6b82610b3a565b5f805f805f805f60e0888a031215610d27575f80fd5b610d3088610b3a565b9650610d3e60208901610b3a565b95506040880135945060608801359350610d5a60808901610c40565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215610d87575f80fd5b610d9083610b3a565b9150610d9e60208401610b3a565b90509250929050565b600181811c90821680610dbb57607f821691505b602082108103610df2577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610e3f57805f5260205f20601f840160051c81016020851015610e1d5750805b601f840160051c820191505b81811015610e3c575f8155600101610e29565b50505b505050565b815167ffffffffffffffff811115610e5e57610e5e610b8a565b610e7281610e6c8454610da7565b84610df8565b602080601f831160018114610ea5575f8415610e8e5750858301515b5f19600386901b1c1916600185901b178555610efc565b5f85815260208120601f198616915b82811015610ed357888601518255948401946001909101908401610eb4565b5085821015610ef057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f198203610f4257610f42610f04565b5060010190565b5f808354610f5681610da7565b60018281168015610f6e5760018114610f8357610faf565b60ff1984168752821515830287019450610faf565b875f526020805f205f5b85811015610fa65781548a820152908401908201610f8d565b50505082870194505b50929695505050505050565b8181038181111561033f5761033f610f04565b8082018082111561033f5761033f610f0456fea264697066735822122092ea695821e2bee077a8696a287c91b3c2d4c786cf60f06f67fc880619f8706664736f6c63430008180033";
+
+type MockERC20ConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: MockERC20ConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class MockERC20__factory extends ContractFactory {
+  constructor(...args: MockERC20ConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      MockERC20 & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): MockERC20__factory {
+    return super.connect(runner) as MockERC20__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): MockERC20Interface {
+    return new Interface(_abi) as MockERC20Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): MockERC20 {
+    return new Contract(address, _abi, runner) as unknown as MockERC20;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC721.sol/IERC721TokenReceiver__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC721.sol/IERC721TokenReceiver__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8f8462514baabab933efcd2d56f31e401f62519b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC721.sol/IERC721TokenReceiver__factory.ts
@@ -0,0 +1,63 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { Contract, Interface, type ContractRunner } from "ethers";
+import type {
+  IERC721TokenReceiver,
+  IERC721TokenReceiverInterface,
+} from "../../../../../../lib/forge-std/src/mocks/MockERC721.sol/IERC721TokenReceiver";
+
+const _abi = [
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "",
+        type: "bytes",
+      },
+    ],
+    name: "onERC721Received",
+    outputs: [
+      {
+        internalType: "bytes4",
+        name: "",
+        type: "bytes4",
+      },
+    ],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+] as const;
+
+export class IERC721TokenReceiver__factory {
+  static readonly abi = _abi;
+  static createInterface(): IERC721TokenReceiverInterface {
+    return new Interface(_abi) as IERC721TokenReceiverInterface;
+  }
+  static connect(
+    address: string,
+    runner?: ContractRunner | null
+  ): IERC721TokenReceiver {
+    return new Contract(
+      address,
+      _abi,
+      runner
+    ) as unknown as IERC721TokenReceiver;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC721.sol/MockERC721__factory.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC721.sol/MockERC721__factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e16a12a8809c714462882c6b42204560d9edc595
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC721.sol/MockERC721__factory.ts
@@ -0,0 +1,412 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import {
+  Contract,
+  ContractFactory,
+  ContractTransactionResponse,
+  Interface,
+} from "ethers";
+import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers";
+import type { NonPayableOverrides } from "../../../../../../common";
+import type {
+  MockERC721,
+  MockERC721Interface,
+} from "../../../../../../lib/forge-std/src/mocks/MockERC721.sol/MockERC721";
+
+const _abi = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_approved",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "Approval",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_owner",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_operator",
+        type: "address",
+      },
+      {
+        indexed: false,
+        internalType: "bool",
+        name: "_approved",
+        type: "bool",
+      },
+    ],
+    name: "ApprovalForAll",
+    type: "event",
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_from",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "address",
+        name: "_to",
+        type: "address",
+      },
+      {
+        indexed: true,
+        internalType: "uint256",
+        name: "_tokenId",
+        type: "uint256",
+      },
+    ],
+    name: "Transfer",
+    type: "event",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "spender",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "id",
+        type: "uint256",
+      },
+    ],
+    name: "approve",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+    ],
+    name: "balanceOf",
+    outputs: [
+      {
+        internalType: "uint256",
+        name: "",
+        type: "uint256",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "id",
+        type: "uint256",
+      },
+    ],
+    name: "getApproved",
+    outputs: [
+      {
+        internalType: "address",
+        name: "",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "string",
+        name: "name_",
+        type: "string",
+      },
+      {
+        internalType: "string",
+        name: "symbol_",
+        type: "string",
+      },
+    ],
+    name: "initialize",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "operator",
+        type: "address",
+      },
+    ],
+    name: "isApprovedForAll",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "name",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "id",
+        type: "uint256",
+      },
+    ],
+    name: "ownerOf",
+    outputs: [
+      {
+        internalType: "address",
+        name: "owner",
+        type: "address",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "id",
+        type: "uint256",
+      },
+    ],
+    name: "safeTransferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "id",
+        type: "uint256",
+      },
+      {
+        internalType: "bytes",
+        name: "data",
+        type: "bytes",
+      },
+    ],
+    name: "safeTransferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "operator",
+        type: "address",
+      },
+      {
+        internalType: "bool",
+        name: "approved",
+        type: "bool",
+      },
+    ],
+    name: "setApprovalForAll",
+    outputs: [],
+    stateMutability: "nonpayable",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "bytes4",
+        name: "interfaceId",
+        type: "bytes4",
+      },
+    ],
+    name: "supportsInterface",
+    outputs: [
+      {
+        internalType: "bool",
+        name: "",
+        type: "bool",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [],
+    name: "symbol",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "uint256",
+        name: "id",
+        type: "uint256",
+      },
+    ],
+    name: "tokenURI",
+    outputs: [
+      {
+        internalType: "string",
+        name: "",
+        type: "string",
+      },
+    ],
+    stateMutability: "view",
+    type: "function",
+  },
+  {
+    inputs: [
+      {
+        internalType: "address",
+        name: "from",
+        type: "address",
+      },
+      {
+        internalType: "address",
+        name: "to",
+        type: "address",
+      },
+      {
+        internalType: "uint256",
+        name: "id",
+        type: "uint256",
+      },
+    ],
+    name: "transferFrom",
+    outputs: [],
+    stateMutability: "payable",
+    type: "function",
+  },
+] as const;
+
+const _bytecode =
+  "0x608060405234801561000f575f80fd5b506112838061001d5f395ff3fe6080604052600436106100d9575f3560e01c80636352211e1161007c578063a22cb46511610057578063a22cb46514610252578063b88d4fde14610271578063c87b56dd14610284578063e985e9c5146102a4575f80fd5b80636352211e146101f257806370a082311461021157806395d89b411461023e575f80fd5b8063095ea7b3116100b7578063095ea7b31461019857806323b872dd146101ad57806342842e0e146101c05780634cd88b76146101d3575f80fd5b806301ffc9a7146100dd57806306fdde0314610111578063081812fc14610132575b5f80fd5b3480156100e8575f80fd5b506100fc6100f7366004610d0a565b6102f8565b60405190151581526020015b60405180910390f35b34801561011c575f80fd5b506101256103dc565b6040516101089190610d6f565b34801561013d575f80fd5b5061017361014c366004610d81565b5f9081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610108565b6101ab6101a6366004610dbb565b61046b565b005b6101ab6101bb366004610de3565b61059d565b6101ab6101ce366004610de3565b61083e565b3480156101de575f80fd5b506101ab6101ed366004610eda565b610974565b3480156101fd575f80fd5b5061017361020c366004610d81565b610a0f565b34801561021c575f80fd5b5061023061022b366004610f3a565b610a85565b604051908152602001610108565b348015610249575f80fd5b50610125610b11565b34801561025d575f80fd5b506101ab61026c366004610f53565b610b20565b6101ab61027f366004610f8c565b610bb6565b34801561028f575f80fd5b5061012561029e366004610d81565b50606090565b3480156102af575f80fd5b506100fc6102be366004611003565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260056020908152604080832093909416825291909152205460ff1690565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061038a57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806103d657507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60605f80546103ea90611034565b80601f016020809104026020016040519081016040528092919081815260200182805461041690611034565b80156104615780601f1061043857610100808354040283529160200191610461565b820191905f5260205f20905b81548152906001019060200180831161044457829003601f168201915b5050505050905090565b5f8181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16338114806104cc575073ffffffffffffffffffffffffffffffffffffffff81165f90815260056020908152604080832033845290915290205460ff165b61051d5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b5f8281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b5f8181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff8481169116146106125760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610514565b73ffffffffffffffffffffffffffffffffffffffff82166106755760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610514565b3373ffffffffffffffffffffffffffffffffffffffff841614806106c8575073ffffffffffffffffffffffffffffffffffffffff83165f90815260056020908152604080832033845290915290205460ff165b806106f557505f8181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b6107415760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610514565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600360205260408120805491610771836110b2565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f9081526003602052604081208054916107a6836110c7565b90915550505f818152600260209081526040808320805473ffffffffffffffffffffffffffffffffffffffff8088167fffffffffffffffffffffffff000000000000000000000000000000000000000092831681179093556004909452828520805490911690559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61084983838361059d565b813b158061092357506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af11580156108db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ff91906110df565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b61096f5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610514565b505050565b60065460ff16156109c75760405162461bcd60e51b815260206004820152601360248201527f414c52454144595f494e495449414c495a4544000000000000000000000000006044820152606401610514565b5f6109d28382611145565b5060016109df8282611145565b5050600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b5f8181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610a805760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f4d494e544544000000000000000000000000000000000000000000006044820152606401610514565b919050565b5f73ffffffffffffffffffffffffffffffffffffffff8216610ae95760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610514565b5073ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b6060600180546103ea90611034565b335f81815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610bc184848461059d565b823b1580610c8857506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290610c24903390899088908890600401611205565b6020604051808303815f875af1158015610c40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6491906110df565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610cd45760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610514565b50505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610d07575f80fd5b50565b5f60208284031215610d1a575f80fd5b8135610d2581610cda565b9392505050565b5f81518084525f5b81811015610d5057602081850181015186830182015201610d34565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610d256020830184610d2c565b5f60208284031215610d91575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a80575f80fd5b5f8060408385031215610dcc575f80fd5b610dd583610d98565b946020939093013593505050565b5f805f60608486031215610df5575f80fd5b610dfe84610d98565b9250610e0c60208501610d98565b9150604084013590509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f67ffffffffffffffff80841115610e6357610e63610e1c565b604051601f8501601f19908116603f01168101908282118183101715610e8b57610e8b610e1c565b81604052809350858152868686011115610ea3575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f830112610ecb575f80fd5b610d2583833560208501610e49565b5f8060408385031215610eeb575f80fd5b823567ffffffffffffffff80821115610f02575f80fd5b610f0e86838701610ebc565b93506020850135915080821115610f23575f80fd5b50610f3085828601610ebc565b9150509250929050565b5f60208284031215610f4a575f80fd5b610d2582610d98565b5f8060408385031215610f64575f80fd5b610f6d83610d98565b915060208301358015158114610f81575f80fd5b809150509250929050565b5f805f8060808587031215610f9f575f80fd5b610fa885610d98565b9350610fb660208601610d98565b925060408501359150606085013567ffffffffffffffff811115610fd8575f80fd5b8501601f81018713610fe8575f80fd5b610ff787823560208401610e49565b91505092959194509250565b5f8060408385031215611014575f80fd5b61101d83610d98565b915061102b60208401610d98565b90509250929050565b600181811c9082168061104857607f821691505b60208210810361107f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f816110c0576110c0611085565b505f190190565b5f5f1982036110d8576110d8611085565b5060010190565b5f602082840312156110ef575f80fd5b8151610d2581610cda565b601f82111561096f57805f5260205f20601f840160051c8101602085101561111f5750805b601f840160051c820191505b8181101561113e575f815560010161112b565b5050505050565b815167ffffffffffffffff81111561115f5761115f610e1c565b6111738161116d8454611034565b846110fa565b602080601f8311600181146111a6575f841561118f5750858301515b5f19600386901b1c1916600185901b1785556111fd565b5f85815260208120601f198616915b828110156111d4578886015182559484019460019091019084016111b5565b50858210156111f157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526112436080830184610d2c565b969550505050505056fea26469706673582212206ae315bcdd6f12fae6696f65a3302de8a82d65a42f994b7d727d778bac40eb1764736f6c63430008180033";
+
+type MockERC721ConstructorParams =
+  | [signer?: Signer]
+  | ConstructorParameters<typeof ContractFactory>;
+
+const isSuperArgs = (
+  xs: MockERC721ConstructorParams
+): xs is ConstructorParameters<typeof ContractFactory> => xs.length > 1;
+
+export class MockERC721__factory extends ContractFactory {
+  constructor(...args: MockERC721ConstructorParams) {
+    if (isSuperArgs(args)) {
+      super(...args);
+    } else {
+      super(_abi, _bytecode, args[0]);
+    }
+  }
+
+  override getDeployTransaction(
+    overrides?: NonPayableOverrides & { from?: string }
+  ): Promise<ContractDeployTransaction> {
+    return super.getDeployTransaction(overrides || {});
+  }
+  override deploy(overrides?: NonPayableOverrides & { from?: string }) {
+    return super.deploy(overrides || {}) as Promise<
+      MockERC721 & {
+        deploymentTransaction(): ContractTransactionResponse;
+      }
+    >;
+  }
+  override connect(runner: ContractRunner | null): MockERC721__factory {
+    return super.connect(runner) as MockERC721__factory;
+  }
+
+  static readonly bytecode = _bytecode;
+  static readonly abi = _abi;
+  static createInterface(): MockERC721Interface {
+    return new Interface(_abi) as MockERC721Interface;
+  }
+  static connect(address: string, runner?: ContractRunner | null): MockERC721 {
+    return new Contract(address, _abi, runner) as unknown as MockERC721;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC721.sol/index.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC721.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..72282e479164d829959d465771e71eb6395380ca
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/MockERC721.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export { IERC721TokenReceiver__factory } from "./IERC721TokenReceiver__factory";
+export { MockERC721__factory } from "./MockERC721__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/index.ts b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fa0577ae918f45a1b55712b568e9fae52fec23c8
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/forge-std/src/mocks/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as mockErc721Sol from "./MockERC721.sol";
+export { MockERC20__factory } from "./MockERC20__factory";
diff --git a/momiji-helpers/utils/typechain-types/factories/lib/index.ts b/momiji-helpers/utils/typechain-types/factories/lib/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..43ec266dac860d403ae477aafa7b28c8b78872c8
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/factories/lib/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export * as forgeStd from "./forge-std";
diff --git a/momiji-helpers/utils/typechain-types/hardhat.d.ts b/momiji-helpers/utils/typechain-types/hardhat.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bf78b28373619b1ed751b1750a60a4652bdc2a36
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/hardhat.d.ts
@@ -0,0 +1,873 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+
+import { ethers } from "ethers";
+import {
+  DeployContractOptions,
+  FactoryOptions,
+  HardhatEthersHelpers as HardhatEthersHelpersBase,
+} from "@nomicfoundation/hardhat-ethers/types";
+
+import * as Contracts from ".";
+
+declare module "hardhat/types/runtime" {
+  interface HardhatEthersHelpers extends HardhatEthersHelpersBase {
+    getContractFactory(
+      name: "AggregatorInterface",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.AggregatorInterface__factory>;
+    getContractFactory(
+      name: "AggregatorV2V3Interface",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.AggregatorV2V3Interface__factory>;
+    getContractFactory(
+      name: "AggregatorV3Interface",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.AggregatorV3Interface__factory>;
+    getContractFactory(
+      name: "OwnableUpgradeable",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.OwnableUpgradeable__factory>;
+    getContractFactory(
+      name: "Initializable",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.Initializable__factory>;
+    getContractFactory(
+      name: "UUPSUpgradeable",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.UUPSUpgradeable__factory>;
+    getContractFactory(
+      name: "ContextUpgradeable",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.ContextUpgradeable__factory>;
+    getContractFactory(
+      name: "EIP712Upgradeable",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.EIP712Upgradeable__factory>;
+    getContractFactory(
+      name: "PausableUpgradeable",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.PausableUpgradeable__factory>;
+    getContractFactory(
+      name: "AccessControl",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.AccessControl__factory>;
+    getContractFactory(
+      name: "IAccessControl",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IAccessControl__factory>;
+    getContractFactory(
+      name: "IERC1822Proxiable",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IERC1822Proxiable__factory>;
+    getContractFactory(
+      name: "IERC1155Errors",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IERC1155Errors__factory>;
+    getContractFactory(
+      name: "IERC20Errors",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IERC20Errors__factory>;
+    getContractFactory(
+      name: "IERC721Errors",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IERC721Errors__factory>;
+    getContractFactory(
+      name: "IERC5267",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IERC5267__factory>;
+    getContractFactory(
+      name: "IBeacon",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IBeacon__factory>;
+    getContractFactory(
+      name: "ERC1967Utils",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.ERC1967Utils__factory>;
+    getContractFactory(
+      name: "ERC20",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.ERC20__factory>;
+    getContractFactory(
+      name: "IERC20Metadata",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IERC20Metadata__factory>;
+    getContractFactory(
+      name: "IERC20",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IERC20__factory>;
+    getContractFactory(
+      name: "Address",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.Address__factory>;
+    getContractFactory(
+      name: "ECDSA",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.ECDSA__factory>;
+    getContractFactory(
+      name: "ERC165",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.ERC165__factory>;
+    getContractFactory(
+      name: "IERC165",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IERC165__factory>;
+    getContractFactory(
+      name: "Math",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.Math__factory>;
+    getContractFactory(
+      name: "Strings",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.Strings__factory>;
+    getContractFactory(
+      name: "IUniswapV3SwapCallback",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IUniswapV3SwapCallback__factory>;
+    getContractFactory(
+      name: "IUniswapV3PoolActions",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IUniswapV3PoolActions__factory>;
+    getContractFactory(
+      name: "IUniswapV3PoolDerivedState",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IUniswapV3PoolDerivedState__factory>;
+    getContractFactory(
+      name: "IUniswapV3PoolEvents",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IUniswapV3PoolEvents__factory>;
+    getContractFactory(
+      name: "IUniswapV3PoolImmutables",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IUniswapV3PoolImmutables__factory>;
+    getContractFactory(
+      name: "IUniswapV3PoolOwnerActions",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IUniswapV3PoolOwnerActions__factory>;
+    getContractFactory(
+      name: "IUniswapV3PoolState",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IUniswapV3PoolState__factory>;
+    getContractFactory(
+      name: "ISwapRouter",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.ISwapRouter__factory>;
+    getContractFactory(
+      name: "IElasticERC20",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IElasticERC20__factory>;
+    getContractFactory(
+      name: "IERC20",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IERC20__factory>;
+    getContractFactory(
+      name: "IUniswapV3Pool",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IUniswapV3Pool__factory>;
+    getContractFactory(
+      name: "BaseUltraVerifier",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.BaseUltraVerifier__factory>;
+    getContractFactory(
+      name: "UltraVerifier",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.UltraVerifier__factory>;
+    getContractFactory(
+      name: "IMomiji",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IMomiji__factory>;
+    getContractFactory(
+      name: "IOracle",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IOracle__factory>;
+    getContractFactory(
+      name: "IVerifier",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IVerifier__factory>;
+    getContractFactory(
+      name: "IWETH9",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.IWETH9__factory>;
+    getContractFactory(
+      name: "Momiji",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.Momiji__factory>;
+    getContractFactory(
+      name: "XFTMock",
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<Contracts.XFTMock__factory>;
+
+    getContractAt(
+      name: "AggregatorInterface",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.AggregatorInterface>;
+    getContractAt(
+      name: "AggregatorV2V3Interface",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.AggregatorV2V3Interface>;
+    getContractAt(
+      name: "AggregatorV3Interface",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.AggregatorV3Interface>;
+    getContractAt(
+      name: "OwnableUpgradeable",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.OwnableUpgradeable>;
+    getContractAt(
+      name: "Initializable",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.Initializable>;
+    getContractAt(
+      name: "UUPSUpgradeable",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.UUPSUpgradeable>;
+    getContractAt(
+      name: "ContextUpgradeable",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.ContextUpgradeable>;
+    getContractAt(
+      name: "EIP712Upgradeable",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.EIP712Upgradeable>;
+    getContractAt(
+      name: "PausableUpgradeable",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.PausableUpgradeable>;
+    getContractAt(
+      name: "AccessControl",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.AccessControl>;
+    getContractAt(
+      name: "IAccessControl",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IAccessControl>;
+    getContractAt(
+      name: "IERC1822Proxiable",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IERC1822Proxiable>;
+    getContractAt(
+      name: "IERC1155Errors",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IERC1155Errors>;
+    getContractAt(
+      name: "IERC20Errors",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IERC20Errors>;
+    getContractAt(
+      name: "IERC721Errors",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IERC721Errors>;
+    getContractAt(
+      name: "IERC5267",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IERC5267>;
+    getContractAt(
+      name: "IBeacon",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IBeacon>;
+    getContractAt(
+      name: "ERC1967Utils",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.ERC1967Utils>;
+    getContractAt(
+      name: "ERC20",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.ERC20>;
+    getContractAt(
+      name: "IERC20Metadata",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IERC20Metadata>;
+    getContractAt(
+      name: "IERC20",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IERC20>;
+    getContractAt(
+      name: "Address",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.Address>;
+    getContractAt(
+      name: "ECDSA",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.ECDSA>;
+    getContractAt(
+      name: "ERC165",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.ERC165>;
+    getContractAt(
+      name: "IERC165",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IERC165>;
+    getContractAt(
+      name: "Math",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.Math>;
+    getContractAt(
+      name: "Strings",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.Strings>;
+    getContractAt(
+      name: "IUniswapV3SwapCallback",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IUniswapV3SwapCallback>;
+    getContractAt(
+      name: "IUniswapV3PoolActions",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IUniswapV3PoolActions>;
+    getContractAt(
+      name: "IUniswapV3PoolDerivedState",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IUniswapV3PoolDerivedState>;
+    getContractAt(
+      name: "IUniswapV3PoolEvents",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IUniswapV3PoolEvents>;
+    getContractAt(
+      name: "IUniswapV3PoolImmutables",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IUniswapV3PoolImmutables>;
+    getContractAt(
+      name: "IUniswapV3PoolOwnerActions",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IUniswapV3PoolOwnerActions>;
+    getContractAt(
+      name: "IUniswapV3PoolState",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IUniswapV3PoolState>;
+    getContractAt(
+      name: "ISwapRouter",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.ISwapRouter>;
+    getContractAt(
+      name: "IElasticERC20",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IElasticERC20>;
+    getContractAt(
+      name: "IERC20",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IERC20>;
+    getContractAt(
+      name: "IUniswapV3Pool",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IUniswapV3Pool>;
+    getContractAt(
+      name: "BaseUltraVerifier",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.BaseUltraVerifier>;
+    getContractAt(
+      name: "UltraVerifier",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.UltraVerifier>;
+    getContractAt(
+      name: "IMomiji",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IMomiji>;
+    getContractAt(
+      name: "IOracle",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IOracle>;
+    getContractAt(
+      name: "IVerifier",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IVerifier>;
+    getContractAt(
+      name: "IWETH9",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.IWETH9>;
+    getContractAt(
+      name: "Momiji",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.Momiji>;
+    getContractAt(
+      name: "XFTMock",
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<Contracts.XFTMock>;
+
+    deployContract(
+      name: "AggregatorInterface",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.AggregatorInterface>;
+    deployContract(
+      name: "AggregatorV2V3Interface",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.AggregatorV2V3Interface>;
+    deployContract(
+      name: "AggregatorV3Interface",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.AggregatorV3Interface>;
+    deployContract(
+      name: "OwnableUpgradeable",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.OwnableUpgradeable>;
+    deployContract(
+      name: "Initializable",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.Initializable>;
+    deployContract(
+      name: "UUPSUpgradeable",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.UUPSUpgradeable>;
+    deployContract(
+      name: "ContextUpgradeable",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ContextUpgradeable>;
+    deployContract(
+      name: "EIP712Upgradeable",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.EIP712Upgradeable>;
+    deployContract(
+      name: "PausableUpgradeable",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.PausableUpgradeable>;
+    deployContract(
+      name: "AccessControl",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.AccessControl>;
+    deployContract(
+      name: "IAccessControl",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IAccessControl>;
+    deployContract(
+      name: "IERC1822Proxiable",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC1822Proxiable>;
+    deployContract(
+      name: "IERC1155Errors",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC1155Errors>;
+    deployContract(
+      name: "IERC20Errors",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC20Errors>;
+    deployContract(
+      name: "IERC721Errors",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC721Errors>;
+    deployContract(
+      name: "IERC5267",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC5267>;
+    deployContract(
+      name: "IBeacon",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IBeacon>;
+    deployContract(
+      name: "ERC1967Utils",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ERC1967Utils>;
+    deployContract(
+      name: "ERC20",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ERC20>;
+    deployContract(
+      name: "IERC20Metadata",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC20Metadata>;
+    deployContract(
+      name: "IERC20",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC20>;
+    deployContract(
+      name: "Address",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.Address>;
+    deployContract(
+      name: "ECDSA",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ECDSA>;
+    deployContract(
+      name: "ERC165",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ERC165>;
+    deployContract(
+      name: "IERC165",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC165>;
+    deployContract(
+      name: "Math",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.Math>;
+    deployContract(
+      name: "Strings",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.Strings>;
+    deployContract(
+      name: "IUniswapV3SwapCallback",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3SwapCallback>;
+    deployContract(
+      name: "IUniswapV3PoolActions",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolActions>;
+    deployContract(
+      name: "IUniswapV3PoolDerivedState",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolDerivedState>;
+    deployContract(
+      name: "IUniswapV3PoolEvents",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolEvents>;
+    deployContract(
+      name: "IUniswapV3PoolImmutables",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolImmutables>;
+    deployContract(
+      name: "IUniswapV3PoolOwnerActions",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolOwnerActions>;
+    deployContract(
+      name: "IUniswapV3PoolState",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolState>;
+    deployContract(
+      name: "ISwapRouter",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ISwapRouter>;
+    deployContract(
+      name: "IElasticERC20",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IElasticERC20>;
+    deployContract(
+      name: "IERC20",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC20>;
+    deployContract(
+      name: "IUniswapV3Pool",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3Pool>;
+    deployContract(
+      name: "BaseUltraVerifier",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.BaseUltraVerifier>;
+    deployContract(
+      name: "UltraVerifier",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.UltraVerifier>;
+    deployContract(
+      name: "IMomiji",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IMomiji>;
+    deployContract(
+      name: "IOracle",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IOracle>;
+    deployContract(
+      name: "IVerifier",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IVerifier>;
+    deployContract(
+      name: "IWETH9",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IWETH9>;
+    deployContract(
+      name: "Momiji",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.Momiji>;
+    deployContract(
+      name: "XFTMock",
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.XFTMock>;
+
+    deployContract(
+      name: "AggregatorInterface",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.AggregatorInterface>;
+    deployContract(
+      name: "AggregatorV2V3Interface",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.AggregatorV2V3Interface>;
+    deployContract(
+      name: "AggregatorV3Interface",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.AggregatorV3Interface>;
+    deployContract(
+      name: "OwnableUpgradeable",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.OwnableUpgradeable>;
+    deployContract(
+      name: "Initializable",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.Initializable>;
+    deployContract(
+      name: "UUPSUpgradeable",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.UUPSUpgradeable>;
+    deployContract(
+      name: "ContextUpgradeable",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ContextUpgradeable>;
+    deployContract(
+      name: "EIP712Upgradeable",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.EIP712Upgradeable>;
+    deployContract(
+      name: "PausableUpgradeable",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.PausableUpgradeable>;
+    deployContract(
+      name: "AccessControl",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.AccessControl>;
+    deployContract(
+      name: "IAccessControl",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IAccessControl>;
+    deployContract(
+      name: "IERC1822Proxiable",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC1822Proxiable>;
+    deployContract(
+      name: "IERC1155Errors",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC1155Errors>;
+    deployContract(
+      name: "IERC20Errors",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC20Errors>;
+    deployContract(
+      name: "IERC721Errors",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC721Errors>;
+    deployContract(
+      name: "IERC5267",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC5267>;
+    deployContract(
+      name: "IBeacon",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IBeacon>;
+    deployContract(
+      name: "ERC1967Utils",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ERC1967Utils>;
+    deployContract(
+      name: "ERC20",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ERC20>;
+    deployContract(
+      name: "IERC20Metadata",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC20Metadata>;
+    deployContract(
+      name: "IERC20",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC20>;
+    deployContract(
+      name: "Address",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.Address>;
+    deployContract(
+      name: "ECDSA",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ECDSA>;
+    deployContract(
+      name: "ERC165",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ERC165>;
+    deployContract(
+      name: "IERC165",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC165>;
+    deployContract(
+      name: "Math",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.Math>;
+    deployContract(
+      name: "Strings",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.Strings>;
+    deployContract(
+      name: "IUniswapV3SwapCallback",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3SwapCallback>;
+    deployContract(
+      name: "IUniswapV3PoolActions",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolActions>;
+    deployContract(
+      name: "IUniswapV3PoolDerivedState",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolDerivedState>;
+    deployContract(
+      name: "IUniswapV3PoolEvents",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolEvents>;
+    deployContract(
+      name: "IUniswapV3PoolImmutables",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolImmutables>;
+    deployContract(
+      name: "IUniswapV3PoolOwnerActions",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolOwnerActions>;
+    deployContract(
+      name: "IUniswapV3PoolState",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3PoolState>;
+    deployContract(
+      name: "ISwapRouter",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.ISwapRouter>;
+    deployContract(
+      name: "IElasticERC20",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IElasticERC20>;
+    deployContract(
+      name: "IERC20",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IERC20>;
+    deployContract(
+      name: "IUniswapV3Pool",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IUniswapV3Pool>;
+    deployContract(
+      name: "BaseUltraVerifier",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.BaseUltraVerifier>;
+    deployContract(
+      name: "UltraVerifier",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.UltraVerifier>;
+    deployContract(
+      name: "IMomiji",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IMomiji>;
+    deployContract(
+      name: "IOracle",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IOracle>;
+    deployContract(
+      name: "IVerifier",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IVerifier>;
+    deployContract(
+      name: "IWETH9",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.IWETH9>;
+    deployContract(
+      name: "Momiji",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.Momiji>;
+    deployContract(
+      name: "XFTMock",
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<Contracts.XFTMock>;
+
+    // default types
+    getContractFactory(
+      name: string,
+      signerOrOptions?: ethers.Signer | FactoryOptions
+    ): Promise<ethers.ContractFactory>;
+    getContractFactory(
+      abi: any[],
+      bytecode: ethers.BytesLike,
+      signer?: ethers.Signer
+    ): Promise<ethers.ContractFactory>;
+    getContractAt(
+      nameOrAbi: string | any[],
+      address: string | ethers.Addressable,
+      signer?: ethers.Signer
+    ): Promise<ethers.Contract>;
+    deployContract(
+      name: string,
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<ethers.Contract>;
+    deployContract(
+      name: string,
+      args: any[],
+      signerOrOptions?: ethers.Signer | DeployContractOptions
+    ): Promise<ethers.Contract>;
+  }
+}
diff --git a/momiji-helpers/utils/typechain-types/index.ts b/momiji-helpers/utils/typechain-types/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3a324b99b331ebd68471fc871f5529735ceae47c
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/index.ts
@@ -0,0 +1,102 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as chainlink from "./@chainlink";
+export type { chainlink };
+import type * as openzeppelin from "./@openzeppelin";
+export type { openzeppelin };
+import type * as uniswap from "./@uniswap";
+export type { uniswap };
+import type * as contracts from "./contracts";
+export type { contracts };
+export * as factories from "./factories";
+export type { AggregatorInterface } from "./@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface";
+export { AggregatorInterface__factory } from "./factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface__factory";
+export type { AggregatorV2V3Interface } from "./@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface";
+export { AggregatorV2V3Interface__factory } from "./factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface__factory";
+export type { AggregatorV3Interface } from "./@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface";
+export { AggregatorV3Interface__factory } from "./factories/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface__factory";
+export type { OwnableUpgradeable } from "./@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable";
+export { OwnableUpgradeable__factory } from "./factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory";
+export type { Initializable } from "./@openzeppelin/contracts-upgradeable/proxy/utils/Initializable";
+export { Initializable__factory } from "./factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory";
+export type { UUPSUpgradeable } from "./@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable";
+export { UUPSUpgradeable__factory } from "./factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory";
+export type { ContextUpgradeable } from "./@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable";
+export { ContextUpgradeable__factory } from "./factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory";
+export type { EIP712Upgradeable } from "./@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable";
+export { EIP712Upgradeable__factory } from "./factories/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable__factory";
+export type { PausableUpgradeable } from "./@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable";
+export { PausableUpgradeable__factory } from "./factories/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable__factory";
+export type { AccessControl } from "./@openzeppelin/contracts/access/AccessControl";
+export { AccessControl__factory } from "./factories/@openzeppelin/contracts/access/AccessControl__factory";
+export type { IAccessControl } from "./@openzeppelin/contracts/access/IAccessControl";
+export { IAccessControl__factory } from "./factories/@openzeppelin/contracts/access/IAccessControl__factory";
+export type { IERC1822Proxiable } from "./@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable";
+export { IERC1822Proxiable__factory } from "./factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory";
+export type { IERC1155Errors } from "./@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors";
+export { IERC1155Errors__factory } from "./factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory";
+export type { IERC20Errors } from "./@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors";
+export { IERC20Errors__factory } from "./factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory";
+export type { IERC721Errors } from "./@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors";
+export { IERC721Errors__factory } from "./factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory";
+export type { IERC5267 } from "./@openzeppelin/contracts/interfaces/IERC5267";
+export { IERC5267__factory } from "./factories/@openzeppelin/contracts/interfaces/IERC5267__factory";
+export type { IBeacon } from "./@openzeppelin/contracts/proxy/beacon/IBeacon";
+export { IBeacon__factory } from "./factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory";
+export type { ERC1967Utils } from "./@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils";
+export { ERC1967Utils__factory } from "./factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory";
+export type { ERC20 } from "./@openzeppelin/contracts/token/ERC20/ERC20";
+export { ERC20__factory } from "./factories/@openzeppelin/contracts/token/ERC20/ERC20__factory";
+export type { IERC20Metadata } from "./@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata";
+export { IERC20Metadata__factory } from "./factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory";
+export type { IERC20 } from "./@openzeppelin/contracts/token/ERC20/IERC20";
+export { IERC20__factory } from "./factories/@openzeppelin/contracts/token/ERC20/IERC20__factory";
+export type { Address } from "./@openzeppelin/contracts/utils/Address";
+export { Address__factory } from "./factories/@openzeppelin/contracts/utils/Address__factory";
+export type { ECDSA } from "./@openzeppelin/contracts/utils/cryptography/ECDSA";
+export { ECDSA__factory } from "./factories/@openzeppelin/contracts/utils/cryptography/ECDSA__factory";
+export type { ERC165 } from "./@openzeppelin/contracts/utils/introspection/ERC165";
+export { ERC165__factory } from "./factories/@openzeppelin/contracts/utils/introspection/ERC165__factory";
+export type { IERC165 } from "./@openzeppelin/contracts/utils/introspection/IERC165";
+export { IERC165__factory } from "./factories/@openzeppelin/contracts/utils/introspection/IERC165__factory";
+export type { Math } from "./@openzeppelin/contracts/utils/math/Math";
+export { Math__factory } from "./factories/@openzeppelin/contracts/utils/math/Math__factory";
+export type { Strings } from "./@openzeppelin/contracts/utils/Strings";
+export { Strings__factory } from "./factories/@openzeppelin/contracts/utils/Strings__factory";
+export type { IUniswapV3SwapCallback } from "./@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback";
+export { IUniswapV3SwapCallback__factory } from "./factories/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback__factory";
+export type { IUniswapV3PoolActions } from "./@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions";
+export { IUniswapV3PoolActions__factory } from "./factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions__factory";
+export type { IUniswapV3PoolDerivedState } from "./@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState";
+export { IUniswapV3PoolDerivedState__factory } from "./factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState__factory";
+export type { IUniswapV3PoolEvents } from "./@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents";
+export { IUniswapV3PoolEvents__factory } from "./factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents__factory";
+export type { IUniswapV3PoolImmutables } from "./@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables";
+export { IUniswapV3PoolImmutables__factory } from "./factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables__factory";
+export type { IUniswapV3PoolOwnerActions } from "./@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions";
+export { IUniswapV3PoolOwnerActions__factory } from "./factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions__factory";
+export type { IUniswapV3PoolState } from "./@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState";
+export { IUniswapV3PoolState__factory } from "./factories/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState__factory";
+export type { ISwapRouter } from "./@uniswap/v3-periphery/contracts/interfaces/ISwapRouter";
+export { ISwapRouter__factory } from "./factories/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter__factory";
+export type { IElasticERC20 } from "./contracts/Interfaces/IElasticERC20";
+export { IElasticERC20__factory } from "./factories/contracts/Interfaces/IElasticERC20__factory";
+export type { IUniswapV3Pool } from "./contracts/Interfaces/IUniswapV3Pool";
+export { IUniswapV3Pool__factory } from "./factories/contracts/Interfaces/IUniswapV3Pool__factory";
+export type { BaseUltraVerifier } from "./contracts/plonk_vk.sol/BaseUltraVerifier";
+export { BaseUltraVerifier__factory } from "./factories/contracts/plonk_vk.sol/BaseUltraVerifier__factory";
+export type { UltraVerifier } from "./contracts/plonk_vk.sol/UltraVerifier";
+export { UltraVerifier__factory } from "./factories/contracts/plonk_vk.sol/UltraVerifier__factory";
+export type { IMomiji } from "./contracts/state.sol/IMomiji";
+export { IMomiji__factory } from "./factories/contracts/state.sol/IMomiji__factory";
+export type { IOracle } from "./contracts/state.sol/IOracle";
+export { IOracle__factory } from "./factories/contracts/state.sol/IOracle__factory";
+export type { IVerifier } from "./contracts/state.sol/IVerifier";
+export { IVerifier__factory } from "./factories/contracts/state.sol/IVerifier__factory";
+export type { IWETH9 } from "./contracts/state.sol/IWETH9";
+export { IWETH9__factory } from "./factories/contracts/state.sol/IWETH9__factory";
+export type { Momiji } from "./contracts/state.sol/Momiji";
+export { Momiji__factory } from "./factories/contracts/state.sol/Momiji__factory";
+export type { XFTMock } from "./contracts/XFTmock.sol/XFTMock";
+export { XFTMock__factory } from "./factories/contracts/XFTmock.sol/XFTMock__factory";
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/index.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f68cafedd41e648db7f7dac20d8eae3208591b06
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as src from "./src";
+export type { src };
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdAssertions.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdAssertions.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4f747df1049200f5dc61aa0bab4502287f73b2cf
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdAssertions.ts
@@ -0,0 +1,762 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../common";
+
+export interface StdAssertionsInterface extends Interface {
+  getFunction(nameOrSignature: "failed"): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic:
+      | "log"
+      | "log_address"
+      | "log_array(uint256[])"
+      | "log_array(int256[])"
+      | "log_array(address[])"
+      | "log_bytes"
+      | "log_bytes32"
+      | "log_int"
+      | "log_named_address"
+      | "log_named_array(string,uint256[])"
+      | "log_named_array(string,int256[])"
+      | "log_named_array(string,address[])"
+      | "log_named_bytes"
+      | "log_named_bytes32"
+      | "log_named_decimal_int"
+      | "log_named_decimal_uint"
+      | "log_named_int"
+      | "log_named_string"
+      | "log_named_uint"
+      | "log_string"
+      | "log_uint"
+      | "logs"
+  ): EventFragment;
+
+  encodeFunctionData(functionFragment: "failed", values?: undefined): string;
+
+  decodeFunctionResult(functionFragment: "failed", data: BytesLike): Result;
+}
+
+export namespace logEvent {
+  export type InputTuple = [arg0: string];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_addressEvent {
+  export type InputTuple = [arg0: AddressLike];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_array_uint256_array_Event {
+  export type InputTuple = [val: BigNumberish[]];
+  export type OutputTuple = [val: bigint[]];
+  export interface OutputObject {
+    val: bigint[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_array_int256_array_Event {
+  export type InputTuple = [val: BigNumberish[]];
+  export type OutputTuple = [val: bigint[]];
+  export interface OutputObject {
+    val: bigint[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_array_address_array_Event {
+  export type InputTuple = [val: AddressLike[]];
+  export type OutputTuple = [val: string[]];
+  export interface OutputObject {
+    val: string[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_bytesEvent {
+  export type InputTuple = [arg0: BytesLike];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_bytes32Event {
+  export type InputTuple = [arg0: BytesLike];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_intEvent {
+  export type InputTuple = [arg0: BigNumberish];
+  export type OutputTuple = [arg0: bigint];
+  export interface OutputObject {
+    arg0: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_addressEvent {
+  export type InputTuple = [key: string, val: AddressLike];
+  export type OutputTuple = [key: string, val: string];
+  export interface OutputObject {
+    key: string;
+    val: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_array_string_uint256_array_Event {
+  export type InputTuple = [key: string, val: BigNumberish[]];
+  export type OutputTuple = [key: string, val: bigint[]];
+  export interface OutputObject {
+    key: string;
+    val: bigint[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_array_string_int256_array_Event {
+  export type InputTuple = [key: string, val: BigNumberish[]];
+  export type OutputTuple = [key: string, val: bigint[]];
+  export interface OutputObject {
+    key: string;
+    val: bigint[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_array_string_address_array_Event {
+  export type InputTuple = [key: string, val: AddressLike[]];
+  export type OutputTuple = [key: string, val: string[]];
+  export interface OutputObject {
+    key: string;
+    val: string[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_bytesEvent {
+  export type InputTuple = [key: string, val: BytesLike];
+  export type OutputTuple = [key: string, val: string];
+  export interface OutputObject {
+    key: string;
+    val: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_bytes32Event {
+  export type InputTuple = [key: string, val: BytesLike];
+  export type OutputTuple = [key: string, val: string];
+  export interface OutputObject {
+    key: string;
+    val: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_decimal_intEvent {
+  export type InputTuple = [
+    key: string,
+    val: BigNumberish,
+    decimals: BigNumberish
+  ];
+  export type OutputTuple = [key: string, val: bigint, decimals: bigint];
+  export interface OutputObject {
+    key: string;
+    val: bigint;
+    decimals: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_decimal_uintEvent {
+  export type InputTuple = [
+    key: string,
+    val: BigNumberish,
+    decimals: BigNumberish
+  ];
+  export type OutputTuple = [key: string, val: bigint, decimals: bigint];
+  export interface OutputObject {
+    key: string;
+    val: bigint;
+    decimals: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_intEvent {
+  export type InputTuple = [key: string, val: BigNumberish];
+  export type OutputTuple = [key: string, val: bigint];
+  export interface OutputObject {
+    key: string;
+    val: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_stringEvent {
+  export type InputTuple = [key: string, val: string];
+  export type OutputTuple = [key: string, val: string];
+  export interface OutputObject {
+    key: string;
+    val: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_uintEvent {
+  export type InputTuple = [key: string, val: BigNumberish];
+  export type OutputTuple = [key: string, val: bigint];
+  export interface OutputObject {
+    key: string;
+    val: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_stringEvent {
+  export type InputTuple = [arg0: string];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_uintEvent {
+  export type InputTuple = [arg0: BigNumberish];
+  export type OutputTuple = [arg0: bigint];
+  export interface OutputObject {
+    arg0: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace logsEvent {
+  export type InputTuple = [arg0: BytesLike];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface StdAssertions extends BaseContract {
+  connect(runner?: ContractRunner | null): StdAssertions;
+  waitForDeployment(): Promise<this>;
+
+  interface: StdAssertionsInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  failed: TypedContractMethod<[], [boolean], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "failed"
+  ): TypedContractMethod<[], [boolean], "view">;
+
+  getEvent(
+    key: "log"
+  ): TypedContractEvent<
+    logEvent.InputTuple,
+    logEvent.OutputTuple,
+    logEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_address"
+  ): TypedContractEvent<
+    log_addressEvent.InputTuple,
+    log_addressEvent.OutputTuple,
+    log_addressEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_array(uint256[])"
+  ): TypedContractEvent<
+    log_array_uint256_array_Event.InputTuple,
+    log_array_uint256_array_Event.OutputTuple,
+    log_array_uint256_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_array(int256[])"
+  ): TypedContractEvent<
+    log_array_int256_array_Event.InputTuple,
+    log_array_int256_array_Event.OutputTuple,
+    log_array_int256_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_array(address[])"
+  ): TypedContractEvent<
+    log_array_address_array_Event.InputTuple,
+    log_array_address_array_Event.OutputTuple,
+    log_array_address_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_bytes"
+  ): TypedContractEvent<
+    log_bytesEvent.InputTuple,
+    log_bytesEvent.OutputTuple,
+    log_bytesEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_bytes32"
+  ): TypedContractEvent<
+    log_bytes32Event.InputTuple,
+    log_bytes32Event.OutputTuple,
+    log_bytes32Event.OutputObject
+  >;
+  getEvent(
+    key: "log_int"
+  ): TypedContractEvent<
+    log_intEvent.InputTuple,
+    log_intEvent.OutputTuple,
+    log_intEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_address"
+  ): TypedContractEvent<
+    log_named_addressEvent.InputTuple,
+    log_named_addressEvent.OutputTuple,
+    log_named_addressEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_array(string,uint256[])"
+  ): TypedContractEvent<
+    log_named_array_string_uint256_array_Event.InputTuple,
+    log_named_array_string_uint256_array_Event.OutputTuple,
+    log_named_array_string_uint256_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_named_array(string,int256[])"
+  ): TypedContractEvent<
+    log_named_array_string_int256_array_Event.InputTuple,
+    log_named_array_string_int256_array_Event.OutputTuple,
+    log_named_array_string_int256_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_named_array(string,address[])"
+  ): TypedContractEvent<
+    log_named_array_string_address_array_Event.InputTuple,
+    log_named_array_string_address_array_Event.OutputTuple,
+    log_named_array_string_address_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_named_bytes"
+  ): TypedContractEvent<
+    log_named_bytesEvent.InputTuple,
+    log_named_bytesEvent.OutputTuple,
+    log_named_bytesEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_bytes32"
+  ): TypedContractEvent<
+    log_named_bytes32Event.InputTuple,
+    log_named_bytes32Event.OutputTuple,
+    log_named_bytes32Event.OutputObject
+  >;
+  getEvent(
+    key: "log_named_decimal_int"
+  ): TypedContractEvent<
+    log_named_decimal_intEvent.InputTuple,
+    log_named_decimal_intEvent.OutputTuple,
+    log_named_decimal_intEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_decimal_uint"
+  ): TypedContractEvent<
+    log_named_decimal_uintEvent.InputTuple,
+    log_named_decimal_uintEvent.OutputTuple,
+    log_named_decimal_uintEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_int"
+  ): TypedContractEvent<
+    log_named_intEvent.InputTuple,
+    log_named_intEvent.OutputTuple,
+    log_named_intEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_string"
+  ): TypedContractEvent<
+    log_named_stringEvent.InputTuple,
+    log_named_stringEvent.OutputTuple,
+    log_named_stringEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_uint"
+  ): TypedContractEvent<
+    log_named_uintEvent.InputTuple,
+    log_named_uintEvent.OutputTuple,
+    log_named_uintEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_string"
+  ): TypedContractEvent<
+    log_stringEvent.InputTuple,
+    log_stringEvent.OutputTuple,
+    log_stringEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_uint"
+  ): TypedContractEvent<
+    log_uintEvent.InputTuple,
+    log_uintEvent.OutputTuple,
+    log_uintEvent.OutputObject
+  >;
+  getEvent(
+    key: "logs"
+  ): TypedContractEvent<
+    logsEvent.InputTuple,
+    logsEvent.OutputTuple,
+    logsEvent.OutputObject
+  >;
+
+  filters: {
+    "log(string)": TypedContractEvent<
+      logEvent.InputTuple,
+      logEvent.OutputTuple,
+      logEvent.OutputObject
+    >;
+    log: TypedContractEvent<
+      logEvent.InputTuple,
+      logEvent.OutputTuple,
+      logEvent.OutputObject
+    >;
+
+    "log_address(address)": TypedContractEvent<
+      log_addressEvent.InputTuple,
+      log_addressEvent.OutputTuple,
+      log_addressEvent.OutputObject
+    >;
+    log_address: TypedContractEvent<
+      log_addressEvent.InputTuple,
+      log_addressEvent.OutputTuple,
+      log_addressEvent.OutputObject
+    >;
+
+    "log_array(uint256[])": TypedContractEvent<
+      log_array_uint256_array_Event.InputTuple,
+      log_array_uint256_array_Event.OutputTuple,
+      log_array_uint256_array_Event.OutputObject
+    >;
+    "log_array(int256[])": TypedContractEvent<
+      log_array_int256_array_Event.InputTuple,
+      log_array_int256_array_Event.OutputTuple,
+      log_array_int256_array_Event.OutputObject
+    >;
+    "log_array(address[])": TypedContractEvent<
+      log_array_address_array_Event.InputTuple,
+      log_array_address_array_Event.OutputTuple,
+      log_array_address_array_Event.OutputObject
+    >;
+
+    "log_bytes(bytes)": TypedContractEvent<
+      log_bytesEvent.InputTuple,
+      log_bytesEvent.OutputTuple,
+      log_bytesEvent.OutputObject
+    >;
+    log_bytes: TypedContractEvent<
+      log_bytesEvent.InputTuple,
+      log_bytesEvent.OutputTuple,
+      log_bytesEvent.OutputObject
+    >;
+
+    "log_bytes32(bytes32)": TypedContractEvent<
+      log_bytes32Event.InputTuple,
+      log_bytes32Event.OutputTuple,
+      log_bytes32Event.OutputObject
+    >;
+    log_bytes32: TypedContractEvent<
+      log_bytes32Event.InputTuple,
+      log_bytes32Event.OutputTuple,
+      log_bytes32Event.OutputObject
+    >;
+
+    "log_int(int256)": TypedContractEvent<
+      log_intEvent.InputTuple,
+      log_intEvent.OutputTuple,
+      log_intEvent.OutputObject
+    >;
+    log_int: TypedContractEvent<
+      log_intEvent.InputTuple,
+      log_intEvent.OutputTuple,
+      log_intEvent.OutputObject
+    >;
+
+    "log_named_address(string,address)": TypedContractEvent<
+      log_named_addressEvent.InputTuple,
+      log_named_addressEvent.OutputTuple,
+      log_named_addressEvent.OutputObject
+    >;
+    log_named_address: TypedContractEvent<
+      log_named_addressEvent.InputTuple,
+      log_named_addressEvent.OutputTuple,
+      log_named_addressEvent.OutputObject
+    >;
+
+    "log_named_array(string,uint256[])": TypedContractEvent<
+      log_named_array_string_uint256_array_Event.InputTuple,
+      log_named_array_string_uint256_array_Event.OutputTuple,
+      log_named_array_string_uint256_array_Event.OutputObject
+    >;
+    "log_named_array(string,int256[])": TypedContractEvent<
+      log_named_array_string_int256_array_Event.InputTuple,
+      log_named_array_string_int256_array_Event.OutputTuple,
+      log_named_array_string_int256_array_Event.OutputObject
+    >;
+    "log_named_array(string,address[])": TypedContractEvent<
+      log_named_array_string_address_array_Event.InputTuple,
+      log_named_array_string_address_array_Event.OutputTuple,
+      log_named_array_string_address_array_Event.OutputObject
+    >;
+
+    "log_named_bytes(string,bytes)": TypedContractEvent<
+      log_named_bytesEvent.InputTuple,
+      log_named_bytesEvent.OutputTuple,
+      log_named_bytesEvent.OutputObject
+    >;
+    log_named_bytes: TypedContractEvent<
+      log_named_bytesEvent.InputTuple,
+      log_named_bytesEvent.OutputTuple,
+      log_named_bytesEvent.OutputObject
+    >;
+
+    "log_named_bytes32(string,bytes32)": TypedContractEvent<
+      log_named_bytes32Event.InputTuple,
+      log_named_bytes32Event.OutputTuple,
+      log_named_bytes32Event.OutputObject
+    >;
+    log_named_bytes32: TypedContractEvent<
+      log_named_bytes32Event.InputTuple,
+      log_named_bytes32Event.OutputTuple,
+      log_named_bytes32Event.OutputObject
+    >;
+
+    "log_named_decimal_int(string,int256,uint256)": TypedContractEvent<
+      log_named_decimal_intEvent.InputTuple,
+      log_named_decimal_intEvent.OutputTuple,
+      log_named_decimal_intEvent.OutputObject
+    >;
+    log_named_decimal_int: TypedContractEvent<
+      log_named_decimal_intEvent.InputTuple,
+      log_named_decimal_intEvent.OutputTuple,
+      log_named_decimal_intEvent.OutputObject
+    >;
+
+    "log_named_decimal_uint(string,uint256,uint256)": TypedContractEvent<
+      log_named_decimal_uintEvent.InputTuple,
+      log_named_decimal_uintEvent.OutputTuple,
+      log_named_decimal_uintEvent.OutputObject
+    >;
+    log_named_decimal_uint: TypedContractEvent<
+      log_named_decimal_uintEvent.InputTuple,
+      log_named_decimal_uintEvent.OutputTuple,
+      log_named_decimal_uintEvent.OutputObject
+    >;
+
+    "log_named_int(string,int256)": TypedContractEvent<
+      log_named_intEvent.InputTuple,
+      log_named_intEvent.OutputTuple,
+      log_named_intEvent.OutputObject
+    >;
+    log_named_int: TypedContractEvent<
+      log_named_intEvent.InputTuple,
+      log_named_intEvent.OutputTuple,
+      log_named_intEvent.OutputObject
+    >;
+
+    "log_named_string(string,string)": TypedContractEvent<
+      log_named_stringEvent.InputTuple,
+      log_named_stringEvent.OutputTuple,
+      log_named_stringEvent.OutputObject
+    >;
+    log_named_string: TypedContractEvent<
+      log_named_stringEvent.InputTuple,
+      log_named_stringEvent.OutputTuple,
+      log_named_stringEvent.OutputObject
+    >;
+
+    "log_named_uint(string,uint256)": TypedContractEvent<
+      log_named_uintEvent.InputTuple,
+      log_named_uintEvent.OutputTuple,
+      log_named_uintEvent.OutputObject
+    >;
+    log_named_uint: TypedContractEvent<
+      log_named_uintEvent.InputTuple,
+      log_named_uintEvent.OutputTuple,
+      log_named_uintEvent.OutputObject
+    >;
+
+    "log_string(string)": TypedContractEvent<
+      log_stringEvent.InputTuple,
+      log_stringEvent.OutputTuple,
+      log_stringEvent.OutputObject
+    >;
+    log_string: TypedContractEvent<
+      log_stringEvent.InputTuple,
+      log_stringEvent.OutputTuple,
+      log_stringEvent.OutputObject
+    >;
+
+    "log_uint(uint256)": TypedContractEvent<
+      log_uintEvent.InputTuple,
+      log_uintEvent.OutputTuple,
+      log_uintEvent.OutputObject
+    >;
+    log_uint: TypedContractEvent<
+      log_uintEvent.InputTuple,
+      log_uintEvent.OutputTuple,
+      log_uintEvent.OutputObject
+    >;
+
+    "logs(bytes)": TypedContractEvent<
+      logsEvent.InputTuple,
+      logsEvent.OutputTuple,
+      logsEvent.OutputObject
+    >;
+    logs: TypedContractEvent<
+      logsEvent.InputTuple,
+      logsEvent.OutputTuple,
+      logsEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdError.sol/StdError.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdError.sol/StdError.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9fce2938d2ecf044374d30ffc473614cd9b2ad6e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdError.sol/StdError.ts
@@ -0,0 +1,199 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface StdErrorInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "arithmeticError"
+      | "assertionError"
+      | "divisionError"
+      | "encodeStorageError"
+      | "enumConversionError"
+      | "indexOOBError"
+      | "memOverflowError"
+      | "popError"
+      | "zeroVarError"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "arithmeticError",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertionError",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "divisionError",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "encodeStorageError",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "enumConversionError",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "indexOOBError",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "memOverflowError",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "popError", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "zeroVarError",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "arithmeticError",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertionError",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "divisionError",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "encodeStorageError",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "enumConversionError",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "indexOOBError",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "memOverflowError",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "popError", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "zeroVarError",
+    data: BytesLike
+  ): Result;
+}
+
+export interface StdError extends BaseContract {
+  connect(runner?: ContractRunner | null): StdError;
+  waitForDeployment(): Promise<this>;
+
+  interface: StdErrorInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  arithmeticError: TypedContractMethod<[], [string], "view">;
+
+  assertionError: TypedContractMethod<[], [string], "view">;
+
+  divisionError: TypedContractMethod<[], [string], "view">;
+
+  encodeStorageError: TypedContractMethod<[], [string], "view">;
+
+  enumConversionError: TypedContractMethod<[], [string], "view">;
+
+  indexOOBError: TypedContractMethod<[], [string], "view">;
+
+  memOverflowError: TypedContractMethod<[], [string], "view">;
+
+  popError: TypedContractMethod<[], [string], "view">;
+
+  zeroVarError: TypedContractMethod<[], [string], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "arithmeticError"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "assertionError"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "divisionError"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "encodeStorageError"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "enumConversionError"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "indexOOBError"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "memOverflowError"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "popError"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "zeroVarError"
+  ): TypedContractMethod<[], [string], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdError.sol/index.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdError.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..011e98faaa08c13f2acb15c6e7dab36cc70a0a54
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdError.sol/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { StdError } from "./StdError";
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdInvariant.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdInvariant.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a583f51038bf6b5584497727094e895b7252d38e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdInvariant.ts
@@ -0,0 +1,255 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../common";
+
+export declare namespace StdInvariant {
+  export type FuzzArtifactSelectorStruct = {
+    artifact: string;
+    selectors: BytesLike[];
+  };
+
+  export type FuzzArtifactSelectorStructOutput = [
+    artifact: string,
+    selectors: string[]
+  ] & { artifact: string; selectors: string[] };
+
+  export type FuzzInterfaceStruct = { addr: AddressLike; artifacts: string[] };
+
+  export type FuzzInterfaceStructOutput = [
+    addr: string,
+    artifacts: string[]
+  ] & { addr: string; artifacts: string[] };
+
+  export type FuzzSelectorStruct = {
+    addr: AddressLike;
+    selectors: BytesLike[];
+  };
+
+  export type FuzzSelectorStructOutput = [addr: string, selectors: string[]] & {
+    addr: string;
+    selectors: string[];
+  };
+}
+
+export interface StdInvariantInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "excludeArtifacts"
+      | "excludeContracts"
+      | "excludeSenders"
+      | "targetArtifactSelectors"
+      | "targetArtifacts"
+      | "targetContracts"
+      | "targetInterfaces"
+      | "targetSelectors"
+      | "targetSenders"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "excludeArtifacts",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "excludeContracts",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "excludeSenders",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "targetArtifactSelectors",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "targetArtifacts",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "targetContracts",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "targetInterfaces",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "targetSelectors",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "targetSenders",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "excludeArtifacts",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "excludeContracts",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "excludeSenders",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "targetArtifactSelectors",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "targetArtifacts",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "targetContracts",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "targetInterfaces",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "targetSelectors",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "targetSenders",
+    data: BytesLike
+  ): Result;
+}
+
+export interface StdInvariant extends BaseContract {
+  connect(runner?: ContractRunner | null): StdInvariant;
+  waitForDeployment(): Promise<this>;
+
+  interface: StdInvariantInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  excludeArtifacts: TypedContractMethod<[], [string[]], "view">;
+
+  excludeContracts: TypedContractMethod<[], [string[]], "view">;
+
+  excludeSenders: TypedContractMethod<[], [string[]], "view">;
+
+  targetArtifactSelectors: TypedContractMethod<
+    [],
+    [StdInvariant.FuzzArtifactSelectorStructOutput[]],
+    "view"
+  >;
+
+  targetArtifacts: TypedContractMethod<[], [string[]], "view">;
+
+  targetContracts: TypedContractMethod<[], [string[]], "view">;
+
+  targetInterfaces: TypedContractMethod<
+    [],
+    [StdInvariant.FuzzInterfaceStructOutput[]],
+    "view"
+  >;
+
+  targetSelectors: TypedContractMethod<
+    [],
+    [StdInvariant.FuzzSelectorStructOutput[]],
+    "view"
+  >;
+
+  targetSenders: TypedContractMethod<[], [string[]], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "excludeArtifacts"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "excludeContracts"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "excludeSenders"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "targetArtifactSelectors"
+  ): TypedContractMethod<
+    [],
+    [StdInvariant.FuzzArtifactSelectorStructOutput[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "targetArtifacts"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "targetContracts"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "targetInterfaces"
+  ): TypedContractMethod<
+    [],
+    [StdInvariant.FuzzInterfaceStructOutput[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "targetSelectors"
+  ): TypedContractMethod<[], [StdInvariant.FuzzSelectorStructOutput[]], "view">;
+  getFunction(
+    nameOrSignature: "targetSenders"
+  ): TypedContractMethod<[], [string[]], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdStorage.sol/StdStorageSafe.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdStorage.sol/StdStorageSafe.ts
new file mode 100644
index 0000000000000000000000000000000000000000..877fece5d0907fb6cc1e115d734f88c4f87ac921
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdStorage.sol/StdStorageSafe.ts
@@ -0,0 +1,153 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+} from "../../../../common";
+
+export interface StdStorageSafeInterface extends Interface {
+  getEvent(
+    nameOrSignatureOrTopic: "SlotFound" | "WARNING_UninitedSlot"
+  ): EventFragment;
+}
+
+export namespace SlotFoundEvent {
+  export type InputTuple = [
+    who: AddressLike,
+    fsig: BytesLike,
+    keysHash: BytesLike,
+    slot: BigNumberish
+  ];
+  export type OutputTuple = [
+    who: string,
+    fsig: string,
+    keysHash: string,
+    slot: bigint
+  ];
+  export interface OutputObject {
+    who: string;
+    fsig: string;
+    keysHash: string;
+    slot: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace WARNING_UninitedSlotEvent {
+  export type InputTuple = [who: AddressLike, slot: BigNumberish];
+  export type OutputTuple = [who: string, slot: bigint];
+  export interface OutputObject {
+    who: string;
+    slot: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface StdStorageSafe extends BaseContract {
+  connect(runner?: ContractRunner | null): StdStorageSafe;
+  waitForDeployment(): Promise<this>;
+
+  interface: StdStorageSafeInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getEvent(
+    key: "SlotFound"
+  ): TypedContractEvent<
+    SlotFoundEvent.InputTuple,
+    SlotFoundEvent.OutputTuple,
+    SlotFoundEvent.OutputObject
+  >;
+  getEvent(
+    key: "WARNING_UninitedSlot"
+  ): TypedContractEvent<
+    WARNING_UninitedSlotEvent.InputTuple,
+    WARNING_UninitedSlotEvent.OutputTuple,
+    WARNING_UninitedSlotEvent.OutputObject
+  >;
+
+  filters: {
+    "SlotFound(address,bytes4,bytes32,uint256)": TypedContractEvent<
+      SlotFoundEvent.InputTuple,
+      SlotFoundEvent.OutputTuple,
+      SlotFoundEvent.OutputObject
+    >;
+    SlotFound: TypedContractEvent<
+      SlotFoundEvent.InputTuple,
+      SlotFoundEvent.OutputTuple,
+      SlotFoundEvent.OutputObject
+    >;
+
+    "WARNING_UninitedSlot(address,uint256)": TypedContractEvent<
+      WARNING_UninitedSlotEvent.InputTuple,
+      WARNING_UninitedSlotEvent.OutputTuple,
+      WARNING_UninitedSlotEvent.OutputObject
+    >;
+    WARNING_UninitedSlot: TypedContractEvent<
+      WARNING_UninitedSlotEvent.InputTuple,
+      WARNING_UninitedSlotEvent.OutputTuple,
+      WARNING_UninitedSlotEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdStorage.sol/index.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdStorage.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8a3fb579abe9d5783c1d3e291cdaf5dda071744e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/StdStorage.sol/index.ts
@@ -0,0 +1,4 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { StdStorageSafe } from "./StdStorageSafe";
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/Test.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/Test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e3b974072698da305332ea62cfe36a74fa421709
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/Test.ts
@@ -0,0 +1,948 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../common";
+
+export declare namespace StdInvariant {
+  export type FuzzArtifactSelectorStruct = {
+    artifact: string;
+    selectors: BytesLike[];
+  };
+
+  export type FuzzArtifactSelectorStructOutput = [
+    artifact: string,
+    selectors: string[]
+  ] & { artifact: string; selectors: string[] };
+
+  export type FuzzInterfaceStruct = { addr: AddressLike; artifacts: string[] };
+
+  export type FuzzInterfaceStructOutput = [
+    addr: string,
+    artifacts: string[]
+  ] & { addr: string; artifacts: string[] };
+
+  export type FuzzSelectorStruct = {
+    addr: AddressLike;
+    selectors: BytesLike[];
+  };
+
+  export type FuzzSelectorStructOutput = [addr: string, selectors: string[]] & {
+    addr: string;
+    selectors: string[];
+  };
+}
+
+export interface TestInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "IS_TEST"
+      | "excludeArtifacts"
+      | "excludeContracts"
+      | "excludeSenders"
+      | "failed"
+      | "targetArtifactSelectors"
+      | "targetArtifacts"
+      | "targetContracts"
+      | "targetInterfaces"
+      | "targetSelectors"
+      | "targetSenders"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic:
+      | "log"
+      | "log_address"
+      | "log_array(uint256[])"
+      | "log_array(int256[])"
+      | "log_array(address[])"
+      | "log_bytes"
+      | "log_bytes32"
+      | "log_int"
+      | "log_named_address"
+      | "log_named_array(string,uint256[])"
+      | "log_named_array(string,int256[])"
+      | "log_named_array(string,address[])"
+      | "log_named_bytes"
+      | "log_named_bytes32"
+      | "log_named_decimal_int"
+      | "log_named_decimal_uint"
+      | "log_named_int"
+      | "log_named_string"
+      | "log_named_uint"
+      | "log_string"
+      | "log_uint"
+      | "logs"
+  ): EventFragment;
+
+  encodeFunctionData(functionFragment: "IS_TEST", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "excludeArtifacts",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "excludeContracts",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "excludeSenders",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "failed", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "targetArtifactSelectors",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "targetArtifacts",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "targetContracts",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "targetInterfaces",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "targetSelectors",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "targetSenders",
+    values?: undefined
+  ): string;
+
+  decodeFunctionResult(functionFragment: "IS_TEST", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "excludeArtifacts",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "excludeContracts",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "excludeSenders",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "failed", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "targetArtifactSelectors",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "targetArtifacts",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "targetContracts",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "targetInterfaces",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "targetSelectors",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "targetSenders",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace logEvent {
+  export type InputTuple = [arg0: string];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_addressEvent {
+  export type InputTuple = [arg0: AddressLike];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_array_uint256_array_Event {
+  export type InputTuple = [val: BigNumberish[]];
+  export type OutputTuple = [val: bigint[]];
+  export interface OutputObject {
+    val: bigint[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_array_int256_array_Event {
+  export type InputTuple = [val: BigNumberish[]];
+  export type OutputTuple = [val: bigint[]];
+  export interface OutputObject {
+    val: bigint[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_array_address_array_Event {
+  export type InputTuple = [val: AddressLike[]];
+  export type OutputTuple = [val: string[]];
+  export interface OutputObject {
+    val: string[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_bytesEvent {
+  export type InputTuple = [arg0: BytesLike];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_bytes32Event {
+  export type InputTuple = [arg0: BytesLike];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_intEvent {
+  export type InputTuple = [arg0: BigNumberish];
+  export type OutputTuple = [arg0: bigint];
+  export interface OutputObject {
+    arg0: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_addressEvent {
+  export type InputTuple = [key: string, val: AddressLike];
+  export type OutputTuple = [key: string, val: string];
+  export interface OutputObject {
+    key: string;
+    val: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_array_string_uint256_array_Event {
+  export type InputTuple = [key: string, val: BigNumberish[]];
+  export type OutputTuple = [key: string, val: bigint[]];
+  export interface OutputObject {
+    key: string;
+    val: bigint[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_array_string_int256_array_Event {
+  export type InputTuple = [key: string, val: BigNumberish[]];
+  export type OutputTuple = [key: string, val: bigint[]];
+  export interface OutputObject {
+    key: string;
+    val: bigint[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_array_string_address_array_Event {
+  export type InputTuple = [key: string, val: AddressLike[]];
+  export type OutputTuple = [key: string, val: string[]];
+  export interface OutputObject {
+    key: string;
+    val: string[];
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_bytesEvent {
+  export type InputTuple = [key: string, val: BytesLike];
+  export type OutputTuple = [key: string, val: string];
+  export interface OutputObject {
+    key: string;
+    val: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_bytes32Event {
+  export type InputTuple = [key: string, val: BytesLike];
+  export type OutputTuple = [key: string, val: string];
+  export interface OutputObject {
+    key: string;
+    val: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_decimal_intEvent {
+  export type InputTuple = [
+    key: string,
+    val: BigNumberish,
+    decimals: BigNumberish
+  ];
+  export type OutputTuple = [key: string, val: bigint, decimals: bigint];
+  export interface OutputObject {
+    key: string;
+    val: bigint;
+    decimals: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_decimal_uintEvent {
+  export type InputTuple = [
+    key: string,
+    val: BigNumberish,
+    decimals: BigNumberish
+  ];
+  export type OutputTuple = [key: string, val: bigint, decimals: bigint];
+  export interface OutputObject {
+    key: string;
+    val: bigint;
+    decimals: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_intEvent {
+  export type InputTuple = [key: string, val: BigNumberish];
+  export type OutputTuple = [key: string, val: bigint];
+  export interface OutputObject {
+    key: string;
+    val: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_stringEvent {
+  export type InputTuple = [key: string, val: string];
+  export type OutputTuple = [key: string, val: string];
+  export interface OutputObject {
+    key: string;
+    val: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_named_uintEvent {
+  export type InputTuple = [key: string, val: BigNumberish];
+  export type OutputTuple = [key: string, val: bigint];
+  export interface OutputObject {
+    key: string;
+    val: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_stringEvent {
+  export type InputTuple = [arg0: string];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace log_uintEvent {
+  export type InputTuple = [arg0: BigNumberish];
+  export type OutputTuple = [arg0: bigint];
+  export interface OutputObject {
+    arg0: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace logsEvent {
+  export type InputTuple = [arg0: BytesLike];
+  export type OutputTuple = [arg0: string];
+  export interface OutputObject {
+    arg0: string;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface Test extends BaseContract {
+  connect(runner?: ContractRunner | null): Test;
+  waitForDeployment(): Promise<this>;
+
+  interface: TestInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  IS_TEST: TypedContractMethod<[], [boolean], "view">;
+
+  excludeArtifacts: TypedContractMethod<[], [string[]], "view">;
+
+  excludeContracts: TypedContractMethod<[], [string[]], "view">;
+
+  excludeSenders: TypedContractMethod<[], [string[]], "view">;
+
+  failed: TypedContractMethod<[], [boolean], "view">;
+
+  targetArtifactSelectors: TypedContractMethod<
+    [],
+    [StdInvariant.FuzzArtifactSelectorStructOutput[]],
+    "view"
+  >;
+
+  targetArtifacts: TypedContractMethod<[], [string[]], "view">;
+
+  targetContracts: TypedContractMethod<[], [string[]], "view">;
+
+  targetInterfaces: TypedContractMethod<
+    [],
+    [StdInvariant.FuzzInterfaceStructOutput[]],
+    "view"
+  >;
+
+  targetSelectors: TypedContractMethod<
+    [],
+    [StdInvariant.FuzzSelectorStructOutput[]],
+    "view"
+  >;
+
+  targetSenders: TypedContractMethod<[], [string[]], "view">;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "IS_TEST"
+  ): TypedContractMethod<[], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "excludeArtifacts"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "excludeContracts"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "excludeSenders"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "failed"
+  ): TypedContractMethod<[], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "targetArtifactSelectors"
+  ): TypedContractMethod<
+    [],
+    [StdInvariant.FuzzArtifactSelectorStructOutput[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "targetArtifacts"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "targetContracts"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "targetInterfaces"
+  ): TypedContractMethod<
+    [],
+    [StdInvariant.FuzzInterfaceStructOutput[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "targetSelectors"
+  ): TypedContractMethod<[], [StdInvariant.FuzzSelectorStructOutput[]], "view">;
+  getFunction(
+    nameOrSignature: "targetSenders"
+  ): TypedContractMethod<[], [string[]], "view">;
+
+  getEvent(
+    key: "log"
+  ): TypedContractEvent<
+    logEvent.InputTuple,
+    logEvent.OutputTuple,
+    logEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_address"
+  ): TypedContractEvent<
+    log_addressEvent.InputTuple,
+    log_addressEvent.OutputTuple,
+    log_addressEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_array(uint256[])"
+  ): TypedContractEvent<
+    log_array_uint256_array_Event.InputTuple,
+    log_array_uint256_array_Event.OutputTuple,
+    log_array_uint256_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_array(int256[])"
+  ): TypedContractEvent<
+    log_array_int256_array_Event.InputTuple,
+    log_array_int256_array_Event.OutputTuple,
+    log_array_int256_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_array(address[])"
+  ): TypedContractEvent<
+    log_array_address_array_Event.InputTuple,
+    log_array_address_array_Event.OutputTuple,
+    log_array_address_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_bytes"
+  ): TypedContractEvent<
+    log_bytesEvent.InputTuple,
+    log_bytesEvent.OutputTuple,
+    log_bytesEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_bytes32"
+  ): TypedContractEvent<
+    log_bytes32Event.InputTuple,
+    log_bytes32Event.OutputTuple,
+    log_bytes32Event.OutputObject
+  >;
+  getEvent(
+    key: "log_int"
+  ): TypedContractEvent<
+    log_intEvent.InputTuple,
+    log_intEvent.OutputTuple,
+    log_intEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_address"
+  ): TypedContractEvent<
+    log_named_addressEvent.InputTuple,
+    log_named_addressEvent.OutputTuple,
+    log_named_addressEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_array(string,uint256[])"
+  ): TypedContractEvent<
+    log_named_array_string_uint256_array_Event.InputTuple,
+    log_named_array_string_uint256_array_Event.OutputTuple,
+    log_named_array_string_uint256_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_named_array(string,int256[])"
+  ): TypedContractEvent<
+    log_named_array_string_int256_array_Event.InputTuple,
+    log_named_array_string_int256_array_Event.OutputTuple,
+    log_named_array_string_int256_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_named_array(string,address[])"
+  ): TypedContractEvent<
+    log_named_array_string_address_array_Event.InputTuple,
+    log_named_array_string_address_array_Event.OutputTuple,
+    log_named_array_string_address_array_Event.OutputObject
+  >;
+  getEvent(
+    key: "log_named_bytes"
+  ): TypedContractEvent<
+    log_named_bytesEvent.InputTuple,
+    log_named_bytesEvent.OutputTuple,
+    log_named_bytesEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_bytes32"
+  ): TypedContractEvent<
+    log_named_bytes32Event.InputTuple,
+    log_named_bytes32Event.OutputTuple,
+    log_named_bytes32Event.OutputObject
+  >;
+  getEvent(
+    key: "log_named_decimal_int"
+  ): TypedContractEvent<
+    log_named_decimal_intEvent.InputTuple,
+    log_named_decimal_intEvent.OutputTuple,
+    log_named_decimal_intEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_decimal_uint"
+  ): TypedContractEvent<
+    log_named_decimal_uintEvent.InputTuple,
+    log_named_decimal_uintEvent.OutputTuple,
+    log_named_decimal_uintEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_int"
+  ): TypedContractEvent<
+    log_named_intEvent.InputTuple,
+    log_named_intEvent.OutputTuple,
+    log_named_intEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_string"
+  ): TypedContractEvent<
+    log_named_stringEvent.InputTuple,
+    log_named_stringEvent.OutputTuple,
+    log_named_stringEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_named_uint"
+  ): TypedContractEvent<
+    log_named_uintEvent.InputTuple,
+    log_named_uintEvent.OutputTuple,
+    log_named_uintEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_string"
+  ): TypedContractEvent<
+    log_stringEvent.InputTuple,
+    log_stringEvent.OutputTuple,
+    log_stringEvent.OutputObject
+  >;
+  getEvent(
+    key: "log_uint"
+  ): TypedContractEvent<
+    log_uintEvent.InputTuple,
+    log_uintEvent.OutputTuple,
+    log_uintEvent.OutputObject
+  >;
+  getEvent(
+    key: "logs"
+  ): TypedContractEvent<
+    logsEvent.InputTuple,
+    logsEvent.OutputTuple,
+    logsEvent.OutputObject
+  >;
+
+  filters: {
+    "log(string)": TypedContractEvent<
+      logEvent.InputTuple,
+      logEvent.OutputTuple,
+      logEvent.OutputObject
+    >;
+    log: TypedContractEvent<
+      logEvent.InputTuple,
+      logEvent.OutputTuple,
+      logEvent.OutputObject
+    >;
+
+    "log_address(address)": TypedContractEvent<
+      log_addressEvent.InputTuple,
+      log_addressEvent.OutputTuple,
+      log_addressEvent.OutputObject
+    >;
+    log_address: TypedContractEvent<
+      log_addressEvent.InputTuple,
+      log_addressEvent.OutputTuple,
+      log_addressEvent.OutputObject
+    >;
+
+    "log_array(uint256[])": TypedContractEvent<
+      log_array_uint256_array_Event.InputTuple,
+      log_array_uint256_array_Event.OutputTuple,
+      log_array_uint256_array_Event.OutputObject
+    >;
+    "log_array(int256[])": TypedContractEvent<
+      log_array_int256_array_Event.InputTuple,
+      log_array_int256_array_Event.OutputTuple,
+      log_array_int256_array_Event.OutputObject
+    >;
+    "log_array(address[])": TypedContractEvent<
+      log_array_address_array_Event.InputTuple,
+      log_array_address_array_Event.OutputTuple,
+      log_array_address_array_Event.OutputObject
+    >;
+
+    "log_bytes(bytes)": TypedContractEvent<
+      log_bytesEvent.InputTuple,
+      log_bytesEvent.OutputTuple,
+      log_bytesEvent.OutputObject
+    >;
+    log_bytes: TypedContractEvent<
+      log_bytesEvent.InputTuple,
+      log_bytesEvent.OutputTuple,
+      log_bytesEvent.OutputObject
+    >;
+
+    "log_bytes32(bytes32)": TypedContractEvent<
+      log_bytes32Event.InputTuple,
+      log_bytes32Event.OutputTuple,
+      log_bytes32Event.OutputObject
+    >;
+    log_bytes32: TypedContractEvent<
+      log_bytes32Event.InputTuple,
+      log_bytes32Event.OutputTuple,
+      log_bytes32Event.OutputObject
+    >;
+
+    "log_int(int256)": TypedContractEvent<
+      log_intEvent.InputTuple,
+      log_intEvent.OutputTuple,
+      log_intEvent.OutputObject
+    >;
+    log_int: TypedContractEvent<
+      log_intEvent.InputTuple,
+      log_intEvent.OutputTuple,
+      log_intEvent.OutputObject
+    >;
+
+    "log_named_address(string,address)": TypedContractEvent<
+      log_named_addressEvent.InputTuple,
+      log_named_addressEvent.OutputTuple,
+      log_named_addressEvent.OutputObject
+    >;
+    log_named_address: TypedContractEvent<
+      log_named_addressEvent.InputTuple,
+      log_named_addressEvent.OutputTuple,
+      log_named_addressEvent.OutputObject
+    >;
+
+    "log_named_array(string,uint256[])": TypedContractEvent<
+      log_named_array_string_uint256_array_Event.InputTuple,
+      log_named_array_string_uint256_array_Event.OutputTuple,
+      log_named_array_string_uint256_array_Event.OutputObject
+    >;
+    "log_named_array(string,int256[])": TypedContractEvent<
+      log_named_array_string_int256_array_Event.InputTuple,
+      log_named_array_string_int256_array_Event.OutputTuple,
+      log_named_array_string_int256_array_Event.OutputObject
+    >;
+    "log_named_array(string,address[])": TypedContractEvent<
+      log_named_array_string_address_array_Event.InputTuple,
+      log_named_array_string_address_array_Event.OutputTuple,
+      log_named_array_string_address_array_Event.OutputObject
+    >;
+
+    "log_named_bytes(string,bytes)": TypedContractEvent<
+      log_named_bytesEvent.InputTuple,
+      log_named_bytesEvent.OutputTuple,
+      log_named_bytesEvent.OutputObject
+    >;
+    log_named_bytes: TypedContractEvent<
+      log_named_bytesEvent.InputTuple,
+      log_named_bytesEvent.OutputTuple,
+      log_named_bytesEvent.OutputObject
+    >;
+
+    "log_named_bytes32(string,bytes32)": TypedContractEvent<
+      log_named_bytes32Event.InputTuple,
+      log_named_bytes32Event.OutputTuple,
+      log_named_bytes32Event.OutputObject
+    >;
+    log_named_bytes32: TypedContractEvent<
+      log_named_bytes32Event.InputTuple,
+      log_named_bytes32Event.OutputTuple,
+      log_named_bytes32Event.OutputObject
+    >;
+
+    "log_named_decimal_int(string,int256,uint256)": TypedContractEvent<
+      log_named_decimal_intEvent.InputTuple,
+      log_named_decimal_intEvent.OutputTuple,
+      log_named_decimal_intEvent.OutputObject
+    >;
+    log_named_decimal_int: TypedContractEvent<
+      log_named_decimal_intEvent.InputTuple,
+      log_named_decimal_intEvent.OutputTuple,
+      log_named_decimal_intEvent.OutputObject
+    >;
+
+    "log_named_decimal_uint(string,uint256,uint256)": TypedContractEvent<
+      log_named_decimal_uintEvent.InputTuple,
+      log_named_decimal_uintEvent.OutputTuple,
+      log_named_decimal_uintEvent.OutputObject
+    >;
+    log_named_decimal_uint: TypedContractEvent<
+      log_named_decimal_uintEvent.InputTuple,
+      log_named_decimal_uintEvent.OutputTuple,
+      log_named_decimal_uintEvent.OutputObject
+    >;
+
+    "log_named_int(string,int256)": TypedContractEvent<
+      log_named_intEvent.InputTuple,
+      log_named_intEvent.OutputTuple,
+      log_named_intEvent.OutputObject
+    >;
+    log_named_int: TypedContractEvent<
+      log_named_intEvent.InputTuple,
+      log_named_intEvent.OutputTuple,
+      log_named_intEvent.OutputObject
+    >;
+
+    "log_named_string(string,string)": TypedContractEvent<
+      log_named_stringEvent.InputTuple,
+      log_named_stringEvent.OutputTuple,
+      log_named_stringEvent.OutputObject
+    >;
+    log_named_string: TypedContractEvent<
+      log_named_stringEvent.InputTuple,
+      log_named_stringEvent.OutputTuple,
+      log_named_stringEvent.OutputObject
+    >;
+
+    "log_named_uint(string,uint256)": TypedContractEvent<
+      log_named_uintEvent.InputTuple,
+      log_named_uintEvent.OutputTuple,
+      log_named_uintEvent.OutputObject
+    >;
+    log_named_uint: TypedContractEvent<
+      log_named_uintEvent.InputTuple,
+      log_named_uintEvent.OutputTuple,
+      log_named_uintEvent.OutputObject
+    >;
+
+    "log_string(string)": TypedContractEvent<
+      log_stringEvent.InputTuple,
+      log_stringEvent.OutputTuple,
+      log_stringEvent.OutputObject
+    >;
+    log_string: TypedContractEvent<
+      log_stringEvent.InputTuple,
+      log_stringEvent.OutputTuple,
+      log_stringEvent.OutputObject
+    >;
+
+    "log_uint(uint256)": TypedContractEvent<
+      log_uintEvent.InputTuple,
+      log_uintEvent.OutputTuple,
+      log_uintEvent.OutputObject
+    >;
+    log_uint: TypedContractEvent<
+      log_uintEvent.InputTuple,
+      log_uintEvent.OutputTuple,
+      log_uintEvent.OutputObject
+    >;
+
+    "logs(bytes)": TypedContractEvent<
+      logsEvent.InputTuple,
+      logsEvent.OutputTuple,
+      logsEvent.OutputObject
+    >;
+    logs: TypedContractEvent<
+      logsEvent.InputTuple,
+      logsEvent.OutputTuple,
+      logsEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/Vm.sol/Vm.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/Vm.sol/Vm.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bb9edce14297225fab969fcf27fc0ed69142464f
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/Vm.sol/Vm.ts
@@ -0,0 +1,7850 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export declare namespace VmSafe {
+  export type WalletStruct = {
+    addr: AddressLike;
+    publicKeyX: BigNumberish;
+    publicKeyY: BigNumberish;
+    privateKey: BigNumberish;
+  };
+
+  export type WalletStructOutput = [
+    addr: string,
+    publicKeyX: bigint,
+    publicKeyY: bigint,
+    privateKey: bigint
+  ] & {
+    addr: string;
+    publicKeyX: bigint;
+    publicKeyY: bigint;
+    privateKey: bigint;
+  };
+
+  export type EthGetLogsStruct = {
+    emitter: AddressLike;
+    topics: BytesLike[];
+    data: BytesLike;
+    blockHash: BytesLike;
+    blockNumber: BigNumberish;
+    transactionHash: BytesLike;
+    transactionIndex: BigNumberish;
+    logIndex: BigNumberish;
+    removed: boolean;
+  };
+
+  export type EthGetLogsStructOutput = [
+    emitter: string,
+    topics: string[],
+    data: string,
+    blockHash: string,
+    blockNumber: bigint,
+    transactionHash: string,
+    transactionIndex: bigint,
+    logIndex: bigint,
+    removed: boolean
+  ] & {
+    emitter: string;
+    topics: string[];
+    data: string;
+    blockHash: string;
+    blockNumber: bigint;
+    transactionHash: string;
+    transactionIndex: bigint;
+    logIndex: bigint;
+    removed: boolean;
+  };
+
+  export type FsMetadataStruct = {
+    isDir: boolean;
+    isSymlink: boolean;
+    length: BigNumberish;
+    readOnly: boolean;
+    modified: BigNumberish;
+    accessed: BigNumberish;
+    created: BigNumberish;
+  };
+
+  export type FsMetadataStructOutput = [
+    isDir: boolean,
+    isSymlink: boolean,
+    length: bigint,
+    readOnly: boolean,
+    modified: bigint,
+    accessed: bigint,
+    created: bigint
+  ] & {
+    isDir: boolean;
+    isSymlink: boolean;
+    length: bigint;
+    readOnly: boolean;
+    modified: bigint;
+    accessed: bigint;
+    created: bigint;
+  };
+
+  export type LogStruct = {
+    topics: BytesLike[];
+    data: BytesLike;
+    emitter: AddressLike;
+  };
+
+  export type LogStructOutput = [
+    topics: string[],
+    data: string,
+    emitter: string
+  ] & { topics: string[]; data: string; emitter: string };
+
+  export type GasStruct = {
+    gasLimit: BigNumberish;
+    gasTotalUsed: BigNumberish;
+    gasMemoryUsed: BigNumberish;
+    gasRefunded: BigNumberish;
+    gasRemaining: BigNumberish;
+  };
+
+  export type GasStructOutput = [
+    gasLimit: bigint,
+    gasTotalUsed: bigint,
+    gasMemoryUsed: bigint,
+    gasRefunded: bigint,
+    gasRemaining: bigint
+  ] & {
+    gasLimit: bigint;
+    gasTotalUsed: bigint;
+    gasMemoryUsed: bigint;
+    gasRefunded: bigint;
+    gasRemaining: bigint;
+  };
+
+  export type DirEntryStruct = {
+    errorMessage: string;
+    path: string;
+    depth: BigNumberish;
+    isDir: boolean;
+    isSymlink: boolean;
+  };
+
+  export type DirEntryStructOutput = [
+    errorMessage: string,
+    path: string,
+    depth: bigint,
+    isDir: boolean,
+    isSymlink: boolean
+  ] & {
+    errorMessage: string;
+    path: string;
+    depth: bigint;
+    isDir: boolean;
+    isSymlink: boolean;
+  };
+
+  export type RpcStruct = { key: string; url: string };
+
+  export type RpcStructOutput = [key: string, url: string] & {
+    key: string;
+    url: string;
+  };
+
+  export type ChainInfoStruct = { forkId: BigNumberish; chainId: BigNumberish };
+
+  export type ChainInfoStructOutput = [forkId: bigint, chainId: bigint] & {
+    forkId: bigint;
+    chainId: bigint;
+  };
+
+  export type StorageAccessStruct = {
+    account: AddressLike;
+    slot: BytesLike;
+    isWrite: boolean;
+    previousValue: BytesLike;
+    newValue: BytesLike;
+    reverted: boolean;
+  };
+
+  export type StorageAccessStructOutput = [
+    account: string,
+    slot: string,
+    isWrite: boolean,
+    previousValue: string,
+    newValue: string,
+    reverted: boolean
+  ] & {
+    account: string;
+    slot: string;
+    isWrite: boolean;
+    previousValue: string;
+    newValue: string;
+    reverted: boolean;
+  };
+
+  export type AccountAccessStruct = {
+    chainInfo: VmSafe.ChainInfoStruct;
+    kind: BigNumberish;
+    account: AddressLike;
+    accessor: AddressLike;
+    initialized: boolean;
+    oldBalance: BigNumberish;
+    newBalance: BigNumberish;
+    deployedCode: BytesLike;
+    value: BigNumberish;
+    data: BytesLike;
+    reverted: boolean;
+    storageAccesses: VmSafe.StorageAccessStruct[];
+    depth: BigNumberish;
+  };
+
+  export type AccountAccessStructOutput = [
+    chainInfo: VmSafe.ChainInfoStructOutput,
+    kind: bigint,
+    account: string,
+    accessor: string,
+    initialized: boolean,
+    oldBalance: bigint,
+    newBalance: bigint,
+    deployedCode: string,
+    value: bigint,
+    data: string,
+    reverted: boolean,
+    storageAccesses: VmSafe.StorageAccessStructOutput[],
+    depth: bigint
+  ] & {
+    chainInfo: VmSafe.ChainInfoStructOutput;
+    kind: bigint;
+    account: string;
+    accessor: string;
+    initialized: boolean;
+    oldBalance: bigint;
+    newBalance: bigint;
+    deployedCode: string;
+    value: bigint;
+    data: string;
+    reverted: boolean;
+    storageAccesses: VmSafe.StorageAccessStructOutput[];
+    depth: bigint;
+  };
+
+  export type FfiResultStruct = {
+    exitCode: BigNumberish;
+    stdout: BytesLike;
+    stderr: BytesLike;
+  };
+
+  export type FfiResultStructOutput = [
+    exitCode: bigint,
+    stdout: string,
+    stderr: string
+  ] & { exitCode: bigint; stdout: string; stderr: string };
+}
+
+export interface VmInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "accesses"
+      | "activeFork"
+      | "addr"
+      | "allowCheatcodes"
+      | "assertApproxEqAbs(uint256,uint256,uint256)"
+      | "assertApproxEqAbs(int256,int256,uint256)"
+      | "assertApproxEqAbs(int256,int256,uint256,string)"
+      | "assertApproxEqAbs(uint256,uint256,uint256,string)"
+      | "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256)"
+      | "assertApproxEqAbsDecimal(int256,int256,uint256,uint256)"
+      | "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256,string)"
+      | "assertApproxEqAbsDecimal(int256,int256,uint256,uint256,string)"
+      | "assertApproxEqRel(uint256,uint256,uint256,string)"
+      | "assertApproxEqRel(uint256,uint256,uint256)"
+      | "assertApproxEqRel(int256,int256,uint256,string)"
+      | "assertApproxEqRel(int256,int256,uint256)"
+      | "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256)"
+      | "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256,string)"
+      | "assertApproxEqRelDecimal(int256,int256,uint256,uint256)"
+      | "assertApproxEqRelDecimal(int256,int256,uint256,uint256,string)"
+      | "assertEq(bytes32[],bytes32[])"
+      | "assertEq(int256[],int256[],string)"
+      | "assertEq(address,address,string)"
+      | "assertEq(string,string,string)"
+      | "assertEq(address[],address[])"
+      | "assertEq(address[],address[],string)"
+      | "assertEq(bool,bool,string)"
+      | "assertEq(address,address)"
+      | "assertEq(uint256[],uint256[],string)"
+      | "assertEq(bool[],bool[])"
+      | "assertEq(int256[],int256[])"
+      | "assertEq(int256,int256,string)"
+      | "assertEq(bytes32,bytes32)"
+      | "assertEq(uint256,uint256,string)"
+      | "assertEq(uint256[],uint256[])"
+      | "assertEq(bytes,bytes)"
+      | "assertEq(uint256,uint256)"
+      | "assertEq(bytes32,bytes32,string)"
+      | "assertEq(string[],string[])"
+      | "assertEq(bytes32[],bytes32[],string)"
+      | "assertEq(bytes,bytes,string)"
+      | "assertEq(bool[],bool[],string)"
+      | "assertEq(bytes[],bytes[])"
+      | "assertEq(string[],string[],string)"
+      | "assertEq(string,string)"
+      | "assertEq(bytes[],bytes[],string)"
+      | "assertEq(bool,bool)"
+      | "assertEq(int256,int256)"
+      | "assertEqDecimal(uint256,uint256,uint256)"
+      | "assertEqDecimal(int256,int256,uint256)"
+      | "assertEqDecimal(int256,int256,uint256,string)"
+      | "assertEqDecimal(uint256,uint256,uint256,string)"
+      | "assertFalse(bool,string)"
+      | "assertFalse(bool)"
+      | "assertGe(int256,int256)"
+      | "assertGe(int256,int256,string)"
+      | "assertGe(uint256,uint256)"
+      | "assertGe(uint256,uint256,string)"
+      | "assertGeDecimal(uint256,uint256,uint256)"
+      | "assertGeDecimal(int256,int256,uint256,string)"
+      | "assertGeDecimal(uint256,uint256,uint256,string)"
+      | "assertGeDecimal(int256,int256,uint256)"
+      | "assertGt(int256,int256)"
+      | "assertGt(uint256,uint256,string)"
+      | "assertGt(uint256,uint256)"
+      | "assertGt(int256,int256,string)"
+      | "assertGtDecimal(int256,int256,uint256,string)"
+      | "assertGtDecimal(uint256,uint256,uint256,string)"
+      | "assertGtDecimal(int256,int256,uint256)"
+      | "assertGtDecimal(uint256,uint256,uint256)"
+      | "assertLe(int256,int256,string)"
+      | "assertLe(uint256,uint256)"
+      | "assertLe(int256,int256)"
+      | "assertLe(uint256,uint256,string)"
+      | "assertLeDecimal(int256,int256,uint256)"
+      | "assertLeDecimal(uint256,uint256,uint256,string)"
+      | "assertLeDecimal(int256,int256,uint256,string)"
+      | "assertLeDecimal(uint256,uint256,uint256)"
+      | "assertLt(int256,int256)"
+      | "assertLt(uint256,uint256,string)"
+      | "assertLt(int256,int256,string)"
+      | "assertLt(uint256,uint256)"
+      | "assertLtDecimal(uint256,uint256,uint256)"
+      | "assertLtDecimal(int256,int256,uint256,string)"
+      | "assertLtDecimal(uint256,uint256,uint256,string)"
+      | "assertLtDecimal(int256,int256,uint256)"
+      | "assertNotEq(bytes32[],bytes32[])"
+      | "assertNotEq(int256[],int256[])"
+      | "assertNotEq(bool,bool,string)"
+      | "assertNotEq(bytes[],bytes[],string)"
+      | "assertNotEq(bool,bool)"
+      | "assertNotEq(bool[],bool[])"
+      | "assertNotEq(bytes,bytes)"
+      | "assertNotEq(address[],address[])"
+      | "assertNotEq(int256,int256,string)"
+      | "assertNotEq(uint256[],uint256[])"
+      | "assertNotEq(bool[],bool[],string)"
+      | "assertNotEq(string,string)"
+      | "assertNotEq(address[],address[],string)"
+      | "assertNotEq(string,string,string)"
+      | "assertNotEq(address,address,string)"
+      | "assertNotEq(bytes32,bytes32)"
+      | "assertNotEq(bytes,bytes,string)"
+      | "assertNotEq(uint256,uint256,string)"
+      | "assertNotEq(uint256[],uint256[],string)"
+      | "assertNotEq(address,address)"
+      | "assertNotEq(bytes32,bytes32,string)"
+      | "assertNotEq(string[],string[],string)"
+      | "assertNotEq(uint256,uint256)"
+      | "assertNotEq(bytes32[],bytes32[],string)"
+      | "assertNotEq(string[],string[])"
+      | "assertNotEq(int256[],int256[],string)"
+      | "assertNotEq(bytes[],bytes[])"
+      | "assertNotEq(int256,int256)"
+      | "assertNotEqDecimal(int256,int256,uint256)"
+      | "assertNotEqDecimal(int256,int256,uint256,string)"
+      | "assertNotEqDecimal(uint256,uint256,uint256)"
+      | "assertNotEqDecimal(uint256,uint256,uint256,string)"
+      | "assertTrue(bool)"
+      | "assertTrue(bool,string)"
+      | "assume"
+      | "blobBaseFee"
+      | "blobhashes"
+      | "breakpoint(string)"
+      | "breakpoint(string,bool)"
+      | "broadcast()"
+      | "broadcast(address)"
+      | "broadcast(uint256)"
+      | "chainId"
+      | "clearMockedCalls"
+      | "closeFile"
+      | "coinbase"
+      | "computeCreate2Address(bytes32,bytes32)"
+      | "computeCreate2Address(bytes32,bytes32,address)"
+      | "computeCreateAddress"
+      | "copyFile"
+      | "createDir"
+      | "createFork(string)"
+      | "createFork(string,uint256)"
+      | "createFork(string,bytes32)"
+      | "createSelectFork(string,uint256)"
+      | "createSelectFork(string,bytes32)"
+      | "createSelectFork(string)"
+      | "createWallet(string)"
+      | "createWallet(uint256)"
+      | "createWallet(uint256,string)"
+      | "deal"
+      | "deleteSnapshot"
+      | "deleteSnapshots"
+      | "deriveKey(string,string,uint32,string)"
+      | "deriveKey(string,uint32,string)"
+      | "deriveKey(string,uint32)"
+      | "deriveKey(string,string,uint32)"
+      | "difficulty"
+      | "dumpState"
+      | "ensNamehash"
+      | "envAddress(string)"
+      | "envAddress(string,string)"
+      | "envBool(string)"
+      | "envBool(string,string)"
+      | "envBytes(string)"
+      | "envBytes(string,string)"
+      | "envBytes32(string,string)"
+      | "envBytes32(string)"
+      | "envExists"
+      | "envInt(string,string)"
+      | "envInt(string)"
+      | "envOr(string,string,bytes32[])"
+      | "envOr(string,string,int256[])"
+      | "envOr(string,bool)"
+      | "envOr(string,address)"
+      | "envOr(string,uint256)"
+      | "envOr(string,string,bytes[])"
+      | "envOr(string,string,uint256[])"
+      | "envOr(string,string,string[])"
+      | "envOr(string,bytes)"
+      | "envOr(string,bytes32)"
+      | "envOr(string,int256)"
+      | "envOr(string,string,address[])"
+      | "envOr(string,string)"
+      | "envOr(string,string,bool[])"
+      | "envString(string,string)"
+      | "envString(string)"
+      | "envUint(string)"
+      | "envUint(string,string)"
+      | "etch"
+      | "eth_getLogs"
+      | "exists"
+      | "expectCall(address,uint256,uint64,bytes)"
+      | "expectCall(address,uint256,uint64,bytes,uint64)"
+      | "expectCall(address,uint256,bytes,uint64)"
+      | "expectCall(address,bytes)"
+      | "expectCall(address,bytes,uint64)"
+      | "expectCall(address,uint256,bytes)"
+      | "expectCallMinGas(address,uint256,uint64,bytes)"
+      | "expectCallMinGas(address,uint256,uint64,bytes,uint64)"
+      | "expectEmit()"
+      | "expectEmit(bool,bool,bool,bool)"
+      | "expectEmit(bool,bool,bool,bool,address)"
+      | "expectEmit(address)"
+      | "expectRevert(bytes4)"
+      | "expectRevert(bytes)"
+      | "expectRevert()"
+      | "expectSafeMemory"
+      | "expectSafeMemoryCall"
+      | "fee"
+      | "ffi"
+      | "fsMetadata"
+      | "getBlobBaseFee"
+      | "getBlobhashes"
+      | "getBlockNumber"
+      | "getBlockTimestamp"
+      | "getCode"
+      | "getDeployedCode"
+      | "getLabel"
+      | "getMappingKeyAndParentOf"
+      | "getMappingLength"
+      | "getMappingSlotAt"
+      | "getNonce(address)"
+      | "getNonce((address,uint256,uint256,uint256))"
+      | "getRecordedLogs"
+      | "indexOf"
+      | "isContext"
+      | "isDir"
+      | "isFile"
+      | "isPersistent"
+      | "keyExists"
+      | "keyExistsJson"
+      | "keyExistsToml"
+      | "label"
+      | "lastCallGas"
+      | "load"
+      | "loadAllocs"
+      | "makePersistent(address[])"
+      | "makePersistent(address,address)"
+      | "makePersistent(address)"
+      | "makePersistent(address,address,address)"
+      | "mockCall(address,uint256,bytes,bytes)"
+      | "mockCall(address,bytes,bytes)"
+      | "mockCallRevert(address,uint256,bytes,bytes)"
+      | "mockCallRevert(address,bytes,bytes)"
+      | "parseAddress"
+      | "parseBool"
+      | "parseBytes"
+      | "parseBytes32"
+      | "parseInt"
+      | "parseJson(string)"
+      | "parseJson(string,string)"
+      | "parseJsonAddress"
+      | "parseJsonAddressArray"
+      | "parseJsonBool"
+      | "parseJsonBoolArray"
+      | "parseJsonBytes"
+      | "parseJsonBytes32"
+      | "parseJsonBytes32Array"
+      | "parseJsonBytesArray"
+      | "parseJsonInt"
+      | "parseJsonIntArray"
+      | "parseJsonKeys"
+      | "parseJsonString"
+      | "parseJsonStringArray"
+      | "parseJsonUint"
+      | "parseJsonUintArray"
+      | "parseToml(string,string)"
+      | "parseToml(string)"
+      | "parseTomlAddress"
+      | "parseTomlAddressArray"
+      | "parseTomlBool"
+      | "parseTomlBoolArray"
+      | "parseTomlBytes"
+      | "parseTomlBytes32"
+      | "parseTomlBytes32Array"
+      | "parseTomlBytesArray"
+      | "parseTomlInt"
+      | "parseTomlIntArray"
+      | "parseTomlKeys"
+      | "parseTomlString"
+      | "parseTomlStringArray"
+      | "parseTomlUint"
+      | "parseTomlUintArray"
+      | "parseUint"
+      | "pauseGasMetering"
+      | "prank(address,address)"
+      | "prank(address)"
+      | "prevrandao(bytes32)"
+      | "prevrandao(uint256)"
+      | "projectRoot"
+      | "prompt"
+      | "promptAddress"
+      | "promptSecret"
+      | "promptUint"
+      | "readCallers"
+      | "readDir(string,uint64)"
+      | "readDir(string,uint64,bool)"
+      | "readDir(string)"
+      | "readFile"
+      | "readFileBinary"
+      | "readLine"
+      | "readLink"
+      | "record"
+      | "recordLogs"
+      | "rememberKey"
+      | "removeDir"
+      | "removeFile"
+      | "replace"
+      | "resetNonce"
+      | "resumeGasMetering"
+      | "revertTo"
+      | "revertToAndDelete"
+      | "revokePersistent(address[])"
+      | "revokePersistent(address)"
+      | "roll"
+      | "rollFork(bytes32)"
+      | "rollFork(uint256,uint256)"
+      | "rollFork(uint256)"
+      | "rollFork(uint256,bytes32)"
+      | "rpc"
+      | "rpcUrl"
+      | "rpcUrlStructs"
+      | "rpcUrls"
+      | "selectFork"
+      | "serializeAddress(string,string,address[])"
+      | "serializeAddress(string,string,address)"
+      | "serializeBool(string,string,bool[])"
+      | "serializeBool(string,string,bool)"
+      | "serializeBytes(string,string,bytes[])"
+      | "serializeBytes(string,string,bytes)"
+      | "serializeBytes32(string,string,bytes32[])"
+      | "serializeBytes32(string,string,bytes32)"
+      | "serializeInt(string,string,int256)"
+      | "serializeInt(string,string,int256[])"
+      | "serializeJson"
+      | "serializeString(string,string,string[])"
+      | "serializeString(string,string,string)"
+      | "serializeUint(string,string,uint256)"
+      | "serializeUint(string,string,uint256[])"
+      | "serializeUintToHex"
+      | "setEnv"
+      | "setNonce"
+      | "setNonceUnsafe"
+      | "sign(bytes32)"
+      | "sign(address,bytes32)"
+      | "sign((address,uint256,uint256,uint256),bytes32)"
+      | "sign(uint256,bytes32)"
+      | "signP256"
+      | "skip"
+      | "sleep"
+      | "snapshot"
+      | "split"
+      | "startBroadcast()"
+      | "startBroadcast(address)"
+      | "startBroadcast(uint256)"
+      | "startMappingRecording"
+      | "startPrank(address)"
+      | "startPrank(address,address)"
+      | "startStateDiffRecording"
+      | "stopAndReturnStateDiff"
+      | "stopBroadcast"
+      | "stopExpectSafeMemory"
+      | "stopMappingRecording"
+      | "stopPrank"
+      | "store"
+      | "toBase64(string)"
+      | "toBase64(bytes)"
+      | "toBase64URL(string)"
+      | "toBase64URL(bytes)"
+      | "toLowercase"
+      | "toString(address)"
+      | "toString(uint256)"
+      | "toString(bytes)"
+      | "toString(bool)"
+      | "toString(int256)"
+      | "toString(bytes32)"
+      | "toUppercase"
+      | "transact(uint256,bytes32)"
+      | "transact(bytes32)"
+      | "trim"
+      | "tryFfi"
+      | "txGasPrice"
+      | "unixTime"
+      | "warp"
+      | "writeFile"
+      | "writeFileBinary"
+      | "writeJson(string,string,string)"
+      | "writeJson(string,string)"
+      | "writeLine"
+      | "writeToml(string,string,string)"
+      | "writeToml(string,string)"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "accesses",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "activeFork",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "addr", values: [BigNumberish]): string;
+  encodeFunctionData(
+    functionFragment: "allowCheatcodes",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbs(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbs(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbs(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbs(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRel(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRel(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRel(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRel(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRelDecimal(int256,int256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRelDecimal(int256,int256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes32[],bytes32[])",
+    values: [BytesLike[], BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(int256[],int256[],string)",
+    values: [BigNumberish[], BigNumberish[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(address,address,string)",
+    values: [AddressLike, AddressLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(string,string,string)",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(address[],address[])",
+    values: [AddressLike[], AddressLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(address[],address[],string)",
+    values: [AddressLike[], AddressLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bool,bool,string)",
+    values: [boolean, boolean, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(address,address)",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(uint256[],uint256[],string)",
+    values: [BigNumberish[], BigNumberish[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bool[],bool[])",
+    values: [boolean[], boolean[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(int256[],int256[])",
+    values: [BigNumberish[], BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes32,bytes32)",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(uint256[],uint256[])",
+    values: [BigNumberish[], BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes,bytes)",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes32,bytes32,string)",
+    values: [BytesLike, BytesLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(string[],string[])",
+    values: [string[], string[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes32[],bytes32[],string)",
+    values: [BytesLike[], BytesLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes,bytes,string)",
+    values: [BytesLike, BytesLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bool[],bool[],string)",
+    values: [boolean[], boolean[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes[],bytes[])",
+    values: [BytesLike[], BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(string[],string[],string)",
+    values: [string[], string[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes[],bytes[],string)",
+    values: [BytesLike[], BytesLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bool,bool)",
+    values: [boolean, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEqDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEqDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEqDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEqDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertFalse(bool,string)",
+    values: [boolean, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertFalse(bool)",
+    values: [boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGe(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGe(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGe(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGe(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGeDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGeDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGeDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGeDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGt(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGt(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGt(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGt(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGtDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGtDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGtDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGtDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLe(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLe(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLe(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLe(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLeDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLeDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLeDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLeDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLt(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLt(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLt(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLt(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLtDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLtDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLtDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLtDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes32[],bytes32[])",
+    values: [BytesLike[], BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(int256[],int256[])",
+    values: [BigNumberish[], BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bool,bool,string)",
+    values: [boolean, boolean, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes[],bytes[],string)",
+    values: [BytesLike[], BytesLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bool,bool)",
+    values: [boolean, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bool[],bool[])",
+    values: [boolean[], boolean[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes,bytes)",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(address[],address[])",
+    values: [AddressLike[], AddressLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(uint256[],uint256[])",
+    values: [BigNumberish[], BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bool[],bool[],string)",
+    values: [boolean[], boolean[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(address[],address[],string)",
+    values: [AddressLike[], AddressLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(string,string,string)",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(address,address,string)",
+    values: [AddressLike, AddressLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes32,bytes32)",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes,bytes,string)",
+    values: [BytesLike, BytesLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(uint256[],uint256[],string)",
+    values: [BigNumberish[], BigNumberish[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(address,address)",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes32,bytes32,string)",
+    values: [BytesLike, BytesLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(string[],string[],string)",
+    values: [string[], string[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes32[],bytes32[],string)",
+    values: [BytesLike[], BytesLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(string[],string[])",
+    values: [string[], string[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(int256[],int256[],string)",
+    values: [BigNumberish[], BigNumberish[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes[],bytes[])",
+    values: [BytesLike[], BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEqDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEqDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEqDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEqDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertTrue(bool)",
+    values: [boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertTrue(bool,string)",
+    values: [boolean, string]
+  ): string;
+  encodeFunctionData(functionFragment: "assume", values: [boolean]): string;
+  encodeFunctionData(
+    functionFragment: "blobBaseFee",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "blobhashes",
+    values: [BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "breakpoint(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "breakpoint(string,bool)",
+    values: [string, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "broadcast()",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "broadcast(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "broadcast(uint256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "chainId",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "clearMockedCalls",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "closeFile", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "coinbase",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "computeCreate2Address(bytes32,bytes32)",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "computeCreate2Address(bytes32,bytes32,address)",
+    values: [BytesLike, BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "computeCreateAddress",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "copyFile",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createDir",
+    values: [string, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createFork(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createFork(string,uint256)",
+    values: [string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createFork(string,bytes32)",
+    values: [string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createSelectFork(string,uint256)",
+    values: [string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createSelectFork(string,bytes32)",
+    values: [string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createSelectFork(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createWallet(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createWallet(uint256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createWallet(uint256,string)",
+    values: [BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "deal",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "deleteSnapshot",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "deleteSnapshots",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "deriveKey(string,string,uint32,string)",
+    values: [string, string, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "deriveKey(string,uint32,string)",
+    values: [string, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "deriveKey(string,uint32)",
+    values: [string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "deriveKey(string,string,uint32)",
+    values: [string, string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "difficulty",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "dumpState", values: [string]): string;
+  encodeFunctionData(functionFragment: "ensNamehash", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "envAddress(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envAddress(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBool(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBool(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBytes(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBytes(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBytes32(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBytes32(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "envExists", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "envInt(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envInt(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,bytes32[])",
+    values: [string, string, BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,int256[])",
+    values: [string, string, BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,bool)",
+    values: [string, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,address)",
+    values: [string, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,uint256)",
+    values: [string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,bytes[])",
+    values: [string, string, BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,uint256[])",
+    values: [string, string, BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,string[])",
+    values: [string, string, string[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,bytes)",
+    values: [string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,bytes32)",
+    values: [string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,int256)",
+    values: [string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,address[])",
+    values: [string, string, AddressLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,bool[])",
+    values: [string, string, boolean[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envString(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envString(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envUint(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envUint(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "etch",
+    values: [AddressLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "eth_getLogs",
+    values: [BigNumberish, BigNumberish, AddressLike, BytesLike[]]
+  ): string;
+  encodeFunctionData(functionFragment: "exists", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "expectCall(address,uint256,uint64,bytes)",
+    values: [AddressLike, BigNumberish, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectCall(address,uint256,uint64,bytes,uint64)",
+    values: [AddressLike, BigNumberish, BigNumberish, BytesLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectCall(address,uint256,bytes,uint64)",
+    values: [AddressLike, BigNumberish, BytesLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectCall(address,bytes)",
+    values: [AddressLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectCall(address,bytes,uint64)",
+    values: [AddressLike, BytesLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectCall(address,uint256,bytes)",
+    values: [AddressLike, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectCallMinGas(address,uint256,uint64,bytes)",
+    values: [AddressLike, BigNumberish, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectCallMinGas(address,uint256,uint64,bytes,uint64)",
+    values: [AddressLike, BigNumberish, BigNumberish, BytesLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectEmit()",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectEmit(bool,bool,bool,bool)",
+    values: [boolean, boolean, boolean, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectEmit(bool,bool,bool,bool,address)",
+    values: [boolean, boolean, boolean, boolean, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectEmit(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectRevert(bytes4)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectRevert(bytes)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectRevert()",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectSafeMemory",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "expectSafeMemoryCall",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "fee", values: [BigNumberish]): string;
+  encodeFunctionData(functionFragment: "ffi", values: [string[]]): string;
+  encodeFunctionData(functionFragment: "fsMetadata", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "getBlobBaseFee",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getBlobhashes",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getBlockNumber",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getBlockTimestamp",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "getCode", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "getDeployedCode",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getLabel",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getMappingKeyAndParentOf",
+    values: [AddressLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getMappingLength",
+    values: [AddressLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getMappingSlotAt",
+    values: [AddressLike, BytesLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getNonce(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getNonce((address,uint256,uint256,uint256))",
+    values: [VmSafe.WalletStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getRecordedLogs",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "indexOf",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "isContext",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "isDir", values: [string]): string;
+  encodeFunctionData(functionFragment: "isFile", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "isPersistent",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "keyExists",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "keyExistsJson",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "keyExistsToml",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "label",
+    values: [AddressLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "lastCallGas",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "load",
+    values: [AddressLike, BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "loadAllocs", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "makePersistent(address[])",
+    values: [AddressLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "makePersistent(address,address)",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "makePersistent(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "makePersistent(address,address,address)",
+    values: [AddressLike, AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "mockCall(address,uint256,bytes,bytes)",
+    values: [AddressLike, BigNumberish, BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "mockCall(address,bytes,bytes)",
+    values: [AddressLike, BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "mockCallRevert(address,uint256,bytes,bytes)",
+    values: [AddressLike, BigNumberish, BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "mockCallRevert(address,bytes,bytes)",
+    values: [AddressLike, BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseAddress",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "parseBool", values: [string]): string;
+  encodeFunctionData(functionFragment: "parseBytes", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "parseBytes32",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "parseInt", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "parseJson(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJson(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonAddress",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonAddressArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBool",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBoolArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBytes",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBytes32",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBytes32Array",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBytesArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonInt",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonIntArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonKeys",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonString",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonStringArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonUint",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonUintArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseToml(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseToml(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlAddress",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlAddressArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBool",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBoolArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBytes",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBytes32",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBytes32Array",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBytesArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlInt",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlIntArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlKeys",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlString",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlStringArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlUint",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlUintArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(functionFragment: "parseUint", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "pauseGasMetering",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "prank(address,address)",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "prank(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "prevrandao(bytes32)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "prevrandao(uint256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "projectRoot",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "prompt", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "promptAddress",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "promptSecret",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "promptUint", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "readCallers",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "readDir(string,uint64)",
+    values: [string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "readDir(string,uint64,bool)",
+    values: [string, BigNumberish, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "readDir(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "readFile", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "readFileBinary",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "readLine", values: [string]): string;
+  encodeFunctionData(functionFragment: "readLink", values: [string]): string;
+  encodeFunctionData(functionFragment: "record", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "recordLogs",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "rememberKey",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "removeDir",
+    values: [string, boolean]
+  ): string;
+  encodeFunctionData(functionFragment: "removeFile", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "replace",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "resetNonce",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "resumeGasMetering",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "revertTo",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "revertToAndDelete",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "revokePersistent(address[])",
+    values: [AddressLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "revokePersistent(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(functionFragment: "roll", values: [BigNumberish]): string;
+  encodeFunctionData(
+    functionFragment: "rollFork(bytes32)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "rollFork(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "rollFork(uint256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "rollFork(uint256,bytes32)",
+    values: [BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "rpc", values: [string, string]): string;
+  encodeFunctionData(functionFragment: "rpcUrl", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "rpcUrlStructs",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "rpcUrls", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "selectFork",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeAddress(string,string,address[])",
+    values: [string, string, AddressLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeAddress(string,string,address)",
+    values: [string, string, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBool(string,string,bool[])",
+    values: [string, string, boolean[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBool(string,string,bool)",
+    values: [string, string, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBytes(string,string,bytes[])",
+    values: [string, string, BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBytes(string,string,bytes)",
+    values: [string, string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBytes32(string,string,bytes32[])",
+    values: [string, string, BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBytes32(string,string,bytes32)",
+    values: [string, string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeInt(string,string,int256)",
+    values: [string, string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeInt(string,string,int256[])",
+    values: [string, string, BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeJson",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeString(string,string,string[])",
+    values: [string, string, string[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeString(string,string,string)",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeUint(string,string,uint256)",
+    values: [string, string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeUint(string,string,uint256[])",
+    values: [string, string, BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeUintToHex",
+    values: [string, string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "setEnv",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "setNonce",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "setNonceUnsafe",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "sign(bytes32)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "sign(address,bytes32)",
+    values: [AddressLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "sign((address,uint256,uint256,uint256),bytes32)",
+    values: [VmSafe.WalletStruct, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "sign(uint256,bytes32)",
+    values: [BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "signP256",
+    values: [BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "skip", values: [boolean]): string;
+  encodeFunctionData(functionFragment: "sleep", values: [BigNumberish]): string;
+  encodeFunctionData(functionFragment: "snapshot", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "split",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startBroadcast()",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startBroadcast(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startBroadcast(uint256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startMappingRecording",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startPrank(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startPrank(address,address)",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startStateDiffRecording",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "stopAndReturnStateDiff",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "stopBroadcast",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "stopExpectSafeMemory",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "stopMappingRecording",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "stopPrank", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "store",
+    values: [AddressLike, BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toBase64(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toBase64(bytes)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toBase64URL(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toBase64URL(bytes)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "toLowercase", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "toString(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toString(uint256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toString(bytes)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toString(bool)",
+    values: [boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toString(int256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toString(bytes32)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "toUppercase", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "transact(uint256,bytes32)",
+    values: [BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transact(bytes32)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "trim", values: [string]): string;
+  encodeFunctionData(functionFragment: "tryFfi", values: [string[]]): string;
+  encodeFunctionData(
+    functionFragment: "txGasPrice",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "unixTime", values?: undefined): string;
+  encodeFunctionData(functionFragment: "warp", values: [BigNumberish]): string;
+  encodeFunctionData(
+    functionFragment: "writeFile",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeFileBinary",
+    values: [string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeJson(string,string,string)",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeJson(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeLine",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeToml(string,string,string)",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeToml(string,string)",
+    values: [string, string]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "accesses", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "activeFork", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "addr", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "allowCheatcodes",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbs(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbs(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbs(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbs(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRel(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRel(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRel(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRel(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRelDecimal(int256,int256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRelDecimal(int256,int256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes32[],bytes32[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(int256[],int256[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(address,address,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(string,string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(address[],address[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(address[],address[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bool,bool,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(address,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(uint256[],uint256[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bool[],bool[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(int256[],int256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes32,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(uint256[],uint256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes32,bytes32,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(string[],string[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes32[],bytes32[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes,bytes,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bool[],bool[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes[],bytes[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(string[],string[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes[],bytes[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bool,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEqDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEqDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEqDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEqDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertFalse(bool,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertFalse(bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGe(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGe(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGe(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGe(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGeDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGeDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGeDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGeDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGt(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGt(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGt(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGt(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGtDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGtDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGtDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGtDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLe(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLe(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLe(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLe(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLeDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLeDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLeDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLeDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLt(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLt(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLt(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLt(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLtDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLtDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLtDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLtDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes32[],bytes32[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(int256[],int256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bool,bool,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes[],bytes[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bool,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bool[],bool[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(address[],address[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(uint256[],uint256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bool[],bool[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(address[],address[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(string,string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(address,address,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes32,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes,bytes,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(uint256[],uint256[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(address,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes32,bytes32,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(string[],string[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes32[],bytes32[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(string[],string[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(int256[],int256[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes[],bytes[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEqDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEqDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEqDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEqDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertTrue(bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertTrue(bool,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "assume", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "blobBaseFee",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "blobhashes", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "breakpoint(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "breakpoint(string,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "broadcast()",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "broadcast(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "broadcast(uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "chainId", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "clearMockedCalls",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "closeFile", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "coinbase", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "computeCreate2Address(bytes32,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "computeCreate2Address(bytes32,bytes32,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "computeCreateAddress",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "copyFile", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "createDir", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "createFork(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "createFork(string,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "createFork(string,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "createSelectFork(string,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "createSelectFork(string,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "createSelectFork(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "createWallet(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "createWallet(uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "createWallet(uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "deal", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "deleteSnapshot",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "deleteSnapshots",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "deriveKey(string,string,uint32,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "deriveKey(string,uint32,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "deriveKey(string,uint32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "deriveKey(string,string,uint32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "difficulty", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "dumpState", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "ensNamehash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envAddress(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envAddress(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBool(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBool(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBytes(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBytes(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBytes32(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBytes32(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "envExists", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "envInt(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envInt(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,bytes32[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,int256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,bytes[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,uint256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,string[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,address[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,bool[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envString(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envString(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envUint(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envUint(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "etch", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "eth_getLogs",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "exists", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "expectCall(address,uint256,uint64,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectCall(address,uint256,uint64,bytes,uint64)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectCall(address,uint256,bytes,uint64)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectCall(address,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectCall(address,bytes,uint64)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectCall(address,uint256,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectCallMinGas(address,uint256,uint64,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectCallMinGas(address,uint256,uint64,bytes,uint64)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectEmit()",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectEmit(bool,bool,bool,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectEmit(bool,bool,bool,bool,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectEmit(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectRevert(bytes4)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectRevert(bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectRevert()",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectSafeMemory",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "expectSafeMemoryCall",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "fee", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "ffi", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "fsMetadata", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getBlobBaseFee",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getBlobhashes",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getBlockNumber",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getBlockTimestamp",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "getCode", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getDeployedCode",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "getLabel", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getMappingKeyAndParentOf",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getMappingLength",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getMappingSlotAt",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getNonce(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getNonce((address,uint256,uint256,uint256))",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getRecordedLogs",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "indexOf", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "isContext", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "isDir", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "isFile", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "isPersistent",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "keyExists", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "keyExistsJson",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "keyExistsToml",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "label", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "lastCallGas",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "load", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "loadAllocs", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "makePersistent(address[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "makePersistent(address,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "makePersistent(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "makePersistent(address,address,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "mockCall(address,uint256,bytes,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "mockCall(address,bytes,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "mockCallRevert(address,uint256,bytes,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "mockCallRevert(address,bytes,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseAddress",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "parseBool", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "parseBytes", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "parseBytes32",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "parseInt", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJson(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJson(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonAddress",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonAddressArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBool",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBoolArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBytes",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBytes32",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBytes32Array",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBytesArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonInt",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonIntArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonKeys",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonString",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonStringArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonUint",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonUintArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseToml(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseToml(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlAddress",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlAddressArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBool",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBoolArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBytes",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBytes32",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBytes32Array",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBytesArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlInt",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlIntArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlKeys",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlString",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlStringArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlUint",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlUintArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "parseUint", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "pauseGasMetering",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "prank(address,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "prank(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "prevrandao(bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "prevrandao(uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "projectRoot",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "prompt", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "promptAddress",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "promptSecret",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "promptUint", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "readCallers",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "readDir(string,uint64)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "readDir(string,uint64,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "readDir(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "readFile", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "readFileBinary",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "readLine", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "readLink", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "record", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "recordLogs", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "rememberKey",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "removeDir", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "removeFile", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "replace", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "resetNonce", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "resumeGasMetering",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "revertTo", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "revertToAndDelete",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "revokePersistent(address[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "revokePersistent(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "roll", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "rollFork(bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "rollFork(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "rollFork(uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "rollFork(uint256,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "rpc", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "rpcUrl", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "rpcUrlStructs",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "rpcUrls", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "selectFork", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeAddress(string,string,address[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeAddress(string,string,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBool(string,string,bool[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBool(string,string,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBytes(string,string,bytes[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBytes(string,string,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBytes32(string,string,bytes32[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBytes32(string,string,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeInt(string,string,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeInt(string,string,int256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeJson",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeString(string,string,string[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeString(string,string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeUint(string,string,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeUint(string,string,uint256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeUintToHex",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "setEnv", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "setNonce", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "setNonceUnsafe",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "sign(bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "sign(address,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "sign((address,uint256,uint256,uint256),bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "sign(uint256,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "signP256", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "skip", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "sleep", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "snapshot", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "split", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "startBroadcast()",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "startBroadcast(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "startBroadcast(uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "startMappingRecording",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "startPrank(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "startPrank(address,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "startStateDiffRecording",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "stopAndReturnStateDiff",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "stopBroadcast",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "stopExpectSafeMemory",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "stopMappingRecording",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "stopPrank", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "store", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "toBase64(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toBase64(bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toBase64URL(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toBase64URL(bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toLowercase",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toUppercase",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "transact(uint256,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "transact(bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "trim", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "tryFfi", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "txGasPrice", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "unixTime", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "warp", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "writeFile", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "writeFileBinary",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "writeJson(string,string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "writeJson(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "writeLine", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "writeToml(string,string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "writeToml(string,string)",
+    data: BytesLike
+  ): Result;
+}
+
+export interface Vm extends BaseContract {
+  connect(runner?: ContractRunner | null): Vm;
+  waitForDeployment(): Promise<this>;
+
+  interface: VmInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  accesses: TypedContractMethod<
+    [target: AddressLike],
+    [[string[], string[]] & { readSlots: string[]; writeSlots: string[] }],
+    "nonpayable"
+  >;
+
+  activeFork: TypedContractMethod<[], [bigint], "view">;
+
+  addr: TypedContractMethod<[privateKey: BigNumberish], [string], "view">;
+
+  allowCheatcodes: TypedContractMethod<
+    [account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "assertApproxEqAbs(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbs(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbs(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbs(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbsDecimal(int256,int256,uint256,uint256)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbsDecimal(int256,int256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRel(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRel(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxPercentDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRel(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRel(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxPercentDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRelDecimal(int256,int256,uint256,uint256)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRelDecimal(int256,int256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes32[],bytes32[])": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(int256[],int256[],string)": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(address,address,string)": TypedContractMethod<
+    [left: AddressLike, right: AddressLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(string,string,string)": TypedContractMethod<
+    [left: string, right: string, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(address[],address[])": TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(address[],address[],string)": TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bool,bool,string)": TypedContractMethod<
+    [left: boolean, right: boolean, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(address,address)": TypedContractMethod<
+    [left: AddressLike, right: AddressLike],
+    [void],
+    "view"
+  >;
+
+  "assertEq(uint256[],uint256[],string)": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bool[],bool[])": TypedContractMethod<
+    [left: boolean[], right: boolean[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(int256[],int256[])": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes32,bytes32)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike],
+    [void],
+    "view"
+  >;
+
+  "assertEq(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(uint256[],uint256[])": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes,bytes)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike],
+    [void],
+    "view"
+  >;
+
+  "assertEq(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes32,bytes32,string)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(string[],string[])": TypedContractMethod<
+    [left: string[], right: string[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes32[],bytes32[],string)": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes,bytes,string)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bool[],bool[],string)": TypedContractMethod<
+    [left: boolean[], right: boolean[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes[],bytes[])": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(string[],string[],string)": TypedContractMethod<
+    [left: string[], right: string[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(string,string)": TypedContractMethod<
+    [left: string, right: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes[],bytes[],string)": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bool,bool)": TypedContractMethod<
+    [left: boolean, right: boolean],
+    [void],
+    "view"
+  >;
+
+  "assertEq(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertEqDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertEqDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertEqDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertEqDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertFalse(bool,string)": TypedContractMethod<
+    [condition: boolean, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertFalse(bool)": TypedContractMethod<
+    [condition: boolean],
+    [void],
+    "view"
+  >;
+
+  "assertGe(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGe(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertGe(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGe(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertGeDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGeDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertGeDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertGeDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGt(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGt(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertGt(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGt(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertGtDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertGtDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertGtDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGtDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLe(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertLe(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLe(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLe(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertLeDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLeDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertLeDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertLeDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLt(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLt(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertLt(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertLt(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLtDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLtDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertLtDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertLtDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes32[],bytes32[])": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(int256[],int256[])": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bool,bool,string)": TypedContractMethod<
+    [left: boolean, right: boolean, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes[],bytes[],string)": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bool,bool)": TypedContractMethod<
+    [left: boolean, right: boolean],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bool[],bool[])": TypedContractMethod<
+    [left: boolean[], right: boolean[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes,bytes)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(address[],address[])": TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(uint256[],uint256[])": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bool[],bool[],string)": TypedContractMethod<
+    [left: boolean[], right: boolean[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(string,string)": TypedContractMethod<
+    [left: string, right: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(address[],address[],string)": TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(string,string,string)": TypedContractMethod<
+    [left: string, right: string, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(address,address,string)": TypedContractMethod<
+    [left: AddressLike, right: AddressLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes32,bytes32)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes,bytes,string)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(uint256[],uint256[],string)": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(address,address)": TypedContractMethod<
+    [left: AddressLike, right: AddressLike],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes32,bytes32,string)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(string[],string[],string)": TypedContractMethod<
+    [left: string[], right: string[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes32[],bytes32[],string)": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(string[],string[])": TypedContractMethod<
+    [left: string[], right: string[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(int256[],int256[],string)": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes[],bytes[])": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertNotEqDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertNotEqDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertNotEqDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertNotEqDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertTrue(bool)": TypedContractMethod<[condition: boolean], [void], "view">;
+
+  "assertTrue(bool,string)": TypedContractMethod<
+    [condition: boolean, error: string],
+    [void],
+    "view"
+  >;
+
+  assume: TypedContractMethod<[condition: boolean], [void], "view">;
+
+  blobBaseFee: TypedContractMethod<
+    [newBlobBaseFee: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  blobhashes: TypedContractMethod<[hashes: BytesLike[]], [void], "nonpayable">;
+
+  "breakpoint(string)": TypedContractMethod<
+    [char: string],
+    [void],
+    "nonpayable"
+  >;
+
+  "breakpoint(string,bool)": TypedContractMethod<
+    [char: string, value: boolean],
+    [void],
+    "nonpayable"
+  >;
+
+  "broadcast()": TypedContractMethod<[], [void], "nonpayable">;
+
+  "broadcast(address)": TypedContractMethod<
+    [signer: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "broadcast(uint256)": TypedContractMethod<
+    [privateKey: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  chainId: TypedContractMethod<
+    [newChainId: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  clearMockedCalls: TypedContractMethod<[], [void], "nonpayable">;
+
+  closeFile: TypedContractMethod<[path: string], [void], "nonpayable">;
+
+  coinbase: TypedContractMethod<
+    [newCoinbase: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "computeCreate2Address(bytes32,bytes32)": TypedContractMethod<
+    [salt: BytesLike, initCodeHash: BytesLike],
+    [string],
+    "view"
+  >;
+
+  "computeCreate2Address(bytes32,bytes32,address)": TypedContractMethod<
+    [salt: BytesLike, initCodeHash: BytesLike, deployer: AddressLike],
+    [string],
+    "view"
+  >;
+
+  computeCreateAddress: TypedContractMethod<
+    [deployer: AddressLike, nonce: BigNumberish],
+    [string],
+    "view"
+  >;
+
+  copyFile: TypedContractMethod<
+    [from: string, to: string],
+    [bigint],
+    "nonpayable"
+  >;
+
+  createDir: TypedContractMethod<
+    [path: string, recursive: boolean],
+    [void],
+    "nonpayable"
+  >;
+
+  "createFork(string)": TypedContractMethod<
+    [urlOrAlias: string],
+    [bigint],
+    "nonpayable"
+  >;
+
+  "createFork(string,uint256)": TypedContractMethod<
+    [urlOrAlias: string, blockNumber: BigNumberish],
+    [bigint],
+    "nonpayable"
+  >;
+
+  "createFork(string,bytes32)": TypedContractMethod<
+    [urlOrAlias: string, txHash: BytesLike],
+    [bigint],
+    "nonpayable"
+  >;
+
+  "createSelectFork(string,uint256)": TypedContractMethod<
+    [urlOrAlias: string, blockNumber: BigNumberish],
+    [bigint],
+    "nonpayable"
+  >;
+
+  "createSelectFork(string,bytes32)": TypedContractMethod<
+    [urlOrAlias: string, txHash: BytesLike],
+    [bigint],
+    "nonpayable"
+  >;
+
+  "createSelectFork(string)": TypedContractMethod<
+    [urlOrAlias: string],
+    [bigint],
+    "nonpayable"
+  >;
+
+  "createWallet(string)": TypedContractMethod<
+    [walletLabel: string],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+
+  "createWallet(uint256)": TypedContractMethod<
+    [privateKey: BigNumberish],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+
+  "createWallet(uint256,string)": TypedContractMethod<
+    [privateKey: BigNumberish, walletLabel: string],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+
+  deal: TypedContractMethod<
+    [account: AddressLike, newBalance: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  deleteSnapshot: TypedContractMethod<
+    [snapshotId: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  deleteSnapshots: TypedContractMethod<[], [void], "nonpayable">;
+
+  "deriveKey(string,string,uint32,string)": TypedContractMethod<
+    [
+      mnemonic: string,
+      derivationPath: string,
+      index: BigNumberish,
+      language: string
+    ],
+    [bigint],
+    "view"
+  >;
+
+  "deriveKey(string,uint32,string)": TypedContractMethod<
+    [mnemonic: string, index: BigNumberish, language: string],
+    [bigint],
+    "view"
+  >;
+
+  "deriveKey(string,uint32)": TypedContractMethod<
+    [mnemonic: string, index: BigNumberish],
+    [bigint],
+    "view"
+  >;
+
+  "deriveKey(string,string,uint32)": TypedContractMethod<
+    [mnemonic: string, derivationPath: string, index: BigNumberish],
+    [bigint],
+    "view"
+  >;
+
+  difficulty: TypedContractMethod<
+    [newDifficulty: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  dumpState: TypedContractMethod<
+    [pathToStateJson: string],
+    [void],
+    "nonpayable"
+  >;
+
+  ensNamehash: TypedContractMethod<[name: string], [string], "view">;
+
+  "envAddress(string)": TypedContractMethod<[name: string], [string], "view">;
+
+  "envAddress(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [string[]],
+    "view"
+  >;
+
+  "envBool(string)": TypedContractMethod<[name: string], [boolean], "view">;
+
+  "envBool(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [boolean[]],
+    "view"
+  >;
+
+  "envBytes(string)": TypedContractMethod<[name: string], [string], "view">;
+
+  "envBytes(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [string[]],
+    "view"
+  >;
+
+  "envBytes32(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [string[]],
+    "view"
+  >;
+
+  "envBytes32(string)": TypedContractMethod<[name: string], [string], "view">;
+
+  envExists: TypedContractMethod<[name: string], [boolean], "view">;
+
+  "envInt(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [bigint[]],
+    "view"
+  >;
+
+  "envInt(string)": TypedContractMethod<[name: string], [bigint], "view">;
+
+  "envOr(string,string,bytes32[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: BytesLike[]],
+    [string[]],
+    "view"
+  >;
+
+  "envOr(string,string,int256[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: BigNumberish[]],
+    [bigint[]],
+    "view"
+  >;
+
+  "envOr(string,bool)": TypedContractMethod<
+    [name: string, defaultValue: boolean],
+    [boolean],
+    "view"
+  >;
+
+  "envOr(string,address)": TypedContractMethod<
+    [name: string, defaultValue: AddressLike],
+    [string],
+    "view"
+  >;
+
+  "envOr(string,uint256)": TypedContractMethod<
+    [name: string, defaultValue: BigNumberish],
+    [bigint],
+    "view"
+  >;
+
+  "envOr(string,string,bytes[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: BytesLike[]],
+    [string[]],
+    "view"
+  >;
+
+  "envOr(string,string,uint256[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: BigNumberish[]],
+    [bigint[]],
+    "view"
+  >;
+
+  "envOr(string,string,string[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: string[]],
+    [string[]],
+    "view"
+  >;
+
+  "envOr(string,bytes)": TypedContractMethod<
+    [name: string, defaultValue: BytesLike],
+    [string],
+    "view"
+  >;
+
+  "envOr(string,bytes32)": TypedContractMethod<
+    [name: string, defaultValue: BytesLike],
+    [string],
+    "view"
+  >;
+
+  "envOr(string,int256)": TypedContractMethod<
+    [name: string, defaultValue: BigNumberish],
+    [bigint],
+    "view"
+  >;
+
+  "envOr(string,string,address[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: AddressLike[]],
+    [string[]],
+    "view"
+  >;
+
+  "envOr(string,string)": TypedContractMethod<
+    [name: string, defaultValue: string],
+    [string],
+    "view"
+  >;
+
+  "envOr(string,string,bool[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: boolean[]],
+    [boolean[]],
+    "view"
+  >;
+
+  "envString(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [string[]],
+    "view"
+  >;
+
+  "envString(string)": TypedContractMethod<[name: string], [string], "view">;
+
+  "envUint(string)": TypedContractMethod<[name: string], [bigint], "view">;
+
+  "envUint(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [bigint[]],
+    "view"
+  >;
+
+  etch: TypedContractMethod<
+    [target: AddressLike, newRuntimeBytecode: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  eth_getLogs: TypedContractMethod<
+    [
+      fromBlock: BigNumberish,
+      toBlock: BigNumberish,
+      target: AddressLike,
+      topics: BytesLike[]
+    ],
+    [VmSafe.EthGetLogsStructOutput[]],
+    "nonpayable"
+  >;
+
+  exists: TypedContractMethod<[path: string], [boolean], "nonpayable">;
+
+  "expectCall(address,uint256,uint64,bytes)": TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      gas: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectCall(address,uint256,uint64,bytes,uint64)": TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      gas: BigNumberish,
+      data: BytesLike,
+      count: BigNumberish
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectCall(address,uint256,bytes,uint64)": TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      data: BytesLike,
+      count: BigNumberish
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectCall(address,bytes)": TypedContractMethod<
+    [callee: AddressLike, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectCall(address,bytes,uint64)": TypedContractMethod<
+    [callee: AddressLike, data: BytesLike, count: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectCall(address,uint256,bytes)": TypedContractMethod<
+    [callee: AddressLike, msgValue: BigNumberish, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectCallMinGas(address,uint256,uint64,bytes)": TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      minGas: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectCallMinGas(address,uint256,uint64,bytes,uint64)": TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      minGas: BigNumberish,
+      data: BytesLike,
+      count: BigNumberish
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectEmit()": TypedContractMethod<[], [void], "nonpayable">;
+
+  "expectEmit(bool,bool,bool,bool)": TypedContractMethod<
+    [
+      checkTopic1: boolean,
+      checkTopic2: boolean,
+      checkTopic3: boolean,
+      checkData: boolean
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectEmit(bool,bool,bool,bool,address)": TypedContractMethod<
+    [
+      checkTopic1: boolean,
+      checkTopic2: boolean,
+      checkTopic3: boolean,
+      checkData: boolean,
+      emitter: AddressLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectEmit(address)": TypedContractMethod<
+    [emitter: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectRevert(bytes4)": TypedContractMethod<
+    [revertData: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectRevert(bytes)": TypedContractMethod<
+    [revertData: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "expectRevert()": TypedContractMethod<[], [void], "nonpayable">;
+
+  expectSafeMemory: TypedContractMethod<
+    [min: BigNumberish, max: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  expectSafeMemoryCall: TypedContractMethod<
+    [min: BigNumberish, max: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  fee: TypedContractMethod<[newBasefee: BigNumberish], [void], "nonpayable">;
+
+  ffi: TypedContractMethod<[commandInput: string[]], [string], "nonpayable">;
+
+  fsMetadata: TypedContractMethod<
+    [path: string],
+    [VmSafe.FsMetadataStructOutput],
+    "view"
+  >;
+
+  getBlobBaseFee: TypedContractMethod<[], [bigint], "view">;
+
+  getBlobhashes: TypedContractMethod<[], [string[]], "view">;
+
+  getBlockNumber: TypedContractMethod<[], [bigint], "view">;
+
+  getBlockTimestamp: TypedContractMethod<[], [bigint], "view">;
+
+  getCode: TypedContractMethod<[artifactPath: string], [string], "view">;
+
+  getDeployedCode: TypedContractMethod<
+    [artifactPath: string],
+    [string],
+    "view"
+  >;
+
+  getLabel: TypedContractMethod<[account: AddressLike], [string], "view">;
+
+  getMappingKeyAndParentOf: TypedContractMethod<
+    [target: AddressLike, elementSlot: BytesLike],
+    [
+      [boolean, string, string] & {
+        found: boolean;
+        key: string;
+        parent: string;
+      }
+    ],
+    "nonpayable"
+  >;
+
+  getMappingLength: TypedContractMethod<
+    [target: AddressLike, mappingSlot: BytesLike],
+    [bigint],
+    "nonpayable"
+  >;
+
+  getMappingSlotAt: TypedContractMethod<
+    [target: AddressLike, mappingSlot: BytesLike, idx: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+
+  "getNonce(address)": TypedContractMethod<
+    [account: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  "getNonce((address,uint256,uint256,uint256))": TypedContractMethod<
+    [wallet: VmSafe.WalletStruct],
+    [bigint],
+    "nonpayable"
+  >;
+
+  getRecordedLogs: TypedContractMethod<
+    [],
+    [VmSafe.LogStructOutput[]],
+    "nonpayable"
+  >;
+
+  indexOf: TypedContractMethod<[input: string, key: string], [bigint], "view">;
+
+  isContext: TypedContractMethod<[context: BigNumberish], [boolean], "view">;
+
+  isDir: TypedContractMethod<[path: string], [boolean], "nonpayable">;
+
+  isFile: TypedContractMethod<[path: string], [boolean], "nonpayable">;
+
+  isPersistent: TypedContractMethod<[account: AddressLike], [boolean], "view">;
+
+  keyExists: TypedContractMethod<
+    [json: string, key: string],
+    [boolean],
+    "view"
+  >;
+
+  keyExistsJson: TypedContractMethod<
+    [json: string, key: string],
+    [boolean],
+    "view"
+  >;
+
+  keyExistsToml: TypedContractMethod<
+    [toml: string, key: string],
+    [boolean],
+    "view"
+  >;
+
+  label: TypedContractMethod<
+    [account: AddressLike, newLabel: string],
+    [void],
+    "nonpayable"
+  >;
+
+  lastCallGas: TypedContractMethod<[], [VmSafe.GasStructOutput], "view">;
+
+  load: TypedContractMethod<
+    [target: AddressLike, slot: BytesLike],
+    [string],
+    "view"
+  >;
+
+  loadAllocs: TypedContractMethod<
+    [pathToAllocsJson: string],
+    [void],
+    "nonpayable"
+  >;
+
+  "makePersistent(address[])": TypedContractMethod<
+    [accounts: AddressLike[]],
+    [void],
+    "nonpayable"
+  >;
+
+  "makePersistent(address,address)": TypedContractMethod<
+    [account0: AddressLike, account1: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "makePersistent(address)": TypedContractMethod<
+    [account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "makePersistent(address,address,address)": TypedContractMethod<
+    [account0: AddressLike, account1: AddressLike, account2: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "mockCall(address,uint256,bytes,bytes)": TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      data: BytesLike,
+      returnData: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  "mockCall(address,bytes,bytes)": TypedContractMethod<
+    [callee: AddressLike, data: BytesLike, returnData: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "mockCallRevert(address,uint256,bytes,bytes)": TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      data: BytesLike,
+      revertData: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  "mockCallRevert(address,bytes,bytes)": TypedContractMethod<
+    [callee: AddressLike, data: BytesLike, revertData: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  parseAddress: TypedContractMethod<
+    [stringifiedValue: string],
+    [string],
+    "view"
+  >;
+
+  parseBool: TypedContractMethod<[stringifiedValue: string], [boolean], "view">;
+
+  parseBytes: TypedContractMethod<[stringifiedValue: string], [string], "view">;
+
+  parseBytes32: TypedContractMethod<
+    [stringifiedValue: string],
+    [string],
+    "view"
+  >;
+
+  parseInt: TypedContractMethod<[stringifiedValue: string], [bigint], "view">;
+
+  "parseJson(string)": TypedContractMethod<[json: string], [string], "view">;
+
+  "parseJson(string,string)": TypedContractMethod<
+    [json: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseJsonAddress: TypedContractMethod<
+    [json: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseJsonAddressArray: TypedContractMethod<
+    [json: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseJsonBool: TypedContractMethod<
+    [json: string, key: string],
+    [boolean],
+    "view"
+  >;
+
+  parseJsonBoolArray: TypedContractMethod<
+    [json: string, key: string],
+    [boolean[]],
+    "view"
+  >;
+
+  parseJsonBytes: TypedContractMethod<
+    [json: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseJsonBytes32: TypedContractMethod<
+    [json: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseJsonBytes32Array: TypedContractMethod<
+    [json: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseJsonBytesArray: TypedContractMethod<
+    [json: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseJsonInt: TypedContractMethod<
+    [json: string, key: string],
+    [bigint],
+    "view"
+  >;
+
+  parseJsonIntArray: TypedContractMethod<
+    [json: string, key: string],
+    [bigint[]],
+    "view"
+  >;
+
+  parseJsonKeys: TypedContractMethod<
+    [json: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseJsonString: TypedContractMethod<
+    [json: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseJsonStringArray: TypedContractMethod<
+    [json: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseJsonUint: TypedContractMethod<
+    [json: string, key: string],
+    [bigint],
+    "view"
+  >;
+
+  parseJsonUintArray: TypedContractMethod<
+    [json: string, key: string],
+    [bigint[]],
+    "view"
+  >;
+
+  "parseToml(string,string)": TypedContractMethod<
+    [toml: string, key: string],
+    [string],
+    "view"
+  >;
+
+  "parseToml(string)": TypedContractMethod<[toml: string], [string], "view">;
+
+  parseTomlAddress: TypedContractMethod<
+    [toml: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseTomlAddressArray: TypedContractMethod<
+    [toml: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseTomlBool: TypedContractMethod<
+    [toml: string, key: string],
+    [boolean],
+    "view"
+  >;
+
+  parseTomlBoolArray: TypedContractMethod<
+    [toml: string, key: string],
+    [boolean[]],
+    "view"
+  >;
+
+  parseTomlBytes: TypedContractMethod<
+    [toml: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseTomlBytes32: TypedContractMethod<
+    [toml: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseTomlBytes32Array: TypedContractMethod<
+    [toml: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseTomlBytesArray: TypedContractMethod<
+    [toml: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseTomlInt: TypedContractMethod<
+    [toml: string, key: string],
+    [bigint],
+    "view"
+  >;
+
+  parseTomlIntArray: TypedContractMethod<
+    [toml: string, key: string],
+    [bigint[]],
+    "view"
+  >;
+
+  parseTomlKeys: TypedContractMethod<
+    [toml: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseTomlString: TypedContractMethod<
+    [toml: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseTomlStringArray: TypedContractMethod<
+    [toml: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseTomlUint: TypedContractMethod<
+    [toml: string, key: string],
+    [bigint],
+    "view"
+  >;
+
+  parseTomlUintArray: TypedContractMethod<
+    [toml: string, key: string],
+    [bigint[]],
+    "view"
+  >;
+
+  parseUint: TypedContractMethod<[stringifiedValue: string], [bigint], "view">;
+
+  pauseGasMetering: TypedContractMethod<[], [void], "nonpayable">;
+
+  "prank(address,address)": TypedContractMethod<
+    [msgSender: AddressLike, txOrigin: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "prank(address)": TypedContractMethod<
+    [msgSender: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "prevrandao(bytes32)": TypedContractMethod<
+    [newPrevrandao: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "prevrandao(uint256)": TypedContractMethod<
+    [newPrevrandao: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  projectRoot: TypedContractMethod<[], [string], "view">;
+
+  prompt: TypedContractMethod<[promptText: string], [string], "nonpayable">;
+
+  promptAddress: TypedContractMethod<
+    [promptText: string],
+    [string],
+    "nonpayable"
+  >;
+
+  promptSecret: TypedContractMethod<
+    [promptText: string],
+    [string],
+    "nonpayable"
+  >;
+
+  promptUint: TypedContractMethod<[promptText: string], [bigint], "nonpayable">;
+
+  readCallers: TypedContractMethod<
+    [],
+    [
+      [bigint, string, string] & {
+        callerMode: bigint;
+        msgSender: string;
+        txOrigin: string;
+      }
+    ],
+    "nonpayable"
+  >;
+
+  "readDir(string,uint64)": TypedContractMethod<
+    [path: string, maxDepth: BigNumberish],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+
+  "readDir(string,uint64,bool)": TypedContractMethod<
+    [path: string, maxDepth: BigNumberish, followLinks: boolean],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+
+  "readDir(string)": TypedContractMethod<
+    [path: string],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+
+  readFile: TypedContractMethod<[path: string], [string], "view">;
+
+  readFileBinary: TypedContractMethod<[path: string], [string], "view">;
+
+  readLine: TypedContractMethod<[path: string], [string], "view">;
+
+  readLink: TypedContractMethod<[linkPath: string], [string], "view">;
+
+  record: TypedContractMethod<[], [void], "nonpayable">;
+
+  recordLogs: TypedContractMethod<[], [void], "nonpayable">;
+
+  rememberKey: TypedContractMethod<
+    [privateKey: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+
+  removeDir: TypedContractMethod<
+    [path: string, recursive: boolean],
+    [void],
+    "nonpayable"
+  >;
+
+  removeFile: TypedContractMethod<[path: string], [void], "nonpayable">;
+
+  replace: TypedContractMethod<
+    [input: string, from: string, to: string],
+    [string],
+    "view"
+  >;
+
+  resetNonce: TypedContractMethod<[account: AddressLike], [void], "nonpayable">;
+
+  resumeGasMetering: TypedContractMethod<[], [void], "nonpayable">;
+
+  revertTo: TypedContractMethod<
+    [snapshotId: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  revertToAndDelete: TypedContractMethod<
+    [snapshotId: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  "revokePersistent(address[])": TypedContractMethod<
+    [accounts: AddressLike[]],
+    [void],
+    "nonpayable"
+  >;
+
+  "revokePersistent(address)": TypedContractMethod<
+    [account: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  roll: TypedContractMethod<[newHeight: BigNumberish], [void], "nonpayable">;
+
+  "rollFork(bytes32)": TypedContractMethod<
+    [txHash: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "rollFork(uint256,uint256)": TypedContractMethod<
+    [forkId: BigNumberish, blockNumber: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  "rollFork(uint256)": TypedContractMethod<
+    [blockNumber: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  "rollFork(uint256,bytes32)": TypedContractMethod<
+    [forkId: BigNumberish, txHash: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  rpc: TypedContractMethod<
+    [method: string, params: string],
+    [string],
+    "nonpayable"
+  >;
+
+  rpcUrl: TypedContractMethod<[rpcAlias: string], [string], "view">;
+
+  rpcUrlStructs: TypedContractMethod<[], [VmSafe.RpcStructOutput[]], "view">;
+
+  rpcUrls: TypedContractMethod<[], [[string, string][]], "view">;
+
+  selectFork: TypedContractMethod<[forkId: BigNumberish], [void], "nonpayable">;
+
+  "serializeAddress(string,string,address[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: AddressLike[]],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeAddress(string,string,address)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: AddressLike],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBool(string,string,bool[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: boolean[]],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBool(string,string,bool)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: boolean],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBytes(string,string,bytes[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BytesLike[]],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBytes(string,string,bytes)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BytesLike],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBytes32(string,string,bytes32[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BytesLike[]],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBytes32(string,string,bytes32)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BytesLike],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeInt(string,string,int256)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeInt(string,string,int256[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BigNumberish[]],
+    [string],
+    "nonpayable"
+  >;
+
+  serializeJson: TypedContractMethod<
+    [objectKey: string, value: string],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeString(string,string,string[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: string[]],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeString(string,string,string)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: string],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeUint(string,string,uint256)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeUint(string,string,uint256[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BigNumberish[]],
+    [string],
+    "nonpayable"
+  >;
+
+  serializeUintToHex: TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+
+  setEnv: TypedContractMethod<
+    [name: string, value: string],
+    [void],
+    "nonpayable"
+  >;
+
+  setNonce: TypedContractMethod<
+    [account: AddressLike, newNonce: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  setNonceUnsafe: TypedContractMethod<
+    [account: AddressLike, newNonce: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  "sign(bytes32)": TypedContractMethod<
+    [digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+
+  "sign(address,bytes32)": TypedContractMethod<
+    [signer: AddressLike, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+
+  "sign((address,uint256,uint256,uint256),bytes32)": TypedContractMethod<
+    [wallet: VmSafe.WalletStruct, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "nonpayable"
+  >;
+
+  "sign(uint256,bytes32)": TypedContractMethod<
+    [privateKey: BigNumberish, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+
+  signP256: TypedContractMethod<
+    [privateKey: BigNumberish, digest: BytesLike],
+    [[string, string] & { r: string; s: string }],
+    "view"
+  >;
+
+  skip: TypedContractMethod<[skipTest: boolean], [void], "nonpayable">;
+
+  sleep: TypedContractMethod<[duration: BigNumberish], [void], "nonpayable">;
+
+  snapshot: TypedContractMethod<[], [bigint], "nonpayable">;
+
+  split: TypedContractMethod<
+    [input: string, delimiter: string],
+    [string[]],
+    "view"
+  >;
+
+  "startBroadcast()": TypedContractMethod<[], [void], "nonpayable">;
+
+  "startBroadcast(address)": TypedContractMethod<
+    [signer: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "startBroadcast(uint256)": TypedContractMethod<
+    [privateKey: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  startMappingRecording: TypedContractMethod<[], [void], "nonpayable">;
+
+  "startPrank(address)": TypedContractMethod<
+    [msgSender: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "startPrank(address,address)": TypedContractMethod<
+    [msgSender: AddressLike, txOrigin: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  startStateDiffRecording: TypedContractMethod<[], [void], "nonpayable">;
+
+  stopAndReturnStateDiff: TypedContractMethod<
+    [],
+    [VmSafe.AccountAccessStructOutput[]],
+    "nonpayable"
+  >;
+
+  stopBroadcast: TypedContractMethod<[], [void], "nonpayable">;
+
+  stopExpectSafeMemory: TypedContractMethod<[], [void], "nonpayable">;
+
+  stopMappingRecording: TypedContractMethod<[], [void], "nonpayable">;
+
+  stopPrank: TypedContractMethod<[], [void], "nonpayable">;
+
+  store: TypedContractMethod<
+    [target: AddressLike, slot: BytesLike, value: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "toBase64(string)": TypedContractMethod<[data: string], [string], "view">;
+
+  "toBase64(bytes)": TypedContractMethod<[data: BytesLike], [string], "view">;
+
+  "toBase64URL(string)": TypedContractMethod<[data: string], [string], "view">;
+
+  "toBase64URL(bytes)": TypedContractMethod<
+    [data: BytesLike],
+    [string],
+    "view"
+  >;
+
+  toLowercase: TypedContractMethod<[input: string], [string], "view">;
+
+  "toString(address)": TypedContractMethod<
+    [value: AddressLike],
+    [string],
+    "view"
+  >;
+
+  "toString(uint256)": TypedContractMethod<
+    [value: BigNumberish],
+    [string],
+    "view"
+  >;
+
+  "toString(bytes)": TypedContractMethod<[value: BytesLike], [string], "view">;
+
+  "toString(bool)": TypedContractMethod<[value: boolean], [string], "view">;
+
+  "toString(int256)": TypedContractMethod<
+    [value: BigNumberish],
+    [string],
+    "view"
+  >;
+
+  "toString(bytes32)": TypedContractMethod<
+    [value: BytesLike],
+    [string],
+    "view"
+  >;
+
+  toUppercase: TypedContractMethod<[input: string], [string], "view">;
+
+  "transact(uint256,bytes32)": TypedContractMethod<
+    [forkId: BigNumberish, txHash: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "transact(bytes32)": TypedContractMethod<
+    [txHash: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  trim: TypedContractMethod<[input: string], [string], "view">;
+
+  tryFfi: TypedContractMethod<
+    [commandInput: string[]],
+    [VmSafe.FfiResultStructOutput],
+    "nonpayable"
+  >;
+
+  txGasPrice: TypedContractMethod<
+    [newGasPrice: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  unixTime: TypedContractMethod<[], [bigint], "nonpayable">;
+
+  warp: TypedContractMethod<[newTimestamp: BigNumberish], [void], "nonpayable">;
+
+  writeFile: TypedContractMethod<
+    [path: string, data: string],
+    [void],
+    "nonpayable"
+  >;
+
+  writeFileBinary: TypedContractMethod<
+    [path: string, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "writeJson(string,string,string)": TypedContractMethod<
+    [json: string, path: string, valueKey: string],
+    [void],
+    "nonpayable"
+  >;
+
+  "writeJson(string,string)": TypedContractMethod<
+    [json: string, path: string],
+    [void],
+    "nonpayable"
+  >;
+
+  writeLine: TypedContractMethod<
+    [path: string, data: string],
+    [void],
+    "nonpayable"
+  >;
+
+  "writeToml(string,string,string)": TypedContractMethod<
+    [json: string, path: string, valueKey: string],
+    [void],
+    "nonpayable"
+  >;
+
+  "writeToml(string,string)": TypedContractMethod<
+    [json: string, path: string],
+    [void],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "accesses"
+  ): TypedContractMethod<
+    [target: AddressLike],
+    [[string[], string[]] & { readSlots: string[]; writeSlots: string[] }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "activeFork"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "addr"
+  ): TypedContractMethod<[privateKey: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "allowCheatcodes"
+  ): TypedContractMethod<[account: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbs(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbs(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbs(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbs(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRel(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRel(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxPercentDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRel(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRel(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxPercentDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRelDecimal(int256,int256,uint256,uint256)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRelDecimal(int256,int256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes32[],bytes32[])"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(int256[],int256[],string)"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(address,address,string)"
+  ): TypedContractMethod<
+    [left: AddressLike, right: AddressLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(string,string,string)"
+  ): TypedContractMethod<
+    [left: string, right: string, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(address[],address[])"
+  ): TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(address[],address[],string)"
+  ): TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bool,bool,string)"
+  ): TypedContractMethod<
+    [left: boolean, right: boolean, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(address,address)"
+  ): TypedContractMethod<
+    [left: AddressLike, right: AddressLike],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(uint256[],uint256[],string)"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bool[],bool[])"
+  ): TypedContractMethod<[left: boolean[], right: boolean[]], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(int256[],int256[])"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes32,bytes32)"
+  ): TypedContractMethod<[left: BytesLike, right: BytesLike], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(uint256[],uint256[])"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes,bytes)"
+  ): TypedContractMethod<[left: BytesLike, right: BytesLike], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes32,bytes32,string)"
+  ): TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(string[],string[])"
+  ): TypedContractMethod<[left: string[], right: string[]], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(bytes32[],bytes32[],string)"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes,bytes,string)"
+  ): TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bool[],bool[],string)"
+  ): TypedContractMethod<
+    [left: boolean[], right: boolean[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes[],bytes[])"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(string[],string[],string)"
+  ): TypedContractMethod<
+    [left: string[], right: string[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(string,string)"
+  ): TypedContractMethod<[left: string, right: string], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(bytes[],bytes[],string)"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bool,bool)"
+  ): TypedContractMethod<[left: boolean, right: boolean], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEqDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEqDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEqDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEqDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertFalse(bool,string)"
+  ): TypedContractMethod<[condition: boolean, error: string], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertFalse(bool)"
+  ): TypedContractMethod<[condition: boolean], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertGe(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGe(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGe(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGe(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGeDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGeDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGeDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGeDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGt(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGt(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGt(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGt(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGtDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGtDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGtDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGtDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLe(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLe(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLe(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLe(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLeDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLeDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLeDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLeDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLt(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLt(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLt(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLt(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLtDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLtDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLtDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLtDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes32[],bytes32[])"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(int256[],int256[])"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bool,bool,string)"
+  ): TypedContractMethod<
+    [left: boolean, right: boolean, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes[],bytes[],string)"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bool,bool)"
+  ): TypedContractMethod<[left: boolean, right: boolean], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(bool[],bool[])"
+  ): TypedContractMethod<[left: boolean[], right: boolean[]], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes,bytes)"
+  ): TypedContractMethod<[left: BytesLike, right: BytesLike], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(address[],address[])"
+  ): TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(uint256[],uint256[])"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bool[],bool[],string)"
+  ): TypedContractMethod<
+    [left: boolean[], right: boolean[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(string,string)"
+  ): TypedContractMethod<[left: string, right: string], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(address[],address[],string)"
+  ): TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(string,string,string)"
+  ): TypedContractMethod<
+    [left: string, right: string, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(address,address,string)"
+  ): TypedContractMethod<
+    [left: AddressLike, right: AddressLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes32,bytes32)"
+  ): TypedContractMethod<[left: BytesLike, right: BytesLike], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes,bytes,string)"
+  ): TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(uint256[],uint256[],string)"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(address,address)"
+  ): TypedContractMethod<
+    [left: AddressLike, right: AddressLike],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes32,bytes32,string)"
+  ): TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(string[],string[],string)"
+  ): TypedContractMethod<
+    [left: string[], right: string[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes32[],bytes32[],string)"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(string[],string[])"
+  ): TypedContractMethod<[left: string[], right: string[]], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(int256[],int256[],string)"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes[],bytes[])"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEqDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEqDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEqDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEqDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertTrue(bool)"
+  ): TypedContractMethod<[condition: boolean], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertTrue(bool,string)"
+  ): TypedContractMethod<[condition: boolean, error: string], [void], "view">;
+  getFunction(
+    nameOrSignature: "assume"
+  ): TypedContractMethod<[condition: boolean], [void], "view">;
+  getFunction(
+    nameOrSignature: "blobBaseFee"
+  ): TypedContractMethod<[newBlobBaseFee: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "blobhashes"
+  ): TypedContractMethod<[hashes: BytesLike[]], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "breakpoint(string)"
+  ): TypedContractMethod<[char: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "breakpoint(string,bool)"
+  ): TypedContractMethod<[char: string, value: boolean], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "broadcast()"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "broadcast(address)"
+  ): TypedContractMethod<[signer: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "broadcast(uint256)"
+  ): TypedContractMethod<[privateKey: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "chainId"
+  ): TypedContractMethod<[newChainId: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "clearMockedCalls"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "closeFile"
+  ): TypedContractMethod<[path: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "coinbase"
+  ): TypedContractMethod<[newCoinbase: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "computeCreate2Address(bytes32,bytes32)"
+  ): TypedContractMethod<
+    [salt: BytesLike, initCodeHash: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "computeCreate2Address(bytes32,bytes32,address)"
+  ): TypedContractMethod<
+    [salt: BytesLike, initCodeHash: BytesLike, deployer: AddressLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "computeCreateAddress"
+  ): TypedContractMethod<
+    [deployer: AddressLike, nonce: BigNumberish],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "copyFile"
+  ): TypedContractMethod<[from: string, to: string], [bigint], "nonpayable">;
+  getFunction(
+    nameOrSignature: "createDir"
+  ): TypedContractMethod<
+    [path: string, recursive: boolean],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "createFork(string)"
+  ): TypedContractMethod<[urlOrAlias: string], [bigint], "nonpayable">;
+  getFunction(
+    nameOrSignature: "createFork(string,uint256)"
+  ): TypedContractMethod<
+    [urlOrAlias: string, blockNumber: BigNumberish],
+    [bigint],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "createFork(string,bytes32)"
+  ): TypedContractMethod<
+    [urlOrAlias: string, txHash: BytesLike],
+    [bigint],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "createSelectFork(string,uint256)"
+  ): TypedContractMethod<
+    [urlOrAlias: string, blockNumber: BigNumberish],
+    [bigint],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "createSelectFork(string,bytes32)"
+  ): TypedContractMethod<
+    [urlOrAlias: string, txHash: BytesLike],
+    [bigint],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "createSelectFork(string)"
+  ): TypedContractMethod<[urlOrAlias: string], [bigint], "nonpayable">;
+  getFunction(
+    nameOrSignature: "createWallet(string)"
+  ): TypedContractMethod<
+    [walletLabel: string],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "createWallet(uint256)"
+  ): TypedContractMethod<
+    [privateKey: BigNumberish],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "createWallet(uint256,string)"
+  ): TypedContractMethod<
+    [privateKey: BigNumberish, walletLabel: string],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "deal"
+  ): TypedContractMethod<
+    [account: AddressLike, newBalance: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "deleteSnapshot"
+  ): TypedContractMethod<[snapshotId: BigNumberish], [boolean], "nonpayable">;
+  getFunction(
+    nameOrSignature: "deleteSnapshots"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "deriveKey(string,string,uint32,string)"
+  ): TypedContractMethod<
+    [
+      mnemonic: string,
+      derivationPath: string,
+      index: BigNumberish,
+      language: string
+    ],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "deriveKey(string,uint32,string)"
+  ): TypedContractMethod<
+    [mnemonic: string, index: BigNumberish, language: string],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "deriveKey(string,uint32)"
+  ): TypedContractMethod<
+    [mnemonic: string, index: BigNumberish],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "deriveKey(string,string,uint32)"
+  ): TypedContractMethod<
+    [mnemonic: string, derivationPath: string, index: BigNumberish],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "difficulty"
+  ): TypedContractMethod<[newDifficulty: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "dumpState"
+  ): TypedContractMethod<[pathToStateJson: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "ensNamehash"
+  ): TypedContractMethod<[name: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "envAddress(string)"
+  ): TypedContractMethod<[name: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "envAddress(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "envBool(string)"
+  ): TypedContractMethod<[name: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "envBool(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [boolean[]], "view">;
+  getFunction(
+    nameOrSignature: "envBytes(string)"
+  ): TypedContractMethod<[name: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "envBytes(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "envBytes32(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "envBytes32(string)"
+  ): TypedContractMethod<[name: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "envExists"
+  ): TypedContractMethod<[name: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "envInt(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "envInt(string)"
+  ): TypedContractMethod<[name: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "envOr(string,string,bytes32[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: BytesLike[]],
+    [string[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,int256[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: BigNumberish[]],
+    [bigint[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,bool)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: boolean],
+    [boolean],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,address)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: AddressLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,uint256)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: BigNumberish],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,bytes[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: BytesLike[]],
+    [string[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,uint256[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: BigNumberish[]],
+    [bigint[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,string[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: string[]],
+    [string[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,bytes)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,bytes32)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,int256)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: BigNumberish],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,address[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: AddressLike[]],
+    [string[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: string],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,bool[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: boolean[]],
+    [boolean[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envString(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "envString(string)"
+  ): TypedContractMethod<[name: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "envUint(string)"
+  ): TypedContractMethod<[name: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "envUint(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "etch"
+  ): TypedContractMethod<
+    [target: AddressLike, newRuntimeBytecode: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "eth_getLogs"
+  ): TypedContractMethod<
+    [
+      fromBlock: BigNumberish,
+      toBlock: BigNumberish,
+      target: AddressLike,
+      topics: BytesLike[]
+    ],
+    [VmSafe.EthGetLogsStructOutput[]],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "exists"
+  ): TypedContractMethod<[path: string], [boolean], "nonpayable">;
+  getFunction(
+    nameOrSignature: "expectCall(address,uint256,uint64,bytes)"
+  ): TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      gas: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "expectCall(address,uint256,uint64,bytes,uint64)"
+  ): TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      gas: BigNumberish,
+      data: BytesLike,
+      count: BigNumberish
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "expectCall(address,uint256,bytes,uint64)"
+  ): TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      data: BytesLike,
+      count: BigNumberish
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "expectCall(address,bytes)"
+  ): TypedContractMethod<
+    [callee: AddressLike, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "expectCall(address,bytes,uint64)"
+  ): TypedContractMethod<
+    [callee: AddressLike, data: BytesLike, count: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "expectCall(address,uint256,bytes)"
+  ): TypedContractMethod<
+    [callee: AddressLike, msgValue: BigNumberish, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "expectCallMinGas(address,uint256,uint64,bytes)"
+  ): TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      minGas: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "expectCallMinGas(address,uint256,uint64,bytes,uint64)"
+  ): TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      minGas: BigNumberish,
+      data: BytesLike,
+      count: BigNumberish
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "expectEmit()"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "expectEmit(bool,bool,bool,bool)"
+  ): TypedContractMethod<
+    [
+      checkTopic1: boolean,
+      checkTopic2: boolean,
+      checkTopic3: boolean,
+      checkData: boolean
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "expectEmit(bool,bool,bool,bool,address)"
+  ): TypedContractMethod<
+    [
+      checkTopic1: boolean,
+      checkTopic2: boolean,
+      checkTopic3: boolean,
+      checkData: boolean,
+      emitter: AddressLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "expectEmit(address)"
+  ): TypedContractMethod<[emitter: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "expectRevert(bytes4)"
+  ): TypedContractMethod<[revertData: BytesLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "expectRevert(bytes)"
+  ): TypedContractMethod<[revertData: BytesLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "expectRevert()"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "expectSafeMemory"
+  ): TypedContractMethod<
+    [min: BigNumberish, max: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "expectSafeMemoryCall"
+  ): TypedContractMethod<
+    [min: BigNumberish, max: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "fee"
+  ): TypedContractMethod<[newBasefee: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "ffi"
+  ): TypedContractMethod<[commandInput: string[]], [string], "nonpayable">;
+  getFunction(
+    nameOrSignature: "fsMetadata"
+  ): TypedContractMethod<
+    [path: string],
+    [VmSafe.FsMetadataStructOutput],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "getBlobBaseFee"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getBlobhashes"
+  ): TypedContractMethod<[], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "getBlockNumber"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getBlockTimestamp"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getCode"
+  ): TypedContractMethod<[artifactPath: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "getDeployedCode"
+  ): TypedContractMethod<[artifactPath: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "getLabel"
+  ): TypedContractMethod<[account: AddressLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "getMappingKeyAndParentOf"
+  ): TypedContractMethod<
+    [target: AddressLike, elementSlot: BytesLike],
+    [
+      [boolean, string, string] & {
+        found: boolean;
+        key: string;
+        parent: string;
+      }
+    ],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "getMappingLength"
+  ): TypedContractMethod<
+    [target: AddressLike, mappingSlot: BytesLike],
+    [bigint],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "getMappingSlotAt"
+  ): TypedContractMethod<
+    [target: AddressLike, mappingSlot: BytesLike, idx: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "getNonce(address)"
+  ): TypedContractMethod<[account: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getNonce((address,uint256,uint256,uint256))"
+  ): TypedContractMethod<[wallet: VmSafe.WalletStruct], [bigint], "nonpayable">;
+  getFunction(
+    nameOrSignature: "getRecordedLogs"
+  ): TypedContractMethod<[], [VmSafe.LogStructOutput[]], "nonpayable">;
+  getFunction(
+    nameOrSignature: "indexOf"
+  ): TypedContractMethod<[input: string, key: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "isContext"
+  ): TypedContractMethod<[context: BigNumberish], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "isDir"
+  ): TypedContractMethod<[path: string], [boolean], "nonpayable">;
+  getFunction(
+    nameOrSignature: "isFile"
+  ): TypedContractMethod<[path: string], [boolean], "nonpayable">;
+  getFunction(
+    nameOrSignature: "isPersistent"
+  ): TypedContractMethod<[account: AddressLike], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "keyExists"
+  ): TypedContractMethod<[json: string, key: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "keyExistsJson"
+  ): TypedContractMethod<[json: string, key: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "keyExistsToml"
+  ): TypedContractMethod<[toml: string, key: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "label"
+  ): TypedContractMethod<
+    [account: AddressLike, newLabel: string],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "lastCallGas"
+  ): TypedContractMethod<[], [VmSafe.GasStructOutput], "view">;
+  getFunction(
+    nameOrSignature: "load"
+  ): TypedContractMethod<
+    [target: AddressLike, slot: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "loadAllocs"
+  ): TypedContractMethod<[pathToAllocsJson: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "makePersistent(address[])"
+  ): TypedContractMethod<[accounts: AddressLike[]], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "makePersistent(address,address)"
+  ): TypedContractMethod<
+    [account0: AddressLike, account1: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "makePersistent(address)"
+  ): TypedContractMethod<[account: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "makePersistent(address,address,address)"
+  ): TypedContractMethod<
+    [account0: AddressLike, account1: AddressLike, account2: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "mockCall(address,uint256,bytes,bytes)"
+  ): TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      data: BytesLike,
+      returnData: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "mockCall(address,bytes,bytes)"
+  ): TypedContractMethod<
+    [callee: AddressLike, data: BytesLike, returnData: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "mockCallRevert(address,uint256,bytes,bytes)"
+  ): TypedContractMethod<
+    [
+      callee: AddressLike,
+      msgValue: BigNumberish,
+      data: BytesLike,
+      revertData: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "mockCallRevert(address,bytes,bytes)"
+  ): TypedContractMethod<
+    [callee: AddressLike, data: BytesLike, revertData: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "parseAddress"
+  ): TypedContractMethod<[stringifiedValue: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseBool"
+  ): TypedContractMethod<[stringifiedValue: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "parseBytes"
+  ): TypedContractMethod<[stringifiedValue: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseBytes32"
+  ): TypedContractMethod<[stringifiedValue: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseInt"
+  ): TypedContractMethod<[stringifiedValue: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "parseJson(string)"
+  ): TypedContractMethod<[json: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJson(string,string)"
+  ): TypedContractMethod<[json: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonAddress"
+  ): TypedContractMethod<[json: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonAddressArray"
+  ): TypedContractMethod<[json: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBool"
+  ): TypedContractMethod<[json: string, key: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBoolArray"
+  ): TypedContractMethod<[json: string, key: string], [boolean[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBytes"
+  ): TypedContractMethod<[json: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBytes32"
+  ): TypedContractMethod<[json: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBytes32Array"
+  ): TypedContractMethod<[json: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBytesArray"
+  ): TypedContractMethod<[json: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonInt"
+  ): TypedContractMethod<[json: string, key: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonIntArray"
+  ): TypedContractMethod<[json: string, key: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonKeys"
+  ): TypedContractMethod<[json: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonString"
+  ): TypedContractMethod<[json: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonStringArray"
+  ): TypedContractMethod<[json: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonUint"
+  ): TypedContractMethod<[json: string, key: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonUintArray"
+  ): TypedContractMethod<[json: string, key: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "parseToml(string,string)"
+  ): TypedContractMethod<[toml: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseToml(string)"
+  ): TypedContractMethod<[toml: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlAddress"
+  ): TypedContractMethod<[toml: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlAddressArray"
+  ): TypedContractMethod<[toml: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBool"
+  ): TypedContractMethod<[toml: string, key: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBoolArray"
+  ): TypedContractMethod<[toml: string, key: string], [boolean[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBytes"
+  ): TypedContractMethod<[toml: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBytes32"
+  ): TypedContractMethod<[toml: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBytes32Array"
+  ): TypedContractMethod<[toml: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBytesArray"
+  ): TypedContractMethod<[toml: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlInt"
+  ): TypedContractMethod<[toml: string, key: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlIntArray"
+  ): TypedContractMethod<[toml: string, key: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlKeys"
+  ): TypedContractMethod<[toml: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlString"
+  ): TypedContractMethod<[toml: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlStringArray"
+  ): TypedContractMethod<[toml: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlUint"
+  ): TypedContractMethod<[toml: string, key: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlUintArray"
+  ): TypedContractMethod<[toml: string, key: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "parseUint"
+  ): TypedContractMethod<[stringifiedValue: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "pauseGasMetering"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "prank(address,address)"
+  ): TypedContractMethod<
+    [msgSender: AddressLike, txOrigin: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "prank(address)"
+  ): TypedContractMethod<[msgSender: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "prevrandao(bytes32)"
+  ): TypedContractMethod<[newPrevrandao: BytesLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "prevrandao(uint256)"
+  ): TypedContractMethod<[newPrevrandao: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "projectRoot"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "prompt"
+  ): TypedContractMethod<[promptText: string], [string], "nonpayable">;
+  getFunction(
+    nameOrSignature: "promptAddress"
+  ): TypedContractMethod<[promptText: string], [string], "nonpayable">;
+  getFunction(
+    nameOrSignature: "promptSecret"
+  ): TypedContractMethod<[promptText: string], [string], "nonpayable">;
+  getFunction(
+    nameOrSignature: "promptUint"
+  ): TypedContractMethod<[promptText: string], [bigint], "nonpayable">;
+  getFunction(
+    nameOrSignature: "readCallers"
+  ): TypedContractMethod<
+    [],
+    [
+      [bigint, string, string] & {
+        callerMode: bigint;
+        msgSender: string;
+        txOrigin: string;
+      }
+    ],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "readDir(string,uint64)"
+  ): TypedContractMethod<
+    [path: string, maxDepth: BigNumberish],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "readDir(string,uint64,bool)"
+  ): TypedContractMethod<
+    [path: string, maxDepth: BigNumberish, followLinks: boolean],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "readDir(string)"
+  ): TypedContractMethod<
+    [path: string],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "readFile"
+  ): TypedContractMethod<[path: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "readFileBinary"
+  ): TypedContractMethod<[path: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "readLine"
+  ): TypedContractMethod<[path: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "readLink"
+  ): TypedContractMethod<[linkPath: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "record"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "recordLogs"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "rememberKey"
+  ): TypedContractMethod<[privateKey: BigNumberish], [string], "nonpayable">;
+  getFunction(
+    nameOrSignature: "removeDir"
+  ): TypedContractMethod<
+    [path: string, recursive: boolean],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "removeFile"
+  ): TypedContractMethod<[path: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "replace"
+  ): TypedContractMethod<
+    [input: string, from: string, to: string],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "resetNonce"
+  ): TypedContractMethod<[account: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "resumeGasMetering"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "revertTo"
+  ): TypedContractMethod<[snapshotId: BigNumberish], [boolean], "nonpayable">;
+  getFunction(
+    nameOrSignature: "revertToAndDelete"
+  ): TypedContractMethod<[snapshotId: BigNumberish], [boolean], "nonpayable">;
+  getFunction(
+    nameOrSignature: "revokePersistent(address[])"
+  ): TypedContractMethod<[accounts: AddressLike[]], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "revokePersistent(address)"
+  ): TypedContractMethod<[account: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "roll"
+  ): TypedContractMethod<[newHeight: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "rollFork(bytes32)"
+  ): TypedContractMethod<[txHash: BytesLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "rollFork(uint256,uint256)"
+  ): TypedContractMethod<
+    [forkId: BigNumberish, blockNumber: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "rollFork(uint256)"
+  ): TypedContractMethod<[blockNumber: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "rollFork(uint256,bytes32)"
+  ): TypedContractMethod<
+    [forkId: BigNumberish, txHash: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "rpc"
+  ): TypedContractMethod<
+    [method: string, params: string],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "rpcUrl"
+  ): TypedContractMethod<[rpcAlias: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "rpcUrlStructs"
+  ): TypedContractMethod<[], [VmSafe.RpcStructOutput[]], "view">;
+  getFunction(
+    nameOrSignature: "rpcUrls"
+  ): TypedContractMethod<[], [[string, string][]], "view">;
+  getFunction(
+    nameOrSignature: "selectFork"
+  ): TypedContractMethod<[forkId: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "serializeAddress(string,string,address[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: AddressLike[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeAddress(string,string,address)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: AddressLike],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBool(string,string,bool[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: boolean[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBool(string,string,bool)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: boolean],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBytes(string,string,bytes[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BytesLike[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBytes(string,string,bytes)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BytesLike],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBytes32(string,string,bytes32[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BytesLike[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBytes32(string,string,bytes32)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BytesLike],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeInt(string,string,int256)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeInt(string,string,int256[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BigNumberish[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeJson"
+  ): TypedContractMethod<
+    [objectKey: string, value: string],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeString(string,string,string[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: string[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeString(string,string,string)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: string],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeUint(string,string,uint256)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeUint(string,string,uint256[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BigNumberish[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeUintToHex"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "setEnv"
+  ): TypedContractMethod<[name: string, value: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "setNonce"
+  ): TypedContractMethod<
+    [account: AddressLike, newNonce: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "setNonceUnsafe"
+  ): TypedContractMethod<
+    [account: AddressLike, newNonce: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "sign(bytes32)"
+  ): TypedContractMethod<
+    [digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "sign(address,bytes32)"
+  ): TypedContractMethod<
+    [signer: AddressLike, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "sign((address,uint256,uint256,uint256),bytes32)"
+  ): TypedContractMethod<
+    [wallet: VmSafe.WalletStruct, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "sign(uint256,bytes32)"
+  ): TypedContractMethod<
+    [privateKey: BigNumberish, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "signP256"
+  ): TypedContractMethod<
+    [privateKey: BigNumberish, digest: BytesLike],
+    [[string, string] & { r: string; s: string }],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "skip"
+  ): TypedContractMethod<[skipTest: boolean], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "sleep"
+  ): TypedContractMethod<[duration: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "snapshot"
+  ): TypedContractMethod<[], [bigint], "nonpayable">;
+  getFunction(
+    nameOrSignature: "split"
+  ): TypedContractMethod<
+    [input: string, delimiter: string],
+    [string[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "startBroadcast()"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "startBroadcast(address)"
+  ): TypedContractMethod<[signer: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "startBroadcast(uint256)"
+  ): TypedContractMethod<[privateKey: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "startMappingRecording"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "startPrank(address)"
+  ): TypedContractMethod<[msgSender: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "startPrank(address,address)"
+  ): TypedContractMethod<
+    [msgSender: AddressLike, txOrigin: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "startStateDiffRecording"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "stopAndReturnStateDiff"
+  ): TypedContractMethod<
+    [],
+    [VmSafe.AccountAccessStructOutput[]],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "stopBroadcast"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "stopExpectSafeMemory"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "stopMappingRecording"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "stopPrank"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "store"
+  ): TypedContractMethod<
+    [target: AddressLike, slot: BytesLike, value: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "toBase64(string)"
+  ): TypedContractMethod<[data: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "toBase64(bytes)"
+  ): TypedContractMethod<[data: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "toBase64URL(string)"
+  ): TypedContractMethod<[data: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "toBase64URL(bytes)"
+  ): TypedContractMethod<[data: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "toLowercase"
+  ): TypedContractMethod<[input: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(address)"
+  ): TypedContractMethod<[value: AddressLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(uint256)"
+  ): TypedContractMethod<[value: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(bytes)"
+  ): TypedContractMethod<[value: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(bool)"
+  ): TypedContractMethod<[value: boolean], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(int256)"
+  ): TypedContractMethod<[value: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(bytes32)"
+  ): TypedContractMethod<[value: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "toUppercase"
+  ): TypedContractMethod<[input: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "transact(uint256,bytes32)"
+  ): TypedContractMethod<
+    [forkId: BigNumberish, txHash: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "transact(bytes32)"
+  ): TypedContractMethod<[txHash: BytesLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "trim"
+  ): TypedContractMethod<[input: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "tryFfi"
+  ): TypedContractMethod<
+    [commandInput: string[]],
+    [VmSafe.FfiResultStructOutput],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "txGasPrice"
+  ): TypedContractMethod<[newGasPrice: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "unixTime"
+  ): TypedContractMethod<[], [bigint], "nonpayable">;
+  getFunction(
+    nameOrSignature: "warp"
+  ): TypedContractMethod<[newTimestamp: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "writeFile"
+  ): TypedContractMethod<[path: string, data: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "writeFileBinary"
+  ): TypedContractMethod<[path: string, data: BytesLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "writeJson(string,string,string)"
+  ): TypedContractMethod<
+    [json: string, path: string, valueKey: string],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "writeJson(string,string)"
+  ): TypedContractMethod<[json: string, path: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "writeLine"
+  ): TypedContractMethod<[path: string, data: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "writeToml(string,string,string)"
+  ): TypedContractMethod<
+    [json: string, path: string, valueKey: string],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "writeToml(string,string)"
+  ): TypedContractMethod<[json: string, path: string], [void], "nonpayable">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/Vm.sol/VmSafe.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/Vm.sol/VmSafe.ts
new file mode 100644
index 0000000000000000000000000000000000000000..41cc9b92a328a18df19c15030f0c5316fc18b464
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/Vm.sol/VmSafe.ts
@@ -0,0 +1,6379 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export declare namespace VmSafe {
+  export type WalletStruct = {
+    addr: AddressLike;
+    publicKeyX: BigNumberish;
+    publicKeyY: BigNumberish;
+    privateKey: BigNumberish;
+  };
+
+  export type WalletStructOutput = [
+    addr: string,
+    publicKeyX: bigint,
+    publicKeyY: bigint,
+    privateKey: bigint
+  ] & {
+    addr: string;
+    publicKeyX: bigint;
+    publicKeyY: bigint;
+    privateKey: bigint;
+  };
+
+  export type EthGetLogsStruct = {
+    emitter: AddressLike;
+    topics: BytesLike[];
+    data: BytesLike;
+    blockHash: BytesLike;
+    blockNumber: BigNumberish;
+    transactionHash: BytesLike;
+    transactionIndex: BigNumberish;
+    logIndex: BigNumberish;
+    removed: boolean;
+  };
+
+  export type EthGetLogsStructOutput = [
+    emitter: string,
+    topics: string[],
+    data: string,
+    blockHash: string,
+    blockNumber: bigint,
+    transactionHash: string,
+    transactionIndex: bigint,
+    logIndex: bigint,
+    removed: boolean
+  ] & {
+    emitter: string;
+    topics: string[];
+    data: string;
+    blockHash: string;
+    blockNumber: bigint;
+    transactionHash: string;
+    transactionIndex: bigint;
+    logIndex: bigint;
+    removed: boolean;
+  };
+
+  export type FsMetadataStruct = {
+    isDir: boolean;
+    isSymlink: boolean;
+    length: BigNumberish;
+    readOnly: boolean;
+    modified: BigNumberish;
+    accessed: BigNumberish;
+    created: BigNumberish;
+  };
+
+  export type FsMetadataStructOutput = [
+    isDir: boolean,
+    isSymlink: boolean,
+    length: bigint,
+    readOnly: boolean,
+    modified: bigint,
+    accessed: bigint,
+    created: bigint
+  ] & {
+    isDir: boolean;
+    isSymlink: boolean;
+    length: bigint;
+    readOnly: boolean;
+    modified: bigint;
+    accessed: bigint;
+    created: bigint;
+  };
+
+  export type LogStruct = {
+    topics: BytesLike[];
+    data: BytesLike;
+    emitter: AddressLike;
+  };
+
+  export type LogStructOutput = [
+    topics: string[],
+    data: string,
+    emitter: string
+  ] & { topics: string[]; data: string; emitter: string };
+
+  export type GasStruct = {
+    gasLimit: BigNumberish;
+    gasTotalUsed: BigNumberish;
+    gasMemoryUsed: BigNumberish;
+    gasRefunded: BigNumberish;
+    gasRemaining: BigNumberish;
+  };
+
+  export type GasStructOutput = [
+    gasLimit: bigint,
+    gasTotalUsed: bigint,
+    gasMemoryUsed: bigint,
+    gasRefunded: bigint,
+    gasRemaining: bigint
+  ] & {
+    gasLimit: bigint;
+    gasTotalUsed: bigint;
+    gasMemoryUsed: bigint;
+    gasRefunded: bigint;
+    gasRemaining: bigint;
+  };
+
+  export type DirEntryStruct = {
+    errorMessage: string;
+    path: string;
+    depth: BigNumberish;
+    isDir: boolean;
+    isSymlink: boolean;
+  };
+
+  export type DirEntryStructOutput = [
+    errorMessage: string,
+    path: string,
+    depth: bigint,
+    isDir: boolean,
+    isSymlink: boolean
+  ] & {
+    errorMessage: string;
+    path: string;
+    depth: bigint;
+    isDir: boolean;
+    isSymlink: boolean;
+  };
+
+  export type RpcStruct = { key: string; url: string };
+
+  export type RpcStructOutput = [key: string, url: string] & {
+    key: string;
+    url: string;
+  };
+
+  export type ChainInfoStruct = { forkId: BigNumberish; chainId: BigNumberish };
+
+  export type ChainInfoStructOutput = [forkId: bigint, chainId: bigint] & {
+    forkId: bigint;
+    chainId: bigint;
+  };
+
+  export type StorageAccessStruct = {
+    account: AddressLike;
+    slot: BytesLike;
+    isWrite: boolean;
+    previousValue: BytesLike;
+    newValue: BytesLike;
+    reverted: boolean;
+  };
+
+  export type StorageAccessStructOutput = [
+    account: string,
+    slot: string,
+    isWrite: boolean,
+    previousValue: string,
+    newValue: string,
+    reverted: boolean
+  ] & {
+    account: string;
+    slot: string;
+    isWrite: boolean;
+    previousValue: string;
+    newValue: string;
+    reverted: boolean;
+  };
+
+  export type AccountAccessStruct = {
+    chainInfo: VmSafe.ChainInfoStruct;
+    kind: BigNumberish;
+    account: AddressLike;
+    accessor: AddressLike;
+    initialized: boolean;
+    oldBalance: BigNumberish;
+    newBalance: BigNumberish;
+    deployedCode: BytesLike;
+    value: BigNumberish;
+    data: BytesLike;
+    reverted: boolean;
+    storageAccesses: VmSafe.StorageAccessStruct[];
+    depth: BigNumberish;
+  };
+
+  export type AccountAccessStructOutput = [
+    chainInfo: VmSafe.ChainInfoStructOutput,
+    kind: bigint,
+    account: string,
+    accessor: string,
+    initialized: boolean,
+    oldBalance: bigint,
+    newBalance: bigint,
+    deployedCode: string,
+    value: bigint,
+    data: string,
+    reverted: boolean,
+    storageAccesses: VmSafe.StorageAccessStructOutput[],
+    depth: bigint
+  ] & {
+    chainInfo: VmSafe.ChainInfoStructOutput;
+    kind: bigint;
+    account: string;
+    accessor: string;
+    initialized: boolean;
+    oldBalance: bigint;
+    newBalance: bigint;
+    deployedCode: string;
+    value: bigint;
+    data: string;
+    reverted: boolean;
+    storageAccesses: VmSafe.StorageAccessStructOutput[];
+    depth: bigint;
+  };
+
+  export type FfiResultStruct = {
+    exitCode: BigNumberish;
+    stdout: BytesLike;
+    stderr: BytesLike;
+  };
+
+  export type FfiResultStructOutput = [
+    exitCode: bigint,
+    stdout: string,
+    stderr: string
+  ] & { exitCode: bigint; stdout: string; stderr: string };
+}
+
+export interface VmSafeInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "accesses"
+      | "addr"
+      | "assertApproxEqAbs(uint256,uint256,uint256)"
+      | "assertApproxEqAbs(int256,int256,uint256)"
+      | "assertApproxEqAbs(int256,int256,uint256,string)"
+      | "assertApproxEqAbs(uint256,uint256,uint256,string)"
+      | "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256)"
+      | "assertApproxEqAbsDecimal(int256,int256,uint256,uint256)"
+      | "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256,string)"
+      | "assertApproxEqAbsDecimal(int256,int256,uint256,uint256,string)"
+      | "assertApproxEqRel(uint256,uint256,uint256,string)"
+      | "assertApproxEqRel(uint256,uint256,uint256)"
+      | "assertApproxEqRel(int256,int256,uint256,string)"
+      | "assertApproxEqRel(int256,int256,uint256)"
+      | "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256)"
+      | "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256,string)"
+      | "assertApproxEqRelDecimal(int256,int256,uint256,uint256)"
+      | "assertApproxEqRelDecimal(int256,int256,uint256,uint256,string)"
+      | "assertEq(bytes32[],bytes32[])"
+      | "assertEq(int256[],int256[],string)"
+      | "assertEq(address,address,string)"
+      | "assertEq(string,string,string)"
+      | "assertEq(address[],address[])"
+      | "assertEq(address[],address[],string)"
+      | "assertEq(bool,bool,string)"
+      | "assertEq(address,address)"
+      | "assertEq(uint256[],uint256[],string)"
+      | "assertEq(bool[],bool[])"
+      | "assertEq(int256[],int256[])"
+      | "assertEq(int256,int256,string)"
+      | "assertEq(bytes32,bytes32)"
+      | "assertEq(uint256,uint256,string)"
+      | "assertEq(uint256[],uint256[])"
+      | "assertEq(bytes,bytes)"
+      | "assertEq(uint256,uint256)"
+      | "assertEq(bytes32,bytes32,string)"
+      | "assertEq(string[],string[])"
+      | "assertEq(bytes32[],bytes32[],string)"
+      | "assertEq(bytes,bytes,string)"
+      | "assertEq(bool[],bool[],string)"
+      | "assertEq(bytes[],bytes[])"
+      | "assertEq(string[],string[],string)"
+      | "assertEq(string,string)"
+      | "assertEq(bytes[],bytes[],string)"
+      | "assertEq(bool,bool)"
+      | "assertEq(int256,int256)"
+      | "assertEqDecimal(uint256,uint256,uint256)"
+      | "assertEqDecimal(int256,int256,uint256)"
+      | "assertEqDecimal(int256,int256,uint256,string)"
+      | "assertEqDecimal(uint256,uint256,uint256,string)"
+      | "assertFalse(bool,string)"
+      | "assertFalse(bool)"
+      | "assertGe(int256,int256)"
+      | "assertGe(int256,int256,string)"
+      | "assertGe(uint256,uint256)"
+      | "assertGe(uint256,uint256,string)"
+      | "assertGeDecimal(uint256,uint256,uint256)"
+      | "assertGeDecimal(int256,int256,uint256,string)"
+      | "assertGeDecimal(uint256,uint256,uint256,string)"
+      | "assertGeDecimal(int256,int256,uint256)"
+      | "assertGt(int256,int256)"
+      | "assertGt(uint256,uint256,string)"
+      | "assertGt(uint256,uint256)"
+      | "assertGt(int256,int256,string)"
+      | "assertGtDecimal(int256,int256,uint256,string)"
+      | "assertGtDecimal(uint256,uint256,uint256,string)"
+      | "assertGtDecimal(int256,int256,uint256)"
+      | "assertGtDecimal(uint256,uint256,uint256)"
+      | "assertLe(int256,int256,string)"
+      | "assertLe(uint256,uint256)"
+      | "assertLe(int256,int256)"
+      | "assertLe(uint256,uint256,string)"
+      | "assertLeDecimal(int256,int256,uint256)"
+      | "assertLeDecimal(uint256,uint256,uint256,string)"
+      | "assertLeDecimal(int256,int256,uint256,string)"
+      | "assertLeDecimal(uint256,uint256,uint256)"
+      | "assertLt(int256,int256)"
+      | "assertLt(uint256,uint256,string)"
+      | "assertLt(int256,int256,string)"
+      | "assertLt(uint256,uint256)"
+      | "assertLtDecimal(uint256,uint256,uint256)"
+      | "assertLtDecimal(int256,int256,uint256,string)"
+      | "assertLtDecimal(uint256,uint256,uint256,string)"
+      | "assertLtDecimal(int256,int256,uint256)"
+      | "assertNotEq(bytes32[],bytes32[])"
+      | "assertNotEq(int256[],int256[])"
+      | "assertNotEq(bool,bool,string)"
+      | "assertNotEq(bytes[],bytes[],string)"
+      | "assertNotEq(bool,bool)"
+      | "assertNotEq(bool[],bool[])"
+      | "assertNotEq(bytes,bytes)"
+      | "assertNotEq(address[],address[])"
+      | "assertNotEq(int256,int256,string)"
+      | "assertNotEq(uint256[],uint256[])"
+      | "assertNotEq(bool[],bool[],string)"
+      | "assertNotEq(string,string)"
+      | "assertNotEq(address[],address[],string)"
+      | "assertNotEq(string,string,string)"
+      | "assertNotEq(address,address,string)"
+      | "assertNotEq(bytes32,bytes32)"
+      | "assertNotEq(bytes,bytes,string)"
+      | "assertNotEq(uint256,uint256,string)"
+      | "assertNotEq(uint256[],uint256[],string)"
+      | "assertNotEq(address,address)"
+      | "assertNotEq(bytes32,bytes32,string)"
+      | "assertNotEq(string[],string[],string)"
+      | "assertNotEq(uint256,uint256)"
+      | "assertNotEq(bytes32[],bytes32[],string)"
+      | "assertNotEq(string[],string[])"
+      | "assertNotEq(int256[],int256[],string)"
+      | "assertNotEq(bytes[],bytes[])"
+      | "assertNotEq(int256,int256)"
+      | "assertNotEqDecimal(int256,int256,uint256)"
+      | "assertNotEqDecimal(int256,int256,uint256,string)"
+      | "assertNotEqDecimal(uint256,uint256,uint256)"
+      | "assertNotEqDecimal(uint256,uint256,uint256,string)"
+      | "assertTrue(bool)"
+      | "assertTrue(bool,string)"
+      | "assume"
+      | "breakpoint(string)"
+      | "breakpoint(string,bool)"
+      | "broadcast()"
+      | "broadcast(address)"
+      | "broadcast(uint256)"
+      | "closeFile"
+      | "computeCreate2Address(bytes32,bytes32)"
+      | "computeCreate2Address(bytes32,bytes32,address)"
+      | "computeCreateAddress"
+      | "copyFile"
+      | "createDir"
+      | "createWallet(string)"
+      | "createWallet(uint256)"
+      | "createWallet(uint256,string)"
+      | "deriveKey(string,string,uint32,string)"
+      | "deriveKey(string,uint32,string)"
+      | "deriveKey(string,uint32)"
+      | "deriveKey(string,string,uint32)"
+      | "ensNamehash"
+      | "envAddress(string)"
+      | "envAddress(string,string)"
+      | "envBool(string)"
+      | "envBool(string,string)"
+      | "envBytes(string)"
+      | "envBytes(string,string)"
+      | "envBytes32(string,string)"
+      | "envBytes32(string)"
+      | "envExists"
+      | "envInt(string,string)"
+      | "envInt(string)"
+      | "envOr(string,string,bytes32[])"
+      | "envOr(string,string,int256[])"
+      | "envOr(string,bool)"
+      | "envOr(string,address)"
+      | "envOr(string,uint256)"
+      | "envOr(string,string,bytes[])"
+      | "envOr(string,string,uint256[])"
+      | "envOr(string,string,string[])"
+      | "envOr(string,bytes)"
+      | "envOr(string,bytes32)"
+      | "envOr(string,int256)"
+      | "envOr(string,string,address[])"
+      | "envOr(string,string)"
+      | "envOr(string,string,bool[])"
+      | "envString(string,string)"
+      | "envString(string)"
+      | "envUint(string)"
+      | "envUint(string,string)"
+      | "eth_getLogs"
+      | "exists"
+      | "ffi"
+      | "fsMetadata"
+      | "getBlobBaseFee"
+      | "getBlockNumber"
+      | "getBlockTimestamp"
+      | "getCode"
+      | "getDeployedCode"
+      | "getLabel"
+      | "getMappingKeyAndParentOf"
+      | "getMappingLength"
+      | "getMappingSlotAt"
+      | "getNonce(address)"
+      | "getNonce((address,uint256,uint256,uint256))"
+      | "getRecordedLogs"
+      | "indexOf"
+      | "isContext"
+      | "isDir"
+      | "isFile"
+      | "keyExists"
+      | "keyExistsJson"
+      | "keyExistsToml"
+      | "label"
+      | "lastCallGas"
+      | "load"
+      | "parseAddress"
+      | "parseBool"
+      | "parseBytes"
+      | "parseBytes32"
+      | "parseInt"
+      | "parseJson(string)"
+      | "parseJson(string,string)"
+      | "parseJsonAddress"
+      | "parseJsonAddressArray"
+      | "parseJsonBool"
+      | "parseJsonBoolArray"
+      | "parseJsonBytes"
+      | "parseJsonBytes32"
+      | "parseJsonBytes32Array"
+      | "parseJsonBytesArray"
+      | "parseJsonInt"
+      | "parseJsonIntArray"
+      | "parseJsonKeys"
+      | "parseJsonString"
+      | "parseJsonStringArray"
+      | "parseJsonUint"
+      | "parseJsonUintArray"
+      | "parseToml(string,string)"
+      | "parseToml(string)"
+      | "parseTomlAddress"
+      | "parseTomlAddressArray"
+      | "parseTomlBool"
+      | "parseTomlBoolArray"
+      | "parseTomlBytes"
+      | "parseTomlBytes32"
+      | "parseTomlBytes32Array"
+      | "parseTomlBytesArray"
+      | "parseTomlInt"
+      | "parseTomlIntArray"
+      | "parseTomlKeys"
+      | "parseTomlString"
+      | "parseTomlStringArray"
+      | "parseTomlUint"
+      | "parseTomlUintArray"
+      | "parseUint"
+      | "pauseGasMetering"
+      | "projectRoot"
+      | "prompt"
+      | "promptAddress"
+      | "promptSecret"
+      | "promptUint"
+      | "readDir(string,uint64)"
+      | "readDir(string,uint64,bool)"
+      | "readDir(string)"
+      | "readFile"
+      | "readFileBinary"
+      | "readLine"
+      | "readLink"
+      | "record"
+      | "recordLogs"
+      | "rememberKey"
+      | "removeDir"
+      | "removeFile"
+      | "replace"
+      | "resumeGasMetering"
+      | "rpc"
+      | "rpcUrl"
+      | "rpcUrlStructs"
+      | "rpcUrls"
+      | "serializeAddress(string,string,address[])"
+      | "serializeAddress(string,string,address)"
+      | "serializeBool(string,string,bool[])"
+      | "serializeBool(string,string,bool)"
+      | "serializeBytes(string,string,bytes[])"
+      | "serializeBytes(string,string,bytes)"
+      | "serializeBytes32(string,string,bytes32[])"
+      | "serializeBytes32(string,string,bytes32)"
+      | "serializeInt(string,string,int256)"
+      | "serializeInt(string,string,int256[])"
+      | "serializeJson"
+      | "serializeString(string,string,string[])"
+      | "serializeString(string,string,string)"
+      | "serializeUint(string,string,uint256)"
+      | "serializeUint(string,string,uint256[])"
+      | "serializeUintToHex"
+      | "setEnv"
+      | "sign(bytes32)"
+      | "sign(address,bytes32)"
+      | "sign((address,uint256,uint256,uint256),bytes32)"
+      | "sign(uint256,bytes32)"
+      | "signP256"
+      | "sleep"
+      | "split"
+      | "startBroadcast()"
+      | "startBroadcast(address)"
+      | "startBroadcast(uint256)"
+      | "startMappingRecording"
+      | "startStateDiffRecording"
+      | "stopAndReturnStateDiff"
+      | "stopBroadcast"
+      | "stopMappingRecording"
+      | "toBase64(string)"
+      | "toBase64(bytes)"
+      | "toBase64URL(string)"
+      | "toBase64URL(bytes)"
+      | "toLowercase"
+      | "toString(address)"
+      | "toString(uint256)"
+      | "toString(bytes)"
+      | "toString(bool)"
+      | "toString(int256)"
+      | "toString(bytes32)"
+      | "toUppercase"
+      | "trim"
+      | "tryFfi"
+      | "unixTime"
+      | "writeFile"
+      | "writeFileBinary"
+      | "writeJson(string,string,string)"
+      | "writeJson(string,string)"
+      | "writeLine"
+      | "writeToml(string,string,string)"
+      | "writeToml(string,string)"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "accesses",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(functionFragment: "addr", values: [BigNumberish]): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbs(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbs(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbs(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbs(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRel(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRel(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRel(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRel(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRelDecimal(int256,int256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertApproxEqRelDecimal(int256,int256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes32[],bytes32[])",
+    values: [BytesLike[], BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(int256[],int256[],string)",
+    values: [BigNumberish[], BigNumberish[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(address,address,string)",
+    values: [AddressLike, AddressLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(string,string,string)",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(address[],address[])",
+    values: [AddressLike[], AddressLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(address[],address[],string)",
+    values: [AddressLike[], AddressLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bool,bool,string)",
+    values: [boolean, boolean, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(address,address)",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(uint256[],uint256[],string)",
+    values: [BigNumberish[], BigNumberish[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bool[],bool[])",
+    values: [boolean[], boolean[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(int256[],int256[])",
+    values: [BigNumberish[], BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes32,bytes32)",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(uint256[],uint256[])",
+    values: [BigNumberish[], BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes,bytes)",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes32,bytes32,string)",
+    values: [BytesLike, BytesLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(string[],string[])",
+    values: [string[], string[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes32[],bytes32[],string)",
+    values: [BytesLike[], BytesLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes,bytes,string)",
+    values: [BytesLike, BytesLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bool[],bool[],string)",
+    values: [boolean[], boolean[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes[],bytes[])",
+    values: [BytesLike[], BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(string[],string[],string)",
+    values: [string[], string[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bytes[],bytes[],string)",
+    values: [BytesLike[], BytesLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(bool,bool)",
+    values: [boolean, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEq(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEqDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEqDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEqDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertEqDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertFalse(bool,string)",
+    values: [boolean, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertFalse(bool)",
+    values: [boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGe(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGe(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGe(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGe(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGeDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGeDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGeDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGeDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGt(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGt(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGt(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGt(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGtDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGtDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGtDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertGtDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLe(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLe(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLe(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLe(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLeDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLeDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLeDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLeDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLt(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLt(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLt(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLt(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLtDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLtDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLtDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertLtDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes32[],bytes32[])",
+    values: [BytesLike[], BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(int256[],int256[])",
+    values: [BigNumberish[], BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bool,bool,string)",
+    values: [boolean, boolean, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes[],bytes[],string)",
+    values: [BytesLike[], BytesLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bool,bool)",
+    values: [boolean, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bool[],bool[])",
+    values: [boolean[], boolean[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes,bytes)",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(address[],address[])",
+    values: [AddressLike[], AddressLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(int256,int256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(uint256[],uint256[])",
+    values: [BigNumberish[], BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bool[],bool[],string)",
+    values: [boolean[], boolean[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(address[],address[],string)",
+    values: [AddressLike[], AddressLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(string,string,string)",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(address,address,string)",
+    values: [AddressLike, AddressLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes32,bytes32)",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes,bytes,string)",
+    values: [BytesLike, BytesLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(uint256[],uint256[],string)",
+    values: [BigNumberish[], BigNumberish[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(address,address)",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes32,bytes32,string)",
+    values: [BytesLike, BytesLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(string[],string[],string)",
+    values: [string[], string[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(uint256,uint256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes32[],bytes32[],string)",
+    values: [BytesLike[], BytesLike[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(string[],string[])",
+    values: [string[], string[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(int256[],int256[],string)",
+    values: [BigNumberish[], BigNumberish[], string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(bytes[],bytes[])",
+    values: [BytesLike[], BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEq(int256,int256)",
+    values: [BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEqDecimal(int256,int256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEqDecimal(int256,int256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEqDecimal(uint256,uint256,uint256)",
+    values: [BigNumberish, BigNumberish, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertNotEqDecimal(uint256,uint256,uint256,string)",
+    values: [BigNumberish, BigNumberish, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertTrue(bool)",
+    values: [boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "assertTrue(bool,string)",
+    values: [boolean, string]
+  ): string;
+  encodeFunctionData(functionFragment: "assume", values: [boolean]): string;
+  encodeFunctionData(
+    functionFragment: "breakpoint(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "breakpoint(string,bool)",
+    values: [string, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "broadcast()",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "broadcast(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "broadcast(uint256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "closeFile", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "computeCreate2Address(bytes32,bytes32)",
+    values: [BytesLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "computeCreate2Address(bytes32,bytes32,address)",
+    values: [BytesLike, BytesLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "computeCreateAddress",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "copyFile",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createDir",
+    values: [string, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createWallet(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createWallet(uint256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "createWallet(uint256,string)",
+    values: [BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "deriveKey(string,string,uint32,string)",
+    values: [string, string, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "deriveKey(string,uint32,string)",
+    values: [string, BigNumberish, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "deriveKey(string,uint32)",
+    values: [string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "deriveKey(string,string,uint32)",
+    values: [string, string, BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "ensNamehash", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "envAddress(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envAddress(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBool(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBool(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBytes(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBytes(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBytes32(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envBytes32(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "envExists", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "envInt(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envInt(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,bytes32[])",
+    values: [string, string, BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,int256[])",
+    values: [string, string, BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,bool)",
+    values: [string, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,address)",
+    values: [string, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,uint256)",
+    values: [string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,bytes[])",
+    values: [string, string, BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,uint256[])",
+    values: [string, string, BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,string[])",
+    values: [string, string, string[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,bytes)",
+    values: [string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,bytes32)",
+    values: [string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,int256)",
+    values: [string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,address[])",
+    values: [string, string, AddressLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envOr(string,string,bool[])",
+    values: [string, string, boolean[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envString(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envString(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envUint(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "envUint(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "eth_getLogs",
+    values: [BigNumberish, BigNumberish, AddressLike, BytesLike[]]
+  ): string;
+  encodeFunctionData(functionFragment: "exists", values: [string]): string;
+  encodeFunctionData(functionFragment: "ffi", values: [string[]]): string;
+  encodeFunctionData(functionFragment: "fsMetadata", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "getBlobBaseFee",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getBlockNumber",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getBlockTimestamp",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "getCode", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "getDeployedCode",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getLabel",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getMappingKeyAndParentOf",
+    values: [AddressLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getMappingLength",
+    values: [AddressLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getMappingSlotAt",
+    values: [AddressLike, BytesLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getNonce(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getNonce((address,uint256,uint256,uint256))",
+    values: [VmSafe.WalletStruct]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getRecordedLogs",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "indexOf",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "isContext",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "isDir", values: [string]): string;
+  encodeFunctionData(functionFragment: "isFile", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "keyExists",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "keyExistsJson",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "keyExistsToml",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "label",
+    values: [AddressLike, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "lastCallGas",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "load",
+    values: [AddressLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseAddress",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "parseBool", values: [string]): string;
+  encodeFunctionData(functionFragment: "parseBytes", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "parseBytes32",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "parseInt", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "parseJson(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJson(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonAddress",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonAddressArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBool",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBoolArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBytes",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBytes32",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBytes32Array",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonBytesArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonInt",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonIntArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonKeys",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonString",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonStringArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonUint",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseJsonUintArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseToml(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseToml(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlAddress",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlAddressArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBool",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBoolArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBytes",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBytes32",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBytes32Array",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlBytesArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlInt",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlIntArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlKeys",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlString",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlStringArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlUint",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "parseTomlUintArray",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(functionFragment: "parseUint", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "pauseGasMetering",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "projectRoot",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "prompt", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "promptAddress",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "promptSecret",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "promptUint", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "readDir(string,uint64)",
+    values: [string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "readDir(string,uint64,bool)",
+    values: [string, BigNumberish, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "readDir(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "readFile", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "readFileBinary",
+    values: [string]
+  ): string;
+  encodeFunctionData(functionFragment: "readLine", values: [string]): string;
+  encodeFunctionData(functionFragment: "readLink", values: [string]): string;
+  encodeFunctionData(functionFragment: "record", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "recordLogs",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "rememberKey",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "removeDir",
+    values: [string, boolean]
+  ): string;
+  encodeFunctionData(functionFragment: "removeFile", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "replace",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "resumeGasMetering",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "rpc", values: [string, string]): string;
+  encodeFunctionData(functionFragment: "rpcUrl", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "rpcUrlStructs",
+    values?: undefined
+  ): string;
+  encodeFunctionData(functionFragment: "rpcUrls", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "serializeAddress(string,string,address[])",
+    values: [string, string, AddressLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeAddress(string,string,address)",
+    values: [string, string, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBool(string,string,bool[])",
+    values: [string, string, boolean[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBool(string,string,bool)",
+    values: [string, string, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBytes(string,string,bytes[])",
+    values: [string, string, BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBytes(string,string,bytes)",
+    values: [string, string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBytes32(string,string,bytes32[])",
+    values: [string, string, BytesLike[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeBytes32(string,string,bytes32)",
+    values: [string, string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeInt(string,string,int256)",
+    values: [string, string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeInt(string,string,int256[])",
+    values: [string, string, BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeJson",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeString(string,string,string[])",
+    values: [string, string, string[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeString(string,string,string)",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeUint(string,string,uint256)",
+    values: [string, string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeUint(string,string,uint256[])",
+    values: [string, string, BigNumberish[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "serializeUintToHex",
+    values: [string, string, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "setEnv",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "sign(bytes32)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "sign(address,bytes32)",
+    values: [AddressLike, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "sign((address,uint256,uint256,uint256),bytes32)",
+    values: [VmSafe.WalletStruct, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "sign(uint256,bytes32)",
+    values: [BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "signP256",
+    values: [BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "sleep", values: [BigNumberish]): string;
+  encodeFunctionData(
+    functionFragment: "split",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startBroadcast()",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startBroadcast(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startBroadcast(uint256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startMappingRecording",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "startStateDiffRecording",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "stopAndReturnStateDiff",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "stopBroadcast",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "stopMappingRecording",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toBase64(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toBase64(bytes)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toBase64URL(string)",
+    values: [string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toBase64URL(bytes)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "toLowercase", values: [string]): string;
+  encodeFunctionData(
+    functionFragment: "toString(address)",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toString(uint256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toString(bytes)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toString(bool)",
+    values: [boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toString(int256)",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "toString(bytes32)",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "toUppercase", values: [string]): string;
+  encodeFunctionData(functionFragment: "trim", values: [string]): string;
+  encodeFunctionData(functionFragment: "tryFfi", values: [string[]]): string;
+  encodeFunctionData(functionFragment: "unixTime", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "writeFile",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeFileBinary",
+    values: [string, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeJson(string,string,string)",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeJson(string,string)",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeLine",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeToml(string,string,string)",
+    values: [string, string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "writeToml(string,string)",
+    values: [string, string]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "accesses", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "addr", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbs(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbs(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbs(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbs(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRel(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRel(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRel(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRel(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRelDecimal(int256,int256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertApproxEqRelDecimal(int256,int256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes32[],bytes32[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(int256[],int256[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(address,address,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(string,string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(address[],address[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(address[],address[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bool,bool,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(address,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(uint256[],uint256[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bool[],bool[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(int256[],int256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes32,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(uint256[],uint256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes32,bytes32,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(string[],string[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes32[],bytes32[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes,bytes,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bool[],bool[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes[],bytes[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(string[],string[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bytes[],bytes[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(bool,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEq(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEqDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEqDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEqDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertEqDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertFalse(bool,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertFalse(bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGe(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGe(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGe(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGe(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGeDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGeDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGeDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGeDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGt(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGt(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGt(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGt(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGtDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGtDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGtDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertGtDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLe(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLe(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLe(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLe(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLeDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLeDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLeDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLeDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLt(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLt(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLt(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLt(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLtDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLtDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLtDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertLtDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes32[],bytes32[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(int256[],int256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bool,bool,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes[],bytes[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bool,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bool[],bool[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(address[],address[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(int256,int256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(uint256[],uint256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bool[],bool[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(address[],address[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(string,string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(address,address,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes32,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes,bytes,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(uint256[],uint256[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(address,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes32,bytes32,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(string[],string[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes32[],bytes32[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(string[],string[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(int256[],int256[],string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(bytes[],bytes[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEq(int256,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEqDecimal(int256,int256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEqDecimal(int256,int256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEqDecimal(uint256,uint256,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertNotEqDecimal(uint256,uint256,uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertTrue(bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "assertTrue(bool,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "assume", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "breakpoint(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "breakpoint(string,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "broadcast()",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "broadcast(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "broadcast(uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "closeFile", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "computeCreate2Address(bytes32,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "computeCreate2Address(bytes32,bytes32,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "computeCreateAddress",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "copyFile", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "createDir", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "createWallet(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "createWallet(uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "createWallet(uint256,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "deriveKey(string,string,uint32,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "deriveKey(string,uint32,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "deriveKey(string,uint32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "deriveKey(string,string,uint32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "ensNamehash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envAddress(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envAddress(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBool(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBool(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBytes(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBytes(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBytes32(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envBytes32(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "envExists", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "envInt(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envInt(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,bytes32[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,int256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,bytes[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,uint256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,string[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,address[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envOr(string,string,bool[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envString(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envString(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envUint(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "envUint(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "eth_getLogs",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "exists", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "ffi", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "fsMetadata", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getBlobBaseFee",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getBlockNumber",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getBlockTimestamp",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "getCode", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getDeployedCode",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "getLabel", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getMappingKeyAndParentOf",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getMappingLength",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getMappingSlotAt",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getNonce(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getNonce((address,uint256,uint256,uint256))",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getRecordedLogs",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "indexOf", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "isContext", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "isDir", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "isFile", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "keyExists", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "keyExistsJson",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "keyExistsToml",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "label", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "lastCallGas",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "load", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "parseAddress",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "parseBool", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "parseBytes", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "parseBytes32",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "parseInt", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJson(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJson(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonAddress",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonAddressArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBool",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBoolArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBytes",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBytes32",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBytes32Array",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonBytesArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonInt",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonIntArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonKeys",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonString",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonStringArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonUint",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseJsonUintArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseToml(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseToml(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlAddress",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlAddressArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBool",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBoolArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBytes",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBytes32",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBytes32Array",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlBytesArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlInt",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlIntArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlKeys",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlString",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlStringArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlUint",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "parseTomlUintArray",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "parseUint", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "pauseGasMetering",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "projectRoot",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "prompt", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "promptAddress",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "promptSecret",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "promptUint", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "readDir(string,uint64)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "readDir(string,uint64,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "readDir(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "readFile", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "readFileBinary",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "readLine", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "readLink", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "record", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "recordLogs", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "rememberKey",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "removeDir", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "removeFile", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "replace", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "resumeGasMetering",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "rpc", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "rpcUrl", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "rpcUrlStructs",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "rpcUrls", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeAddress(string,string,address[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeAddress(string,string,address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBool(string,string,bool[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBool(string,string,bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBytes(string,string,bytes[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBytes(string,string,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBytes32(string,string,bytes32[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeBytes32(string,string,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeInt(string,string,int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeInt(string,string,int256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeJson",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeString(string,string,string[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeString(string,string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeUint(string,string,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeUint(string,string,uint256[])",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "serializeUintToHex",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "setEnv", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "sign(bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "sign(address,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "sign((address,uint256,uint256,uint256),bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "sign(uint256,bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "signP256", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "sleep", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "split", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "startBroadcast()",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "startBroadcast(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "startBroadcast(uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "startMappingRecording",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "startStateDiffRecording",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "stopAndReturnStateDiff",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "stopBroadcast",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "stopMappingRecording",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toBase64(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toBase64(bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toBase64URL(string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toBase64URL(bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toLowercase",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(address)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(bool)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(int256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toString(bytes32)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "toUppercase",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "trim", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "tryFfi", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "unixTime", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "writeFile", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "writeFileBinary",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "writeJson(string,string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "writeJson(string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "writeLine", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "writeToml(string,string,string)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "writeToml(string,string)",
+    data: BytesLike
+  ): Result;
+}
+
+export interface VmSafe extends BaseContract {
+  connect(runner?: ContractRunner | null): VmSafe;
+  waitForDeployment(): Promise<this>;
+
+  interface: VmSafeInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  accesses: TypedContractMethod<
+    [target: AddressLike],
+    [[string[], string[]] & { readSlots: string[]; writeSlots: string[] }],
+    "nonpayable"
+  >;
+
+  addr: TypedContractMethod<[privateKey: BigNumberish], [string], "view">;
+
+  "assertApproxEqAbs(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbs(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbs(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbs(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbsDecimal(int256,int256,uint256,uint256)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqAbsDecimal(int256,int256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRel(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRel(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxPercentDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRel(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRel(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxPercentDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRelDecimal(int256,int256,uint256,uint256)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertApproxEqRelDecimal(int256,int256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes32[],bytes32[])": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(int256[],int256[],string)": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(address,address,string)": TypedContractMethod<
+    [left: AddressLike, right: AddressLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(string,string,string)": TypedContractMethod<
+    [left: string, right: string, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(address[],address[])": TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(address[],address[],string)": TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bool,bool,string)": TypedContractMethod<
+    [left: boolean, right: boolean, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(address,address)": TypedContractMethod<
+    [left: AddressLike, right: AddressLike],
+    [void],
+    "view"
+  >;
+
+  "assertEq(uint256[],uint256[],string)": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bool[],bool[])": TypedContractMethod<
+    [left: boolean[], right: boolean[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(int256[],int256[])": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes32,bytes32)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike],
+    [void],
+    "view"
+  >;
+
+  "assertEq(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(uint256[],uint256[])": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes,bytes)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike],
+    [void],
+    "view"
+  >;
+
+  "assertEq(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes32,bytes32,string)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(string[],string[])": TypedContractMethod<
+    [left: string[], right: string[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes32[],bytes32[],string)": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes,bytes,string)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bool[],bool[],string)": TypedContractMethod<
+    [left: boolean[], right: boolean[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes[],bytes[])": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertEq(string[],string[],string)": TypedContractMethod<
+    [left: string[], right: string[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(string,string)": TypedContractMethod<
+    [left: string, right: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bytes[],bytes[],string)": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertEq(bool,bool)": TypedContractMethod<
+    [left: boolean, right: boolean],
+    [void],
+    "view"
+  >;
+
+  "assertEq(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertEqDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertEqDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertEqDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertEqDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertFalse(bool,string)": TypedContractMethod<
+    [condition: boolean, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertFalse(bool)": TypedContractMethod<
+    [condition: boolean],
+    [void],
+    "view"
+  >;
+
+  "assertGe(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGe(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertGe(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGe(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertGeDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGeDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertGeDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertGeDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGt(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGt(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertGt(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGt(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertGtDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertGtDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertGtDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertGtDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLe(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertLe(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLe(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLe(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertLeDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLeDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertLeDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertLeDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLt(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLt(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertLt(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertLt(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLtDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertLtDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertLtDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertLtDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes32[],bytes32[])": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(int256[],int256[])": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bool,bool,string)": TypedContractMethod<
+    [left: boolean, right: boolean, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes[],bytes[],string)": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bool,bool)": TypedContractMethod<
+    [left: boolean, right: boolean],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bool[],bool[])": TypedContractMethod<
+    [left: boolean[], right: boolean[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes,bytes)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(address[],address[])": TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(int256,int256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(uint256[],uint256[])": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bool[],bool[],string)": TypedContractMethod<
+    [left: boolean[], right: boolean[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(string,string)": TypedContractMethod<
+    [left: string, right: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(address[],address[],string)": TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(string,string,string)": TypedContractMethod<
+    [left: string, right: string, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(address,address,string)": TypedContractMethod<
+    [left: AddressLike, right: AddressLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes32,bytes32)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes,bytes,string)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(uint256,uint256,string)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(uint256[],uint256[],string)": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(address,address)": TypedContractMethod<
+    [left: AddressLike, right: AddressLike],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes32,bytes32,string)": TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(string[],string[],string)": TypedContractMethod<
+    [left: string[], right: string[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes32[],bytes32[],string)": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(string[],string[])": TypedContractMethod<
+    [left: string[], right: string[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(int256[],int256[],string)": TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(bytes[],bytes[])": TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+
+  "assertNotEq(int256,int256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertNotEqDecimal(int256,int256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertNotEqDecimal(int256,int256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertNotEqDecimal(uint256,uint256,uint256)": TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+
+  "assertNotEqDecimal(uint256,uint256,uint256,string)": TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+
+  "assertTrue(bool)": TypedContractMethod<[condition: boolean], [void], "view">;
+
+  "assertTrue(bool,string)": TypedContractMethod<
+    [condition: boolean, error: string],
+    [void],
+    "view"
+  >;
+
+  assume: TypedContractMethod<[condition: boolean], [void], "view">;
+
+  "breakpoint(string)": TypedContractMethod<
+    [char: string],
+    [void],
+    "nonpayable"
+  >;
+
+  "breakpoint(string,bool)": TypedContractMethod<
+    [char: string, value: boolean],
+    [void],
+    "nonpayable"
+  >;
+
+  "broadcast()": TypedContractMethod<[], [void], "nonpayable">;
+
+  "broadcast(address)": TypedContractMethod<
+    [signer: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "broadcast(uint256)": TypedContractMethod<
+    [privateKey: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  closeFile: TypedContractMethod<[path: string], [void], "nonpayable">;
+
+  "computeCreate2Address(bytes32,bytes32)": TypedContractMethod<
+    [salt: BytesLike, initCodeHash: BytesLike],
+    [string],
+    "view"
+  >;
+
+  "computeCreate2Address(bytes32,bytes32,address)": TypedContractMethod<
+    [salt: BytesLike, initCodeHash: BytesLike, deployer: AddressLike],
+    [string],
+    "view"
+  >;
+
+  computeCreateAddress: TypedContractMethod<
+    [deployer: AddressLike, nonce: BigNumberish],
+    [string],
+    "view"
+  >;
+
+  copyFile: TypedContractMethod<
+    [from: string, to: string],
+    [bigint],
+    "nonpayable"
+  >;
+
+  createDir: TypedContractMethod<
+    [path: string, recursive: boolean],
+    [void],
+    "nonpayable"
+  >;
+
+  "createWallet(string)": TypedContractMethod<
+    [walletLabel: string],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+
+  "createWallet(uint256)": TypedContractMethod<
+    [privateKey: BigNumberish],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+
+  "createWallet(uint256,string)": TypedContractMethod<
+    [privateKey: BigNumberish, walletLabel: string],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+
+  "deriveKey(string,string,uint32,string)": TypedContractMethod<
+    [
+      mnemonic: string,
+      derivationPath: string,
+      index: BigNumberish,
+      language: string
+    ],
+    [bigint],
+    "view"
+  >;
+
+  "deriveKey(string,uint32,string)": TypedContractMethod<
+    [mnemonic: string, index: BigNumberish, language: string],
+    [bigint],
+    "view"
+  >;
+
+  "deriveKey(string,uint32)": TypedContractMethod<
+    [mnemonic: string, index: BigNumberish],
+    [bigint],
+    "view"
+  >;
+
+  "deriveKey(string,string,uint32)": TypedContractMethod<
+    [mnemonic: string, derivationPath: string, index: BigNumberish],
+    [bigint],
+    "view"
+  >;
+
+  ensNamehash: TypedContractMethod<[name: string], [string], "view">;
+
+  "envAddress(string)": TypedContractMethod<[name: string], [string], "view">;
+
+  "envAddress(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [string[]],
+    "view"
+  >;
+
+  "envBool(string)": TypedContractMethod<[name: string], [boolean], "view">;
+
+  "envBool(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [boolean[]],
+    "view"
+  >;
+
+  "envBytes(string)": TypedContractMethod<[name: string], [string], "view">;
+
+  "envBytes(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [string[]],
+    "view"
+  >;
+
+  "envBytes32(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [string[]],
+    "view"
+  >;
+
+  "envBytes32(string)": TypedContractMethod<[name: string], [string], "view">;
+
+  envExists: TypedContractMethod<[name: string], [boolean], "view">;
+
+  "envInt(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [bigint[]],
+    "view"
+  >;
+
+  "envInt(string)": TypedContractMethod<[name: string], [bigint], "view">;
+
+  "envOr(string,string,bytes32[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: BytesLike[]],
+    [string[]],
+    "view"
+  >;
+
+  "envOr(string,string,int256[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: BigNumberish[]],
+    [bigint[]],
+    "view"
+  >;
+
+  "envOr(string,bool)": TypedContractMethod<
+    [name: string, defaultValue: boolean],
+    [boolean],
+    "view"
+  >;
+
+  "envOr(string,address)": TypedContractMethod<
+    [name: string, defaultValue: AddressLike],
+    [string],
+    "view"
+  >;
+
+  "envOr(string,uint256)": TypedContractMethod<
+    [name: string, defaultValue: BigNumberish],
+    [bigint],
+    "view"
+  >;
+
+  "envOr(string,string,bytes[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: BytesLike[]],
+    [string[]],
+    "view"
+  >;
+
+  "envOr(string,string,uint256[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: BigNumberish[]],
+    [bigint[]],
+    "view"
+  >;
+
+  "envOr(string,string,string[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: string[]],
+    [string[]],
+    "view"
+  >;
+
+  "envOr(string,bytes)": TypedContractMethod<
+    [name: string, defaultValue: BytesLike],
+    [string],
+    "view"
+  >;
+
+  "envOr(string,bytes32)": TypedContractMethod<
+    [name: string, defaultValue: BytesLike],
+    [string],
+    "view"
+  >;
+
+  "envOr(string,int256)": TypedContractMethod<
+    [name: string, defaultValue: BigNumberish],
+    [bigint],
+    "view"
+  >;
+
+  "envOr(string,string,address[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: AddressLike[]],
+    [string[]],
+    "view"
+  >;
+
+  "envOr(string,string)": TypedContractMethod<
+    [name: string, defaultValue: string],
+    [string],
+    "view"
+  >;
+
+  "envOr(string,string,bool[])": TypedContractMethod<
+    [name: string, delim: string, defaultValue: boolean[]],
+    [boolean[]],
+    "view"
+  >;
+
+  "envString(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [string[]],
+    "view"
+  >;
+
+  "envString(string)": TypedContractMethod<[name: string], [string], "view">;
+
+  "envUint(string)": TypedContractMethod<[name: string], [bigint], "view">;
+
+  "envUint(string,string)": TypedContractMethod<
+    [name: string, delim: string],
+    [bigint[]],
+    "view"
+  >;
+
+  eth_getLogs: TypedContractMethod<
+    [
+      fromBlock: BigNumberish,
+      toBlock: BigNumberish,
+      target: AddressLike,
+      topics: BytesLike[]
+    ],
+    [VmSafe.EthGetLogsStructOutput[]],
+    "nonpayable"
+  >;
+
+  exists: TypedContractMethod<[path: string], [boolean], "nonpayable">;
+
+  ffi: TypedContractMethod<[commandInput: string[]], [string], "nonpayable">;
+
+  fsMetadata: TypedContractMethod<
+    [path: string],
+    [VmSafe.FsMetadataStructOutput],
+    "view"
+  >;
+
+  getBlobBaseFee: TypedContractMethod<[], [bigint], "view">;
+
+  getBlockNumber: TypedContractMethod<[], [bigint], "view">;
+
+  getBlockTimestamp: TypedContractMethod<[], [bigint], "view">;
+
+  getCode: TypedContractMethod<[artifactPath: string], [string], "view">;
+
+  getDeployedCode: TypedContractMethod<
+    [artifactPath: string],
+    [string],
+    "view"
+  >;
+
+  getLabel: TypedContractMethod<[account: AddressLike], [string], "view">;
+
+  getMappingKeyAndParentOf: TypedContractMethod<
+    [target: AddressLike, elementSlot: BytesLike],
+    [
+      [boolean, string, string] & {
+        found: boolean;
+        key: string;
+        parent: string;
+      }
+    ],
+    "nonpayable"
+  >;
+
+  getMappingLength: TypedContractMethod<
+    [target: AddressLike, mappingSlot: BytesLike],
+    [bigint],
+    "nonpayable"
+  >;
+
+  getMappingSlotAt: TypedContractMethod<
+    [target: AddressLike, mappingSlot: BytesLike, idx: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+
+  "getNonce(address)": TypedContractMethod<
+    [account: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  "getNonce((address,uint256,uint256,uint256))": TypedContractMethod<
+    [wallet: VmSafe.WalletStruct],
+    [bigint],
+    "nonpayable"
+  >;
+
+  getRecordedLogs: TypedContractMethod<
+    [],
+    [VmSafe.LogStructOutput[]],
+    "nonpayable"
+  >;
+
+  indexOf: TypedContractMethod<[input: string, key: string], [bigint], "view">;
+
+  isContext: TypedContractMethod<[context: BigNumberish], [boolean], "view">;
+
+  isDir: TypedContractMethod<[path: string], [boolean], "nonpayable">;
+
+  isFile: TypedContractMethod<[path: string], [boolean], "nonpayable">;
+
+  keyExists: TypedContractMethod<
+    [json: string, key: string],
+    [boolean],
+    "view"
+  >;
+
+  keyExistsJson: TypedContractMethod<
+    [json: string, key: string],
+    [boolean],
+    "view"
+  >;
+
+  keyExistsToml: TypedContractMethod<
+    [toml: string, key: string],
+    [boolean],
+    "view"
+  >;
+
+  label: TypedContractMethod<
+    [account: AddressLike, newLabel: string],
+    [void],
+    "nonpayable"
+  >;
+
+  lastCallGas: TypedContractMethod<[], [VmSafe.GasStructOutput], "view">;
+
+  load: TypedContractMethod<
+    [target: AddressLike, slot: BytesLike],
+    [string],
+    "view"
+  >;
+
+  parseAddress: TypedContractMethod<
+    [stringifiedValue: string],
+    [string],
+    "view"
+  >;
+
+  parseBool: TypedContractMethod<[stringifiedValue: string], [boolean], "view">;
+
+  parseBytes: TypedContractMethod<[stringifiedValue: string], [string], "view">;
+
+  parseBytes32: TypedContractMethod<
+    [stringifiedValue: string],
+    [string],
+    "view"
+  >;
+
+  parseInt: TypedContractMethod<[stringifiedValue: string], [bigint], "view">;
+
+  "parseJson(string)": TypedContractMethod<[json: string], [string], "view">;
+
+  "parseJson(string,string)": TypedContractMethod<
+    [json: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseJsonAddress: TypedContractMethod<
+    [json: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseJsonAddressArray: TypedContractMethod<
+    [json: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseJsonBool: TypedContractMethod<
+    [json: string, key: string],
+    [boolean],
+    "view"
+  >;
+
+  parseJsonBoolArray: TypedContractMethod<
+    [json: string, key: string],
+    [boolean[]],
+    "view"
+  >;
+
+  parseJsonBytes: TypedContractMethod<
+    [json: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseJsonBytes32: TypedContractMethod<
+    [json: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseJsonBytes32Array: TypedContractMethod<
+    [json: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseJsonBytesArray: TypedContractMethod<
+    [json: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseJsonInt: TypedContractMethod<
+    [json: string, key: string],
+    [bigint],
+    "view"
+  >;
+
+  parseJsonIntArray: TypedContractMethod<
+    [json: string, key: string],
+    [bigint[]],
+    "view"
+  >;
+
+  parseJsonKeys: TypedContractMethod<
+    [json: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseJsonString: TypedContractMethod<
+    [json: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseJsonStringArray: TypedContractMethod<
+    [json: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseJsonUint: TypedContractMethod<
+    [json: string, key: string],
+    [bigint],
+    "view"
+  >;
+
+  parseJsonUintArray: TypedContractMethod<
+    [json: string, key: string],
+    [bigint[]],
+    "view"
+  >;
+
+  "parseToml(string,string)": TypedContractMethod<
+    [toml: string, key: string],
+    [string],
+    "view"
+  >;
+
+  "parseToml(string)": TypedContractMethod<[toml: string], [string], "view">;
+
+  parseTomlAddress: TypedContractMethod<
+    [toml: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseTomlAddressArray: TypedContractMethod<
+    [toml: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseTomlBool: TypedContractMethod<
+    [toml: string, key: string],
+    [boolean],
+    "view"
+  >;
+
+  parseTomlBoolArray: TypedContractMethod<
+    [toml: string, key: string],
+    [boolean[]],
+    "view"
+  >;
+
+  parseTomlBytes: TypedContractMethod<
+    [toml: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseTomlBytes32: TypedContractMethod<
+    [toml: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseTomlBytes32Array: TypedContractMethod<
+    [toml: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseTomlBytesArray: TypedContractMethod<
+    [toml: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseTomlInt: TypedContractMethod<
+    [toml: string, key: string],
+    [bigint],
+    "view"
+  >;
+
+  parseTomlIntArray: TypedContractMethod<
+    [toml: string, key: string],
+    [bigint[]],
+    "view"
+  >;
+
+  parseTomlKeys: TypedContractMethod<
+    [toml: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseTomlString: TypedContractMethod<
+    [toml: string, key: string],
+    [string],
+    "view"
+  >;
+
+  parseTomlStringArray: TypedContractMethod<
+    [toml: string, key: string],
+    [string[]],
+    "view"
+  >;
+
+  parseTomlUint: TypedContractMethod<
+    [toml: string, key: string],
+    [bigint],
+    "view"
+  >;
+
+  parseTomlUintArray: TypedContractMethod<
+    [toml: string, key: string],
+    [bigint[]],
+    "view"
+  >;
+
+  parseUint: TypedContractMethod<[stringifiedValue: string], [bigint], "view">;
+
+  pauseGasMetering: TypedContractMethod<[], [void], "nonpayable">;
+
+  projectRoot: TypedContractMethod<[], [string], "view">;
+
+  prompt: TypedContractMethod<[promptText: string], [string], "nonpayable">;
+
+  promptAddress: TypedContractMethod<
+    [promptText: string],
+    [string],
+    "nonpayable"
+  >;
+
+  promptSecret: TypedContractMethod<
+    [promptText: string],
+    [string],
+    "nonpayable"
+  >;
+
+  promptUint: TypedContractMethod<[promptText: string], [bigint], "nonpayable">;
+
+  "readDir(string,uint64)": TypedContractMethod<
+    [path: string, maxDepth: BigNumberish],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+
+  "readDir(string,uint64,bool)": TypedContractMethod<
+    [path: string, maxDepth: BigNumberish, followLinks: boolean],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+
+  "readDir(string)": TypedContractMethod<
+    [path: string],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+
+  readFile: TypedContractMethod<[path: string], [string], "view">;
+
+  readFileBinary: TypedContractMethod<[path: string], [string], "view">;
+
+  readLine: TypedContractMethod<[path: string], [string], "view">;
+
+  readLink: TypedContractMethod<[linkPath: string], [string], "view">;
+
+  record: TypedContractMethod<[], [void], "nonpayable">;
+
+  recordLogs: TypedContractMethod<[], [void], "nonpayable">;
+
+  rememberKey: TypedContractMethod<
+    [privateKey: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+
+  removeDir: TypedContractMethod<
+    [path: string, recursive: boolean],
+    [void],
+    "nonpayable"
+  >;
+
+  removeFile: TypedContractMethod<[path: string], [void], "nonpayable">;
+
+  replace: TypedContractMethod<
+    [input: string, from: string, to: string],
+    [string],
+    "view"
+  >;
+
+  resumeGasMetering: TypedContractMethod<[], [void], "nonpayable">;
+
+  rpc: TypedContractMethod<
+    [method: string, params: string],
+    [string],
+    "nonpayable"
+  >;
+
+  rpcUrl: TypedContractMethod<[rpcAlias: string], [string], "view">;
+
+  rpcUrlStructs: TypedContractMethod<[], [VmSafe.RpcStructOutput[]], "view">;
+
+  rpcUrls: TypedContractMethod<[], [[string, string][]], "view">;
+
+  "serializeAddress(string,string,address[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: AddressLike[]],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeAddress(string,string,address)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: AddressLike],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBool(string,string,bool[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: boolean[]],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBool(string,string,bool)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: boolean],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBytes(string,string,bytes[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BytesLike[]],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBytes(string,string,bytes)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BytesLike],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBytes32(string,string,bytes32[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BytesLike[]],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeBytes32(string,string,bytes32)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BytesLike],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeInt(string,string,int256)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeInt(string,string,int256[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BigNumberish[]],
+    [string],
+    "nonpayable"
+  >;
+
+  serializeJson: TypedContractMethod<
+    [objectKey: string, value: string],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeString(string,string,string[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: string[]],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeString(string,string,string)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: string],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeUint(string,string,uint256)": TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+
+  "serializeUint(string,string,uint256[])": TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BigNumberish[]],
+    [string],
+    "nonpayable"
+  >;
+
+  serializeUintToHex: TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+
+  setEnv: TypedContractMethod<
+    [name: string, value: string],
+    [void],
+    "nonpayable"
+  >;
+
+  "sign(bytes32)": TypedContractMethod<
+    [digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+
+  "sign(address,bytes32)": TypedContractMethod<
+    [signer: AddressLike, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+
+  "sign((address,uint256,uint256,uint256),bytes32)": TypedContractMethod<
+    [wallet: VmSafe.WalletStruct, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "nonpayable"
+  >;
+
+  "sign(uint256,bytes32)": TypedContractMethod<
+    [privateKey: BigNumberish, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+
+  signP256: TypedContractMethod<
+    [privateKey: BigNumberish, digest: BytesLike],
+    [[string, string] & { r: string; s: string }],
+    "view"
+  >;
+
+  sleep: TypedContractMethod<[duration: BigNumberish], [void], "nonpayable">;
+
+  split: TypedContractMethod<
+    [input: string, delimiter: string],
+    [string[]],
+    "view"
+  >;
+
+  "startBroadcast()": TypedContractMethod<[], [void], "nonpayable">;
+
+  "startBroadcast(address)": TypedContractMethod<
+    [signer: AddressLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "startBroadcast(uint256)": TypedContractMethod<
+    [privateKey: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  startMappingRecording: TypedContractMethod<[], [void], "nonpayable">;
+
+  startStateDiffRecording: TypedContractMethod<[], [void], "nonpayable">;
+
+  stopAndReturnStateDiff: TypedContractMethod<
+    [],
+    [VmSafe.AccountAccessStructOutput[]],
+    "nonpayable"
+  >;
+
+  stopBroadcast: TypedContractMethod<[], [void], "nonpayable">;
+
+  stopMappingRecording: TypedContractMethod<[], [void], "nonpayable">;
+
+  "toBase64(string)": TypedContractMethod<[data: string], [string], "view">;
+
+  "toBase64(bytes)": TypedContractMethod<[data: BytesLike], [string], "view">;
+
+  "toBase64URL(string)": TypedContractMethod<[data: string], [string], "view">;
+
+  "toBase64URL(bytes)": TypedContractMethod<
+    [data: BytesLike],
+    [string],
+    "view"
+  >;
+
+  toLowercase: TypedContractMethod<[input: string], [string], "view">;
+
+  "toString(address)": TypedContractMethod<
+    [value: AddressLike],
+    [string],
+    "view"
+  >;
+
+  "toString(uint256)": TypedContractMethod<
+    [value: BigNumberish],
+    [string],
+    "view"
+  >;
+
+  "toString(bytes)": TypedContractMethod<[value: BytesLike], [string], "view">;
+
+  "toString(bool)": TypedContractMethod<[value: boolean], [string], "view">;
+
+  "toString(int256)": TypedContractMethod<
+    [value: BigNumberish],
+    [string],
+    "view"
+  >;
+
+  "toString(bytes32)": TypedContractMethod<
+    [value: BytesLike],
+    [string],
+    "view"
+  >;
+
+  toUppercase: TypedContractMethod<[input: string], [string], "view">;
+
+  trim: TypedContractMethod<[input: string], [string], "view">;
+
+  tryFfi: TypedContractMethod<
+    [commandInput: string[]],
+    [VmSafe.FfiResultStructOutput],
+    "nonpayable"
+  >;
+
+  unixTime: TypedContractMethod<[], [bigint], "nonpayable">;
+
+  writeFile: TypedContractMethod<
+    [path: string, data: string],
+    [void],
+    "nonpayable"
+  >;
+
+  writeFileBinary: TypedContractMethod<
+    [path: string, data: BytesLike],
+    [void],
+    "nonpayable"
+  >;
+
+  "writeJson(string,string,string)": TypedContractMethod<
+    [json: string, path: string, valueKey: string],
+    [void],
+    "nonpayable"
+  >;
+
+  "writeJson(string,string)": TypedContractMethod<
+    [json: string, path: string],
+    [void],
+    "nonpayable"
+  >;
+
+  writeLine: TypedContractMethod<
+    [path: string, data: string],
+    [void],
+    "nonpayable"
+  >;
+
+  "writeToml(string,string,string)": TypedContractMethod<
+    [json: string, path: string, valueKey: string],
+    [void],
+    "nonpayable"
+  >;
+
+  "writeToml(string,string)": TypedContractMethod<
+    [json: string, path: string],
+    [void],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "accesses"
+  ): TypedContractMethod<
+    [target: AddressLike],
+    [[string[], string[]] & { readSlots: string[]; writeSlots: string[] }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "addr"
+  ): TypedContractMethod<[privateKey: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbs(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbs(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbs(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbs(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqAbsDecimal(int256,int256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRel(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRel(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxPercentDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRel(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRel(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, maxPercentDelta: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRelDecimal(int256,int256,uint256,uint256)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertApproxEqRelDecimal(int256,int256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      maxPercentDelta: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes32[],bytes32[])"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(int256[],int256[],string)"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(address,address,string)"
+  ): TypedContractMethod<
+    [left: AddressLike, right: AddressLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(string,string,string)"
+  ): TypedContractMethod<
+    [left: string, right: string, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(address[],address[])"
+  ): TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(address[],address[],string)"
+  ): TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bool,bool,string)"
+  ): TypedContractMethod<
+    [left: boolean, right: boolean, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(address,address)"
+  ): TypedContractMethod<
+    [left: AddressLike, right: AddressLike],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(uint256[],uint256[],string)"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bool[],bool[])"
+  ): TypedContractMethod<[left: boolean[], right: boolean[]], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(int256[],int256[])"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes32,bytes32)"
+  ): TypedContractMethod<[left: BytesLike, right: BytesLike], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(uint256[],uint256[])"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes,bytes)"
+  ): TypedContractMethod<[left: BytesLike, right: BytesLike], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes32,bytes32,string)"
+  ): TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(string[],string[])"
+  ): TypedContractMethod<[left: string[], right: string[]], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(bytes32[],bytes32[],string)"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes,bytes,string)"
+  ): TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bool[],bool[],string)"
+  ): TypedContractMethod<
+    [left: boolean[], right: boolean[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bytes[],bytes[])"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(string[],string[],string)"
+  ): TypedContractMethod<
+    [left: string[], right: string[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(string,string)"
+  ): TypedContractMethod<[left: string, right: string], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(bytes[],bytes[],string)"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEq(bool,bool)"
+  ): TypedContractMethod<[left: boolean, right: boolean], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertEq(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEqDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEqDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEqDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertEqDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertFalse(bool,string)"
+  ): TypedContractMethod<[condition: boolean, error: string], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertFalse(bool)"
+  ): TypedContractMethod<[condition: boolean], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertGe(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGe(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGe(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGe(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGeDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGeDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGeDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGeDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGt(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGt(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGt(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGt(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGtDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGtDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGtDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertGtDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLe(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLe(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLe(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLe(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLeDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLeDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLeDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLeDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLt(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLt(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLt(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLt(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLtDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLtDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLtDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertLtDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes32[],bytes32[])"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(int256[],int256[])"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bool,bool,string)"
+  ): TypedContractMethod<
+    [left: boolean, right: boolean, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes[],bytes[],string)"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bool,bool)"
+  ): TypedContractMethod<[left: boolean, right: boolean], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(bool[],bool[])"
+  ): TypedContractMethod<[left: boolean[], right: boolean[]], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes,bytes)"
+  ): TypedContractMethod<[left: BytesLike, right: BytesLike], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(address[],address[])"
+  ): TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(int256,int256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(uint256[],uint256[])"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bool[],bool[],string)"
+  ): TypedContractMethod<
+    [left: boolean[], right: boolean[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(string,string)"
+  ): TypedContractMethod<[left: string, right: string], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(address[],address[],string)"
+  ): TypedContractMethod<
+    [left: AddressLike[], right: AddressLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(string,string,string)"
+  ): TypedContractMethod<
+    [left: string, right: string, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(address,address,string)"
+  ): TypedContractMethod<
+    [left: AddressLike, right: AddressLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes32,bytes32)"
+  ): TypedContractMethod<[left: BytesLike, right: BytesLike], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes,bytes,string)"
+  ): TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(uint256,uint256,string)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(uint256[],uint256[],string)"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(address,address)"
+  ): TypedContractMethod<
+    [left: AddressLike, right: AddressLike],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes32,bytes32,string)"
+  ): TypedContractMethod<
+    [left: BytesLike, right: BytesLike, error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(string[],string[],string)"
+  ): TypedContractMethod<
+    [left: string[], right: string[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes32[],bytes32[],string)"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(string[],string[])"
+  ): TypedContractMethod<[left: string[], right: string[]], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertNotEq(int256[],int256[],string)"
+  ): TypedContractMethod<
+    [left: BigNumberish[], right: BigNumberish[], error: string],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(bytes[],bytes[])"
+  ): TypedContractMethod<
+    [left: BytesLike[], right: BytesLike[]],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEq(int256,int256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEqDecimal(int256,int256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEqDecimal(int256,int256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEqDecimal(uint256,uint256,uint256)"
+  ): TypedContractMethod<
+    [left: BigNumberish, right: BigNumberish, decimals: BigNumberish],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertNotEqDecimal(uint256,uint256,uint256,string)"
+  ): TypedContractMethod<
+    [
+      left: BigNumberish,
+      right: BigNumberish,
+      decimals: BigNumberish,
+      error: string
+    ],
+    [void],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "assertTrue(bool)"
+  ): TypedContractMethod<[condition: boolean], [void], "view">;
+  getFunction(
+    nameOrSignature: "assertTrue(bool,string)"
+  ): TypedContractMethod<[condition: boolean, error: string], [void], "view">;
+  getFunction(
+    nameOrSignature: "assume"
+  ): TypedContractMethod<[condition: boolean], [void], "view">;
+  getFunction(
+    nameOrSignature: "breakpoint(string)"
+  ): TypedContractMethod<[char: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "breakpoint(string,bool)"
+  ): TypedContractMethod<[char: string, value: boolean], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "broadcast()"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "broadcast(address)"
+  ): TypedContractMethod<[signer: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "broadcast(uint256)"
+  ): TypedContractMethod<[privateKey: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "closeFile"
+  ): TypedContractMethod<[path: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "computeCreate2Address(bytes32,bytes32)"
+  ): TypedContractMethod<
+    [salt: BytesLike, initCodeHash: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "computeCreate2Address(bytes32,bytes32,address)"
+  ): TypedContractMethod<
+    [salt: BytesLike, initCodeHash: BytesLike, deployer: AddressLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "computeCreateAddress"
+  ): TypedContractMethod<
+    [deployer: AddressLike, nonce: BigNumberish],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "copyFile"
+  ): TypedContractMethod<[from: string, to: string], [bigint], "nonpayable">;
+  getFunction(
+    nameOrSignature: "createDir"
+  ): TypedContractMethod<
+    [path: string, recursive: boolean],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "createWallet(string)"
+  ): TypedContractMethod<
+    [walletLabel: string],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "createWallet(uint256)"
+  ): TypedContractMethod<
+    [privateKey: BigNumberish],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "createWallet(uint256,string)"
+  ): TypedContractMethod<
+    [privateKey: BigNumberish, walletLabel: string],
+    [VmSafe.WalletStructOutput],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "deriveKey(string,string,uint32,string)"
+  ): TypedContractMethod<
+    [
+      mnemonic: string,
+      derivationPath: string,
+      index: BigNumberish,
+      language: string
+    ],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "deriveKey(string,uint32,string)"
+  ): TypedContractMethod<
+    [mnemonic: string, index: BigNumberish, language: string],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "deriveKey(string,uint32)"
+  ): TypedContractMethod<
+    [mnemonic: string, index: BigNumberish],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "deriveKey(string,string,uint32)"
+  ): TypedContractMethod<
+    [mnemonic: string, derivationPath: string, index: BigNumberish],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "ensNamehash"
+  ): TypedContractMethod<[name: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "envAddress(string)"
+  ): TypedContractMethod<[name: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "envAddress(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "envBool(string)"
+  ): TypedContractMethod<[name: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "envBool(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [boolean[]], "view">;
+  getFunction(
+    nameOrSignature: "envBytes(string)"
+  ): TypedContractMethod<[name: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "envBytes(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "envBytes32(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "envBytes32(string)"
+  ): TypedContractMethod<[name: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "envExists"
+  ): TypedContractMethod<[name: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "envInt(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "envInt(string)"
+  ): TypedContractMethod<[name: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "envOr(string,string,bytes32[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: BytesLike[]],
+    [string[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,int256[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: BigNumberish[]],
+    [bigint[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,bool)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: boolean],
+    [boolean],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,address)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: AddressLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,uint256)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: BigNumberish],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,bytes[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: BytesLike[]],
+    [string[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,uint256[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: BigNumberish[]],
+    [bigint[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,string[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: string[]],
+    [string[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,bytes)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,bytes32)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,int256)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: BigNumberish],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,address[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: AddressLike[]],
+    [string[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string)"
+  ): TypedContractMethod<
+    [name: string, defaultValue: string],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envOr(string,string,bool[])"
+  ): TypedContractMethod<
+    [name: string, delim: string, defaultValue: boolean[]],
+    [boolean[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "envString(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "envString(string)"
+  ): TypedContractMethod<[name: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "envUint(string)"
+  ): TypedContractMethod<[name: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "envUint(string,string)"
+  ): TypedContractMethod<[name: string, delim: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "eth_getLogs"
+  ): TypedContractMethod<
+    [
+      fromBlock: BigNumberish,
+      toBlock: BigNumberish,
+      target: AddressLike,
+      topics: BytesLike[]
+    ],
+    [VmSafe.EthGetLogsStructOutput[]],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "exists"
+  ): TypedContractMethod<[path: string], [boolean], "nonpayable">;
+  getFunction(
+    nameOrSignature: "ffi"
+  ): TypedContractMethod<[commandInput: string[]], [string], "nonpayable">;
+  getFunction(
+    nameOrSignature: "fsMetadata"
+  ): TypedContractMethod<
+    [path: string],
+    [VmSafe.FsMetadataStructOutput],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "getBlobBaseFee"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getBlockNumber"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getBlockTimestamp"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getCode"
+  ): TypedContractMethod<[artifactPath: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "getDeployedCode"
+  ): TypedContractMethod<[artifactPath: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "getLabel"
+  ): TypedContractMethod<[account: AddressLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "getMappingKeyAndParentOf"
+  ): TypedContractMethod<
+    [target: AddressLike, elementSlot: BytesLike],
+    [
+      [boolean, string, string] & {
+        found: boolean;
+        key: string;
+        parent: string;
+      }
+    ],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "getMappingLength"
+  ): TypedContractMethod<
+    [target: AddressLike, mappingSlot: BytesLike],
+    [bigint],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "getMappingSlotAt"
+  ): TypedContractMethod<
+    [target: AddressLike, mappingSlot: BytesLike, idx: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "getNonce(address)"
+  ): TypedContractMethod<[account: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getNonce((address,uint256,uint256,uint256))"
+  ): TypedContractMethod<[wallet: VmSafe.WalletStruct], [bigint], "nonpayable">;
+  getFunction(
+    nameOrSignature: "getRecordedLogs"
+  ): TypedContractMethod<[], [VmSafe.LogStructOutput[]], "nonpayable">;
+  getFunction(
+    nameOrSignature: "indexOf"
+  ): TypedContractMethod<[input: string, key: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "isContext"
+  ): TypedContractMethod<[context: BigNumberish], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "isDir"
+  ): TypedContractMethod<[path: string], [boolean], "nonpayable">;
+  getFunction(
+    nameOrSignature: "isFile"
+  ): TypedContractMethod<[path: string], [boolean], "nonpayable">;
+  getFunction(
+    nameOrSignature: "keyExists"
+  ): TypedContractMethod<[json: string, key: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "keyExistsJson"
+  ): TypedContractMethod<[json: string, key: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "keyExistsToml"
+  ): TypedContractMethod<[toml: string, key: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "label"
+  ): TypedContractMethod<
+    [account: AddressLike, newLabel: string],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "lastCallGas"
+  ): TypedContractMethod<[], [VmSafe.GasStructOutput], "view">;
+  getFunction(
+    nameOrSignature: "load"
+  ): TypedContractMethod<
+    [target: AddressLike, slot: BytesLike],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "parseAddress"
+  ): TypedContractMethod<[stringifiedValue: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseBool"
+  ): TypedContractMethod<[stringifiedValue: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "parseBytes"
+  ): TypedContractMethod<[stringifiedValue: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseBytes32"
+  ): TypedContractMethod<[stringifiedValue: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseInt"
+  ): TypedContractMethod<[stringifiedValue: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "parseJson(string)"
+  ): TypedContractMethod<[json: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJson(string,string)"
+  ): TypedContractMethod<[json: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonAddress"
+  ): TypedContractMethod<[json: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonAddressArray"
+  ): TypedContractMethod<[json: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBool"
+  ): TypedContractMethod<[json: string, key: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBoolArray"
+  ): TypedContractMethod<[json: string, key: string], [boolean[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBytes"
+  ): TypedContractMethod<[json: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBytes32"
+  ): TypedContractMethod<[json: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBytes32Array"
+  ): TypedContractMethod<[json: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonBytesArray"
+  ): TypedContractMethod<[json: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonInt"
+  ): TypedContractMethod<[json: string, key: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonIntArray"
+  ): TypedContractMethod<[json: string, key: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonKeys"
+  ): TypedContractMethod<[json: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonString"
+  ): TypedContractMethod<[json: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonStringArray"
+  ): TypedContractMethod<[json: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonUint"
+  ): TypedContractMethod<[json: string, key: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "parseJsonUintArray"
+  ): TypedContractMethod<[json: string, key: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "parseToml(string,string)"
+  ): TypedContractMethod<[toml: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseToml(string)"
+  ): TypedContractMethod<[toml: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlAddress"
+  ): TypedContractMethod<[toml: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlAddressArray"
+  ): TypedContractMethod<[toml: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBool"
+  ): TypedContractMethod<[toml: string, key: string], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBoolArray"
+  ): TypedContractMethod<[toml: string, key: string], [boolean[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBytes"
+  ): TypedContractMethod<[toml: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBytes32"
+  ): TypedContractMethod<[toml: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBytes32Array"
+  ): TypedContractMethod<[toml: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlBytesArray"
+  ): TypedContractMethod<[toml: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlInt"
+  ): TypedContractMethod<[toml: string, key: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlIntArray"
+  ): TypedContractMethod<[toml: string, key: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlKeys"
+  ): TypedContractMethod<[toml: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlString"
+  ): TypedContractMethod<[toml: string, key: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlStringArray"
+  ): TypedContractMethod<[toml: string, key: string], [string[]], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlUint"
+  ): TypedContractMethod<[toml: string, key: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "parseTomlUintArray"
+  ): TypedContractMethod<[toml: string, key: string], [bigint[]], "view">;
+  getFunction(
+    nameOrSignature: "parseUint"
+  ): TypedContractMethod<[stringifiedValue: string], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "pauseGasMetering"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "projectRoot"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "prompt"
+  ): TypedContractMethod<[promptText: string], [string], "nonpayable">;
+  getFunction(
+    nameOrSignature: "promptAddress"
+  ): TypedContractMethod<[promptText: string], [string], "nonpayable">;
+  getFunction(
+    nameOrSignature: "promptSecret"
+  ): TypedContractMethod<[promptText: string], [string], "nonpayable">;
+  getFunction(
+    nameOrSignature: "promptUint"
+  ): TypedContractMethod<[promptText: string], [bigint], "nonpayable">;
+  getFunction(
+    nameOrSignature: "readDir(string,uint64)"
+  ): TypedContractMethod<
+    [path: string, maxDepth: BigNumberish],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "readDir(string,uint64,bool)"
+  ): TypedContractMethod<
+    [path: string, maxDepth: BigNumberish, followLinks: boolean],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "readDir(string)"
+  ): TypedContractMethod<
+    [path: string],
+    [VmSafe.DirEntryStructOutput[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "readFile"
+  ): TypedContractMethod<[path: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "readFileBinary"
+  ): TypedContractMethod<[path: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "readLine"
+  ): TypedContractMethod<[path: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "readLink"
+  ): TypedContractMethod<[linkPath: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "record"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "recordLogs"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "rememberKey"
+  ): TypedContractMethod<[privateKey: BigNumberish], [string], "nonpayable">;
+  getFunction(
+    nameOrSignature: "removeDir"
+  ): TypedContractMethod<
+    [path: string, recursive: boolean],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "removeFile"
+  ): TypedContractMethod<[path: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "replace"
+  ): TypedContractMethod<
+    [input: string, from: string, to: string],
+    [string],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "resumeGasMetering"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "rpc"
+  ): TypedContractMethod<
+    [method: string, params: string],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "rpcUrl"
+  ): TypedContractMethod<[rpcAlias: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "rpcUrlStructs"
+  ): TypedContractMethod<[], [VmSafe.RpcStructOutput[]], "view">;
+  getFunction(
+    nameOrSignature: "rpcUrls"
+  ): TypedContractMethod<[], [[string, string][]], "view">;
+  getFunction(
+    nameOrSignature: "serializeAddress(string,string,address[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: AddressLike[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeAddress(string,string,address)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: AddressLike],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBool(string,string,bool[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: boolean[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBool(string,string,bool)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: boolean],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBytes(string,string,bytes[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BytesLike[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBytes(string,string,bytes)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BytesLike],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBytes32(string,string,bytes32[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BytesLike[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeBytes32(string,string,bytes32)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BytesLike],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeInt(string,string,int256)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeInt(string,string,int256[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BigNumberish[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeJson"
+  ): TypedContractMethod<
+    [objectKey: string, value: string],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeString(string,string,string[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: string[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeString(string,string,string)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: string],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeUint(string,string,uint256)"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeUint(string,string,uint256[])"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, values: BigNumberish[]],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "serializeUintToHex"
+  ): TypedContractMethod<
+    [objectKey: string, valueKey: string, value: BigNumberish],
+    [string],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "setEnv"
+  ): TypedContractMethod<[name: string, value: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "sign(bytes32)"
+  ): TypedContractMethod<
+    [digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "sign(address,bytes32)"
+  ): TypedContractMethod<
+    [signer: AddressLike, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "sign((address,uint256,uint256,uint256),bytes32)"
+  ): TypedContractMethod<
+    [wallet: VmSafe.WalletStruct, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "sign(uint256,bytes32)"
+  ): TypedContractMethod<
+    [privateKey: BigNumberish, digest: BytesLike],
+    [[bigint, string, string] & { v: bigint; r: string; s: string }],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "signP256"
+  ): TypedContractMethod<
+    [privateKey: BigNumberish, digest: BytesLike],
+    [[string, string] & { r: string; s: string }],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "sleep"
+  ): TypedContractMethod<[duration: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "split"
+  ): TypedContractMethod<
+    [input: string, delimiter: string],
+    [string[]],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "startBroadcast()"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "startBroadcast(address)"
+  ): TypedContractMethod<[signer: AddressLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "startBroadcast(uint256)"
+  ): TypedContractMethod<[privateKey: BigNumberish], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "startMappingRecording"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "startStateDiffRecording"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "stopAndReturnStateDiff"
+  ): TypedContractMethod<
+    [],
+    [VmSafe.AccountAccessStructOutput[]],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "stopBroadcast"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "stopMappingRecording"
+  ): TypedContractMethod<[], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "toBase64(string)"
+  ): TypedContractMethod<[data: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "toBase64(bytes)"
+  ): TypedContractMethod<[data: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "toBase64URL(string)"
+  ): TypedContractMethod<[data: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "toBase64URL(bytes)"
+  ): TypedContractMethod<[data: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "toLowercase"
+  ): TypedContractMethod<[input: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(address)"
+  ): TypedContractMethod<[value: AddressLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(uint256)"
+  ): TypedContractMethod<[value: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(bytes)"
+  ): TypedContractMethod<[value: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(bool)"
+  ): TypedContractMethod<[value: boolean], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(int256)"
+  ): TypedContractMethod<[value: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "toString(bytes32)"
+  ): TypedContractMethod<[value: BytesLike], [string], "view">;
+  getFunction(
+    nameOrSignature: "toUppercase"
+  ): TypedContractMethod<[input: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "trim"
+  ): TypedContractMethod<[input: string], [string], "view">;
+  getFunction(
+    nameOrSignature: "tryFfi"
+  ): TypedContractMethod<
+    [commandInput: string[]],
+    [VmSafe.FfiResultStructOutput],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "unixTime"
+  ): TypedContractMethod<[], [bigint], "nonpayable">;
+  getFunction(
+    nameOrSignature: "writeFile"
+  ): TypedContractMethod<[path: string, data: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "writeFileBinary"
+  ): TypedContractMethod<[path: string, data: BytesLike], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "writeJson(string,string,string)"
+  ): TypedContractMethod<
+    [json: string, path: string, valueKey: string],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "writeJson(string,string)"
+  ): TypedContractMethod<[json: string, path: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "writeLine"
+  ): TypedContractMethod<[path: string, data: string], [void], "nonpayable">;
+  getFunction(
+    nameOrSignature: "writeToml(string,string,string)"
+  ): TypedContractMethod<
+    [json: string, path: string, valueKey: string],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "writeToml(string,string)"
+  ): TypedContractMethod<[json: string, path: string], [void], "nonpayable">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/Vm.sol/index.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/Vm.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6ea1a16623e2b45e24b8d2abe9712a3496024e77
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/Vm.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { Vm } from "./Vm";
+export type { VmSafe } from "./VmSafe";
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/index.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8112c903125afcbbaa0453bb03481d3365a22067
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/index.ts
@@ -0,0 +1,16 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as stdErrorSol from "./StdError.sol";
+export type { stdErrorSol };
+import type * as stdStorageSol from "./StdStorage.sol";
+export type { stdStorageSol };
+import type * as vmSol from "./Vm.sol";
+export type { vmSol };
+import type * as interfaces from "./interfaces";
+export type { interfaces };
+import type * as mocks from "./mocks";
+export type { mocks };
+export type { StdAssertions } from "./StdAssertions";
+export type { StdInvariant } from "./StdInvariant";
+export type { Test } from "./Test";
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC165.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC165.ts
new file mode 100644
index 0000000000000000000000000000000000000000..750efca001ed186d8b1af7deefe4ac3c08ce704a
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC165.ts
@@ -0,0 +1,94 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface IERC165Interface extends Interface {
+  getFunction(nameOrSignature: "supportsInterface"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "supportsInterface",
+    values: [BytesLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "supportsInterface",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IERC165 extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC165;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC165Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  supportsInterface: TypedContractMethod<
+    [interfaceID: BytesLike],
+    [boolean],
+    "view"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "supportsInterface"
+  ): TypedContractMethod<[interfaceID: BytesLike], [boolean], "view">;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC20.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC20.ts
new file mode 100644
index 0000000000000000000000000000000000000000..51319455d8440a7b0edbf8721c45a7c5b586c53e
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC20.ts
@@ -0,0 +1,286 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface IERC20Interface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "allowance"
+      | "approve"
+      | "balanceOf"
+      | "decimals"
+      | "name"
+      | "symbol"
+      | "totalSupply"
+      | "transfer"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "allowance",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(functionFragment: "decimals", values?: undefined): string;
+  encodeFunctionData(functionFragment: "name", values?: undefined): string;
+  encodeFunctionData(functionFragment: "symbol", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "totalSupply",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transfer",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "name", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "totalSupply",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    spender: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [owner: string, spender: string, value: bigint];
+  export interface OutputObject {
+    owner: string;
+    spender: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    from: AddressLike,
+    to: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [from: string, to: string, value: bigint];
+  export interface OutputObject {
+    from: string;
+    to: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IERC20 extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC20;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC20Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  allowance: TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  approve: TypedContractMethod<
+    [spender: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  balanceOf: TypedContractMethod<[account: AddressLike], [bigint], "view">;
+
+  decimals: TypedContractMethod<[], [bigint], "view">;
+
+  name: TypedContractMethod<[], [string], "view">;
+
+  symbol: TypedContractMethod<[], [string], "view">;
+
+  totalSupply: TypedContractMethod<[], [bigint], "view">;
+
+  transfer: TypedContractMethod<
+    [to: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  transferFrom: TypedContractMethod<
+    [from: AddressLike, to: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "allowance"
+  ): TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [spender: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[account: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "decimals"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "name"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "symbol"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "totalSupply"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "transfer"
+  ): TypedContractMethod<
+    [to: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [from: AddressLike, to: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0b7ba7458041dc7f813546630c8f57f81008479b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721.ts
@@ -0,0 +1,397 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IERC721Interface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "approve"
+      | "balanceOf"
+      | "getApproved"
+      | "isApprovedForAll"
+      | "ownerOf"
+      | "safeTransferFrom(address,address,uint256)"
+      | "safeTransferFrom(address,address,uint256,bytes)"
+      | "setApprovalForAll"
+      | "supportsInterface"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "Approval" | "ApprovalForAll" | "Transfer"
+  ): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getApproved",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "isApprovedForAll",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "ownerOf",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "safeTransferFrom(address,address,uint256)",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "safeTransferFrom(address,address,uint256,bytes)",
+    values: [AddressLike, AddressLike, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "setApprovalForAll",
+    values: [AddressLike, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "supportsInterface",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getApproved",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "isApprovedForAll",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "safeTransferFrom(address,address,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "safeTransferFrom(address,address,uint256,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "setApprovalForAll",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "supportsInterface",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    _owner: AddressLike,
+    _approved: AddressLike,
+    _tokenId: BigNumberish
+  ];
+  export type OutputTuple = [
+    _owner: string,
+    _approved: string,
+    _tokenId: bigint
+  ];
+  export interface OutputObject {
+    _owner: string;
+    _approved: string;
+    _tokenId: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace ApprovalForAllEvent {
+  export type InputTuple = [
+    _owner: AddressLike,
+    _operator: AddressLike,
+    _approved: boolean
+  ];
+  export type OutputTuple = [
+    _owner: string,
+    _operator: string,
+    _approved: boolean
+  ];
+  export interface OutputObject {
+    _owner: string;
+    _operator: string;
+    _approved: boolean;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    _from: AddressLike,
+    _to: AddressLike,
+    _tokenId: BigNumberish
+  ];
+  export type OutputTuple = [_from: string, _to: string, _tokenId: bigint];
+  export interface OutputObject {
+    _from: string;
+    _to: string;
+    _tokenId: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IERC721 extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC721;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC721Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  approve: TypedContractMethod<
+    [_approved: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  balanceOf: TypedContractMethod<[_owner: AddressLike], [bigint], "view">;
+
+  getApproved: TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+
+  isApprovedForAll: TypedContractMethod<
+    [_owner: AddressLike, _operator: AddressLike],
+    [boolean],
+    "view"
+  >;
+
+  ownerOf: TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+
+  "safeTransferFrom(address,address,uint256)": TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  "safeTransferFrom(address,address,uint256,bytes)": TypedContractMethod<
+    [
+      _from: AddressLike,
+      _to: AddressLike,
+      _tokenId: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "payable"
+  >;
+
+  setApprovalForAll: TypedContractMethod<
+    [_operator: AddressLike, _approved: boolean],
+    [void],
+    "nonpayable"
+  >;
+
+  supportsInterface: TypedContractMethod<
+    [interfaceID: BytesLike],
+    [boolean],
+    "view"
+  >;
+
+  transferFrom: TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [_approved: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[_owner: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getApproved"
+  ): TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "isApprovedForAll"
+  ): TypedContractMethod<
+    [_owner: AddressLike, _operator: AddressLike],
+    [boolean],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "ownerOf"
+  ): TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "safeTransferFrom(address,address,uint256)"
+  ): TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "safeTransferFrom(address,address,uint256,bytes)"
+  ): TypedContractMethod<
+    [
+      _from: AddressLike,
+      _to: AddressLike,
+      _tokenId: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "setApprovalForAll"
+  ): TypedContractMethod<
+    [_operator: AddressLike, _approved: boolean],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "supportsInterface"
+  ): TypedContractMethod<[interfaceID: BytesLike], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "ApprovalForAll"
+  ): TypedContractEvent<
+    ApprovalForAllEvent.InputTuple,
+    ApprovalForAllEvent.OutputTuple,
+    ApprovalForAllEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "ApprovalForAll(address,address,bool)": TypedContractEvent<
+      ApprovalForAllEvent.InputTuple,
+      ApprovalForAllEvent.OutputTuple,
+      ApprovalForAllEvent.OutputObject
+    >;
+    ApprovalForAll: TypedContractEvent<
+      ApprovalForAllEvent.InputTuple,
+      ApprovalForAllEvent.OutputTuple,
+      ApprovalForAllEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721Enumerable.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721Enumerable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6c6ad6515eab2c22ca5179afdc78733b6c48002b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721Enumerable.ts
@@ -0,0 +1,447 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IERC721EnumerableInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "approve"
+      | "balanceOf"
+      | "getApproved"
+      | "isApprovedForAll"
+      | "ownerOf"
+      | "safeTransferFrom(address,address,uint256)"
+      | "safeTransferFrom(address,address,uint256,bytes)"
+      | "setApprovalForAll"
+      | "supportsInterface"
+      | "tokenByIndex"
+      | "tokenOfOwnerByIndex"
+      | "totalSupply"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "Approval" | "ApprovalForAll" | "Transfer"
+  ): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getApproved",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "isApprovedForAll",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "ownerOf",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "safeTransferFrom(address,address,uint256)",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "safeTransferFrom(address,address,uint256,bytes)",
+    values: [AddressLike, AddressLike, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "setApprovalForAll",
+    values: [AddressLike, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "supportsInterface",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "tokenByIndex",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "tokenOfOwnerByIndex",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "totalSupply",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getApproved",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "isApprovedForAll",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "safeTransferFrom(address,address,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "safeTransferFrom(address,address,uint256,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "setApprovalForAll",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "supportsInterface",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "tokenByIndex",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "tokenOfOwnerByIndex",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "totalSupply",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    _owner: AddressLike,
+    _approved: AddressLike,
+    _tokenId: BigNumberish
+  ];
+  export type OutputTuple = [
+    _owner: string,
+    _approved: string,
+    _tokenId: bigint
+  ];
+  export interface OutputObject {
+    _owner: string;
+    _approved: string;
+    _tokenId: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace ApprovalForAllEvent {
+  export type InputTuple = [
+    _owner: AddressLike,
+    _operator: AddressLike,
+    _approved: boolean
+  ];
+  export type OutputTuple = [
+    _owner: string,
+    _operator: string,
+    _approved: boolean
+  ];
+  export interface OutputObject {
+    _owner: string;
+    _operator: string;
+    _approved: boolean;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    _from: AddressLike,
+    _to: AddressLike,
+    _tokenId: BigNumberish
+  ];
+  export type OutputTuple = [_from: string, _to: string, _tokenId: bigint];
+  export interface OutputObject {
+    _from: string;
+    _to: string;
+    _tokenId: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IERC721Enumerable extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC721Enumerable;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC721EnumerableInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  approve: TypedContractMethod<
+    [_approved: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  balanceOf: TypedContractMethod<[_owner: AddressLike], [bigint], "view">;
+
+  getApproved: TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+
+  isApprovedForAll: TypedContractMethod<
+    [_owner: AddressLike, _operator: AddressLike],
+    [boolean],
+    "view"
+  >;
+
+  ownerOf: TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+
+  "safeTransferFrom(address,address,uint256)": TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  "safeTransferFrom(address,address,uint256,bytes)": TypedContractMethod<
+    [
+      _from: AddressLike,
+      _to: AddressLike,
+      _tokenId: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "payable"
+  >;
+
+  setApprovalForAll: TypedContractMethod<
+    [_operator: AddressLike, _approved: boolean],
+    [void],
+    "nonpayable"
+  >;
+
+  supportsInterface: TypedContractMethod<
+    [interfaceID: BytesLike],
+    [boolean],
+    "view"
+  >;
+
+  tokenByIndex: TypedContractMethod<[_index: BigNumberish], [bigint], "view">;
+
+  tokenOfOwnerByIndex: TypedContractMethod<
+    [_owner: AddressLike, _index: BigNumberish],
+    [bigint],
+    "view"
+  >;
+
+  totalSupply: TypedContractMethod<[], [bigint], "view">;
+
+  transferFrom: TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [_approved: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[_owner: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getApproved"
+  ): TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "isApprovedForAll"
+  ): TypedContractMethod<
+    [_owner: AddressLike, _operator: AddressLike],
+    [boolean],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "ownerOf"
+  ): TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "safeTransferFrom(address,address,uint256)"
+  ): TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "safeTransferFrom(address,address,uint256,bytes)"
+  ): TypedContractMethod<
+    [
+      _from: AddressLike,
+      _to: AddressLike,
+      _tokenId: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "setApprovalForAll"
+  ): TypedContractMethod<
+    [_operator: AddressLike, _approved: boolean],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "supportsInterface"
+  ): TypedContractMethod<[interfaceID: BytesLike], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "tokenByIndex"
+  ): TypedContractMethod<[_index: BigNumberish], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "tokenOfOwnerByIndex"
+  ): TypedContractMethod<
+    [_owner: AddressLike, _index: BigNumberish],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "totalSupply"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "ApprovalForAll"
+  ): TypedContractEvent<
+    ApprovalForAllEvent.InputTuple,
+    ApprovalForAllEvent.OutputTuple,
+    ApprovalForAllEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "ApprovalForAll(address,address,bool)": TypedContractEvent<
+      ApprovalForAllEvent.InputTuple,
+      ApprovalForAllEvent.OutputTuple,
+      ApprovalForAllEvent.OutputObject
+    >;
+    ApprovalForAll: TypedContractEvent<
+      ApprovalForAllEvent.InputTuple,
+      ApprovalForAllEvent.OutputTuple,
+      ApprovalForAllEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721Metadata.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721Metadata.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0ef1893cb7171846f7bb15559c574bdf4777fd77
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721Metadata.ts
@@ -0,0 +1,424 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IERC721MetadataInterface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "approve"
+      | "balanceOf"
+      | "getApproved"
+      | "isApprovedForAll"
+      | "name"
+      | "ownerOf"
+      | "safeTransferFrom(address,address,uint256)"
+      | "safeTransferFrom(address,address,uint256,bytes)"
+      | "setApprovalForAll"
+      | "supportsInterface"
+      | "symbol"
+      | "tokenURI"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "Approval" | "ApprovalForAll" | "Transfer"
+  ): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getApproved",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "isApprovedForAll",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(functionFragment: "name", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "ownerOf",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "safeTransferFrom(address,address,uint256)",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "safeTransferFrom(address,address,uint256,bytes)",
+    values: [AddressLike, AddressLike, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "setApprovalForAll",
+    values: [AddressLike, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "supportsInterface",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "symbol", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "tokenURI",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getApproved",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "isApprovedForAll",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "name", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "safeTransferFrom(address,address,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "safeTransferFrom(address,address,uint256,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "setApprovalForAll",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "supportsInterface",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "tokenURI", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    _owner: AddressLike,
+    _approved: AddressLike,
+    _tokenId: BigNumberish
+  ];
+  export type OutputTuple = [
+    _owner: string,
+    _approved: string,
+    _tokenId: bigint
+  ];
+  export interface OutputObject {
+    _owner: string;
+    _approved: string;
+    _tokenId: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace ApprovalForAllEvent {
+  export type InputTuple = [
+    _owner: AddressLike,
+    _operator: AddressLike,
+    _approved: boolean
+  ];
+  export type OutputTuple = [
+    _owner: string,
+    _operator: string,
+    _approved: boolean
+  ];
+  export interface OutputObject {
+    _owner: string;
+    _operator: string;
+    _approved: boolean;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    _from: AddressLike,
+    _to: AddressLike,
+    _tokenId: BigNumberish
+  ];
+  export type OutputTuple = [_from: string, _to: string, _tokenId: bigint];
+  export interface OutputObject {
+    _from: string;
+    _to: string;
+    _tokenId: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface IERC721Metadata extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC721Metadata;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC721MetadataInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  approve: TypedContractMethod<
+    [_approved: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  balanceOf: TypedContractMethod<[_owner: AddressLike], [bigint], "view">;
+
+  getApproved: TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+
+  isApprovedForAll: TypedContractMethod<
+    [_owner: AddressLike, _operator: AddressLike],
+    [boolean],
+    "view"
+  >;
+
+  name: TypedContractMethod<[], [string], "view">;
+
+  ownerOf: TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+
+  "safeTransferFrom(address,address,uint256)": TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  "safeTransferFrom(address,address,uint256,bytes)": TypedContractMethod<
+    [
+      _from: AddressLike,
+      _to: AddressLike,
+      _tokenId: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "payable"
+  >;
+
+  setApprovalForAll: TypedContractMethod<
+    [_operator: AddressLike, _approved: boolean],
+    [void],
+    "nonpayable"
+  >;
+
+  supportsInterface: TypedContractMethod<
+    [interfaceID: BytesLike],
+    [boolean],
+    "view"
+  >;
+
+  symbol: TypedContractMethod<[], [string], "view">;
+
+  tokenURI: TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+
+  transferFrom: TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [_approved: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[_owner: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getApproved"
+  ): TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "isApprovedForAll"
+  ): TypedContractMethod<
+    [_owner: AddressLike, _operator: AddressLike],
+    [boolean],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "name"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "ownerOf"
+  ): TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "safeTransferFrom(address,address,uint256)"
+  ): TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "safeTransferFrom(address,address,uint256,bytes)"
+  ): TypedContractMethod<
+    [
+      _from: AddressLike,
+      _to: AddressLike,
+      _tokenId: BigNumberish,
+      data: BytesLike
+    ],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "setApprovalForAll"
+  ): TypedContractMethod<
+    [_operator: AddressLike, _approved: boolean],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "supportsInterface"
+  ): TypedContractMethod<[interfaceID: BytesLike], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "symbol"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "tokenURI"
+  ): TypedContractMethod<[_tokenId: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [_from: AddressLike, _to: AddressLike, _tokenId: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "ApprovalForAll"
+  ): TypedContractEvent<
+    ApprovalForAllEvent.InputTuple,
+    ApprovalForAllEvent.OutputTuple,
+    ApprovalForAllEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "ApprovalForAll(address,address,bool)": TypedContractEvent<
+      ApprovalForAllEvent.InputTuple,
+      ApprovalForAllEvent.OutputTuple,
+      ApprovalForAllEvent.OutputObject
+    >;
+    ApprovalForAll: TypedContractEvent<
+      ApprovalForAllEvent.InputTuple,
+      ApprovalForAllEvent.OutputTuple,
+      ApprovalForAllEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721TokenReceiver.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721TokenReceiver.ts
new file mode 100644
index 0000000000000000000000000000000000000000..13affea176b0334c52b531a6cddde54fffca3460
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/IERC721TokenReceiver.ts
@@ -0,0 +1,110 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IERC721TokenReceiverInterface extends Interface {
+  getFunction(nameOrSignature: "onERC721Received"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "onERC721Received",
+    values: [AddressLike, AddressLike, BigNumberish, BytesLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "onERC721Received",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IERC721TokenReceiver extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC721TokenReceiver;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC721TokenReceiverInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  onERC721Received: TypedContractMethod<
+    [
+      _operator: AddressLike,
+      _from: AddressLike,
+      _tokenId: BigNumberish,
+      _data: BytesLike
+    ],
+    [string],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "onERC721Received"
+  ): TypedContractMethod<
+    [
+      _operator: AddressLike,
+      _from: AddressLike,
+      _tokenId: BigNumberish,
+      _data: BytesLike
+    ],
+    [string],
+    "nonpayable"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/index.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8df44aee16c6992d29bb3879736de978bfce4dd0
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IERC721.sol/index.ts
@@ -0,0 +1,7 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { IERC721 } from "./IERC721";
+export type { IERC721Enumerable } from "./IERC721Enumerable";
+export type { IERC721Metadata } from "./IERC721Metadata";
+export type { IERC721TokenReceiver } from "./IERC721TokenReceiver";
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IMulticall3.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IMulticall3.ts
new file mode 100644
index 0000000000000000000000000000000000000000..996cc3c9c3a3856eebb2089375078c1f5c6973bf
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/IMulticall3.ts
@@ -0,0 +1,416 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export declare namespace IMulticall3 {
+  export type CallStruct = { target: AddressLike; callData: BytesLike };
+
+  export type CallStructOutput = [target: string, callData: string] & {
+    target: string;
+    callData: string;
+  };
+
+  export type Call3Struct = {
+    target: AddressLike;
+    allowFailure: boolean;
+    callData: BytesLike;
+  };
+
+  export type Call3StructOutput = [
+    target: string,
+    allowFailure: boolean,
+    callData: string
+  ] & { target: string; allowFailure: boolean; callData: string };
+
+  export type ResultStruct = { success: boolean; returnData: BytesLike };
+
+  export type ResultStructOutput = [success: boolean, returnData: string] & {
+    success: boolean;
+    returnData: string;
+  };
+
+  export type Call3ValueStruct = {
+    target: AddressLike;
+    allowFailure: boolean;
+    value: BigNumberish;
+    callData: BytesLike;
+  };
+
+  export type Call3ValueStructOutput = [
+    target: string,
+    allowFailure: boolean,
+    value: bigint,
+    callData: string
+  ] & {
+    target: string;
+    allowFailure: boolean;
+    value: bigint;
+    callData: string;
+  };
+}
+
+export interface IMulticall3Interface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "aggregate"
+      | "aggregate3"
+      | "aggregate3Value"
+      | "blockAndAggregate"
+      | "getBasefee"
+      | "getBlockHash"
+      | "getBlockNumber"
+      | "getChainId"
+      | "getCurrentBlockCoinbase"
+      | "getCurrentBlockDifficulty"
+      | "getCurrentBlockGasLimit"
+      | "getCurrentBlockTimestamp"
+      | "getEthBalance"
+      | "getLastBlockHash"
+      | "tryAggregate"
+      | "tryBlockAndAggregate"
+  ): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "aggregate",
+    values: [IMulticall3.CallStruct[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "aggregate3",
+    values: [IMulticall3.Call3Struct[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "aggregate3Value",
+    values: [IMulticall3.Call3ValueStruct[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "blockAndAggregate",
+    values: [IMulticall3.CallStruct[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getBasefee",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getBlockHash",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getBlockNumber",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getChainId",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getCurrentBlockCoinbase",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getCurrentBlockDifficulty",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getCurrentBlockGasLimit",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getCurrentBlockTimestamp",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getEthBalance",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getLastBlockHash",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "tryAggregate",
+    values: [boolean, IMulticall3.CallStruct[]]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "tryBlockAndAggregate",
+    values: [boolean, IMulticall3.CallStruct[]]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "aggregate", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "aggregate3", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "aggregate3Value",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "blockAndAggregate",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "getBasefee", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getBlockHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getBlockNumber",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "getChainId", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getCurrentBlockCoinbase",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getCurrentBlockDifficulty",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getCurrentBlockGasLimit",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getCurrentBlockTimestamp",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getEthBalance",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "getLastBlockHash",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "tryAggregate",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "tryBlockAndAggregate",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IMulticall3 extends BaseContract {
+  connect(runner?: ContractRunner | null): IMulticall3;
+  waitForDeployment(): Promise<this>;
+
+  interface: IMulticall3Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  aggregate: TypedContractMethod<
+    [calls: IMulticall3.CallStruct[]],
+    [[bigint, string[]] & { blockNumber: bigint; returnData: string[] }],
+    "payable"
+  >;
+
+  aggregate3: TypedContractMethod<
+    [calls: IMulticall3.Call3Struct[]],
+    [IMulticall3.ResultStructOutput[]],
+    "payable"
+  >;
+
+  aggregate3Value: TypedContractMethod<
+    [calls: IMulticall3.Call3ValueStruct[]],
+    [IMulticall3.ResultStructOutput[]],
+    "payable"
+  >;
+
+  blockAndAggregate: TypedContractMethod<
+    [calls: IMulticall3.CallStruct[]],
+    [
+      [bigint, string, IMulticall3.ResultStructOutput[]] & {
+        blockNumber: bigint;
+        blockHash: string;
+        returnData: IMulticall3.ResultStructOutput[];
+      }
+    ],
+    "payable"
+  >;
+
+  getBasefee: TypedContractMethod<[], [bigint], "view">;
+
+  getBlockHash: TypedContractMethod<
+    [blockNumber: BigNumberish],
+    [string],
+    "view"
+  >;
+
+  getBlockNumber: TypedContractMethod<[], [bigint], "view">;
+
+  getChainId: TypedContractMethod<[], [bigint], "view">;
+
+  getCurrentBlockCoinbase: TypedContractMethod<[], [string], "view">;
+
+  getCurrentBlockDifficulty: TypedContractMethod<[], [bigint], "view">;
+
+  getCurrentBlockGasLimit: TypedContractMethod<[], [bigint], "view">;
+
+  getCurrentBlockTimestamp: TypedContractMethod<[], [bigint], "view">;
+
+  getEthBalance: TypedContractMethod<[addr: AddressLike], [bigint], "view">;
+
+  getLastBlockHash: TypedContractMethod<[], [string], "view">;
+
+  tryAggregate: TypedContractMethod<
+    [requireSuccess: boolean, calls: IMulticall3.CallStruct[]],
+    [IMulticall3.ResultStructOutput[]],
+    "payable"
+  >;
+
+  tryBlockAndAggregate: TypedContractMethod<
+    [requireSuccess: boolean, calls: IMulticall3.CallStruct[]],
+    [
+      [bigint, string, IMulticall3.ResultStructOutput[]] & {
+        blockNumber: bigint;
+        blockHash: string;
+        returnData: IMulticall3.ResultStructOutput[];
+      }
+    ],
+    "payable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "aggregate"
+  ): TypedContractMethod<
+    [calls: IMulticall3.CallStruct[]],
+    [[bigint, string[]] & { blockNumber: bigint; returnData: string[] }],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "aggregate3"
+  ): TypedContractMethod<
+    [calls: IMulticall3.Call3Struct[]],
+    [IMulticall3.ResultStructOutput[]],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "aggregate3Value"
+  ): TypedContractMethod<
+    [calls: IMulticall3.Call3ValueStruct[]],
+    [IMulticall3.ResultStructOutput[]],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "blockAndAggregate"
+  ): TypedContractMethod<
+    [calls: IMulticall3.CallStruct[]],
+    [
+      [bigint, string, IMulticall3.ResultStructOutput[]] & {
+        blockNumber: bigint;
+        blockHash: string;
+        returnData: IMulticall3.ResultStructOutput[];
+      }
+    ],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "getBasefee"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getBlockHash"
+  ): TypedContractMethod<[blockNumber: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "getBlockNumber"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getChainId"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getCurrentBlockCoinbase"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "getCurrentBlockDifficulty"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getCurrentBlockGasLimit"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getCurrentBlockTimestamp"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getEthBalance"
+  ): TypedContractMethod<[addr: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getLastBlockHash"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "tryAggregate"
+  ): TypedContractMethod<
+    [requireSuccess: boolean, calls: IMulticall3.CallStruct[]],
+    [IMulticall3.ResultStructOutput[]],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "tryBlockAndAggregate"
+  ): TypedContractMethod<
+    [requireSuccess: boolean, calls: IMulticall3.CallStruct[]],
+    [
+      [bigint, string, IMulticall3.ResultStructOutput[]] & {
+        blockNumber: bigint;
+        blockHash: string;
+        returnData: IMulticall3.ResultStructOutput[];
+      }
+    ],
+    "payable"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/index.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0e2780837cc380dbadf2d70501bc12f655e36c94
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/interfaces/index.ts
@@ -0,0 +1,8 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as ierc721Sol from "./IERC721.sol";
+export type { ierc721Sol };
+export type { IERC165 } from "./IERC165";
+export type { IERC20 } from "./IERC20";
+export type { IMulticall3 } from "./IMulticall3";
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC20.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC20.ts
new file mode 100644
index 0000000000000000000000000000000000000000..72c49632c638fbe60d43f53ed37b3eae64f586f1
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC20.ts
@@ -0,0 +1,370 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../common";
+
+export interface MockERC20Interface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "DOMAIN_SEPARATOR"
+      | "allowance"
+      | "approve"
+      | "balanceOf"
+      | "decimals"
+      | "initialize"
+      | "name"
+      | "nonces"
+      | "permit"
+      | "symbol"
+      | "totalSupply"
+      | "transfer"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "DOMAIN_SEPARATOR",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "allowance",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(functionFragment: "decimals", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "initialize",
+    values: [string, string, BigNumberish]
+  ): string;
+  encodeFunctionData(functionFragment: "name", values?: undefined): string;
+  encodeFunctionData(functionFragment: "nonces", values: [AddressLike]): string;
+  encodeFunctionData(
+    functionFragment: "permit",
+    values: [
+      AddressLike,
+      AddressLike,
+      BigNumberish,
+      BigNumberish,
+      BigNumberish,
+      BytesLike,
+      BytesLike
+    ]
+  ): string;
+  encodeFunctionData(functionFragment: "symbol", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "totalSupply",
+    values?: undefined
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transfer",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "DOMAIN_SEPARATOR",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "name", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "nonces", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "permit", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "totalSupply",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    owner: AddressLike,
+    spender: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [owner: string, spender: string, value: bigint];
+  export interface OutputObject {
+    owner: string;
+    spender: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    from: AddressLike,
+    to: AddressLike,
+    value: BigNumberish
+  ];
+  export type OutputTuple = [from: string, to: string, value: bigint];
+  export interface OutputObject {
+    from: string;
+    to: string;
+    value: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface MockERC20 extends BaseContract {
+  connect(runner?: ContractRunner | null): MockERC20;
+  waitForDeployment(): Promise<this>;
+
+  interface: MockERC20Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  DOMAIN_SEPARATOR: TypedContractMethod<[], [string], "view">;
+
+  allowance: TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+
+  approve: TypedContractMethod<
+    [spender: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  balanceOf: TypedContractMethod<[owner: AddressLike], [bigint], "view">;
+
+  decimals: TypedContractMethod<[], [bigint], "view">;
+
+  initialize: TypedContractMethod<
+    [name_: string, symbol_: string, decimals_: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+
+  name: TypedContractMethod<[], [string], "view">;
+
+  nonces: TypedContractMethod<[arg0: AddressLike], [bigint], "view">;
+
+  permit: TypedContractMethod<
+    [
+      owner: AddressLike,
+      spender: AddressLike,
+      value: BigNumberish,
+      deadline: BigNumberish,
+      v: BigNumberish,
+      r: BytesLike,
+      s: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+
+  symbol: TypedContractMethod<[], [string], "view">;
+
+  totalSupply: TypedContractMethod<[], [bigint], "view">;
+
+  transfer: TypedContractMethod<
+    [to: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  transferFrom: TypedContractMethod<
+    [from: AddressLike, to: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "DOMAIN_SEPARATOR"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "allowance"
+  ): TypedContractMethod<
+    [owner: AddressLike, spender: AddressLike],
+    [bigint],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [spender: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[owner: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "decimals"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "initialize"
+  ): TypedContractMethod<
+    [name_: string, symbol_: string, decimals_: BigNumberish],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "name"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "nonces"
+  ): TypedContractMethod<[arg0: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "permit"
+  ): TypedContractMethod<
+    [
+      owner: AddressLike,
+      spender: AddressLike,
+      value: BigNumberish,
+      deadline: BigNumberish,
+      v: BigNumberish,
+      r: BytesLike,
+      s: BytesLike
+    ],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "symbol"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "totalSupply"
+  ): TypedContractMethod<[], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "transfer"
+  ): TypedContractMethod<
+    [to: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [from: AddressLike, to: AddressLike, amount: BigNumberish],
+    [boolean],
+    "nonpayable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC721.sol/IERC721TokenReceiver.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC721.sol/IERC721TokenReceiver.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4727ee294831bd8da3478225e9f0ae62fa8f8bc7
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC721.sol/IERC721TokenReceiver.ts
@@ -0,0 +1,100 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface IERC721TokenReceiverInterface extends Interface {
+  getFunction(nameOrSignature: "onERC721Received"): FunctionFragment;
+
+  encodeFunctionData(
+    functionFragment: "onERC721Received",
+    values: [AddressLike, AddressLike, BigNumberish, BytesLike]
+  ): string;
+
+  decodeFunctionResult(
+    functionFragment: "onERC721Received",
+    data: BytesLike
+  ): Result;
+}
+
+export interface IERC721TokenReceiver extends BaseContract {
+  connect(runner?: ContractRunner | null): IERC721TokenReceiver;
+  waitForDeployment(): Promise<this>;
+
+  interface: IERC721TokenReceiverInterface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  onERC721Received: TypedContractMethod<
+    [arg0: AddressLike, arg1: AddressLike, arg2: BigNumberish, arg3: BytesLike],
+    [string],
+    "nonpayable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "onERC721Received"
+  ): TypedContractMethod<
+    [arg0: AddressLike, arg1: AddressLike, arg2: BigNumberish, arg3: BytesLike],
+    [string],
+    "nonpayable"
+  >;
+
+  filters: {};
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC721.sol/MockERC721.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC721.sol/MockERC721.ts
new file mode 100644
index 0000000000000000000000000000000000000000..24df1c5f49cee614dc15c134c8c39dfc345e5364
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC721.sol/MockERC721.ts
@@ -0,0 +1,433 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type {
+  BaseContract,
+  BigNumberish,
+  BytesLike,
+  FunctionFragment,
+  Result,
+  Interface,
+  EventFragment,
+  AddressLike,
+  ContractRunner,
+  ContractMethod,
+  Listener,
+} from "ethers";
+import type {
+  TypedContractEvent,
+  TypedDeferredTopicFilter,
+  TypedEventLog,
+  TypedLogDescription,
+  TypedListener,
+  TypedContractMethod,
+} from "../../../../../common";
+
+export interface MockERC721Interface extends Interface {
+  getFunction(
+    nameOrSignature:
+      | "approve"
+      | "balanceOf"
+      | "getApproved"
+      | "initialize"
+      | "isApprovedForAll"
+      | "name"
+      | "ownerOf"
+      | "safeTransferFrom(address,address,uint256)"
+      | "safeTransferFrom(address,address,uint256,bytes)"
+      | "setApprovalForAll"
+      | "supportsInterface"
+      | "symbol"
+      | "tokenURI"
+      | "transferFrom"
+  ): FunctionFragment;
+
+  getEvent(
+    nameOrSignatureOrTopic: "Approval" | "ApprovalForAll" | "Transfer"
+  ): EventFragment;
+
+  encodeFunctionData(
+    functionFragment: "approve",
+    values: [AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "balanceOf",
+    values: [AddressLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "getApproved",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "initialize",
+    values: [string, string]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "isApprovedForAll",
+    values: [AddressLike, AddressLike]
+  ): string;
+  encodeFunctionData(functionFragment: "name", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "ownerOf",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "safeTransferFrom(address,address,uint256)",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "safeTransferFrom(address,address,uint256,bytes)",
+    values: [AddressLike, AddressLike, BigNumberish, BytesLike]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "setApprovalForAll",
+    values: [AddressLike, boolean]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "supportsInterface",
+    values: [BytesLike]
+  ): string;
+  encodeFunctionData(functionFragment: "symbol", values?: undefined): string;
+  encodeFunctionData(
+    functionFragment: "tokenURI",
+    values: [BigNumberish]
+  ): string;
+  encodeFunctionData(
+    functionFragment: "transferFrom",
+    values: [AddressLike, AddressLike, BigNumberish]
+  ): string;
+
+  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "getApproved",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "isApprovedForAll",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "name", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "safeTransferFrom(address,address,uint256)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "safeTransferFrom(address,address,uint256,bytes)",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "setApprovalForAll",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(
+    functionFragment: "supportsInterface",
+    data: BytesLike
+  ): Result;
+  decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result;
+  decodeFunctionResult(functionFragment: "tokenURI", data: BytesLike): Result;
+  decodeFunctionResult(
+    functionFragment: "transferFrom",
+    data: BytesLike
+  ): Result;
+}
+
+export namespace ApprovalEvent {
+  export type InputTuple = [
+    _owner: AddressLike,
+    _approved: AddressLike,
+    _tokenId: BigNumberish
+  ];
+  export type OutputTuple = [
+    _owner: string,
+    _approved: string,
+    _tokenId: bigint
+  ];
+  export interface OutputObject {
+    _owner: string;
+    _approved: string;
+    _tokenId: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace ApprovalForAllEvent {
+  export type InputTuple = [
+    _owner: AddressLike,
+    _operator: AddressLike,
+    _approved: boolean
+  ];
+  export type OutputTuple = [
+    _owner: string,
+    _operator: string,
+    _approved: boolean
+  ];
+  export interface OutputObject {
+    _owner: string;
+    _operator: string;
+    _approved: boolean;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export namespace TransferEvent {
+  export type InputTuple = [
+    _from: AddressLike,
+    _to: AddressLike,
+    _tokenId: BigNumberish
+  ];
+  export type OutputTuple = [_from: string, _to: string, _tokenId: bigint];
+  export interface OutputObject {
+    _from: string;
+    _to: string;
+    _tokenId: bigint;
+  }
+  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
+  export type Filter = TypedDeferredTopicFilter<Event>;
+  export type Log = TypedEventLog<Event>;
+  export type LogDescription = TypedLogDescription<Event>;
+}
+
+export interface MockERC721 extends BaseContract {
+  connect(runner?: ContractRunner | null): MockERC721;
+  waitForDeployment(): Promise<this>;
+
+  interface: MockERC721Interface;
+
+  queryFilter<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+  queryFilter<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    fromBlockOrBlockhash?: string | number | undefined,
+    toBlock?: string | number | undefined
+  ): Promise<Array<TypedEventLog<TCEvent>>>;
+
+  on<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  on<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  once<TCEvent extends TypedContractEvent>(
+    event: TCEvent,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+  once<TCEvent extends TypedContractEvent>(
+    filter: TypedDeferredTopicFilter<TCEvent>,
+    listener: TypedListener<TCEvent>
+  ): Promise<this>;
+
+  listeners<TCEvent extends TypedContractEvent>(
+    event: TCEvent
+  ): Promise<Array<TypedListener<TCEvent>>>;
+  listeners(eventName?: string): Promise<Array<Listener>>;
+  removeAllListeners<TCEvent extends TypedContractEvent>(
+    event?: TCEvent
+  ): Promise<this>;
+
+  approve: TypedContractMethod<
+    [spender: AddressLike, id: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  balanceOf: TypedContractMethod<[owner: AddressLike], [bigint], "view">;
+
+  getApproved: TypedContractMethod<[id: BigNumberish], [string], "view">;
+
+  initialize: TypedContractMethod<
+    [name_: string, symbol_: string],
+    [void],
+    "nonpayable"
+  >;
+
+  isApprovedForAll: TypedContractMethod<
+    [owner: AddressLike, operator: AddressLike],
+    [boolean],
+    "view"
+  >;
+
+  name: TypedContractMethod<[], [string], "view">;
+
+  ownerOf: TypedContractMethod<[id: BigNumberish], [string], "view">;
+
+  "safeTransferFrom(address,address,uint256)": TypedContractMethod<
+    [from: AddressLike, to: AddressLike, id: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  "safeTransferFrom(address,address,uint256,bytes)": TypedContractMethod<
+    [from: AddressLike, to: AddressLike, id: BigNumberish, data: BytesLike],
+    [void],
+    "payable"
+  >;
+
+  setApprovalForAll: TypedContractMethod<
+    [operator: AddressLike, approved: boolean],
+    [void],
+    "nonpayable"
+  >;
+
+  supportsInterface: TypedContractMethod<
+    [interfaceId: BytesLike],
+    [boolean],
+    "view"
+  >;
+
+  symbol: TypedContractMethod<[], [string], "view">;
+
+  tokenURI: TypedContractMethod<[id: BigNumberish], [string], "view">;
+
+  transferFrom: TypedContractMethod<
+    [from: AddressLike, to: AddressLike, id: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  getFunction<T extends ContractMethod = ContractMethod>(
+    key: string | FunctionFragment
+  ): T;
+
+  getFunction(
+    nameOrSignature: "approve"
+  ): TypedContractMethod<
+    [spender: AddressLike, id: BigNumberish],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "balanceOf"
+  ): TypedContractMethod<[owner: AddressLike], [bigint], "view">;
+  getFunction(
+    nameOrSignature: "getApproved"
+  ): TypedContractMethod<[id: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "initialize"
+  ): TypedContractMethod<
+    [name_: string, symbol_: string],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "isApprovedForAll"
+  ): TypedContractMethod<
+    [owner: AddressLike, operator: AddressLike],
+    [boolean],
+    "view"
+  >;
+  getFunction(
+    nameOrSignature: "name"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "ownerOf"
+  ): TypedContractMethod<[id: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "safeTransferFrom(address,address,uint256)"
+  ): TypedContractMethod<
+    [from: AddressLike, to: AddressLike, id: BigNumberish],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "safeTransferFrom(address,address,uint256,bytes)"
+  ): TypedContractMethod<
+    [from: AddressLike, to: AddressLike, id: BigNumberish, data: BytesLike],
+    [void],
+    "payable"
+  >;
+  getFunction(
+    nameOrSignature: "setApprovalForAll"
+  ): TypedContractMethod<
+    [operator: AddressLike, approved: boolean],
+    [void],
+    "nonpayable"
+  >;
+  getFunction(
+    nameOrSignature: "supportsInterface"
+  ): TypedContractMethod<[interfaceId: BytesLike], [boolean], "view">;
+  getFunction(
+    nameOrSignature: "symbol"
+  ): TypedContractMethod<[], [string], "view">;
+  getFunction(
+    nameOrSignature: "tokenURI"
+  ): TypedContractMethod<[id: BigNumberish], [string], "view">;
+  getFunction(
+    nameOrSignature: "transferFrom"
+  ): TypedContractMethod<
+    [from: AddressLike, to: AddressLike, id: BigNumberish],
+    [void],
+    "payable"
+  >;
+
+  getEvent(
+    key: "Approval"
+  ): TypedContractEvent<
+    ApprovalEvent.InputTuple,
+    ApprovalEvent.OutputTuple,
+    ApprovalEvent.OutputObject
+  >;
+  getEvent(
+    key: "ApprovalForAll"
+  ): TypedContractEvent<
+    ApprovalForAllEvent.InputTuple,
+    ApprovalForAllEvent.OutputTuple,
+    ApprovalForAllEvent.OutputObject
+  >;
+  getEvent(
+    key: "Transfer"
+  ): TypedContractEvent<
+    TransferEvent.InputTuple,
+    TransferEvent.OutputTuple,
+    TransferEvent.OutputObject
+  >;
+
+  filters: {
+    "Approval(address,address,uint256)": TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+    Approval: TypedContractEvent<
+      ApprovalEvent.InputTuple,
+      ApprovalEvent.OutputTuple,
+      ApprovalEvent.OutputObject
+    >;
+
+    "ApprovalForAll(address,address,bool)": TypedContractEvent<
+      ApprovalForAllEvent.InputTuple,
+      ApprovalForAllEvent.OutputTuple,
+      ApprovalForAllEvent.OutputObject
+    >;
+    ApprovalForAll: TypedContractEvent<
+      ApprovalForAllEvent.InputTuple,
+      ApprovalForAllEvent.OutputTuple,
+      ApprovalForAllEvent.OutputObject
+    >;
+
+    "Transfer(address,address,uint256)": TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+    Transfer: TypedContractEvent<
+      TransferEvent.InputTuple,
+      TransferEvent.OutputTuple,
+      TransferEvent.OutputObject
+    >;
+  };
+}
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC721.sol/index.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC721.sol/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b6a2ca8db10a47aecb4d9f7bfaef0dc6b30394ac
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/MockERC721.sol/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+export type { IERC721TokenReceiver } from "./IERC721TokenReceiver";
+export type { MockERC721 } from "./MockERC721";
diff --git a/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/index.ts b/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..af52f2aeff5ed6d4a7a832848583c3f0b60b597b
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/forge-std/src/mocks/index.ts
@@ -0,0 +1,6 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as mockErc721Sol from "./MockERC721.sol";
+export type { mockErc721Sol };
+export type { MockERC20 } from "./MockERC20";
diff --git a/momiji-helpers/utils/typechain-types/lib/index.ts b/momiji-helpers/utils/typechain-types/lib/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..068d33fc395aa11bb3061cd4e84280f9af7c9fa4
--- /dev/null
+++ b/momiji-helpers/utils/typechain-types/lib/index.ts
@@ -0,0 +1,5 @@
+/* Autogenerated file. Do not edit manually. */
+/* tslint:disable */
+/* eslint-disable */
+import type * as forgeStd from "./forge-std";
+export type { forgeStd };
diff --git a/momiji-helpers/utils/types.ts b/momiji-helpers/utils/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..07d834de1ab2c8ecbc2cb622433d8df254c2a65c
--- /dev/null
+++ b/momiji-helpers/utils/types.ts
@@ -0,0 +1,306 @@
+import { Noir } from '@noir-lang/noir_js';
+import { Fr, Barretenberg } from '@aztec/bb.js';
+import { BarretenbergBackend } from '@noir-lang/backend_barretenberg';
+import { CompiledCircuit, ProofData } from '@noir-lang/types';
+import { UTXO_Spendable, UTXO_New, ContractOnlyInputs, PublicInputs, Field, MerkleProof } from '../circuits/helpers/codegen/create_transaction';
+import { HistoricTreeInput, Verifier, VerifierTx } from '../circuits/helpers/codegen/publish_batch';
+import { ethers } from "ethers"
+import { Momiji, UltraVerifier, XFTMock, IUniswapV3Pool } from './typechain-types';
+import { TransactionStruct, BatchStruct } from './typechain-types/contracts/state.sol/IMomiji';
+import { MerkleTree } from '../utils/MerkleTree';
+import { BackendOptions } from '@noir-lang/backend_barretenberg';
+import { txVk } from "./transaction_circuits"
+
+export type ContractBatch = BatchStruct
+export type BatchPublishResponse = ethers.ContractTransactionResponse
+export type BatchPublishReceipt = ethers.ContractTransactionReceipt
+export type EthersSigner = ethers.Signer
+export type EthersEventLog = ethers.EventLog
+export type EthersEventResult = ethers.Result
+export type UTXO_Spendable_Struct = UTXO_Spendable
+export type Merkle_Proof_Struct = MerkleProof
+export type UniswapV3Pool = IUniswapV3Pool
+export type Provider = ethers.Provider
+export type TransactionRequest = ethers.TransactionRequest
+export type TypedDataDomain = ethers.TypedDataDomain
+export type AddressLike = ethers.AddressLike
+export type FeeData = ethers.FeeData
+export type ContractTransaction = TransactionStruct
+export type PublicCircuitInputs = PublicInputs
+export const NoirFr = Fr
+export type _NoirFr = Fr
+export const BarretenbergApi = Barretenberg
+export type _Barretenberg = Barretenberg
+export type NoirBackendOptions = BackendOptions
+
+export type slot0 = {
+  sqrtPriceX96: bigint;
+  tick: bigint;
+  observationIndex: bigint;
+  observationCardinality: bigint;
+  observationCardinalityNext: bigint;
+  feeProtocol: bigint;
+  unlocked: boolean;
+}
+
+export const ZERO_VALUE = "0x016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720"; // sha256("Momiji") % Fr.MODULUS
+export const ZERO_HEX = toFixedHex(0, true)
+export const treeConfig = {
+  utxoDepth: 4,
+  txDepth: 4,
+  stateDepth: 20
+}
+
+export const default_historic_path: Field[] = [
+  "0x016a430aa58685aba1311244a973a3bc358859da86784be51094368e8fb6f720",
+  "0x018d39625c19fa2cfbebdb940a66d7040bb0ef1b59ff6afd92a13a6b9b2d9865",
+  "0x096c00ebc0c52478316b6b9fd16d0cd94c5f45bbe45bbfa8c606197c6119d41f",
+  "0x2eaefd3bdd1bfbddd8fc5d972ded58617f752b3e88bd17b791e85e7b8eaacb47",
+  "0x11d25ff6aa8a431fbce8e8d9a87a2d7986adf38e724fbe47f15752d0931f14d8",
+  "0x01e8677aa02546bd7105a7a9fd31c4ef16b69d1bde90f36e97585d7cc31d50e4",
+  "0x2520a755a532994c78f35b89938fbc864ec31ec4fc00363f83f9b12f04980c6a",
+  "0x21a666842842d5323e51fdda10300c763d6b07e1b797ef3b0bd3690d667445bc",
+  "0x1ce681d6f42b70668c369e7f786166e421dc840f0529bbd065d6b02d14ae0fe8",
+  "0x1819b90a43ee28f652735708b2ef01428e21b84872bb3c7576de6e35d107c8ed",
+  "0x063d7001431110a5949f5946a501fd28f64159f36ab4b80601ca305ac107b3db",
+  "0x09aeef7a06f7daf368d797c2e686c7e9884f000de0bd9d8e73392378b0b1be38",
+  "0x137121fd5d795eeecc61ec6a6de66abc589d241540139178cd5408b6ccb32a6e",
+  "0x01a93f70a1b7482e0b32e76ce49a1e3c1fc2b5cd4789b6af749d78c42791c21a",
+  "0x217bf2cc1f1b505a29b162a7889866af2728f5c6708560c9cc5e987b194c9c81",
+  '0x1461dae57d7df7e580279637e5d94e0d734b908dc22aec5c52ed00187050a030',
+  "0x295933dd65294cbf4b2c64d8a0daa6983d35d1f64d5adc2c44bd9d370086d7dc",
+  "0x24650084f0db0fa4e8234fb251ad046b3ddcb7d6f59160b35cc4086e9e196b80",
+  "0x15086d0394bd68847e3e36241cc7b3966f96efdd30a37e9e1e85027a6dacbed2",
+  "0x1f87a17564f06581c1e1b2d716120990f898893ecc0e076363c56c5e3b56ef7b"
+]
+
+
+export const tx_vk = txVk.slice(1)
+export const tx_vk_hash = txVk[0]
+
+export type GlobalConfig = {
+  signer?: EthersSigner,
+  anonRPC?: string, 
+  nargo?: string, 
+  profit?: number,
+  coinbase?: number, 
+  gossip?: GossipConfig, 
+  withdrawal?: string, 
+  verbose?: boolean,
+  threads?: number,
+  provider: Provider
+}
+
+export type GossipConfig = {
+  seeds: string[];
+  relays: string[];
+  maxRelays: number;
+}
+
+export type Contracts = {
+  state: Momiji,
+  verifier: UltraVerifier,
+  token: XFTMock,
+  pool: IUniswapV3Pool
+}
+
+export type Circuits = {
+  [key: string]: CompiledCircuit;
+}
+
+export type Backends = {
+  [key: string]: BarretenbergBackend;
+};
+
+export type Noirs = {
+  [key: string]: Noir;
+};
+
+export type CircuitsAndContracts = {
+  circuits: Circuits;
+  backends: Backends;
+  noirs: Noirs;
+  contracts: Contracts;
+}
+
+export type NoirJSProofData = ProofData
+
+export type ProofArtifacts = {
+  proofData: ProofData;
+  proofAsFields: string[];
+  vkAsFields: string[];
+  vkHash: string;
+}
+
+export type GossipArtifacts = {
+  proofData: ProofData;
+  proofAsFields: string[];
+}
+
+export type MerkleProofInput = {
+  tree: MerkleTree,
+  leaf: Field
+}
+
+export interface UTXO_Commitment extends UTXO_New {
+  commitment?: Field,
+  siblings?: string[];
+  spend_in_same_batch?: boolean
+}
+
+export type UTXO_Input = {
+  secret?: string,
+  amount: string,
+  asset_type?: string
+}
+
+export interface UTXO_Encrypted extends UTXO_New {
+  secret_encrypted: string;
+  amount_encrypted: string;
+  asset_type_encrypted: string;
+  uid: string;
+}
+
+export type Withdrawal = {
+  amount: Field;
+  recipient: string;
+  swap_percentage: number;
+}
+
+export interface WithdrawalSwap extends Withdrawal {
+  swap_amount: string;
+  price_limit: string;
+}
+
+export type Profit = {
+  wei: bigint;
+  xft: bigint;
+}
+
+export type TransactionIO = {
+  utxo_commitment: UTXO_Commitment[],
+  utxo_encrypted: UTXO_Encrypted[],
+  withdrawal: WithdrawalSwap[]
+}
+
+export type TransactionInputsRaw = {
+  current_root: string;
+  deposit_amount: string;
+  withdrawals: string[];
+  utxo_spendable: UTXO_Spendable[];
+  utxo_new: UTXO_New[];
+  contract_only_inputs: ContractOnlyInputs;
+}
+
+export type RecursionInputs = {
+  recursion_verifier: Verifier | undefined,
+  transaction: Transaction | undefined,
+  accumulator: Field,
+}
+
+export type PublishInputs = {
+  accumulator: Field;
+  hist_tree_input: HistoricTreeInput;
+  tx_verifier: VerifierTx;
+  recursion_verifier: Verifier;
+}
+
+export type ContractPublish = {
+  proof: string;
+  batch: ContractBatch
+}
+
+export type Deposit = {
+  signature: string;
+  pi_hash: string;
+}
+
+export type EncryptedUTXO = {
+  secret: string;
+  amount: string;
+  data: string;
+}
+
+export type RollupTransaction = {
+  transaction: Transaction,
+  rollup_artifacts: ProofArtifacts
+}
+
+export type Transaction = {
+  public_inputs: PublicInputs,
+  contract_inputs: TransactionStruct,
+  proof_artifacts: ProofArtifacts
+}
+
+export type Batch = {
+  tx_key_hash: string;
+  recursive_key_hash: string;
+  new_root: string;
+  old_hist_root: string;
+  new_hist_root: string;
+  oracle: string;
+  historic_path: string[];
+  aggregation_object: string[];
+  transactions: ContractTransaction[];
+}
+
+export type TypedDataLabels = {
+  name: string;
+  type: string;
+}
+
+export type TypedDataTypes = {
+  DepositHash: TypedDataLabels[]
+}
+
+export type TypedDataValues = {
+  pi_hash: string
+}
+
+export interface Mempool {
+  [key: string]: Transaction;
+}
+
+export interface Confirmed {
+  [key: string]: boolean;
+}
+
+export interface Proven {
+  [key: string]: boolean;
+}
+
+
+
+export interface Asset {
+
+  assetContract: string;
+  chainlink: string; 
+  chainlinkDecimals: number;
+  uniswap: string; 
+  flags: number; 
+
+}
+
+export interface Prices {
+  assetHash: number[]; 
+  chainlink: number[]; 
+  chainlinkDecimals: number[]; 
+  uniswap: number[]; 
+}
+
+
+export function toFixedHex(number: number, pad0x: boolean, length: number = 32): string {
+  let hexString = number.toString(16).padStart(length * 2, '0');
+  return (pad0x ? `0x` + hexString : hexString);
+}
+
+export function stringToKeccak(_string: string): string {
+  const bytes: Uint8Array = ethers.toUtf8Bytes(_string)
+  const keccak: string = ethers.keccak256(bytes)
+  return keccak
+}
+
+export function toResult(e: EthersEventLog): EthersEventResult { return (e as EthersEventLog).args[0] as EthersEventResult }
+export function generateSecret(): string {
+  return Fr.random().toString();
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..ec843a6fc7b9fbc4897ffcc64c60c901ed2b8410
--- /dev/null
+++ b/package.json
@@ -0,0 +1,45 @@
+{
+  "name": "momiji-node-ts",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "build": "tsc",
+    "start": "npx tsx ./src/index.ts",
+    "test": "npx hardhat run ./test/test.ts --network localhost",
+    "upgrade": "npx hardhat run ./test/deployProxy.ts --network localhost",
+    "fork": "anvil -m \"artwork story jeans lyrics expose update sword absurd rail game argue submit\" --fork-url \"https://mainnet.infura.io/v3/b0b83d31c8bb4bfdb5c6ed8b87b2426b\" --hardfork cancun"
+  },
+  "type": "module",
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "devDependencies": {
+    "@types/node": "^20.10.4",
+    "@types/validator": "^13.11.7",
+    "dotenv": "^16.4.5",
+    "hardhat": "^2.22.3",
+    "nodemon": "^3.0.2",
+    "ts-node": "^10.9.2",
+    "typescript": "^5.3.2"
+  },
+  "dependencies": {
+    "@chainlink/contracts": "^0.8.0",
+    "@libp2p/bootstrap": "^10.1.0",
+    "@libp2p/identify": "^2.1.2",
+    "@noir-lang/noir_js": "^0.28.0",
+    "@nomicfoundation/hardhat-toolbox": "^5.0.0",
+    "@openzeppelin/contracts": "^5.0.2",
+    "@openzeppelin/contracts-upgradeable": "^5.0.2",
+    "@openzeppelin/hardhat-upgrades": "^3.2.0",
+    "@types/pubsub-js": "^1.8.6",
+    "@uniswap/v3-periphery": "^1.4.4",
+    "ethers": "^6.13.0",
+    "fonstr": "^0.0.11",
+    "indexeddbshim": "^15.0.0",
+    "memorelay": "^2.0.4",
+    "reflect-metadata": "^0.1.14",
+    "sequelize": "^6.35.1",
+    "sequelize-typescript": "^2.1.6"
+  }
+}
diff --git a/src/index.ts b/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..77c8106a71aa07a934044328253396f4a3addaf3
--- /dev/null
+++ b/src/index.ts
@@ -0,0 +1,28 @@
+import { Publisher } from "./modules/momiji";
+import * as types from "../momiji-helpers/utils/types";
+import { ethers } from "ethers";
+import 'dotenv/config';
+
+const main = async () => {
+  let _globalConfig: types.GlobalConfig = {
+    anonRPC: process.env.ANON_RPC,
+    signer: new ethers.Wallet(process.env.PRIVATE_KEY as string, new ethers.JsonRpcProvider(process.env.RPC_URL)),
+    provider: new ethers.JsonRpcProvider(process.env.RPC_URL),
+    nargo: process.env.NARGO_PATH,
+    threads: parseInt(process.env.THREADS as string),
+    gossip: {
+      seeds: process.env.SEEDS ? process.env.SEEDS.split(",") : [],
+      relays: process.env.RELAYS ? process.env.RELAYS.split(",") : [],
+      maxRelays: process.env.MAX_RELAYS ? parseInt(process.env.MAX_RELAYS) : 8,
+    },
+    verbose: (process.env.VERBOSE) ? (process.env.VERBOSE.toLowerCase() === "true") : false,
+    profit: (process.env.PROFIT) ? parseInt(process.env.PROFIT) : 0
+  };
+  
+  let publisher = new Publisher(_globalConfig);
+
+  await publisher.initializePublisher();
+}
+
+console.log(`💫 Starting publisher...`)
+main();
\ No newline at end of file
diff --git a/src/modules/momiji.ts b/src/modules/momiji.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cff67d97cc06007a785f2498796dfa8314ce69aa
--- /dev/null
+++ b/src/modules/momiji.ts
@@ -0,0 +1,229 @@
+import * as types from "../../momiji-helpers/utils/types"
+import { BatchBuilder } from "../../momiji-helpers/utils/batchBuilder";
+import { keccak_tx } from '../../momiji-helpers/circuits/helpers/codegen/keccak_tx';
+import { tx_as_hash } from '../../momiji-helpers/circuits/helpers/codegen/tx_as_hash';
+
+export class Publisher extends BatchBuilder {
+  private publishTimeout: NodeJS.Timeout;
+  private signer: types.EthersSigner | undefined;
+  private mempool: types.Mempool = {};
+  private provingQueue: Promise<types.RecursionInputs[]> = Promise.resolve([]);
+  private batch: types.RecursionInputs[] = [];
+  private confirmed: types.Confirmed = {};
+  private publishing: boolean = false;
+  private proving: boolean = false;
+  private sweeping: boolean = false;
+
+  constructor(config: types.GlobalConfig) {
+    super(config);
+    this.publishTimeout = setInterval(this.publish, 60 * 1000);
+    this.mempool = {};
+    this.confirmed = {};
+  }
+
+  initializePublisher = async () => {
+    await this.initializeBatchBuilder((_tx: types.Transaction) => this.newTransactionReceived(_tx));
+    await this.setupListeners();
+
+    console.log(`⌚ Event watcher started.`)
+
+    await this.printRoot();
+    console.log(`🟣 Welcome to the Offshift Prover Network.`)
+    this.signer && console.log(`🔑 Publisher Address: ${await this.signer.getAddress()}.`)
+
+  }
+
+  async addToMempool(tx: types.Transaction, txid: string): Promise<boolean> {
+    let pi_hash = await tx_as_hash(tx.public_inputs);
+    if (pi_hash != tx.proof_artifacts.proofData.publicInputs[0]) return false;
+
+    if (!this.mempool.hasOwnProperty(txid) && !this.confirmed.hasOwnProperty(txid)) {
+      this.mempool[txid] = tx;
+      let verified: boolean = false;
+      console.log(`❕ Verifying ${txid}.`)
+      const proofU8: Uint8Array = Uint8Array.from(Object.values(tx.proof_artifacts.proofData.proof))
+      tx.proof_artifacts.proofData.proof = proofU8
+      verified = await this.backends.transaction.verifyProof(tx.proof_artifacts.proofData)
+      if (!verified) {
+        return false;
+      }
+      return true;
+    }
+    return false;
+  }
+
+  async newTransactionReceived(tx: types.Transaction): Promise<void> {
+    
+    if (this.batch.length >= 15) { 
+      console.log(`🔴 Transaction rejected -- batch is full`);
+      return;
+    }
+
+    let txid = await keccak_tx(tx.public_inputs);
+    
+    let _verified = await this.addToMempool(tx, txid)
+    if (_verified) this.queueToProve(tx)
+    else console.log(`🔴 Transaction rejected -- failed to verify: ${txid}`);
+  }
+
+  async setupListeners(): Promise<void> {
+    if (!this.contracts) await this.initializePublisher();
+    if (!this.contracts) return;
+    this.contracts.state.on(this.contracts.state.filters.TransactionPublish(undefined, undefined, undefined), async (tx: any, _: any, txId: any) => {
+      this.confirmed[txId] = true;
+      console.log(`✔️ Transaction confirmed: ${txId}.`);
+    });
+
+    this.contracts.state.on(this.contracts.state.filters.TransactionBroadcast(undefined, undefined, undefined), async (tx: any, _: any, txId: any) => {
+      const public_inputs = {
+        current_root: tx.transaction.current_root,
+        utxo_root: tx.transaction.utxo_root,
+        deposit_amount: tx.transaction.amount,
+        withdrawals: new types.NoirFr(tx.transaction.withdrawals.map((w: any) => BigInt(w)).reduce((a: any, b: any) => a + b)).toString(),
+        commitment_in: tx.transaction.commitments_in,
+        commitment_out: tx.transaction.commitments,
+        nullifier_hashes: tx.transaction.nullifier_hashes,
+        contract_only_inputs: txId
+      }
+      const txAsHash: string = await tx_as_hash(public_inputs)
+      let newTx: types.Transaction = {
+        public_inputs: public_inputs,
+        contract_inputs: tx.transaction,
+        proof_artifacts: {
+          proofData: {
+            proof: Uint8Array.from(Buffer.from(tx.proofU8.slice(2), "hex")),
+            publicInputs: [txAsHash]
+          },
+          proofAsFields: tx.proof,
+          vkAsFields: types.tx_vk,
+          vkHash: types.tx_vk_hash
+        }
+      }
+      this.newTransactionReceived(newTx);
+    });
+
+    this.contracts.state.on(this.contracts.state.filters.BatchPublish(undefined, undefined, undefined, undefined, undefined), async (event: any) => {
+      console.log(`🎯 Batch published: ${event}.`);
+      this.provingQueue = Promise.resolve([]);
+      this.batch = [];
+      this.printRoot();
+      return;
+    });
+
+
+  }
+
+  printRoot = async () => console.log(`🌳 Current State Root: ${await this.contracts.state.merkleRoot()}`)
+  sweepProfit = async (txs: types.Transaction[] | types.Transaction): Promise<types.Transaction> => {
+    if (!Array.isArray(txs)) txs = [txs];
+    const utxo_commitments: types.UTXO_Commitment[] = txs.map(tx => tx.contract_inputs.encrypted_utxo.filter(utxo => utxo.amount != types.ZERO_VALUE)).flat().map(utxo => {
+      return {
+        secret: utxo.secret as string,
+        amount: utxo.amount as string,
+        asset_type: utxo.data as string,
+        spend_in_same_batch: true
+      }
+    })
+    const utxo_encrypted: types.UTXO_Encrypted[] = await this._generateUTXOEncrypted([{
+      amount: types.toFixedHex(0, true)
+    }])
+    const withdrawalAmount: bigint = utxo_commitments.map(utxo => BigInt(utxo.amount)).reduce((prev, curr) => prev + curr)
+    const withdrawals: types.WithdrawalSwap[] = await this._generateWithdrawals([{
+      amount: (new types.NoirFr(withdrawalAmount)).toString(),
+      recipient: types.toFixedHex(1, true),
+      swap_percentage: 100 
+    }], 1)
+    const proverTx: types.Transaction = await this._generateTransactionProof(utxo_commitments, utxo_encrypted, withdrawals);
+    return proverTx;
+  }
+
+  publishReady = async (txs: types.RecursionInputs[], contractPublish: types.ContractPublish): Promise<boolean> => {
+    console.log(`💰 Calculating prover fees...`)
+    const transactions: types.Transaction[] = txs.filter(tx => tx.transaction !== undefined).map(tx => tx.transaction as types.Transaction)
+    const utxo_commitments: types.UTXO_Commitment[] = transactions.map(tx => tx.contract_inputs.encrypted_utxo.filter(utxo => utxo.amount != types.ZERO_VALUE)).flat().map(utxo => {
+      return {
+        secret: utxo.secret as string,
+        amount: utxo.amount as string,
+        asset_type: utxo.data as string
+      }
+    })
+    const withdrawalAmount: bigint = utxo_commitments.map(utxo => BigInt(utxo.amount)).reduce((prev, curr) => prev + curr)
+    const withdrawalAmountEther: bigint = await this._getEtherFromXFT(withdrawalAmount)
+    const gasEstimate: bigint = await this.contracts.state.publish.estimateGas(contractPublish.proof, contractPublish.batch)
+    const maxFeePerGas: bigint = await this.config.provider.getFeeData().then(feeData => feeData.maxFeePerGas as bigint)
+    const maxFeePerGasAdjusted: bigint = (this.config.profit) ? maxFeePerGas + BigInt(this.config.profit * 1e9) : maxFeePerGas
+    const txFeeEstimate: bigint = gasEstimate * maxFeePerGasAdjusted
+    const publishReady: boolean = (withdrawalAmountEther >= txFeeEstimate)
+    return publishReady
+  }
+
+  queueToProve = async (tx: types.Transaction) => {
+    if (this.publishing) {
+      console.log(`⚠️ Batch is publishing. Cannot prove additional transactions.`);
+      return;
+    }
+    this.provingQueue = this.provingQueue.then(async (data): Promise<types.RecursionInputs[]> => {
+      return new Promise(async (res, rej) => {
+        if (data.length >= 15) {
+          console.log(`⚠️ Batch is full. Cannot prove additional transactions.`);
+          res(data);
+        }
+        this.proving = true;
+        let _newData = await this.prove(data, tx);
+        this.batch = _newData;
+        this.proving = false;
+        res(_newData);
+      })
+    }).catch(async e => {
+      console.log(e);
+      throw new Error(`❌ An unknown error occured while proving transactions.`);
+    })
+  }
+
+  prove = async (data: types.RecursionInputs[], tx: types.Transaction): Promise<types.RecursionInputs[]> => {
+    return new Promise(async (res, rej) => {
+      console.log(`⏳ Proving ${await keccak_tx(tx.public_inputs)}.`)
+      const proof = await this.rollupTransaction(data, tx);
+      console.log(`✔️ Proved ${await keccak_tx(tx.public_inputs)}.`)
+      return res(proof);
+    })
+  }
+
+  publish = async () => {
+
+    if (this.publishing) return;
+    if (this.proving) return;
+    if (this.sweeping) return;
+    if (this.batch.length === 0) return;
+
+    await this.provingQueue;
+    const contractPublish: types.ContractPublish = await this.preparePublish(this.batch)
+
+    if (!(await this.publishReady(this.batch, contractPublish))) return;
+
+    console.log(`🧹 Sweeping prover fees...`)
+    this.sweeping = true
+    const transactions: types.Transaction[] = this.batch.filter(tx => tx.transaction !== undefined).map(tx => tx.transaction as types.Transaction)
+    const proverTx: types.Transaction = await this.sweepProfit(transactions)
+    this.sweeping = false
+    this.queueToProve(proverTx)
+
+    this.publishing = true;
+    await this.provingQueue
+
+    console.log(`🗞️ Publishing batch...`)
+    const contractPublishProver: types.ContractPublish = await this.preparePublish(this.batch)
+    clearInterval(this.publishTimeout);
+
+    await this.contracts.state.publish(contractPublishProver.proof, contractPublishProver.batch)
+      .then((tx: any) => console.log(`📡 Batch published: ${tx.hash}.`), (error: any) => console.log(error.message));
+
+    this.provingQueue = Promise.resolve([]);
+    this.batch = [];
+
+    this.publishTimeout = setInterval(this.publish, 60 * 1000);
+    this.publishing = false;
+
+    return;
+  }
+}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..15a7285432f3e9f59ba8705de6f64418994f1fe4
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,114 @@
+{
+  "files": [
+    "./src/index.ts"
+  ],
+  "compilerOptions": {
+    /* Visit https://aka.ms/tsconfig to read more about this file */
+
+    /* Projects */
+    // "incremental": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
+    // "composite": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */
+    // "tsBuildInfoFile": "./.tsbuildinfo",              /* Specify the path to .tsbuildinfo incremental compilation file. */
+    // "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring source files instead of declaration files when referencing composite projects. */
+    // "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */
+    // "disableReferencedProjectLoad": true,             /* Reduce the number of projects loaded automatically by TypeScript. */
+
+    /* Language and Environment */
+    "lib": ["es2021"],
+    // "listFiles": true,                                   /* Print names of files part of the compilation. */
+    "target": "es2021",                                  /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
+    // "lib": [],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */
+    // "jsx": "preserve",                                /* Specify what JSX code is generated. */
+    // "experimentalDecorators": true,                   /* Enable experimental support for legacy experimental decorators. */
+    // "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */
+    // "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
+    // "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
+    // "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
+    // "reactNamespace": "",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
+    // "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */
+    // "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */
+    // "moduleDetection": "auto",                        /* Control what method is used to detect module-format JS files. */
+
+    /* Modules */
+    "module": "preserve",                                /* Specify what module code is generated. */
+    // "rootDir": "./",                                  /* Specify the root folder within your source files. */
+    "moduleResolution": "bundler",                          /* Specify how TypeScript looks up a file from a given module specifier. */
+    // "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */
+    // "paths": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */
+    // "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */
+    // "typeRoots": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */
+    // "types": [],                                      /* Specify type package names to be included without being referenced in a source file. */
+    // "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */
+    // "moduleSuffixes": [],                             /* List of file name suffixes to search when resolving a module. */
+    // "allowImportingTsExtensions": true,               /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
+    // "resolvePackageJsonExports": true,                /* Use the package.json 'exports' field when resolving package imports. */
+    // "resolvePackageJsonImports": true,                /* Use the package.json 'imports' field when resolving imports. */
+    // "customConditions": [],                           /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
+    "resolveJsonModule": true,                        /* Enable importing .json files. */
+    // "allowArbitraryExtensions": true,                 /* Enable importing files with any extension, provided a declaration file is present. */
+    // "noResolve": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
+
+    /* JavaScript Support */
+    // "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
+    // "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */
+    // "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
+
+    /* Emit */
+    // "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
+    // "declarationMap": true,                           /* Create sourcemaps for d.ts files. */
+    // "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */
+    // "sourceMap": true,                                /* Create source map files for emitted JavaScript files. */
+    // "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */
+    // "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
+       "outDir": "./dist",                                   /* Specify an output folder for all emitted files. */
+    // "removeComments": true,                           /* Disable emitting comments. */
+    // "noEmit": true,                                   /* Disable emitting files from a compilation. */
+    // "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
+    // "importsNotUsedAsValues": "remove",               /* Specify emit/checking behavior for imports that are only used for types. */
+    // "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
+    // "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */
+    // "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */
+    // "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */
+    // "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
+    // "newLine": "crlf",                                /* Set the newline character for emitting files. */
+    // "stripInternal": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
+    // "noEmitHelpers": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */
+    // "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */
+    // "preserveConstEnums": true,                       /* Disable erasing 'const enum' declarations in generated code. */
+    // "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */
+    // "preserveValueImports": true,                     /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
+
+    /* Interop Constraints */
+    // "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */
+    // "verbatimModuleSyntax": true,                     /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
+    // "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */
+    "esModuleInterop": true,                             /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
+    // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
+    "forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */
+
+    /* Type Checking */
+    "strict": true,                                      /* Enable all strict type-checking options. */
+    // "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied 'any' type. */
+    // "strictNullChecks": true,                         /* When type checking, take into account 'null' and 'undefined'. */
+    // "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
+    // "strictBindCallApply": true,                      /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
+    // "strictPropertyInitialization": true,             /* Check for class properties that are declared but not set in the constructor. */
+    // "noImplicitThis": true,                           /* Enable error reporting when 'this' is given the type 'any'. */
+    // "useUnknownInCatchVariables": true,               /* Default catch clause variables as 'unknown' instead of 'any'. */
+    // "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */
+    // "noUnusedLocals": true,                           /* Enable error reporting when local variables aren't read. */
+    // "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read. */
+    // "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */
+    // "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */
+    // "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */
+    // "noUncheckedIndexedAccess": true,                 /* Add 'undefined' to a type when accessed using an index. */
+    // "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */
+    // "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type. */
+    // "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */
+    // "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */
+
+    /* Completeness */
+    // "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */
+    "skipLibCheck": true                                 /* Skip type checking all .d.ts files. */
+  }
+}