diff --git a/README.md b/README.md index 31f47d1b..8e419ba0 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ The app requires these arguments (all arguments can be set in env variables alte - `--arb-address`, Address of the deployed arb contract, Will override the 'ARB_ADDRESS' in env variables - `--bot-min-balance` The minimum gas token balance the bot wallet must have. Will override the 'BOT_MIN_BALANCE' in env variables - `-s` or `--subgraph`, Subgraph URL(s) to read orders details from, can be used in combination with --orders, Will override the 'SUBGRAPH' in env variables +- `--dispair`, Address of dispair (ExpressionDeployer contract) to use for tasks, Will override the 'DISPAIR' in env variables Other optional arguments are: - `--generic-arb-address`, Address of the deployed generic arb contract to perform inter-orderbook clears, Will override the 'GENERIC_ARB_ADDRESS' in env variables @@ -275,6 +276,9 @@ QUOTE_GAS= # Only clear orders through RP4, excludes intra and inter orderbook clears RP_ONLY="true" + +# Address of dispair (ExpressionDeployer contract) to use for tasks +DISPAIR="address" ``` If both env variables and CLI argument are set, the CLI arguments will be prioritized and override the env variables. diff --git a/example.env b/example.env index 772a7a99..82f40c5d 100644 --- a/example.env +++ b/example.env @@ -100,6 +100,9 @@ QUOTE_GAS= # Only clear orders through RP4, excludes intra and inter orderbook clears RP_ONLY="true" +# Address of dispair (ExpressionDeployer contract) to use for tasks +DISPAIR="address" + # test rpcs vars TEST_POLYGON_RPC= diff --git a/package-lock.json b/package-lock.json index fdddfcac..067e7ca0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@opentelemetry/resources": "^1.22.0", "@opentelemetry/sdk-trace-base": "^1.22.0", "@opentelemetry/semantic-conventions": "^1.22.0", + "@rainlanguage/dotrain": "^6.0.1-alpha.21", "@rainlanguage/orderbook": "^0.0.1-alpha.6", "axios": "^1.3.4", "commander": "^11.0.0", @@ -3460,6 +3461,19 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "node_modules/@rainlanguage/dotrain": { + "version": "6.0.1-alpha.21", + "resolved": "https://registry.npmjs.org/@rainlanguage/dotrain/-/dotrain-6.0.1-alpha.21.tgz", + "integrity": "sha512-bZ0ZWl09ifY7iJfGArLccmpjLQCrqvrzDGCNuzXmv+U1WKoLM6yFpE8HESm6a4c1E/T2p3Y6wtD3buBA64nC0g==", + "dependencies": { + "buffer": "^6.0.3", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-types": "^3.17.3" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@rainlanguage/orderbook": { "version": "0.0.1-alpha.6", "resolved": "https://registry.npmjs.org/@rainlanguage/orderbook/-/orderbook-0.0.1-alpha.6.tgz", @@ -25160,6 +25174,28 @@ "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", "dev": true }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, "node_modules/walk-back": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.0.tgz", diff --git a/package.json b/package.json index 39e70ab9..c89e558f 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@opentelemetry/resources": "^1.22.0", "@opentelemetry/sdk-trace-base": "^1.22.0", "@opentelemetry/semantic-conventions": "^1.22.0", + "@rainlanguage/dotrain": "^6.0.1-alpha.21", "@rainlanguage/orderbook": "^0.0.1-alpha.6", "axios": "^1.3.4", "commander": "^11.0.0", diff --git a/src/abis.ts b/src/abis.ts index b376267f..8789822e 100644 --- a/src/abis.ts +++ b/src/abis.ts @@ -70,6 +70,16 @@ export const routeProcessor3Abi = [ `function processRoute(address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOutMin ,address to, bytes memory route) external payable returns (uint256 amountOut)`, ] as const; +/** + * ExpressionDeployerNPE2 minimal ABI + */ +export const deployerAbi = [ + "function parse2(bytes memory data) external view returns (bytes memory bytecode)", + "function iStore() external view returns (address)", + "function iInterpreter() external view returns (address)", + "function iParser() external view returns (address)", +] as const; + /** * Minimal ABI for Arb contract */ diff --git a/src/cli.ts b/src/cli.ts index a48a0ef5..7b2a861f 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,4 +1,5 @@ import { config } from "dotenv"; +import { isAddress } from "viem"; import { getGasPrice } from "./gas"; import { Command } from "commander"; import { getMetaInfo } from "./config"; @@ -75,6 +76,7 @@ const ENV_OPTIONS = { txGas: process?.env?.TX_GAS, quoteGas: process?.env?.QUOTE_GAS, route: process?.env?.ROUTE, + dispair: process?.env?.DISPAIR, rpOnly: process?.env?.RP_ONLY?.toLowerCase() === "true" ? true : false, ownerProfile: process?.env?.OWNER_PROFILE ? Array.from(process?.env?.OWNER_PROFILE.matchAll(/[^,\s]+/g)).map((v) => v[0]) @@ -120,6 +122,10 @@ const getOptions = async (argv: any, version?: string) => { "--generic-arb-address
", "Address of the deployed generic arb contract to perform inter-orderbook clears, Will override the 'GENERIC_ARB_ADDRESS' in env variables", ) + .option( + "--dispair
", + "Address of dispair (ExpressionDeployer contract) to use for tasks, Will override the 'DISPAIR' in env variables", + ) .option( "-l, --lps ", "List of liquidity providers (dex) to use by the router as one quoted string seperated by a comma for each, example: 'SushiSwapV2,UniswapV3', Will override the 'LIQUIDITY_PROVIDERS' in env variables, if unset will use all available liquidty providers", @@ -260,6 +266,7 @@ const getOptions = async (argv: any, version?: string) => { cmdOptions.route = cmdOptions.route || getEnv(ENV_OPTIONS.route); cmdOptions.publicRpc = cmdOptions.publicRpc || getEnv(ENV_OPTIONS.publicRpc); cmdOptions.rpOnly = cmdOptions.rpOnly || getEnv(ENV_OPTIONS.rpOnly); + cmdOptions.dispair = cmdOptions.dispair || getEnv(ENV_OPTIONS.dispair); if (cmdOptions.ownerProfile) { const profiles: Record = {}; cmdOptions.ownerProfile.forEach((v: string) => { @@ -469,6 +476,13 @@ export async function startup(argv: any, version?: string, tracer?: Tracer, ctx? throw "invalid txGas value, must be an integer greater than zero optionally with appended percentage sign to apply as percentage to original gas"; } } + if (options.dispair) { + if (typeof options.dispair !== "string" || !isAddress(options.dispair, { strict: false })) { + throw "expected dispair (ExpressionDeployer contract) address"; + } + } else { + throw "undefined dispair address"; + } if (options.quoteGas) { try { options.quoteGas = BigInt(options.quoteGas); diff --git a/src/config.ts b/src/config.ts index 15541fbb..aed7b9e1 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,5 +1,5 @@ -import { BigNumber } from "ethers"; import { getSgOrderbooks } from "./sg"; +import { sendTransaction } from "./tx"; import { WNATIVE } from "sushi/currency"; import { ChainId, ChainKey } from "sushi/chain"; import { DataFetcher, LiquidityProviders } from "sushi/router"; @@ -30,7 +30,6 @@ import { ROUTE_PROCESSOR_3_1_ADDRESS, ROUTE_PROCESSOR_3_2_ADDRESS, } from "sushi/config"; -import { sendTransaction } from "./tx"; /** * Get the chain config for a given chain id @@ -221,83 +220,6 @@ export async function getDataFetcher( } } -/** - * Get the bounty check ensure task bytecode - * @param inputToEthPrice - Input token to Eth price - * @param outputToEthPrice - Output token to Eth price - * @param minimumExcepted - Minimum expected amount - */ -export function getBountyEnsureBytecode( - inputToEthPrice: BigNumber, - outputToEthPrice: BigNumber, - minimumExcepted: BigNumber, - sender: string, -): string { - const inputPrice = inputToEthPrice.toHexString().substring(2).padStart(64, "0"); - const outputPrice = outputToEthPrice.toHexString().substring(2).padStart(64, "0"); - const minimum = minimumExcepted.toHexString().substring(2).padStart(64, "0"); - const msgSender = sender.substring(2).padStart(64, "0").toLowerCase(); - // rainlang bytecode: - // :ensure(equal-to(sender context<0 0>()) \"unknown sender\"), - // :ensure( - // greater-than-or-equal-to( - // add( - // mul(inputToEthPrice context<1 0>()) - // mul(outputToEthPrice context<1 1>()) - // ) - // minimumExcepted - // ) - // \"minimum sender output\" - // ); - return `0x0000000000000000000000000000000000000000000000000000000000000006${msgSender}8e756e6b6e6f776e2073656e6465720000000000000000000000000000000000${inputPrice}${outputPrice}${minimum}956d696e696d756d2073656e646572206f7574707574000000000000000000000000000000000000000000000000000000000000000000000000000000000047010000100500000110000103100000011000001e1200001d020000011000050110000403100101011000033d12000003100001011000023d1200002b120000211200001d020000`; -} - -/** - * Get the bounty check ensure task bytecode for clear2 withdraw - * @param botAddress - Bot wallet address - * @param inputToken - Input token address - * @param outputToken - Output token address - * @param orgInputBalance - Input token original balance - * @param orgOutputBalance - Output token original balance - * @param inputToEthPrice - Input token to Eth price - * @param outputToEthPrice - Output token to Eth price - * @param minimumExcepted - Minimum expected amount - */ -export function getWithdrawEnsureBytecode( - botAddress: string, - inputToken: string, - outputToken: string, - orgInputBalance: BigNumber, - orgOutputBalance: BigNumber, - inputToEthPrice: BigNumber, - outputToEthPrice: BigNumber, - minimumExcepted: BigNumber, - sender: string, -): string { - const bot = botAddress.substring(2).padStart(64, "0"); - const input = inputToken.substring(2).padStart(64, "0"); - const output = outputToken.substring(2).padStart(64, "0"); - const inputBalance = orgInputBalance.toHexString().substring(2).padStart(64, "0"); - const outputBalance = orgOutputBalance.toHexString().substring(2).padStart(64, "0"); - const inputPrice = inputToEthPrice.toHexString().substring(2).padStart(64, "0"); - const outputPrice = outputToEthPrice.toHexString().substring(2).padStart(64, "0"); - const minimum = minimumExcepted.toHexString().substring(2).padStart(64, "0"); - const msgSender = sender.substring(2).padStart(64, "0").toLowerCase(); - // rainlang bytecode: - // :ensure(equal-to(sender context<0 0>()) \"unknown sender\"), - // :ensure( - // greater-than-or-equal-to( - // add( - // mul(sub(erc20-balance-of(inputToken botAddress) originalInputBalance) inputToEthPrice) - // mul(sub(erc20-balance-of(outputToken botAddress) originalOutputBalance) outputToEthPrice) - // ) - // minimumSenderOutput - // ) - // \"minimumSenderOutput\" - // ); - return `0x000000000000000000000000000000000000000000000000000000000000000b${msgSender}8e756e6b6e6f776e2073656e6465720000000000000000000000000000000000${input}${bot}${inputBalance}${inputPrice}${output}${outputBalance}${outputPrice}${minimum}936d696e696d756d53656e6465724f75747075740000000000000000000000000000000000000000000000000000000000000000000000000000000000000067010000180700000110000103100000011000001e1200001d0200000110000a011000090110000801100007011000030110000611120000471200003d1200000110000501100004011000030110000211120000471200003d1200002b120000211200001d020000`; -} - /** * List of L2 chains that require SEPARATE L1 gas actions. * other L2 chains that dont require separate L1 gas actions diff --git a/src/index.ts b/src/index.ts index 316ee911..08b493fa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,7 @@ import axios from "axios"; import { ethers } from "ethers"; import { ChainId } from "sushi"; import { versions } from "process"; -import { PublicClient } from "viem"; +import { parseAbi, PublicClient } from "viem"; import { processLps } from "./utils"; import { initAccounts } from "./account"; import { processOrders } from "./processOrders"; @@ -26,6 +26,7 @@ import { onFetchResponse, createViemClient, } from "./config"; +import { deployerAbi } from "./abis"; /** * Get the order details from a source, i.e array of subgraphs and/or a local json file @@ -196,6 +197,29 @@ export async function getConfig( options.publicRpc, ); + const interpreter = await (async () => { + try { + return await viemClient.readContract({ + address: options.dispair as `0x${string}`, + abi: parseAbi(deployerAbi), + functionName: "iInterpreter", + }); + } catch { + throw "failed to get dispair interpreter address"; + } + })(); + const store = await (async () => { + try { + return await viemClient.readContract({ + address: options.dispair as `0x${string}`, + abi: parseAbi(deployerAbi), + functionName: "iStore", + }); + } catch { + throw "failed to get dispair store address"; + } + })(); + config.rpc = rpcUrls; config.arbAddress = arbAddress; config.genericArbAddress = options.genericArbAddress; @@ -219,6 +243,11 @@ export async function getConfig( config.txGas = options.txGas; config.quoteGas = options.quoteGas; config.rpOnly = options.rpOnly; + config.dispair = { + interpreter, + store, + deployer: options.dispair, + }; // init accounts const { mainAccount, accounts } = await initAccounts(walletKey, config, options, tracer, ctx); diff --git a/src/modes/interOrderbook.ts b/src/modes/interOrderbook.ts index 6f3d413d..93a48c1f 100644 --- a/src/modes/interOrderbook.ts +++ b/src/modes/interOrderbook.ts @@ -1,9 +1,9 @@ import { orderbookAbi } from "../abis"; import { estimateGasCost } from "../gas"; import { BaseError, PublicClient } from "viem"; -import { getBountyEnsureBytecode } from "../config"; import { BigNumber, Contract, ethers } from "ethers"; import { containsNodeError, errorSnapshot } from "../error"; +import { getBountyEnsureRainlang, parseRainlang } from "../task"; import { BotConfig, BundledOrders, ViemClient, DryrunResult, SpanAttrs } from "../types"; import { ONE18, @@ -88,16 +88,20 @@ export async function dryrun({ const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, + interpreter: config.dispair.interpreter, + store: config.dispair.store, bytecode: config.gasCoveragePercentage === "0" ? "0x" - : getBountyEnsureBytecode( - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - ethers.constants.Zero, - signer.account.address, + : await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + ethers.constants.Zero, + signer.account.address, + ), + config.viemClient, + config.dispair, ), }, signedContext: [], @@ -149,11 +153,15 @@ export async function dryrun({ // sender output which is already called above if (config.gasCoveragePercentage !== "0") { const headroom = (Number(config.gasCoveragePercentage) * 1.03).toFixed(); - task.evaluable.bytecode = getBountyEnsureBytecode( - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - gasCost.mul(headroom).div("100"), - signer.account.address, + task.evaluable.bytecode = await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + gasCost.mul(headroom).div("100"), + signer.account.address, + ), + config.viemClient, + config.dispair, ); rawtx.data = arb.interface.encodeFunctionData("arb3", [ orderPairObject.orderbook, @@ -169,11 +177,15 @@ export async function dryrun({ .div(100); rawtx.gas = gasLimit.toBigInt(); gasCost = gasLimit.mul(gasPrice).add(estimation.l1Cost); - task.evaluable.bytecode = getBountyEnsureBytecode( - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - gasCost.mul(config.gasCoveragePercentage).div("100"), - signer.account.address, + task.evaluable.bytecode = await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + gasCost.mul(config.gasCoveragePercentage).div("100"), + signer.account.address, + ), + config.viemClient, + config.dispair, ); rawtx.data = arb.interface.encodeFunctionData("arb3", [ orderPairObject.orderbook, diff --git a/src/modes/intraOrderbook.ts b/src/modes/intraOrderbook.ts index 0a077ff3..ac7c8853 100644 --- a/src/modes/intraOrderbook.ts +++ b/src/modes/intraOrderbook.ts @@ -1,9 +1,9 @@ import { orderbookAbi } from "../abis"; import { estimateGasCost } from "../gas"; import { BigNumber, ethers } from "ethers"; -import { getWithdrawEnsureBytecode } from "../config"; import { BaseError, erc20Abi, PublicClient } from "viem"; import { containsNodeError, errorSnapshot } from "../error"; +import { getWithdrawEnsureRainlang, parseRainlang } from "../task"; import { estimateProfit, scale18, withBigintSerializer, extendSpanAttributes } from "../utils"; import { SpanAttrs, @@ -54,18 +54,22 @@ export async function dryrun({ const obInterface = new ethers.utils.Interface(orderbookAbi); const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getWithdrawEnsureBytecode( - signer.account.address, - orderPairObject.buyToken, - orderPairObject.sellToken, - inputBalance, - outputBalance, - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - ethers.constants.Zero, - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getWithdrawEnsureRainlang( + signer.account.address, + orderPairObject.buyToken, + orderPairObject.sellToken, + inputBalance, + outputBalance, + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + ethers.constants.Zero, + signer.account.address, + ), + config.viemClient, + config.dispair, ), }, signedContext: [], @@ -142,16 +146,20 @@ export async function dryrun({ // sender output which is already called above if (config.gasCoveragePercentage !== "0") { const headroom = (Number(config.gasCoveragePercentage) * 1.03).toFixed(); - task.evaluable.bytecode = getWithdrawEnsureBytecode( - signer.account.address, - orderPairObject.buyToken, - orderPairObject.sellToken, - inputBalance, - outputBalance, - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - gasCost.mul(headroom).div("100"), - signer.account.address, + task.evaluable.bytecode = await parseRainlang( + await getWithdrawEnsureRainlang( + signer.account.address, + orderPairObject.buyToken, + orderPairObject.sellToken, + inputBalance, + outputBalance, + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + gasCost.mul(headroom).div("100"), + signer.account.address, + ), + config.viemClient, + config.dispair, ); withdrawOutputCalldata = obInterface.encodeFunctionData("withdraw2", [ orderPairObject.sellToken, @@ -171,16 +179,20 @@ export async function dryrun({ .div(100); rawtx.gas = gasLimit.toBigInt(); gasCost = gasLimit.mul(gasPrice).add(estimation.l1Cost); - task.evaluable.bytecode = getWithdrawEnsureBytecode( - signer.account.address, - orderPairObject.buyToken, - orderPairObject.sellToken, - inputBalance, - outputBalance, - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - gasCost.mul(config.gasCoveragePercentage).div("100"), - signer.account.address, + task.evaluable.bytecode = await parseRainlang( + await getWithdrawEnsureRainlang( + signer.account.address, + orderPairObject.buyToken, + orderPairObject.sellToken, + inputBalance, + outputBalance, + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + gasCost.mul(config.gasCoveragePercentage).div("100"), + signer.account.address, + ), + config.viemClient, + config.dispair, ); withdrawOutputCalldata = obInterface.encodeFunctionData("withdraw2", [ orderPairObject.sellToken, diff --git a/src/modes/routeProcessor.ts b/src/modes/routeProcessor.ts index d0aa2a18..37c05fc8 100644 --- a/src/modes/routeProcessor.ts +++ b/src/modes/routeProcessor.ts @@ -1,10 +1,10 @@ import { Token } from "sushi/currency"; import { estimateGasCost } from "../gas"; import { BaseError, PublicClient } from "viem"; -import { getBountyEnsureBytecode } from "../config"; import { ChainId, DataFetcher, Router } from "sushi"; import { BigNumber, Contract, ethers } from "ethers"; import { containsNodeError, errorSnapshot } from "../error"; +import { getBountyEnsureRainlang, parseRainlang } from "../task"; import { SpanAttrs, BotConfig, ViemClient, DryrunResult, BundledOrders } from "../types"; import { ONE18, @@ -150,16 +150,20 @@ export async function dryrun({ const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, + interpreter: config.dispair.interpreter, + store: config.dispair.store, bytecode: config.gasCoveragePercentage === "0" ? "0x" - : getBountyEnsureBytecode( - ethers.utils.parseUnits(ethPrice), - ethers.constants.Zero, - ethers.constants.Zero, - signer.account.address, + : await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(ethPrice), + ethers.constants.Zero, + ethers.constants.Zero, + signer.account.address, + ), + config.viemClient, + config.dispair, ), }, signedContext: [], @@ -215,11 +219,15 @@ export async function dryrun({ // sender output which is already called above if (config.gasCoveragePercentage !== "0") { const headroom = (Number(config.gasCoveragePercentage) * 1.03).toFixed(); - task.evaluable.bytecode = getBountyEnsureBytecode( - ethers.utils.parseUnits(ethPrice), - ethers.constants.Zero, - gasCost.mul(headroom).div("100"), - signer.account.address, + task.evaluable.bytecode = await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(ethPrice), + ethers.constants.Zero, + gasCost.mul(headroom).div("100"), + signer.account.address, + ), + config.viemClient, + config.dispair, ); rawtx.data = arb.interface.encodeFunctionData("arb3", [ orderPairObject.orderbook, @@ -235,11 +243,15 @@ export async function dryrun({ .div(100); rawtx.gas = gasLimit.toBigInt(); gasCost = gasLimit.mul(gasPrice).add(estimation.l1Cost); - task.evaluable.bytecode = getBountyEnsureBytecode( - ethers.utils.parseUnits(ethPrice), - ethers.constants.Zero, - gasCost.mul(config.gasCoveragePercentage).div("100"), - signer.account.address, + task.evaluable.bytecode = await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(ethPrice), + ethers.constants.Zero, + gasCost.mul(config.gasCoveragePercentage).div("100"), + signer.account.address, + ), + config.viemClient, + config.dispair, ); rawtx.data = arb.interface.encodeFunctionData("arb3", [ orderPairObject.orderbook, diff --git a/src/task.ts b/src/task.ts new file mode 100644 index 00000000..ccc0f7aa --- /dev/null +++ b/src/task.ts @@ -0,0 +1,97 @@ +import fs from "fs"; +import { deployerAbi } from "./abis"; +import { BigNumber, utils } from "ethers"; +import { Dispair, ViemClient } from "./types"; +import { parseAbi, PublicClient, stringToHex } from "viem"; +import { MetaStore, RainDocument } from "@rainlanguage/dotrain"; + +export const TaskEntryPoint = ["main"] as const; +export const EnsureBountyDotrain = fs.readFileSync("./tasks/ensure-bounty.rain", { + encoding: "utf8", +}); +export const WithdrawEnsureBountyDotrain = fs.readFileSync("./tasks/withdraw-ensure-bounty.rain", { + encoding: "utf8", +}); + +/** + * Get the bounty check ensure task rainlang + * @param inputToEthPrice - Input token to Eth price + * @param outputToEthPrice - Output token to Eth price + * @param minimumExpected - Minimum expected amount + * @param sender - The msg sender + */ +export async function getBountyEnsureRainlang( + inputToEthPrice: BigNumber, + outputToEthPrice: BigNumber, + minimumExpected: BigNumber, + sender: string, +): Promise { + return await RainDocument.composeText( + EnsureBountyDotrain, + TaskEntryPoint as any as string[], + new MetaStore(), + [ + ["sender", sender], + ["input-to-eth-price", utils.formatUnits(inputToEthPrice)], + ["output-to-eth-price", utils.formatUnits(outputToEthPrice)], + ["minimum-expected", utils.formatUnits(minimumExpected)], + ], + ); +} + +/** + * Get the bounty check ensure task rainlang for clear2 withdraw + * @param botAddress - Bot wallet address + * @param inputToken - Input token address + * @param outputToken - Output token address + * @param orgInputBalance - Input token original balance + * @param orgOutputBalance - Output token original balance + * @param inputToEthPrice - Input token to Eth price + * @param outputToEthPrice - Output token to Eth price + * @param minimumExpected - Minimum expected amount + * @param sender - The msg sender + */ +export async function getWithdrawEnsureRainlang( + botAddress: string, + inputToken: string, + outputToken: string, + orgInputBalance: BigNumber, + orgOutputBalance: BigNumber, + inputToEthPrice: BigNumber, + outputToEthPrice: BigNumber, + minimumExpected: BigNumber, + sender: string, +): Promise { + return await RainDocument.composeText( + WithdrawEnsureBountyDotrain, + TaskEntryPoint as any as string[], + new MetaStore(), + [ + ["sender", sender], + ["bot-address", botAddress], + ["input-token", inputToken], + ["output-token", outputToken], + ["minimum-expected", utils.formatUnits(minimumExpected)], + ["input-to-eth-price", utils.formatUnits(inputToEthPrice)], + ["output-to-eth-price", utils.formatUnits(outputToEthPrice)], + ["org-input-balance", utils.formatUnits(orgInputBalance)], + ["org-output-balance", utils.formatUnits(orgOutputBalance)], + ], + ); +} + +/** + * Calls parse2 on a given deployer to parse the given rainlang text + */ +export async function parseRainlang( + rainlang: string, + viemClient: ViemClient | PublicClient, + dispair: Dispair, +): Promise { + return await viemClient.readContract({ + address: dispair.deployer as `0x${string}`, + abi: parseAbi(deployerAbi), + functionName: "parse2", + args: [stringToHex(rainlang)], + }); +} diff --git a/src/types.ts b/src/types.ts index 594114c3..2f3ed8da 100644 --- a/src/types.ts +++ b/src/types.ts @@ -53,6 +53,7 @@ export type CliOptions = { txGas?: string; quoteGas: bigint; rpOnly?: boolean; + dispair: string; }; export type TokenDetails = { @@ -201,6 +202,7 @@ export type BotConfig = { txGas?: string; quoteGas: bigint; rpOnly?: boolean; + dispair: Dispair; onFetchRequest?: (request: Request) => void; onFetchResponse?: (request: Response) => void; }; @@ -297,6 +299,12 @@ export type RpcRecord = { cache: Record; }; +export type Dispair = { + deployer: string; + interpreter: string; + store: string; +}; + export type RpcRequest = { jsonrpc: `${number}`; method: string; diff --git a/tasks/ensure-bounty.rain b/tasks/ensure-bounty.rain new file mode 100644 index 00000000..85d34540 --- /dev/null +++ b/tasks/ensure-bounty.rain @@ -0,0 +1,19 @@ +--- +#sender ! msg sender +#input-to-eth-price ! input token to eth price +#output-to-eth-price ! output token to eth price +#minimum-expected ! minimum expected bounty + +#main +:ensure(equal-to(sender context<0 0>()) "unknown sender"), +total-bounty-eth: add( + mul(input-to-eth-price context<1 0>()) + mul(output-to-eth-price context<1 1>()) +), +:ensure( + greater-than-or-equal-to( + total-bounty-eth + minimum-expected + ) + "minimum sender output" +); diff --git a/tasks/withdraw-ensure-bounty.rain b/tasks/withdraw-ensure-bounty.rain new file mode 100644 index 00000000..808dcbd7 --- /dev/null +++ b/tasks/withdraw-ensure-bounty.rain @@ -0,0 +1,32 @@ +--- +#sender ! msg sender +#bot-address ! bot wallet adddress as bounty vault owner +#input-token ! input token address +#output-token ! input token address +#input-to-eth-price ! input token to eth price +#output-to-eth-price ! output token to eth price +#org-input-balance ! original balance of the bot input token before clear +#org-output-balance ! original balance of the bot output token before clear +#minimum-expected ! minimum expected bounty + +#main +:ensure(equal-to(sender context<0 0>()) "unknown sender"), +input-bounty: sub( + erc20-balance-of(input-token bot-address) + org-input-balance +), +output-bounty: sub( + erc20-balance-of(output-token bot-address) + org-output-balance +), +total-bounty-eth: add( + mul(input-bounty input-to-eth-price) + mul(output-bounty output-to-eth-price) +), +:ensure( + greater-than-or-equal-to( + total-bounty-eth + minimum-expected + ) + "minimum sender output" +); diff --git a/test/abis/RainterpreterExpressionDeployerNPE2.json b/test/abis/RainterpreterExpressionDeployerNPE2.json new file mode 100644 index 00000000..098f0af1 --- /dev/null +++ b/test/abis/RainterpreterExpressionDeployerNPE2.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"config","type":"tuple","internalType":"struct RainterpreterExpressionDeployerNPE2ConstructionConfigV2","components":[{"name":"interpreter","type":"address","internalType":"address"},{"name":"store","type":"address","internalType":"address"},{"name":"parser","type":"address","internalType":"address"}]}],"stateMutability":"nonpayable"},{"type":"function","name":"buildIntegrityFunctionPointers","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"describedByMetaV1","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"pure"},{"type":"function","name":"iInterpreter","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IInterpreterV3"}],"stateMutability":"view"},{"type":"function","name":"iParser","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IParserV1View"}],"stateMutability":"view"},{"type":"function","name":"iStore","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IInterpreterStoreV2"}],"stateMutability":"view"},{"type":"function","name":"parse2","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"parsePragma1","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"tuple","internalType":"struct PragmaV1","components":[{"name":"usingWordsFrom","type":"address[]","internalType":"address[]"}]}],"stateMutability":"view"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"error","name":"BadDynamicLength","inputs":[{"name":"dynamicLength","type":"uint256","internalType":"uint256"},{"name":"standardOpsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"BadOpInputsLength","inputs":[{"name":"opIndex","type":"uint256","internalType":"uint256"},{"name":"calculatedInputs","type":"uint256","internalType":"uint256"},{"name":"bytecodeInputs","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"BadOpOutputsLength","inputs":[{"name":"opIndex","type":"uint256","internalType":"uint256"},{"name":"calculatedOutputs","type":"uint256","internalType":"uint256"},{"name":"bytecodeOutputs","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"CallOutputsExceedSource","inputs":[{"name":"sourceOutputs","type":"uint256","internalType":"uint256"},{"name":"outputs","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"NotAnExternContract","inputs":[{"name":"extern","type":"address","internalType":"address"}]},{"type":"error","name":"OutOfBoundsConstantRead","inputs":[{"name":"opIndex","type":"uint256","internalType":"uint256"},{"name":"constantsLength","type":"uint256","internalType":"uint256"},{"name":"constantRead","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"OutOfBoundsStackRead","inputs":[{"name":"opIndex","type":"uint256","internalType":"uint256"},{"name":"stackTopIndex","type":"uint256","internalType":"uint256"},{"name":"stackRead","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SourceIndexOutOfBounds","inputs":[{"name":"sourceIndex","type":"uint256","internalType":"uint256"},{"name":"bytecode","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"StackAllocationMismatch","inputs":[{"name":"stackMaxIndex","type":"uint256","internalType":"uint256"},{"name":"bytecodeAllocation","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"StackOutputsMismatch","inputs":[{"name":"stackIndex","type":"uint256","internalType":"uint256"},{"name":"bytecodeOutputs","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"StackSizingsNotMonotonic","inputs":[{"name":"bytecode","type":"bytes","internalType":"bytes"},{"name":"relativeOffset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"StackUnderflow","inputs":[{"name":"opIndex","type":"uint256","internalType":"uint256"},{"name":"stackIndex","type":"uint256","internalType":"uint256"},{"name":"calculatedInputs","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"StackUnderflowHighwater","inputs":[{"name":"opIndex","type":"uint256","internalType":"uint256"},{"name":"stackIndex","type":"uint256","internalType":"uint256"},{"name":"stackHighwater","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TruncatedBitwiseEncoding","inputs":[{"name":"startBit","type":"uint256","internalType":"uint256"},{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TruncatedHeader","inputs":[{"name":"bytecode","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"TruncatedHeaderOffsets","inputs":[{"name":"bytecode","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"TruncatedSource","inputs":[{"name":"bytecode","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"UnexpectedInterpreterBytecodeHash","inputs":[{"name":"expectedBytecodeHash","type":"bytes32","internalType":"bytes32"},{"name":"actualBytecodeHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"UnexpectedParserBytecodeHash","inputs":[{"name":"expectedBytecodeHash","type":"bytes32","internalType":"bytes32"},{"name":"actualBytecodeHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"UnexpectedSources","inputs":[{"name":"bytecode","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"UnexpectedStoreBytecodeHash","inputs":[{"name":"expectedBytecodeHash","type":"bytes32","internalType":"bytes32"},{"name":"actualBytecodeHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"UnexpectedTrailingOffsetBytes","inputs":[{"name":"bytecode","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"UnsupportedBitwiseShiftAmount","inputs":[{"name":"shiftAmount","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ZeroLengthBitwiseEncoding","inputs":[]}],"bytecode":{"object":"0x60e060405234801561001057600080fd5b50604051611f77380380611f7783398101604081905261002f9161017a565b8051602082015160408301516001600160a01b0380841660805280831660a052811660c052823f600080516020611f3783398151915281146100a057604051630fc2051760e11b8152600080516020611f378339815191526004820152602481018290526044015b60405180910390fd5b823f7f2a4559222e2f3600b2d393715de8af57620439684463f745059c653bbfe3727f811461010b576040516348616a9b60e01b81527f2a4559222e2f3600b2d393715de8af57620439684463f745059c653bbfe3727f600482015260248101829052604401610097565b823f600080516020611f57833981519152811461015257604051630941d86960e21b8152600080516020611f57833981519152600482015260248101829052604401610097565b505050505050506101f3565b80516001600160a01b038116811461017557600080fd5b919050565b60006060828403121561018c57600080fd5b604051606081016001600160401b03811182821017156101bc57634e487b7160e01b600052604160045260246000fd5b6040526101c88361015e565b81526101d66020840161015e565b60208201526101e76040840161015e565b60408201529392505050565b60805160a05160c051611d0861022f6000396000818160ba0152818161032b01526103e80152600061017c015260006101a30152611d086000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a3869e141161005b578063a3869e141461014f578063b92d75531461016f578063c19423bc14610177578063f0cfdd371461019e57600080fd5b806301ffc9a71461008d57806324376855146100b55780635514ca20146101015780636f5aa28d14610121575b600080fd5b6100a061009b366004611618565b6101c5565b60405190151581526020015b60405180910390f35b6100dc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ac565b61011461010f36600461165a565b6102f6565b6040516100ac91906116cc565b6040517fa06272c146368c8267529773d74e499d3d70b552938f29071e5cb2faf9e3c41981526020016100ac565b61016261015d36600461181f565b6103e1565b6040516100ac919061190d565b61016261050f565b6100dc7f000000000000000000000000000000000000000000000000000000000000000081565b6100dc7f000000000000000000000000000000000000000000000000000000000000000081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f6f5aa28d00000000000000000000000000000000000000000000000000000000148061025857507fffffffff0000000000000000000000000000000000000000000000000000000082167fa3869e1400000000000000000000000000000000000000000000000000000000145b806102a457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b806102f057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080516020810182526060815290517f5514ca200000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690635514ca20906103779086908690600401611920565b600060405180830381865afa158015610394573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103da9190810190611991565b9392505050565b60606000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fab4087a856040518263ffffffff1660e01b815260040161043f919061190d565b600060405180830381865afa15801561045c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526104a29190810190611a79565b9150915060006104bc838351905160406020909202010190565b604080516020838201810190925282815291925081016104dd81868661051e565b60006105026040518060c0016040528060968152602001611c72609691398787610561565b5091979650505050505050565b60606105196108c8565b905090565b80600182510160200281015b8082101561054557815185526020948501949091019061052a565b505061055c6105518390565b848451602001610bb5565b505050565b6060600061056e84610c1b565b90506020850161057d85610c39565b8160020267ffffffffffffffff81111561059957610599611732565b6040519080825280601f01601f1916602001820160405280156105c3576020820181803683370190505b5092506020830160005b838110156108bd576000806105e28984610e58565b9150915081845380600185015360028401935060006106028a848b610e7d565b9050600060186106128c87610ee9565b03905060006106218c87610f1a565b600402820190505b808210156108075781516002601c82901a0289015162ffffff821691601d1a600f81169160049190911c9060f01c600080610662898785565b915091508482146106bb5760808901516040517fddf56071000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018690526064015b60405180910390fd5b83811461070b5760808901516040517ffc8b5603000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604481018590526064016106b2565b885182111561075d57608089015189516040517f2cab6bff00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018390526064016106b2565b8851829003808a5260408a015111156107bf57608089015189516040808c015190517f1bc5ab0f0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016106b2565b88518101808a5260208a015110156107d957885160208a01525b60018111156107ea57885160408a01525b505050608086018051600101905250505060049190910190610629565b6108118c87610f33565b83602001511461086557826020015161082a8d88610f33565b6040517f4d9c18dc000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106b2565b825184146108ac5782516040517f4689f0b30000000000000000000000000000000000000000000000000000000081526004810191909152602481018590526044016106b2565b5050600190930192506105cd915050565b505050509392505050565b606061160e6000604b905080915060006040518061098001604052808467ffffffffffffffff1667ffffffffffffffff168152602001610f4c8152602001610fca815260200161102f81526020016111a981526020016111b381526020016111b381526020016111bd81526020016111c681526020016111e18152602001611287815260200161128781526020016112e3815260200161135d815260200161136a81526020016111b381526020016111bd815260200161136a81526020016111b381526020016111bd81526020016111b381526020016111b381526020016111bd81526020016111a981526020016111a981526020016111a981526020016111a981526020016111a98152602001611374815260200161139981526020016113b381526020016111b3815260200161137481526020016111b381526020016111b3815260200161136a81526020016111bd81526020016111b381526020016111b3815260200161136a815260200161136a81526020016113bd81526020016113bd81526020016113bd81526020016113bd81526020016111b381526020016111bd81526020016113bd81526020016111a981526020016111bd81526020016111bd81526020016111bd81526020016111bd81526020016111b381526020016111bd81526020016111bd81526020016111bd81526020016111bd81526020016111bd81526020016113bd81526020016113bd81526020016113bd81526020016113bd81526020016111b381526020016111bd81526020016111bd81526020016111b381526020016111bd81526020016111bd81526020016111b381526020016111b381526020016111bd81526020016113bd81526020016113bd81526020016111bd81526020016113b381525090506060819050604b815114610ba35780516040517fc8b569010000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016106b2565b610bac816113d7565b94505050505090565b6020810680820384015b80851015610bda578451845260209485019490930192610bbf565b508015610c15577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600882021c808451168119865116178452505b50505050565b60008151600003610c2e57506000919050565b506020015160001a90565b6000610c4482610c1b565b90508015610e165781516001600283020190811115610c9157826040517f17f4bc5e0000000000000000000000000000000000000000000000000000000081526004016106b2919061190d565b82516020828501810191850101602160027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860102860181019086015b808210610dd257815160f01c8481016004810185811115610d1c57896040517e39ba560000000000000000000000000000000000000000000000000000000081526004016106b2919061190d565b8151600081901a90600181901a90600281901a9060031a80821180610d4057508281115b15610d7b578d876040517feaf45f4f0000000000000000000000000000000000000000000000000000000081526004016106b2929190611b72565b505050600481028201878114610dbf578b6040517ffbb8027a0000000000000000000000000000000000000000000000000000000081526004016106b2919061190d565b8397506002870396505050505050610cce565b838314610e0d57866040517fde67b29a0000000000000000000000000000000000000000000000000000000081526004016106b2919061190d565b50505050505050565b600182511115610e5457816040517fd013da5d0000000000000000000000000000000000000000000000000000000081526004016106b2919061190d565b5050565b6000806000610e678585610ee9565b51600281901a9660039190911a95509350505050565b610eb66040518060c001604052806000815260200160008152602001600081526020016060815260200160008152602001606081525090565b506040805160c081018252838152602081018490529081019290925260608201526000608082015260a081019190915290565b600080610ef584610c1b565b60020260010190506000610f098585611468565b949091019093016020019392505050565b600080610f278484610ee9565b5160001a949350505050565b600080610f408484610ee9565b5160011a949350505050565b8151600090819061ffff8416908110610fa857608085015185516040517feaa16f3300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016106b2565b8460400151811115610fbc57604085018190525b506000946001945092505050565b60008060008361ffff1690508460600151518110610fbc5760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016106b2565b60008060008361ffff16905060008560600151828151811061105357611053611b94565b6020026020010151905060008061106d839060a082901c90565b9150915061109b827f08b5f05c000000000000000000000000000000000000000000000000000000006114bf565b6110e9576040517f23016c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016106b2565b6040517fbeef26df00000000000000000000000000000000000000000000000000000000815260048101829052600f601089901c81166024830181905260148a901c90911660448301819052909173ffffffffffffffffffffffffffffffffffffffff85169063beef26df906064016040805180830381865afa158015611174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111989190611bc3565b975097505050505050509250929050565b5060009160019150565b5060029160019150565b50600191829150565b6000806111d384846111e1565b506001958695509350505050565b60008060ff80841690600885901c16808303611229576040517f46f0ca6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101006112368284611be7565b1115611278576040517f8abcdd3f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106b2565b50600295600195509350505050565b60008061ffff831660ff81118061129c575080155b156112d6576040517fc1be16a1000000000000000000000000000000000000000000000000000000008152600481018290526024016106b2565b5060019485945092505050565b60008060008361ffff1690506000601485901c90506000806113098860a0015185610e58565b9150915082811015611351576040517fff13710800000000000000000000000000000000000000000000000000000000815260048101829052602481018490526044016106b2565b50969095509350505050565b60101c600f169160019150565b5060039160019150565b600080600f601084901c168061138b57600161138d565b805b95600195509350505050565b600080600f601084901c166002811161138b57600261138d565b5060029160009150565b600080600f601084901c166001811161138b57600261138d565b60606000825160020267ffffffffffffffff8111156113f8576113f8611732565b6040519080825280601f01601f191660200182016040528015611422576020820181803683370190505b50905061ffff80196020850160208651028101600285015b8183101561145c5780518351861690851617815260209092019160020161143a565b50939695505050505050565b600061147383610c1b565b82106114af5781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016106b2929190611c21565b50600202016003015161ffff1690565b60006114ca836114db565b80156103da57506103da838361153f565b6000611507827f01ffc9a70000000000000000000000000000000000000000000000000000000061153f565b80156102f05750611538827fffffffff0000000000000000000000000000000000000000000000000000000061153f565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156115f7575060208210155b80156116035750600081115b979650505050505050565b611616611c42565b565b60006020828403121561162a57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103da57600080fd5b6000806020838503121561166d57600080fd5b823567ffffffffffffffff8082111561168557600080fd5b818501915085601f83011261169957600080fd5b8135818111156116a857600080fd5b8660208285010111156116ba57600080fd5b60209290920196919550909350505050565b6020808252825182820182905280516040840181905260009291820190839060608601905b8083101561172757835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906116f1565b509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516020810167ffffffffffffffff8111828210171561178457611784611732565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117d1576117d1611732565b604052919050565b600067ffffffffffffffff8211156117f3576117f3611732565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561183157600080fd5b813567ffffffffffffffff81111561184857600080fd5b8201601f8101841361185957600080fd5b803561186c611867826117d9565b61178a565b81815285602083850101111561188157600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b838110156118ba5781810151838201526020016118a2565b50506000910152565b600081518084526118db81602086016020860161189f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006103da60208301846118c3565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b600067ffffffffffffffff82111561198757611987611732565b5060051b60200190565b600060208083850312156119a457600080fd5b825167ffffffffffffffff808211156119bc57600080fd5b81850191508282870312156119d057600080fd5b6119d8611761565b8251828111156119e757600080fd5b80840193505086601f8401126119fc57600080fd5b82519150611a0c6118678361196d565b82815260059290921b83018401918481019088841115611a2b57600080fd5b938501935b83851015611a6c57845173ffffffffffffffffffffffffffffffffffffffff81168114611a5d5760008081fd5b82529385019390850190611a30565b8252509695505050505050565b60008060408385031215611a8c57600080fd5b825167ffffffffffffffff80821115611aa457600080fd5b818501915085601f830112611ab857600080fd5b81516020611ac8611867836117d9565b8281528882848701011115611adc57600080fd5b611aeb8383830184880161189f565b87820151909650935082841115611b0157600080fd5b838701935087601f850112611b1557600080fd5b83519250611b256118678461196d565b83815260059390931b8401810192818101925088841115611b4557600080fd5b938101935b83851015611b6357845183529381019391810191611b4a565b80955050505050509250929050565b604081526000611b8560408301856118c3565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008060408385031215611bd657600080fd5b505080516020909101519092909150565b808201808211156102f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b828152604060208201526000611c3a60408301846118c3565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe0f4c0fca102f11a911b311b311bd11c611e11287128712e3135d136a11b311bd136a11b311bd11b311b311bd11a911a911a911a911a91374139913b311b3137411b311b3136a11bd11b311b3136a136a13bd13bd13bd13bd11b311bd13bd11a911bd11bd11bd11bd11b311bd11bd11bd11bd11bd13bd13bd13bd13bd11b311bd11bd11b311bd11bd11b311b311bd13bd13bd11bd13b3fee767105c6c61d954e857509e83c39f1352e9ad804e9e9eb297493462c784ce0913de8e0b36ea4fde9df417b198d01eba3e5cb78da1c5c6bbc50bea09444023","sourceMap":"2459:5477:130:-:0;;;3036:1459;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3204:18;;3281:12;;;;3341:13;;;;-1:-1:-1;;;;;3366:26:130;;;;;3402:14;;;;;3426:16;;;;3607:24;;-1:-1:-1;;;;;;;;;;;3654:15:130;:52;3650:175;;3729:85;;-1:-1:-1;;;3729:85:130;;-1:-1:-1;;;;;;;;;;;3729:85:130;;;1153:25:409;1194:18;;;1187:34;;;1126:18;;3729:85:130;;;;;;;;3650:175;3971:18;;482:66:146;4012:9:130;:40;4008:145;;4075:67;;-1:-1:-1;;;4075:67:130;;482:66:146;4075:67:130;;;1153:25:409;1194:18;;;1187:34;;;1126:18;;4075:67:130;979:248:409;4008:145:130;4301:19;;-1:-1:-1;;;;;;;;;;;4343:10:130;:42;4339:150;;4408:70;;-1:-1:-1;;;4408:70:130;;-1:-1:-1;;;;;;;;;;;4408:70:130;;;1153:25:409;1194:18;;;1187:34;;;1126:18;;4408:70:130;979:248:409;4339:150:130;3119:1376;;;;;;3036:1459;2459:5477;;14:177:409;93:13;;-1:-1:-1;;;;;135:31:409;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:778::-;340:6;393:2;381:9;372:7;368:23;364:32;361:52;;;409:1;406;399:12;361:52;442:2;436:9;484:2;472:15;;-1:-1:-1;;;;;502:34:409;;538:22;;;499:62;496:185;;;603:10;598:3;594:20;591:1;584:31;638:4;635:1;628:15;666:4;663:1;656:15;496:185;697:2;690:22;736:40;766:9;736:40;:::i;:::-;728:6;721:56;810:49;855:2;844:9;840:18;810:49;:::i;:::-;805:2;797:6;793:15;786:74;893:49;938:2;927:9;923:18;893:49;:::i;:::-;888:2;876:15;;869:74;880:6;196:778;-1:-1:-1;;;196:778:409:o;979:248::-;2459:5477:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a3869e141161005b578063a3869e141461014f578063b92d75531461016f578063c19423bc14610177578063f0cfdd371461019e57600080fd5b806301ffc9a71461008d57806324376855146100b55780635514ca20146101015780636f5aa28d14610121575b600080fd5b6100a061009b366004611618565b6101c5565b60405190151581526020015b60405180910390f35b6100dc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ac565b61011461010f36600461165a565b6102f6565b6040516100ac91906116cc565b6040517fa06272c146368c8267529773d74e499d3d70b552938f29071e5cb2faf9e3c41981526020016100ac565b61016261015d36600461181f565b6103e1565b6040516100ac919061190d565b61016261050f565b6100dc7f000000000000000000000000000000000000000000000000000000000000000081565b6100dc7f000000000000000000000000000000000000000000000000000000000000000081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f6f5aa28d00000000000000000000000000000000000000000000000000000000148061025857507fffffffff0000000000000000000000000000000000000000000000000000000082167fa3869e1400000000000000000000000000000000000000000000000000000000145b806102a457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b806102f057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080516020810182526060815290517f5514ca200000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690635514ca20906103779086908690600401611920565b600060405180830381865afa158015610394573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103da9190810190611991565b9392505050565b60606000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fab4087a856040518263ffffffff1660e01b815260040161043f919061190d565b600060405180830381865afa15801561045c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526104a29190810190611a79565b9150915060006104bc838351905160406020909202010190565b604080516020838201810190925282815291925081016104dd81868661051e565b60006105026040518060c0016040528060968152602001611c72609691398787610561565b5091979650505050505050565b60606105196108c8565b905090565b80600182510160200281015b8082101561054557815185526020948501949091019061052a565b505061055c6105518390565b848451602001610bb5565b505050565b6060600061056e84610c1b565b90506020850161057d85610c39565b8160020267ffffffffffffffff81111561059957610599611732565b6040519080825280601f01601f1916602001820160405280156105c3576020820181803683370190505b5092506020830160005b838110156108bd576000806105e28984610e58565b9150915081845380600185015360028401935060006106028a848b610e7d565b9050600060186106128c87610ee9565b03905060006106218c87610f1a565b600402820190505b808210156108075781516002601c82901a0289015162ffffff821691601d1a600f81169160049190911c9060f01c600080610662898785565b915091508482146106bb5760808901516040517fddf56071000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018690526064015b60405180910390fd5b83811461070b5760808901516040517ffc8b5603000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604481018590526064016106b2565b885182111561075d57608089015189516040517f2cab6bff00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018390526064016106b2565b8851829003808a5260408a015111156107bf57608089015189516040808c015190517f1bc5ab0f0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016106b2565b88518101808a5260208a015110156107d957885160208a01525b60018111156107ea57885160408a01525b505050608086018051600101905250505060049190910190610629565b6108118c87610f33565b83602001511461086557826020015161082a8d88610f33565b6040517f4d9c18dc000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106b2565b825184146108ac5782516040517f4689f0b30000000000000000000000000000000000000000000000000000000081526004810191909152602481018590526044016106b2565b5050600190930192506105cd915050565b505050509392505050565b606061160e6000604b905080915060006040518061098001604052808467ffffffffffffffff1667ffffffffffffffff168152602001610f4c8152602001610fca815260200161102f81526020016111a981526020016111b381526020016111b381526020016111bd81526020016111c681526020016111e18152602001611287815260200161128781526020016112e3815260200161135d815260200161136a81526020016111b381526020016111bd815260200161136a81526020016111b381526020016111bd81526020016111b381526020016111b381526020016111bd81526020016111a981526020016111a981526020016111a981526020016111a981526020016111a98152602001611374815260200161139981526020016113b381526020016111b3815260200161137481526020016111b381526020016111b3815260200161136a81526020016111bd81526020016111b381526020016111b3815260200161136a815260200161136a81526020016113bd81526020016113bd81526020016113bd81526020016113bd81526020016111b381526020016111bd81526020016113bd81526020016111a981526020016111bd81526020016111bd81526020016111bd81526020016111bd81526020016111b381526020016111bd81526020016111bd81526020016111bd81526020016111bd81526020016111bd81526020016113bd81526020016113bd81526020016113bd81526020016113bd81526020016111b381526020016111bd81526020016111bd81526020016111b381526020016111bd81526020016111bd81526020016111b381526020016111b381526020016111bd81526020016113bd81526020016113bd81526020016111bd81526020016113b381525090506060819050604b815114610ba35780516040517fc8b569010000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016106b2565b610bac816113d7565b94505050505090565b6020810680820384015b80851015610bda578451845260209485019490930192610bbf565b508015610c15577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600882021c808451168119865116178452505b50505050565b60008151600003610c2e57506000919050565b506020015160001a90565b6000610c4482610c1b565b90508015610e165781516001600283020190811115610c9157826040517f17f4bc5e0000000000000000000000000000000000000000000000000000000081526004016106b2919061190d565b82516020828501810191850101602160027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860102860181019086015b808210610dd257815160f01c8481016004810185811115610d1c57896040517e39ba560000000000000000000000000000000000000000000000000000000081526004016106b2919061190d565b8151600081901a90600181901a90600281901a9060031a80821180610d4057508281115b15610d7b578d876040517feaf45f4f0000000000000000000000000000000000000000000000000000000081526004016106b2929190611b72565b505050600481028201878114610dbf578b6040517ffbb8027a0000000000000000000000000000000000000000000000000000000081526004016106b2919061190d565b8397506002870396505050505050610cce565b838314610e0d57866040517fde67b29a0000000000000000000000000000000000000000000000000000000081526004016106b2919061190d565b50505050505050565b600182511115610e5457816040517fd013da5d0000000000000000000000000000000000000000000000000000000081526004016106b2919061190d565b5050565b6000806000610e678585610ee9565b51600281901a9660039190911a95509350505050565b610eb66040518060c001604052806000815260200160008152602001600081526020016060815260200160008152602001606081525090565b506040805160c081018252838152602081018490529081019290925260608201526000608082015260a081019190915290565b600080610ef584610c1b565b60020260010190506000610f098585611468565b949091019093016020019392505050565b600080610f278484610ee9565b5160001a949350505050565b600080610f408484610ee9565b5160011a949350505050565b8151600090819061ffff8416908110610fa857608085015185516040517feaa16f3300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016106b2565b8460400151811115610fbc57604085018190525b506000946001945092505050565b60008060008361ffff1690508460600151518110610fbc5760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016106b2565b60008060008361ffff16905060008560600151828151811061105357611053611b94565b6020026020010151905060008061106d839060a082901c90565b9150915061109b827f08b5f05c000000000000000000000000000000000000000000000000000000006114bf565b6110e9576040517f23016c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016106b2565b6040517fbeef26df00000000000000000000000000000000000000000000000000000000815260048101829052600f601089901c81166024830181905260148a901c90911660448301819052909173ffffffffffffffffffffffffffffffffffffffff85169063beef26df906064016040805180830381865afa158015611174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111989190611bc3565b975097505050505050509250929050565b5060009160019150565b5060029160019150565b50600191829150565b6000806111d384846111e1565b506001958695509350505050565b60008060ff80841690600885901c16808303611229576040517f46f0ca6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101006112368284611be7565b1115611278576040517f8abcdd3f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106b2565b50600295600195509350505050565b60008061ffff831660ff81118061129c575080155b156112d6576040517fc1be16a1000000000000000000000000000000000000000000000000000000008152600481018290526024016106b2565b5060019485945092505050565b60008060008361ffff1690506000601485901c90506000806113098860a0015185610e58565b9150915082811015611351576040517fff13710800000000000000000000000000000000000000000000000000000000815260048101829052602481018490526044016106b2565b50969095509350505050565b60101c600f169160019150565b5060039160019150565b600080600f601084901c168061138b57600161138d565b805b95600195509350505050565b600080600f601084901c166002811161138b57600261138d565b5060029160009150565b600080600f601084901c166001811161138b57600261138d565b60606000825160020267ffffffffffffffff8111156113f8576113f8611732565b6040519080825280601f01601f191660200182016040528015611422576020820181803683370190505b50905061ffff80196020850160208651028101600285015b8183101561145c5780518351861690851617815260209092019160020161143a565b50939695505050505050565b600061147383610c1b565b82106114af5781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016106b2929190611c21565b50600202016003015161ffff1690565b60006114ca836114db565b80156103da57506103da838361153f565b6000611507827f01ffc9a70000000000000000000000000000000000000000000000000000000061153f565b80156102f05750611538827fffffffff0000000000000000000000000000000000000000000000000000000061153f565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156115f7575060208210155b80156116035750600081115b979650505050505050565b611616611c42565b565b60006020828403121561162a57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103da57600080fd5b6000806020838503121561166d57600080fd5b823567ffffffffffffffff8082111561168557600080fd5b818501915085601f83011261169957600080fd5b8135818111156116a857600080fd5b8660208285010111156116ba57600080fd5b60209290920196919550909350505050565b6020808252825182820182905280516040840181905260009291820190839060608601905b8083101561172757835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906116f1565b509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516020810167ffffffffffffffff8111828210171561178457611784611732565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117d1576117d1611732565b604052919050565b600067ffffffffffffffff8211156117f3576117f3611732565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561183157600080fd5b813567ffffffffffffffff81111561184857600080fd5b8201601f8101841361185957600080fd5b803561186c611867826117d9565b61178a565b81815285602083850101111561188157600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b838110156118ba5781810151838201526020016118a2565b50506000910152565b600081518084526118db81602086016020860161189f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006103da60208301846118c3565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b600067ffffffffffffffff82111561198757611987611732565b5060051b60200190565b600060208083850312156119a457600080fd5b825167ffffffffffffffff808211156119bc57600080fd5b81850191508282870312156119d057600080fd5b6119d8611761565b8251828111156119e757600080fd5b80840193505086601f8401126119fc57600080fd5b82519150611a0c6118678361196d565b82815260059290921b83018401918481019088841115611a2b57600080fd5b938501935b83851015611a6c57845173ffffffffffffffffffffffffffffffffffffffff81168114611a5d5760008081fd5b82529385019390850190611a30565b8252509695505050505050565b60008060408385031215611a8c57600080fd5b825167ffffffffffffffff80821115611aa457600080fd5b818501915085601f830112611ab857600080fd5b81516020611ac8611867836117d9565b8281528882848701011115611adc57600080fd5b611aeb8383830184880161189f565b87820151909650935082841115611b0157600080fd5b838701935087601f850112611b1557600080fd5b83519250611b256118678461196d565b83815260059390931b8401810192818101925088841115611b4557600080fd5b938101935b83851015611b6357845183529381019391810191611b4a565b80955050505050509250929050565b604081526000611b8560408301856118c3565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008060408385031215611bd657600080fd5b505080516020909101519092909150565b808201808211156102f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b828152604060208201526000611c3a60408301846118c3565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe0f4c0fca102f11a911b311b311bd11c611e11287128712e3135d136a11b311bd136a11b311bd11b311b311bd11a911a911a911a911a91374139913b311b3137411b311b3136a11bd11b311b3136a136a13bd13bd13bd13bd11b311bd13bd11a911bd11bd11bd11bd11b311bd11bd11bd11bd11bd13bd13bd13bd13bd11b311bd11bd11b311bd11bd11b311b311bd13bd13bd11bd13b3","sourceMap":"2459:5477:130:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4529:316;;;;;;:::i;:::-;;:::i;:::-;;;516:14:409;;509:22;491:41;;479:2;464:18;4529:316:130;;;;;;;;2991:38;;;;;;;;742:42:409;730:55;;;712:74;;700:2;685:18;2991:38:130;543:249:409;5910:303:130;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7221:107::-;;;661:66:142;2322:25:409;;2310:2;2295:18;7221:107:130;2176:177:409;4881:850:130;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7019:158::-;;;:::i;2942:43::-;;;;;2815:44;;;;;4529:316;4614:4;4637:51;;;4652:36;4637:51;;:97;;-1:-1:-1;4692:42:130;;;4707:27;4692:42;4637:97;:161;;;-1:-1:-1;4750:48:130;;;4765:33;4750:48;4637:161;:201;;;-1:-1:-1;952:25:60;937:40;;;;4802:36:130;4630:208;4529:316;-1:-1:-1;;4529:316:130:o;5910:303::-;-1:-1:-1;;;;;;;;;;;6154:52:130;;;;;6178:7;6154:46;;;;;:52;;6201:4;;;;6154:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6147:59;5910:303;-1:-1:-1;;;5910:303:130:o;4881:850::-;4956:12;4981:21;5004:26;5034:7;:13;;;5048:4;5034:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4980:73;;;;5064:12;5079:70;5129:8;5139:9;913:16:244;895:15;;939:4;932;913:23;;;895:41;:48;;627:333;5079:70:130;5275:4;5269:11;;5326:4;5306:32;;;;;5293:46;;;5352:24;;;5306:32;;-1:-1:-1;5399:21:130;;5439:80;5399:21;5499:8;5509:9;5439:51;:80::i;:::-;5530:15;5548:85;5584:27;;;;;;;;;;;;;;;;;5613:8;5623:9;5548:35;:85::i;:::-;-1:-1:-1;5714:10:130;;4881:850;-1:-1:-1;;;;;;;4881:850:130:o;7019:158::-;7092:12;7123:47;:45;:47::i;:::-;7116:54;;7019:158;:::o;966:809:244:-;1254:9;1357:1;1345:9;1339:16;1335:24;1329:4;1325:35;1308:15;1304:57;1205:385;1400:12;1383:15;1380:33;1205:385;;;1565:22;;1550:38;;1476:4;1512:17;;;;1455:26;;;;1205:385;;;1209:170;;1674:84;1702:23;:8;1472:4:69;1331:161;1702:23:244;1727:6;1735:8;:15;1753:4;1735:22;1674:27;:84::i;:::-;966:809;;;:::o;1609:5350:156:-;1756:15;1811:19;1833:33;1857:8;1833:23;:33::i;:::-;1811:55;-1:-1:-1;1993:4:156;1978:20;;2460:40;2491:8;2460:30;:40::i;:::-;2530:11;2544:1;2530:15;2520:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2520:26:156;-1:-1:-1;2515:31:156;-1:-1:-1;2653:4:156;2645:13;;2560:16;2993:3950;3017:11;3013:1;:15;2993:3950;;;3054:20;3076:21;3101:50;3139:8;3149:1;3101:37;:50::i;:::-;3053:98;;;;3366:12;3356:8;3348:31;3426:13;3422:1;3412:8;3408:16;3400:40;3487:1;3477:8;3473:16;3461:28;;3525:34;3562:63;3591:8;3601:12;3615:9;3562:28;:63::i;:::-;3525:100;;3752:14;3826:4;3784:38;3810:8;3820:1;3784:25;:38::i;:::-;3769:61;3752:78;;3848:11;3871:39;3898:8;3908:1;3871:26;:39::i;:::-;3913:1;3871:43;3862:6;:52;3848:66;;3933:2443;3949:3;3940:6;:12;3933:2443;;;4312:13;;4411:1;4400:2;4395:14;;;4391:22;4371:43;;4365:50;4503:8;4493:19;;;4556:2;4551:14;4622:4;4610:17;;;4677:1;4673:14;;;;;4359:4;4355:61;3976:15;;4778:17;4780:5;4493:19;4355:61;4778:17::i;:::-;4730:65;;;;4837:16;4821:12;:32;4817:158;;4906:13;;;;4888:64;;;;;;;;9025:25:409;;;;9066:18;;;9059:34;;;9109:18;;;9102:34;;;8998:18;;4888:64:156;;;;;;;;4817:158;5017:17;5000:13;:34;4996:163;;5088:13;;;;5069:67;;;;;;;;9025:25:409;;;;9066:18;;;9059:34;;;9109:18;;;9102:34;;;8998:18;;5069:67:156;8823:319:409;4996:163:156;5200:16;;5185:31;;5181:154;;;5266:13;;;;5281:16;;5251:61;;;;;;;;9025:25:409;;;;9066:18;;;9059:34;9109:18;;;9102:34;;;8998:18;;5251:61:156;8823:319:409;5181:154:156;5356:32;;;;;;;;5505:19;;;;-1:-1:-1;5482:177:156;;;5583:13;;;;5598:16;;5616:19;;;;;5559:77;;;;;;;;9025:25:409;;;;9066:18;;;9059:34;;;;9109:18;;;9102:34;8998:18;;5559:77:156;8823:319:409;5482:177:156;5818:33;;;;;;;5969:19;;;;-1:-1:-1;5946:131:156;;;6038:16;;6016:19;;;:38;5946:131;6197:1;6181:13;:17;6177:110;;;6248:16;;6226:19;;;:38;6177:110;-1:-1:-1;;;6309:13:156;;;:15;;;;;;-1:-1:-1;;;6356:1:156;6346:11;;;;;3933:2443;;;6502:46;6536:8;6546:1;6502:33;:46::i;:::-;6479:5;:19;;;:69;6475:215;;6603:5;:19;;;6624:46;6658:8;6668:1;6624:33;:46::i;:::-;6579:92;;;;;;;;9321:25:409;;;;9362:18;;;9355:34;9294:18;;6579:92:156;9147:248:409;6475:215:156;6793:16;;:33;;6789:140;;6878:16;;6857:53;;;;;;;;9321:25:409;;;;9362:18;;;9355:34;;;9294:18;;6857:53:156;9147:248:409;6789:140:156;-1:-1:-1;;3030:3:156;;;;;-1:-1:-1;2993:3950:156;;-1:-1:-1;;2993:3950:156;;;1787:5166;;;1609:5350;;;;;:::o;29640:4992:161:-;29700:12;29748:125;29887:14;5538:2;29887:40;;30001:6;29984:23;;30034:161;:4099;;;;;;;;30220:13;30034:4099;;;;;;;;30394:22;30034:4099;;;;30438:25;30034:4099;;;;30485:23;30034:4099;;;;30530:24;30034:4099;;;;30651:27;30034:4099;;;;30700:26;30034:4099;;;;30748:22;30034:4099;;;;30792:27;30034:4099;;;;30841:27;30034:4099;;;;30890:30;30034:4099;;;;30942:31;30034:4099;;;;30995:21;30034:4099;;;;31038:21;30034:4099;;;;31081:36;30034:4099;;;;31139:36;30034:4099;;;;31197:38;30034:4099;;;;31257:29;30034:4099;;;;31308:29;30034:4099;;;;31359:31;30034:4099;;;;31412:37;30034:4099;;;;31471:28;30034:4099;;;;31521:29;30034:4099;;;;31572:28;30034:4099;;;;31622:24;30034:4099;;;;31668:27;30034:4099;;;;31717:26;30034:4099;;;;31792:26;30034:4099;;;;31840:20;30034:4099;;;;31882:27;30034:4099;;;;31931:23;30034:4099;;;;31976:24;30034:4099;;;;32022:22;30034:4099;;;;32066:28;30034:4099;;;;32116:37;30034:4099;;;;32175:19;30034:4099;;;;32216:23;30034:4099;;;;32261:25;30034:4099;;;;32308:34;30034:4099;;;;32364:32;30034:4099;;;;32418:27;30034:4099;;;;32467:25;30034:4099;;;;32514:25;30034:4099;;;;32561:25;30034:4099;;;;32608:18;30034:4099;;;;32648:18;30034:4099;;;;32688:19;30034:4099;;;;32729:18;30034:4099;;;;32769:16;30034:4099;;;;32807:18;30034:4099;;;;32847:19;30034:4099;;;;32888:20;30034:4099;;;;32930:19;30034:4099;;;;32971:17;30034:4099;;;;33010:23;30034:4099;;;;33055:18;30034:4099;;;;33095:17;30034:4099;;;;33134:19;30034:4099;;;;33175:20;30034:4099;;;;33217:18;30034:4099;;;;33257:18;30034:4099;;;;33297:18;30034:4099;;;;33337:18;30034:4099;;;;33377:18;30034:4099;;;;33417:22;30034:4099;;;;33529:22;30034:4099;;;;33573:29;30034:4099;;;;33624:21;30034:4099;;;;33734:21;30034:4099;;;;33777:28;30034:4099;;;;33827:25;30034:4099;;;;33874:19;30034:4099;;;;33915:18;30034:4099;;;;34013:18;30034:4099;;;;34053:20;30034:4099;;;;34095:20;30034:4099;;;;;34147:32;34255:13;34236:32;;5538:2;34410:15;:22;:49;34406:143;;34503:22;;34486:48;;;;;;;;9321:25:409;;;;9362:18;;;9355:34;;;9294:18;;34486:48:161;9147:248:409;34406:143:161;34569:46;34599:15;34569:29;:46::i;:::-;34562:53;;;;;;29640:4992;:::o;1085:1360:70:-;1617:4;1609:6;1605:17;1676:1;1668:6;1664:14;1650:12;1646:33;1692:202;1716:3;1702:12;1699:21;1692:202;;;1872:19;;1851:41;;1773:4;1755:23;;;;1811;;;;1692:202;;;1696:2;1925:1;1918:9;1908:521;;2034:66;2030:1;2027;2023:9;2019:82;2370:4;2355:12;2349:19;2345:30;2313:4;2309:9;2294:12;2288:19;2284:35;2223:174;2189:12;2161:254;;1908:521;;1085:1360;;;:::o;1993:365:95:-;2060:13;2089:8;:15;2108:1;2089:20;2085:59;;-1:-1:-1;2132:1:95;;1993:365;-1:-1:-1;1993:365:95:o;2085:59::-;-1:-1:-1;2335:4:95;2321:19;2315:26;2312:1;2307:35;;1993:365::o;3228:5323::-;3327:13;3343:21;3355:8;3343:11;:21::i;:::-;3327:37;-1:-1:-1;3452:9:95;;3448:5087;;3570:15;;3512:1;3524;3516:9;;3512:13;;3547:38;;3543:124;;;3639:8;3616:32;;;;;;;;;;;:::i;3543:124::-;4526:15;;3803:4;3785:46;;;;;;4502:41;;;4859:4;4884:1;4869:13;;;4865:21;4841:47;;;;;4916:19;;4971:2826;5003:3;4978:21;:28;4971:2826;;5220:28;;5214:4;5210:39;5317:29;;;5595:1;5578:18;;5622:21;;;5618:108;;;5694:8;5678:25;;;;;;;;;;;:::i;5618:108::-;6669:21;;5818:16;6731:13;;;;6797:1;6792:13;;;;6849:1;6844:13;;;;6902:1;6897:13;6966:16;;;;:45;;;6996:15;6986:7;:25;6966:45;6962:165;;;7075:8;7085:14;7050:50;;;;;;;;;;;;:::i;6962:165::-;-1:-1:-1;;;7399:1:95;7388:12;;7376:24;;7426:22;;;7422:109;;7499:8;7483:25;;;;;;;;;;;:::i;7422:109::-;7636:14;7624:26;;7777:1;7752:26;;;;5008:2789;;;;;4971:2826;;;8043:12;8030:9;:25;8026:118;;8116:8;8086:39;;;;;;;;;;;:::i;8026:118::-;3463:4695;;;;;3303:5242;3228:5323;:::o;3448:5087::-;8443:1;8425:8;:15;:19;8421:100;;;8493:8;8475:27;;;;;;;;;;;:::i;8421:100::-;3303:5242;3228:5323;:::o;13552:445::-;13678:14;13694:15;13749;13767:36;13781:8;13791:11;13767:13;:36::i;:::-;13872:14;13918:1;13913:13;;;;13959:1;13954:13;;;;;-1:-1:-1;13552:445:95;-1:-1:-1;;;;13552:445:95:o;1057:546:156:-;1193:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1193:28:156;-1:-1:-1;1244:352:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1244:352:156;;;;;;;;;;;;1057:546::o;10410:428:95:-;10500:15;10551:26;10584:21;10596:8;10584:11;:21::i;:::-;10608:1;10584:25;10580:1;:29;10551:58;;10623:14;10640:43;10661:8;10671:11;10640:20;:43::i;:::-;10755:44;;;;10751:57;;;10773:4;10751:57;;10410:428;-1:-1:-1;;;10410:428:95:o;11340:319::-;11431:16;11483:15;11501:36;11515:8;11525:11;11501:13;:36::i;:::-;11614:14;11611:1;11606:23;;11340:319;-1:-1:-1;;;;11340:319:95:o;12361:358::-;12483:18;12541:15;12559:36;12573:8;12583:11;12559:13;:36::i;:::-;12674:14;12671:1;12666:23;;12361:358;-1:-1:-1;;;;12361:358:95:o;749:572:160:-;1028:16;;844:7;;;;918:6;892:32;;;1015:29;;1011:131;;1088:13;;;;1103:16;;1067:64;;;;;;;;9025:25:409;;;;9066:18;;;9059:34;9109:18;;;9102:34;;;8998:18;;1067:64:160;8823:319:409;1011:131:160;1214:5;:19;;;1202:9;:31;1198:93;;;1249:19;;;:31;;;1198:93;-1:-1:-1;1309:1:160;;1312;;-1:-1:-1;749:572:160;-1:-1:-1;;;749:572:160:o;772:603:157:-;867:7;876;977:21;1016:7;1027:6;1001:32;977:56;;1064:5;:15;;;:22;1047:13;:39;1043:154;;1133:13;;;;1148:15;;;;:22;1109:77;;;;;;;;9025:25:409;;;;9066:18;;;9059:34;9109:18;;;9102:34;;;8998:18;;1109:77:157;8823:319:409;1314:934:159;1409:7;1418;1437:34;1489:7;1500:6;1474:32;1437:69;;1517:43;1602:5;:15;;;1618:26;1602:43;;;;;;;;:::i;:::-;;;;;;;1517:129;;1657:27;1686:23;1713:49;1740:21;2466:8:149;2554:3;2512:45;;;;2222:353;1713:49:159;1656:106;;;;1777:88;1817:6;1826:38;1777:31;:88::i;:::-;1772:163;;1888:36;;;;;742:42:409;730:55;;1888:36:159;;;712:74:409;685:18;;1888:36:159;543:249:409;1772:163:159;2164:77;;;;;;;;9025:25:409;;;2011:4:159;2003;1976:31;;;1975:40;;9066:18:409;;;9059:34;;;2085:4:159;2058:31;;;2057:40;;;9109:18:409;;;9102:34;;;1975:40:159;;2164:22;;;;;;8998:18:409;;2164:77:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2157:84;;;;;;;;;;1314:934;;;;;:::o;378:359:158:-;-1:-1:-1;459:7:158;;728:1;;-1:-1:-1;378:359:158:o;556:170:162:-;-1:-1:-1;714:1:162;;717;;-1:-1:-1;556:170:162:o;1030:129:164:-;-1:-1:-1;1147:1:164;;;;-1:-1:-1;1030:129:164:o;646:400:165:-;741:7;750;972:43;1000:5;1007:7;972:27;:43::i;:::-;-1:-1:-1;1034:1:165;;;;-1:-1:-1;646:400:165;-1:-1:-1;;;;646:400:165:o;701:458:166:-;790:7;;863:4;837:30;;;;922:1;895:28;;;894:37;946:11;;;942:76;;980:27;;;;;;;;;;;;;;942:76;1051:3;1031:17;1042:6;1031:8;:17;:::i;:::-;:23;1027:103;;;1077:42;;;;;;;;9321:25:409;;;9362:18;;;9355:34;;;9294:18;;1077:42:166;9147:248:409;1027:103:166;-1:-1:-1;1147:1:166;;1150;;-1:-1:-1;701:458:166;-1:-1:-1;;;;701:458:166:o;679:553:167:-;768:7;;844:6;818:32;;974:15;952:38;;;:125;;-1:-1:-1;1061:16:167;;952:125;861:301;;;1109:42;;;;;;;;2322:25:409;;;2295:18;;1109:42:167;2176:177:409;861:301:167;-1:-1:-1;1220:1:167;;;;-1:-1:-1;679:553:167;-1:-1:-1;;;679:553:167:o;4034:539:169:-;4129:7;4138;4157:19;4194:7;4205:6;4179:32;4157:54;;4221:15;4266:4;4254:7;4239:31;;4221:49;;4282:20;4304:21;4341:66;4379:5;:14;;;4395:11;4341:37;:66::i;:::-;4281:126;;;;4438:7;4422:13;:23;4418:108;;;4468:47;;;;;;;;9321:25:409;;;9362:18;;;9355:34;;;9294:18;;4468:47:169;9147:248:409;4418:108:169;-1:-1:-1;4544:12:169;4558:7;;-1:-1:-1;4034:539:169;-1:-1:-1;;;;4034:539:169:o;469:316:170:-;738:4;711:31;746:4;710:40;;776:1;;-1:-1:-1;469:316:170:o;588:238:174:-;-1:-1:-1;814:1:174;;817;;-1:-1:-1;588:238:174:o;489:296:184:-;578:7;;704:4;696;669:31;;;668:40;727:10;:23;;749:1;727:23;;;740:6;727:23;718:32;776:1;;-1:-1:-1;489:296:184;-1:-1:-1;;;;489:296:184:o;641:297:185:-;730:7;;857:4;849;822:31;;;821:40;889:1;880:10;;:23;;902:1;880:23;;595:172:186;-1:-1:-1;755:1:186;;676:7;;-1:-1:-1;595:172:186:o;507:297:224:-;596:7;;723:4;715;688:31;;;687:40;755:1;746:10;;:23;;768:1;746:23;;1837:972:67;1910:12;2023:19;2055:3;:10;2068:1;2055:14;2045:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2045:25:67;;2023:47;;2147:6;2195:12;2191:17;2275:4;2270:3;2266:14;2342:4;2336:3;2330:10;2326:21;2317:7;2313:35;2401:4;2393:6;2389:17;2225:527;2437:4;2428:7;2425:17;2225:527;;;2608:19;;2717:14;;2699:33;;2672:25;;;2669:64;2648:86;;2489:4;2476:18;;;;2549:4;2531:23;2225:527;;;-1:-1:-1;2786:6:67;;1837:972;-1:-1:-1;;;;;;1837:972:67:o;9231:572:95:-;9328:14;9440:21;9452:8;9440:11;:21::i;:::-;9425:11;:36;9421:119;;9507:11;9520:8;9484:45;;;;;;;;;;;;:::i;9421:119::-;-1:-1:-1;9774:1:95;9757:19;9735:42;9753:1;9735:42;9729:49;9780:6;9725:62;;9231:572::o;1349:282:61:-;1436:4;1543:23;1558:7;1543:14;:23::i;:::-;:81;;;;;1570:54;1603:7;1612:11;1570:32;:54::i;704:427::-;768:4;975:68;1008:7;1017:25;975:32;:68::i;:::-;:149;;;;-1:-1:-1;1060:64:61;1093:7;1102:21;1060:32;:64::i;:::-;1059:65;956:168;704:427;-1:-1:-1;;704:427:61:o;4421:647::-;4592:71;;;11656:66:409;11644:79;;4592:71:61;;;;11626:98:409;;;;4592:71:61;;;;;;;;;;11599:18:409;;;;4592:71:61;;;;;;;;;;;4615:34;4592:71;;;4871:20;;4523:4;;4592:71;4523:4;;;;;;4592:71;4523:4;;4871:20;4836:7;4829:5;4818:86;4807:97;;4931:16;4917:30;;4981:4;4975:11;4960:26;;5013:7;:29;;;;;5038:4;5024:10;:18;;5013:29;:48;;;;;5060:1;5046:11;:15;5013:48;5006:55;4421:647;-1:-1:-1;;;;;;;4421:647:61:o;-1:-1:-1:-;;;:::i;:::-;:::o;14:332:409:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:66;223:5;219:78;212:5;209:89;199:117;;312:1;309;302:12;797:591;867:6;875;928:2;916:9;907:7;903:23;899:32;896:52;;;944:1;941;934:12;896:52;984:9;971:23;1013:18;1054:2;1046:6;1043:14;1040:34;;;1070:1;1067;1060:12;1040:34;1108:6;1097:9;1093:22;1083:32;;1153:7;1146:4;1142:2;1138:13;1134:27;1124:55;;1175:1;1172;1165:12;1124:55;1215:2;1202:16;1241:2;1233:6;1230:14;1227:34;;;1257:1;1254;1247:12;1227:34;1302:7;1297:2;1288:6;1284:2;1280:15;1276:24;1273:37;1270:57;;;1323:1;1320;1313:12;1270:57;1354:2;1346:11;;;;;1376:6;;-1:-1:-1;797:591:409;;-1:-1:-1;;;;797:591:409:o;1393:778::-;1568:2;1579:21;;;1670:13;;1699:18;;;1692:30;;;1771:19;;1638:2;1623:18;;1799:22;;;1539:4;;1568:2;1878:21;;;1539:4;;1852:2;1837:18;;;1927:218;1941:6;1938:1;1935:13;1927:218;;;2006:13;;2021:42;2002:62;1990:75;;2120:15;;;;1963:1;1956:9;;;;;2085:12;;;;1927:218;;;-1:-1:-1;2162:3:409;1393:778;-1:-1:-1;;;;;;1393:778:409:o;2358:184::-;2410:77;2407:1;2400:88;2507:4;2504:1;2497:15;2531:4;2528:1;2521:15;2547:251;2619:2;2613:9;2661:2;2649:15;;2694:18;2679:34;;2715:22;;;2676:62;2673:88;;;2741:18;;:::i;:::-;2777:2;2770:22;2547:251;:::o;2803:334::-;2874:2;2868:9;2930:2;2920:13;;2935:66;2916:86;2904:99;;3033:18;3018:34;;3054:22;;;3015:62;3012:88;;;3080:18;;:::i;:::-;3116:2;3109:22;2803:334;;-1:-1:-1;2803:334:409:o;3142:245::-;3190:4;3223:18;3215:6;3212:30;3209:56;;;3245:18;;:::i;:::-;-1:-1:-1;3302:2:409;3290:15;3307:66;3286:88;3376:4;3282:99;;3142:245::o;3392:671::-;3460:6;3513:2;3501:9;3492:7;3488:23;3484:32;3481:52;;;3529:1;3526;3519:12;3481:52;3569:9;3556:23;3602:18;3594:6;3591:30;3588:50;;;3634:1;3631;3624:12;3588:50;3657:22;;3710:4;3702:13;;3698:27;-1:-1:-1;3688:55:409;;3739:1;3736;3729:12;3688:55;3775:2;3762:16;3800:48;3816:31;3844:2;3816:31;:::i;:::-;3800:48;:::i;:::-;3871:2;3864:5;3857:17;3911:7;3906:2;3901;3897;3893:11;3889:20;3886:33;3883:53;;;3932:1;3929;3922:12;3883:53;3987:2;3982;3978;3974:11;3969:2;3962:5;3958:14;3945:45;4031:1;4010:14;;;4026:2;4006:23;3999:34;;;;4014:5;3392:671;-1:-1:-1;;;;3392:671:409:o;4068:250::-;4153:1;4163:113;4177:6;4174:1;4171:13;4163:113;;;4253:11;;;4247:18;4234:11;;;4227:39;4199:2;4192:10;4163:113;;;-1:-1:-1;;4310:1:409;4292:16;;4285:27;4068:250::o;4323:329::-;4364:3;4402:5;4396:12;4429:6;4424:3;4417:19;4445:76;4514:6;4507:4;4502:3;4498:14;4491:4;4484:5;4480:16;4445:76;:::i;:::-;4566:2;4554:15;4571:66;4550:88;4541:98;;;;4641:4;4537:109;;4323:329;-1:-1:-1;;4323:329:409:o;4657:217::-;4804:2;4793:9;4786:21;4767:4;4824:44;4864:2;4853:9;4849:18;4841:6;4824:44;:::i;5394:447::-;5551:2;5540:9;5533:21;5590:6;5585:2;5574:9;5570:18;5563:34;5647:6;5639;5634:2;5623:9;5619:18;5606:48;5703:1;5674:22;;;5698:2;5670:31;;;5663:42;;;;5757:2;5745:15;;;5762:66;5741:88;5726:104;5722:113;;5394:447;-1:-1:-1;5394:447:409:o;5846:183::-;5906:4;5939:18;5931:6;5928:30;5925:56;;;5961:18;;:::i;:::-;-1:-1:-1;6006:1:409;6002:14;6018:4;5998:25;;5846:183::o;6034:1361::-;6131:6;6162:2;6205;6193:9;6184:7;6180:23;6176:32;6173:52;;;6221:1;6218;6211:12;6173:52;6254:9;6248:16;6283:18;6324:2;6316:6;6313:14;6310:34;;;6340:1;6337;6330:12;6310:34;6378:6;6367:9;6363:22;6353:32;;6419:2;6414;6405:7;6401:16;6397:25;6394:45;;;6435:1;6432;6425:12;6394:45;6461:22;;:::i;:::-;6514:2;6508:9;6542:2;6532:8;6529:16;6526:36;;;6558:1;6555;6548:12;6526:36;6589:8;6585:2;6581:17;6571:27;;;6636:7;6629:4;6625:2;6621:13;6617:27;6607:55;;6658:1;6655;6648:12;6607:55;6687:2;6681:9;6671:19;;6710:60;6726:43;6766:2;6726:43;:::i;6710:60::-;6804:15;;;6886:1;6882:10;;;;6874:19;;6870:28;;;6835:12;;;;6910:19;;;6907:39;;;6942:1;6939;6932:12;6907:39;6966:11;;;;6986:350;7002:6;6997:3;6994:15;6986:350;;;7077:3;7071:10;7129:42;7120:7;7116:56;7107:7;7104:69;7094:167;;7215:1;7244:2;7240;7233:14;7094:167;7274:20;;7019:12;;;;7314;;;;6986:350;;;7345:20;;-1:-1:-1;7352:5:409;6034:1361;-1:-1:-1;;;;;;6034:1361:409:o;7400:1418::-;7513:6;7521;7574:2;7562:9;7553:7;7549:23;7545:32;7542:52;;;7590:1;7587;7580:12;7542:52;7623:9;7617:16;7652:18;7693:2;7685:6;7682:14;7679:34;;;7709:1;7706;7699:12;7679:34;7747:6;7736:9;7732:22;7722:32;;7792:7;7785:4;7781:2;7777:13;7773:27;7763:55;;7814:1;7811;7804:12;7763:55;7843:2;7837:9;7865:4;7891:48;7907:31;7935:2;7907:31;:::i;7891:48::-;7962:2;7955:5;7948:17;8002:7;7997:2;7992;7988;7984:11;7980:20;7977:33;7974:53;;;8023:1;8020;8013:12;7974:53;8036:67;8100:2;8095;8088:5;8084:14;8079:2;8075;8071:11;8036:67;:::i;:::-;8158:18;;;8152:25;8122:5;;-1:-1:-1;8152:25:409;-1:-1:-1;8189:16:409;;;8186:36;;;8218:1;8215;8208:12;8186:36;8256:8;8245:9;8241:24;8231:34;;8303:7;8296:4;8292:2;8288:13;8284:27;8274:55;;8325:1;8322;8315:12;8274:55;8354:2;8348:9;8338:19;;8377:60;8393:43;8433:2;8393:43;:::i;8377:60::-;8471:15;;;8553:1;8549:10;;;;8541:19;;8537:28;;;8502:12;;;;-1:-1:-1;8577:19:409;;;8574:39;;;8609:1;8606;8599:12;8574:39;8633:11;;;;8653:135;8669:6;8664:3;8661:15;8653:135;;;8735:10;;8723:23;;8686:12;;;;8766;;;;8653:135;;;8807:5;8797:15;;;;;;;7400:1418;;;;;:::o;9400:288::-;9575:2;9564:9;9557:21;9538:4;9595:44;9635:2;9624:9;9620:18;9612:6;9595:44;:::i;:::-;9587:52;;9675:6;9670:2;9659:9;9655:18;9648:34;9400:288;;;;;:::o;9693:184::-;9745:77;9742:1;9735:88;9842:4;9839:1;9832:15;9866:4;9863:1;9856:15;10473:245;10552:6;10560;10613:2;10601:9;10592:7;10588:23;10584:32;10581:52;;;10629:1;10626;10619:12;10581:52;-1:-1:-1;;10652:16:409;;10708:2;10693:18;;;10687:25;10652:16;;10687:25;;-1:-1:-1;10473:245:409:o;10723:279::-;10788:9;;;10809:10;;;10806:190;;;10852:77;10849:1;10842:88;10953:4;10950:1;10943:15;10981:4;10978:1;10971:15;11189:288;11364:6;11353:9;11346:25;11407:2;11402;11391:9;11387:18;11380:30;11327:4;11427:44;11467:2;11456:9;11452:18;11444:6;11427:44;:::i;:::-;11419:52;11189:288;-1:-1:-1;;;;11189:288:409:o;11735:184::-;11787:77;11784:1;11777:88;11884:4;11881:1;11874:15;11908:4;11905:1;11898:15","linkReferences":{},"immutableReferences":{"56181":[{"start":419,"length":32}],"56185":[{"start":380,"length":32}],"56188":[{"start":186,"length":32},{"start":811,"length":32},{"start":1000,"length":32}]}}} \ No newline at end of file diff --git a/test/abis/RainterpreterParserNPE2.json b/test/abis/RainterpreterParserNPE2.json new file mode 100644 index 00000000..58f77c9d --- /dev/null +++ b/test/abis/RainterpreterParserNPE2.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"buildLiteralParserFunctionPointers","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"type":"function","name":"buildOperandHandlerFunctionPointers","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"type":"function","name":"parse","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"},{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"parsePragma1","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"tuple","internalType":"struct PragmaV1","components":[{"name":"usingWordsFrom","type":"address[]","internalType":"address[]"}]}],"stateMutability":"pure"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"error","name":"BadDynamicLength","inputs":[{"name":"dynamicLength","type":"uint256","internalType":"uint256"},{"name":"standardOpsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"BadSubParserResult","inputs":[{"name":"bytecode","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"DanglingSource","inputs":[]},{"type":"error","name":"DecimalLiteralOverflow","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"DecimalLiteralPrecisionLoss","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"DuplicateLHSItem","inputs":[{"name":"errorOffset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ErrScaleDownPrecisionLoss","inputs":[{"name":"a","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ExcessLHSItems","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ExcessRHSItems","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ExpectedLeftParen","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ExpectedOperand","inputs":[]},{"type":"error","name":"HexLiteralOverflow","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"IntegerOverflow","inputs":[{"name":"integer","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidSubParser","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MalformedCommentStart","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MalformedDecimalPoint","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MalformedExponentDigits","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MalformedHexLiteral","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MaxSources","inputs":[]},{"type":"error","name":"MissingFinalSemi","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"NoWhitespaceAfterUsingWordsFrom","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"NotAcceptingInputs","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"OddLengthHexLiteral","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"OpcodeIOOverflow","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"OperandValuesOverflow","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ParenOverflow","inputs":[]},{"type":"error","name":"ParseStackOverflow","inputs":[]},{"type":"error","name":"ParseStackUnderflow","inputs":[]},{"type":"error","name":"ParserOutOfBounds","inputs":[]},{"type":"error","name":"SourceIndexOutOfBounds","inputs":[{"name":"sourceIndex","type":"uint256","internalType":"uint256"},{"name":"bytecode","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"StringTooLong","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SubParseableMissingDispatch","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnclosedComment","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnclosedLeftParen","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnclosedOperand","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnclosedStringLiteral","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnclosedSubParseableLiteral","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnexpectedComment","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnexpectedLHSChar","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnexpectedOperand","inputs":[]},{"type":"error","name":"UnexpectedOperandValue","inputs":[]},{"type":"error","name":"UnexpectedRHSChar","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnexpectedRightParen","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnknownWord","inputs":[{"name":"word","type":"string","internalType":"string"}]},{"type":"error","name":"UnsupportedLiteralType","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"WordSize","inputs":[{"name":"word","type":"string","internalType":"string"}]},{"type":"error","name":"ZeroLengthDecimal","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ZeroLengthHexLiteral","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"}]}],"bytecode":{"object":"0x6080604052348015600f57600080fd5b506149238061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c8063ccf4477511610050578063ccf44775146100b4578063d6d8c9a8146100c9578063fab4087a146100d157600080fd5b806301ffc9a71461006c5780635514ca2014610094575b600080fd5b61007f61007a366004614041565b6100f2565b60405190151581526020015b60405180910390f35b6100a76100a2366004614147565b6101d7565b60405161008b91906141c7565b6100bc610289565b60405161008b919061429b565b6100bc610298565b6100e46100df366004614147565b6102a2565b60405161008b9291906142ae565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167ffab4087a00000000000000000000000000000000000000000000000000000000148061018557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b806101d157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040805160208101909152606081526000610235836101f46102c2565b6101fc6102e5565b60408051808201909152600881527f0f76123e1645171f0000000000000000000000000000000000000000000000006020820152610305565b90506000602084019050600061024e8580510160200190565b905061025b838383610509565b915061026883838361056d565b9150604051806020016040528061027e856106bd565b905295945050505050565b606061029361071c565b905090565b6060610293610769565b6060806102b96102b4846101f46102c2565b610a44565b91509150915091565b6060604051806101a0016040528061016f81526020016147b461016f9139905090565b60606040518060c001604052806096815260200161471e60969139905090565b61039a604051806102600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016060815260200160608152602001606081526020016000815260200160608152602001606081525090565b600060405180610260016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016004815260200160008152602001600081526020016000815260200160008152602001848152602001858152602001600467ffffffffffffffff81111561042957610429614083565b604051908082528060200260200182016040528015610452578160200160208202803683370190505b5081526000602080830182905260408084018b905260609384018a90528051601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016828152808301825283517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001681178452855290840182905283018190529082018190526080820181905260a082018190526101208201819052610140820181905261020082015290505b95945050505050565b60005b81831015610563578251600160009190911a1b64010000260081161561053e57610537858585610b8a565b935061055d565b6580000000000081161561055757610537858585610bcf565b50610563565b5061050c565b50815b9392505050565b815160408051808201909152601081527f7573696e672d776f7264732d66726f6d000000000000000000000000000000006020820152600091906105b090614305565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008216146105e15783915050610566565b5060109290920180519092906001600091821a1b906401000026008216900361066c5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fe3e4992d00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b60405180910390fd5b836001019350505b8183101561056357610687848484610509565b9250600080610697868686610d9a565b9096509092509050816106ab575050610563565b6106b6868683610e8b565b5050610674565b60c08101516040516060919073ffffffffffffffffffffffffffffffffffffffff6020820160005b841561070657848316825260f09490941c51936020909101906001016106e5565b835260405261071482610f28565b509392505050565b6040805160a0810182526004808252610f76602083015261123e9282019290925261164560608281019190915261171f608083015291908190805b6107608161186f565b94505050505090565b60606140376000604b905080915060006040518061098001604052808467ffffffffffffffff1667ffffffffffffffff16815260200161190081526020016119008152602001611900815260200161196581526020016119de81526020016119de81526020016119de8152602001611965815260200161196581526020016119008152602001611900815260200161190081526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de8152602001611a2381526020016119de8152602001611af58152602001611a2381526020016119de8152602001611af581526020016119de81526020016119de81526020016119008152602001611b5e81526020016119de81526020016119de81525090506060819050604b8151146107575780516040517fc8b56901000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610663565b6060806000836102200151511115610b77576000610a6784610220015160200190565b90506000610a7d85610220015180510160200190565b9050610a8a858383610509565b9150610a9785838361056d565b91505b80821015610ace57610aad858383610509565b9150610aba858383611ba3565b9150610ac7858383611e81565b9150610a9a565b808214610b07576040517f7d565df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61010085015160081615610b745761022085015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517ff06f54cf00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b50505b6102b9610b83846123ba565b84906124f2565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690526000610bc7838364010000260061255e565b949350505050565b610100830180516001179052600060048301821015610c485761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f25a7646800000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b825160f01c612f2a8114610cb55761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f3e47169c00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b60038401935060005b83851015610d5c57845160001a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd18101610d50577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86015160f01c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d18101610d4e57505050600193840193610d5c565b505b85600101955050610cbe565b80610d905761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001610c13565b5092949350505050565b8151600090819081908190600181831a1b6703ff000000000000811615610dfe57600182811a1b7ffffffffffffffffffffffffffffffffffeffffffffffffffffff00000000000082821701610df35760009350610df8565b600193505b50610e44565b640400000000811615610e145760029250610e44565b6b080000000000000000000000811615610e315760039250610e44565b6000886000955095509550505050610e82565b5060009050610e73888888610e6b83876101a09190910151600291820201015161ffff1690565b63ffffffff16565b90975060019550879450925050505b93509350939050565b73ffffffffffffffffffffffffffffffffffffffff811115610f065761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f9d7e517e00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b60c09092018051604080516020810190915290815260f01b9290921790915250565b60208101602082510282015b80821015610f715781518151835281526020909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001610f34565b505050565b600080808080610f8788888861258a565b985090925090508181036040811115610ff95761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fff2f594900000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b806000036110605761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fc75cd50900000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b600281066001036110ca5761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fd76d9b5700000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b60018203975060005b83891061122d578851600090811a906001821b906703ff00000000000082161561112057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd082016111f7565b6c7e00000000000000000000000082161561115e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa982016111f7565b687e000000000000000082161561119857507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc982016111f7565b6102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f69f1e3e600000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909b019a831b969096179550506004016110d3565b50509350909150505b935093915050565b600080808080808761125981896703ff00000000000061255e565b98508089036112c1576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517ffa65827e00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6112cc8a828b6125dc565b895190925065400000000000600160009290921a82901b161515898b101691508190036113f8576001909801978861130d818a6703ff00000000000061255e565b9950808a03611375576102208b01518a037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f7bfa48af00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b895b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908b11600160009290921a9190911b6601000000000000161515166001036113e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611377565b6113f08c83836125dc565b919003955093505b885160009081906c20000000200000000000000000600191831a9190911b1615158a8c1016156114d15760019a8b018051909b8b8d1060009290921a1b65200000000000161515169a8b019a90508a61145a818c6703ff00000000000061255e565b9b50808c036114c2576102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f013b2aaa00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6114cd8d828e6125dc565b9250505b801561154b578160121015611540576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f6f1e76fc00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b816012039450611552565b8160120194505b604d85106115ba576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f8f2b5ffd00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b868510156115f1576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161150b565b5050508784836116019190614376565b61160c90600a6144a9565b61161690856144b5565b61162184600a6144a9565b61162b90846144b5565b61163591906144cc565b9550955050505050935093915050565b6000808080611655878787612786565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083018051848403825291995092945090925060009161170f81601f908101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600160087f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84811660001a909503021b011916167f80000000000000000000000000000000000000000000000000000000000000001790565b9190529698969750505050505050565b6001909101906000808361174481856fffffffffdffffffffffffffeffffd9ff61255e565b9450848181036117ad5761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517ff73a1aa800000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6117b8878787610b8a565b9550856117d681876fffffffffdfffffffffffffffffffffff61255e565b805190975087906001600091821a1b906b2000000000000000000000008216900361185a576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fc4b1913500000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b50600190970196876116358a868686866128fe565b60606000825160020267ffffffffffffffff81111561189057611890614083565b6040519080825280601f01601f1916602001820160405280156118ba576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156118f4578051835186169085161781526020909201916002016118d2565b50939695505050505050565b6000815160010361191d575060208101516101d18161ffff612a8e565b815160000361192e57506000919050565b6040517f1ac6690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600081516002036119a257602082015160408301516119858260ff612a8e565b91506119928160ff612a8e565b60081b9190911791506119609050565b60028251101561192e576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008151600014611a1b576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000919050565b805160009060018110801590611a3a575060038111155b15611ab557602083015160008060028410611a5b5760408601519150611a60565b600091505b83600303611a7357506060850151611a77565b5060005b611a828360ff612a8e565b9250611a8f826001612a8e565b9150611a9c816001612a8e565b9050600981901b600883901b8417179450505050611aef565b8060000361192e576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50919050565b8051600090600381101561192e5760008060018310611b1a5760208501519150611b1f565b600091505b82600203611b3257506040840151611b36565b5060005b611b41826001612a8e565b9150611b4e816001612a8e565b60011b919091179250611aef9050565b60008151600014611b9b576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001919050565b60005b81831015610563578251600090600190821a1b6f07fffffe800000000000000000000000811615611d3f5761010086015160011615611c3f5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f5520a51700000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6f07fffffe000000000000000000000000811615611cf457611c7285856f07fffffe0000000003ff200000000000612af6565b9095509150600080611c848885612bc6565b915091508115611ced5761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f53e6feba00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b5050611d15565b611d1260018601856f07fffffe0000000003ff20000000000061255e565b94505b604086018051600190810190915260a0870180519091019052610100860180516009179052611e7a565b640100002600811615611d9157611d5f600186018564010000260061255e565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611e7a565b670400000000000000811615611ddd575050610100840180516008177ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905260019290920191610563565b65800000000000811615611e4b5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517fedad0c5800000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611c0a565b5050611ba6565b60005b81831015610563578251600090600190821a1b6f07fffffe0000000000000000000000008116156120865761010086015160011615611f1d5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f4e803df600000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b84611f3981866f07fffffe0000000003ff200000000000612af6565b8094508197505050600080611f5389610240015186612c3d565b915091508115611f9557611f68898989612cf7565b97506000611f768a83612f21565b9050611f838a8383612f48565b50610100890180516002179052612072565b611f9f89866130ac565b90925090508115611fc457611fb689600083612f48565b611fbf89613127565b612072565b60006060848a0360058101611fda8d8d8d612cf7565b9b508c6101e0015151602002602001810190506000600590506040519350602082018401604052828185015281845283945061202388600561201c8760200190565b018561318a565b5050506101e08b015180516001019061205690612050836120478680510160200190565b90602002900390565b836131f0565b506120638b60ff84612f48565b50506101008901805160021790525b5050506101008601805160011790526123b3565b61010086015160021615612185576501000000000081166000036121035761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f23b5c6ea00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b60608601805160001a60030190819053603b81111561214e576040517f6232f2d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50610100860180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1690526001909401936123b3565b6502000000000081161561225d576000606087015160001a9050806000036122065761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f7f9db54200000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd01606087018181538160048201015160001a8260028301015160f01c600101535061225187613127565b506001909401936123b3565b6401000026008116156122af5761227d600186018564010000260061255e565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905294506123b3565b6b0800000003ff0004000000008116156122ea576122ce868686613212565b94506122d986613127565b6101008601805160011790526123b3565b6510000000000081161561230f5761230286866132eb565b5050600190920191610563565b6708000000000000008116156123475761232986866132eb565b61233286613660565b50506004610100850152600190920191610563565b658000000000008116156123845761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611e16565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611ee8565b5050611e84565b60e08101518151516060919060f082901c9060208114612406576040517f858f2dcf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051935060208401601083046000818353506001600885048301810192839101600080805b888110156124655789811c61ffff81165163ffff0000601092831b16811760e01b8786015284019360f08390031b92909217910161242c565b50825117909152878203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08181018952908801601f011660405260005b828110156124e6576002810288016003015161ffff90811683018051602060f082901c019260e09190911c16906124db83828461318a565b5050506001016124a3565b50505050505050919050565b606080600061250084613947565b905060005b818110156125465760006125198683613965565b6004019050600061252a8784613996565b6004028201905061253c8883836139af565b5050600101612505565b508361255186613c6b565b92509250505b9250929050565b60005b6000826001865160001a1b1611838510161561258257600184019350612561565b509192915050565b600080808061259a8660026144cc565b9050806c7e0000007e03ff0000000000005b868210816001845160001a1b16151516156125cc576001820191506125ac565b5090979096508695509350505050565b60006030817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401815b8682101580156126165750604d83105b1561265a57815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a60009190911a8590030201612606565b86821061277b57815160001a84900360018111156126a15761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611585565b600a84900a81028281018311156126e1576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611585565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b86821061277b57815160001a603081146127505761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611585565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019061270d565b979650505050505050565b600080806001850181806f7ffffffffffffffffffffffb0000000081807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b03016020808210156127d55750805b875193505b84600185851a1b16151581841016156127f8576001830192506127da565b505080602003612861576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f30515bda00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b858101805190955060001a6001811b6404000000001615806128825750858b145b156128e6576102208d015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f04022fbf00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b50949b939a505060018a019850919650505050505050565b604080518383038686038181018381016022908101909552600284810183905201835260009383019161293289848461318a565b61293f878385018361318a565b50505060c08701515b8015612a2e5760f081901c516040517fc7dc7287000000000000000000000000000000000000000000000000000000008152909190600090819073ffffffffffffffffffffffffffffffffffffffff84169063c7dc7287906129d0907f5836ed68c3ff94ac90fe739dd43b89a6043a4bb56bc7556b9034f4752e80fe999089906004016144df565b6040805180830381865afa1580156129ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a109190614508565b915091508115612a265794506105009350505050565b505050612948565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517fb0e4e5b300000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6000670de0b6b3a76400008310612aab57612aa883613ce0565b92505b81831115612aef576040517fcb0525970000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610663565b5090919050565b6000808060018187870360208111612b0e5780612b11565b60205b915050875192505b8519600184841a1b16158183101615612b3757600182019150612b19565b9681019660208290036008810293841c90931b92612bb957604080516020810185905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fe47fe8b70000000000000000000000000000000000000000000000000000000082526106639160040161429b565b5095969095509350505050565b600080612bd384846130ac565b90925090508161255757506101208301805160408051948552602080862092865285018152909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909416601085901b62ff000016179092179091529160ff90911660010190565b600182810180516000928392600560ff93909316602102870192830192909101835b81831015612ce7576001830151602190930180519093600090819060ff168180612c89838e613d36565b91509150600087612c9e600185038916613d58565b016004028b015195505062ffffff9081169350841683039150612cd29050575060019750601c1a9550612557945050505050565b612cdb83613d58565b84019350505050612c5f565b5060009788975095505050505050565b81516101e0840151600080825291600190831a1b907ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000008201610d9057612d3c85614534565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905280519095506001600091821a1b9250805b85871015612ee1578651600160009190911a1b9350640100002600841615612dac57612da5888888610b8a565b9650612d78565b674000000000000000841615612dd057612dc587614534565b965060019050612ee1565b600188610100015116600003612e815760048203612e475761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f8c9fdbb300000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6000612e54898989613e31565b60208581028701018190526101008b01805160011790529098509050612e7983614534565b925050612d78565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f722cd24a00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b80612f155761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001612eac565b50905250919392505050565b6101c08201516002828102820101516101e084015160009261ffff90921691906105009083565b612f5183613e5c565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1660081790526020830151600090811a840160210180519091600191901a018153508251805160608501516061600091821a8701018051929361ffff8516939092601c600886048503019291901a6001018153600060038201537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe30180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169091179052602090920183821b176018820185901b178083529160e08290036130a45760408051601083901b6020908117601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918252810190915281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000168117825286525b505050505050565b61012082015161014083015160008381526020808220919384939290911c91600160ff84161b808216156131125761ffff83165b8015613110578360201c8503613103576001965061ffff8460101c169550613110565b51925061ffff83166130e0565b505b17610140909601959095525090939092509050565b6000606082015160001a9050806000036131865760208201805160001a600101908181535080603f03610f71576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6020810680820384015b808510156131af578451845260209485019490930192613194565b5080156131ea577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600882021c808451168119865116178452505b50505050565b8060200283015b808410156131ea5783518352602093840193909201916131f7565b60008080613221868686610d9a565b909650925090508061325c5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001612a59565b60008061326884613eaf565b61018089015116156132a95761016088015160101c5b801580159061328b575082155b156132a75760208101519051908514925060019091019061327e565b505b61016088015161ffff166132cf6001846132c357826132c7565b8383035b8b9190612f48565b50816132df576132df8885613ec7565b50949695505050505050565b606082015160001a80156133585761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f6fb11cdc00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b5061336282613e5c565b61010082018051600416600890811790915260a0830151602084015160ff8083169360f89290921c9290911c1681036000819003613434576004856101000151166000036134095761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fab1d3ea700000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b90820160f881901b60208601526102008501519091906134299084613f19565b61020086015261350b565b600181111561350b57808310156134a45761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f78ef278200000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b8083111561350b5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f43168e6800000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b8082036001016020601083028101905b8181101561364c5760a08801516020848a01015190821c61ffff169060001a60015b81811161363b5760208306601c0361355657915160f01c915b82516102008c015160019190911a9061356f9082613f61565b6102008d0152600082841480156135865750886001145b613591576001613593565b8a5b6102008e01519091506135a69082613fa8565b6102008e0152600f8111806135bb5750600f82115b1561361f576102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f7ea1869f00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b818160041b17600186015350506004929092019160010161353d565b50506001909301925060100161351b565b5050505060081b60a0909301929092525050565b60e0810151602082015160f082811c9160001a600101908290036136b0576040517fa806284100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61020084015184518051600092919060101c61ffff165b80156136de57805190915060101c61ffff166136c7565b50604051602188018051919450601c830192916004916024870191600090811a805b8a8310156137c65760048202860195506004878903045b8082111561373557965161ffff16601c810198509690036007613717565b506004810297889003805186529794909401938103865b6007821115613791575160101c61ffff1680518652601c909501947ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99091019061374c565b81156137ac575160101c61ffff168051865260048202909501945b505050600191820180519092919091019060001a80613700565b5050508287525060048087018051919093047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160181b86177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909116179091527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f909101166040525061385f600180871b614376565b861683861b60f06138718860106144cc565b901b171760e0880152610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7169052604080516020601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168181528082018352600080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682178152908a52908901819052908801819052606088018190526080880181905260a088018190526101208801819052610140880181905261020088015250505050505050565b6000815160000361395a57506000919050565b506020015160001a90565b60008061397184613947565b600202600101905060006139858585613fe0565b949091019093016020019392505050565b6000806139a38484613965565b5160001a949350505050565b80821015610f715781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c01613be45760c08401515b8015613be25760008190508160f01c519150606061ffff8460e01c1690506000876101600151905061ffff811660081b8560011a1760e81b6020830162ffffff60e81b198151168217815250505060008060008473ffffffffffffffffffffffffffffffffffffffff1663f6dd97f97f5836ed68c3ff94ac90fe739dd43b89a6043a4bb56bc7556b9034f4752e80fe99866040518363ffffffff1660e01b8152600401613a989291906144df565b600060405180830381865afa158015613ab5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052613afb919081019061456c565b9250925092508215613bd8578151600414613b4457816040517fbe2d187d000000000000000000000000000000000000000000000000000000008152600401610663919061429b565b60208201517fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff881617895260005b8151811015613bcd57613bc5828281518110613bae57613bae614684565b60200260200101518c613ec790919063ffffffff16565b600101613b90565b505050505050613be2565b50505050506139ea565b505b5081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c01613c5f57606061ffff8260e01c16905060006003820152600581019050806040517faedfba2f000000000000000000000000000000000000000000000000000000008152600401610663919061429b565b506004820191506139af565b6101608101516040805161ffff8316808252602080820283019081019093529092909160109190911c90835b80821115613cd75760208301518252915161ffff16917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090910190613c97565b50505050919050565b6000670de0b6b3a7640000820615613d27576040517f8484366800000000000000000000000000000000000000000000000000000000815260048101839052602401610663565b50670de0b6b3a7640000900490565b60008082600052836020536021600020905060018160001a1b91509250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d8a5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b6000806000806000613e44888888610d9a565b9250925092508215612a2e5790935091506112369050565b60008160000151905060208201805160001a6001810182015160001a6131ea57825160a085018051600861ffff9390931692909204602003850160106001601e85901a860301021b909117905250505050565b6000613ebd610100836146b3565b6001901b92915050565b6101608201805160408051808201909152601091821c808252602082018590528351600161ffff909116019282901b92909217909252613f0683613eaf565b6101809094018051909417909352505050565b6000613f258383613fa8565b9250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff821660ff600884811c919091168301901b1792915050565b600060ff831682811015613fa1576040517f23b49a2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050900390565b600060ff808416830190600885901c16601085901c80831115613fc85750815b601081901b600883901b841717935050505092915050565b6000613feb83613947565b82106140275781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016106639291906144df565b50600202016003015161ffff1690565b61403f6146ee565b565b60006020828403121561405357600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461056657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156140f9576140f9614083565b604052919050565b600067ffffffffffffffff82111561411b5761411b614083565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561415957600080fd5b813567ffffffffffffffff81111561417057600080fd5b8201601f8101841361418157600080fd5b803561419461418f82614101565b6140b2565b8181528560208385010111156141a957600080fd5b81602084016020830137600091810160200191909152949350505050565b6020808252825182820182905280516040840181905260009291820190839060608601905b8083101561422257835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906141ec565b509695505050505050565b60005b83811015614248578181015183820152602001614230565b50506000910152565b6000815180845261426981602086016020860161422d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006105666020830184614251565b6040815260006142c16040830185614251565b82810360208481019190915284518083528582019282019060005b818110156142f8578451835293830193918301916001016142dc565b5090979650505050505050565b80516020808301519190811015611aef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156101d1576101d1614347565b600181815b808511156143e257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156143c8576143c8614347565b808516156143d557918102915b93841c939080029061438e565b509250929050565b6000826143f9575060016101d1565b81614406575060006101d1565b816001811461441c576002811461442657614442565b60019150506101d1565b60ff84111561443757614437614347565b50506001821b6101d1565b5060208310610133831016604e8410600b8410161715614465575081810a6101d1565b61446f8383614389565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156144a1576144a1614347565b029392505050565b600061056683836143ea565b80820281158282048414176101d1576101d1614347565b808201808211156101d1576101d1614347565b828152604060208201526000610bc76040830184614251565b8051801515811461196057600080fd5b6000806040838503121561451b57600080fd5b614524836144f8565b9150602083015190509250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361456557614565614347565b5060010190565b60008060006060848603121561458157600080fd5b61458a846144f8565b925060208085015167ffffffffffffffff808211156145a857600080fd5b818701915087601f8301126145bc57600080fd5b81516145ca61418f82614101565b81815289858386010111156145de57600080fd5b6145ed8286830187870161422d565b60408901519096509250508082111561460557600080fd5b818701915087601f83011261461957600080fd5b81518181111561462b5761462b614083565b8060051b915061463c8483016140b2565b818152918301840191848101908a84111561465657600080fd5b938501935b838510156146745784518252938501939085019061465b565b8096505050505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826146e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe190019001900196519de19de19de1965196519001900190019de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de1a2319de1af51a2319de1af519de19de19001b5e19de19de027d02482901b41410193e01380a408092011324604390a201223062960051044a890000000080000000080000000800000010000000000000000000000000000000003caf1e5836ee31ff1e4c42622ad999cd17d454a61a378a702687204a1bca041513bfc04d2fac003405382451298fb9fe35e745fd2cdbc3c52d415aff3d530a923b8e9cbd344c3a171096c4d004ea67600a2aa235194d56371c05a76543dd323d0cd5a68e223f22704422370312f1ac932380073415d4a5b3149bd3ec068483ae452e554c3af6dc5d27f0c0a637fef45a32a6feff209677b933db58d441742e374678613501d4fa88030cae020885d59f30766a3e188413022e67b4531d4070aa2440ab0f285a53d84892737c115fb368385bcbd00ff7e328425a200716686f5c3ebd3f5f024641b909f14a300b1ec71b2ba38323399552b921792a60475d96b74a7b8cf22553f8d14933bccc0d403ded0791b7eb002ddffc0e1abd7031e98c713fc04abd1f4507bb407db187","sourceMap":"1214:2784:132:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100675760003560e01c8063ccf4477511610050578063ccf44775146100b4578063d6d8c9a8146100c9578063fab4087a146100d157600080fd5b806301ffc9a71461006c5780635514ca2014610094575b600080fd5b61007f61007a366004614041565b6100f2565b60405190151581526020015b60405180910390f35b6100a76100a2366004614147565b6101d7565b60405161008b91906141c7565b6100bc610289565b60405161008b919061429b565b6100bc610298565b6100e46100df366004614147565b6102a2565b60405161008b9291906142ae565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167ffab4087a00000000000000000000000000000000000000000000000000000000148061018557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b806101d157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040805160208101909152606081526000610235836101f46102c2565b6101fc6102e5565b60408051808201909152600881527f0f76123e1645171f0000000000000000000000000000000000000000000000006020820152610305565b90506000602084019050600061024e8580510160200190565b905061025b838383610509565b915061026883838361056d565b9150604051806020016040528061027e856106bd565b905295945050505050565b606061029361071c565b905090565b6060610293610769565b6060806102b96102b4846101f46102c2565b610a44565b91509150915091565b6060604051806101a0016040528061016f81526020016147b461016f9139905090565b60606040518060c001604052806096815260200161471e60969139905090565b61039a604051806102600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016060815260200160608152602001606081526020016000815260200160608152602001606081525090565b600060405180610260016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016004815260200160008152602001600081526020016000815260200160008152602001848152602001858152602001600467ffffffffffffffff81111561042957610429614083565b604051908082528060200260200182016040528015610452578160200160208202803683370190505b5081526000602080830182905260408084018b905260609384018a90528051601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016828152808301825283517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001681178452855290840182905283018190529082018190526080820181905260a082018190526101208201819052610140820181905261020082015290505b95945050505050565b60005b81831015610563578251600160009190911a1b64010000260081161561053e57610537858585610b8a565b935061055d565b6580000000000081161561055757610537858585610bcf565b50610563565b5061050c565b50815b9392505050565b815160408051808201909152601081527f7573696e672d776f7264732d66726f6d000000000000000000000000000000006020820152600091906105b090614305565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008216146105e15783915050610566565b5060109290920180519092906001600091821a1b906401000026008216900361066c5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fe3e4992d00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b60405180910390fd5b836001019350505b8183101561056357610687848484610509565b9250600080610697868686610d9a565b9096509092509050816106ab575050610563565b6106b6868683610e8b565b5050610674565b60c08101516040516060919073ffffffffffffffffffffffffffffffffffffffff6020820160005b841561070657848316825260f09490941c51936020909101906001016106e5565b835260405261071482610f28565b509392505050565b6040805160a0810182526004808252610f76602083015261123e9282019290925261164560608281019190915261171f608083015291908190805b6107608161186f565b94505050505090565b60606140376000604b905080915060006040518061098001604052808467ffffffffffffffff1667ffffffffffffffff16815260200161190081526020016119008152602001611900815260200161196581526020016119de81526020016119de81526020016119de8152602001611965815260200161196581526020016119008152602001611900815260200161190081526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de81526020016119de8152602001611a2381526020016119de8152602001611af58152602001611a2381526020016119de8152602001611af581526020016119de81526020016119de81526020016119008152602001611b5e81526020016119de81526020016119de81525090506060819050604b8151146107575780516040517fc8b56901000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610663565b6060806000836102200151511115610b77576000610a6784610220015160200190565b90506000610a7d85610220015180510160200190565b9050610a8a858383610509565b9150610a9785838361056d565b91505b80821015610ace57610aad858383610509565b9150610aba858383611ba3565b9150610ac7858383611e81565b9150610a9a565b808214610b07576040517f7d565df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61010085015160081615610b745761022085015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517ff06f54cf00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b50505b6102b9610b83846123ba565b84906124f2565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690526000610bc7838364010000260061255e565b949350505050565b610100830180516001179052600060048301821015610c485761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f25a7646800000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b825160f01c612f2a8114610cb55761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f3e47169c00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b60038401935060005b83851015610d5c57845160001a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd18101610d50577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86015160f01c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d18101610d4e57505050600193840193610d5c565b505b85600101955050610cbe565b80610d905761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001610c13565b5092949350505050565b8151600090819081908190600181831a1b6703ff000000000000811615610dfe57600182811a1b7ffffffffffffffffffffffffffffffffffeffffffffffffffffff00000000000082821701610df35760009350610df8565b600193505b50610e44565b640400000000811615610e145760029250610e44565b6b080000000000000000000000811615610e315760039250610e44565b6000886000955095509550505050610e82565b5060009050610e73888888610e6b83876101a09190910151600291820201015161ffff1690565b63ffffffff16565b90975060019550879450925050505b93509350939050565b73ffffffffffffffffffffffffffffffffffffffff811115610f065761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f9d7e517e00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b60c09092018051604080516020810190915290815260f01b9290921790915250565b60208101602082510282015b80821015610f715781518151835281526020909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001610f34565b505050565b600080808080610f8788888861258a565b985090925090508181036040811115610ff95761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fff2f594900000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b806000036110605761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fc75cd50900000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b600281066001036110ca5761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fd76d9b5700000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b60018203975060005b83891061122d578851600090811a906001821b906703ff00000000000082161561112057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd082016111f7565b6c7e00000000000000000000000082161561115e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa982016111f7565b687e000000000000000082161561119857507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc982016111f7565b6102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f69f1e3e600000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909b019a831b969096179550506004016110d3565b50509350909150505b935093915050565b600080808080808761125981896703ff00000000000061255e565b98508089036112c1576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517ffa65827e00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6112cc8a828b6125dc565b895190925065400000000000600160009290921a82901b161515898b101691508190036113f8576001909801978861130d818a6703ff00000000000061255e565b9950808a03611375576102208b01518a037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f7bfa48af00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b895b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908b11600160009290921a9190911b6601000000000000161515166001036113e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611377565b6113f08c83836125dc565b919003955093505b885160009081906c20000000200000000000000000600191831a9190911b1615158a8c1016156114d15760019a8b018051909b8b8d1060009290921a1b65200000000000161515169a8b019a90508a61145a818c6703ff00000000000061255e565b9b50808c036114c2576102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f013b2aaa00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6114cd8d828e6125dc565b9250505b801561154b578160121015611540576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f6f1e76fc00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b816012039450611552565b8160120194505b604d85106115ba576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f8f2b5ffd00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b868510156115f1576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161150b565b5050508784836116019190614376565b61160c90600a6144a9565b61161690856144b5565b61162184600a6144a9565b61162b90846144b5565b61163591906144cc565b9550955050505050935093915050565b6000808080611655878787612786565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083018051848403825291995092945090925060009161170f81601f908101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600160087f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84811660001a909503021b011916167f80000000000000000000000000000000000000000000000000000000000000001790565b9190529698969750505050505050565b6001909101906000808361174481856fffffffffdffffffffffffffeffffd9ff61255e565b9450848181036117ad5761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517ff73a1aa800000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6117b8878787610b8a565b9550856117d681876fffffffffdfffffffffffffffffffffff61255e565b805190975087906001600091821a1b906b2000000000000000000000008216900361185a576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fc4b1913500000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b50600190970196876116358a868686866128fe565b60606000825160020267ffffffffffffffff81111561189057611890614083565b6040519080825280601f01601f1916602001820160405280156118ba576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156118f4578051835186169085161781526020909201916002016118d2565b50939695505050505050565b6000815160010361191d575060208101516101d18161ffff612a8e565b815160000361192e57506000919050565b6040517f1ac6690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600081516002036119a257602082015160408301516119858260ff612a8e565b91506119928160ff612a8e565b60081b9190911791506119609050565b60028251101561192e576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008151600014611a1b576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000919050565b805160009060018110801590611a3a575060038111155b15611ab557602083015160008060028410611a5b5760408601519150611a60565b600091505b83600303611a7357506060850151611a77565b5060005b611a828360ff612a8e565b9250611a8f826001612a8e565b9150611a9c816001612a8e565b9050600981901b600883901b8417179450505050611aef565b8060000361192e576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50919050565b8051600090600381101561192e5760008060018310611b1a5760208501519150611b1f565b600091505b82600203611b3257506040840151611b36565b5060005b611b41826001612a8e565b9150611b4e816001612a8e565b60011b919091179250611aef9050565b60008151600014611b9b576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001919050565b60005b81831015610563578251600090600190821a1b6f07fffffe800000000000000000000000811615611d3f5761010086015160011615611c3f5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f5520a51700000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6f07fffffe000000000000000000000000811615611cf457611c7285856f07fffffe0000000003ff200000000000612af6565b9095509150600080611c848885612bc6565b915091508115611ced5761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f53e6feba00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b5050611d15565b611d1260018601856f07fffffe0000000003ff20000000000061255e565b94505b604086018051600190810190915260a0870180519091019052610100860180516009179052611e7a565b640100002600811615611d9157611d5f600186018564010000260061255e565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611e7a565b670400000000000000811615611ddd575050610100840180516008177ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905260019290920191610563565b65800000000000811615611e4b5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517fedad0c5800000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611c0a565b5050611ba6565b60005b81831015610563578251600090600190821a1b6f07fffffe0000000000000000000000008116156120865761010086015160011615611f1d5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f4e803df600000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b84611f3981866f07fffffe0000000003ff200000000000612af6565b8094508197505050600080611f5389610240015186612c3d565b915091508115611f9557611f68898989612cf7565b97506000611f768a83612f21565b9050611f838a8383612f48565b50610100890180516002179052612072565b611f9f89866130ac565b90925090508115611fc457611fb689600083612f48565b611fbf89613127565b612072565b60006060848a0360058101611fda8d8d8d612cf7565b9b508c6101e0015151602002602001810190506000600590506040519350602082018401604052828185015281845283945061202388600561201c8760200190565b018561318a565b5050506101e08b015180516001019061205690612050836120478680510160200190565b90602002900390565b836131f0565b506120638b60ff84612f48565b50506101008901805160021790525b5050506101008601805160011790526123b3565b61010086015160021615612185576501000000000081166000036121035761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f23b5c6ea00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b60608601805160001a60030190819053603b81111561214e576040517f6232f2d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50610100860180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1690526001909401936123b3565b6502000000000081161561225d576000606087015160001a9050806000036122065761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f7f9db54200000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd01606087018181538160048201015160001a8260028301015160f01c600101535061225187613127565b506001909401936123b3565b6401000026008116156122af5761227d600186018564010000260061255e565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905294506123b3565b6b0800000003ff0004000000008116156122ea576122ce868686613212565b94506122d986613127565b6101008601805160011790526123b3565b6510000000000081161561230f5761230286866132eb565b5050600190920191610563565b6708000000000000008116156123475761232986866132eb565b61233286613660565b50506004610100850152600190920191610563565b658000000000008116156123845761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611e16565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611ee8565b5050611e84565b60e08101518151516060919060f082901c9060208114612406576040517f858f2dcf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051935060208401601083046000818353506001600885048301810192839101600080805b888110156124655789811c61ffff81165163ffff0000601092831b16811760e01b8786015284019360f08390031b92909217910161242c565b50825117909152878203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08181018952908801601f011660405260005b828110156124e6576002810288016003015161ffff90811683018051602060f082901c019260e09190911c16906124db83828461318a565b5050506001016124a3565b50505050505050919050565b606080600061250084613947565b905060005b818110156125465760006125198683613965565b6004019050600061252a8784613996565b6004028201905061253c8883836139af565b5050600101612505565b508361255186613c6b565b92509250505b9250929050565b60005b6000826001865160001a1b1611838510161561258257600184019350612561565b509192915050565b600080808061259a8660026144cc565b9050806c7e0000007e03ff0000000000005b868210816001845160001a1b16151516156125cc576001820191506125ac565b5090979096508695509350505050565b60006030817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401815b8682101580156126165750604d83105b1561265a57815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a60009190911a8590030201612606565b86821061277b57815160001a84900360018111156126a15761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611585565b600a84900a81028281018311156126e1576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611585565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b86821061277b57815160001a603081146127505761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611585565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019061270d565b979650505050505050565b600080806001850181806f7ffffffffffffffffffffffb0000000081807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b03016020808210156127d55750805b875193505b84600185851a1b16151581841016156127f8576001830192506127da565b505080602003612861576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f30515bda00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b858101805190955060001a6001811b6404000000001615806128825750858b145b156128e6576102208d015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f04022fbf00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b50949b939a505060018a019850919650505050505050565b604080518383038686038181018381016022908101909552600284810183905201835260009383019161293289848461318a565b61293f878385018361318a565b50505060c08701515b8015612a2e5760f081901c516040517fc7dc7287000000000000000000000000000000000000000000000000000000008152909190600090819073ffffffffffffffffffffffffffffffffffffffff84169063c7dc7287906129d0907f5836ed68c3ff94ac90fe739dd43b89a6043a4bb56bc7556b9034f4752e80fe999089906004016144df565b6040805180830381865afa1580156129ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a109190614508565b915091508115612a265794506105009350505050565b505050612948565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517fb0e4e5b300000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6000670de0b6b3a76400008310612aab57612aa883613ce0565b92505b81831115612aef576040517fcb0525970000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610663565b5090919050565b6000808060018187870360208111612b0e5780612b11565b60205b915050875192505b8519600184841a1b16158183101615612b3757600182019150612b19565b9681019660208290036008810293841c90931b92612bb957604080516020810185905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fe47fe8b70000000000000000000000000000000000000000000000000000000082526106639160040161429b565b5095969095509350505050565b600080612bd384846130ac565b90925090508161255757506101208301805160408051948552602080862092865285018152909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909416601085901b62ff000016179092179091529160ff90911660010190565b600182810180516000928392600560ff93909316602102870192830192909101835b81831015612ce7576001830151602190930180519093600090819060ff168180612c89838e613d36565b91509150600087612c9e600185038916613d58565b016004028b015195505062ffffff9081169350841683039150612cd29050575060019750601c1a9550612557945050505050565b612cdb83613d58565b84019350505050612c5f565b5060009788975095505050505050565b81516101e0840151600080825291600190831a1b907ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000008201610d9057612d3c85614534565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905280519095506001600091821a1b9250805b85871015612ee1578651600160009190911a1b9350640100002600841615612dac57612da5888888610b8a565b9650612d78565b674000000000000000841615612dd057612dc587614534565b965060019050612ee1565b600188610100015116600003612e815760048203612e475761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f8c9fdbb300000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b6000612e54898989613e31565b60208581028701018190526101008b01805160011790529098509050612e7983614534565b925050612d78565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015b6040517f722cd24a00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b80612f155761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001612eac565b50905250919392505050565b6101c08201516002828102820101516101e084015160009261ffff90921691906105009083565b612f5183613e5c565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1660081790526020830151600090811a840160210180519091600191901a018153508251805160608501516061600091821a8701018051929361ffff8516939092601c600886048503019291901a6001018153600060038201537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe30180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169091179052602090920183821b176018820185901b178083529160e08290036130a45760408051601083901b6020908117601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918252810190915281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000168117825286525b505050505050565b61012082015161014083015160008381526020808220919384939290911c91600160ff84161b808216156131125761ffff83165b8015613110578360201c8503613103576001965061ffff8460101c169550613110565b51925061ffff83166130e0565b505b17610140909601959095525090939092509050565b6000606082015160001a9050806000036131865760208201805160001a600101908181535080603f03610f71576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6020810680820384015b808510156131af578451845260209485019490930192613194565b5080156131ea577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600882021c808451168119865116178452505b50505050565b8060200283015b808410156131ea5783518352602093840193909201916131f7565b60008080613221868686610d9a565b909650925090508061325c5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001612a59565b60008061326884613eaf565b61018089015116156132a95761016088015160101c5b801580159061328b575082155b156132a75760208101519051908514925060019091019061327e565b505b61016088015161ffff166132cf6001846132c357826132c7565b8383035b8b9190612f48565b50816132df576132df8885613ec7565b50949695505050505050565b606082015160001a80156133585761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f6fb11cdc00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b5061336282613e5c565b61010082018051600416600890811790915260a0830151602084015160ff8083169360f89290921c9290911c1681036000819003613434576004856101000151166000036134095761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517fab1d3ea700000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b90820160f881901b60208601526102008501519091906134299084613f19565b61020086015261350b565b600181111561350b57808310156134a45761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f78ef278200000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b8083111561350b5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f43168e6800000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b8082036001016020601083028101905b8181101561364c5760a08801516020848a01015190821c61ffff169060001a60015b81811161363b5760208306601c0361355657915160f01c915b82516102008c015160019190911a9061356f9082613f61565b6102008d0152600082841480156135865750886001145b613591576001613593565b8a5b6102008e01519091506135a69082613fa8565b6102008e0152600f8111806135bb5750600f82115b1561361f576102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016040517f7ea1869f00000000000000000000000000000000000000000000000000000000815260040161066391815260200190565b818160041b17600186015350506004929092019160010161353d565b50506001909301925060100161351b565b5050505060081b60a0909301929092525050565b60e0810151602082015160f082811c9160001a600101908290036136b0576040517fa806284100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61020084015184518051600092919060101c61ffff165b80156136de57805190915060101c61ffff166136c7565b50604051602188018051919450601c830192916004916024870191600090811a805b8a8310156137c65760048202860195506004878903045b8082111561373557965161ffff16601c810198509690036007613717565b506004810297889003805186529794909401938103865b6007821115613791575160101c61ffff1680518652601c909501947ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99091019061374c565b81156137ac575160101c61ffff168051865260048202909501945b505050600191820180519092919091019060001a80613700565b5050508287525060048087018051919093047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160181b86177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909116179091527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f909101166040525061385f600180871b614376565b861683861b60f06138718860106144cc565b901b171760e0880152610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7169052604080516020601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168181528082018352600080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682178152908a52908901819052908801819052606088018190526080880181905260a088018190526101208801819052610140880181905261020088015250505050505050565b6000815160000361395a57506000919050565b506020015160001a90565b60008061397184613947565b600202600101905060006139858585613fe0565b949091019093016020019392505050565b6000806139a38484613965565b5160001a949350505050565b80821015610f715781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c01613be45760c08401515b8015613be25760008190508160f01c519150606061ffff8460e01c1690506000876101600151905061ffff811660081b8560011a1760e81b6020830162ffffff60e81b198151168217815250505060008060008473ffffffffffffffffffffffffffffffffffffffff1663f6dd97f97f5836ed68c3ff94ac90fe739dd43b89a6043a4bb56bc7556b9034f4752e80fe99866040518363ffffffff1660e01b8152600401613a989291906144df565b600060405180830381865afa158015613ab5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052613afb919081019061456c565b9250925092508215613bd8578151600414613b4457816040517fbe2d187d000000000000000000000000000000000000000000000000000000008152600401610663919061429b565b60208201517fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff881617895260005b8151811015613bcd57613bc5828281518110613bae57613bae614684565b60200260200101518c613ec790919063ffffffff16565b600101613b90565b505050505050613be2565b50505050506139ea565b505b5081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c01613c5f57606061ffff8260e01c16905060006003820152600581019050806040517faedfba2f000000000000000000000000000000000000000000000000000000008152600401610663919061429b565b506004820191506139af565b6101608101516040805161ffff8316808252602080820283019081019093529092909160109190911c90835b80821115613cd75760208301518252915161ffff16917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090910190613c97565b50505050919050565b6000670de0b6b3a7640000820615613d27576040517f8484366800000000000000000000000000000000000000000000000000000000815260048101839052602401610663565b50670de0b6b3a7640000900490565b60008082600052836020536021600020905060018160001a1b91509250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d8a5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b6000806000806000613e44888888610d9a565b9250925092508215612a2e5790935091506112369050565b60008160000151905060208201805160001a6001810182015160001a6131ea57825160a085018051600861ffff9390931692909204602003850160106001601e85901a860301021b909117905250505050565b6000613ebd610100836146b3565b6001901b92915050565b6101608201805160408051808201909152601091821c808252602082018590528351600161ffff909116019282901b92909217909252613f0683613eaf565b6101809094018051909417909352505050565b6000613f258383613fa8565b9250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff821660ff600884811c919091168301901b1792915050565b600060ff831682811015613fa1576040517f23b49a2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050900390565b600060ff808416830190600885901c16601085901c80831115613fc85750815b601081901b600883901b841717935050505092915050565b6000613feb83613947565b82106140275781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016106639291906144df565b50600202016003015161ffff1690565b61403f6146ee565b565b60006020828403121561405357600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461056657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156140f9576140f9614083565b604052919050565b600067ffffffffffffffff82111561411b5761411b614083565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561415957600080fd5b813567ffffffffffffffff81111561417057600080fd5b8201601f8101841361418157600080fd5b803561419461418f82614101565b6140b2565b8181528560208385010111156141a957600080fd5b81602084016020830137600091810160200191909152949350505050565b6020808252825182820182905280516040840181905260009291820190839060608601905b8083101561422257835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906141ec565b509695505050505050565b60005b83811015614248578181015183820152602001614230565b50506000910152565b6000815180845261426981602086016020860161422d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006105666020830184614251565b6040815260006142c16040830185614251565b82810360208481019190915284518083528582019282019060005b818110156142f8578451835293830193918301916001016142dc565b5090979650505050505050565b80516020808301519190811015611aef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156101d1576101d1614347565b600181815b808511156143e257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156143c8576143c8614347565b808516156143d557918102915b93841c939080029061438e565b509250929050565b6000826143f9575060016101d1565b81614406575060006101d1565b816001811461441c576002811461442657614442565b60019150506101d1565b60ff84111561443757614437614347565b50506001821b6101d1565b5060208310610133831016604e8410600b8410161715614465575081810a6101d1565b61446f8383614389565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156144a1576144a1614347565b029392505050565b600061056683836143ea565b80820281158282048414176101d1576101d1614347565b808201808211156101d1576101d1614347565b828152604060208201526000610bc76040830184614251565b8051801515811461196057600080fd5b6000806040838503121561451b57600080fd5b614524836144f8565b9150602083015190509250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361456557614565614347565b5060010190565b60008060006060848603121561458157600080fd5b61458a846144f8565b925060208085015167ffffffffffffffff808211156145a857600080fd5b818701915087601f8301126145bc57600080fd5b81516145ca61418f82614101565b81815289858386010111156145de57600080fd5b6145ed8286830187870161422d565b60408901519096509250508082111561460557600080fd5b818701915087601f83011261461957600080fd5b81518181111561462b5761462b614083565b8060051b915061463c8483016140b2565b818152918301840191848101908a84111561465657600080fd5b938501935b838510156146745784518252938501939085019061465b565b8096505050505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826146e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe190019001900196519de19de19de1965196519001900190019de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de19de1a2319de1af51a2319de1af519de19de19001b5e19de19de027d02482901b41410193e01380a408092011324604390a201223062960051044a890000000080000000080000000800000010000000000000000000000000000000003caf1e5836ee31ff1e4c42622ad999cd17d454a61a378a702687204a1bca041513bfc04d2fac003405382451298fb9fe35e745fd2cdbc3c52d415aff3d530a923b8e9cbd344c3a171096c4d004ea67600a2aa235194d56371c05a76543dd323d0cd5a68e223f22704422370312f1ac932380073415d4a5b3149bd3ec068483ae452e554c3af6dc5d27f0c0a637fef45a32a6feff209677b933db58d441742e374678613501d4fa88030cae020885d59f30766a3e188413022e67b4531d4070aa2440ab0f285a53d84892737c115fb368385bcbd00ff7e328425a200716686f5c3ebd3f5f024641b909f14a300b1ec71b2ba38323399552b921792a60475d96b74a7b8cf22553f8d14933bccc0d403ded0791b7eb002ddffc0e1abd7031e98c713fc04abd1f4507bb407db187","sourceMap":"1214:2784:132:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1534:257;;;;;;:::i;:::-;;:::i;:::-;;;516:14:409;;509:22;491:41;;479:2;464:18;1534:257:132;;;;;;;;2267:576;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3838:158::-;;;:::i;:::-;;;;;;;:::i;3562:160::-;;;:::i;1831:394::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1534:257::-;1611:4;1634:46;;;1649:31;1634:46;;:98;;-1:-1:-1;1684:48:132;;;1699:33;1684:48;1634:98;:150;;;-1:-1:-1;952:25:60;937:40;;;;1748:36:132;1627:157;1534:257;-1:-1:-1;;1534:257:132:o;2267:576::-;-1:-1:-1;;;;;;;;;;;;2375:28:132;2418:108;2441:4;2447:11;:9;:11::i;:::-;2460:32;:30;:32::i;:::-;3406;;;;;;;;;;;;;;;;;2418:22;:108::i;:::-;2375:151;-1:-1:-1;2536:14:132;1114:4:69;1104:15;;2536:51:132;;2597:11;2626:21;:4;2006:11:69;;1986:33;2000:4;1986:33;;1843:192;2626:21:132;2597:51;-1:-1:-1;2667:41:132;:10;2696:6;2597:51;2667:28;:41::i;:::-;2658:50;-1:-1:-1;2727:35:132;:10;2658:50;2758:3;2727:22;:35::i;:::-;2718:44;;2797:39;;;;;;;;2806:29;:10;:27;:29::i;:::-;2797:39;;2790:46;2267:576;-1:-1:-1;;;;;2267:576:132:o;3838:158::-;3907:12;3938:51;:49;:51::i;:::-;3931:58;;3838:158;:::o;3562:160::-;3632:12;3663:52;:50;:52::i;1831:394::-;1905:12;1919:16;2080:138;:130;2116:4;2122:11;:9;:11::i;2080:130::-;:136;:138::i;:::-;2073:145;;;;1831:394;;;:::o;2900:100::-;2952:12;2983:10;;;;;;;;;;;;;;;;;2976:17;;2900:100;:::o;3080:144::-;3153:12;3184:33;;;;;;;;;;;;;;;;;3177:40;;3080:144;:::o;8692:1311:237:-;8854:17;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8854:17:237;8887:23;8913:1032;;;;;;;;9017:1;8913:1032;;;;9057:1;8913:1032;;;;9097:1;8913:1032;;;;9141:1;8913:1032;;;;9185:1;8913:1032;;;;9275:1;8913:1032;;;;9317:1;8913:1032;;;;9362:1;8913:1032;;;;1157:6;8913:1032;;;;9447:1;8913:1032;;;;9492:1;8913:1032;;;;9535:1;8913:1032;;;;9582:1;8913:1032;;;;9627:14;8913:1032;;;;9686:15;8913:1032;;;;2173:1;9744:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9744:36:237;-1:-1:-1;8913:1032:237;;9845:1;8913:1032;;;;;;;;;;;;;;;;;;;;;7752:11;;7776:4;7748:22;-1:-1:-1;7744:38:237;7795:81;;;7902:26;;;7889:40;;8056:29;;8087:11;8052:47;8049:68;;8018:100;;8242:49;;8301:15;;;:19;;;8330:15;;:19;;;8359;;;:23;;;8392:19;;;:23;;;8425:17;;;:21;;;8569:16;;;:20;;;8599;;;:24;;;8633:18;;;:46;8887:1058;-1:-1:-1;9955:19:237;9991:5;8692:1311;-1:-1:-1;;;;;8692:1311:237:o;3796:656:232:-;3900:7;3919:504;3935:3;3926:6;:12;3919:504;;;4103:13;;4119:1;3954:12;4095:22;;;;4091:30;17004:76:230;4152:23:232;;:27;4148:265;;4208:33;:5;4229:6;4237:3;4208:20;:33::i;:::-;4199:42;;4148:265;;;5313:41:230;4266:25:232;;:29;4262:151;;4324:30;:5;4342:6;4350:3;4324:17;:30::i;4262:151::-;4393:5;;;4262:151;3940:483;3919:504;;;-1:-1:-1;4439:6:232;3796:656;;;;;;:::o;954:2105:234:-;1363:13;;501:25;;;;;;;;;;;;;;;;;1052:7;;1363:13;570:29;;;:::i;:::-;699:52;1490:33;;:59;1486:119;;1580:6;1573:13;;;;;1486:119;-1:-1:-1;648:2:234;1700:37;;;;1996:13;;1700:37;;-1:-1:-1;2012:1:234;1835:12;1988:22;;;1984:30;;17004:76:230;2053:23:234;;:28;;2049:145;;271:10:231;;;;340:28;;;;2112:63:234;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;2112:63:234;;;;;;;;2049:145;2211:8;;;;;1633:601;2248:767;2264:3;2255:6;:12;2248:767;;;2518:36;:5;2542:6;2550:3;2518:23;:36::i;:::-;2509:45;-1:-1:-1;2643:12:234;;2731:34;:5;2509:45;2761:3;2731:21;:34::i;:::-;2704:61;;-1:-1:-1;2704:61:234;;-1:-1:-1;2704:61:234;-1:-1:-1;2704:61:234;2860:141;;2896:5;;;;2860:141;2948:34;:5;2968:6;2976:5;2948:19;:34::i;:::-;2269:746;;2248:767;;11008:900:237;11125:16;;;;11310:4;11304:11;11082:16;;11125;11217:17;11365:4;11342:28;;11110:12;11408:218;11415:11;;11408:218;;11463:22;;;11448:38;;11565:4;11561:15;;;;11555:22;;11525:4;11513:17;;;;11610:1;11601:11;11408:218;;;11639:30;;11689:4;11682:20;11721:27;11646:17;11721:25;:27::i;:::-;-1:-1:-1;11848:17:237;11008:900;-1:-1:-1;;;11008:900:237:o;20185:1289:161:-;20549:427;;;;;;;;1089:1:239;20549:427:161;;;20752:27;20549:427;;;;20801:35;20549:427;;;;;;;20858:33;20249:12;20549:427;;;;;;;20913:45;20549:427;;;;20249:12;1089:1:239;;;20549:427:161;21249:142;21411:46;21441:15;21411:29;:46::i;:::-;21404:53;;;;;;20185:1289;:::o;21480:8154::-;21545:12;21593:73;21680:14;5538:2;21680:40;;21794:6;21777:23;;21827:125;:7308;;;;;;;;21977:13;21827:7308;;;;;;;;22041:39;21827:7308;;;;22134:39;21827:7308;;;;22225:39;21827:7308;;;;22317:51;21827:7308;;;;22425:39;21827:7308;;;;22520:39;21827:7308;;;;22623:39;21827:7308;;;;22722:51;21827:7308;;;;22833:51;21827:7308;;;;22948:39;21827:7308;;;;23052:39;21827:7308;;;;23141:39;21827:7308;;;;23230:39;21827:7308;;;;23338:39;21827:7308;;;;23447:39;21827:7308;;;;23558:39;21827:7308;;;;23658:39;21827:7308;;;;23759:39;21827:7308;;;;23862:39;21827:7308;;;;23972:39;21827:7308;;;;24072:39;21827:7308;;;;24170:39;21827:7308;;;;24267:39;21827:7308;;;;24360:39;21827:7308;;;;24454:39;21827:7308;;;;24554:39;21827:7308;;;;24642:39;21827:7308;;;;24730:39;21827:7308;;;;24825:39;21827:7308;;;;24916:39;21827:7308;;;;25009:39;21827:7308;;;;25099:39;21827:7308;;;;25196:39;21827:7308;;;;25305:39;21827:7308;;;;25392:39;21827:7308;;;;25484:39;21827:7308;;;;25578:39;21827:7308;;;;25684:39;21827:7308;;;;25787:39;21827:7308;;;;25885:39;21827:7308;;;;25981:39;21827:7308;;;;26077:39;21827:7308;;;;26175:39;21827:7308;;;;26263:39;21827:7308;;;;26351:39;21827:7308;;;;26440:39;21827:7308;;;;26528:39;21827:7308;;;;26614:39;21827:7308;;;;26702:39;21827:7308;;;;26791:39;21827:7308;;;;26881:39;21827:7308;;;;26970:39;21827:7308;;;;27057:39;21827:7308;;;;27150:39;21827:7308;;;;27238:39;21827:7308;;;;27325:39;21827:7308;;;;27414:39;21827:7308;;;;27504:39;21827:7308;;;;27592:39;21827:7308;;;;27680:39;21827:7308;;;;27768:39;21827:7308;;;;27856:39;21827:7308;;;;27946:39;21827:7308;;;;28039:34;21827:7308;;;;28139:39;21827:7308;;;;28240:33;21827:7308;;;;28326:34;21827:7308;;;;28426:39;21827:7308;;;;28526:33;21827:7308;;;;28617:39;21827:7308;;;;28706:39;21827:7308;;;;28794:39;21827:7308;;;;28893:48;21827:7308;;;;28990:39;21827:7308;;;;29078:39;21827:7308;;;;;29149:32;29257:13;29238:32;;5538:2;29412:15;:22;:49;29408:143;;29505:22;;29488:48;;;;;;;;5074:25:409;;;;5115:18;;;5108:34;;;5047:18;;29488:48:161;4900:248:409;19656:1084:229;19719:21;19742:16;19818:1;19798:5;:10;;;:17;:21;19794:813;;;19839:14;19871:24;:5;:10;;;1114:4:69;1104:15;;964:171;19871:24:229;19839:57;;19914:11;19943:27;:5;:10;;;2006:11:69;;1986:33;2000:4;1986:33;;1843:192;19943:27:229;19914:57;-1:-1:-1;19998:36:229;:5;20022:6;19914:57;19998:23;:36::i;:::-;19989:45;-1:-1:-1;20061:30:229;:5;19989:45;20087:3;20061:17;:30::i;:::-;20052:39;;20109:223;20125:3;20116:6;:12;20109:223;;;20161:36;:5;20185:6;20193:3;20161:23;:36::i;:::-;20152:45;-1:-1:-1;20228:27:229;:5;20152:45;20251:3;20228:14;:27::i;:::-;20219:36;-1:-1:-1;20286:27:229;:5;20219:36;20309:3;20286:14;:27::i;:::-;20277:36;;20109:223;;;20363:3;20353:6;:13;20349:86;;20397:19;;;;;;;;;;;;;;20349:86;20456:9;;;;1308:6:237;20456:34:229;:39;20452:141;;271:10:231;;;;340:28;;;;20526:48:229;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;20452:141:229;19821:786;;19794:813;20681:42;20701:21;:5;:19;:21::i;:::-;20681:5;;:19;:42::i;3476:314:232:-;3677:9;;;:27;;3690:14;3677:27;;;3577:7;3725:48;3743:6;3751:3;17004:76:230;3725:17:232;:48::i;:::-;3718:55;3476:314;-1:-1:-1;;;;3476:314:232:o;1013:2457::-;1243:9;;;:26;;1064:1:237;1243:26:232;;;1111:7;1606:1;1597:10;;:16;-1:-1:-1;1593:109:232;;;271:10:231;;;;340:28;;;;1656:30:232;1640:47;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;1593:109:232;1895:13;;1889:4;1885:24;18556:20:230;1940:39:232;;1936:138;;271:10:231;;;;340:28;;;;2006:53:232;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;1936:138:232;2282:1;2272:11;;;;2298:13;2333:905;2349:3;2340:6;:12;2333:905;;;2473:13;;2372:16;2465:22;2526:42;;;2522:676;;2819:14;;;2813:21;2807:4;2803:32;2882:35;;;2878:302;;-1:-1:-1;;;3077:8:232;;;;;3152:5;;2878:302;2570:628;2522:676;3215:8;;;;;2354:884;2333:905;;;3329:8;3324:102;;271:10:231;;;;340:28;;;;3380:30:232;135:249:231;3324:102:232;-1:-1:-1;3447:6:232;;1013:2457;-1:-1:-1;;;;1013:2457:232:o;2621:1887:239:-;2925:13;;2747:4;;;;;;;;3042:1;3027:13;;;3023:21;13889:131:230;3208:33:239;;3207:40;3203:1141;;3451:1;3436:13;;;3432:21;3646:51;3647:19;;;3646:51;3642:213;;1137:1;3721:32;;3642:213;;;1188:1;3800:36;;3642:213;3249:620;3203:1141;;;4067:42:230;3931:32:239;;3930:39;3926:418;;1238:1;3989:35;;3926:418;;;9458:41:230;4107:39:239;;4106:46;4102:242;;1291:1;4172:38;;4102:242;;;4312:5;4319:6;4327:1;4304:25;;;;;;;;;;;4102:242;-1:-1:-1;4363:13:239;;-1:-1:-1;4404:59:239;4444:5;4451:6;4459:3;4404:39;4444:5;4437;1781:20;;;;;;2144:1;2133:13;;;2106:42;;2100:49;2151:6;2096:62;;1535:662;4404:39;:59;;:::i;:::-;4386:77;;-1:-1:-1;4481:4:239;;-1:-1:-1;4386:77:239;;-1:-1:-1;4386:77:239;-1:-1:-1;;;2621:1887:239;;;;;;;;:::o;10265:655:237:-;10396:17;10376:38;;10372:124;;;271:10:231;;;;340:28;;;;10437:48:237;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;10372:124:237;10521:16;;;;;;10686:4;10680:11;;10734:4;10717:22;;10704:36;;;10753:25;;;10909:4;10894:19;10882:31;;;;10863:50;;;-1:-1:-1;10265:655:237:o;17261:643:74:-;17410:4;17403:5;17399:16;17609:4;17601:5;17595:12;17591:23;17584:5;17580:35;17365:523;17639:5;17633:4;17630:15;17365:523;;;17779:11;;17820:12;;17807:26;;17850:24;;17682:4;17672:15;;;;17713:16;;17365:523;;;17369:260;;17261:643;:::o;1486:2191:241:-;1581:7;;;;;1747:27;:5;1762:6;1770:3;1747:14;:27::i;:::-;1718:56;-1:-1:-1;1718:56:241;;-1:-1:-1;1718:56:241;-1:-1:-1;1809:17:241;;;1856:4;1844:16;;1840:1784;;;271:10:231;;;;340:28;;;;1887:52:241;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;1840:1784:241;1964:9;1977:1;1964:14;1960:1664;;271:10:231;;;;340:28;;;;2005:54:241;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;1960:1664:241;2096:1;2084:9;:13;2101:1;2084:18;2080:1544;;271:10:231;;;;340:28;;;;2129:53:241;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;2080:1544:241;2358:1;2349:6;:10;2340:19;;2377;2418:1192;2435:8;2425:6;:18;2418:1192;;2582:13;;2467:19;2574:22;;;;2721:1;:16;;;13889:131:230;2827:27:241;;:32;2823:648;;-1:-1:-1;2896:41:241;;;2823:648;;;15337:93:230;3017:31:241;;:36;3013:458;;-1:-1:-1;3090:46:241;;;3013:458;;;15509:93:230;3216:31:241;;:36;3212:259;;-1:-1:-1;3289:46:241;;;3212:259;;;271:10:231;;;;340:28;;;;3397:51:241;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;3212:259:241;3583:8;;;;;3502:21;;3493:30;;;;;-1:-1:-1;;3560:1:241;3545:16;2418:1192;;;2203:1421;-1:-1:-1;3646:6:241;-1:-1:-1;3654:5:241;;-1:-1:-1;;1486:2191:241;;;;;;;:::o;7855:3108:240:-;7978:7;;;;;;8189:6;8222:49;8189:6;8248:3;13889:131:230;8222:17:240;:49::i;:::-;8213:58;;8303:5;8293:6;:15;8289:118;;271:10:231;;;;340:28;;;;8339:49:240;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;8289:118:240;8435:35;:5;8456;8463:6;8435:20;:35::i;:::-;5342:13:229;;8424:46:240;;-1:-1:-1;5221:41:230;5358:1:229;8499:14:240;5334:22:229;;;;5330:30;;;5326:41;5319:49;5312:57;5295:15;;;5291:79;;-1:-1:-1;8583:11:240;;;8579:773;;8614:8;;;;;;8693:49;8614:8;8719:3;13889:131:230;8693:17:240;:49::i;:::-;8684:58;;8774:9;8764:6;:19;8760:126;;271:10:231;;;;340:28;;;;8814:53:240;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;8760:126:240;9060:6;9084:121;9107:17;;;5342:13:229;;5295:15;;-1:-1:-1;5358:1:229;5160:14;5334:22;;;;5330:30;;;;5404:41:230;5326::229;5319:49;5312:57;5291:79;9146:1:240;9091:56;9084:121;;9171:15;;9084:121;;;9235:46;:5;9256:9;9267:13;9235:20;:46::i;:::-;9312:25;;;;-1:-1:-1;9223:58:240;-1:-1:-1;8579:773:240;5342:13:229;;9366:14:240;;;;14082:29:230;5358:1:229;5334:22;;;5330:30;;;;5326:41;5319:49;5312:57;5295:15;;;5291:79;9432:50:240;9428:526;;9502:8;;;;5342:13:229;;9502:8:240;;5295:15:229;;;5160:14;5334:22;;;;5330:30;5125:41:230;5326::229;5319:49;5312:57;5291:79;9602:14:240;;;;9528:56;-1:-1:-1;9602:14:240;9685:49;9602:14;9711:3;13889:131:230;9685:17:240;:49::i;:::-;9676:58;;9766:6;9756;:16;9752:125;;271:10:231;;;;340:28;;;;9803:55:240;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;9752:125:240;9903:36;:5;9924:6;9932;9903:20;:36::i;:::-;9894:45;;9484:470;9428:526;10143:8;;10139:326;;10195:6;638:2;10179:22;10175:143;;;271:10:231;;;;340:28;;;;10264:30:240;10236:59;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;10175:143:240;10363:6;638:2;10347:22;10339:30;;10139:326;;;10440:6;638:2;10424:22;10416:30;;10139:326;10506:2;10497:5;:11;10493:111;;271:10:231;;;;340:28;;;;10558:30:240;10535:54;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;10493:111:240;10630:10;10622:5;:18;10618:123;;;271:10:231;;;;340:28;;;;10695:30:240;135:249:231;10618:123:240;8131:2620;;;10880:6;10943:10;10935:5;:18;;;;:::i;:::-;10928:26;;:2;:26;:::i;:::-;10915:40;;:9;:40;:::i;:::-;10900:11;10906:5;10900:2;:11;:::i;:::-;10888:24;;:8;:24;:::i;:::-;:67;;;;:::i;:::-;10872:84;;;;;;;;7855:3108;;;;;;:::o;3268:784:242:-;3390:7;;;;3513:30;:5;3531:6;3539:3;3513:17;:30::i;:::-;3745:22;;;3795:10;;3698:27;;;3818:19;;3478:65;;-1:-1:-1;3478:65:242;;-1:-1:-1;3478:65:242;;-1:-1:-1;3553:25:242;;3871:32;3745:22;4900:4:100;4893:12;;;4887:19;5071:37;5106:1;5098;278:20;4883:30;;;4675:12;4957:21;4947:32;;;5079:21;5075:29;5071:37;5067:42;5141:30;;496:9;5138:49;;4614:618;3871:32:242;3952:24;;;4003:6;;3952:24;;-1:-1:-1;;;;;;;3268:784:242:o;1478:1899:243:-;1832:8;;;;;1606:7;;1832:8;1976:85;1832:8;2002:3;1976:85;:17;:85::i;:::-;1967:94;-1:-1:-1;1967:94:243;2122:28;;;2118:133;;271:10:231;;;;340:28;;;;2177:59:243;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;2118:133:243;2310:33;:5;2331:6;2339:3;2310:20;:33::i;:::-;2301:42;-1:-1:-1;2301:42:243;2652:64;2301:42;2678:3;2652:64;:17;:64::i;:::-;2958:13;;2643:73;;-1:-1:-1;2643:73:243;;2974:1;2730:15;2950:22;;;2946:30;;9662:41:230;3016:43:243;;3015:50;;3011:163;;271:10:231;;;;340:28;;;;3096:59:243;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;3011:163:243;-1:-1:-1;3251:8:243;;;;;;3290:69;:5;3312:13;3327:11;3340:9;3351:7;3290:21;:69::i;1837:972:67:-;1910:12;2023:19;2055:3;:10;2068:1;2055:14;2045:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2045:25:67;;2023:47;;2147:6;2195:12;2191:17;2275:4;2270:3;2266:14;2342:4;2336:3;2330:10;2326:21;2317:7;2313:35;2401:4;2393:6;2389:17;2225:527;2437:4;2428:7;2425:17;2225:527;;;2608:19;;2717:14;;2699:33;;2672:25;;;2669:64;2648:86;;2489:4;2476:18;;;;2549:4;2531:23;2225:527;;;-1:-1:-1;2786:6:67;;1837:972;-1:-1:-1;;;;;;1837:972:67:o;6924:608:233:-;7005:15;7085:6;:13;7102:1;7085:18;7081:445;;-1:-1:-1;7191:4:233;7179:17;;7173:24;7264:95;7173:24;7341:16;7264:43;:95::i;7081:445::-;7394:6;:13;7411:1;7394:18;7390:136;;-1:-1:-1;7451:1:233;6924:608;;;:::o;7390:136::-;7491:24;;;;;;;;;;;;;;7390:136;6924:608;;;:::o;8362:754::-;8455:15;8535:6;:13;8552:1;8535:18;8531:579;;8681:4;8669:17;;8663:24;8727:4;8715:17;;8709:24;8764:63;8663:24;8811:15;8764:43;:63::i;:::-;8760:67;-1:-1:-1;8845:63:233;8889:1;8892:15;8845:43;:63::i;:::-;8956:1;8951:6;8946:12;;;;;-1:-1:-1;8531:579:233;;-1:-1:-1;8531:579:233;;8996:1;8980:6;:13;:17;8976:134;;;9020:17;;;;;;;;;;;;;;6312:213;6393:7;6416:6;:13;6433:1;6416:18;6412:75;;6457:19;;;;;;;;;;;;;;6412:75;-1:-1:-1;6516:1:233;;6312:213;-1:-1:-1;6312:213:233:o;9241:1223::-;9410:13;;9317:15;;9447:1;9437:11;;;;;:26;;;9462:1;9452:6;:11;;9437:26;9433:1025;;;9614:4;9602:17;;9596:24;9479:9;;9662:1;9652:11;;9648:187;;9753:4;9745:6;9741:17;9735:24;9730:29;;9648:187;;;9819:1;9815:5;;9648:187;9853:6;9863:1;9853:11;9849:187;;-1:-1:-1;9954:4:233;9942:17;;9936:24;9849:187;;;-1:-1:-1;10020:1:233;9849:187;10054:63;10098:1;10101:15;10054:43;:63::i;:::-;10050:67;;10135:49;10179:1;10182;10135:43;:49::i;:::-;10131:53;;10202:49;10246:1;10249;10202:43;:49::i;:::-;10198:53;;10310:1;10305;:6;;10299:1;10294;:6;;10289:1;:12;:23;10266:47;;9465:859;;;9433:1025;;;10334:6;10344:1;10334:11;10330:128;;10368:17;;;;;;;;;;;;;;10330:128;9334:1130;9241:1223;;;:::o;10546:920::-;10714:13;;10621:15;;10750:1;10741:10;;10737:723;;;10767:9;10790;10828:1;10818:6;:11;10814:187;;10919:4;10911:6;10907:17;10901:24;10896:29;;10814:187;;;10985:1;10981:5;;10814:187;11019:6;11029:1;11019:11;11015:187;;-1:-1:-1;11120:4:233;11108:17;;11102:24;11015:187;;;-1:-1:-1;11186:1:233;11015:187;11220:49;11264:1;11267;11220:43;:49::i;:::-;11216:53;;11287:49;11331:1;11334;11287:43;:49::i;:::-;11384:1;11379:6;11374:12;;;;;-1:-1:-1;10737:723:233;;-1:-1:-1;10737:723:233;6531:222;6621:7;6644:6;:13;6661:1;6644:18;6640:75;;6685:19;;;;;;;;;;;;;;6640:75;-1:-1:-1;6744:1:233;;6531:222;-1:-1:-1;6531:222:233:o;5392:2668:229:-;5487:7;5530:2487;5546:3;5537:6;:12;5530:2487;;;5760:13;;5569:12;;5776:1;5752:22;;;5748:30;16092:40:230;5818:27:229;;:31;5814:2189;;5938:9;;;;1064:1:237;5938:25:229;:29;5934:140;;271:10:231;;;;340:28;;;;6020:30:229;6002:49;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;5934:140:229;14339:425:230;6141:28:229;;:32;6137:715;;6218:44;6228:6;6236:3;16434:54:230;6218:9:229;:44::i;:::-;6201:61;;-1:-1:-1;6201:61:229;-1:-1:-1;6289:11:229;;6319:25;:5;6201:61;6319:19;:25::i;:::-;6288:56;;;;6539:6;6535:124;;;271:10:231;;;;340:28;;;;6584:48:229;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;6535:124:229;6175:506;;6137:715;;;6782:47;6800:1;6791:10;;6803:3;16434:54:230;6782:8:229;:47::i;:::-;6773:56;;6137:715;6988:15;;;:17;;;;;;;;;7027;;;:19;;;;;;;7138:9;;;:51;;7151:38;7138:51;;;5814:2189;;;17004:76:230;7218:23:229;;:28;7214:789;;7279:43;7297:1;7288:10;;7300:3;17004:76:230;7279:8:229;:43::i;:::-;7409:9;;;:27;;7422:14;7409:27;;;7270:52;-1:-1:-1;7214:789:229;;;6315:41:230;7465:30:229;;:35;7461:542;;-1:-1:-1;;7577:9:229;;;;;1308:6:237;7577:34:229;7615:14;7576:53;7564:65;;1064:1:237;7651:8:229;;;;;7681:5;;7461:542;5313:41:230;7737:25:229;;:30;7733:252;;271:10:231;;;;340:28;;;;7820:30:229;7802:49;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;7733:252:229;271:10:231;;;;340:28;;;;7931:30:229;135:249:231;7733:252:229;5551:2466;;5530:2487;;8120:11530;8215:7;8258:11349;8274:3;8265:6;:12;8258:11349;;;8488:13;;8297:12;;8504:1;8480:22;;;8476:30;14339:425:230;8546:26:229;;:30;8542:11051;;8662:9;;;;1064:1:237;8662:25:229;:29;8658:140;;271:10:231;;;;340:28;;;;8744:30:229;8726:49;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;8658:140:229;9004:6;9049:43;9004:6;9067:3;16434:54:230;9049:9:229;:43::i;:::-;9032:60;;;;;;;;9176:11;9189:19;9212:41;9236:5;:10;;;9248:4;9212:23;:41::i;:::-;9175:78;;;;9279:6;9275:5428;;;9322:31;:5;9341:6;9349:3;9322:18;:31::i;:::-;9313:40;-1:-1:-1;9379:15:229;9397:32;:5;9417:11;9397:19;:32::i;:::-;9379:50;-1:-1:-1;9455:42:229;:5;9476:11;9379:50;9455:20;:42::i;:::-;-1:-1:-1;9634:9:229;;;:30;;1104:6:237;9634:30:229;;;9275:5428;;;9809:26;:5;9830:4;9809:20;:26::i;:::-;9785:50;;-1:-1:-1;9785:50:229;-1:-1:-1;9861:4820:229;;;;9903:61;:5;446:1:91;9951:11:229;9903:20;:61::i;:::-;10138:17;:5;:15;:17::i;:::-;9861:4820;;;10294:15;10339:30;10661:29;;;2155:1;10758:44;;11344:31;:5;10661:6;11371:3;11344:18;:31::i;:::-;11335:40;;11573:5;:19;;;:26;11602:4;11573:33;11609:4;11573:40;11546:67;;;;11978:42;2155:1;11978:76;;12178:4;12172:11;12151:32;;12453:4;12428:23;12424:34;12405:17;12401:58;12395:4;12388:72;12783:10;12746:34;12727:17;12723:58;12716:78;12857:23;12838:17;12831:50;13096:17;13085:28;;13324:436;13402:20;2155:1;13530:31;:17;1114:4:69;1104:15;;964:171;13530:31:229;13515:125;13716:10;13324:27;:436::i;:::-;-1:-1:-1;;;13990:19:229;;;;:26;;14019:1;13990:30;;14054:282;;14191:62;14241:11;14191:34;:17;2006:11:69;;1986:33;2000:4;1986:33;;1843:192;14191:34:229;:49;4693:4:72;4689:16;4676:30;;;4528:218;14191:62:229;14291:11;14054:27;:282::i;:::-;-1:-1:-1;14397:45:229;:5;1266:4:91;14434:7:229;14397:20;:45::i;:::-;-1:-1:-1;;14624:9:229;;;:30;;1104:6:237;14624:30:229;;;9861:4820;-1:-1:-1;;;14725:9:229;;;:26;;1064:1:237;14725:26:229;;;8542:11051;;;14867:9;;;;1104:6:237;14867:29:229;:33;14863:4730;;4653:41:230;14928:23:229;;14955:1;14928:28;14924:139;;271:10:231;;;;340:28;;;;14991:49:229;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;14924:139:229;15729:4;15718:16;;15712:23;;15587:22;15704:32;15738:1;15700:40;;;;15765:41;16068:2;16051:14;:19;16047:96;;;16105:15;;;;;;;;;;;;;;16047:96;-1:-1:-1;16323:9:229;;;:49;;16336:36;16323:49;;;16164:8;;;;;14863:4730;;;4751:41:230;16401:24:229;;:28;16397:3196;;16453:19;16585:4;16578:5;16574:16;16568:23;16565:1;16560:32;16545:47;;16639:11;16654:1;16639:16;16635:130;;271:10:231;;;;340:28;;;;16690:52:229;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;16635:130:229;17272:19;;17227:4;17216:16;;17272:19;17216:16;17316:33;18010:11;18006:1;17993:11;17989:19;17985:37;17979:44;17976:1;17971:53;17789:11;17785:1;17772:11;17768:19;17764:37;17758:44;17752:4;17748:55;17745:1;17741:63;17374:676;;18093:17;:5;:15;:17::i;:::-;-1:-1:-1;18132:8:229;;;;;16397:3196;;;17004:76:230;18169:23:229;;:27;18165:1428;;18229:43;18247:1;18238:10;;18250:3;17004:76:230;18229:8:229;:43::i;:::-;18358:9;;;:27;;18371:14;18358:27;;;18220:52;-1:-1:-1;18165:1428:229;;;18113:89:230;18470:25:229;;:29;18466:1127;;18532:30;:5;18550:6;18558:3;18532:17;:30::i;:::-;18523:39;;18584:17;:5;:15;:17::i;:::-;18724:9;;;:26;;1064:1:237;18724:26:229;;;18466:1127;;;5034:41:230;18779:16:229;;:20;18775:818;;18823:21;:5;18837:6;18823:13;:21::i;:::-;-1:-1:-1;;18866:8:229;;;;;18896:5;;18775:818;6411:41:230;18980:16:229;;:20;18976:617;;19024:21;:5;19038:6;19024:13;:21::i;:::-;19067:17;:5;:15;:17::i;:::-;-1:-1:-1;;1157:6:237;19137:9:229;;;:23;19106:8;;;;;19182:5;;18976:617;5313:41:230;19361:25:229;;:30;19357:236;;271:10:231;;;;340:28;;;;19440:30:229;135:249:231;19357:236:229;271:10:231;;;;340:28;;;;19543:30:229;135:249:231;19357:236:229;8279:11328;;8258:11349;;34451:4282:237;34604:20;;;;35096:21;;35198:26;34522:21;;34604:20;34677:4;34659:22;;;;1024:4;35274:35;;35270:97;;35336:16;;;;;;;;;;;;;;35270:97;35536:4;35530:11;;-1:-1:-1;35696:4:237;35684:17;;35806:4;35791:20;;35381:14;35791:20;35684:17;35828:29;-1:-1:-1;35896:1:237;36142;36127:17;;36115:30;;;;;;;35884:14;36430:1;;;36488:916;36523:9;36515:6;36512:21;36488:916;;;36620:27;;;36649:6;36616:40;;36908:27;37183:31;37187:4;37183:31;;;;37180:56;;37174:4;37170:67;37265:32;;;37258:51;37347:39;;;36830:4;36826:17;;;36822:37;36803:57;;;;;36546:17;36488:916;;;-1:-1:-1;37447:21:237;;37444:41;37421:65;;;37539:38;;;37520:58;37543:23;37520:58;;;37503:76;;37733:41;;;37787:4;37729:52;37725:68;37719:4;37712:82;-1:-1:-1;38046:671:237;38070:12;38066:1;:16;38046:671;;;38325:1;38318:9;;38297:32;;38315:1;38297:32;38291:39;38332:6;38287:52;;;38377:34;;38449:20;;38511:4;38521;38517:20;;;38507:31;;38577:4;38573:20;;;;38569:33;;38637:65;38507:31;38377:34;38569:33;38637:27;:65::i;:::-;-1:-1:-1;;;38084:3:237;;38046:671;;;;34555:4172;;;;;;34451:4282;;;:::o;11051:727:238:-;11169:12;11183:16;11239:19;11261:33;11285:8;11261:23;:33::i;:::-;11239:55;;11313:19;11308:399;11348:11;11334;:25;11308:399;;;11456:14;11488:48;11514:8;11524:11;11488:25;:48::i;:::-;11540:1;11473:68;11456:85;;11559:11;11583:49;11610:8;11620:11;11583:26;:49::i;:::-;11635:1;11583:53;11573:6;:64;11559:78;;11655:37;11673:5;11680:6;11688:3;11655:17;:37::i;:::-;-1:-1:-1;;11361:13:238;;11308:399;;;;11728:8;11738:22;:5;:20;:22::i;:::-;11720:41;;;;;11051:727;;;;;;:::o;4629:346:229:-;4713:7;4827:109;4901:1;4894:4;4890:1;4880:6;4874:13;4871:1;4866:22;4862:30;4858:41;4855:48;4849:3;4841:6;4838:15;4834:70;4827:109;;;4929:1;4921:6;4917:14;4907:24;;4827:109;;;-1:-1:-1;4962:6:229;;4629:346;-1:-1:-1;;4629:346:229:o;538:645:241:-;651:7;;;;713:10;:6;722:1;713:10;:::i;:::-;692:31;-1:-1:-1;692:31:241;15659:65:230;934:169:241;1026:3;1016:8;1013:17;997:11;993:1;981:8;975:15;972:1;967:24;963:32;959:50;952:58;945:66;941:90;934:169;;;1083:1;1073:8;1069:16;1057:28;;934:169;;;-1:-1:-1;1145:10:241;;;;-1:-1:-1;1145:10:241;;-1:-1:-1;538:645:241;-1:-1:-1;;;;538:645:241:o;770:2890:240:-;870:7;1058:18;870:7;1162;;;870;1333:486;1350:5;1340:6;:15;;:32;;;;;1370:2;1359:8;:13;1340:32;1333:486;;;1684:13;;1768:10;;;;1796:8;;;;;1718:2;1714:17;1681:1;1676:22;;;;1672:40;;;1668:64;1657:76;1333:486;;;2035:5;2025:6;:15;2021:1596;;2189:13;;2082;2181:22;2177:40;;;2417:1;2409:9;;2405:431;;;271:10:231;;;;340:28;;;;2476:29:240;135:249:231;2405:431:240;2587:2;:14;;;2578:24;;2632:14;;;:22;-1:-1:-1;2628:145:240;;;271:10:231;;;;340:28;;;;2716:29:240;135:249:231;2628:145:240;2798:15;;;;;-1:-1:-1;2857:8:240;;;;;3048:537;3065:5;3055:6;:15;3048:537;;3295:13;;3164:23;3287:22;3391:18;3364:46;;3360:169;;271:10:231;;;;340:28;;;;3472:29:240;135:249:231;3360:169:240;-1:-1:-1;3554:8:240;;;;;3048:537;;;3638:5;770:2890;-1:-1:-1;;;;;;;770:2890:240:o;839:2082:242:-;961:7;;;1056:1;1047:10;;961:7;;1149:50;961:7;;1354:20;;;;;786:44:230;1434:25:242;;;1431:55;;;-1:-1:-1;1469:15:242;1431:55;1749:10;1743:17;1729:31;;1845:154;1915:14;1911:1;1898:10;1895:1;1890:19;1886:27;1882:48;1875:56;1868:64;1862:3;1859:1;1856:10;1852:81;1845:154;;;1975:1;1972;1968:9;1963:14;;1845:154;;;1849:2;;2038:1;2043:4;2038:9;2034:108;;271:10:231;;;;340:28;;;;2078:45:242;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;2034:108:242;2170:14;;;2305:15;;2170:14;;-1:-1:-1;2202:17:242;2297:24;4075:1:230;2573:14:242;;4067:42:230;2573:41:242;:46;;:65;;;2630:8;2623:3;:15;2573:65;2569:174;;;271:10:231;;;;340:28;;;;2669:55:242;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;2569:174:242;-1:-1:-1;2873:10:242;;2824:8;;-1:-1:-1;;2835:1:242;2824:12;;;-1:-1:-1;839:2082:242;;-1:-1:-1;;;;;;;839:2082:242:o;11784:1812:238:-;12450:4;12444:11;;12252:19;;;12186:27;;;12332:31;;;12493:32;;;12503:21;12493:32;;;12480:46;;;12332:1;12558:12;;;12551:36;;;12332:31;12612:24;;11983:7;;12676:15;;;12748:99;12200:13;12676:15;12186:27;12748;:99::i;:::-;12865:146;12927:9;12966:14;12952:11;:28;12983:10;12865:27;:146::i;:::-;-1:-1:-1;;;13056:16:238;;;;13086:411;13093:10;;13086:411;;13269:4;13265:16;;;13259:23;13350:49;;;;;13259:23;;13177:5;13123:22;;;;13350:25;;;;;;:49;;3405:44:94;;13394:4:238;;13350:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13318:81;;;;13421:7;13417:66;;;13459:5;-1:-1:-1;13452:12:238;;-1:-1:-1;;;;13452:12:238;13417:66;13105:392;;;13086:411;;;271:10:231;;;;340:28;;;;13541:37:238;13518:61;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;11320:276:105;11394:7;339:4:104;11417:1:105;:20;11413:80;;11457:25;11480:1;11457:22;:25::i;:::-;11453:29;;11413:80;11511:3;11507:1;:7;11503:68;;;11537:23;;;;;;;;5074:25:409;;;5115:18;;;5108:34;;;5047:18;;11537:23:105;4900:248:409;11503:68:105;-1:-1:-1;11588:1:105;;11320:276;-1:-1:-1;11320:276:105:o;3466:1064:229:-;3551:7;;;3641:1;3551:7;3720:12;;;3769:4;3757:16;;:35;;3783:9;3757:35;;;3776:4;3757:35;3750:42;;3682:125;3916:6;3910:13;3902:21;;4038:92;4100:4;4096:9;4092:1;4085:4;4082:1;4077:13;4073:21;4069:37;4062:45;4055:4;4052:1;4049:11;4045:63;4038:92;;;4123:1;4120;4116:9;4111:14;;4038:92;;;4343:14;;;;4251:4;4247:12;;;4261:1;4243:20;;4299:16;;;4288:28;;;;4384:95;;4440:22;;;;;;8314:19:409;;;8349:12;4440:22:229;;;;;;;;;;;;;;4424:40;;;;;;;;:::i;4384:95::-;-1:-1:-1;4500:6:229;;4508:4;;-1:-1:-1;3466:1064:229;-1:-1:-1;;;;3466:1064:229:o;361:950:235:-;446:11;459:13;526:27;541:5;548:4;526:14;:27::i;:::-;508:45;;-1:-1:-1;508:45:235;-1:-1:-1;508:45:235;567:728;;-1:-1:-1;688:16:235;;;;;782:4;776:11;;808:17;;;880:4;865:20;;;924:26;;;984:14;;971:28;;1135:15;;;;887;861:42;;;1226:4;1209:21;;;;;1194:37;:43;;;1175:62;;;361:950;1153:4;1135:22;;;1279:1;1263:17;;361:950::o;2315:2213:99:-;2785:1;2775:12;;;2825:13;;2391:4;;;;2991:22;2840:4;2821:24;;;;1125:4;2927:29;2915:42;;2991:22;;;;2775:12;;2915:42;2391:4;3097:1384;3113:3;3104:6;:12;3097:1384;;;3417:1;3405:14;;3456:13;3511:17;;;;3566:13;;3511:17;;3136;;;;3471:4;3452:24;3136:17;;3659:25;3452:24;3679:4;3659:13;:25::i;:::-;3623:61;;;;3706:11;3764:12;3720:41;3758:1;3748:7;:11;3735:9;:25;3720:14;:41::i;:::-;:56;207:1;4005:22;3990:38;;3984:45;;-1:-1:-1;;1020:8:99;3816:25;;;;-1:-1:-1;4135:26:99;;4116:45;;;-1:-1:-1;4112:355:99;;-1:-1:-1;4112:355:99;-1:-1:-1;4348:4:99;;-1:-1:-1;4285:2:99;4280:17;;-1:-1:-1;4340:20:99;;-1:-1:-1;;;;;4340:20:99;4112:355;4423:25;4438:9;4423:14;:25::i;:::-;4407:41;;;;3118:1363;;;3097:1384;;;-1:-1:-1;4502:5:99;;;;-1:-1:-1;2315:2213:99;-1:-1:-1;;;;;;2315:2213:99:o;1025:3985:233:-;1280:13;;1474:19;;;;1124:7;1542:24;;;1124:7;1296:1;1272:22;;;1268:30;;1656:27;;;1652:3328;;1747:8;;;:::i;:::-;1831:9;;;:27;;1844:14;1831:27;;;2031:13;;1747:8;;-1:-1:-1;1064:1:237;-1:-1:-1;2023:22:233;;;2019:30;;-1:-1:-1;;2137:2625:233;2153:3;2144:6;:12;2137:2625;;;2346:13;;2362:1;2343;2338:22;;;;2334:30;;-1:-1:-1;17004:76:230;2525:23:233;;:28;2521:2227;;2635:33;:5;2656:6;2664:3;2635:20;:33::i;:::-;2626:42;;2137:2625;;2521:2227;6714:41:230;2764:24:233;;:29;2760:1988;;2867:8;;;:::i;:::-;;;2907:4;2897:14;;2933:5;;2760:1988;1064:1:237;3047:5:233;:9;;;:25;3076:1;3047:30;3043:1705;;2173:1:237;3261::233;:26;3257:141;;271:10:231;;;;340:28;;;;3322:53:233;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;3257:141:233;3419:13;3472:31;:5;3491:6;3499:3;3472:18;:31::i;:::-;4148:4;4141:12;;;4112:43;;;4105:58;;;4363:9;;;:26;;1064:1:237;4363:26:233;;;3454:49;;-1:-1:-1;3454:49:233;-1:-1:-1;4411:3:233;4145:1;4411:3;:::i;:::-;;;3079:1354;2137:2625;;3043:1705;271:10:231;;;;340:28;;;;4698:30:233;4682:47;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;2137:2625:233;4780:7;4775:101;;271:10:231;;;;340:28;;;;4830:30:233;135:249:231;4775:101:233;-1:-1:-1;4932:24:233;;-1:-1:-1;4997:6:233;;1025:3985;-1:-1:-1;;;1025:3985:233:o;5595:711::-;5805:21;;;;6231:1;6216:17;;;6195:40;;;6189:47;6279:19;;;;5685:7;;6238:6;6185:60;;;;5805:21;6271:28;;6185:60;6271:28::i;24030:4361:237:-;24306:39;:5;:37;:39::i;:::-;24442:9;;;:39;;24455:26;24442:39;1308:6;24541:35;;;24873:4;24862:16;;24948:20;-1:-1:-1;24940:29:237;;;24917:57;;;;25069:21;;24917:57;;24971:1;25061:30;;;25057:38;24917:57;25033:63;-1:-1:-1;25216:21:237;;25310:26;;26225:4;26214:16;;26443:22;26286:396;25124:20;26435:31;;;26315:177;;26286:396;26785:22;;25310:26;;25460:6;25442:25;;;25216:21;;25660:59;25712:1;25700:14;;25660:59;;;;26286:396;26777:31;;26659:1;26773:39;26286:396;26748:65;26912:1;26908;26891:15;26887:23;26879:35;27172:24;;27248:26;;27276:11;27244:44;27241:67;;;27213:96;;27621:4;27606:19;;;27771:33;;;27606:198;27983:4;27974:13;;27963:25;;;27606:382;28045:41;;;27606:382;28269:4;28259:14;;;28255:120;;7758:4;7752:11;;7845:4;7841:33;;;1024:4;7819:56;;;7776:4;7748:22;;;7772:9;7744:38;7795:81;;;7902:26;;7889:40;;;8056:29;;8087:11;8052:47;8049:68;;8018:100;;28293:67;;28255:120;24136:4249;;;24030:4361;;;:::o;1379:1144:235:-;1553:16;;;;1604:20;;;;1465:11;1696:15;;;1762:4;1749:18;;;1465:11;;;;1739:29;;;;;1874:1;1867:4;1850:22;;1846:30;1972:26;;;1969:483;;;2050:6;2038:10;2034:23;2017:421;2074:3;2067:11;2017:421;;2247:10;2241:4;2237:21;2224:11;2221:38;2218:202;;2296:4;2286:14;;2361:6;2348:10;2342:4;2338:21;2334:34;2325:43;;2393:5;;2218:202;2116:10;;-1:-1:-1;2170:6:235;2154:23;;2017:421;;;2021:38;1969:483;2494:22;2471:20;;;;:45;;;;-1:-1:-1;1379:1144:235;;;;-1:-1:-1;1379:1144:235;-1:-1:-1;1379:1144:235:o;19342:636:237:-;19410:19;19518:4;19511:5;19507:16;19501:23;19498:1;19493:32;19478:47;;19548:11;19563:1;19548:16;19544:428;;19698:4;19687:16;;19753:24;;19580:25;19745:33;19780:1;19741:41;;;19687:16;19799:45;;19875:17;19896:4;19875:25;19871:91;;19927:20;;;;;;;;;;;;;;19544:428;19400:578;19342:636;:::o;1085:1360:70:-;1617:4;1609:6;1605:17;1676:1;1668:6;1664:14;1650:12;1646:33;1692:202;1716:3;1702:12;1699:21;1692:202;;;1872:19;;1851:41;;1773:4;1755:23;;;;1811;;;;1692:202;;;1696:2;1925:1;1918:9;1908:521;;2034:66;2030:1;2027;2023:9;2019:82;2370:4;2355:12;2349:19;2345:30;2313:4;2309:9;2294:12;2288:19;2284:35;2223:174;2189:12;2161:254;;1908:521;;1085:1360;;;:::o;3209:357::-;3386:6;3380:4;3376:17;3368:6;3364:30;3347:203;3408:3;3400:6;3397:15;3347:203;;;3534:13;;3519:29;;3453:4;3441:17;;;;3485;;;;3347:203;;21125:2899:237;21223:7;;;21362:34;:5;21384:6;21392:3;21362:21;:34::i;:::-;21327:69;;-1:-1:-1;21327:69:237;-1:-1:-1;21327:69:237;-1:-1:-1;21327:69:237;21486:108;;271:10:231;;;;340:28;;;;21548:30:237;135:249:231;21486:108:237;21660:11;21914:9;22556:33;22575:13;22556:18;:33::i;:::-;22533:20;;;;:56;:61;22529:519;;22632:22;;;;22658:4;22632:30;22680:354;22687:12;;;;;:23;;;22704:6;22703:7;22687:23;22680:354;;;22881:4;22868:18;;22862:25;22923:14;;22989:26;;;;-1:-1:-1;22734:3:237;;;;;22680:354;;;22596:452;22529:519;23462:22;;;;23487:6;23462:31;23511:99;642:1:91;23562:6:237;:46;;23593:15;23562:46;;;23589:1;23571:15;:19;23562:46;23511:5;;:99;:20;:99::i;:::-;23418:207;23901:6;23896:84;;23927:38;:5;23951:13;23927:23;:38::i;:::-;-1:-1:-1;24001:6:237;;21125:2899;-1:-1:-1;;;;;;21125:2899:237:o;13068:5966::-;13316:4;13305:16;;13299:23;13192:19;13291:32;13362:15;;13358:118;;271:10:231;;;;340:28;;;;13408:49:237;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;13358:118:237;13174:316;13692:39;:5;:37;:39::i;:::-;13967:9;;;;;1157:6;13967:37;1308:6;13921:125;;;13909:137;;;14084:17;;;;14227:15;;;;14104:4;14084:24;;;;14246:4;14227:23;;;;;14412:22;;;14411:31;14391:52;;13922:40;14951:20;;;14947:1351;;1157:6;14995:5;:9;;;:37;15036:1;14995:42;14991:673;;271:10:231;;;;340:28;;;;15068:50:237;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;14991:673:237;15399:32;;;15491:4;15471:24;;;15453:15;;;:42;15602:18;;;;15399:32;;-1:-1:-1;15602:43:237;;15419:12;15602:29;:43::i;:::-;15581:18;;;:64;14947:1351;;;15997:1;15979:15;:19;15975:323;;;16037:15;16022:12;:30;16018:266;;;271:10:231;;;;340:28;;;;16083:46:237;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;16018:266:237;16173:15;16158:12;:30;16154:130;;;271:10:231;;;;340:28;;;;16219:46:237;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;16154:130:237;16398:38;;;:1;:38;16491:4;16465;:22;;16464:31;;;16509:2453;16546:3;16537:6;:12;16509:2453;;;16611:17;;;;16788:4;16773:37;;;;16767:44;16611:27;;;16642:6;16610:38;;16585:22;16759:53;16864:1;16847:2067;16872:8;16867:1;:13;16847:2067;;17281:4;17264:14;:21;17289:4;17264:29;17260:230;;17412:21;;17406:4;17402:32;;17260:230;17632:21;;17726:18;;;;17629:1;17624:30;;;;;17726:32;;17624:30;17726:22;:32::i;:::-;17705:18;;;:53;18247:17;18267:13;;;:37;;;;;18284:15;18303:1;18284:20;18267:37;:56;;18322:1;18267:56;;;18307:12;18267:56;18370:18;;;;18247:76;;-1:-1:-1;18370:34:237;;18247:76;18370:23;:34::i;:::-;18349:18;;;:55;18526:4;18514:16;;;:35;;;18545:4;18534:8;:15;18514:35;18510:153;;;271:10:231;;;;340:28;;;;18588:48:237;;;;;;;;;4864:25:409;;4852:2;4837:18;;4718:177;18510:153:237;18797:8;18785:9;18782:1;18778:17;18775:31;18771:1;18755:14;18751:22;18743:64;-1:-1:-1;;18894:1:237;18876:19;;;;;16882:3;;16847:2067;;;-1:-1:-1;;18931:16:237;;;;;-1:-1:-1;16561:4:237;16551:14;16509:2453;;;-1:-1:-1;;;;19016:1:237;18996:21;18976:17;;;;:41;;;;-1:-1:-1;;13068:5966:237:o;28397:6048::-;28490:20;;;;28776:4;28765:16;;28759:23;28555:4;28537:22;;;;28465;28751:32;28785:1;28747:40;;28811:14;;;28807:5632;;28848:12;;;;;;;;;;;;;;28807:5632;29396:18;;;;29445:21;;29604:13;;29335:14;;29396:18;29445:21;29598:4;29594:24;29620:6;29590:37;29644:172;29665:11;29658:19;29644:172;;29775:13;;29714:11;;-1:-1:-1;29769:4:237;29765:24;29791:6;29761:37;29644:172;;;-1:-1:-1;30251:4:237;30245:11;30488:4;30477:16;;30593:20;;30245:11;;-1:-1:-1;30104:4:237;30092:17;;;30059:6;30217:1;;30419:19;;;;30545:1;;30585:29;;;30510:2893;30692:3;30689:1;30686:10;30510:2893;;;30984:1;30972:10;30968:18;30960:6;30956:31;30946:41;;31146:1;31132:11;31124:6;31120:24;31116:32;31308:362;31334:22;31318:14;31315:42;31308:362;;;31500:18;;31520:6;31496:31;31639:4;31622:22;;;-1:-1:-1;31496:31:237;31409:43;;31582:1;31308:362;;;-1:-1:-1;32071:1:237;32051:22;;32108:17;;;;32170:13;;32150:34;;32108:17;32224:22;;;;;32408:31;;32003:11;32519:433;32545:1;32529:14;32526:21;32519:433;;;32750:25;32744:4;32740:36;32778:6;32736:49;32834:25;;32814:46;;32921:4;32904:22;;;;32599;;;;;32519:433;;;33055:21;;33052:311;;33143:25;33137:4;33133:36;33171:6;33129:49;33227:25;;33207:46;;33334:1;33314:22;;33297:40;;;;33052:311;-1:-1:-1;;;30731:1:237;30771:21;;;30835:20;;30771:21;;30724:9;;;;;30832:1;30827:29;;30510:2893;;;-1:-1:-1;;;33477:22:237;;;-1:-1:-1;33657:1:237;33645:14;;;33776:25;;33862:14;;;;33858:22;;33852:4;33848:33;33845:51;;33803:15;33772:47;;;33744:174;33676:260;;;34066:9;34070:4;34042:22;;;34038:38;34032:4;34025:52;-1:-1:-1;34268:17:237;33878:1;34269:11;;;34268:17;:::i;:::-;34250:36;;34229:16;;;34220:4;34202:13;34239:6;34211:4;34202:13;:::i;:::-;34201:23;;34200:46;:87;34161:20;;;:126;34359:9;;;:36;;34372:23;34359:36;;;7758:4;7752:11;;1024:4;7776;7748:22;;;-1:-1:-1;7744:38:237;7795:81;;;7902:26;;;7889:40;;-1:-1:-1;8056:29:237;;8087:11;8052:47;8049:68;;8018:100;;8242:49;;;8301:15;;;:19;;;8330:15;;;:19;;;8359;;;:23;;;8392:19;;;:23;;;8425:17;;;:21;;;8569:16;;;:20;;;8599;;;:24;;;8633:18;;;:46;29321:5118;;;28455:5990;;;28397:6048;:::o;1993:365:95:-;2060:13;2089:8;:15;2108:1;2089:20;2085:59;;-1:-1:-1;2132:1:95;;1993:365;-1:-1:-1;1993:365:95:o;2085:59::-;-1:-1:-1;2335:4:95;2321:19;2315:26;2312:1;2307:35;;1993:365::o;10410:428::-;10500:15;10551:26;10584:21;10596:8;10584:11;:21::i;:::-;10608:1;10584:25;10580:1;:29;10551:58;;10623:14;10640:43;10661:8;10671:11;10640:20;:43::i;:::-;10755:44;;;;10751:57;;;10773:4;10751:57;;10410:428;-1:-1:-1;;;10410:428:95:o;11340:319::-;11431:16;11483:15;11501:36;11515:8;11525:11;11501:13;:36::i;:::-;11614:14;11611:1;11606:23;;11340:319;-1:-1:-1;;;;11340:319:95:o;6059:4986:238:-;6204:3;6195:6;:12;6188:4841;;;6345:13;;6397:40;6415:4;6397:22;;;:40;6393:3595;;6477:16;;;;6515:3455;6522:10;;6515:3455;;6560:22;6614:5;6560:62;;6728:5;6722:4;6718:16;6712:23;6703:32;;7234:17;7513:6;7496:14;7490:4;7486:25;7482:38;7474:46;;7664:24;7691:5;:22;;;7664:49;;8274:6;8256:16;8252:29;8249:1;8245:37;8092:14;8089:1;8084:23;7943:381;7897:4;7852:510;8423:4;8417;8413:15;8526:8;8520:4;8516:19;8512:24;8500:9;8494:16;8490:47;8482:6;8479:59;8468:9;8461:78;;;7768:801;8622:12;8636:24;8662:29;8723:9;:22;;;3405:44:94;8764:4:238;8723:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8621:148;;;;;;8799:7;8795:1153;;;8965:11;:18;8987:1;8965:23;8961:132;;9050:11;9031:31;;;;;;;;;;;:::i;8961:132::-;9523:4;9506:22;;9500:29;9250:18;9496:40;9484:9;9464:30;;9461:76;9365:210;;9235:12;9669:151;9689:12;:19;9685:1;:23;9669:151;;;9749:40;9773:12;9786:1;9773:15;;;;;;;;:::i;:::-;;;;;;;9749:5;:23;;:40;;;;:::i;:::-;9710:3;;9669:151;;;;9916:5;;;;;;;8795:1153;6534:3436;;;;;6515:3455;;;6439:3549;6393:3595;-1:-1:-1;10195:13:238;;10247:40;10265:4;10247:22;;;:40;10243:772;;10311:18;10574:6;10557:14;10551:4;10547:25;10543:38;10535:46;;10748:1;10744;10738:4;10734:12;10727:23;10927:1;10921:4;10917:12;10909:20;;10991:4;10979:17;;;;;;;;;;;:::i;10243:772::-;6222:4807;6219:1;6209:11;;;;6188:4841;;38739:1947:237;38875:22;;;;39034:4;39028:11;;38900:6;38875:31;;39084;;;39459:4;39438:26;;;39426:39;;39690:17;;;39677:31;;;39028:11;;38875:31;;38960:4;38934:30;;;;;39028:11;40107:563;40125:3;40117:6;40114:15;40107:563;;;40649:4;40636:18;;40630:25;40615:41;;40509:14;;40525:6;40505:27;;40207:17;;;;;40107:563;;;40111:2;;39000:1680;;38739:1947;;;:::o;10221:263:105:-;10287:7;339:4:104;10334:1:105;:19;:24;10330:98;;10385:28;;;;;;;;4864:25:409;;;4837:18;;10385:28:105;4718:177:409;10330:98:105;-1:-1:-1;339:4:104;10448:19:105;;;10221:263::o;1159:727:99:-;1233:14;1249;1324:4;1321:1;1314:15;1356:4;1350;1342:19;1397:4;1394:1;1384:18;1374:28;;1868:1;1859:6;1856:1;1851:15;1847:23;1837:33;;1159:727;;;;;:::o;1360:427:115:-;1409:7;1502:17;1497:1;:22;1493:63;;-1:-1:-1;1542:3:115;;1360:427;-1:-1:-1;1360:427:115:o;1493:63::-;-1:-1:-1;375:66:115;115;1600:1;1595:6;;;1594:19;1589:24;;;1655:1;1650:6;;;241:66;1649:19;;;1632:12;;1631:38;1698:1;1693:6;;;1688:12;1687:25;1179:66;1731:13;1749:3;1730:22;;1360:427::o;2203:412:239:-;2326:7;2335;2359:12;2373:17;2392:13;2409:35;2425:5;2432:6;2440:3;2409:15;:35::i;:::-;2358:86;;;;;;2458:7;2454:155;;;2489:9;;-1:-1:-1;2500:5:239;-1:-1:-1;2481:25:239;;-1:-1:-1;2481:25:239;12037:971:237;12127:23;12153:5;:21;;;12127:47;;12258:4;12251:5;12247:16;12314;12308:23;12305:1;12300:32;12479:1;12461:16;12457:24;12439:16;12435:47;12429:54;12426:1;12421:63;12411:581;;12530:22;;12697:4;12686:16;;12680:23;;12563:1;12554:6;12526:35;;;;12522:43;;;;12625:4;12621:21;12600:43;;12822:4;12849:1;12770:2;12765:21;;;12743:44;;12828:23;12818:34;12900:23;12884:40;;;12941:37;;12411:581;;12209:793;12037:971;:::o;19984:132::-;20050:13;20097:11;20105:3;20097:5;:11;:::i;:::-;20090:1;20082:27;;;19984:132;-1:-1:-1;;19984:132:237:o;20246:873::-;20408:22;;;;;20551:4;20545:11;;20586:18;;;20573:32;;;20434:4;20408:30;;;20691:24;;;20797:4;20784:18;;20777:33;;;20940:22;;20975:1;20965:6;20940:31;;;20939:37;20981:15;;;;20938:59;;;;20913:84;;;21077:25;20804:5;21077:18;:25::i;:::-;21053:20;;;;:49;;;;;;;;-1:-1:-1;;;20246:873:237:o;393:394:236:-;474:17;537:15;:7;550:1;537:12;:15::i;:::-;527:25;-1:-1:-1;;736:16:236;700:52;;626:4;621:1;584:38;;;583:47;;;;644:11;;757;;699:70;393:394;;;;:::o;1337:375::-;1411:17;1518:4;1482:40;;1540:11;;;1536:78;;;1578:21;;;;;;;;;;;;;;1536:78;-1:-1:-1;;1657:37:236;;;1337:375::o;793:538::-;868:17;975:4;939:40;;;1140:12;;;1048:1;1011:38;;;1010:47;1122:4;1085:41;;;1170:13;;;1166:65;;;-1:-1:-1;1209:7:236;1166:65;1308:4;1301:3;:11;;1295:1;1285:6;:11;;1274:7;:23;:39;1244:70;;;;;793:538;;;;:::o;9231:572:95:-;9328:14;9440:21;9452:8;9440:11;:21::i;:::-;9425:11;:36;9421:119;;9507:11;9520:8;9484:45;;;;;;;;;;;;:::i;9421:119::-;-1:-1:-1;9774:1:95;9757:19;9735:42;9753:1;9735:42;9729:49;9780:6;9725:62;;9231:572::o;-1:-1:-1:-;;;:::i;:::-;:::o;14:332:409:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:66;223:5;219:78;212:5;209:89;199:117;;312:1;309;302:12;543:184;595:77;592:1;585:88;692:4;689:1;682:15;716:4;713:1;706:15;732:334;803:2;797:9;859:2;849:13;;864:66;845:86;833:99;;962:18;947:34;;983:22;;;944:62;941:88;;;1009:18;;:::i;:::-;1045:2;1038:22;732:334;;-1:-1:-1;732:334:409:o;1071:245::-;1119:4;1152:18;1144:6;1141:30;1138:56;;;1174:18;;:::i;:::-;-1:-1:-1;1231:2:409;1219:15;1236:66;1215:88;1305:4;1211:99;;1071:245::o;1321:671::-;1389:6;1442:2;1430:9;1421:7;1417:23;1413:32;1410:52;;;1458:1;1455;1448:12;1410:52;1498:9;1485:23;1531:18;1523:6;1520:30;1517:50;;;1563:1;1560;1553:12;1517:50;1586:22;;1639:4;1631:13;;1627:27;-1:-1:-1;1617:55:409;;1668:1;1665;1658:12;1617:55;1704:2;1691:16;1729:48;1745:31;1773:2;1745:31;:::i;:::-;1729:48;:::i;:::-;1800:2;1793:5;1786:17;1840:7;1835:2;1830;1826;1822:11;1818:20;1815:33;1812:53;;;1861:1;1858;1851:12;1812:53;1916:2;1911;1907;1903:11;1898:2;1891:5;1887:14;1874:45;1960:1;1939:14;;;1955:2;1935:23;1928:34;;;;1943:5;1321:671;-1:-1:-1;;;;1321:671:409:o;1997:778::-;2172:2;2183:21;;;2274:13;;2303:18;;;2296:30;;;2375:19;;2242:2;2227:18;;2403:22;;;2143:4;;2172:2;2482:21;;;2143:4;;2456:2;2441:18;;;2531:218;2545:6;2542:1;2539:13;2531:218;;;2610:13;;2625:42;2606:62;2594:75;;2724:15;;;;2567:1;2560:9;;;;;2689:12;;;;2531:218;;;-1:-1:-1;2766:3:409;1997:778;-1:-1:-1;;;;;;1997:778:409:o;2780:250::-;2865:1;2875:113;2889:6;2886:1;2883:13;2875:113;;;2965:11;;;2959:18;2946:11;;;2939:39;2911:2;2904:10;2875:113;;;-1:-1:-1;;3022:1:409;3004:16;;2997:27;2780:250::o;3035:329::-;3076:3;3114:5;3108:12;3141:6;3136:3;3129:19;3157:76;3226:6;3219:4;3214:3;3210:14;3203:4;3196:5;3192:16;3157:76;:::i;:::-;3278:2;3266:15;3283:66;3262:88;3253:98;;;;3353:4;3249:109;;3035:329;-1:-1:-1;;3035:329:409:o;3369:217::-;3516:2;3505:9;3498:21;3479:4;3536:44;3576:2;3565:9;3561:18;3553:6;3536:44;:::i;3591:760::-;3816:2;3805:9;3798:21;3779:4;3842:44;3882:2;3871:9;3867:18;3859:6;3842:44;:::i;:::-;3943:22;;;3905:2;3923:18;;;3916:50;;;;4015:13;;4037:22;;;4113:15;;;;4075;;;4146:1;4156:169;4170:6;4167:1;4164:13;4156:169;;;4231:13;;4219:26;;4300:15;;;;4265:12;;;;4192:1;4185:9;4156:169;;;-1:-1:-1;4342:3:409;;3591:760;-1:-1:-1;;;;;;;3591:760:409:o;4356:357::-;4474:12;;4521:4;4510:16;;;4504:23;;4474:12;4539:16;;4536:171;;;4629:66;4613:4;4609:17;;;;4606:1;4602:25;4598:98;4587:110;;4356:357;-1:-1:-1;4356:357:409:o;5342:184::-;5394:77;5391:1;5384:88;5491:4;5488:1;5481:15;5515:4;5512:1;5505:15;5531:128;5598:9;;;5619:11;;;5616:37;;;5633:18;;:::i;5664:476::-;5753:1;5790:5;5753:1;5804:330;5825:7;5815:8;5812:21;5804:330;;;5944:4;5876:66;5872:77;5866:4;5863:87;5860:113;;;5953:18;;:::i;:::-;6003:7;5993:8;5989:22;5986:55;;;6023:16;;;;5986:55;6102:22;;;;6062:15;;;;5804:330;;;5808:3;5664:476;;;;;:::o;6145:866::-;6194:5;6224:8;6214:80;;-1:-1:-1;6265:1:409;6279:5;;6214:80;6313:4;6303:76;;-1:-1:-1;6350:1:409;6364:5;;6303:76;6395:4;6413:1;6408:59;;;;6481:1;6476:130;;;;6388:218;;6408:59;6438:1;6429:10;;6452:5;;;6476:130;6513:3;6503:8;6500:17;6497:43;;;6520:18;;:::i;:::-;-1:-1:-1;;6576:1:409;6562:16;;6591:5;;6388:218;;6690:2;6680:8;6677:16;6671:3;6665:4;6662:13;6658:36;6652:2;6642:8;6639:16;6634:2;6628:4;6625:12;6621:35;6618:77;6615:159;;;-1:-1:-1;6727:19:409;;;6759:5;;6615:159;6806:34;6831:8;6825:4;6806:34;:::i;:::-;6936:6;6868:66;6864:79;6855:7;6852:92;6849:118;;;6947:18;;:::i;:::-;6985:20;;6145:866;-1:-1:-1;;;6145:866:409:o;7016:131::-;7076:5;7105:36;7132:8;7126:4;7105:36;:::i;7152:168::-;7225:9;;;7256;;7273:15;;;7267:22;;7253:37;7243:71;;7294:18;;:::i;7325:125::-;7390:9;;;7411:10;;;7408:36;;;7424:18;;:::i;7455:288::-;7630:6;7619:9;7612:25;7673:2;7668;7657:9;7653:18;7646:30;7593:4;7693:44;7733:2;7722:9;7718:18;7710:6;7693:44;:::i;7748:164::-;7824:13;;7873;;7866:21;7856:32;;7846:60;;7902:1;7899;7892:12;7917:263;7993:6;8001;8054:2;8042:9;8033:7;8029:23;8025:32;8022:52;;;8070:1;8067;8060:12;8022:52;8093:37;8120:9;8093:37;:::i;:::-;8083:47;;8170:2;8159:9;8155:18;8149:25;8139:35;;7917:263;;;;;:::o;8596:195::-;8635:3;8666:66;8659:5;8656:77;8653:103;;8736:18;;:::i;:::-;-1:-1:-1;8783:1:409;8772:13;;8596:195::o;8796:1529::-;8915:6;8923;8931;8984:2;8972:9;8963:7;8959:23;8955:32;8952:52;;;9000:1;8997;8990:12;8952:52;9023:37;9050:9;9023:37;:::i;:::-;9013:47;;9079:2;9125;9114:9;9110:18;9104:25;9148:18;9189:2;9181:6;9178:14;9175:34;;;9205:1;9202;9195:12;9175:34;9243:6;9232:9;9228:22;9218:32;;9288:7;9281:4;9277:2;9273:13;9269:27;9259:55;;9310:1;9307;9300:12;9259:55;9339:2;9333:9;9364:48;9380:31;9408:2;9380:31;:::i;9364:48::-;9435:2;9428:5;9421:17;9475:7;9470:2;9465;9461;9457:11;9453:20;9450:33;9447:53;;;9496:1;9493;9486:12;9447:53;9509:67;9573:2;9568;9561:5;9557:14;9552:2;9548;9544:11;9509:67;:::i;:::-;9646:2;9631:18;;9625:25;9595:5;;-1:-1:-1;9625:25:409;-1:-1:-1;;9662:16:409;;;9659:36;;;9691:1;9688;9681:12;9659:36;9729:8;9718:9;9714:24;9704:34;;9776:7;9769:4;9765:2;9761:13;9757:27;9747:55;;9798:1;9795;9788:12;9747:55;9827:2;9821:9;9849:2;9845;9842:10;9839:36;;;9855:18;;:::i;:::-;9901:2;9898:1;9894:10;9884:20;;9924:28;9948:2;9944;9940:11;9924:28;:::i;:::-;9986:15;;;10056:11;;;10052:20;;;10017:12;;;;10084:19;;;10081:39;;;10116:1;10113;10106:12;10081:39;10140:11;;;;10160:135;10176:6;10171:3;10168:15;10160:135;;;10242:10;;10230:23;;10193:12;;;;10273;;;;10160:135;;;10314:5;10304:15;;;;;;;;8796:1529;;;;;:::o;10330:184::-;10382:77;10379:1;10372:88;10479:4;10476:1;10469:15;10503:4;10500:1;10493:15;10519:266;10551:1;10577;10567:189;;10612:77;10609:1;10602:88;10713:4;10710:1;10703:15;10741:4;10738:1;10731:15;10567:189;-1:-1:-1;10770:9:409;;10519:266::o;11083:184::-;11135:77;11132:1;11125:88;11232:4;11229:1;11222:15;11256:4;11253:1;11246:15","linkReferences":{}}} \ No newline at end of file diff --git a/test/cli.test.js b/test/cli.test.js index 56f5278c..dc9f4c62 100644 --- a/test/cli.test.js +++ b/test/cli.test.js @@ -56,6 +56,8 @@ describe("Test cli", async function () { it("test cli startup", async function () { process.env.CLI_STARTUP_TEST = true; + const deployer = "0xE7116BC05C8afe25e5B54b813A74F916B5D42aB1"; + try { await startup(["", ""]); assert.fail("expected to fail, but resolved"); @@ -170,6 +172,54 @@ describe("Test cli", async function () { assert.equal(error, expected); } + try { + await startup([ + "", + "", + "--key", + `0x${"0".repeat(64)}`, + "--rpc", + "some-rpc", + "--arb-address", + `0x${"0".repeat(64)}`, + "--orderbook-address", + `0x${"0".repeat(64)}`, + "--pool-update-interval", + "10", + "--bot-min-balance", + "12", + ]); + assert.fail("expected to fail, but resolved"); + } catch (error) { + const expected = "undefined dispair address"; + assert.equal(error, expected); + } + + try { + await startup([ + "", + "", + "--key", + `0x${"1".repeat(64)}`, + "--rpc", + "https://rpc.ankr.com/polygon", + "--arb-address", + `0x${"1".repeat(40)}`, + "--orderbook-address", + `0x${"2".repeat(40)}`, + "--pool-update-interval", + "10", + "--bot-min-balance", + "12", + "--dispair", + "0x783b82f0fBF6743882072AE2393B108F5938898B", + ]); + assert.fail("expected to fail, but resolved"); + } catch (error) { + const expected = "failed to get dispair interpreter address"; + assert.equal(error, expected); + } + const result = await startup([ "", "", @@ -192,6 +242,8 @@ describe("Test cli", async function () { "--quote-gas", "7777", "--rp-only", + "--dispair", + deployer, ]); const expected = { roundGap: 10000, @@ -204,8 +256,8 @@ describe("Test cli", async function () { route: "single", rpcRecords: { "https://rpc.ankr.com/polygon/": { - req: 2, - success: 2, + req: 4, + success: 4, failure: 0, cache: {}, }, @@ -215,6 +267,11 @@ describe("Test cli", async function () { txGas: "123456789", quoteGas: 7777n, rpOnly: true, + dispair: { + interpreter: "0xC1A14cE2fd58A3A2f99deCb8eDd866204eE07f8D", + store: "0xFA4989F5D49197FD9673cE4B7Fe2A045A0F2f9c8", + deployer, + }, }, options: { botMinBalance: "0.123", @@ -223,6 +280,7 @@ describe("Test cli", async function () { txGas: "123456789", quoteGas: 7777n, rpOnly: true, + dispair: deployer, }, }; await sleep(1000); @@ -244,5 +302,7 @@ describe("Test cli", async function () { assert.equal(result.config.quoteGas, expected.config.quoteGas); assert.equal(result.options.rpOnly, expected.options.rpOnly); assert.equal(result.config.rpOnly, expected.config.rpOnly); + assert.deepEqual(result.options.dispair, expected.options.dispair); + assert.deepEqual(result.config.dispair, expected.config.dispair); }); }); diff --git a/test/data.js b/test/data.js index aa692c14..9519cc69 100644 --- a/test/data.js +++ b/test/data.js @@ -67,6 +67,11 @@ const config = { }, gasPriceMultiplier: 107, gasLimitMultiplier: 100, + dispair: { + interpreter: hexlify(randomBytes(20)), + store: hexlify(randomBytes(20)), + deployer: hexlify(randomBytes(20)), + }, }; const vaultBalance1 = BigNumber.from("10000000000000000000"); diff --git a/test/e2e/e2e.test.js b/test/e2e/e2e.test.js index 35fa64bf..89653ae7 100644 --- a/test/e2e/e2e.test.js +++ b/test/e2e/e2e.test.js @@ -30,6 +30,8 @@ const { deployOrderBookNPE2, rainterpreterNPE2Deploy, rainterpreterStoreNPE2Deploy, + rainterpreterParserNPE2Deploy, + rainterpreterExpressionDeployerNPE2Deploy, } = require("../utils"); // run tests on each network in the provided data @@ -116,6 +118,12 @@ for (let i = 0; i < testData.length; i++) { // deploy contracts const interpreter = await rainterpreterNPE2Deploy(); const store = await rainterpreterStoreNPE2Deploy(); + const parser = await rainterpreterParserNPE2Deploy(); + const deployer = await rainterpreterExpressionDeployerNPE2Deploy({ + interpreter: interpreter.address, + store: store.address, + parser: parser.address, + }); const orderbook = !orderbookAddress ? await deployOrderBookNPE2() : await ethers.getContractAt(orderbookAbi, orderbookAddress); @@ -258,6 +266,11 @@ for (let i = 0; i < testData.length; i++) { config.quoteRpc = [mockServer.url + "/rpc"]; config.gasPriceMultiplier = 107; config.gasLimitMultiplier = 100; + config.dispair = { + interpreter: interpreter.address, + store: store.address, + deployer: deployer.address, + }; orders = prepareOrdersForRound( await getOrderbookOwnersProfileMapFromSg(orders, viemClient, []), false, @@ -383,6 +396,12 @@ for (let i = 0; i < testData.length; i++) { // deploy contracts const interpreter = await rainterpreterNPE2Deploy(); const store = await rainterpreterStoreNPE2Deploy(); + const parser = await rainterpreterParserNPE2Deploy(); + const deployer = await rainterpreterExpressionDeployerNPE2Deploy({ + interpreter: interpreter.address, + store: store.address, + parser: parser.address, + }); const orderbook1 = !orderbookAddress ? await deployOrderBookNPE2() : await ethers.getContractAt(orderbookAbi, orderbookAddress); @@ -578,6 +597,11 @@ for (let i = 0; i < testData.length; i++) { config.quoteRpc = [mockServer.url + "/rpc"]; config.gasPriceMultiplier = 107; config.gasLimitMultiplier = 100; + config.dispair = { + interpreter: interpreter.address, + store: store.address, + deployer: deployer.address, + }; orders = prepareOrdersForRound( await getOrderbookOwnersProfileMapFromSg(orders, viemClient, []), false, @@ -733,6 +757,12 @@ for (let i = 0; i < testData.length; i++) { // deploy contracts const interpreter = await rainterpreterNPE2Deploy(); const store = await rainterpreterStoreNPE2Deploy(); + const parser = await rainterpreterParserNPE2Deploy(); + const deployer = await rainterpreterExpressionDeployerNPE2Deploy({ + interpreter: interpreter.address, + store: store.address, + parser: parser.address, + }); const orderbook = !orderbookAddress ? await deployOrderBookNPE2() : await ethers.getContractAt(orderbookAbi, orderbookAddress); @@ -940,6 +970,11 @@ for (let i = 0; i < testData.length; i++) { config.quoteRpc = [mockServer.url + "/rpc"]; config.gasPriceMultiplier = 107; config.gasLimitMultiplier = 100; + config.dispair = { + interpreter: interpreter.address, + store: store.address, + deployer: deployer.address, + }; orders = prepareOrdersForRound( await getOrderbookOwnersProfileMapFromSg(orders, viemClient, []), false, diff --git a/test/findOpp.test.js b/test/findOpp.test.js index a6d8fd7b..b1b82feb 100644 --- a/test/findOpp.test.js +++ b/test/findOpp.test.js @@ -8,7 +8,11 @@ const { ethers, utils: { formatUnits }, } = require("ethers"); -const { getBountyEnsureBytecode, getWithdrawEnsureBytecode } = require("../src/config"); +const { + parseRainlang, + getBountyEnsureRainlang, + getWithdrawEnsureRainlang, +} = require("../src/task"); // mocking signer and dataFetcher let signer = {}; @@ -16,7 +20,10 @@ let dataFetcher = {}; const viemClient = { getBlockNumber: async () => BigInt(oppBlockNumber), call: async () => ({ data: ethers.BigNumber.from("1000000000000000000").toHexString() }), - readContract: async () => 1000000000000000000n, + readContract: async (arg) => { + if (arg.functionName === "parse2") return "0x1234"; + else return 1000000000000000000n; + }, }; const oppBlockNumber = 123456; @@ -41,6 +48,7 @@ const { orderbook, getAmountOut, } = testData; +config.viemClient = viemClient; const gasPrice = _gasPrice.toBigInt(); describe("Test find opp", async function () { @@ -84,13 +92,17 @@ describe("Test find opp", async function () { }; const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(inputToEthPrice), - ethers.constants.Zero, - gasLimitEstimation.mul(gasPrice), - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(inputToEthPrice), + ethers.constants.Zero, + gasLimitEstimation.mul(gasPrice), + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -181,13 +193,17 @@ describe("Test find opp", async function () { }; const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - gasLimitEstimation.mul(gasPrice), - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + gasLimitEstimation.mul(gasPrice), + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -251,18 +267,22 @@ describe("Test find opp", async function () { }); const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getWithdrawEnsureBytecode( - signer.account.address, - orderPairObject.buyToken, - orderPairObject.sellToken, - inputBalance, - outputBalance, - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - gasLimitEstimation.mul(gasPrice), - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getWithdrawEnsureRainlang( + signer.account.address, + orderPairObject.buyToken, + orderPairObject.sellToken, + inputBalance, + outputBalance, + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + gasLimitEstimation.mul(gasPrice), + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -323,7 +343,7 @@ describe("Test find opp", async function () { assert.deepEqual(result, expected); }); - it.only("should NOT find opp", async function () { + it("should NOT find opp", async function () { const err = ethers.errors.UNPREDICTABLE_GAS_LIMIT; signer.estimateGas = async () => { return Promise.reject(err); @@ -358,14 +378,17 @@ describe("Test find opp", async function () { }; const task = { evaluable: { - interpreter: - orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(inputToEthPrice), - ethers.constants.Zero, - ethers.constants.Zero, - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(inputToEthPrice), + ethers.constants.Zero, + ethers.constants.Zero, + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -415,14 +438,17 @@ describe("Test find opp", async function () { }; const task2 = { evaluable: { - interpreter: - orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - ethers.constants.Zero, - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + ethers.constants.Zero, + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], diff --git a/test/mode-interOrderbook.test.js b/test/mode-interOrderbook.test.js index 64c57662..807ce906 100644 --- a/test/mode-interOrderbook.test.js +++ b/test/mode-interOrderbook.test.js @@ -4,13 +4,14 @@ const { ethers } = require("ethers"); const { orderbookAbi } = require("../src/abis"); const { errorSnapshot } = require("../src/error"); const { estimateProfit } = require("../src/utils"); -const { getBountyEnsureBytecode } = require("../src/config"); const { dryrun, findOpp } = require("../src/modes/interOrderbook"); +const { getBountyEnsureRainlang, parseRainlang } = require("../src/task"); // mocking signer and dataFetcher let signer = {}; const viemClient = { getBlockNumber: async () => BigInt(oppBlockNumber), + readContract: async () => "0x1234", }; const oppBlockNumber = 123456; @@ -27,6 +28,7 @@ const { orderbooksOrders, opposingOrderbookAddress, } = testData; +config.viemClient = viemClient; describe("Test inter-orderbook dryrun", async function () { beforeEach(() => { @@ -79,13 +81,17 @@ describe("Test inter-orderbook dryrun", async function () { }; const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - gasLimitEstimation.mul(gasPrice), - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + gasLimitEstimation.mul(gasPrice), + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -214,13 +220,17 @@ describe("Test inter-orderbook find opp", async function () { }; const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - gasLimitEstimation.mul(gasPrice), - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + gasLimitEstimation.mul(gasPrice), + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -309,14 +319,17 @@ describe("Test inter-orderbook find opp", async function () { }; const task = { evaluable: { - interpreter: - orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - ethers.constants.Zero, - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + ethers.constants.Zero, + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], diff --git a/test/mode-intraOrderbook.test.js b/test/mode-intraOrderbook.test.js index d6186899..b2a8c9c9 100644 --- a/test/mode-intraOrderbook.test.js +++ b/test/mode-intraOrderbook.test.js @@ -3,15 +3,18 @@ const testData = require("./data"); const { ethers } = require("ethers"); const { errorSnapshot } = require("../src/error"); const { clone, estimateProfit } = require("../src/utils"); -const { getWithdrawEnsureBytecode } = require("../src/config"); const { dryrun, findOpp } = require("../src/modes/intraOrderbook"); +const { getWithdrawEnsureRainlang, parseRainlang } = require("../src/task"); // mocking signer and dataFetcher let signer = {}; const viemClient = { getBlockNumber: async () => BigInt(oppBlockNumber), call: async () => ({ data: ethers.BigNumber.from("1000000000000000000").toHexString() }), - readContract: async () => 1000000000000000000n, + readContract: async (arg) => { + if (arg.functionName === "parse2") return "0x1234"; + else return 1000000000000000000n; + }, }; const oppBlockNumber = 123456; @@ -27,6 +30,7 @@ const { } = testData; const orderbooksOrders = clone(orderbooksOrdersTemp); orderbooksOrders[0][0].orderbook = orderPairObject.orderbook; +config.viemClient = viemClient; describe("Test intra-orderbook dryrun", async function () { beforeEach(() => { @@ -55,18 +59,22 @@ describe("Test intra-orderbook dryrun", async function () { }); const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getWithdrawEnsureBytecode( - signer.account.address, - orderPairObject.buyToken, - orderPairObject.sellToken, - inputBalance, - outputBalance, - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - gasLimitEstimation.mul(gasPrice), - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getWithdrawEnsureRainlang( + signer.account.address, + orderPairObject.buyToken, + orderPairObject.sellToken, + inputBalance, + outputBalance, + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + gasLimitEstimation.mul(gasPrice), + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -187,18 +195,22 @@ describe("Test intra-orderbook find opp", async function () { }); const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getWithdrawEnsureBytecode( - signer.account.address, - orderPairObject.buyToken, - orderPairObject.sellToken, - balance2, - balance, - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - gasLimitEstimation.mul(gasPrice), - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getWithdrawEnsureRainlang( + signer.account.address, + orderPairObject.buyToken, + orderPairObject.sellToken, + balance2, + balance, + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + gasLimitEstimation.mul(gasPrice), + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -288,19 +300,22 @@ describe("Test intra-orderbook find opp", async function () { [ { evaluable: { - interpreter: - orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getWithdrawEnsureBytecode( - signer.account.address, - orderPairObject.buyToken, - orderPairObject.sellToken, - balance2, - balance, - ethers.utils.parseUnits(inputToEthPrice), - ethers.utils.parseUnits(outputToEthPrice), - ethers.constants.Zero, - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getWithdrawEnsureRainlang( + signer.account.address, + orderPairObject.buyToken, + orderPairObject.sellToken, + balance2, + balance, + ethers.utils.parseUnits(inputToEthPrice), + ethers.utils.parseUnits(outputToEthPrice), + ethers.constants.Zero, + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], diff --git a/test/mode-routeProcessor.test.js b/test/mode-routeProcessor.test.js index d662df0c..5602ff92 100644 --- a/test/mode-routeProcessor.test.js +++ b/test/mode-routeProcessor.test.js @@ -6,7 +6,7 @@ const { ethers, utils: { formatUnits }, } = require("ethers"); -const { getBountyEnsureBytecode } = require("../src/config"); +const { getBountyEnsureRainlang, parseRainlang } = require("../src/task"); const { dryrun, findOpp, @@ -19,6 +19,7 @@ let signer = {}; let dataFetcher = {}; const viemClient = { getBlockNumber: async () => BigInt(oppBlockNumber), + readContract: async () => "0x1234", }; const oppBlockNumber = 123456; @@ -38,6 +39,7 @@ const { getCurrentPrice, getAmountOut, } = testData; +config.viemClient = viemClient; describe("Test route processor dryrun", async function () { beforeEach(() => { @@ -80,13 +82,17 @@ describe("Test route processor dryrun", async function () { }; const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(ethPrice), - ethers.constants.Zero, - gasLimitEstimation.mul(gasPrice), - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(ethPrice), + ethers.constants.Zero, + gasLimitEstimation.mul(gasPrice), + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -197,14 +203,17 @@ describe("Test route processor dryrun", async function () { }; const task = { evaluable: { - interpreter: - orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(ethPrice), - ethers.constants.Zero, - ethers.constants.Zero, - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(ethPrice), + ethers.constants.Zero, + ethers.constants.Zero, + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -281,13 +290,17 @@ describe("Test route processor find opp", async function () { }; const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(ethPrice), - ethers.constants.Zero, - gasLimitEstimation.mul(gasPrice), - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(ethPrice), + ethers.constants.Zero, + gasLimitEstimation.mul(gasPrice), + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -364,13 +377,17 @@ describe("Test route processor find opp", async function () { }; const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(ethPrice), - ethers.constants.Zero, - gasLimitEstimation.mul(gasPrice), - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(ethPrice), + ethers.constants.Zero, + gasLimitEstimation.mul(gasPrice), + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -447,14 +464,17 @@ describe("Test route processor find opp", async function () { }; const task = { evaluable: { - interpreter: - orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(ethPrice), - ethers.constants.Zero, - ethers.constants.Zero, - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(ethPrice), + ethers.constants.Zero, + ethers.constants.Zero, + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -572,13 +592,17 @@ describe("Test find opp with retries", async function () { }; const task = { evaluable: { - interpreter: orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(ethPrice), - ethers.constants.Zero, - gasLimitEstimation.mul(gasPrice), - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(ethPrice), + ethers.constants.Zero, + gasLimitEstimation.mul(gasPrice), + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], @@ -652,14 +676,17 @@ describe("Test find opp with retries", async function () { }; const task = { evaluable: { - interpreter: - orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, - bytecode: getBountyEnsureBytecode( - ethers.utils.parseUnits(ethPrice), - ethers.constants.Zero, - ethers.constants.Zero, - signer.account.address, + interpreter: config.dispair.interpreter, + store: config.dispair.store, + bytecode: await parseRainlang( + await getBountyEnsureRainlang( + ethers.utils.parseUnits(ethPrice), + ethers.constants.Zero, + ethers.constants.Zero, + signer.account.address, + ), + viemClient, + config.dispair, ), }, signedContext: [], diff --git a/test/options.test.js b/test/options.test.js index a3c63b33..5a2f6a3b 100644 --- a/test/options.test.js +++ b/test/options.test.js @@ -12,6 +12,7 @@ describe("Test app options", async function () { "0x" + "3".repeat(40), // arb address { lps: ["SUShIswapV2", "bIsWaP"], + dispair: "0xE7116BC05C8afe25e5B54b813A74F916B5D42aB1", }, ); diff --git a/test/processPair.test.js b/test/processPair.test.js index 0f4468ae..8bcb2999 100644 --- a/test/processPair.test.js +++ b/test/processPair.test.js @@ -481,9 +481,8 @@ describe("Test process pair", async function () { }; const task = { evaluable: { - interpreter: - orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, + interpreter: config.dispair.interpreter, + store: config.dispair.store, bytecode: "0x", }, signedContext: [], @@ -677,9 +676,8 @@ describe("Test process pair", async function () { }; const task = { evaluable: { - interpreter: - orderPairObject.takeOrders[0].takeOrder.order.evaluable.interpreter, - store: orderPairObject.takeOrders[0].takeOrder.order.evaluable.store, + interpreter: config.dispair.interpreter, + store: config.dispair.store, bytecode: "0x", }, signedContext: [], diff --git a/test/task.test.ts b/test/task.test.ts new file mode 100644 index 00000000..837700a0 --- /dev/null +++ b/test/task.test.ts @@ -0,0 +1,108 @@ +import { assert } from "chai"; +import { getLocal } from "mockttp"; +import { BigNumber, utils } from "ethers"; +import { encodeAbiParameters } from "viem"; +import { createViemClient } from "../src/config"; +import { getBountyEnsureRainlang, getWithdrawEnsureRainlang, parseRainlang } from "../src/task"; + +describe("Test task", async function () { + const mockServer = getLocal(); + beforeEach(() => mockServer.start(8095)); + afterEach(() => mockServer.stop()); + + it("should get ensure bounty rainlang", async function () { + const inputToEthPrice = BigNumber.from(10); + const outputToEthPrice = BigNumber.from(20); + const minimumExpected = BigNumber.from(15); + const sender = utils.hexlify(utils.randomBytes(20)); + + const result = await getBountyEnsureRainlang( + inputToEthPrice, + outputToEthPrice, + minimumExpected, + sender, + ); + const expected = `/* 0. main */ +:ensure(equal-to(${sender} context<0 0>()) "unknown sender"), +total-bounty-eth: add( + mul(${utils.formatUnits(inputToEthPrice)} context<1 0>()) + mul(${utils.formatUnits(outputToEthPrice)} context<1 1>()) +), +:ensure( + greater-than-or-equal-to( + total-bounty-eth + ${utils.formatUnits(minimumExpected)} + ) + "minimum sender output" +);`; + assert.equal(result, expected); + }); + + it("should get withdraw ensure bounty rainlang", async function () { + const inputToEthPrice = BigNumber.from(10); + const outputToEthPrice = BigNumber.from(20); + const minimumExpected = BigNumber.from(15); + const sender = utils.hexlify(utils.randomBytes(20)); + const botAddress = utils.hexlify(utils.randomBytes(20)); + const inputToken = utils.hexlify(utils.randomBytes(20)); + const outputToken = utils.hexlify(utils.randomBytes(20)); + const orgInputBalance = BigNumber.from(45); + const orgOutputBalance = BigNumber.from(55); + + const result = await getWithdrawEnsureRainlang( + botAddress, + inputToken, + outputToken, + orgInputBalance, + orgOutputBalance, + inputToEthPrice, + outputToEthPrice, + minimumExpected, + sender, + ); + const expected = `/* 0. main */ +:ensure(equal-to(${sender} context<0 0>()) "unknown sender"), +input-bounty: sub( + erc20-balance-of(${inputToken} ${botAddress}) + ${utils.formatUnits(orgInputBalance)} +), +output-bounty: sub( + erc20-balance-of(${outputToken} ${botAddress}) + ${utils.formatUnits(orgOutputBalance)} +), +total-bounty-eth: add( + mul(input-bounty ${utils.formatUnits(inputToEthPrice)}) + mul(output-bounty ${utils.formatUnits(outputToEthPrice)}) +), +:ensure( + greater-than-or-equal-to( + total-bounty-eth + ${utils.formatUnits(minimumExpected)} + ) + "minimum sender output" +);`; + assert.equal(result, expected); + }); + + it("should parse rainlang to bytecode", async function () { + const viemClient = await createViemClient(1, [mockServer.url + "/rpc"]); + const rainlang = "some-rainlang"; + const dispair = { + interpreter: utils.hexlify(utils.randomBytes(20)), + store: utils.hexlify(utils.randomBytes(20)), + deployer: utils.hexlify(utils.randomBytes(20)), + }; + + const expected = utils.hexlify(utils.randomBytes(32)) as `0x${string}`; + const callResult = encodeAbiParameters([{ type: "bytes" }], [expected]); + + // mock call + await mockServer + .forPost("/rpc") + .withBodyIncluding("0xa3869e14") // parse2() selector + .thenSendJsonRpcResult(callResult); + const result = await parseRainlang(rainlang, viemClient, dispair); + + assert.equal(result, expected); + }); +}); diff --git a/test/utils.js b/test/utils.js index 5ee8429a..c64e4d70 100644 --- a/test/utils.js +++ b/test/utils.js @@ -5,6 +5,8 @@ const { DefaultArbEvaluable } = require("../src/abis"); const OrderbookArtifact = require("./abis/OrderBook.json"); const RainterpreterNPE2Artifact = require("./abis/RainterpreterNPE2.json"); const RainterpreterStoreNPE2Artifact = require("./abis/RainterpreterStoreNPE2.json"); +const RainterpreterParserNPE2Artifact = require("./abis/RainterpreterParserNPE2.json"); +const RainterpreterExpressionDeployerNPE2Artifact = require("./abis/RainterpreterExpressionDeployerNPE2.json"); const GenericPoolOrderBookV4ArbOrderTakerArtifact = require("./abis/GenericPoolOrderBookV4ArbOrderTaker.json"); const RouteProcessorOrderBookV4ArbOrderTakerArtifact = require("./abis/RouteProcessorOrderBookV4ArbOrderTaker.json"); @@ -56,6 +58,14 @@ exports.rainterpreterStoreNPE2Deploy = async () => { return await this.basicDeploy(RainterpreterStoreNPE2Artifact); }; +exports.rainterpreterParserNPE2Deploy = async () => { + return await this.basicDeploy(RainterpreterParserNPE2Artifact); +}; + +exports.rainterpreterExpressionDeployerNPE2Deploy = async (deployConfig) => { + return await this.basicDeploy(RainterpreterExpressionDeployerNPE2Artifact, deployConfig); +}; + /** * Extracts an emitted event from a contract *