From c5c869163c73d316bd14460e04573d090fae21eb Mon Sep 17 00:00:00 2001 From: highskore Date: Wed, 5 Feb 2025 17:28:28 +0100 Subject: [PATCH 01/15] fix: use solhint mock contracts --- foundry.toml | 2 ++ lib/modulekit | 1 + package.json | 3 ++- pnpm-lock.yaml | 8 ++++++++ remappings.txt | 1 + src/Mocks.sol | 4 ++-- src/module-bases/mocks/MockValidator.sol | 3 +++ test/Diff.t.sol | 3 +-- 8 files changed, 20 insertions(+), 5 deletions(-) create mode 160000 lib/modulekit diff --git a/foundry.toml b/foundry.toml index a6c68942..53eaa08c 100644 --- a/foundry.toml +++ b/foundry.toml @@ -11,6 +11,8 @@ ignored_warnings_from = ["node_modules", "src/integrations"] gas_limit = "18446744073709551615" memory_limit = 2147483648 verbosity = 3 +optimizer_runs = 200 +bytecode_hash = 'none' [rpc_endpoints] mainnet = "${MAINNET_RPC_URL}" diff --git a/lib/modulekit b/lib/modulekit new file mode 160000 index 00000000..59e1c98b --- /dev/null +++ b/lib/modulekit @@ -0,0 +1 @@ +Subproject commit 59e1c98bb41a04a15041365c5fc1b376cabc1fd0 diff --git a/package.json b/package.json index 5c53b8c4..ac860bbc 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,8 @@ "forge-std": "github:foundry-rs/forge-std", "solady": "github:vectorized/solady", "solarray": "github:sablier-labs/solarray", - "solhint": "^5.0.3" + "solhint": "^5.0.3", + "solmate": "^6.8.0" }, "devDependencies": { "@changesets/cli": "^2.27.9" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f1b2aa7..970336d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: solhint: specifier: ^5.0.3 version: 5.0.3(typescript@4.9.5) + solmate: + specifier: ^6.8.0 + version: 6.8.0 devDependencies: '@changesets/cli': specifier: ^2.27.9 @@ -1903,6 +1906,9 @@ packages: peerDependencies: hardhat: ^2.11.0 + solmate@6.8.0: + resolution: {integrity: sha512-/oI8kgEvSxGG1mrFv3FmCEZd0F8Z9VzRmoYMIhzmmzt6mjtPwfdCm3oh8yOL7bMHJBSfXJuMpnMPrM0uyaKsKg==} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -4553,6 +4559,8 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 + solmate@6.8.0: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 diff --git a/remappings.txt b/remappings.txt index 317ece52..cc31c92e 100644 --- a/remappings.txt +++ b/remappings.txt @@ -10,3 +10,4 @@ solady/=node_modules/solady/src/ solarray/=node_modules/solarray/src/ @prb/math/=node_modules/@prb/math/src/ ExcessivelySafeCall/=node_modules/excessively-safe-call/src/ +solmate/=node_modules/solmate/src/ \ No newline at end of file diff --git a/src/Mocks.sol b/src/Mocks.sol index e149e041..1457248d 100644 --- a/src/Mocks.sol +++ b/src/Mocks.sol @@ -27,5 +27,5 @@ import { MockFallback } from "./module-bases/mocks/MockFallback.sol"; TOKENS //////////////////////////////////////////////////////////////*/ -import { MockERC20 } from "forge-std/mocks/MockERC20.sol"; -import { MockERC721 } from "forge-std/mocks/MockERC721.sol"; +import { MockERC20 } from "solmate/test/utils/mocks/MockERC20.sol"; +import { MockERC721 } from "solmate/test/utils/mocks/MockERC721.sol"; diff --git a/src/module-bases/mocks/MockValidator.sol b/src/module-bases/mocks/MockValidator.sol index 0b77c2ff..1fdf2591 100644 --- a/src/module-bases/mocks/MockValidator.sol +++ b/src/module-bases/mocks/MockValidator.sol @@ -4,6 +4,7 @@ pragma solidity >=0.8.0 <0.9.0; /* solhint-disable no-unused-vars */ import { ERC7579ValidatorBase } from "../ERC7579ValidatorBase.sol"; import { PackedUserOperation } from "../../external/ERC4337.sol"; +import { console } from "forge-std/console.sol"; contract MockValidator is ERC7579ValidatorBase { function onInstall(bytes calldata data) external virtual override { } @@ -19,6 +20,7 @@ contract MockValidator is ERC7579ValidatorBase { override returns (ValidationData) { + console.log("validateUserOp msg.sender", msg.sender); return _packValidationData({ sigFailed: false, validUntil: type(uint48).max, validAfter: 0 }); } @@ -34,6 +36,7 @@ contract MockValidator is ERC7579ValidatorBase { override returns (bytes4) { + console.log("isValidSignatureWithSender msg.sender", msg.sender); return EIP1271_SUCCESS; } diff --git a/test/Diff.t.sol b/test/Diff.t.sol index 851ee6f1..713b2337 100644 --- a/test/Diff.t.sol +++ b/test/Diff.t.sol @@ -48,8 +48,7 @@ contract ERC7579DifferentialModuleKitLibTest is BaseTest { mockTarget = new MockTarget(); // Setup aux - token = new MockERC20(); - token.initialize("Mock Token", "MTK", 18); + token = new MockERC20("Mock Token", "MTK", 18); deal(address(token), instance.account, 100 ether); vm.deal(instance.account, 1000 ether); } From 5854a8f7ec30a2ebb0cc615536ebc8132b5e7248 Mon Sep 17 00:00:00 2001 From: highskore Date: Wed, 5 Feb 2025 17:45:30 +0100 Subject: [PATCH 02/15] fix: use latest pvh interface --- src/accounts/common/interfaces/IERC7579Module.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/accounts/common/interfaces/IERC7579Module.sol b/src/accounts/common/interfaces/IERC7579Module.sol index f26a4ee9..a388e84d 100644 --- a/src/accounts/common/interfaces/IERC7579Module.sol +++ b/src/accounts/common/interfaces/IERC7579Module.sol @@ -142,7 +142,6 @@ interface ISigner is IModule { interface IPreValidationHookERC1271 is IModule { function preValidationHookERC1271( - address account, address sender, bytes32 hash, bytes calldata data @@ -154,7 +153,6 @@ interface IPreValidationHookERC1271 is IModule { interface IPreValidationHookERC4337 is IModule { function preValidationHookERC4337( - address account, PackedUserOperation calldata userOp, uint256 missingAccountFunds, bytes32 userOpHash From 11a1d3de76aa3b31585d5601c3e23caba18adabf Mon Sep 17 00:00:00 2001 From: highskore Date: Wed, 5 Feb 2025 21:40:11 +0100 Subject: [PATCH 03/15] chore: remove console log --- src/module-bases/mocks/MockValidator.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/module-bases/mocks/MockValidator.sol b/src/module-bases/mocks/MockValidator.sol index 1fdf2591..ab5d7c29 100644 --- a/src/module-bases/mocks/MockValidator.sol +++ b/src/module-bases/mocks/MockValidator.sol @@ -4,7 +4,6 @@ pragma solidity >=0.8.0 <0.9.0; /* solhint-disable no-unused-vars */ import { ERC7579ValidatorBase } from "../ERC7579ValidatorBase.sol"; import { PackedUserOperation } from "../../external/ERC4337.sol"; -import { console } from "forge-std/console.sol"; contract MockValidator is ERC7579ValidatorBase { function onInstall(bytes calldata data) external virtual override { } @@ -20,7 +19,6 @@ contract MockValidator is ERC7579ValidatorBase { override returns (ValidationData) { - console.log("validateUserOp msg.sender", msg.sender); return _packValidationData({ sigFailed: false, validUntil: type(uint48).max, validAfter: 0 }); } From e6681f9757a2723a0929c7532c7c9e77fa95e4d9 Mon Sep 17 00:00:00 2001 From: highskore Date: Wed, 5 Feb 2025 21:42:20 +0100 Subject: [PATCH 04/15] chore: remove console log --- src/module-bases/mocks/MockValidator.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/src/module-bases/mocks/MockValidator.sol b/src/module-bases/mocks/MockValidator.sol index ab5d7c29..0b77c2ff 100644 --- a/src/module-bases/mocks/MockValidator.sol +++ b/src/module-bases/mocks/MockValidator.sol @@ -34,7 +34,6 @@ contract MockValidator is ERC7579ValidatorBase { override returns (bytes4) { - console.log("isValidSignatureWithSender msg.sender", msg.sender); return EIP1271_SUCCESS; } From ead1eaaab0aa7e52c1fc163cfedc5de1e41aa5f9 Mon Sep 17 00:00:00 2001 From: highskore Date: Mon, 17 Feb 2025 10:41:59 +0100 Subject: [PATCH 05/15] feat(HelperBase): add prevalidation hook install/unininstall --- src/test/helpers/HelperBase.sol | 88 ++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 7 deletions(-) diff --git a/src/test/helpers/HelperBase.sol b/src/test/helpers/HelperBase.sol index 2ed7dbc6..6e7bcfdc 100644 --- a/src/test/helpers/HelperBase.sol +++ b/src/test/helpers/HelperBase.sol @@ -8,7 +8,9 @@ import { MODULE_TYPE_VALIDATOR, MODULE_TYPE_EXECUTOR, MODULE_TYPE_HOOK, - MODULE_TYPE_FALLBACK + MODULE_TYPE_FALLBACK, + MODULE_TYPE_PREVALIDATION_HOOK_ERC1271, + MODULE_TYPE_PREVALIDATION_HOOK_ERC4337 } from "../../accounts/common/interfaces/IERC7579Module.sol"; import { IERC1271, EIP1271_MAGIC_VALUE } from "../../Interfaces.sol"; @@ -197,7 +199,7 @@ abstract contract HelperBase { data = initData; } - /// @notice get callData to install executor on ERC7579 Account + /// @notice get callData to install executor on an ERC7579 Account /// @param initData bytes the data to pass to the module /// @return data bytes the callData to install the executor function getInstallExecutorData( @@ -213,7 +215,7 @@ abstract contract HelperBase { data = initData; } - /// @notice get callData to uninstall executor on ERC7579 Account + /// @notice get callData to uninstall executor on an ERC7579 Account /// @param initData bytes the data to pass to the module /// @return data bytes the callData to uninstall the executor function getUninstallExecutorData( @@ -229,7 +231,7 @@ abstract contract HelperBase { data = initData; } - /// @notice get callData to install hook on ERC7579 Account + /// @notice get callData to install hook on an ERC7579 Account /// @param initData bytes the data to pass to the module /// @return data bytes the callData to install the hook function getInstallHookData( @@ -245,7 +247,7 @@ abstract contract HelperBase { data = initData; } - /// @notice get callData to uninstall hook on ERC7579 Account + /// @notice get callData to uninstall hook on an ERC7579 Account /// @param initData bytes the data to pass to the module /// @return data bytes the callData to uninstall the hook function getUninstallHookData( @@ -261,7 +263,7 @@ abstract contract HelperBase { data = initData; } - /// @notice get callData to install fallback on ERC7579 Account + /// @notice get callData to install fallback on an ERC7579 Account /// @param initData bytes the data to pass to the module /// @return data bytes the callData to install the fallback function getInstallFallbackData( @@ -277,7 +279,7 @@ abstract contract HelperBase { data = initData; } - /// @notice get callData to uninstall fallback on ERC7579 Account + /// @notice get callData to uninstall fallback on an ERC7579 Account /// @param initData bytes the data to pass to the module /// @return data bytes the callData to uninstall the fallback function getUninstallFallbackData( @@ -293,6 +295,70 @@ abstract contract HelperBase { data = initData; } + /// @notice get callData to install an ERC1271 prevalidation hook + /// @param initData bytes the data to pass to the module + /// @return data bytes the callData to install the prevalidation hook ERC1271 + function getInstallPrevalidationHookERC1271Data( + AccountInstance memory, // instance + address, // module + bytes memory initData + ) + public + view + virtual + returns (bytes memory data) + { + data = initData; + } + + /// @notice get callData to install an ERC4337 prevalidation hook ERC4337 + /// @param initData bytes the data to pass to the module + /// @return data bytes the callData to install the prevalidation hook ERC4337 + function getInstallPrevalidationHookERC4337Data( + AccountInstance memory, // instance + address, // module + bytes memory initData + ) + public + view + virtual + returns (bytes memory data) + { + data = initData; + } + + /// @notice get callData to uninstall an ERC1271 prevalidation hook + /// @param initData bytes the data to pass to the module + /// @return data bytes the callData to uninstall the prevalidation hook ERC1271 + function getUninstallPrevalidationHookERC1271Data( + AccountInstance memory, // instance + address, // module + bytes memory initData + ) + public + view + virtual + returns (bytes memory data) + { + data = initData; + } + + /// @notice get callData to uninstall an ERC4337 prevalidation hook + /// @param initData bytes the data to pass to the module + /// @return data bytes the callData to uninstall the prevalidation hook ERC4337 + function getUninstallPrevalidationHookERC4337Data( + AccountInstance memory, // instance + address, // module + bytes memory initData + ) + public + view + virtual + returns (bytes memory data) + { + data = initData; + } + /*////////////////////////////////////////////////////////////////////////// MODULE UTILS //////////////////////////////////////////////////////////////////////////*/ @@ -362,6 +428,10 @@ abstract contract HelperBase { return getInstallHookData(instance, module, initData); } else if (moduleType == MODULE_TYPE_FALLBACK) { return getInstallFallbackData(instance, module, initData); + } else if (moduleType == MODULE_TYPE_PREVALIDATION_HOOK_ERC1271) { + return getInstallPrevalidationHookERC1271Data(instance, module, initData); + } else if (moduleType == MODULE_TYPE_PREVALIDATION_HOOK_ERC4337) { + return getInstallPrevalidationHookERC4337Data(instance, module, initData); } else { revert("Invalid module type"); } @@ -392,6 +462,10 @@ abstract contract HelperBase { return getUninstallHookData(instance, module, initData); } else if (moduleType == MODULE_TYPE_FALLBACK) { return getUninstallFallbackData(instance, module, initData); + } else if (moduleType == MODULE_TYPE_PREVALIDATION_HOOK_ERC1271) { + return getUninstallPrevalidationHookERC1271Data(instance, module, initData); + } else if (moduleType == MODULE_TYPE_PREVALIDATION_HOOK_ERC4337) { + return getUninstallPrevalidationHookERC4337Data(instance, module, initData); } else { revert("Invalid module type"); } From 574da16a3a9deb9dad13f1fb84219b224a45d245 Mon Sep 17 00:00:00 2001 From: highskore Date: Mon, 17 Feb 2025 18:08:08 +0100 Subject: [PATCH 06/15] feat: update 7579 ref to pvh bytecode --- src/deployment/precompiles/ERC7579Precompiles.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/deployment/precompiles/ERC7579Precompiles.sol b/src/deployment/precompiles/ERC7579Precompiles.sol index b947a95d..bc71db78 100644 --- a/src/deployment/precompiles/ERC7579Precompiles.sol +++ b/src/deployment/precompiles/ERC7579Precompiles.sol @@ -57,11 +57,11 @@ contract ERC7579Precompiles is BytecodeDeployer { /* solhint-disable max-line-length */ bytes public constant ERC7579_BYTECODE = - hex"6080604052348015600e575f5ffd5b5061387a8061001c5f395ff3fe60806040526004361061010c575f3560e01c8063a71763a811610094578063e9ae5c5311610063578063e9ae5c5314610438578063ea5f61d01461044b578063eab77e171461046a578063eac9b20d14610489578063f2dc691d146104d657610113565b8063a71763a8146103c4578063b0d691fe146103d7578063d03c7914146103f9578063d691c9641461041857610113565b80634b6a1419116100db5780634b6a1419146103135780635faac46b146103265780638dd7712f146103535780639517e29f146103665780639cfd7cff1461037957610113565b80630a664dba1461025a578063112d3a7d1461028b5780631626ba7e146102ba57806319822f7c146102f257610113565b3661011357005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a028214171561013e57806020526020603cf35b505f6101486104f5565b5f80356001600160e01b03191681526002919091016020526040902080549091506001600160a01b03811690600160a01b900460f81b816101ae57604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b6101bc81607f60f91b610519565b1561020d5760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa90506101fc3d60408051918201905290565b3d5f823e81610209573d81fd5b3d81f35b610217815f610519565b156102585760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af190506101fc3d60408051918201905290565b005b348015610265575f5ffd5b5061026e610530565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610296575f5ffd5b506102aa6102a5366004612d4c565b61054b565b6040519015158152602001610282565b3480156102c5575f5ffd5b506102d96102d4366004612da3565b6105ae565b6040516001600160e01b03199091168152602001610282565b610305610300366004612ecf565b610681565b604051908152602001610282565b610258610321366004613003565b610891565b348015610331575f5ffd5b50610345610340366004613041565b61091d565b60405161028292919061306b565b6102586103613660046130cd565b610943565b610258610374366004612d4c565b610a0e565b348015610384575f5ffd5b50604080518082018252601b81527f754d53412e616476616e6365642f77697468486f6f6b2e76302e310000000000602082015290516102829190613133565b6102586103d2366004612d4c565b610ea1565b3480156103e2575f5ffd5b506f71727de22e5e9d8baf0edac6f37da03261026e565b348015610404575f5ffd5b506102aa610413366004613145565b611106565b61042b610426366004612da3565b6111a1565b604051610282919061315c565b610258610446366004612da3565b61189f565b348015610456575f5ffd5b50610345610465366004613041565b611ccc565b348015610475575f5ffd5b506102586104843660046131bf565b611ce8565b348015610494575f5ffd5b506104a86104a336600461326d565b611da5565b6040805182516001600160a01b031681526020928301516001600160f81b0319169281019290925201610282565b3480156104e1575f5ffd5b506102aa6104f0366004613145565b611e12565b7ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea0290565b6001600160f81b0319828116908216145b92915050565b5f6105465f5160206137f45f395f51905f525490565b905090565b5f600185036105645761055d84611e5f565b90506105a6565b600285036105755761055d84611e7c565b600385036105925761055d61058c8385018561326d565b85611e95565b600485036105a35761055d84611ed1565b505f5b949350505050565b5f806105bd6014828587613288565b6105c6916132af565b60601c90506105d481611e5f565b6105fc57604051635c93ff2f60e11b81526001600160a01b03821660048201526024016101a5565b6001600160a01b03811663f551e2ee338761061a876014818b613288565b6040518563ffffffff1660e01b81526004016106399493929190613324565b602060405180830381865afa158015610654573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106789190613355565b95945050505050565b5f336f71727de22e5e9d8baf0edac6f37da032146106b257604051635629665f60e11b815260040160405180910390fd5b60208401518290606081901c906106c882611e5f565b610806576106d4611f01565b6107fb575f5f5f8961010001518060200190518101906106f491906133bd565b9250925092505f5f848060200190518101906107109190613448565b915091505f61071f8383611f2d565b90505f610759610753836020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b87611fb0565b90506001600160a01b038116301461077d5760019a50505050505050505050610879565b61078561203b565b5f846001600160a01b03168460405161079e91906134ac565b5f60405180830381855af49150503d805f81146107d6576040519150601f19603f3d011682016040523d82523d5f602084013e6107db565b606091505b50509050806107e8575f5ffd5b50505050506101008a0152506108069050565b600193505050610879565b604051639700320360e01b81526001600160a01b03831690639700320390610834908a908a906004016134b7565b6020604051808303815f875af1158015610850573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108749190613583565b935050505b8015610889575f385f3884335af1505b509392505050565b61089961205e565b6108a161203b565b5f806108af8385018561359a565b915091505f826001600160a01b0316826040516108cc91906134ac565b5f60405180830381855af49150503d805f8114610904576040519150601f19603f3d011682016040523d82523d5f602084013e610909565b606091505b5050905080610916575f5ffd5b5050505050565b60605f5f6109296104f5565b90506109368186866120a3565b92509250505b9250929050565b336f71727de22e5e9d8baf0edac6f37da0321461097357604051635629665f60e11b815260040160405180910390fd5b365f61098260608501856135dc565b610990916004908290613288565b915091505f306001600160a01b031683836040516109af92919061361e565b5f60405180830381855af49150503d805f81146109e7576040519150601f19603f3d011682016040523d82523d5f602084013e6109ec565b606091505b505090508061091657604051632b3f6d1160e21b815260040160405180910390fd5b336f71727de22e5e9d8baf0edac6f37da0321480610a2b57503330145b610a4857604051635629665f60e11b815260040160405180910390fd5b5f610a5e5f5160206137f45f395f51905f525490565b90506001600160a01b038116610c1d575f54849086906001600160a01b03168015610ae0576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b158015610ac9575f5ffd5b505afa158015610adb573d5f5f3e3d5ffd5b505050505b60405163ecd0596160e01b8152600481018990526001600160a01b0388169063ecd0596190602401602060405180830381865afa158015610b23573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b47919061362d565b610b67576040516369c9a24560e11b8152600481018990526024016101a5565b60018803610b7f57610b7a87878761224a565b610bd4565b60028803610b9257610b7a87878761228d565b60038803610ba557610b7a8787876122a5565b60048803610bb857610b7a878787612423565b60405163041c38b360e41b8152600481018990526024016101a5565b604080518981526001600160a01b03891660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123910160405180910390a1505050610916565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590610c51903390349086903690600401613324565b5f604051808303815f875af1158015610c6c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c93919081019061364c565b5f54909150859087906001600160a01b03168015610d08576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b158015610cf1575f5ffd5b505afa158015610d03573d5f5f3e3d5ffd5b505050505b60405163ecd0596160e01b8152600481018a90526001600160a01b0389169063ecd0596190602401602060405180830381865afa158015610d4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6f919061362d565b610d8f576040516369c9a24560e11b8152600481018a90526024016101a5565b60018903610da757610da288888861224a565b610dfc565b60028903610dba57610da288888861228d565b60038903610dcd57610da28888886122a5565b60048903610de057610da2888888612423565b60405163041c38b360e41b8152600481018a90526024016101a5565b604080518a81526001600160a01b038a1660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123910160405180910390a15050604051630b9dfbed60e11b81526001600160a01b038416915063173bf7da90610e6c908490600401613133565b5f604051808303815f87803b158015610e83575f5ffd5b505af1158015610e95573d5f5f3e3d5ffd5b50505050505050505050565b336f71727de22e5e9d8baf0edac6f37da0321480610ebe57503330145b610edb57604051635629665f60e11b815260040160405180910390fd5b5f610ef15f5160206137f45f395f51905f525490565b90506001600160a01b038116610fb45760018503610f1957610f14848484612483565b610f6e565b60028503610f2c57610f148484846124d8565b60038503610f3f57610f148484846124f4565b60048503610f5257610f148484846126f9565b60405163041c38b360e41b8152600481018690526024016101a5565b604080518681526001600160a01b03861660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e910160405180910390a1610916565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590610fe8903390349086903690600401613324565b5f604051808303815f875af1158015611003573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261102a919081019061364c565b9050600186036110445761103f858585612483565b611099565b600286036110575761103f8585856124d8565b6003860361106a5761103f8585856124f4565b6004860361107d5761103f8585856126f9565b60405163041c38b360e41b8152600481018790526024016101a5565b604080518781526001600160a01b03871660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e910160405180910390a1604051630b9dfbed60e11b81526001600160a01b0383169063173bf7da90610e6c908490600401613133565b5f81600881901b61111b82600160f81b610519565b15611129576001925061116a565b611133825f610519565b15611141576001925061116a565b611153826001600160f81b0319610519565b15611161576001925061116a565b505f9392505050565b611174815f610519565b15611182576001925061119a565b61119081600160f81b610519565b1561116157600192505b5050919050565b60605f6111ac6104f5565b60010190506111bb813361276e565b6111da57604051635c93ff2f60e11b81523360048201526024016101a5565b5f6111f05f5160206137f45f395f51905f525490565b90506001600160a01b038116611520575f5433906002906001600160a01b03168015611273576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b15801561125c575f5ffd5b505afa15801561126e573d5f5f3e3d5ffd5b505050505b88600881901b61128782600160f81b610519565b156112f55789358a016020810190356112a0835f610519565b156112b6576112af82826127a6565b99506112ee565b6112c483600160f81b610519565b156112d3576112af828261287d565b826040516308c3ee0360e11b81526004016101a5919061367d565b5050611516565b6112ff825f610519565b15611446575f5f365f6113128e8e6129a8565b6040805160018082528183019092529498509296509094509250816020015b6060815260200190600190039081611331579050509b505f6113538682610519565b1561138657611364858585856129f8565b8d5f8151811061137657611376613692565b602002602001018190525061143c565b61139486600160f81b610519565b15611421576113a585858585612a2b565b8e5f815181106113b7576113b7613692565b602090810291909101015290508061141c577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8e5f815181106113fd576113fd613692565b60200260200101516040516114139291906136a6565b60405180910390a15b61143c565b856040516308c3ee0360e11b81526004016101a5919061367d565b5050505050611516565b611458826001600160f81b0319610519565b156114fb575f61146b6014828c8e613288565b611474916132af565b60601c9050365f8c8c601490809261148e93929190613288565b909250905061149d845f610519565b156114b3576114ad838383612a59565b506114f3565b6114c184600160f81b610519565b156114d8576114d1838383612a8a565b50506114f3565b836040516308c3ee0360e11b81526004016101a5919061367d565b505050611516565b81604051632e5bf3f960e21b81526004016101a5919061367d565b5050505050611896565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590611554903390349086903690600401613324565b5f604051808303815f875af115801561156f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611596919081019061364c565b5f5490915033906002906001600160a01b0316801561160c576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b1580156115f5575f5ffd5b505afa158015611607573d5f5f3e3d5ffd5b505050505b89600881901b61162082600160f81b610519565b15611673578a358b01602081019035611639835f610519565b1561164f5761164882826127a6565b9a5061166c565b61165d83600160f81b610519565b156112d357611648828261287d565b5050611836565b61167d825f610519565b156117a4575f5f365f6116908f8f6129a8565b6040805160018082528183019092529498509296509094509250816020015b60608152602001906001900390816116af579050509c505f6116d18682610519565b15611704576116e2858585856129f8565b8e5f815181106116f4576116f4613692565b602002602001018190525061179a565b61171286600160f81b610519565b156114215761172385858585612a2b565b8f5f8151811061173557611735613692565b602090810291909101015290508061179a577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8f5f8151811061177b5761177b613692565b60200260200101516040516117919291906136a6565b60405180910390a15b5050505050611836565b6117b6826001600160f81b0319610519565b156114fb575f6117c96014828d8f613288565b6117d2916132af565b60601c9050365f8d8d60149080926117ec93929190613288565b90925090506117fb845f610519565b156118115761180b838383612a59565b50611832565b61181f84600160f81b610519565b156114d85761182f838383612a8a565b50505b5050505b5050604051630b9dfbed60e11b81526001600160a01b038616935063173bf7da925061186791508490600401613133565b5f604051808303815f87803b15801561187e575f5ffd5b505af1158015611890573d5f5f3e3d5ffd5b50505050505b50509392505050565b336f71727de22e5e9d8baf0edac6f37da03214806118bc57503330145b6118d957604051635629665f60e11b815260040160405180910390fd5b5f6118ef5f5160206137f45f395f51905f525490565b90506001600160a01b038116611a8b5783600881901b61191382600160f81b610519565b15611965578435850160208101903561192c835f610519565b156119415761193b82826127a6565b5061195e565b61194f83600160f81b610519565b156112d35761193b828261287d565b5050611a84565b61196f825f610519565b156119f8575f5f365f61198289896129a8565b9350935093509350611997855f60f81b610519565b156119ae576119a8848484846129f8565b506119ef565b6119bc85600160f81b610519565b156119d4576119cd84848484612a2b565b50506119ef565b846040516308c3ee0360e11b81526004016101a5919061367d565b50505050611a84565b611a0a826001600160f81b0319610519565b156114fb575f611a1d6014828789613288565b611a26916132af565b60601c9050365f611a3a876014818b613288565b9092509050611a49845f610519565b15611a5f57611a59838383612a59565b50611a80565b611a6d84600160f81b610519565b156114d857611a7d838383612a8a565b50505b5050505b5050611cc6565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590611abf903390349086903690600401613324565b5f604051808303815f875af1158015611ada573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b01919081019061364c565b905084600881901b611b1782600160f81b610519565b15611b695785358601602081019035611b30835f610519565b15611b4557611b3f82826127a6565b50611b62565b611b5383600160f81b610519565b156112d357611b3f828261287d565b5050611c69565b611b73825f610519565b15611bdd575f5f365f611b868a8a6129a8565b9350935093509350611b9b855f60f81b610519565b15611bb257611bac848484846129f8565b50611bd4565b611bc085600160f81b610519565b156119d457611bd184848484612a2b565b50505b50505050611c69565b611bef826001600160f81b0319610519565b156114fb575f611c02601482888a613288565b611c0b916132af565b60601c9050365f611c1f886014818c613288565b9092509050611c2e845f610519565b15611c4457611c3e838383612a59565b50611c65565b611c5284600160f81b610519565b156114d857611c62838383612a8a565b50505b5050505b5050604051630b9dfbed60e11b81526001600160a01b0383169063173bf7da90611c97908490600401613133565b5f604051808303815f87803b158015611cae575f5ffd5b505af1158015611cc0573d5f5f3e3d5ffd5b50505050505b50505050565b60605f5f611cd86104f5565b60010190506109368186866120a3565b336f71727de22e5e9d8baf0edac6f37da0321480611d0557503330145b611d2257604051635629665f60e11b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0386161790558115611cc65760405163f05c04e160e01b81526001600160a01b0385169063f05c04e190611d72908490879087906004016136be565b5f604051808303815f87803b158015611d89575f5ffd5b505af1158015611d9b573d5f5f3e3d5ffd5b5050505050505050565b604080518082019091525f8082526020820152611dc06104f5565b6001600160e01b0319929092165f908152600290920160209081526040928390208351808501909452546001600160a01b0381168452600160a01b900460f81b6001600160f81b031916908301525090565b5f60018203611e2357506001919050565b60028203611e3357506001919050565b60038203611e4357506001919050565b60048203611e5357506001919050565b505f919050565b919050565b5f5f611e696104f5565b9050611e75818461276e565b9392505050565b5f5f611e866104f5565b6001019050611e75818461276e565b5f5f611e9f6104f5565b6001600160e01b0319949094165f908152600290940160205250506040909120546001600160a01b0390811691161490565b5f816001600160a01b0316611ef15f5160206137f45f395f51905f525490565b6001600160a01b03161492915050565b5f5f611f0b6104f5565b60015f90815260209190915260409020546001600160a01b0316151592915050565b5f60405180606001604052806031815260200161381460319139604051602001611f5791906134ac565b60408051808303601f190181528282528051602091820120855186830120918401526001600160a01b03861691830191909152606082015260800160405160208183030381529060405280519060200120905092915050565b604051600190835f5260208301516040526040835103611feb57604083015160ff81901c601b016020526001600160ff1b031660605261200f565b604183510361200b5760608301515f1a602052604083015160605261200f565b5f91505b6020600160805f855afa5191503d61202e57638baa579f5f526004601cfd5b5f60605260405292915050565b5f6120446104f5565b905061205281600101612ab6565b61205b81612ab6565b50565b7f15839c8259ca8706cafa7ed5f198b3de1472c96ca2900b32a679090cc8a614de805c8061209f5760405163aed5959560e01b815260040160405180910390fd5b5050565b60605f6001600160a01b0384166001148015906120c757506120c5858561276e565b155b156120f057604051637c84ecfb60e01b81526001600160a01b03851660048201526024016101a5565b825f036121105760405163f725081760e01b815260040160405180910390fd5b826001600160401b0381111561212857612128612dea565b604051908082528060200260200182016040528015612151578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b0382161580159061219557506001600160a01b038216600114155b80156121a057508381105b156121f957818382815181106121b8576121b8613692565b6001600160a01b039283166020918202929092018101919091529281165f9081529287905260409092205490911690806121f181613729565b915050612173565b6001600160a01b03821660011480159061221257505f81115b1561223e5782612223600183613741565b8151811061223357612233613692565b602002602001015191505b80835250935093915050565b5f6122536104f5565b905061225f8185612b11565b6040516306d61fe760e41b81526001600160a01b03851690636d61fe7090611d729086908690600401613754565b5f6122966104f5565b600101905061225f8185612b11565b5f6122b36004828486613288565b6122bc91613767565b90505f838360048181106122d2576122d2613692565b909101356001600160f81b03191691505f90506122f28460058188613288565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509293506123349250859150612be59050565b156123815760405162461bcd60e51b815260206004820152601e60248201527f46756e6374696f6e2073656c6563746f7220616c72656164792075736564000060448201526064016101a5565b604080518082019091526001600160a01b03871681526001600160f81b0319831660208201526123af6104f5565b6001600160e01b031985165f908152600291909101602090815260409182902083518154949092015160f81c600160a01b026001600160a81b03199094166001600160a01b039283161793909317909255516306d61fe760e41b815290871690636d61fe7090610e6c908490600401613133565b5f6124395f5160206137f45f395f51905f525490565b90506001600160a01b0381161561246e5760405163741cbe0360e01b81526001600160a01b03821660048201526024016101a5565b61225f845f5160206137f45f395f51905f5255565b5f61248c6104f5565b90505f8061249c8486018661359a565b90925090506124ac838388612c1d565b604051638a91b0e360e01b81526001600160a01b03871690638a91b0e390610e6c908490600401613133565b5f6124e16104f5565b60010190505f8061249c8486018661359a565b5f6125026004828486613288565b61250b91613767565b90505f61251b8360048187613288565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092935061255d9250849150612be59050565b6125a95760405162461bcd60e51b815260206004820152601a60248201527f46756e6374696f6e2073656c6563746f72206e6f74207573656400000000000060448201526064016101a5565b5f6125b26104f5565b6001600160e01b031984165f90815260029190910160209081526040918290208251808401909352546001600160a01b03808216808552600160a01b90920460f81b6001600160f81b0319169284019290925291925087161461266a5760405162461bcd60e51b815260206004820152602a60248201527f46756e6374696f6e2073656c6563746f72206e6f74207573656420627920746860448201526934b9903430b7323632b960b11b60648201526084016101a5565b604080518082019091525f80825260208201526126856104f5565b6001600160e01b031985165f908152600291909101602090815260409182902083518154949092015160f81c600160a01b026001600160a81b03199094166001600160a01b03928316179390931790925551638a91b0e360e01b815290871690638a91b0e390610e6c908590600401613133565b61270e5f5f5160206137f45f395f51905f5255565b604051638a91b0e360e01b81526001600160a01b03841690638a91b0e39061273c9085908590600401613754565b5f604051808303815f87803b158015612753575f5ffd5b505af1158015612765573d5f5f3e3d5ffd5b50505050505050565b5f60016001600160a01b03831614801590611e755750506001600160a01b039081165f90815260209290925260409091205416151590565b606081806001600160401b038111156127c1576127c1612dea565b6040519080825280602002602001820160405280156127f457816020015b60608152602001906001900390816127df5790505b5091505f5b81811015612875573685858381811061281457612814613692565b9050602002810190612826919061379d565b905061284f61283860208301836137bb565b602083013561284a60408501856135dc565b6129f8565b84838151811061286157612861613692565b6020908102919091010152506001016127f9565b505092915050565b606081806001600160401b0381111561289857612898612dea565b6040519080825280602002602001820160405280156128cb57816020015b60608152602001906001900390816128b65790505b5091505f5b8181101561287557368585838181106128eb576128eb613692565b90506020028101906128fd919061379d565b90505f61292761291060208401846137bb565b602084013561292260408601866135dc565b612a2b565b86858151811061293957612939613692565b602090810291909101015290508061299e577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb78386858151811061297f5761297f613692565b60200260200101516040516129959291906136a6565b60405180910390a15b50506001016128d0565b5f8036816129b96014828789613288565b6129c2916132af565b60601c93506129d5603460148789613288565b6129de916137d6565b92506129ed8560348189613288565b949793965094505050565b604051818382375f38838387895af1612a13573d5f823e3d81fd5b3d8152602081013d5f823e3d01604052949350505050565b6040515f90828482375f388483888a5af191503d8152602081013d5f823e3d81016040525094509492505050565b604051818382375f388383875af4612a73573d5f823e3d81fd5b3d8152602081013d5f823e3d016040529392505050565b6040515f90828482375f388483885af491503d8152602081013d5f823e3d810160405250935093915050565b60015f908152602082905260409020546001600160a01b031615612aed576040516329e42f3360e11b815260040160405180910390fd5b60015f818152602092909252604090912080546001600160a01b0319169091179055565b6001600160a01b0381161580612b3057506001600160a01b0381166001145b15612b5957604051637c84ecfb60e01b81526001600160a01b03821660048201526024016101a5565b6001600160a01b038181165f908152602084905260409020541615612b9c57604051631034f46960e21b81526001600160a01b03821660048201526024016101a5565b60015f818152602093909352604080842080546001600160a01b039485168087529286208054959091166001600160a01b03199586161790559190935280549091169091179055565b5f5f612bef6104f5565b6001600160e01b03199093165f908152600293909301602052505060409020546001600160a01b0316151590565b6001600160a01b0381161580612c3c57506001600160a01b0381166001145b15612c6557604051637c84ecfb60e01b81526001600160a01b03831660048201526024016101a5565b6001600160a01b038281165f90815260208590526040902054811690821614612cac57604051637c84ecfb60e01b81526001600160a01b03821660048201526024016101a5565b6001600160a01b039081165f8181526020949094526040808520805494841686529085208054949093166001600160a01b0319948516179092559092528154169055565b6001600160a01b038116811461205b575f5ffd5b8035611e5a81612cf0565b5f5f83601f840112612d1f575f5ffd5b5081356001600160401b03811115612d35575f5ffd5b60208301915083602082850101111561093c575f5ffd5b5f5f5f5f60608587031215612d5f575f5ffd5b843593506020850135612d7181612cf0565b925060408501356001600160401b03811115612d8b575f5ffd5b612d9787828801612d0f565b95989497509550505050565b5f5f5f60408486031215612db5575f5ffd5b8335925060208401356001600160401b03811115612dd1575f5ffd5b612ddd86828701612d0f565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b0381118282101715612e2157612e21612dea565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e4f57612e4f612dea565b604052919050565b5f6001600160401b03821115612e6f57612e6f612dea565b50601f01601f191660200190565b5f82601f830112612e8c575f5ffd5b8135612e9f612e9a82612e57565b612e27565b818152846020838601011115612eb3575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f60608486031215612ee1575f5ffd5b83356001600160401b03811115612ef6575f5ffd5b84016101208187031215612f08575f5ffd5b612f10612dfe565b612f1982612d04565b81526020828101359082015260408201356001600160401b03811115612f3d575f5ffd5b612f4988828501612e7d565b60408301525060608201356001600160401b03811115612f67575f5ffd5b612f7388828501612e7d565b6060830152506080828101359082015260a0808301359082015260c0808301359082015260e08201356001600160401b03811115612faf575f5ffd5b612fbb88828501612e7d565b60e0830152506101008201356001600160401b03811115612fda575f5ffd5b612fe688828501612e7d565b610100830152509660208601359650604090950135949350505050565b5f5f60208385031215613014575f5ffd5b82356001600160401b03811115613029575f5ffd5b61303585828601612d0f565b90969095509350505050565b5f5f60408385031215613052575f5ffd5b823561305d81612cf0565b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b818110156130ad5783516001600160a01b0316835260209384019390920191600101613086565b50506001600160a01b039490941660209390930192909252509092915050565b5f5f604083850312156130de575f5ffd5b82356001600160401b038111156130f3575f5ffd5b8301610120818603121561305d575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611e756020830184613105565b5f60208284031215613155575f5ffd5b5035919050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156131b357603f1987860301845261319e858351613105565b94506020938401939190910190600101613182565b50929695505050505050565b5f5f5f5f606085870312156131d2575f5ffd5b84356131dd81612cf0565b935060208501356001600160401b038111156131f7575f5ffd5b8501601f81018713613207575f5ffd5b80356001600160401b0381111561321c575f5ffd5b8760208260051b8401011115613230575f5ffd5b60209190910193509150604085013560ff8116811461324d575f5ffd5b939692955090935050565b6001600160e01b03198116811461205b575f5ffd5b5f6020828403121561327d575f5ffd5b8135611e7581613258565b5f5f85851115613296575f5ffd5b838611156132a2575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff1981169060148410156132f5576bffffffffffffffffffffffff196bffffffffffffffffffffffff198560140360031b1b82161691505b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201525f61334b6060830184866132fc565b9695505050505050565b5f60208284031215613365575f5ffd5b8151611e7581613258565b5f82601f83011261337f575f5ffd5b815161338d612e9a82612e57565b8181528460208386010111156133a1575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f606084860312156133cf575f5ffd5b83516001600160401b038111156133e4575f5ffd5b6133f086828701613370565b93505060208401516001600160401b0381111561340b575f5ffd5b61341786828701613370565b92505060408401516001600160401b03811115613432575f5ffd5b61343e86828701613370565b9150509250925092565b5f5f60408385031215613459575f5ffd5b825161346481612cf0565b60208401519092506001600160401b0381111561347f575f5ffd5b61348b85828601613370565b9150509250929050565b5f81518060208401855e5f93019283525090919050565b5f611e758284613495565b604081526134d16040820184516001600160a01b03169052565b602083015160608201525f604084015161012060808401526134f7610160840182613105565b90506060850151603f198483030160a08501526135148282613105565b915050608085015160c084015260a085015160e084015260c085015161010084015260e0850151603f19848303016101208501526135528282613105565b915050610100850151603f19848303016101408501526135728282613105565b925050508260208301529392505050565b5f60208284031215613593575f5ffd5b5051919050565b5f5f604083850312156135ab575f5ffd5b82356135b681612cf0565b915060208301356001600160401b038111156135d0575f5ffd5b61348b85828601612e7d565b5f5f8335601e198436030181126135f1575f5ffd5b8301803591506001600160401b0382111561360a575f5ffd5b60200191503681900382131561093c575f5ffd5b818382375f9101908152919050565b5f6020828403121561363d575f5ffd5b81518015158114611e75575f5ffd5b5f6020828403121561365c575f5ffd5b81516001600160401b03811115613671575f5ffd5b6105a684828501613370565b6001600160f81b031991909116815260200190565b634e487b7160e01b5f52603260045260245ffd5b828152604060208201525f6105a66040830184613105565b60ff8416815260406020820181905281018290525f8360608301825b8581101561370a5782356136ed81612cf0565b6001600160a01b03168252602092830192909101906001016136da565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373a5761373a613715565b5060010190565b8181038181111561052a5761052a613715565b602081525f6105a66020830184866132fc565b80356001600160e01b031981169060048410156132f5576001600160e01b031960049490940360031b84901b1690921692915050565b5f8235605e198336030181126137b1575f5ffd5b9190910192915050565b5f602082840312156137cb575f5ffd5b8135611e7581612cf0565b8035602083101561052a575f19602084900360031b1b169291505056fe36e05829dd1b9a4411d96a3549582172d7f071c1c0db5c573fcf94eb284316085369676e6564496e6974286164647265737320626f6f7473747261702c627974657320626f6f747374726170496e697429a2646970667358221220e83e3381e4a3a01b6e4061c5e74a9174afdce384fd5b72cbf6e35c1dd5e9d02564736f6c634300081b0033"; + hex"6080604052348015600e575f5ffd5b5061424e8061001c5f395ff3fe60806040526004361061012d575f3560e01c80639517e29f116100aa578063d691c9641161006e578063d691c9641461048d578063e9ae5c53146104ad578063ea5f61d0146104c0578063eab77e17146104df578063eac9b20d146104fe578063f2dc691d1461054b57610134565b80639517e29f146103db5780639cfd7cff146103ee578063a71763a814610439578063b0d691fe1461044c578063d03c79141461046e57610134565b8063492a88a2116100f1578063492a88a2146103535780634b6a1419146103675780635faac46b1461037a5780638626e88b146103a75780638dd7712f146103c857610134565b80630a664dba1461027b578063112d3a7d146102ac5780631626ba7e146102db57806319822f7c146103135780631de6f24f1461033457610134565b3661013457005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a028214171561015f57806020526020603cf35b505f61016961056a565b5f80356001600160e01b03191681526002919091016020526040902080549091506001600160a01b03811690600160a01b900460f81b816101cf57604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b6101dd81607f60f91b61058e565b1561022e5760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa905061021d3d60408051918201905290565b3d5f823e8161022a573d81fd5b3d81f35b610238815f61058e565b156102795760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af1905061021d3d60408051918201905290565b005b348015610286575f5ffd5b5061028f6105a5565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102b7575f5ffd5b506102cb6102c636600461375f565b6105c0565b60405190151581526020016102a3565b3480156102e6575f5ffd5b506102fa6102f53660046137b6565b610641565b6040516001600160e01b031990911681526020016102a3565b6103266103213660046138e2565b610725565b6040519081526020016102a3565b34801561033f575f5ffd5b5061028f61034e366004613a16565b61088c565b34801561035e575f5ffd5b506102cb610896565b610279610375366004613a2d565b6108c5565b348015610385575f5ffd5b50610399610394366004613a6b565b610968565b6040516102a3929190613a95565b3480156103b2575f5ffd5b506103bb61098e565b6040516102a39190613af7565b6102796103d6366004613b39565b610a05565b6102796103e936600461375f565b610ad0565b3480156103f9575f5ffd5b50604080518082018252601b81527f754d53412e616476616e6365642f77697468486f6f6b2e76302e310000000000602082015290516102a39190613b9f565b61027961044736600461375f565b610fa3565b348015610457575f5ffd5b506f71727de22e5e9d8baf0edac6f37da03261028f565b348015610479575f5ffd5b506102cb610488366004613a16565b611248565b6104a061049b3660046137b6565b6112e3565b6040516102a39190613bb1565b6102796104bb3660046137b6565b6119ef565b3480156104cb575f5ffd5b506103996104da366004613a6b565b611e2a565b3480156104ea575f5ffd5b506102796104f9366004613c14565b611e46565b348015610509575f5ffd5b5061051d610518366004613cc2565b611f03565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016102a3565b348015610556575f5ffd5b506102cb610565366004613a16565b611f70565b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a90090565b6001600160f81b0319828116908216145b92915050565b5f6105bb5f5160206141d95f395f51905f525490565b905090565b5f600185036105d9576105d284611fd9565b9050610639565b600285036105ea576105d284611ff6565b60038503610607576105d261060183850185613cc2565b8561200f565b60048503610618576105d28461204b565b60088514806106275750600985145b15610636576105d2848661207b565b505f5b949350505050565b5f806106506014828587613cdd565b61065991613d04565b60601c905061066781611fd9565b61068f57604051635c93ff2f60e11b81526001600160a01b03821660048201526024016101c6565b60606106a7866106a2866014818a613cdd565b6120a0565b604051637aa8f17760e11b815291975091506001600160a01b0383169063f551e2ee906106dc9033908a908690600401613d44565b602060405180830381865afa1580156106f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071b9190613d73565b9695505050505050565b5f336f71727de22e5e9d8baf0edac6f37da0321461075657604051635629665f60e11b815260040160405180910390fd5b60208401518290606081901c9061076c82611fd9565b6107ed57610778612186565b6107e2575f6107b96107ae886020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b8961010001516121b2565b90506001600160a01b03811630146107d75760019450505050610874565b5f9450505050610874565b600193505050610874565b6107f886888761223e565b610100890152604051639700320360e01b81529096506001600160a01b0383169063970032039061082f908a908a90600401613e2e565b6020604051808303815f875af115801561084b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086f9190613e4f565b935050505b8015610884575f385f3884335af1505b509392505050565b5f61059f8261229c565b5f3330146108b757604051630e93a1f960e01b815260040160405180910390fd5b6108bf6122f8565b50600190565b3330146108d4576108d461232f565b6108dc6123a1565b303f7feadcdba66a79ab5dce91622d1d75c8cff5cff0b96944c3bf1072cd08ce0183291480156109455761092f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9006123c4565b6109455f5160206141d95f395f51905f526123c4565b5f8061095384860186613e66565b915091506109618282612417565b5050505050565b60605f5f61097461056a565b905061098181868661247f565b92509250505b9250929050565b7fc473de86d0138e06e4d4918a106463a7cc005258d2e21915272bcb4594c189008054604080516020808402820181019092528281526060939290918391908301828280156109fa57602002820191905f5260205f20905b8154815260200190600101908083116109e6575b505050505091505090565b336f71727de22e5e9d8baf0edac6f37da03214610a3557604051635629665f60e11b815260040160405180910390fd5b365f610a446060850185613eb2565b610a52916004908290613cdd565b915091505f306001600160a01b03168383604051610a71929190613ef4565b5f60405180830381855af49150503d805f8114610aa9576040519150601f19603f3d011682016040523d82523d5f602084013e610aae565b606091505b505090508061096157604051632b3f6d1160e21b815260040160405180910390fd5b336f71727de22e5e9d8baf0edac6f37da0321480610aed57503330145b610b0a57604051635629665f60e11b815260040160405180910390fd5b5f610b205f5160206141d95f395f51905f525490565b90506001600160a01b038116610cff575f54849086906001600160a01b03168015610ba2576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b158015610b8b575f5ffd5b505afa158015610b9d573d5f5f3e3d5ffd5b505050505b60405163ecd0596160e01b8152600481018990526001600160a01b0388169063ecd0596190602401602060405180830381865afa158015610be5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c099190613f03565b610c29576040516369c9a24560e11b8152600481018990526024016101c6565b60018803610c4157610c3c878787612626565b610cb6565b60028803610c5457610c3c878787612669565b60038803610c6757610c3c878787612681565b60048803610c7a57610c3c8787876127ff565b6008881480610c895750600988145b15610c9a57610c3c8789888861285f565b60405163041c38b360e41b8152600481018990526024016101c6565b604080518981526001600160a01b03891660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123910160405180910390a1505050610961565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590610d33903390349086903690600401613f4a565b5f604051808303815f875af1158015610d4e573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d759190810190613fbe565b5f54909150859087906001600160a01b03168015610dea576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b158015610dd3575f5ffd5b505afa158015610de5573d5f5f3e3d5ffd5b505050505b60405163ecd0596160e01b8152600481018a90526001600160a01b0389169063ecd0596190602401602060405180830381865afa158015610e2d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e519190613f03565b610e71576040516369c9a24560e11b8152600481018a90526024016101c6565b60018903610e8957610e84888888612626565b610efe565b60028903610e9c57610e84888888612669565b60038903610eaf57610e84888888612681565b60048903610ec257610e848888886127ff565b6008891480610ed15750600989145b15610ee257610e84888a898961285f565b60405163041c38b360e41b8152600481018a90526024016101c6565b604080518a81526001600160a01b038a1660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123910160405180910390a15050604051630b9dfbed60e11b81526001600160a01b038416915063173bf7da90610f6e908490600401613b9f565b5f604051808303815f87803b158015610f85575f5ffd5b505af1158015610f97573d5f5f3e3d5ffd5b50505050505050505050565b336f71727de22e5e9d8baf0edac6f37da0321480610fc057503330145b610fdd57604051635629665f60e11b815260040160405180910390fd5b5f610ff35f5160206141d95f395f51905f525490565b90506001600160a01b0381166110d6576001850361101b57611016848484612965565b611090565b6002850361102e576110168484846129ba565b60038503611041576110168484846129d6565b6004850361105457611016848484612bdb565b60088514806110635750600985145b156110745761101684868585612c50565b60405163041c38b360e41b8152600481018690526024016101c6565b604080518681526001600160a01b03861660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e910160405180910390a1610961565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f60259061110a903390349086903690600401613f4a565b5f604051808303815f875af1158015611125573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261114c9190810190613fbe565b90506001860361116657611161858585612965565b6111db565b60028603611179576111618585856129ba565b6003860361118c576111618585856129d6565b6004860361119f57611161858585612bdb565b60088614806111ae5750600986145b156111bf5761116185878686612c50565b60405163041c38b360e41b8152600481018790526024016101c6565b604080518781526001600160a01b03871660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e910160405180910390a1604051630b9dfbed60e11b81526001600160a01b0383169063173bf7da90610f6e908490600401613b9f565b5f81600881901b61125d82600160f81b61058e565b1561126b57600192506112ac565b611275825f61058e565b1561128357600192506112ac565b611295826001600160f81b031961058e565b156112a357600192506112ac565b505f9392505050565b6112b6815f61058e565b156112c457600192506112dc565b6112d281600160f81b61058e565b156112a357600192505b5050919050565b60605f6112ee61056a565b60010190506112fd8133612d44565b61131c57604051635c93ff2f60e11b81523360048201526024016101c6565b5f6113325f5160206141d95f395f51905f525490565b90506001600160a01b038116611669575f5433906002906001600160a01b031680156113b5576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b15801561139e575f5ffd5b505afa1580156113b0573d5f5f3e3d5ffd5b505050505b88600881901b6113c982600160f81b61058e565b1561143e57365f6113da8c8c612d7c565b90925090506113e9835f61058e565b156113ff576113f88282612e12565b9950611437565b61140d83600160f81b61058e565b1561141c576113f88282612ee9565b826040516308c3ee0360e11b81526004016101c69190613fef565b505061165f565b611448825f61058e565b1561158f575f5f365f61145b8e8e613014565b6040805160018082528183019092529498509296509094509250816020015b606081526020019060019003908161147a579050509b505f61149c868261058e565b156114cf576114ad85858585613064565b8d5f815181106114bf576114bf614004565b6020026020010181905250611585565b6114dd86600160f81b61058e565b1561156a576114ee85858585613097565b8e5f8151811061150057611500614004565b6020908102919091010152905080611565577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8e5f8151811061154657611546614004565b602002602001015160405161155c929190614018565b60405180910390a15b611585565b856040516308c3ee0360e11b81526004016101c69190613fef565b505050505061165f565b6115a1826001600160f81b031961058e565b15611644575f6115b46014828c8e613cdd565b6115bd91613d04565b60601c9050365f8c8c60149080926115d793929190613cdd565b90925090506115e6845f61058e565b156115fc576115f68383836130c5565b5061163c565b61160a84600160f81b61058e565b156116215761161a8383836130f6565b505061163c565b836040516308c3ee0360e11b81526004016101c69190613fef565b50505061165f565b81604051632e5bf3f960e21b81526004016101c69190613fef565b50505050506119e6565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f60259061169d903390349086903690600401613f4a565b5f604051808303815f875af11580156116b8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116df9190810190613fbe565b5f5490915033906002906001600160a01b03168015611755576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b15801561173e575f5ffd5b505afa158015611750573d5f5f3e3d5ffd5b505050505b89600881901b61176982600160f81b61058e565b156117c357365f61177a8d8d612d7c565b9092509050611789835f61058e565b1561179f576117988282612e12565b9a506117bc565b6117ad83600160f81b61058e565b1561141c576117988282612ee9565b5050611986565b6117cd825f61058e565b156118f4575f5f365f6117e08f8f613014565b6040805160018082528183019092529498509296509094509250816020015b60608152602001906001900390816117ff579050509c505f611821868261058e565b156118545761183285858585613064565b8e5f8151811061184457611844614004565b60200260200101819052506118ea565b61186286600160f81b61058e565b1561156a5761187385858585613097565b8f5f8151811061188557611885614004565b60209081029190910101529050806118ea577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8f5f815181106118cb576118cb614004565b60200260200101516040516118e1929190614018565b60405180910390a15b5050505050611986565b611906826001600160f81b031961058e565b15611644575f6119196014828d8f613cdd565b61192291613d04565b60601c9050365f8d8d601490809261193c93929190613cdd565b909250905061194b845f61058e565b156119615761195b8383836130c5565b50611982565b61196f84600160f81b61058e565b156116215761197f8383836130f6565b50505b5050505b5050604051630b9dfbed60e11b81526001600160a01b038616935063173bf7da92506119b791508490600401613b9f565b5f604051808303815f87803b1580156119ce575f5ffd5b505af11580156119e0573d5f5f3e3d5ffd5b50505050505b50509392505050565b336f71727de22e5e9d8baf0edac6f37da0321480611a0c57503330145b611a2957604051635629665f60e11b815260040160405180910390fd5b5f611a3f5f5160206141d95f395f51905f525490565b90506001600160a01b038116611be25783600881901b611a6382600160f81b61058e565b15611abc57365f611a748787612d7c565b9092509050611a83835f61058e565b15611a9857611a928282612e12565b50611ab5565b611aa683600160f81b61058e565b1561141c57611a928282612ee9565b5050611bdb565b611ac6825f61058e565b15611b4f575f5f365f611ad98989613014565b9350935093509350611aee855f60f81b61058e565b15611b0557611aff84848484613064565b50611b46565b611b1385600160f81b61058e565b15611b2b57611b2484848484613097565b5050611b46565b846040516308c3ee0360e11b81526004016101c69190613fef565b50505050611bdb565b611b61826001600160f81b031961058e565b15611644575f611b746014828789613cdd565b611b7d91613d04565b60601c9050365f611b91876014818b613cdd565b9092509050611ba0845f61058e565b15611bb657611bb08383836130c5565b50611bd7565b611bc484600160f81b61058e565b1561162157611bd48383836130f6565b50505b5050505b5050611e24565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590611c16903390349086903690600401613f4a565b5f604051808303815f875af1158015611c31573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c589190810190613fbe565b905084600881901b611c6e82600160f81b61058e565b15611cc757365f611c7f8888612d7c565b9092509050611c8e835f61058e565b15611ca357611c9d8282612e12565b50611cc0565b611cb183600160f81b61058e565b1561141c57611c9d8282612ee9565b5050611dc7565b611cd1825f61058e565b15611d3b575f5f365f611ce48a8a613014565b9350935093509350611cf9855f60f81b61058e565b15611d1057611d0a84848484613064565b50611d32565b611d1e85600160f81b61058e565b15611b2b57611d2f84848484613097565b50505b50505050611dc7565b611d4d826001600160f81b031961058e565b15611644575f611d60601482888a613cdd565b611d6991613d04565b60601c9050365f611d7d886014818c613cdd565b9092509050611d8c845f61058e565b15611da257611d9c8383836130c5565b50611dc3565b611db084600160f81b61058e565b1561162157611dc08383836130f6565b50505b5050505b5050604051630b9dfbed60e11b81526001600160a01b0383169063173bf7da90611df5908490600401613b9f565b5f604051808303815f87803b158015611e0c575f5ffd5b505af1158015611e1e573d5f5f3e3d5ffd5b50505050505b50505050565b60605f5f611e3661056a565b600101905061098181868661247f565b336f71727de22e5e9d8baf0edac6f37da0321480611e6357503330145b611e8057604051635629665f60e11b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0386161790558115611e245760405163f05c04e160e01b81526001600160a01b0385169063f05c04e190611ed090849087908790600401614030565b5f604051808303815f87803b158015611ee7575f5ffd5b505af1158015611ef9573d5f5f3e3d5ffd5b5050505050505050565b604080518082019091525f8082526020820152611f1e61056a565b6001600160e01b0319929092165f908152600290920160209081526040928390208351808501909452546001600160a01b0381168452600160a01b900460f81b6001600160f81b031916908301525090565b5f60018203611f8157506001919050565b60028203611f9157506001919050565b60038203611fa157506001919050565b60048203611fb157506001919050565b6008821480611fc05750600982145b15611fcd57506001919050565b505f919050565b919050565b5f5f611fe361056a565b9050611fef8184612d44565b9392505050565b5f5f61200061056a565b6001019050611fef8184612d44565b5f5f61201961056a565b6001600160e01b0319949094165f908152600290940160205250506040909120546001600160a01b0390811691161490565b5f816001600160a01b031661206b5f5160206141d95f395f51905f525490565b6001600160a01b03161492915050565b5f826001600160a01b031661208f8361229c565b6001600160a01b0316149392505050565b5f60605f6120ae600861229c565b90506001600160a01b0381166121055785858581818080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525095985091965061217e95505050505050565b604051637a0468b760e01b81526001600160a01b03821690637a0468b7906121379033908a908a908a90600401613f4a565b5f60405180830381865afa158015612151573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121789190810190614087565b92509250505b935093915050565b5f5f61219061056a565b60015f90815260209190915260409020546001600160a01b0316151592915050565b5f6040518251604081146121ce57604181146121ef575061222a565b604084015160ff81901c601b016020526001600160ff1b0316606052612202565b60608401515f1a60205260408401516060525b50835f5260208301516040526020600160805f60015afa5191505f606052806040523d612237575b638baa579f5f526004601cfd5b5092915050565b5f60605f61224c600961229c565b90506001600160a01b03811661226c57505050610100820151839061217e565b60405163e24f8f9360e01b81526001600160a01b0382169063e24f8f939061213790889088908b906004016140c0565b5f5f5160206141f95f395f51905f5260071983016122c457546001600160a01b031692915050565b600983036122df57600101546001600160a01b031692915050565b604051635691922f60e01b815260040160405180910390fd5b612300613122565b61230861320a565b6123256123205f5160206141d95f395f51905f525490565b6132f5565b61232d6123a1565b565b5f60ff1961235e60017ff63b257b7881773a84d328ab92140e19ab791f7b439c76ba9837aa0d6ad30af06140f8565b60405160200161237091815260200190565b60405160208183030381529060405280519060200120169050805c8061239d5763aed595955f526004601cfd5b5050565b5f6123aa61056a565b90506123b8816001016133bc565b6123c1816133bc565b50565b7fc473de86d0138e06e4d4918a106463a7cc005258d2e21915272bcb4594c1890080546001810182555f919091527fdb3901c0862740f848a4aebebd6b3d645e6b3bc6adf2cf46e83a846b3a3439330155565b5f826001600160a01b031682604051612430919061410b565b5f60405180830381855af49150503d805f8114612468576040519150601f19603f3d011682016040523d82523d5f602084013e61246d565b606091505b505090508061247a575f5ffd5b505050565b60605f6001600160a01b0384166001148015906124a357506124a18585612d44565b155b156124cc57604051637c84ecfb60e01b81526001600160a01b03851660048201526024016101c6565b825f036124ec5760405163f725081760e01b815260040160405180910390fd5b826001600160401b03811115612504576125046137fd565b60405190808252806020026020018201604052801561252d578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b0382161580159061257157506001600160a01b038216600114155b801561257c57508381105b156125d5578183828151811061259457612594614004565b6001600160a01b039283166020918202929092018101919091529281165f9081529287905260409092205490911690806125cd81614121565b91505061254f565b6001600160a01b0382166001148015906125ee57505f81115b1561261a57826125ff6001836140f8565b8151811061260f5761260f614004565b602002602001015191505b80835250935093915050565b5f61262f61056a565b905061263b8185613417565b6040516306d61fe760e41b81526001600160a01b03851690636d61fe7090611ed09086908690600401614139565b5f61267261056a565b600101905061263b8185613417565b5f61268f6004828486613cdd565b6126989161414c565b90505f838360048181106126ae576126ae614004565b909101356001600160f81b03191691505f90506126ce8460058188613cdd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092935061271092508591506134eb9050565b1561275d5760405162461bcd60e51b815260206004820152601e60248201527f46756e6374696f6e2073656c6563746f7220616c72656164792075736564000060448201526064016101c6565b604080518082019091526001600160a01b03871681526001600160f81b03198316602082015261278b61056a565b6001600160e01b031985165f908152600291909101602090815260409182902083518154949092015160f81c600160a01b026001600160a81b03199094166001600160a01b039283161793909317909255516306d61fe760e41b815290871690636d61fe7090610f6e908490600401613b9f565b5f6128155f5160206141d95f395f51905f525490565b90506001600160a01b0381161561284a5760405163741cbe0360e01b81526001600160a01b03821660048201526024016101c6565b61263b845f5160206141d95f395f51905f5255565b5f5160206141f95f395f51905f525f6128778561229c565b90506001600160a01b038116156128ac5760405163786ae23560e01b81526001600160a01b03821660048201526024016101c6565b6128b68686613523565b600885036129215781546040516306d61fe760e41b81526001600160a01b0390911690636d61fe70906128ef9087908790600401614139565b5f604051808303815f87803b158015612906575f5ffd5b505af1158015612918573d5f5f3e3d5ffd5b5050505061295d565b6009850361295d5760018201546040516306d61fe760e41b81526001600160a01b0390911690636d61fe7090610f6e9087908790600401614139565b505050505050565b5f61296e61056a565b90505f8061297e84860186613e66565b909250905061298e838388613586565b604051638a91b0e360e01b81526001600160a01b03871690638a91b0e390610f6e908490600401613b9f565b5f6129c361056a565b60010190505f8061297e84860186613e66565b5f6129e46004828486613cdd565b6129ed9161414c565b90505f6129fd8360048187613cdd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350612a3f92508491506134eb9050565b612a8b5760405162461bcd60e51b815260206004820152601a60248201527f46756e6374696f6e2073656c6563746f72206e6f74207573656400000000000060448201526064016101c6565b5f612a9461056a565b6001600160e01b031984165f90815260029190910160209081526040918290208251808401909352546001600160a01b03808216808552600160a01b90920460f81b6001600160f81b03191692840192909252919250871614612b4c5760405162461bcd60e51b815260206004820152602a60248201527f46756e6374696f6e2073656c6563746f72206e6f74207573656420627920746860448201526934b9903430b7323632b960b11b60648201526084016101c6565b604080518082019091525f8082526020820152612b6761056a565b6001600160e01b031985165f908152600291909101602090815260409182902083518154949092015160f81c600160a01b026001600160a81b03199094166001600160a01b03928316179390931790925551638a91b0e360e01b815290871690638a91b0e390610f6e908590600401613b9f565b612bf05f5f5160206141d95f395f51905f5255565b604051638a91b0e360e01b81526001600160a01b03841690638a91b0e390612c1e9085908590600401614139565b5f604051808303815f87803b158015612c35575f5ffd5b505af1158015612c47573d5f5f3e3d5ffd5b50505050505050565b5f5160206141f95f395f51905f52600884148015612c7a575080546001600160a01b038681169116145b15612ce2578054604051638a91b0e360e01b81526001600160a01b0390911690638a91b0e390612cb09086908690600401614139565b5f604051808303815f87803b158015612cc7575f5ffd5b505af1158015612cd9573d5f5f3e3d5ffd5b50505050612d3a565b600984148015612d01575060018101546001600160a01b038681169116145b156122df576001810154604051638a91b0e360e01b81526001600160a01b0390911690638a91b0e390612cb09086908690600401614139565b6109615f85613523565b5f60016001600160a01b03831614801590611fef5750506001600160a01b039081165f90815260209290925260409091205416151590565b365f833580850160208587010360208201945081359350808460051b8301118360401c1715612db25763ba597e7e5f526004601cfd5b8315612e08578392505b6001830392508260051b850135915081850160408101358082018381358201118460408501111782861782351760401c1715612dff5763ba597e7e5f526004601cfd5b50505082612dbc575b5050509250929050565b606081806001600160401b03811115612e2d57612e2d6137fd565b604051908082528060200260200182016040528015612e6057816020015b6060815260200190600190039081612e4b5790505b5091505f5b81811015612ee15736858583818110612e8057612e80614004565b9050602002810190612e929190614182565b9050612ebb612ea460208301836141a0565b6020830135612eb66040850185613eb2565b613064565b848381518110612ecd57612ecd614004565b602090810291909101015250600101612e65565b505092915050565b606081806001600160401b03811115612f0457612f046137fd565b604051908082528060200260200182016040528015612f3757816020015b6060815260200190600190039081612f225790505b5091505f5b81811015612ee15736858583818110612f5757612f57614004565b9050602002810190612f699190614182565b90505f612f93612f7c60208401846141a0565b6020840135612f8e6040860186613eb2565b613097565b868581518110612fa557612fa5614004565b602090810291909101015290508061300a577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb783868581518110612feb57612feb614004565b6020026020010151604051613001929190614018565b60405180910390a15b5050600101612f3c565b5f8036816130256014828789613cdd565b61302e91613d04565b60601c9350613041603460148789613cdd565b61304a916141bb565b92506130598560348189613cdd565b949793965094505050565b604051818382375f38838387895af161307f573d5f823e3d81fd5b3d8152602081013d5f823e3d01604052949350505050565b6040515f90828482375f388483888a5af191503d8152602081013d5f823e3d81016040525094509492505050565b604051818382375f388383875af46130df573d5f823e3d81fd5b3d8152602081013d5f823e3d016040529392505050565b6040515f90828482375f388483885af491503d8152602081013d5f823e3d810160405250935093915050565b5f61312b61056a565b90505f613139826001613659565b90505b6001600160a01b03811660011461320157604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b158015613192575f5ffd5b505af19250505080156131a3575060015b6131f057604080516001600160a01b0383168152602081018290525f8183015290517f6c31ee2929752d85a6dc461efcf817aa81394aff41db1856ebfd71679fffc5709181900360600190a15b6131fa8282613659565b905061313c565b61239d826136ac565b5f61321361056a565b60010190505f61322d60018361365990919063ffffffff16565b90505b6001600160a01b03811660011461320157604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b158015613286575f5ffd5b505af1925050508015613297575060015b6132e457604080516001600160a01b0383168152602081018290525f8183015290517ffdea4600cf09065ff861064d4cd43cde3fae2134d9fbe6d66fd77cc67135c8829181900360600190a15b6132ee8282613659565b9050613230565b6001600160a01b038116156123c157604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b158015613349575f5ffd5b505af192505050801561335a575060015b6133a757604080516001600160a01b0383168152602081018290525f8183015290517f57af23cbd8e148da6020d15e1ff9fb3c531aa9003d6bab6915013a7d8fd032369181900360600190a15b6123c15f5f5160206141d95f395f51905f5255565b60015f908152602082905260409020546001600160a01b0316156133f3576040516329e42f3360e11b815260040160405180910390fd5b60015f818152602092909252604090912080546001600160a01b0319169091179055565b6001600160a01b038116158061343657506001600160a01b0381166001145b1561345f57604051637c84ecfb60e01b81526001600160a01b03821660048201526024016101c6565b6001600160a01b038181165f9081526020849052604090205416156134a257604051631034f46960e21b81526001600160a01b03821660048201526024016101c6565b60015f818152602093909352604080842080546001600160a01b039485168087529286208054959091166001600160a01b03199586161790559190935280549091169091179055565b5f5f6134f561056a565b6001600160e01b03199093165f908152600293909301602052505060409020546001600160a01b0316151590565b5f5160206141f95f395f51905f52600719820161355a5780546001600160a01b0384166001600160a01b0319909116178155505050565b600982036122df576001810180546001600160a01b0385166001600160a01b0319909116179055505050565b6001600160a01b03811615806135a557506001600160a01b0381166001145b156135ce57604051637c84ecfb60e01b81526001600160a01b03831660048201526024016101c6565b6001600160a01b038281165f9081526020859052604090205481169082161461361557604051637c84ecfb60e01b81526001600160a01b03821660048201526024016101c6565b6001600160a01b039081165f8181526020949094526040808520805494841686529085208054949093166001600160a01b0319948516179092559092528154169055565b5f6001600160a01b03821661368c57604051637c84ecfb60e01b81526001600160a01b03831660048201526024016101c6565b506001600160a01b039081165f9081526020929092526040909120541690565b60015f908152602082905260409020546001600160a01b03165b6001600160a01b0381161561239d576001600160a01b039081165f90815260208390526040902080546001600160a01b03198116909155166136c6565b6001600160a01b03811681146123c1575f5ffd5b8035611fd481613703565b5f5f83601f840112613732575f5ffd5b5081356001600160401b03811115613748575f5ffd5b602083019150836020828501011115610987575f5ffd5b5f5f5f5f60608587031215613772575f5ffd5b84359350602085013561378481613703565b925060408501356001600160401b0381111561379e575f5ffd5b6137aa87828801613722565b95989497509550505050565b5f5f5f604084860312156137c8575f5ffd5b8335925060208401356001600160401b038111156137e4575f5ffd5b6137f086828701613722565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b0381118282101715613834576138346137fd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613862576138626137fd565b604052919050565b5f6001600160401b03821115613882576138826137fd565b50601f01601f191660200190565b5f82601f83011261389f575f5ffd5b81356138b26138ad8261386a565b61383a565b8181528460208386010111156138c6575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f606084860312156138f4575f5ffd5b83356001600160401b03811115613909575f5ffd5b8401610120818703121561391b575f5ffd5b613923613811565b61392c82613717565b81526020828101359082015260408201356001600160401b03811115613950575f5ffd5b61395c88828501613890565b60408301525060608201356001600160401b0381111561397a575f5ffd5b61398688828501613890565b6060830152506080828101359082015260a0808301359082015260c0808301359082015260e08201356001600160401b038111156139c2575f5ffd5b6139ce88828501613890565b60e0830152506101008201356001600160401b038111156139ed575f5ffd5b6139f988828501613890565b610100830152509660208601359650604090950135949350505050565b5f60208284031215613a26575f5ffd5b5035919050565b5f5f60208385031215613a3e575f5ffd5b82356001600160401b03811115613a53575f5ffd5b613a5f85828601613722565b90969095509350505050565b5f5f60408385031215613a7c575f5ffd5b8235613a8781613703565b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b81811015613ad75783516001600160a01b0316835260209384019390920191600101613ab0565b50506001600160a01b039490941660209390930192909252509092915050565b602080825282518282018190525f918401906040840190835b81811015613b2e578351835260209384019390920191600101613b10565b509095945050505050565b5f5f60408385031215613b4a575f5ffd5b82356001600160401b03811115613b5f575f5ffd5b83016101208186031215613a87575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611fef6020830184613b71565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613c0857603f19878603018452613bf3858351613b71565b94506020938401939190910190600101613bd7565b50929695505050505050565b5f5f5f5f60608587031215613c27575f5ffd5b8435613c3281613703565b935060208501356001600160401b03811115613c4c575f5ffd5b8501601f81018713613c5c575f5ffd5b80356001600160401b03811115613c71575f5ffd5b8760208260051b8401011115613c85575f5ffd5b60209190910193509150604085013560ff81168114613ca2575f5ffd5b939692955090935050565b6001600160e01b0319811681146123c1575f5ffd5b5f60208284031215613cd2575f5ffd5b8135611fef81613cad565b5f5f85851115613ceb575f5ffd5b83861115613cf7575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015612237576bffffffffffffffffffffffff1960149490940360031b84901b1690921692915050565b60018060a01b0384168152826020820152606060408201525f613d6a6060830184613b71565b95945050505050565b5f60208284031215613d83575f5ffd5b8151611fef81613cad565b80516001600160a01b03168252602081015160208301525f60408201516101206040850152613dc1610120850182613b71565b905060608301518482036060860152613dda8282613b71565b9150506080830151608085015260a083015160a085015260c083015160c085015260e083015184820360e0860152613e128282613b71565b915050610100830151848203610100860152613d6a8282613b71565b604081525f613e406040830185613d8e565b90508260208301529392505050565b5f60208284031215613e5f575f5ffd5b5051919050565b5f5f60408385031215613e77575f5ffd5b8235613e8281613703565b915060208301356001600160401b03811115613e9c575f5ffd5b613ea885828601613890565b9150509250929050565b5f5f8335601e19843603018112613ec7575f5ffd5b8301803591506001600160401b03821115613ee0575f5ffd5b602001915036819003821315610987575f5ffd5b818382375f9101908152919050565b5f60208284031215613f13575f5ffd5b81518015158114611fef575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201525f61071b606083018486613f22565b5f82601f830112613f80575f5ffd5b8151613f8e6138ad8261386a565b818152846020838601011115613fa2575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613fce575f5ffd5b81516001600160401b03811115613fe3575f5ffd5b61063984828501613f71565b6001600160f81b031991909116815260200190565b634e487b7160e01b5f52603260045260245ffd5b828152604060208201525f6106396040830184613b71565b60ff8416815260406020820181905281018290525f8360608301825b8581101561407c57823561405f81613703565b6001600160a01b031682526020928301929091019060010161404c565b509695505050505050565b5f5f60408385031215614098575f5ffd5b8251915060208301516001600160401b038111156140b4575f5ffd5b613ea885828601613f71565b606081525f6140d26060830186613d8e565b60208301949094525060400152919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561059f5761059f6140e4565b5f82518060208501845e5f920191825250919050565b5f60018201614132576141326140e4565b5060010190565b602081525f610639602083018486613f22565b80356001600160e01b03198116906004841015612237576001600160e01b031960049490940360031b84901b1690921692915050565b5f8235605e19833603018112614196575f5ffd5b9190910192915050565b5f602082840312156141b0575f5ffd5b8135611fef81613703565b8035602083101561059f575f19602084900360031b1b169291505056fecd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e4598200088e45215d3756b04bd240e41d75700a696139d5b53082481ffc3914e4840000a26469706673582212208ef474b5e93ab0fb487109f065363bc30e321d6f427467264ec03cb10a92962564736f6c634300081c0033"; bytes public constant ERC7579_BOOTSTRAP_BYTECODE = - hex"6080604052348015600e575f5ffd5b506112a48061001c5f395ff3fe60806040526004361061007e575f3560e01c80636b0d5cc41161004d5780636b0d5cc414610271578063b0d691fe14610290578063ea5f61d0146102b2578063eac9b20d146102d157610085565b80630a664dba146101c85780635e87556d146101f95780635faac46b14610225578063642219af1461025257610085565b3661008557005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a02821417156100b057806020526020603cf35b505f80356001600160e01b03191681525f51602061124f5f395f51905f526020526040902080546001600160a01b03811690600160a01b900460f81b8161011c57604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b61012a81607f60f91b610384565b1561017b5760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa905061016a3d60408051918201905290565b3d5f823e81610177573d81fd5b3d81f35b610185815f610384565b156101c65760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af1905061016a3d60408051918201905290565b005b3480156101d3575f5ffd5b506101dc61039b565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610204575f5ffd5b50610218610213366004610d11565b6103c9565b6040516101f09190610e0c565b348015610230575f5ffd5b5061024461023f366004610e35565b610452565b6040516101f0929190610e5f565b34801561025d575f5ffd5b506101c661026c366004610d11565b61048e565b34801561027c575f5ffd5b506101c661028b366004610ec1565b6106d4565b34801561029b575f5ffd5b506f71727de22e5e9d8baf0edac6f37da0326101dc565b3480156102bd575f5ffd5b506102446102cc366004610e35565b6106e4565b3480156102dc575f5ffd5b506103566102eb366004610f41565b6040805180820182525f80825260209182018190526001600160e01b03199390931683525f51602061124f5f395f51905f528152918190208151808301909252546001600160a01b0381168252600160a01b900460f81b6001600160f81b0319169181019190915290565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016101f0565b6001600160f81b0319828116908216145b92915050565b5f6103c47f36e05829dd1b9a4411d96a3549582172d7f071c1c0db5c573fcf94eb284316085490565b905090565b606030306001600160a01b031663642219af8a8a8a8a8a8a8a6040516024016103f89796959493929190611071565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506040516020016104369291906110ce565b6040516020818303038152906040529050979650505050505050565b60605f7ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea0261048181868661070f565b92509250505b9250929050565b5f5b8681101561050c576105048888838181106104ad576104ad6110f9565b90506020028101906104bf919061110d565b6104cd90602081019061112b565b8989848181106104df576104df6110f9565b90506020028101906104f1919061110d565b6104ff906020810190611146565b6108b7565b600101610490565b505f5b848110156105cc575f86868381811061052a5761052a6110f9565b905060200281019061053c919061110d565b61054a90602081019061112b565b6001600160a01b0316146105c4576105c486868381811061056d5761056d6110f9565b905060200281019061057f919061110d565b61058d90602081019061112b565b87878481811061059f5761059f6110f9565b90506020028101906105b1919061110d565b6105bf906020810190611146565b610939565b60010161050f565b505f6105db602085018561112b565b6001600160a01b03161461060b5761060b6105f9602085018561112b565b6106066020860186611146565b610964565b5f5b818110156106ca575f838383818110610628576106286110f9565b905060200281019061063a919061110d565b61064890602081019061112b565b6001600160a01b0316146106c2576106c283838381811061066b5761066b6110f9565b905060200281019061067d919061110d565b61068b90602081019061112b565b84848481811061069d5761069d6110f9565b90506020028101906106af919061110d565b6106bd906020810190611146565b6109ea565b60010161060d565b5050505050505050565b6106df8383836108b7565b505050565b60605f7ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea036104818186865b60605f6001600160a01b03841660011480159061073357506107318585610b90565b155b1561075c57604051637c84ecfb60e01b81526001600160a01b0385166004820152602401610113565b825f0361077c5760405163f725081760e01b815260040160405180910390fd5b8267ffffffffffffffff81111561079557610795611189565b6040519080825280602002602001820160405280156107be578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b0382161580159061080257506001600160a01b038216600114155b801561080d57508381105b156108665781838281518110610825576108256110f9565b6001600160a01b039283166020918202929092018101919091529281165f90815292879052604090922054909116908061085e816111b1565b9150506107e0565b6001600160a01b03821660011480159061087f57505f81115b156108ab57826108906001836111c9565b815181106108a0576108a06110f9565b602002602001015191505b80835250935093915050565b7ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea026108e28185610bca565b6040516306d61fe760e41b81526001600160a01b03851690636d61fe709061091090869086906004016111dc565b5f604051808303815f87803b158015610927575f5ffd5b505af11580156106ca573d5f5f3e3d5ffd5b7ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea036108e28185610bca565b5f61098d7f36e05829dd1b9a4411d96a3549582172d7f071c1c0db5c573fcf94eb284316085490565b90506001600160a01b038116156109c25760405163741cbe0360e01b81526001600160a01b0382166004820152602401610113565b6108e2847f36e05829dd1b9a4411d96a3549582172d7f071c1c0db5c573fcf94eb2843160855565b5f6109f860048284866111ef565b610a0191611216565b90505f83836004818110610a1757610a176110f9565b909101356001600160f81b03191691505f9050610a3784600581886111ef565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350610a799250859150610c9e9050565b15610ac65760405162461bcd60e51b815260206004820152601e60248201527f46756e6374696f6e2073656c6563746f7220616c7265616479207573656400006044820152606401610113565b6040805180820182526001600160a01b038881168083526001600160f81b0319861660208085019182526001600160e01b031989165f9081525f51602061124f5f395f51905f5290915285902093518454915160f81c600160a01b026001600160a81b03199092169316929092179190911790915590516306d61fe760e41b8152636d61fe7090610b5b908490600401610e0c565b5f604051808303815f87803b158015610b72575f5ffd5b505af1158015610b84573d5f5f3e3d5ffd5b50505050505050505050565b5f60016001600160a01b03831614801590610bc357506001600160a01b038281165f908152602085905260409020541615155b9392505050565b6001600160a01b0381161580610be957506001600160a01b0381166001145b15610c1257604051637c84ecfb60e01b81526001600160a01b0382166004820152602401610113565b6001600160a01b038181165f908152602084905260409020541615610c5557604051631034f46960e21b81526001600160a01b0382166004820152602401610113565b60015f818152602093909352604080842080546001600160a01b039485168087529286208054959091166001600160a01b03199586161790559190935280549091169091179055565b6001600160e01b0319165f9081525f51602061124f5f395f51905f5260205260409020546001600160a01b0316151590565b5f5f83601f840112610ce0575f5ffd5b50813567ffffffffffffffff811115610cf7575f5ffd5b6020830191508360208260051b8501011115610487575f5ffd5b5f5f5f5f5f5f5f6080888a031215610d27575f5ffd5b873567ffffffffffffffff811115610d3d575f5ffd5b610d498a828b01610cd0565b909850965050602088013567ffffffffffffffff811115610d68575f5ffd5b610d748a828b01610cd0565b909650945050604088013567ffffffffffffffff811115610d93575f5ffd5b88016040818b031215610da4575f5ffd5b9250606088013567ffffffffffffffff811115610dbf575f5ffd5b610dcb8a828b01610cd0565b989b979a50959850939692959293505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610bc36020830184610dde565b6001600160a01b0381168114610e32575f5ffd5b50565b5f5f60408385031215610e46575f5ffd5b8235610e5181610e1e565b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b81811015610ea15783516001600160a01b0316835260209384019390920191600101610e7a565b50506001600160a01b039490941660209390930192909252509092915050565b5f5f5f60408486031215610ed3575f5ffd5b8335610ede81610e1e565b9250602084013567ffffffffffffffff811115610ef9575f5ffd5b8401601f81018613610f09575f5ffd5b803567ffffffffffffffff811115610f1f575f5ffd5b866020828401011115610f30575f5ffd5b939660209190910195509293505050565b5f60208284031215610f51575f5ffd5b81356001600160e01b031981168114610bc3575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135610f9c81610e1e565b6001600160a01b03168352602082013536839003601e19018112610fbe575f5ffd5b820160208101903567ffffffffffffffff811115610fda575f5ffd5b803603821315610fe8575f5ffd5b60406020860152610ffd604086018284610f68565b95945050505050565b5f8383855260208501945060208460051b820101835f5b8681101561106557838303601f19018852813536879003603e19018112611042575f5ffd5b61104e84888301610f90565b6020998a019990945092909201915060010161101d565b50909695505050505050565b608081525f61108460808301898b611006565b828103602084015261109781888a611006565b905082810360408401526110ab8187610f90565b905082810360608401526110c0818587611006565b9a9950505050505050505050565b6001600160a01b03831681526040602082018190525f906110f190830184610dde565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112611121575f5ffd5b9190910192915050565b5f6020828403121561113b575f5ffd5b8135610bc381610e1e565b5f5f8335601e1984360301811261115b575f5ffd5b83018035915067ffffffffffffffff821115611175575f5ffd5b602001915036819003821315610487575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016111c2576111c261119d565b5060010190565b818103818111156103955761039561119d565b602081525f6110f1602083018486610f68565b5f5f858511156111fd575f5ffd5b83861115611209575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015611247576001600160e01b0319600485900360031b81901b82161691505b509291505056fef88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea04a26469706673582212207f8df2c19a2c8e169be0659188dfe64559741fb2ca38b30f93836a17f2cbc4e764736f6c634300081b0033"; + hex"6080604052348015600e575f5ffd5b506112a48061001c5f395ff3fe60806040526004361061007e575f3560e01c80636b0d5cc41161004d5780636b0d5cc414610271578063b0d691fe14610290578063ea5f61d0146102b2578063eac9b20d146102d157610085565b80630a664dba146101c85780635e87556d146101f95780635faac46b14610225578063642219af1461025257610085565b3661008557005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a02821417156100b057806020526020603cf35b505f80356001600160e01b03191681525f51602061124f5f395f51905f526020526040902080546001600160a01b03811690600160a01b900460f81b8161011c57604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b61012a81607f60f91b610384565b1561017b5760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa905061016a3d60408051918201905290565b3d5f823e81610177573d81fd5b3d81f35b610185815f610384565b156101c65760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af1905061016a3d60408051918201905290565b005b3480156101d3575f5ffd5b506101dc61039b565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610204575f5ffd5b50610218610213366004610d11565b6103c9565b6040516101f09190610e0c565b348015610230575f5ffd5b5061024461023f366004610e35565b610452565b6040516101f0929190610e5f565b34801561025d575f5ffd5b506101c661026c366004610d11565b61048e565b34801561027c575f5ffd5b506101c661028b366004610ec1565b6106d4565b34801561029b575f5ffd5b506f71727de22e5e9d8baf0edac6f37da0326101dc565b3480156102bd575f5ffd5b506102446102cc366004610e35565b6106e4565b3480156102dc575f5ffd5b506103566102eb366004610f41565b6040805180820182525f80825260209182018190526001600160e01b03199390931683525f51602061124f5f395f51905f528152918190208151808301909252546001600160a01b0381168252600160a01b900460f81b6001600160f81b0319169181019190915290565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016101f0565b6001600160f81b0319828116908216145b92915050565b5f6103c47fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005490565b905090565b606030306001600160a01b031663642219af8a8a8a8a8a8a8a6040516024016103f89796959493929190611071565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506040516020016104369291906110ce565b6040516020818303038152906040529050979650505050505050565b60605f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a90061048181868661070f565b92509250505b9250929050565b5f5b8681101561050c576105048888838181106104ad576104ad6110f9565b90506020028101906104bf919061110d565b6104cd90602081019061112b565b8989848181106104df576104df6110f9565b90506020028101906104f1919061110d565b6104ff906020810190611146565b6108b7565b600101610490565b505f5b848110156105cc575f86868381811061052a5761052a6110f9565b905060200281019061053c919061110d565b61054a90602081019061112b565b6001600160a01b0316146105c4576105c486868381811061056d5761056d6110f9565b905060200281019061057f919061110d565b61058d90602081019061112b565b87878481811061059f5761059f6110f9565b90506020028101906105b1919061110d565b6105bf906020810190611146565b610939565b60010161050f565b505f6105db602085018561112b565b6001600160a01b03161461060b5761060b6105f9602085018561112b565b6106066020860186611146565b610964565b5f5b818110156106ca575f838383818110610628576106286110f9565b905060200281019061063a919061110d565b61064890602081019061112b565b6001600160a01b0316146106c2576106c283838381811061066b5761066b6110f9565b905060200281019061067d919061110d565b61068b90602081019061112b565b84848481811061069d5761069d6110f9565b90506020028101906106af919061110d565b6106bd906020810190611146565b6109ea565b60010161060d565b5050505050505050565b6106df8383836108b7565b505050565b60605f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9016104818186865b60605f6001600160a01b03841660011480159061073357506107318585610b90565b155b1561075c57604051637c84ecfb60e01b81526001600160a01b0385166004820152602401610113565b825f0361077c5760405163f725081760e01b815260040160405180910390fd5b8267ffffffffffffffff81111561079557610795611189565b6040519080825280602002602001820160405280156107be578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b0382161580159061080257506001600160a01b038216600114155b801561080d57508381105b156108665781838281518110610825576108256110f9565b6001600160a01b039283166020918202929092018101919091529281165f90815292879052604090922054909116908061085e816111b1565b9150506107e0565b6001600160a01b03821660011480159061087f57505f81115b156108ab57826108906001836111c9565b815181106108a0576108a06110f9565b602002602001015191505b80835250935093915050565b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9006108e28185610bca565b6040516306d61fe760e41b81526001600160a01b03851690636d61fe709061091090869086906004016111dc565b5f604051808303815f87803b158015610927575f5ffd5b505af11580156106ca573d5f5f3e3d5ffd5b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9016108e28185610bca565b5f61098d7fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005490565b90506001600160a01b038116156109c25760405163741cbe0360e01b81526001600160a01b0382166004820152602401610113565b6108e2847fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e459820055565b5f6109f860048284866111ef565b610a0191611216565b90505f83836004818110610a1757610a176110f9565b909101356001600160f81b03191691505f9050610a3784600581886111ef565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350610a799250859150610c9e9050565b15610ac65760405162461bcd60e51b815260206004820152601e60248201527f46756e6374696f6e2073656c6563746f7220616c7265616479207573656400006044820152606401610113565b6040805180820182526001600160a01b038881168083526001600160f81b0319861660208085019182526001600160e01b031989165f9081525f51602061124f5f395f51905f5290915285902093518454915160f81c600160a01b026001600160a81b03199092169316929092179190911790915590516306d61fe760e41b8152636d61fe7090610b5b908490600401610e0c565b5f604051808303815f87803b158015610b72575f5ffd5b505af1158015610b84573d5f5f3e3d5ffd5b50505050505050505050565b5f60016001600160a01b03831614801590610bc357506001600160a01b038281165f908152602085905260409020541615155b9392505050565b6001600160a01b0381161580610be957506001600160a01b0381166001145b15610c1257604051637c84ecfb60e01b81526001600160a01b0382166004820152602401610113565b6001600160a01b038181165f908152602084905260409020541615610c5557604051631034f46960e21b81526001600160a01b0382166004820152602401610113565b60015f818152602093909352604080842080546001600160a01b039485168087529286208054959091166001600160a01b03199586161790559190935280549091169091179055565b6001600160e01b0319165f9081525f51602061124f5f395f51905f5260205260409020546001600160a01b0316151590565b5f5f83601f840112610ce0575f5ffd5b50813567ffffffffffffffff811115610cf7575f5ffd5b6020830191508360208260051b8501011115610487575f5ffd5b5f5f5f5f5f5f5f6080888a031215610d27575f5ffd5b873567ffffffffffffffff811115610d3d575f5ffd5b610d498a828b01610cd0565b909850965050602088013567ffffffffffffffff811115610d68575f5ffd5b610d748a828b01610cd0565b909650945050604088013567ffffffffffffffff811115610d93575f5ffd5b88016040818b031215610da4575f5ffd5b9250606088013567ffffffffffffffff811115610dbf575f5ffd5b610dcb8a828b01610cd0565b989b979a50959850939692959293505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610bc36020830184610dde565b6001600160a01b0381168114610e32575f5ffd5b50565b5f5f60408385031215610e46575f5ffd5b8235610e5181610e1e565b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b81811015610ea15783516001600160a01b0316835260209384019390920191600101610e7a565b50506001600160a01b039490941660209390930192909252509092915050565b5f5f5f60408486031215610ed3575f5ffd5b8335610ede81610e1e565b9250602084013567ffffffffffffffff811115610ef9575f5ffd5b8401601f81018613610f09575f5ffd5b803567ffffffffffffffff811115610f1f575f5ffd5b866020828401011115610f30575f5ffd5b939660209190910195509293505050565b5f60208284031215610f51575f5ffd5b81356001600160e01b031981168114610bc3575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135610f9c81610e1e565b6001600160a01b03168352602082013536839003601e19018112610fbe575f5ffd5b820160208101903567ffffffffffffffff811115610fda575f5ffd5b803603821315610fe8575f5ffd5b60406020860152610ffd604086018284610f68565b95945050505050565b5f8383855260208501945060208460051b820101835f5b8681101561106557838303601f19018852813536879003603e19018112611042575f5ffd5b61104e84888301610f90565b6020998a019990945092909201915060010161101d565b50909695505050505050565b608081525f61108460808301898b611006565b828103602084015261109781888a611006565b905082810360408401526110ab8187610f90565b905082810360608401526110c0818587611006565b9a9950505050505050505050565b6001600160a01b03831681526040602082018190525f906110f190830184610dde565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112611121575f5ffd5b9190910192915050565b5f6020828403121561113b575f5ffd5b8135610bc381610e1e565b5f5f8335601e1984360301811261115b575f5ffd5b83018035915067ffffffffffffffff821115611175575f5ffd5b602001915036819003821315610487575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016111c2576111c261119d565b5060010190565b818103818111156103955761039561119d565b602081525f6110f1602083018486610f68565b5f5f858511156111fd575f5ffd5b83861115611209575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015611247576001600160e01b0319600485900360031b81901b82161691505b509291505056fee3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a902a2646970667358221220840aaf482814aab1ad892b5651c64fa9e92a08ceec981e947f5bad9f932b5d3b64736f6c634300081c0033"; bytes public constant ERC7579_RHINESTONE_TRAMPOLOINE_BYTECODE = hex"6080604052348015600e575f5ffd5b5061081d8061001c5f395ff3fe608060405260043610610058575f3560e01c80630a664dba146101b55780635faac46b146101e6578063b0d691fe14610213578063e1c7392a14610235578063ea5f61d014610249578063eac9b20d146102685761005f565b3661005f57005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a028214171561008a57806020526020603cf35b505f80356001600160e01b03191681527ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea046020526040902080546001600160a01b03811690600160a01b900460f81b8161010957604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b61011781607f60f91b61032e565b156101685760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa90506101573d60408051918201905290565b3d5f823e81610164573d81fd5b3d81f35b610172815f61032e565b156101b35760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af190506101573d60408051918201905290565b005b3480156101c0575f5ffd5b506101c9610345565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101f1575f5ffd5b5061020561020036600461068d565b610373565b6040516101dd9291906106c2565b34801561021e575f5ffd5b506f71727de22e5e9d8baf0edac6f37da0326101c9565b348015610240575f5ffd5b506101b36103ae565b348015610254575f5ffd5b5061020561026336600461068d565b610480565b348015610273575f5ffd5b50610300610282366004610724565b6040805180820182525f80825260209182018190526001600160e01b03199390931683527ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea048152918190208151808301909252546001600160a01b0381168252600160a01b900460f81b6001600160f81b0319169181019190915290565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016101dd565b6001600160f81b0319828116908216145b92915050565b5f61036e7f36e05829dd1b9a4411d96a3549582172d7f071c1c0db5c573fcf94eb284316085490565b905090565b60605f7ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea026103a28186866104ab565b92509250509250929050565b6103ea7334dedac925c00d63bd91800ff821e535fe59d6f57f36e05829dd1b9a4411d96a3549582172d7f071c1c0db5c573fcf94eb2843160855565b60408051737066f491ce8b5f782f315dfbd549f2107a32641360611b60208201528151601481830301815260348201928390526306d61fe760e41b9092527334dedac925c00d63bd91800ff821e535fe59d6f591636d61fe7091610451919060380161074b565b5f604051808303815f87803b158015610468575f5ffd5b505af115801561047a573d5f5f3e3d5ffd5b50505050565b60605f7ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea036103a28186865b60605f6001600160a01b0384166001148015906104cf57506104cd8585610653565b155b156104f857604051637c84ecfb60e01b81526001600160a01b0385166004820152602401610100565b825f036105185760405163f725081760e01b815260040160405180910390fd5b8267ffffffffffffffff81111561053157610531610780565b60405190808252806020026020018201604052801561055a578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b0382161580159061059e57506001600160a01b038216600114155b80156105a957508381105b1561060257818382815181106105c1576105c1610794565b6001600160a01b039283166020918202929092018101919091529281165f9081529287905260409092205490911690806105fa816107bc565b91505061057c565b6001600160a01b03821660011480159061061b57505f81115b15610647578261062c6001836107d4565b8151811061063c5761063c610794565b602002602001015191505b80835250935093915050565b5f60016001600160a01b0383161480159061068657506001600160a01b038281165f908152602085905260409020541615155b9392505050565b5f5f6040838503121561069e575f5ffd5b82356001600160a01b03811681146106b4575f5ffd5b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b818110156107045783516001600160a01b03168352602093840193909201916001016106dd565b50506001600160a01b039490941660209390930192909252509092915050565b5f60208284031215610734575f5ffd5b81356001600160e01b031981168114610686575f5ffd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016107cd576107cd6107a8565b5060010190565b8181038181111561033f5761033f6107a856fea26469706673582212208b8d179eb9f1d514092184d86650903af803b01f367d0d2440620538d93230ac64736f6c634300081b0033"; bytes public constant MSAPROXY_BYTECODE = - hex"60806040526040516104003803806104008339810160408190526100229161026c565b61002a61003b565b6100348282610063565b5050610351565b7f15839c8259ca8706cafa7ed5f198b3de1472c96ca2900b32a679090cc8a614de6001815d50565b61006c826100c1565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100b5576100b0828261013c565b505050565b6100bd6101af565b5050565b806001600160a01b03163b5f036100fb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051610158919061033b565b5f60405180830381855af49150503d805f8114610190576040519150601f19603f3d011682016040523d82523d5f602084013e610195565b606091505b5090925090506101a68583836101d0565b95945050505050565b34156101ce5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101e5576101e08261022f565b610228565b81511580156101fc57506001600160a01b0384163b155b1561022557604051639996b31560e01b81526001600160a01b03851660048201526024016100f2565b50805b9392505050565b80511561023f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561027d575f80fd5b82516001600160a01b0381168114610293575f80fd5b60208401519092506001600160401b038111156102ae575f80fd5b8301601f810185136102be575f80fd5b80516001600160401b038111156102d7576102d7610258565b604051601f8201601f19908116603f011681016001600160401b038111828210171561030557610305610258565b60405281815282820160200187101561031c575f80fd5b8160208401602083015e5f602083830101528093505050509250929050565b5f82518060208501845e5f920191825250919050565b60a38061035d5f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156069573d5ff35b3d5ffdfea2646970667358221220e3c8c97d834e82a83c1185c7042bb7bd31705d6e60df591502afb5b12fe921b464736f6c634300081a0033"; + hex"608060405260405161045a38038061045a833981016040819052610022916102a7565b61002a61003b565b610034828261009c565b50506103ab565b5f60ff1961006a60017ff63b257b7881773a84d328ab92140e19ab791f7b439c76ba9837aa0d6ad30af0610376565b60405160200161007c91815260200190565b604051602081830303815290604052805190602001201690506001815d50565b6100a5826100fa565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100ee576100e98282610175565b505050565b6100f66101ea565b5050565b806001600160a01b03163b5f0361013457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b0316846040516101919190610395565b5f60405180830381855af49150503d805f81146101c9576040519150601f19603f3d011682016040523d82523d5f602084013e6101ce565b606091505b5090925090506101df85838361020b565b925050505b92915050565b34156102095760405163b398979f60e01b815260040160405180910390fd5b565b6060826102205761021b8261026a565b610263565b815115801561023757506001600160a01b0384163b155b1561026057604051639996b31560e01b81526001600160a01b038516600482015260240161012b565b50805b9392505050565b80511561027a5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156102b8575f5ffd5b82516001600160a01b03811681146102ce575f5ffd5b60208401519092506001600160401b038111156102e9575f5ffd5b8301601f810185136102f9575f5ffd5b80516001600160401b0381111561031257610312610293565b604051601f8201601f19908116603f011681016001600160401b038111828210171561034057610340610293565b604052818152828201602001871015610357575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b818103818111156101e457634e487b7160e01b5f52601160045260245ffd5b5f82518060208501845e5f920191825250919050565b60a3806103b75f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156069573d5ff35b3d5ffdfea2646970667358221220917b117bd639a5c1424676eeebd5c60b66b5c82bd16f9df87d1255745f0c121964736f6c634300081c0033"; } From 273012fd4ad88c327fa61c2ec75cfd5a527b9c1b Mon Sep 17 00:00:00 2001 From: highskore Date: Mon, 17 Feb 2025 19:26:29 +0100 Subject: [PATCH 07/15] feat: update 7579 constants --- src/module-bases/utils/ERC7579Constants.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/module-bases/utils/ERC7579Constants.sol b/src/module-bases/utils/ERC7579Constants.sol index 7f927857..e075df58 100644 --- a/src/module-bases/utils/ERC7579Constants.sol +++ b/src/module-bases/utils/ERC7579Constants.sol @@ -8,3 +8,5 @@ uint256 constant MODULE_TYPE_HOOK = 4; uint256 constant MODULE_TYPE_POLICY = 5; uint256 constant MODULE_TYPE_SIGNER = 6; uint256 constant MODULE_TYPE_STATELESS_VALIDATOR = 7; +uint256 constant MODULE_TYPE_PREVALIDATION_HOOK_ERC1271 = 8; +uint256 constant MODULE_TYPE_PREVALIDATION_HOOK_ERC4337 = 9; From 334e71e7d117cdc1e9e7c8dc8e589848dfe3b10b Mon Sep 17 00:00:00 2001 From: highskore Date: Thu, 20 Feb 2025 21:15:03 +0100 Subject: [PATCH 08/15] feat(Safe7579Precompiles): update Safe7579 to pvh version --- src/deployment/precompiles/Safe7579Precompiles.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/deployment/precompiles/Safe7579Precompiles.sol b/src/deployment/precompiles/Safe7579Precompiles.sol index bdf0b328..0f8e6c8c 100644 --- a/src/deployment/precompiles/Safe7579Precompiles.sol +++ b/src/deployment/precompiles/Safe7579Precompiles.sol @@ -51,13 +51,13 @@ contract Safe7579Precompiles is BytecodeDeployer { /* solhint-disable max-line-length */ bytes public constant SAFE7579_BYTECODE = - hex"60a0604052348015600f57600080fd5b50604051601a906046565b604051809103906000f0801580156035573d6000803e3d6000fd5b506001600160a01b03166080526053565b6109e180614ee983390190565b608051614e2e6100bb600039600081816112230152818161141b0152818161157c01528181611dc501528181612216015281816122f0015281816123870152818161241e0152818161357a015281816136320152818161395a0152613a7a0152614e2e6000f3fe60806040526004361061012e5760003560e01c8063a71763a8116100ab578063d828435d1161006f578063d828435d146104a2578063e9ae5c53146104c2578063ea5f61d0146104e2578063eab77e1714610502578063f2dc691d14610522578063f698da251461054257610135565b8063a71763a8146103c7578063b0d691fe146103e7578063b875d5d81461040a578063d03c791414610455578063d691c9641461047557610135565b806355d559f4116100f257806355d559f4146102dd5780635faac46b1461030d57806379aad60e1461033b5780639517e29f1461035b5780639cfd7cff1461037b57610135565b80630a664dba146101e0578063112d3a7d146102245780631626ba7e1461025457806319822f7c1461028d578063540fb4f9146102bb57610135565b3661013557005b600036606060003560e01c63bc197c81811463f23a6e6182141763150b7a028214171561016657806020526020603cf35b50336000818152600460209081526040808320546001600160e01b031984351680855260058452828520958552949092528220546001600160a01b0391821692911690806101b48484610557565b915091506101c28888610615565b95506101d084848484610728565b5050505050915050805190602001f35b3480156101ec57600080fd5b50336000908152600460205260409020546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023057600080fd5b5061024461023f366004613d49565b6107ab565b604051901515815260200161021b565b34801561026057600080fd5b5061027461026f366004613da4565b610820565b6040516001600160e01b0319909116815260200161021b565b34801561029957600080fd5b506102ad6102a8366004613e08565b610b96565b60405190815260200161021b565b3480156102c757600080fd5b506102db6102d6366004613eab565b610caa565b005b3480156102e957600080fd5b506102fd6102f8366004613fa7565b610d5a565b60405161021b9493929190614048565b34801561031957600080fd5b5061032d610328366004614094565b610fb7565b60405161021b9291906140c0565b34801561034757600080fd5b506102db610356366004614123565b610fd3565b34801561036757600080fd5b506102db610376366004613d49565b6110c8565b34801561038757600080fd5b50604080518082018252601a81527f7268696e6573746f6e652e73616665373537392e76312e302e300000000000006020820152905161021b9190614164565b3480156103d357600080fd5b506102db6103e2366004613d49565b611293565b3480156103f357600080fd5b506f71727de22e5e9d8baf0edac6f37da032610207565b34801561041657600080fd5b5061020761042536600461418d565b6001600160e01b03191660009081526005602090815260408083203384529091529020546001600160a01b031690565b34801561046157600080fd5b506102446104703660046141aa565b6115ba565b34801561048157600080fd5b50610495610490366004613da4565b611662565b60405161021b91906141c3565b3480156104ae57600080fd5b506102ad6104bd366004614228565b61174b565b3480156104ce57600080fd5b506102db6104dd366004613da4565b6117eb565b3480156104ee57600080fd5b5061032d6104fd366004614094565b611b88565b34801561050e57600080fd5b506102db61051d366004614267565b611b99565b34801561052e57600080fd5b5061024461053d3660046141aa565b611c08565b34801561054e57600080fd5b506102ad611c57565b6060806001600160a01b038416156105d7576105be33856000610578611cb0565b3460003660405160240161058f94939291906142f6565b60408051601f198184030181529190526020810180516001600160e01b031663d68f602560e01b179052611cbc565b9150818060200190518101906105d491906143df565b91505b6001600160a01b0383161561060e576105f533846000610578611cb0565b90508080602001905181019061060b91906143df565b90505b9250929050565b600080356001600160e01b031916815260036020908152604080832033845290915290208054606091906001600160a01b03811690600160a01b900460f81b8161068557604051632464e76d60e11b81526001600160e01b03196000351660048201526024015b60405180910390fd5b61069381607f60f91b611d65565b156106d7576106cd338388886106a7611cb0565b6040516020016106b993929190614413565b604051602081830303815290604052611d77565b9350505050610722565b6106e2816000611d65565b1561071e576106cd3383600089896106f8611cb0565b60405160200161070a93929190614413565b604051602081830303815290604052611cbc565b5050505b92915050565b6001600160a01b0384161561077e5761077e338560008560405160240161074f9190614164565b60408051601f198184030181529190526020810180516001600160e01b0316630b9dfbed60e11b179052611e4c565b6001600160a01b038316156107a5576107a5338460008460405160240161074f9190614164565b50505050565b6000600185036107dd57336001600160a01b038516036107cd57506001610818565b6107d684611eeb565b9050610818565b600285036107ee576107d684611ef9565b60038503610801576107d6848484611f07565b60048503610814576107d6848484611f53565b5060005b949350505050565b6000338282036109ba5760006108f1826001600160a01b031663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108919190614439565b60408051602081018a90527f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca91015b60408051601f1981840301815282825280516020918201209083015201604051602081830303815290604052611f8e565b8051602090910120604051635ae6bd3760e01b8152600481018290529091506001600160a01b03831690635ae6bd3790602401602060405180830381865afa158015610941573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109659190614439565b6000036109a85760405162461bcd60e51b815260206004820152601160248201527012185cda081b9bdd08185c1c1c9bdd9959607a1b604482015260640161067c565b50630b135d3f60e11b9150610b8f9050565b60006109c96014828688614452565b6109d29161447c565b60601c90508015806109ea57506109e881611eeb565b155b15610b14576000610a89836001600160a01b031663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a569190614439565b60408051602081018b90527f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca91016108c0565b805160208201209091506001600160a01b03841663934f3a118284610ab18a6014818e614452565b6040518563ffffffff1660e01b8152600401610ad094939291906144c9565b60006040518083038186803b158015610ae857600080fd5b505afa158015610afc573d6000803e3d6000fd5b50630b135d3f60e11b9750610b8f9650505050505050565b6000610b733383610b23611cb0565b8a610b318a6014818e614452565b604051602401610b4494939291906142f6565b60408051601f198184030181529190526020810180516001600160e01b0316637aa8f17760e11b179052611d77565b905080806020019051810190610b8991906144f5565b93505050505b9392505050565b60006f71727de22e5e9d8baf0edac6f37da032610bb1611cb0565b6001600160a01b031614610bd857604051635629665f60e11b815260040160405180910390fd5b6020840135606081901c90811580610bf65750610bf482611eeb565b155b15610c0b57610c0486612008565b9250610c70565b6000610c56338460008a8a604051602401610c27929190614557565b60408051601f198184030181529190526020810180516001600160e01b0316639700320360e01b179052611cbc565b905080806020019051810190610c6c9190614439565b9350505b8315610ca157610ca1336f71727de22e5e9d8baf0edac6f37da0328660405180602001604052806000815250611e4c565b50509392505050565b6f71727de22e5e9d8baf0edac6f37da032610cc3611cb0565b6001600160a01b03161480610cf05750610cdb611cb0565b6001600160a01b0316336001600160a01b0316145b610d0d57604051635629665f60e11b815260040160405180910390fd5b610d3f610d1d602083018361465b565b610d2a6020840184614678565b610d3a60608601604087016146c1565b6120b7565b610d4f898989898989898961216e565b505050505050505050565b6060600080823682610d706101008901896146dc565b9092509050610d83600660008385614452565b610d8c91614722565b60d01c9450610d9f600c60068385614452565b610da891614722565b60d01c9350610dba81600c8185614452565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604080516101c081019091527fc03dfc11d8b10bf9cf703d558958c8c42777f785d998c62060d85a4f0ef6ea7f815294975095509293505060208084019250610e3691508a018a61465b565b6001600160a01b0316815260200188602001358152602001888060400190610e5e91906146dc565b604051610e6c929190614758565b6040519081900390208152602001610e8760608a018a6146dc565b604051610e95929190614758565b60405180910390208152602001610eab8961248d565b6001600160801b03168152602001610ec28961249d565b6001600160801b031681526020018860a001358152602001610ee3896124b2565b6001600160801b03168152602001610efa896124c1565b6001600160801b03168152602001610f1560e08a018a6146dc565b604051610f23929190614758565b6040805191829003909120825265ffffffffffff80881660208401528616908201526001600160a01b0388166060909101526101c08120909150601960f81b600160f81b610f6f611c57565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529550505092959194509250565b60606000610fc860013386866124d6565b915091509250929050565b6f71727de22e5e9d8baf0edac6f37da032610fec611cb0565b6001600160a01b031614806110195750611004611cb0565b6001600160a01b0316336001600160a01b0316145b61103657604051635629665f60e11b815260040160405180910390fd5b61104160013361269a565b8060005b81811015611097573684848381811061106057611060614768565b9050602002810190611072919061477e565b905061108e33611085602084018461465b565b60019190612715565b50600101611045565b5060405133907ff48581d8a62b775b74f2fb67f1d5806a9a356fbcc598040ab3071d3e37af40c290600090a2505050565b336000908152600460209081526040808320547fd00bcad91b775f25eb0aee15808d12dfdaa6dc5a7d6b754e26f9c205d2a3b8df909252822054639517e29f60e01b926001600160a01b039283169290911690806111268484610557565b915091506111416f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b0316611152611cb0565b6001600160a01b0316148061117f575061116a611cb0565b6001600160a01b0316336001600160a01b0316145b61119c57604051635629665f60e11b815260040160405180910390fd5b606060018a036111b8576111b189898961280a565b905061121d565b60028a036111cb576111b1898989612866565b60038a036111de576111b1898989612881565b60048a036111f1576111b1898989612a00565b89611201576111b1898989612ba0565b60405163041c38b360e41b8152600481018b905260240161067c565b611286337f00000000000000000000000000000000000000000000000000000000000000008c8c856040516024016112579392919061479e565b60408051601f198184030181529190526020810180516001600160e01b0316639517e29f60e01b179052612d51565b50610d4f84848484610728565b336000908152600460209081526040808320547fc45a7acaba78a7b4c4432b604d301355b314c0a7811768a1ee2563c9d34ca4e09092529091205484916314e2ec7560e31b916001600160a01b0391821691908116908416821480159061130c5750806001600160a01b0316846001600160a01b031614155b156114925760008061131e8484610557565b915091506113396f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b031661134a611cb0565b6001600160a01b031614806113775750611362611cb0565b6001600160a01b0316336001600160a01b0316145b61139457604051635629665f60e11b815260040160405180910390fd5b606060018b036113b0576113a98a8a8a612dea565b9050611415565b60028b036113c3576113a98a8a8a612e13565b60038b036113d6576113a98a8a8a612e34565b60048b036113e9576113a98a8a8a612e80565b8a6113f9576113a98a8a8a612f38565b60405163041c38b360e41b8152600481018c905260240161067c565b61147e337f00000000000000000000000000000000000000000000000000000000000000008d8d8560405160240161144f9392919061479e565b60408051601f198184030181529190526020810180516001600160e01b0316637827252560e01b17905261308b565b5061148b84848484610728565b50506115b0565b6f71727de22e5e9d8baf0edac6f37da0326114ab611cb0565b6001600160a01b031614806114d857506114c3611cb0565b6001600160a01b0316336001600160a01b0316145b6114f557604051635629665f60e11b815260040160405180910390fd5b6060600189036115115761150a888888612dea565b9050611576565b600289036115245761150a888888612e13565b600389036115375761150a888888612e34565b6004890361154a5761150a888888612e80565b8861155a5761150a888888612f38565b60405163041c38b360e41b8152600481018a905260240161067c565b610d4f337f00000000000000000000000000000000000000000000000000000000000000008b8b8560405160240161144f9392919061479e565b5050505050505050565b600081600881901b6115d082600160f81b611d65565b156115de5760019250611621565b6115e9826000611d65565b156115f75760019250611621565b611609826001600160f81b0319611d65565b156116175760019250611621565b5060009392505050565b8280156116345750611634816000611d65565b15611640575050919050565b828015611656575061165681600160f81b611d65565b15611617575050919050565b606061167461166f611cb0565b611ef9565b6116a557611680611cb0565b604051635c93ff2f60e11b81526001600160a01b03909116600482015260240161067c565b336000908152600460209081526040808320547f4162c930ade27880570b0eb31efbc8a626b97e81a40ced27163509dfe16398829092528220546335a4725960e21b926001600160a01b039283169290911690806117038484610557565b9150915061170f611cb0565b600261171b8282613141565b8a600881901b61172d81838e8e6131cc565b99505050505061173f84848484610728565b50505050509392505050565b6000602082901b640100000000600160c01b03166f71727de22e5e9d8baf0edac6f37da032604051631aab3f0d60e11b81526001600160a01b0386811660048301526001600160c01b038416602483015291909116906335567e1a90604401602060405180830381865afa1580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108189190614439565b336000908152600460209081526040808320547fccfe1b2bef70acd8e661aeb5430e147f4c75cb320972acba718a28da428e1a3090925282205463e9ae5c5360e01b926001600160a01b039283169290911690806118498484610557565b915091506118646f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b0316611875611cb0565b6001600160a01b031614806118a2575061188d611cb0565b6001600160a01b0316336001600160a01b0316145b6118bf57604051635629665f60e11b815260040160405180910390fd5b87600881901b336118d1826000611d65565b15611a2a576118e483600160f81b611d65565b156119055789358a016020810190356118fe838383613574565b5050611b79565b611910836000611d65565b15611978576000803660006119258e8e6135db565b935093509350935061196f85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e4c92505050565b50505050611b79565b61198a836001600160f81b0319611d65565b15611a0f57600061199e6014828c8e614452565b6119a79161447c565b60601c90503660008c8c60149080926119c293929190614452565b91509150611a07848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612d5192505050565b505050611b79565b82604051632e5bf3f960e21b815260040161067c91906147d1565b611a3882600160f81b611d65565b15611b5e57611a4b83600160f81b611d65565b15611a655789358a016020810190356118fe83838361362c565b611a70836000611d65565b15611acf57600080366000611a858e8e6135db565b935093509350935061196f85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061369392505050565b611ae1836001600160f81b0319611d65565b15611a0f576000611af56014828c8e614452565b611afe9161447c565b60601c90503660008c8c6014908092611b1993929190614452565b91509150611a07848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061308b92505050565b816040516308c3ee0360e11b815260040161067c91906147d1565b5050506115b084848484610728565b60606000610fc860023386866124d6565b6f71727de22e5e9d8baf0edac6f37da032611bb2611cb0565b6001600160a01b03161480611bdf5750611bca611cb0565b6001600160a01b0316336001600160a01b0316145b611bfc57604051635629665f60e11b815260040160405180910390fd5b6107a5848484846120b7565b600060018203611c1a57506001919050565b60028203611c2a57506001919050565b60038203611c3a57506001919050565b60048203611c4a57506001919050565b506000919050565b919050565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b60131936013560601c90565b60606000856001600160a01b0316635229073f86868660006040518563ffffffff1660e01b8152600401611cf3949392919061481e565b6000604051808303816000875af1158015611d12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d3a9190810190614864565b9250905080611d5c57604051632b3f6d1160e21b815260040160405180910390fd5b50949350505050565b6001600160f81b031990811691161490565b606060008383604051602401611d8e9291906148b1565b60408051601f198184030181529181526020820180516001600160e01b0316636a22165760e01b17905251909150600090611def907f00000000000000000000000000000000000000000000000000000000000000009084906024016148b1565b60408051601f19818403018152919052602080820180516001600160e01b031663b4faba0960e01b17815282519293509091600091895afa5060203d036040519350808401604052806020853e50600051610ca157825160208401fd5b60405163468721a760e01b81526000906001600160a01b0386169063468721a790611e8190879087908790879060040161481e565b6020604051808303816000875af1158015611ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec491906148d5565b905080611ee457604051632b3f6d1160e21b815260040160405180910390fd5b5050505050565b600061072260013384613749565b600061072260023384613749565b600080611f168385018561418d565b6001600160e01b03191660009081526003602090815260408083203384529091529020546001600160a01b03908116908616149150509392505050565b60008080611f63848601866148ff565b915091506000611f73838361378d565b6001600160a01b039081169088161493505050509392505050565b6060601960f81b600160f81b858585604051602001611fae92919061492b565b60408051808303601f190181529082905280516020918201206001600160f81b0319958616918301919091529290931660218401526022830152604282015260620160405160208183030381529060405290509392505050565b600080808080612028866f71727de22e5e9d8baf0edac6f37da032610d5a565b8351602085012060405163934f3a1160e01b81529498509296509094509250339163934f3a119161205f9188908690600401614951565b60006040518083038186803b15801561207757600080fd5b505afa925050508015612088575060015b61209f5761209860018385613823565b94506120ae565b6120ab60008385613823565b94505b50505050919050565b33600090815260208190526040902080546001600160a01b0319166001600160a01b0386169081179091551561213257612132338560008487876040516024016121039392919061497c565b60408051601f198184030181529190526020810180516001600160e01b031663f05c04e160e01b179052611e4c565b6040516001600160a01b0385169033907f9452c8fb077c3ea8f28a77c87488af657b1e44d010ad9a5992d73870da040e9490600090a350505050565b3360009081527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f602052604090205460609088906001600160a01b0316612266576121ba60013361269a565b60005b8181101561226057368b8b838181106121d8576121d8614768565b90506020028101906121ea919061477e565b905061220e6121fc602083018361465b565b61220960208401846146dc565b61280a565b9350612257337f00000000000000000000000000000000000000000000000000000000000000006001612244602086018661465b565b886040516024016112579392919061479e565b506001016121bd565b50612287565b80156122875760405163d8e3ed1b60e01b815233600482015260240161067c565b61229260023361269a565b508560005b8181101561232757368989838181106122b2576122b2614768565b90506020028101906122c4919061477e565b90506122e86122d6602083018361465b565b6122e360208401846146dc565b612866565b935061231e337f00000000000000000000000000000000000000000000000000000000000000006002612244602086018661465b565b50600101612297565b5084905060005b818110156123be573687878381811061234957612349614768565b905060200281019061235b919061477e565b905061237f61236d602083018361465b565b61237a60208401846146dc565b612881565b93506123b5337f00000000000000000000000000000000000000000000000000000000000000006003612244602086018661465b565b5060010161232e565b5082905060005b8181101561245557368585838181106123e0576123e0614768565b90506020028101906123f2919061477e565b9050612416612404602083018361465b565b61241160208401846146dc565b612a00565b935061244c337f00000000000000000000000000000000000000000000000000000000000000006004612244602086018661465b565b506001016123c5565b5060405133907ff48581d8a62b775b74f2fb67f1d5806a9a356fbcc598040ab3071d3e37af40c290600090a250505050505050505050565b6000610722826080013560801c90565b60006001600160801b03608083013516610722565b600060c082013560801c610722565b60006001600160801b0360c083013516610722565b606060006001600160a01b0384166001148015906124fc57506124fa868686613749565b155b1561252557604051637c84ecfb60e01b81526001600160a01b038516600482015260240161067c565b826000036125465760405163f725081760e01b815260040160405180910390fd5b826001600160401b0381111561255e5761255e614328565b604051908082528060200260200182016040528015612587578160200160208202803683370190505b506001600160a01b038086166000908152602089815260408083208a85168452909152812054929450911691505b6001600160a01b038216158015906125d757506001600160a01b038216600114155b80156125e257508381105b1561264757818382815181106125fa576125fa614768565b6001600160a01b039283166020918202929092018101919091529281166000908152888452604080822089841683529094529290922054909116908061263f816149ea565b9150506125b5565b6001600160a01b0382166001148015906126615750600081115b1561268d5782612672600183614a03565b8151811061268257612682614768565b602002602001015191505b8083525094509492505050565b60016000908152602083815260408083206001600160a01b03808616855292529091205416156126dd576040516329e42f3360e11b815260040160405180910390fd5b60016000818152602093845260408082206001600160a01b0394909416825292909352912080546001600160a01b0319169091179055565b6001600160a01b038116158061273457506001600160a01b0381166001145b1561275d57604051637c84ecfb60e01b81526001600160a01b038216600482015260240161067c565b6001600160a01b03818116600090815260208581526040808320868516845290915290205416156127ac57604051631034f46960e21b81526001600160a01b038216600482015260240161067c565b60016000908152602084815260408083206001600160a01b039586168085528184528285208054968816808752988552838620918652908452919093208054949095166001600160a01b031994851617909455528154169091179055565b60608360016128198282613141565b61282560013388612715565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929998505050505050505050565b60608360026128758282613141565b61282560023388612715565b60608360036128908282613141565b600080806128a087890189614a67565b919450925090506001600160e01b031983166306d61fe760e41b14806128d657506001600160e01b03198316638a91b0e360e01b145b15612900576040516379bd117b60e01b81526001600160e01b03198416600482015260240161067c565b61290b826000611d65565b8015612920575061292082607f60f91b611d65565b1561294057816040516376087dc160e01b815260040161067c91906147d1565b6001600160e01b0319831660009081526003602090815260408083203384529091529020546001600160a01b031615612998576040516374420d1560e01b81526001600160e01b03198416600482015260240161067c565b6001600160e01b03199092166000908152600360209081526040808320338452909152902080546001600160a01b038a166001600160a01b031960f89490941c600160a01b02939093166001600160a81b031990911617919091179055925050509392505050565b6060836004612a0f8282613141565b60008080612a1f87890189614ad5565b91945092509050600080846001811115612a3b57612a3b6147e6565b148015612a5057506001600160e01b03198316155b15612ac65750336000908152600460205260409020546001600160a01b03168015612a995760405163741cbe0360e01b81526001600160a01b038216600482015260240161067c565b33600090815260046020526040902080546001600160a01b0319166001600160a01b038c16179055612b93565b6001846001811115612ada57612ada6147e6565b03612b7a57506001600160e01b0319821660009081526005602090815260408083203384529091529020546001600160a01b03168015612b385760405163741cbe0360e01b81526001600160a01b038216600482015260240161067c565b6001600160e01b031983166000908152600560209081526040808320338452909152902080546001600160a01b0319166001600160a01b038c16179055612b93565b604051635691922f60e01b815260040160405180910390fd5b5098975050505050505050565b60608235830160208181019135908581013586018082019190359060408801358801908101903584838114612be85760405163b4fa3fb360e01b815260040160405180910390fd5b60005b81811015612d0a576000888883818110612c0757612c07614768565b90506020020135905060018103612c4657612c408d888885818110612c2e57612c2e614768565b905060200281019061220991906146dc565b50612d01565b60028103612c7657612c408d888885818110612c6457612c64614768565b90506020028101906122e391906146dc565b60038103612ca657612c408d888885818110612c9457612c94614768565b905060200281019061237a91906146dc565b60048103612cd657612c408d888885818110612cc457612cc4614768565b905060200281019061241191906146dc565b60405163484d218160e01b81526001600160a01b038e1660048201526024810182905260440161067c565b50600101612beb565b5082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929e9d5050505050505050505050505050565b60405163468721a760e01b81526000906001600160a01b0385169063468721a790612d879086908590879060019060040161481e565b6020604051808303816000875af1158015612da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dca91906148d5565b9050806107a557604051632b3f6d1160e21b815260040160405180910390fd5b60606000612dfa83850185614b03565b92509050612e0b600133838861385b565b509392505050565b60606000612e2383850185614b03565b92509050612e0b600233838861385b565b60606000612e4483850185614b48565b6001600160e01b03199091166000908152600360209081526040808320338452909152902080546001600160a01b031916905595945050505050565b6060600080612e9184860186614ad5565b945090925090506000826001811115612eac57612eac6147e6565b148015612ec157506001600160e01b03198116155b15612ee85733600090815260046020526040902080546001600160a01b0319169055610ca1565b6001826001811115612efc57612efc6147e6565b03612b7a576001600160e01b031981166000908152600560209081526040808320338452909152902080546001600160a01b0319169055610ca1565b60608235830160208181019135908581013586018082019190359060408801358801908101903584838114612f805760405163b4fa3fb360e01b815260040160405180910390fd5b60005b81811015612d0a576000888883818110612f9f57612f9f614768565b90506020020135905060018103612fe357612fdd8d888885818110612fc657612fc6614768565b9050602002810190612fd891906146dc565b612dea565b50613082565b6002810361301857612fdd8d88888581811061300157613001614768565b905060200281019061301391906146dc565b612e13565b6003810361304d57612fdd8d88888581811061303657613036614768565b905060200281019061304891906146dc565b612e34565b60048103612cd657612fdd8d88888581811061306b5761306b614768565b905060200281019061307d91906146dc565b612e80565b50600101612f83565b60405163468721a760e01b81526000906001600160a01b0385169063468721a7906130c19086908590879060019060040161481e565b6020604051808303816000875af11580156130e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310491906148d5565b9050806107a557604080516001600160a01b038616815260006020820152600080516020614dd9833981519152910160405180910390a150505050565b336000908152602081905260409020546001600160a01b031680156131c75760405163529562a160e01b81523360048201526001600160a01b0384811660248301526044820184905282169063529562a19060640160006040518083038186803b1580156131ae57600080fd5b505afa1580156131c2573d6000803e3d6000fd5b505050505b505050565b60606131d9856000611d65565b156133c5576131ec84600160f81b611d65565b1561320f5782358301602081019035613206338383613952565b92505050610818565b61321a846000611d65565b156132ce5760008036600061322f87876135db565b6040805160018082528183019092529498509296509094509250816020015b606081526020019060019003908161324e5790505094506132a733858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cbc92505050565b856000815181106132ba576132ba614768565b602002602001018190525050505050610818565b6132e0846001600160f81b0319611d65565b156133aa5760006132f46014828587614452565b6132fd9161447c565b60601c90503660006133128560148189614452565b604080516001808252818301909252929450909250816020015b606081526020019060019003908161332c579050509350613384338484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506139ce92505050565b8460008151811061339757613397614768565b6020026020010181905250505050610818565b83604051632e5bf3f960e21b815260040161067c91906147d1565b6133d385600160f81b611d65565b15613559576133e684600160f81b611d65565b1561340b5782358301602081019035613400338383613a6f565b935061081892505050565b613416846000611d65565b156134a35760008036600061342b87876135db565b6040805160018082528183019092529498509296509094509250816020015b606081526020019060019003908161344a5790505094506132a733858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b6592505050565b6134b5846001600160f81b0319611d65565b156133aa5760006134c96014828587614452565b6134d29161447c565b60601c90503660006134e78560148189614452565b604080516001808252818301909252929450909250816020015b6060815260200190600190039081613501579050509350613384338484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613c2592505050565b846040516308c3ee0360e11b815260040161067c91906147d1565b6131c7837f000000000000000000000000000000000000000000000000000000000000000084846040516024016135ac929190614b66565b60408051601f198184030181529190526020810180516001600160e01b0316633f707e6b60e01b179052612d51565b60008036816135ed6014828789614452565b6135f69161447c565b60601c9350613609603460148789614452565b61361291614c18565b92506136218560348189614452565b949793965094505050565b6131c7837f00000000000000000000000000000000000000000000000000000000000000008484604051602401613664929190614b66565b60408051601f198184030181529190526020810180516001600160e01b0316632864481160e11b17905261308b565b60405163468721a760e01b81526000906001600160a01b0386169063468721a7906136c890879087908790879060040161481e565b6020604051808303816000875af11580156136e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370b91906148d5565b905080611ee457604080516001600160a01b038716815260006020820152600080516020614dd9833981519152910160405180910390a15050505050565b600060016001600160a01b038316148015906108185750506001600160a01b0390811660009081526020938452604080822093831682529290935291205416151590565b6000808360018111156137a2576137a26147e6565b1480156137b757506001600160e01b03198216155b156137d75750336000908152600460205260409020546001600160a01b03165b60018360018111156137eb576137eb6147e6565b0361072257506001600160e01b03191660009081526005602090815260408083203384529091529020546001600160a01b0316919050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561384b57600061384e565b60015b60ff161717949350505050565b6001600160a01b038116158061387a57506001600160a01b0381166001145b156138a357604051637c84ecfb60e01b81526001600160a01b038316600482015260240161067c565b6001600160a01b0382811660009081526020868152604080832087851684529091529020548116908216146138f657604051637c84ecfb60e01b81526001600160a01b038216600482015260240161067c565b6001600160a01b039081166000908152602085815260408083209584168084528683528184208054968616855297835281842090845282529091208054939092166001600160a01b031993841617909155919091528154169055565b60606139bb847f0000000000000000000000000000000000000000000000000000000000000000858560405160240161398c929190614b66565b60408051601f198184030181529190526020810180516001600160e01b0316636108557360e01b1790526139ce565b8060200190518101906108189190614ce5565b60606000846001600160a01b0316635229073f8560008660016040518563ffffffff1660e01b8152600401613a06949392919061481e565b6000604051808303816000875af1158015613a25573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a4d9190810190614864565b9250905080612e0b57604051632b3f6d1160e21b815260040160405180910390fd5b6060806000613adb867f00000000000000000000000000000000000000000000000000000000000000008787604051602401613aac929190614b66565b60408051601f198184030181529190526020810180516001600160e01b0316639abb6e1760e01b179052613c25565b905080806020019051810190613af19190614d19565b8151919450925060005b81811015613b5a57848181518110613b1557613b15614768565b6020026020010151613b5257604080516001600160a01b038a16815260208101839052600080516020614dd9833981519152910160405180910390a15b600101613afb565b505050935093915050565b60606000856001600160a01b0316635229073f86868660006040518563ffffffff1660e01b8152600401613b9c949392919061481e565b6000604051808303816000875af1158015613bbb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613be39190810190614864565b9250905080611d5c57604080516001600160a01b038816815260006020820152600080516020614dd9833981519152910160405180910390a150949350505050565b60606000846001600160a01b0316635229073f8560008660016040518563ffffffff1660e01b8152600401613c5d949392919061481e565b6000604051808303816000875af1158015613c7c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ca49190810190614864565b9250905080612e0b57604080516001600160a01b038716815260006020820152600080516020614dd9833981519152910160405180910390a1509392505050565b6001600160a01b0381168114613cfa57600080fd5b50565b8035611c5281613ce5565b60008083601f840112613d1a57600080fd5b5081356001600160401b03811115613d3157600080fd5b60208301915083602082850101111561060e57600080fd5b60008060008060608587031215613d5f57600080fd5b843593506020850135613d7181613ce5565b925060408501356001600160401b03811115613d8c57600080fd5b613d9887828801613d08565b95989497509550505050565b600080600060408486031215613db957600080fd5b8335925060208401356001600160401b03811115613dd657600080fd5b613de286828701613d08565b9497909650939450505050565b60006101208284031215613e0257600080fd5b50919050565b600080600060608486031215613e1d57600080fd5b83356001600160401b03811115613e3357600080fd5b613e3f86828701613def565b9660208601359650604090950135949350505050565b60008083601f840112613e6757600080fd5b5081356001600160401b03811115613e7e57600080fd5b6020830191508360208260051b850101111561060e57600080fd5b600060608284031215613e0257600080fd5b600080600080600080600080600060a08a8c031215613ec957600080fd5b89356001600160401b03811115613edf57600080fd5b613eeb8c828d01613e55565b909a5098505060208a01356001600160401b03811115613f0a57600080fd5b613f168c828d01613e55565b90985096505060408a01356001600160401b03811115613f3557600080fd5b613f418c828d01613e55565b90965094505060608a01356001600160401b03811115613f6057600080fd5b613f6c8c828d01613e55565b90945092505060808a01356001600160401b03811115613f8b57600080fd5b613f978c828d01613e99565b9150509295985092959850929598565b60008060408385031215613fba57600080fd5b82356001600160401b03811115613fd057600080fd5b613fdc85828601613def565b9250506020830135613fed81613ce5565b809150509250929050565b60005b83811015614013578181015183820152602001613ffb565b50506000910152565b60008151808452614034816020860160208601613ff8565b601f01601f19169290920160200192915050565b60808152600061405b608083018761401c565b65ffffffffffff8616602084015265ffffffffffff851660408401528281036060840152614089818561401c565b979650505050505050565b600080604083850312156140a757600080fd5b82356140b281613ce5565b946020939093013593505050565b6040808252835190820181905260009060208501906060840190835b818110156141035783516001600160a01b03168352602093840193909201916001016140dc565b50506001600160a01b039490941660209390930192909252509092915050565b6000806020838503121561413657600080fd5b82356001600160401b0381111561414c57600080fd5b61415885828601613e55565b90969095509350505050565b602081526000610b8f602083018461401c565b6001600160e01b031981168114613cfa57600080fd5b60006020828403121561419f57600080fd5b8135610b8f81614177565b6000602082840312156141bc57600080fd5b5035919050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561421c57603f1987860301845261420785835161401c565b945060209384019391909101906001016141eb565b50929695505050505050565b6000806040838503121561423b57600080fd5b823561424681613ce5565b91506020830135613fed81613ce5565b803560ff81168114611c5257600080fd5b6000806000806060858703121561427d57600080fd5b843561428881613ce5565b935060208501356001600160401b038111156142a357600080fd5b6142af87828801613e55565b90945092506142c2905060408601614256565b905092959194509250565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038516815283602082015260606040820152600061431e6060830184866142cd565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561436657614366614328565b604052919050565b60006001600160401b0382111561438757614387614328565b50601f01601f191660200190565b600082601f8301126143a657600080fd5b81516143b96143b48261436e565b61433e565b8181528460208386010111156143ce57600080fd5b610818826020830160208701613ff8565b6000602082840312156143f157600080fd5b81516001600160401b0381111561440757600080fd5b61081884828501614395565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60006020828403121561444b57600080fd5b5051919050565b6000808585111561446257600080fd5b8386111561446f57600080fd5b5050820193919092039150565b80356bffffffffffffffffffffffff1981169060148410156144c2576bffffffffffffffffffffffff196bffffffffffffffffffffffff198560140360031b1b82161691505b5092915050565b8481526060602082015260006144e2606083018661401c565b82810360408401526140898185876142cd565b60006020828403121561450757600080fd5b8151610b8f81614177565b6000808335601e1984360301811261452957600080fd5b83016020810192503590506001600160401b0381111561454857600080fd5b80360382131561060e57600080fd5b604081526145786040820161456b85613cfd565b6001600160a01b03169052565b6020830135606082015260006145916040850185614512565b61012060808501526145a8610160850182846142cd565b9150506145b86060860186614512565b848303603f190160a08601526145cf8382846142cd565b608088013560c08781019190915260a089013560e0808901919091529089013561010088015290935061460792508701905086614512565b848303603f190161012086015261461f8382846142cd565b92505050614631610100860186614512565b848303603f19016101408601526146498382846142cd565b93505050508260208301529392505050565b60006020828403121561466d57600080fd5b8135610b8f81613ce5565b6000808335601e1984360301811261468f57600080fd5b8301803591506001600160401b038211156146a957600080fd5b6020019150600581901b360382131561060e57600080fd5b6000602082840312156146d357600080fd5b610b8f82614256565b6000808335601e198436030181126146f357600080fd5b8301803591506001600160401b0382111561470d57600080fd5b60200191503681900382131561060e57600080fd5b80356001600160d01b031981169060068410156144c2576001600160d01b031960069490940360031b84901b1690921692915050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b60008235603e1983360301811261479457600080fd5b9190910192915050565b8381526001600160a01b03831660208201526060604082018190526000906147c89083018461401c565b95945050505050565b6001600160f81b031991909116815260200190565b634e487b7160e01b600052602160045260246000fd5b6002811061481a57634e487b7160e01b600052602160045260246000fd5b9052565b60018060a01b0385168152836020820152608060408201526000614845608083018561401c565b90506147c860608301846147fc565b80518015158114611c5257600080fd5b6000806040838503121561487757600080fd5b61488083614854565b915060208301516001600160401b0381111561489b57600080fd5b6148a785828601614395565b9150509250929050565b6001600160a01b03831681526040602082018190526000906108189083018461401c565b6000602082840312156148e757600080fd5b610b8f82614854565b803560028110611c5257600080fd5b6000806040838503121561491257600080fd5b61491b836148f0565b91506020830135613fed81614177565b82815260008251614943816020850160208701613ff8565b919091016020019392505050565b83815260606020820152600061496a606083018561401c565b828103604084015261431e818561401c565b60ff84168152604060208201819052810182905260008360608301825b858110156149c95782356149ac81613ce5565b6001600160a01b0316825260209283019290910190600101614999565b509695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016149fc576149fc6149d4565b5060010190565b81810381811115610722576107226149d4565b600082601f830112614a2757600080fd5b8135614a356143b48261436e565b818152846020838601011115614a4a57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215614a7c57600080fd5b8335614a8781614177565b925060208401356001600160f81b031981168114614aa457600080fd5b915060408401356001600160401b03811115614abf57600080fd5b614acb86828701614a16565b9150509250925092565b600080600060608486031215614aea57600080fd5b614af3846148f0565b92506020840135614aa481614177565b60008060408385031215614b1657600080fd5b8235614b2181613ce5565b915060208301356001600160401b03811115614b3c57600080fd5b6148a785828601614a16565b60008060408385031215614b5b57600080fd5b8235614b2181614177565b6020808252810182905260006040600584901b830181019083018583605e1936839003015b87821015614c0b57868503603f190184528235818112614baa57600080fd5b89018035614bb781613ce5565b6001600160a01b0316865260208181013590870152614bd96040820182614512565b915060606040880152614bf06060880183836142cd565b96505050602083019250602084019350600182019150614b8b565b5092979650505050505050565b8035602083101561072257600019602084900360031b1b1692915050565b60006001600160401b03821115614c4f57614c4f614328565b5060051b60200190565b600082601f830112614c6a57600080fd5b8151614c786143b482614c36565b8082825260208201915060208360051b860101925085831115614c9a57600080fd5b602085015b83811015614cdb5780516001600160401b03811115614cbd57600080fd5b614ccc886020838a0101614395565b84525060209283019201614c9f565b5095945050505050565b600060208284031215614cf757600080fd5b81516001600160401b03811115614d0d57600080fd5b61081884828501614c59565b60008060408385031215614d2c57600080fd5b82516001600160401b03811115614d4257600080fd5b8301601f81018513614d5357600080fd5b8051614d616143b482614c36565b8082825260208201915060208360051b850101925087831115614d8357600080fd5b6020840193505b82841015614dac57614d9b84614854565b825260209384019390910190614d8a565b8095505050505060208301516001600160401b03811115614dcc57600080fd5b6148a785828601614c5956feb8bc84bd77f5eb08210b8eb20fd63b3ec6a7992d277ab94663bae0e066f792aca2646970667358221220ea7603497be0a0e1ddc106666c75af038c8db18b0f9143f6418b0e8b232c109164736f6c634300081a00336080604052348015600f57600080fd5b506109c28061001f6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80636a2216571161005b5780636a221657146100d357806378272525146100e65780639517e29f146100f95780639abb6e171461010c57600080fd5b80633f707e6b1461008257806350c890221461009757806361085573146100aa575b600080fd5b6100956100903660046105ba565b61012d565b005b6100956100a53660046105ba565b610197565b6100bd6100b83660046105ba565b6101fc565b6040516100ca91906106c4565b60405180910390f35b6100956100e1366004610710565b6102be565b6100956100f43660046107da565b6102e1565b6100956101073660046107da565b61038a565b61011f61011a3660046105ba565b610429565b6040516100ca929190610864565b8060005b81811015610191573684848381811061014c5761014c6108be565b905060200281019061015e91906108d4565b905061018761017060208301836108f4565b6020830135610182604085018561090f565b610553565b5050600101610131565b50505050565b8060005b8181101561019157368484838181106101b6576101b66108be565b90506020028101906101c891906108d4565b90506101f16101da60208301836108f4565b60208301356101ec604085018561090f565b610589565b50505060010161019b565b6060818067ffffffffffffffff811115610218576102186106fa565b60405190808252806020026020018201604052801561024b57816020015b60608152602001906001900390816102365790505b50915060005b818110156102b6573685858381811061026c5761026c6108be565b905060200281019061027e91906108d4565b905061029061017060208301836108f4565b8483815181106102a2576102a26108be565b602090810291909101015250600101610251565b505092915050565b604051600080835160208501865afa3d6000833e80156102dc573d82f35b503d81fd5b604051638a91b0e360e01b81526001600160a01b03841690638a91b0e39061030f908590859060040161095d565b600060405180830381600087803b15801561032957600080fd5b505af115801561033d573d6000803e3d6000fd5b5050604080518781526001600160a01b03871660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e93500190505b60405180910390a150505050565b6040516306d61fe760e41b81526001600160a01b03841690636d61fe70906103b8908590859060040161095d565b600060405180830381600087803b1580156103d257600080fd5b505af11580156103e6573d6000803e3d6000fd5b5050604080518781526001600160a01b03871660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123935001905061037c565b606080828067ffffffffffffffff811115610446576104466106fa565b60405190808252806020026020018201604052801561047957816020015b60608152602001906001900390816104645790505b5091508067ffffffffffffffff811115610495576104956106fa565b6040519080825280602002602001820160405280156104be578160200160208202803683370190505b50925060005b8181101561054a57368686838181106104df576104df6108be565b90506020028101906104f191906108d4565b90506105036101da60208301836108f4565b868481518110610515576105156108be565b6020026020010186858151811061052e5761052e6108be565b60209081029190910101919091529015159052506001016104c4565b50509250929050565b60405181838237600038838387895af1610570573d6000823e3d81fd5b3d8152602081013d6000823e3d01604052949350505050565b604051600090828482376000388483888a5af191503d8152602081013d6000823e3d81016040525094509492505050565b600080602083850312156105cd57600080fd5b823567ffffffffffffffff8111156105e457600080fd5b8301601f810185136105f557600080fd5b803567ffffffffffffffff81111561060c57600080fd5b8560208260051b840101111561062157600080fd5b6020919091019590945092505050565b600082825180855260208501945060208160051b8301016020850160005b838110156106b857848303601f190188528151805180855260005b818110156106865760208184018101518783018201520161066a565b506000602082870101526020601f19601f8301168601019450505060208201915060208801975060018101905061064f565b50909695505050505050565b6020815260006106d76020830184610631565b9392505050565b80356001600160a01b03811681146106f557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072357600080fd5b61072c836106de565b9150602083013567ffffffffffffffff81111561074857600080fd5b8301601f8101851361075957600080fd5b803567ffffffffffffffff811115610773576107736106fa565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156107a2576107a26106fa565b6040528181528282016020018710156107ba57600080fd5b816020840160208301376000602083830101528093505050509250929050565b600080600080606085870312156107f057600080fd5b84359350610800602086016106de565b9250604085013567ffffffffffffffff81111561081c57600080fd5b8501601f8101871361082d57600080fd5b803567ffffffffffffffff81111561084457600080fd5b87602082840101111561085657600080fd5b949793965060200194505050565b6040808252835190820181905260009060208501906060840190835b818110156108a05783511515835260209384019390920191600101610880565b505083810360208501526108b48186610631565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60008235605e198336030181126108ea57600080fd5b9190910192915050565b60006020828403121561090657600080fd5b6106d7826106de565b6000808335601e1984360301811261092657600080fd5b83018035915067ffffffffffffffff82111561094157600080fd5b60200191503681900382131561095657600080fd5b9250929050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea26469706673582212205c0679bac7989901111b6824de732603e322da5b9b75ee077344853294d8b7b664736f6c634300081a0033"; + hex"60a060405234801561000f575f5ffd5b5060405161001c90610047565b604051809103905ff080158015610035573d5f5f3e3d5ffd5b506001600160a01b0316608052610054565b610988806153b883390190565b6080516152ff6100b95f395f81816112750152818161148a0152818161160a01528181611e3c0152818161242f015281816125080152818161259e01528181612634015281816138ef015281816139a601528181613dcf0152613ee701526152ff5ff3fe608060405260043610610138575f3560e01c8063a71763a8116100aa578063d828435d1161006e578063d828435d146104b7578063e9ae5c53146104d6578063ea5f61d0146104f5578063eab77e1714610514578063f2dc691d14610533578063f698da25146105525761013f565b8063a71763a8146103e2578063b0d691fe14610401578063b875d5d814610423578063d03c79141461046c578063d691c9641461048b5761013f565b8063540fb4f9116100fc578063540fb4f9146102dc57806355d559f4146102fd5780635faac46b1461032c57806379aad60e146103595780639517e29f146103785780639cfd7cff146103975761013f565b80630a664dba146101e7578063112d3a7d146102295780631626ba7e1461025857806319822f7c14610290578063236b58a1146102bd5761013f565b3661013f57005b5f3660605f3560e01c63bc197c81811463f23a6e6182141763150b7a028214171561016e57806020526020603cf35b50335f818152600460209081526040808320546001600160e01b031984351680855260058452828520958552949092528220546001600160a01b0391821692911690806101bb8484610566565b915091506101c98888610621565b95506101d784848484610730565b5050505050915050805190602001f35b3480156101f2575f5ffd5b50335f908152600460205260409020546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b348015610234575f5ffd5b5061024861024336600461419d565b6107b1565b6040519015158152602001610220565b348015610263575f5ffd5b506102776102723660046141f4565b610843565b6040516001600160e01b03199091168152602001610220565b34801561029b575f5ffd5b506102af6102aa36600461441e565b610bd8565b604051908152602001610220565b3480156102c8575f5ffd5b5061020c6102d7366004614467565b610d04565b3480156102e7575f5ffd5b506102fb6102f63660046144d4565b610d6d565b005b348015610308575f5ffd5b5061031c6103173660046145c5565b610e1d565b6040516102209493929190614641565b348015610337575f5ffd5b5061034b61034636600461468c565b610fde565b6040516102209291906146b6565b348015610364575f5ffd5b506102fb610373366004614718565b610ff9565b348015610383575f5ffd5b506102fb61039236600461419d565b6110fc565b3480156103a2575f5ffd5b50604080518082018252601a81527f7268696e6573746f6e652e73616665373537392e76312e302e30000000000000602082015290516102209190614756565b3480156103ed575f5ffd5b506102fb6103fc36600461419d565b6112e5565b34801561040c575f5ffd5b506f71727de22e5e9d8baf0edac6f37da03261020c565b34801561042e575f5ffd5b5061020c61043d36600461477d565b6001600160e01b0319165f9081526005602090815260408083203384529091529020546001600160a01b031690565b348015610477575f5ffd5b50610248610486366004614467565b611648565b348015610496575f5ffd5b506104aa6104a53660046141f4565b6116f3565b6040516102209190614798565b3480156104c2575f5ffd5b506102af6104d13660046147fb565b6117db565b3480156104e1575f5ffd5b506102fb6104f03660046141f4565b611878565b348015610500575f5ffd5b5061034b61050f36600461468c565b611c11565b34801561051f575f5ffd5b506102fb61052e366004614837565b611c21565b34801561053e575f5ffd5b5061024861054d366004614467565b611c90565b34801561055d575f5ffd5b506102af611cd8565b6060806001600160a01b038416156105e4576105cb33855f610586611d30565b345f3660405160240161059c94939291906148c1565b60408051601f198184030181529190526020810180516001600160e01b031663d68f602560e01b179052611d3c565b9150818060200190518101906105e1919061493f565b91505b6001600160a01b0383161561061a5761060133845f610586611d30565b905080806020019051810190610617919061493f565b90505b9250929050565b5f80356001600160e01b031916815260036020908152604080832033845290915290208054606091906001600160a01b03811690600160a01b900460f81b8161068f57604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b61069d81607f60f91b611dde565b156106e1576106d7338388886106b1611d30565b6040516020016106c393929190614970565b604051602081830303815290604052611df0565b935050505061072a565b6106eb815f611dde565b15610726576106d733835f8989610700611d30565b60405160200161071293929190614970565b604051602081830303815290604052611d3c565b5050505b92915050565b6001600160a01b038416156107855761078533855f856040516024016107569190614756565b60408051601f198184030181529190526020810180516001600160e01b0316630b9dfbed60e11b179052611ec1565b6001600160a01b038316156107ab576107ab33845f846040516024016107569190614756565b50505050565b5f600185036107e257336001600160a01b038516036107d25750600161083b565b6107db84611f5c565b905061083b565b600285036107f3576107db84611f69565b60038503610806576107db848484611f76565b60048503610819576107db848484611fc0565b60088514806108285750600985145b15610838576107db848484611ff9565b505f5b949350505050565b5f338282036109ee5761085f610857611d30565b868686612069565b50809550505f610928826001600160a01b031663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108a4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c89190614996565b60408051602081018a90527f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca91015b60408051601f1981840301815282825280516020918201209083015201604051602081830303815290604052612140565b8051602090910120604051635ae6bd3760e01b8152600481018290529091506001600160a01b03831690635ae6bd3790602401602060405180830381865afa158015610976573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099a9190614996565b5f036109dc5760405162461bcd60e51b815260206004820152601160248201527012185cda081b9bdd08185c1c1c9bdd9959607a1b6044820152606401610686565b50630b135d3f60e11b9150610bd19050565b5f6109fc60148286886149ad565b610a05916149d4565b60601c90506060610a2a610a17611d30565b88610a25886014818c6149ad565b612069565b90975090506001600160a01b0382161580610a4b5750610a4982611f5c565b155b15610b63575f610ae7846001600160a01b031663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a90573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab49190614996565b60408051602081018c90527f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca91016108f7565b8051602082012060405163934f3a1160e01b8152919250906001600160a01b0386169063934f3a1190610b2290849086908890600401614a21565b5f6040518083038186803b158015610b38575f5ffd5b505afa158015610b4a573d5f5f3e3d5ffd5b50630b135d3f60e11b9850610bd1975050505050505050565b5f610bb43384610b71611d30565b8b86604051602401610b8593929190614a4b565b60408051601f198184030181529190526020810180516001600160e01b0316637aa8f17760e11b179052611df0565b905080806020019051810190610bca9190614a7a565b9450505050505b9392505050565b5f6f71727de22e5e9d8baf0edac6f37da032610bf2611d30565b6001600160a01b031614610c1957604051635629665f60e11b815260040160405180910390fd5b6020840151606081901c90610c2f8587866121ba565b61010088015294506001600160a01b0382161580610c535750610c5182611f5c565b155b15610c6857610c6186612258565b9250610ccb565b5f610cb133845f8a8a604051602401610c82929190614b35565b60408051601f198184030181529190526020810180516001600160e01b0316639700320360e01b179052611d3c565b905080806020019051810190610cc79190614996565b9350505b8315610cfb57610cfb336f71727de22e5e9d8baf0edac6f37da0328660405180602001604052805f815250611ec1565b50509392505050565b5f60098203610d2a575050335f908152600660205260409020546001600160a01b031690565b60088203610d4f575050335f908152600760205260409020546001600160a01b031690565b604051635691922f60e01b815260040160405180910390fd5b919050565b6f71727de22e5e9d8baf0edac6f37da032610d86611d30565b6001600160a01b03161480610db35750610d9e611d30565b6001600160a01b0316336001600160a01b0316145b610dd057604051635629665f60e11b815260040160405180910390fd5b610e02610de06020830183614b56565b610ded6020840184614b71565b610dfd6060860160408701614bb6565b612303565b610e1289898989898989896123b7565b505050505050505050565b6101008201516060905f9081908390610e38818460066126a2565b610e4190614bcf565b60d01c9350610e53816006600c6126a2565b610e5c90614bcf565b60d01c9250610e6c81600c612707565b9150505f604051806101c001604052807fc03dfc11d8b10bf9cf703d558958c8c42777f785d998c62060d85a4f0ef6ea7f5f1b8152602001885f01516001600160a01b031681526020018860200151815260200188604001518051906020012081526020018860600151805190602001208152602001610eeb89612715565b6001600160801b03168152602001610f0289612724565b6001600160801b031681526020018860a001518152602001610f2389612739565b6001600160801b03168152602001610f3a89612748565b6001600160801b0316815260e089015180516020918201209082015265ffffffffffff8087166040830152851660608201526001600160a01b0388166080909101526101c08120909150601960f81b600160f81b610f96611cd8565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529550505092959194509250565b60605f610fee600133868661275d565b915091509250929050565b6f71727de22e5e9d8baf0edac6f37da032611012611d30565b6001600160a01b0316148061103f575061102a611d30565b6001600160a01b0316336001600160a01b0316145b61105c57604051635629665f60e11b815260040160405180910390fd5b61106760013361291c565b6110f857611076600133612947565b805f5b818110156110cb573684848381811061109457611094614c09565b90506020028101906110a69190614c1d565b90506110c2336110b96020840184614b56565b600191906129a6565b50600101611079565b5060405133907ff48581d8a62b775b74f2fb67f1d5806a9a356fbcc598040ab3071d3e37af40c2905f90a2505b5050565b335f908152600460209081526040808320547fd00bcad91b775f25eb0aee15808d12dfdaa6dc5a7d6b754e26f9c205d2a3b8df909252822054639517e29f60e01b926001600160a01b039283169290911690806111598484610566565b915091506111746f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b0316611185611d30565b6001600160a01b031614806111b2575061119d611d30565b6001600160a01b0316336001600160a01b0316145b6111cf57604051635629665f60e11b815260040160405180910390fd5b606060018a036111eb576111e4898989612a99565b905061126f565b60028a036111fe576111e4898989612af4565b60038a03611211576111e4898989612b0f565b60048a03611224576111e4898989612c8a565b89611234576111e4898989612e07565b60088a1480611243575060098a145b15611253576111e4898989612fb5565b60405163041c38b360e41b8152600481018b9052602401610686565b6112d8337f00000000000000000000000000000000000000000000000000000000000000008c8c856040516024016112a993929190614c3b565b60408051601f198184030181529190526020810180516001600160e01b0316639517e29f60e01b179052612ff0565b50610e1284848484610730565b335f908152600460209081526040808320547fc45a7acaba78a7b4c4432b604d301355b314c0a7811768a1ee2563c9d34ca4e09092529091205484916314e2ec7560e31b916001600160a01b0391821691908116908416821480159061135d5750806001600160a01b0316846001600160a01b031614155b15611501575f5f61136e8484610566565b915091506113896f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b031661139a611d30565b6001600160a01b031614806113c757506113b2611d30565b6001600160a01b0316336001600160a01b0316145b6113e457604051635629665f60e11b815260040160405180910390fd5b606060018b03611400576113f98a8a8a613085565b9050611484565b60028b03611413576113f98a8a8a6130a5565b60038b03611426576113f98a8a8a6130c5565b60048b03611439576113f98a8a8a61310f565b8a611449576113f98a8a8a6131c3565b60088b1480611458575060098b145b15611468576113f98a8a8a613314565b60405163041c38b360e41b8152600481018c9052602401610686565b6114ed337f00000000000000000000000000000000000000000000000000000000000000008d8d856040516024016114be93929190614c3b565b60408051601f198184030181529190526020810180516001600160e01b0316637827252560e01b17905261337a565b506114fa84848484610730565b505061163e565b6f71727de22e5e9d8baf0edac6f37da03261151a611d30565b6001600160a01b031614806115475750611532611d30565b6001600160a01b0316336001600160a01b0316145b61156457604051635629665f60e11b815260040160405180910390fd5b60606001890361158057611579888888613085565b9050611604565b60028903611593576115798888886130a5565b600389036115a6576115798888886130c5565b600489036115b95761157988888861310f565b886115c9576115798888886131c3565b60088914806115d85750600989145b156115e857611579888888613314565b60405163041c38b360e41b8152600481018a9052602401610686565b610e12337f00000000000000000000000000000000000000000000000000000000000000008b8b856040516024016114be93929190614c3b565b5050505050505050565b5f81600881901b61165d82600160f81b611dde565b1561166b57600192506116ac565b611675825f611dde565b1561168357600192506116ac565b611695826001600160f81b0319611dde565b156116a357600192506116ac565b505f9392505050565b8280156116be57506116be815f611dde565b156116ca575050919050565b8280156116e057506116e081600160f81b611dde565b156116a3575050919050565b5050919050565b6060611705611700611d30565b611f69565b61173657611711611d30565b604051635c93ff2f60e11b81526001600160a01b039091166004820152602401610686565b335f908152600460209081526040808320547f4162c930ade27880570b0eb31efbc8a626b97e81a40ced27163509dfe16398829092528220546335a4725960e21b926001600160a01b039283169290911690806117938484610566565b9150915061179f611d30565b60026117ab828261342a565b8a600881901b6117bd81838e8e6134b0565b9950505050506117cf84848484610730565b50505050509392505050565b5f602082901b640100000000600160c01b03166f71727de22e5e9d8baf0edac6f37da032604051631aab3f0d60e11b81526001600160a01b0386811660048301526001600160c01b038416602483015291909116906335567e1a90604401602060405180830381865afa158015611854573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083b9190614996565b335f908152600460209081526040808320547fccfe1b2bef70acd8e661aeb5430e147f4c75cb320972acba718a28da428e1a3090925282205463e9ae5c5360e01b926001600160a01b039283169290911690806118d58484610566565b915091506118f06f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b0316611901611d30565b6001600160a01b0316148061192e5750611919611d30565b6001600160a01b0316336001600160a01b0316145b61194b57604051635629665f60e11b815260040160405180910390fd5b87600881901b3361195c825f611dde565b15611ab45761196f83600160f81b611dde565b1561199657365f6119808c8c613853565b9150915061198f8383836138e9565b5050611c02565b6119a0835f611dde565b15611a05575f5f365f6119b38e8e613950565b93509350935093506119fc85858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611ec192505050565b50505050611c02565b611a17836001600160f81b0319611dde565b15611a99575f611a2a6014828c8e6149ad565b611a33916149d4565b60601c9050365f8c8c6014908092611a4d939291906149ad565b91509150611a91848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250612ff092505050565b505050611c02565b82604051632e5bf3f960e21b81526004016106869190614c64565b611ac282600160f81b611dde565b15611be757611ad583600160f81b611dde565b15611af557365f611ae68c8c613853565b9150915061198f8383836139a0565b611aff835f611dde565b15611b5b575f5f365f611b128e8e613950565b93509350935093506119fc85858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250613a0792505050565b611b6d836001600160f81b0319611dde565b15611a99575f611b806014828c8e6149ad565b611b89916149d4565b60601c9050365f8c8c6014908092611ba3939291906149ad565b91509150611a91848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061337a92505050565b816040516308c3ee0360e11b81526004016106869190614c64565b50505061163e84848484610730565b60605f610fee600233868661275d565b6f71727de22e5e9d8baf0edac6f37da032611c3a611d30565b6001600160a01b03161480611c675750611c52611d30565b6001600160a01b0316336001600160a01b0316145b611c8457604051635629665f60e11b815260040160405180910390fd5b6107ab84848484612303565b5f60018203611ca157506001919050565b60028203611cb157506001919050565b60038203611cc157506001919050565b60048203611cd157506001919050565b505f919050565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218602082015246918101919091523060608201525f9060800160405160208183030381529060405280519060200120905090565b60131936013560601c90565b60605f856001600160a01b0316635229073f8686865f6040518563ffffffff1660e01b8152600401611d719493929190614cad565b5f604051808303815f875af1158015611d8c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611db39190810190614cf1565b9250905080611dd557604051632b3f6d1160e21b815260040160405180910390fd5b50949350505050565b6001600160f81b031990811691161490565b60605f8383604051602401611e06929190614d3b565b60408051601f198184030181529181526020820180516001600160e01b0316636a22165760e01b179052519091505f90611e66907f0000000000000000000000000000000000000000000000000000000000000000908490602401614d3b565b60408051601f19818403018152919052602080820180516001600160e01b031663b4faba0960e01b178152825192935090915f91895afa5060203d036040519350808401604052806020853e505f51610cfb57825160208401fd5b60405163468721a760e01b81525f906001600160a01b0386169063468721a790611ef5908790879087908790600401614cad565b6020604051808303815f875af1158015611f11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f359190614d5e565b905080611f5557604051632b3f6d1160e21b815260040160405180910390fd5b5050505050565b5f61072a60013384613ab7565b5f61072a60023384613ab7565b5f80611f848385018561477d565b6001600160e01b0319165f9081526003602090815260408083203384529091529020546001600160a01b03908116908616149150509392505050565b5f8080611fcf84860186614d85565b915091505f611fde8383613af9565b6001600160a01b039081169088161493505050509392505050565b5f8061200783850185614467565b905060098103612035575050335f908152600660205260409020546001600160a01b03848116911614610bd1565b60088103610d4f575050335f908152600760205260409020546001600160a01b03848116911614610bd1565b509392505050565b5f60605f6120776008610d04565b90506001600160a01b0381166120ce5785858581818080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525095985091965061213795505050505050565b5f61211a33838a8a8a8a6040516024016120eb94939291906148c1565b60408051601f198184030181529190526020810180516001600160e01b0316637a0468b760e01b179052611df0565b9050808060200190518101906121309190614daf565b9350935050505b94509492505050565b6060601960f81b600160f81b858585604051602001612160929190614ddd565b60408051808303601f190181529082905280516020918201206001600160f81b0319958616918301919091529290931660218401526022830152604282015260620160405160208183030381529060405290509392505050565b5f60605f6121c86009610d04565b90506001600160a01b0381166121e8575050506101008201518390612250565b5f61223333835f89898c60405160240161220493929190614dfd565b60408051601f198184030181529190526020810180516001600160e01b031663e24f8f9360e01b179052611d3c565b9050808060200190518101906122499190614daf565b9350935050505b935093915050565b5f80808080612277866f71727de22e5e9d8baf0edac6f37da032610e1d565b8351602085012060405163934f3a1160e01b81529498509296509094509250339163934f3a11916122ae9188908690600401614a21565b5f6040518083038186803b1580156122c4575f5ffd5b505afa9250505080156122d5575060015b6122ec576122e560018385613b8c565b94506122fa565b6122f75f8385613b8c565b94505b50505050919050565b335f90815260208190526040902080546001600160a01b0319166001600160a01b0386169081179091551561237c5761237c33855f84878760405160240161234d93929190614e21565b60408051601f198184030181529190526020810180516001600160e01b031663f05c04e160e01b179052611ec1565b6040516001600160a01b0385169033907f9452c8fb077c3ea8f28a77c87488af657b1e44d010ad9a5992d73870da040e94905f90a350505050565b6060876123c560013361291c565b61247f576123d4600133612947565b5f5b8181101561247957368b8b838181106123f1576123f1614c09565b90506020028101906124039190614c1d565b90506124276124156020830183614b56565b6124226020840184614e78565b612a99565b9350612470337f0000000000000000000000000000000000000000000000000000000000000000600161245d6020860186614b56565b886040516024016112a993929190614c3b565b506001016123d6565b506124a0565b80156124a05760405163d8e3ed1b60e01b8152336004820152602401610686565b6124ab600233612947565b50855f5b8181101561253f57368989838181106124ca576124ca614c09565b90506020028101906124dc9190614c1d565b90506125006124ee6020830183614b56565b6124fb6020840184614e78565b612af4565b9350612536337f0000000000000000000000000000000000000000000000000000000000000000600261245d6020860186614b56565b506001016124af565b508490505f5b818110156125d5573687878381811061256057612560614c09565b90506020028101906125729190614c1d565b90506125966125846020830183614b56565b6125916020840184614e78565b612b0f565b93506125cc337f0000000000000000000000000000000000000000000000000000000000000000600361245d6020860186614b56565b50600101612545565b508290505f5b8181101561266b57368585838181106125f6576125f6614c09565b90506020028101906126089190614c1d565b905061262c61261a6020830183614b56565b6126276020840184614e78565b612c8a565b9350612662337f0000000000000000000000000000000000000000000000000000000000000000600461245d6020860186614b56565b506001016125db565b5060405133907ff48581d8a62b775b74f2fb67f1d5806a9a356fbcc598040ab3071d3e37af40c2905f90a250505050505050505050565b606083518281116126b1578092505b8381116126bc578093505b5081831015610bd15750604051828203848401601f19601f830181165b82810151858201528101806126d9575050508060208301015f81526020810160405250808252509392505050565b6060610bd183835f196126a2565b5f61072a826080015160801c90565b5f61072a82608001516001600160801b031690565b5f61072a8260c0015160801c90565b5f61072a8260c001516001600160801b031690565b60605f6001600160a01b0384166001148015906127825750612780868686613ab7565b155b156127ab57604051637c84ecfb60e01b81526001600160a01b0385166004820152602401610686565b825f036127cb5760405163f725081760e01b815260040160405180910390fd5b826001600160401b038111156127e3576127e361423b565b60405190808252806020026020018201604052801561280c578160200160208202803683370190505b506001600160a01b038086165f908152602089815260408083208a85168452909152812054929450911691505b6001600160a01b0382161580159061285b57506001600160a01b038216600114155b801561286657508381105b156128ca578183828151811061287e5761287e614c09565b6001600160a01b039283166020918202929092018101919091529281165f90815288845260408082208984168352909452929092205490911690806128c281614ece565b915050612839565b6001600160a01b0382166001148015906128e357505f81115b1561290f57826128f4600183614ee6565b8151811061290457612904614c09565b602002602001015191505b8083525094509492505050565b60015f908152602092835260408082206001600160a01b039384168352909352919091205416151590565b612951828261291c565b1561296f576040516329e42f3360e11b815260040160405180910390fd5b60015f818152602093845260408082206001600160a01b0394909416825292909352912080546001600160a01b0319169091179055565b6001600160a01b03811615806129c557506001600160a01b0381166001145b156129ee57604051637c84ecfb60e01b81526001600160a01b0382166004820152602401610686565b6001600160a01b038181165f9081526020858152604080832086851684529091529020541615612a3c57604051631034f46960e21b81526001600160a01b0382166004820152602401610686565b60015f908152602084815260408083206001600160a01b039586168085528184528285208054968816808752988552838620918652908452919093208054949095166001600160a01b031994851617909455528154169091179055565b6060836001612aa8828261342a565b612ab4600133886129a6565b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929998505050505050505050565b6060836002612b03828261342a565b612ab4600233886129a6565b6060836003612b1e828261342a565b5f8080612b2d87890189614ef9565b919450925090506001600160e01b031983166306d61fe760e41b1480612b6357506001600160e01b03198316638a91b0e360e01b145b15612b8d576040516379bd117b60e01b81526001600160e01b031984166004820152602401610686565b612b97825f611dde565b8015612bac5750612bac82607f60f91b611dde565b15612bcc57816040516376087dc160e01b81526004016106869190614c64565b6001600160e01b031983165f9081526003602090815260408083203384529091529020546001600160a01b031615612c23576040516374420d1560e01b81526001600160e01b031984166004820152602401610686565b6001600160e01b03199092165f908152600360209081526040808320338452909152902080546001600160a01b038a166001600160a01b031960f89490941c600160a01b02939093166001600160a81b031990911617919091179055925050509392505050565b6060836004612c99828261342a565b5f8080612ca887890189614f62565b919450925090505f80846001811115612cc357612cc3614c79565b148015612cd857506001600160e01b03198316155b15612d4c5750335f908152600460205260409020546001600160a01b03168015612d205760405163741cbe0360e01b81526001600160a01b0382166004820152602401610686565b335f90815260046020526040902080546001600160a01b0319166001600160a01b038c16179055612dfa565b6001846001811115612d6057612d60614c79565b03610d4f57506001600160e01b031982165f9081526005602090815260408083203384529091529020546001600160a01b03168015612dbd5760405163741cbe0360e01b81526001600160a01b0382166004820152602401610686565b6001600160e01b031983165f908152600560209081526040808320338452909152902080546001600160a01b0319166001600160a01b038c161790555b5098975050505050505050565b60608235830160208181019135908581013586018082019190359060408801358801908101903584838114612e4f5760405163b4fa3fb360e01b815260040160405180910390fd5b5f5b81811015612f6f575f888883818110612e6c57612e6c614c09565b90506020020135905060018103612eab57612ea58d888885818110612e9357612e93614c09565b90506020028101906124229190614e78565b50612f66565b60028103612edb57612ea58d888885818110612ec957612ec9614c09565b90506020028101906124fb9190614e78565b60038103612f0b57612ea58d888885818110612ef957612ef9614c09565b90506020028101906125919190614e78565b60048103612f3b57612ea58d888885818110612f2957612f29614c09565b90506020028101906126279190614e78565b60405163484d218160e01b81526001600160a01b038e16600482015260248101829052604401610686565b50600101612e51565b5082828080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929e9d5050505050505050505050505050565b60605f612fc483850185614f8d565b925090506008198101612fdf57612fda85613bc2565b612061565b60088103610d4f57612fda85613c4a565b60405163468721a760e01b81525f906001600160a01b0385169063468721a79061302590869085908790600190600401614cad565b6020604051808303815f875af1158015613041573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130659190614d5e565b9050806107ab57604051632b3f6d1160e21b815260040160405180910390fd5b60605f61309483850185614fc6565b925090506120616001338388613cd2565b60605f6130b483850185614fc6565b925090506120616002338388613cd2565b60605f6130d483850185614ffc565b6001600160e01b03199091165f908152600360209081526040808320338452909152902080546001600160a01b031916905595945050505050565b60605f8061311f84860186614f62565b945090925090505f82600181111561313957613139614c79565b14801561314e57506001600160e01b03198116155b1561317457335f90815260046020526040902080546001600160a01b0319169055610cfb565b600182600181111561318857613188614c79565b03610d4f576001600160e01b031981165f908152600560209081526040808320338452909152902080546001600160a01b0319169055610cfb565b6060823583016020818101913590858101358601808201919035906040880135880190810190358483811461320b5760405163b4fa3fb360e01b815260040160405180910390fd5b5f5b81811015612f6f575f88888381811061322857613228614c09565b9050602002013590506001810361326c576132668d88888581811061324f5761324f614c09565b90506020028101906132619190614e78565b613085565b5061330b565b600281036132a1576132668d88888581811061328a5761328a614c09565b905060200281019061329c9190614e78565b6130a5565b600381036132d6576132668d8888858181106132bf576132bf614c09565b90506020028101906132d19190614e78565b6130c5565b60048103612f3b576132668d8888858181106132f4576132f4614c09565b90506020028101906133069190614e78565b61310f565b5060010161320d565b60605f61332383850185614f8d565b92509050600819810161335157335f90815260066020526040902080546001600160a01b0319169055612061565b60088103610d4f57335f90815260076020526040902080546001600160a01b0319169055612061565b60405163468721a760e01b81525f906001600160a01b0385169063468721a7906133af90869085908790600190600401614cad565b6020604051808303815f875af11580156133cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133ef9190614d5e565b9050806107ab57604080516001600160a01b03861681525f60208201525f5160206152aa5f395f51905f52910160405180910390a150505050565b335f908152602081905260409020546001600160a01b031680156134ab5760405163529562a160e01b81523360048201526001600160a01b0384811660248301526044820184905282169063529562a1906064015f6040518083038186803b158015613494575f5ffd5b505afa1580156134a6573d5f5f3e3d5ffd5b505050505b505050565b60606134bc855f611dde565b156136a5576134cf84600160f81b611dde565b156134f857365f6134e08585613853565b915091506134ef338383613dc7565b9250505061083b565b613502845f611dde565b156135b2575f5f365f6135158787613950565b6040805160018082528183019092529498509296509094509250816020015b606081526020019060019003908161353457905050945061358c33858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611d3c92505050565b855f8151811061359e5761359e614c09565b60200260200101819052505050505061083b565b6135c4846001600160f81b0319611dde565b1561368a575f6135d760148285876149ad565b6135e0916149d4565b60601c9050365f6135f485601481896149ad565b604080516001808252818301909252929450909250816020015b606081526020019060019003908161360e579050509350613665338484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250613e4392505050565b845f8151811061367757613677614c09565b602002602001018190525050505061083b565b83604051632e5bf3f960e21b81526004016106869190614c64565b6136b385600160f81b611dde565b15613838576136c684600160f81b611dde565b156136f157365f6136d78585613853565b915091506136e6338383613edd565b935061083b92505050565b6136fb845f611dde565b15613785575f5f365f61370e8787613950565b6040805160018082528183019092529498509296509094509250816020015b606081526020019060019003908161372d57905050945061358c33858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250613fd092505050565b613797846001600160f81b0319611dde565b1561368a575f6137aa60148285876149ad565b6137b3916149d4565b60601c9050365f6137c785601481896149ad565b604080516001808252818301909252929450909250816020015b60608152602001906001900390816137e1579050509350613665338484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061408792505050565b846040516308c3ee0360e11b81526004016106869190614c64565b365f833580850160208587010360208201945081359350808460051b8301118360401c17156138895763ba597e7e5f526004601cfd5b83156138df578392505b6001830392508260051b850135915081850160408101358082018381358201118460408501111782861782351760401c17156138d65763ba597e7e5f526004601cfd5b50505082613893575b5050509250929050565b6134ab837f00000000000000000000000000000000000000000000000000000000000000008484604051602401613921929190615018565b60408051601f198184030181529190526020810180516001600160e01b0316633f707e6b60e01b179052612ff0565b5f80368161396160148287896149ad565b61396a916149d4565b60601c935061397d6034601487896149ad565b613986916150f8565b925061399585603481896149ad565b949793965094505050565b6134ab837f000000000000000000000000000000000000000000000000000000000000000084846040516024016139d8929190615018565b60408051601f198184030181529190526020810180516001600160e01b0316632864481160e11b17905261337a565b60405163468721a760e01b81525f906001600160a01b0386169063468721a790613a3b908790879087908790600401614cad565b6020604051808303815f875af1158015613a57573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7b9190614d5e565b905080611f5557604080516001600160a01b03871681525f60208201525f5160206152aa5f395f51905f52910160405180910390a15050505050565b5f60016001600160a01b0383161480159061083b5750506001600160a01b039081165f9081526020938452604080822093831682529290935291205416151590565b5f80836001811115613b0d57613b0d614c79565b148015613b2257506001600160e01b03198216155b15613b415750335f908152600460205260409020546001600160a01b03165b6001836001811115613b5557613b55614c79565b0361072a57506001600160e01b0319165f9081526005602090815260408083203384529091529020546001600160a01b0316919050565b5f60d08265ffffffffffff16901b60a08465ffffffffffff16901b85613bb2575f613bb5565b60015b60ff161717949350505050565b806009613bcf828261342a565b335f908152600660205260409020546001600160a01b03168015613c185760405163b9aa8b3f60e01b81526001600160a01b038216600482015260096024820152604401610686565b5050335f90815260066020526040902080546001600160a01b0319166001600160a01b03939093169290921790915550565b806008613c57828261342a565b335f908152600760205260409020546001600160a01b03168015613ca05760405163b9aa8b3f60e01b81526001600160a01b038216600482015260086024820152604401610686565b5050335f90815260076020526040902080546001600160a01b0319166001600160a01b03939093169290921790915550565b6001600160a01b0381161580613cf157506001600160a01b0381166001145b15613d1a57604051637c84ecfb60e01b81526001600160a01b0383166004820152602401610686565b6001600160a01b038281165f908152602086815260408083208785168452909152902054811690821614613d6c57604051637c84ecfb60e01b81526001600160a01b0382166004820152602401610686565b6001600160a01b039081165f908152602085815260408083209584168084528683528184208054968616855297835281842090845282529091208054939092166001600160a01b031993841617909155919091528154169055565b6060613e30847f00000000000000000000000000000000000000000000000000000000000000008585604051602401613e01929190615018565b60408051601f198184030181529190526020810180516001600160e01b0316636108557360e01b179052613e43565b80602001905181019061083b91906151bf565b60605f846001600160a01b0316635229073f855f8660016040518563ffffffff1660e01b8152600401613e799493929190614cad565b5f604051808303815f875af1158015613e94573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613ebb9190810190614cf1565b925090508061206157604051632b3f6d1160e21b815260040160405180910390fd5b6060805f613f48867f00000000000000000000000000000000000000000000000000000000000000008787604051602401613f19929190615018565b60408051601f198184030181529190526020810180516001600160e01b0316639abb6e1760e01b179052614087565b905080806020019051810190613f5e91906151f0565b815191945092505f5b81811015613fc557848181518110613f8157613f81614c09565b6020026020010151613fbd57604080516001600160a01b038a168152602081018390525f5160206152aa5f395f51905f52910160405180910390a15b600101613f67565b505050935093915050565b60605f856001600160a01b0316635229073f8686865f6040518563ffffffff1660e01b81526004016140059493929190614cad565b5f604051808303815f875af1158015614020573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526140479190810190614cf1565b9250905080611dd557604080516001600160a01b03881681525f60208201525f5160206152aa5f395f51905f52910160405180910390a150949350505050565b60605f846001600160a01b0316635229073f855f8660016040518563ffffffff1660e01b81526004016140bd9493929190614cad565b5f604051808303815f875af11580156140d8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526140ff9190810190614cf1565b925090508061206157604080516001600160a01b03871681525f60208201525f5160206152aa5f395f51905f52910160405180910390a1509392505050565b6001600160a01b0381168114614152575f5ffd5b50565b8035610d688161413e565b5f5f83601f840112614170575f5ffd5b5081356001600160401b03811115614186575f5ffd5b60208301915083602082850101111561061a575f5ffd5b5f5f5f5f606085870312156141b0575f5ffd5b8435935060208501356141c28161413e565b925060408501356001600160401b038111156141dc575f5ffd5b6141e887828801614160565b95989497509550505050565b5f5f5f60408486031215614206575f5ffd5b8335925060208401356001600160401b03811115614222575f5ffd5b61422e86828701614160565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b03811182821017156142725761427261423b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156142a0576142a061423b565b604052919050565b5f6001600160401b038211156142c0576142c061423b565b50601f01601f191660200190565b5f82601f8301126142dd575f5ffd5b81356142f06142eb826142a8565b614278565b818152846020838601011115614304575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f6101208284031215614331575f5ffd5b61433961424f565b905061434482614155565b81526020828101359082015260408201356001600160401b03811115614368575f5ffd5b614374848285016142ce565b60408301525060608201356001600160401b03811115614392575f5ffd5b61439e848285016142ce565b6060830152506080828101359082015260a0808301359082015260c0808301359082015260e08201356001600160401b038111156143da575f5ffd5b6143e6848285016142ce565b60e0830152506101008201356001600160401b03811115614405575f5ffd5b614411848285016142ce565b6101008301525092915050565b5f5f5f60608486031215614430575f5ffd5b83356001600160401b03811115614445575f5ffd5b61445186828701614320565b9660208601359650604090950135949350505050565b5f60208284031215614477575f5ffd5b5035919050565b5f5f83601f84011261448e575f5ffd5b5081356001600160401b038111156144a4575f5ffd5b6020830191508360208260051b850101111561061a575f5ffd5b5f606082840312156144ce575f5ffd5b50919050565b5f5f5f5f5f5f5f5f5f60a08a8c0312156144ec575f5ffd5b89356001600160401b03811115614501575f5ffd5b61450d8c828d0161447e565b909a5098505060208a01356001600160401b0381111561452b575f5ffd5b6145378c828d0161447e565b90985096505060408a01356001600160401b03811115614555575f5ffd5b6145618c828d0161447e565b90965094505060608a01356001600160401b0381111561457f575f5ffd5b61458b8c828d0161447e565b90945092505060808a01356001600160401b038111156145a9575f5ffd5b6145b58c828d016144be565b9150509295985092959850929598565b5f5f604083850312156145d6575f5ffd5b82356001600160401b038111156145eb575f5ffd5b6145f785828601614320565b92505060208301356146088161413e565b809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f6146536080830187614613565b65ffffffffffff8616602084015265ffffffffffff8516604084015282810360608401526146818185614613565b979650505050505050565b5f5f6040838503121561469d575f5ffd5b82356146a88161413e565b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b818110156146f85783516001600160a01b03168352602093840193909201916001016146d1565b50506001600160a01b039490941660209390930192909252509092915050565b5f5f60208385031215614729575f5ffd5b82356001600160401b0381111561473e575f5ffd5b61474a8582860161447e565b90969095509350505050565b602081525f610bd16020830184614613565b6001600160e01b031981168114614152575f5ffd5b5f6020828403121561478d575f5ffd5b8135610bd181614768565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156147ef57603f198786030184526147da858351614613565b945060209384019391909101906001016147be565b50929695505050505050565b5f5f6040838503121561480c575f5ffd5b82356148178161413e565b915060208301356146088161413e565b803560ff81168114610d68575f5ffd5b5f5f5f5f6060858703121561484a575f5ffd5b84356148558161413e565b935060208501356001600160401b0381111561486f575f5ffd5b61487b8782880161447e565b909450925061488e905060408601614827565b905092959194509250565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201525f6148e8606083018486614899565b9695505050505050565b5f82601f830112614901575f5ffd5b815161490f6142eb826142a8565b818152846020838601011115614923575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561494f575f5ffd5b81516001600160401b03811115614964575f5ffd5b61083b848285016148f2565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b5f602082840312156149a6575f5ffd5b5051919050565b5f5f858511156149bb575f5ffd5b838611156149c7575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015614a1a576bffffffffffffffffffffffff196bffffffffffffffffffffffff198560140360031b1b82161691505b5092915050565b838152606060208201525f614a396060830185614613565b82810360408401526148e88185614613565b60018060a01b0384168152826020820152606060408201525f614a716060830184614613565b95945050505050565b5f60208284031215614a8a575f5ffd5b8151610bd181614768565b80516001600160a01b03168252602081015160208301525f60408201516101206040850152614ac8610120850182614613565b905060608301518482036060860152614ae18282614613565b9150506080830151608085015260a083015160a085015260c083015160c085015260e083015184820360e0860152614b198282614613565b915050610100830151848203610100860152614a718282614613565b604081525f614b476040830185614a95565b90508260208301529392505050565b5f60208284031215614b66575f5ffd5b8135610bd18161413e565b5f5f8335601e19843603018112614b86575f5ffd5b8301803591506001600160401b03821115614b9f575f5ffd5b6020019150600581901b360382131561061a575f5ffd5b5f60208284031215614bc6575f5ffd5b610bd182614827565b805160208201516001600160d01b03198116919060068210156116ec576001600160d01b031960069290920360031b82901b161692915050565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112614c31575f5ffd5b9190910192915050565b8381526001600160a01b03831660208201526060604082018190525f90614a7190830184614613565b6001600160f81b031991909116815260200190565b634e487b7160e01b5f52602160045260245ffd5b60028110614ca957634e487b7160e01b5f52602160045260245ffd5b9052565b60018060a01b0385168152836020820152608060408201525f614cd36080830185614613565b9050614a716060830184614c8d565b80518015158114610d68575f5ffd5b5f5f60408385031215614d02575f5ffd5b614d0b83614ce2565b915060208301516001600160401b03811115614d25575f5ffd5b614d31858286016148f2565b9150509250929050565b6001600160a01b03831681526040602082018190525f9061083b90830184614613565b5f60208284031215614d6e575f5ffd5b610bd182614ce2565b803560028110610d68575f5ffd5b5f5f60408385031215614d96575f5ffd5b614d9f83614d77565b9150602083013561460881614768565b5f5f60408385031215614dc0575f5ffd5b825160208401519092506001600160401b03811115614d25575f5ffd5b8281525f82518060208501602085015e5f92016020019182525092915050565b606081525f614e0f6060830186614a95565b60208301949094525060400152919050565b60ff8416815260406020820181905281018290525f8360608301825b85811015614e6d578235614e508161413e565b6001600160a01b0316825260209283019290910190600101614e3d565b509695505050505050565b5f5f8335601e19843603018112614e8d575f5ffd5b8301803591506001600160401b03821115614ea6575f5ffd5b60200191503681900382131561061a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201614edf57614edf614eba565b5060010190565b8181038181111561072a5761072a614eba565b5f5f5f60608486031215614f0b575f5ffd5b8335614f1681614768565b925060208401356001600160f81b031981168114614f32575f5ffd5b915060408401356001600160401b03811115614f4c575f5ffd5b614f58868287016142ce565b9150509250925092565b5f5f5f60608486031215614f74575f5ffd5b614f7d84614d77565b92506020840135614f3281614768565b5f5f60408385031215614f9e575f5ffd5b8235915060208301356001600160401b03811115614fba575f5ffd5b614d31858286016142ce565b5f5f60408385031215614fd7575f5ffd5b8235614fe28161413e565b915060208301356001600160401b03811115614fba575f5ffd5b5f5f6040838503121561500d575f5ffd5b8235614fe281614768565b602080825281018290525f6040600584901b830181019083018583605e1936839003015b878210156150eb57868503603f19018452823581811261505a575f5ffd5b890180356150678161413e565b6001600160a01b0316865260208181013590870152604081013536829003601e19018112615093575f5ffd5b016020810190356001600160401b038111156150ad575f5ffd5b8036038213156150bb575f5ffd5b606060408801526150d0606088018284614899565b9650505060208301925060208401935060018201915061503c565b5092979650505050505050565b8035602083101561072a575f19602084900360031b1b1692915050565b5f6001600160401b0382111561512d5761512d61423b565b5060051b60200190565b5f82601f830112615146575f5ffd5b81516151546142eb82615115565b8082825260208201915060208360051b860101925085831115615175575f5ffd5b602085015b838110156151b55780516001600160401b03811115615197575f5ffd5b6151a6886020838a01016148f2565b8452506020928301920161517a565b5095945050505050565b5f602082840312156151cf575f5ffd5b81516001600160401b038111156151e4575f5ffd5b61083b84828501615137565b5f5f60408385031215615201575f5ffd5b82516001600160401b03811115615216575f5ffd5b8301601f81018513615226575f5ffd5b80516152346142eb82615115565b8082825260208201915060208360051b850101925087831115615255575f5ffd5b6020840193505b8284101561527e5761526d84614ce2565b82526020938401939091019061525c565b8095505050505060208301516001600160401b0381111561529d575f5ffd5b614d318582860161513756feb8bc84bd77f5eb08210b8eb20fd63b3ec6a7992d277ab94663bae0e066f792aca264697066735822122057e35612c96749b4d4d6b3f02cc1e78c7c3495436185ad1901de41fed60d2a6464736f6c634300081c00336080604052348015600e575f5ffd5b5061096c8061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061007a575f3560e01c80636a221657116100585780636a221657146100cf57806378272525146100e25780639517e29f146100f55780639abb6e1714610108575f5ffd5b80633f707e6b1461007e57806350c890221461009357806361085573146100a6575b5f5ffd5b61009161008c3660046105a0565b610129565b005b6100916100a13660046105a0565b610192565b6100b96100b43660046105a0565b6101f6565b6040516100c6919061068b565b60405180910390f35b6100916100dd3660046106d3565b6102b7565b6100916100f0366004610797565b6102d8565b610091610103366004610797565b61037c565b61011b6101163660046105a0565b610416565b6040516100c692919061081a565b805f5b8181101561018c573684848381811061014757610147610873565b90506020028101906101599190610887565b905061018261016b60208301836108a5565b602083013561017d60408501856108be565b61053f565b505060010161012c565b50505050565b805f5b8181101561018c57368484838181106101b0576101b0610873565b90506020028101906101c29190610887565b90506101eb6101d460208301836108a5565b60208301356101e660408501856108be565b610572565b505050600101610195565b6060818067ffffffffffffffff811115610212576102126106bf565b60405190808252806020026020018201604052801561024557816020015b60608152602001906001900390816102305790505b5091505f5b818110156102af573685858381811061026557610265610873565b90506020028101906102779190610887565b905061028961016b60208301836108a5565b84838151811061029b5761029b610873565b60209081029190910101525060010161024a565b505092915050565b6040515f5f835160208501865afa3d5f833e80156102d3573d82f35b503d81fd5b604051638a91b0e360e01b81526001600160a01b03841690638a91b0e3906103069085908590600401610908565b5f604051808303815f87803b15801561031d575f5ffd5b505af115801561032f573d5f5f3e3d5ffd5b5050604080518781526001600160a01b03871660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e93500190505b60405180910390a150505050565b6040516306d61fe760e41b81526001600160a01b03841690636d61fe70906103aa9085908590600401610908565b5f604051808303815f87803b1580156103c1575f5ffd5b505af11580156103d3573d5f5f3e3d5ffd5b5050604080518781526001600160a01b03871660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123935001905061036e565b606080828067ffffffffffffffff811115610433576104336106bf565b60405190808252806020026020018201604052801561046657816020015b60608152602001906001900390816104515790505b5091508067ffffffffffffffff811115610482576104826106bf565b6040519080825280602002602001820160405280156104ab578160200160208202803683370190505b5092505f5b8181101561053657368686838181106104cb576104cb610873565b90506020028101906104dd9190610887565b90506104ef6101d460208301836108a5565b86848151811061050157610501610873565b6020026020010186858151811061051a5761051a610873565b60209081029190910101919091529015159052506001016104b0565b50509250929050565b604051818382375f38838387895af161055a573d5f823e3d81fd5b3d8152602081013d5f823e3d01604052949350505050565b6040515f90828482375f388483888a5af191503d8152602081013d5f823e3d81016040525094509492505050565b5f5f602083850312156105b1575f5ffd5b823567ffffffffffffffff8111156105c7575f5ffd5b8301601f810185136105d7575f5ffd5b803567ffffffffffffffff8111156105ed575f5ffd5b8560208260051b8401011115610601575f5ffd5b6020919091019590945092505050565b5f82825180855260208501945060208160051b830101602085015f5b8381101561067f57601f19858403018852815180518085528060208301602087015e5f602082870101526020601f19601f8301168601019450505060208201915060208801975060018101905061062d565b50909695505050505050565b602081525f61069d6020830184610611565b9392505050565b80356001600160a01b03811681146106ba575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156106e4575f5ffd5b6106ed836106a4565b9150602083013567ffffffffffffffff811115610708575f5ffd5b8301601f81018513610718575f5ffd5b803567ffffffffffffffff811115610732576107326106bf565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610761576107616106bf565b604052818152828201602001871015610778575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f5f5f606085870312156107aa575f5ffd5b843593506107ba602086016106a4565b9250604085013567ffffffffffffffff8111156107d5575f5ffd5b8501601f810187136107e5575f5ffd5b803567ffffffffffffffff8111156107fb575f5ffd5b87602082840101111561080c575f5ffd5b949793965060200194505050565b604080825283519082018190525f9060208501906060840190835b818110156108555783511515835260209384019390920191600101610835565b505083810360208501526108698186610611565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261089b575f5ffd5b9190910192915050565b5f602082840312156108b5575f5ffd5b61069d826106a4565b5f5f8335601e198436030181126108d3575f5ffd5b83018035915067ffffffffffffffff8211156108ed575f5ffd5b602001915036819003821315610901575f5ffd5b9250929050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f1916010191905056fea264697066735822122022c9b200e3f870ce04690a2b55157c10e84d8f3789b97d1df9409e173a99a39764736f6c634300081c0033"; bytes public constant SAFE7579_LAUNCHPAD_BYTECODE = - hex"60e060405234801561001057600080fd5b50604051612dea380380612dea83398101604081905261002f91610089565b6001600160a01b03821661005657604051632039d3c960e01b815260040160405180910390fd5b306080526001600160a01b0391821660a0521660c0526100c3565b6001600160a01b038116811461008657600080fd5b50565b6000806040838503121561009c57600080fd5b82516100a781610071565b60208401519092506100b881610071565b809150509250929050565b60805160a05160c051612cc161012960003960008181610159015281816104900152610fc60152600081816101aa015281816105be015281816110a701526113ea01526000818160f6015281816105690152818161099301526111100152612cc16000f3fe6080604052600436106100ec5760003560e01c8063663c87d81161008a578063d78343d911610059578063d78343d914610348578063d9ed0e8f14610368578063f2dc691d14610388578063f698da25146103a857600080fd5b8063663c87d81461028c578063928107f9146102ac5780639cfd7cff146102cc578063d03c79141461031857600080fd5b806319822f7c116100c657806319822f7c146101ec5780633c9de1b81461021a5780634fff40e11461023c57806355d559f41461025c57600080fd5b806306433b1b14610147578063137e051e1461019857806315cca638146101cc57600080fd5b36610142576000547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116911614610140576040516308e3edd160e41b815260040160405180910390fd5b005b600080fd5b34801561015357600080fd5b5061017b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101a457600080fd5b5061017b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101d857600080fd5b506101406101e7366004611ab5565b6103bd565b3480156101f857600080fd5b5061020c610207366004611bc2565b610563565b60405190815260200161018f565b34801561022657600080fd5b50600080516020612c6c8339815191525461020c565b34801561024857600080fd5b50610140610257366004611c0f565b61098e565b34801561026857600080fd5b5061027c610277366004611c99565b610abe565b60405161018f9493929190611d3a565b34801561029857600080fd5b5061017b6102a7366004611e94565b610d1b565b3480156102b857600080fd5b5061020c6102c7366004612094565b610df5565b3480156102d857600080fd5b50604080518082018252601a81527f7268696e6573746f6e652e73616665373537392e76312e302e300000000000006020820152905161018f91906121c2565b34801561032457600080fd5b506103386103333660046121dc565b610e47565b604051901515815260200161018f565b34801561035457600080fd5b506101406103633660046121f5565b610ef0565b34801561037457600080fd5b50610140610383366004612321565b61109c565b34801561039457600080fd5b506103386103a33660046121dc565b611324565b3480156103b457600080fd5b5061020c611373565b3330146103dd57604051630a57d61d60e01b815260040160405180910390fd5b60405163610b592560e01b81526001600160a01b038b166004820152309063610b592590602401600060405180830381600087803b15801561041e57600080fd5b505af1158015610432573d6000803e3d6000fd5b50506040805160008082526020820190925230935063540fb4f992509061047c565b6040805180820190915260008152606060208201528152602001906001900390816104545790505b508b8b8b8b8b8b60405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018d8d8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050509082525060ff8c166020909101526040516001600160e01b031960e08b901b16815261052598979695949392919060040161255c565b600060405180830381600087803b15801561053f57600080fd5b505af1158015610553573d6000803e3d6000fd5b5050505050505050505050505050565b600080547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169116146105b3576040516308e3edd160e41b815260040160405180910390fd5b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105fc57604051632039d3c960e01b815260040160405180910390fd5b61060960608501856125cf565b61061891600491600091612615565b6106219161263f565b6001600160e01b03191663d9ed0e8f60e01b146106515760405163c3d40f7760e01b815260040160405180910390fd5b600061066060608601866125cf565b61066e916004908290612615565b81019061067b9190612094565b9050610693600080516020612c6c8339815191525490565b61069c82610df5565b146106ba5760405163278328b160e21b815260040160405180910390fd5b600080866020013590508060601c915060008360a001516001600160a01b03168460c001516040516024016106ef9190612677565b60408051601f19818403018152918152602080830180516001600160e01b0316633cd56b0760e11b1790529051610729929133910161268a565b60408051601f1981840301815290829052610743916126bc565b6000604051808303816000865af19150503d8060008114610780576040519150601f19603f3d011682016040523d82523d6000602084013e610785565b606091505b50509050806107a75760405163c3d40f7760e01b815260040160405180910390fd5b60c084015151600090815b818110156108c95760008760c0015182815181106107d2576107d26126d8565b6020026020010151600001519050806001600160a01b0316636d61fe708960c001518481518110610805576108056126d8565b6020026020010151602001516040518263ffffffff1660e01b815260040161082d91906121c2565b600060405180830381600087803b15801561084757600080fd5b505af115801561085b573d6000803e3d6000fd5b505060408051600181526001600160a01b03851660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123935001905060405180910390a1866001600160a01b0316816001600160a01b0316036108c057600193505b506001016107b2565b50811561094857604051639700320360e01b81526001600160a01b038616906397003203906108fe908d908d906004016127ce565b6020604051808303816000875af115801561091d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094191906127f0565b965061096f565b6000806000610957898e6113cc565b92509250925061096983158383611542565b99505050505b8715610981576000806000808b335af1505b5050505050509392505050565b6000547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169116146109dd576040516308e3edd160e41b815260040160405180910390fd5b60006109f5600080516020612c6c8339815191525490565b14610a135760405163d4d496e560e01b815260040160405180910390fd5b610a2984600080516020612c6c83398151915255565b6001600160a01b03831615610ab8576000836001600160a01b03168383604051610a54929190612809565b600060405180830381855af49150503d8060008114610a8f576040519150601f19603f3d011682016040523d82523d6000602084013e610a94565b606091505b5050905080610ab657604051631f57fed560e31b815260040160405180910390fd5b505b50505050565b6060600080823682610ad46101008901896125cf565b9092509050610ae7600660008385612615565b610af091612819565b60d01c9450610b03600c60068385612615565b610b0c91612819565b60d01c9350610b1e81600c8185612615565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604080516101c081019091527fc03dfc11d8b10bf9cf703d558958c8c42777f785d998c62060d85a4f0ef6ea7f815294975095509293505060208084019250610b9a91508a018a61284f565b6001600160a01b0316815260200188602001358152602001888060400190610bc291906125cf565b604051610bd0929190612809565b6040519081900390208152602001610beb60608a018a6125cf565b604051610bf9929190612809565b60405180910390208152602001610c0f8961157a565b6001600160801b03168152602001610c2689611590565b6001600160801b031681526020018860a001358152602001610c47896115a5565b6001600160801b03168152602001610c5e896115b4565b6001600160801b03168152602001610c7960e08a018a6125cf565b604051610c87929190612809565b6040805191829003909120825265ffffffffffff80881660208401528616908201526001600160a01b0388166060909101526101c08120909150601960f81b600160f81b610cd3611373565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529550505092959194509250565b6000818051906020012083604051602001610d40929190918252602082015260400190565b60405160208183030381529060405280519060200120925060ff60f81b858486896001600160a01b0316604051602001610d7b92919061286c565b60405160208183030381529060405280519060200120604051602001610dd394939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b80516020808301516040808501516060860151608087015160a088015160c08901519451600098610e2a98909796910161288e565b604051602081830303815290604052805190602001209050919050565b600081600881901b6001600160f81b03198216600160f81b03610e6d5760019250610ea9565b6001600160f81b03198216610e855760019250610ea9565b6001600160f81b031980831603610e9f5760019250610ea9565b5060009392505050565b828015610ebe57506001600160f81b03198116155b15610eca575050919050565b828015610ee457506001600160f81b03198116600160f81b145b15610e9f575050919050565b60405163610b592560e01b81526001600160a01b038d166004820152309063610b592590602401600060405180830381600087803b158015610f3157600080fd5b505af1158015610f45573d6000803e3d6000fd5b505060405163f08a032360e01b81526001600160a01b038f16600482015230925063f08a03239150602401600060405180830381600087803b158015610f8a57600080fd5b505af1158015610f9e573d6000803e3d6000fd5b50505050306001600160a01b031663540fb4f98c8c8c8c8c8c8c8c60405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018e8e8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050509082525060ff8d166020909101526040516001600160e01b031960e08c901b16815261105c9998979695949392919060040161290b565b600060405180830381600087803b15801561107657600080fd5b505af115801561108a573d6000803e3d6000fd5b50505050505050505050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110e557604051632039d3c960e01b815260040160405180910390fd5b6110f2602082018261284f565b600080546001600160a01b0319166001600160a01b039283161790557f000000000000000000000000000000000000000000000000000000000000000016611140608083016060840161284f565b6001600160a01b03161461116757604051633007073760e01b815260040160405180910390fd5b6302b994c760e31b61117c60808301836125cf565b61118b91600491600091612615565b6111949161263f565b6001600160e01b031916146111bc57604051633007073760e01b815260040160405180910390fd5b3063b63e800d6111cf6020840184612980565b60408501356111e4608087016060880161284f565b6111f160808801886125cf565b61120160c08a0160a08b0161284f565b60008060006040518b63ffffffff1660e01b815260040161122b9a999897969594939291906129c9565b600060405180830381600087803b15801561124557600080fd5b505af1158015611259573d6000803e3d6000fd5b50506000600080516020612c6c83398151915255506112759050565b60008061128860c0840160a0850161284f565b6001600160a01b031661129e60e08501856125cf565b306040516020016112b193929190612a80565b60408051601f19818403018152908290526112cb916126bc565b6000604051808303816000865af19150503d8060008114611308576040519150601f19603f3d011682016040523d82523d6000602084013e61130d565b606091505b50915091508161131f57805160208201fd5b505050565b60006001820361133657506001919050565b6002820361134657506001919050565b6003820361135657506001919050565b6004820361136657506001919050565b506000919050565b919050565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b60008060006060808660a001516001600160a01b03166355d559f4877f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611426929190612aa1565b600060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261146b9190810190612b2e565b8351602085012060408c01519298509296509294509192509060009061149490839085906115c9565b905061149f816118c1565b60208901516114ad816118c1565b6114b6816118cd565b80516000805b8281101561152e5760006114f28583815181106114db576114db6126d8565b6020026020010151876118d690919063ffffffff16565b5090508015611525578261150581612bcc565b9350508d6040015183106115255760019b5050505050505050505061153b565b506001016114bc565b5060009950505050505050505b9250925092565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561156a57600061156d565b60015b60ff161717949350505050565b600061158a826080013560801c90565b92915050565b60006001600160801b0360808301351661158a565b600060c082013560801c61158a565b60006001600160801b0360c08301351661158a565b606060006115d8836041612be5565b8451909150836001600160401b038111156115f5576115f5611d86565b60405190808252806020026020018201604052801561161e578160200160208202803683370190505b5092508181101561164257604051638baa579f60e01b815260040160405180910390fd5b60005b848110156118b7576000806000806116758a86604102016020810151604082015160609092015160001a92909190565b9250925092508260ff16600003611816579092508290611696896041612be5565b8110156116cc576040516338a245ff60e11b81526004810182905260006024820181905260448201526064015b60405180910390fd5b856116d8826020612bfc565b1115611708576040516338a245ff60e11b81526004810182905260006024820152604481018790526064016116c3565b6020818b018101519087908290611720908590612bfc565b61172a9190612bfc565b111561175a576040516338a245ff60e11b81526004810183905260248101829052604481018890526064016116c3565b60606020838d01019050631626ba7e60e01b6001600160e01b031916866001600160a01b0316631626ba7e8f846040518363ffffffff1660e01b81526004016117a4929190612c0f565b602060405180830381865afa1580156117c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e59190612c28565b6001600160e01b0319161461180f578060405163605d348960e01b81526004016116c391906121c2565b505061187c565b601e8360ff16111561186d576118666118548c6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b61185f600486612c52565b84846118f9565b935061187c565b6118798b8484846118f9565b93505b8388868151811061188f5761188f6126d8565b6001600160a01b03909216602092830291909101909101525050600190920191506116459050565b5050509392505050565b6118ca81611937565b50565b6118ca8161198c565b6000806118ee84846001600160a01b031660006119d5565b909590945092505050565b60006040518560005260ff85166020528360405282606052602060406080600060015afa5060006060523d6060185191508060405250949350505050565b8051600082528060051b82016020601f198185015b8201838111611984578051828201805182811161196b5750505061194c565b5b818601528301805182811161196c575084015261194c565b505050915250565b60028151106118ca576020810160408201600183510160051b83015b81518351146119bc57602083019250815183525b6020820191508082036119a857505081900360051c9052565b60008060001960018651600087870197505b81830160011c94508460051b8901518701905087811482841117611a2157808811611a165783850191506119e7565b6001850192506119e7565b84151597148716989290930190950295509350505050565b6001600160a01b03811681146118ca57600080fd5b803561136e81611a39565b60008083601f840112611a6b57600080fd5b5081356001600160401b03811115611a8257600080fd5b6020830191508360208260051b8501011115611a9d57600080fd5b9250929050565b803560ff8116811461136e57600080fd5b60008060008060008060008060008060c08b8d031215611ad457600080fd5b611add8b611a4e565b995060208b01356001600160401b03811115611af857600080fd5b611b048d828e01611a59565b909a5098505060408b01356001600160401b03811115611b2357600080fd5b611b2f8d828e01611a59565b90985096505060608b01356001600160401b03811115611b4e57600080fd5b611b5a8d828e01611a59565b90965094505060808b01356001600160401b03811115611b7957600080fd5b611b858d828e01611a59565b9094509250611b98905060a08c01611aa4565b90509295989b9194979a5092959850565b60006101208284031215611bbc57600080fd5b50919050565b600080600060608486031215611bd757600080fd5b83356001600160401b03811115611bed57600080fd5b611bf986828701611ba9565b9660208601359650604090950135949350505050565b60008060008060608587031215611c2557600080fd5b843593506020850135611c3781611a39565b925060408501356001600160401b03811115611c5257600080fd5b8501601f81018713611c6357600080fd5b80356001600160401b03811115611c7957600080fd5b876020828401011115611c8b57600080fd5b949793965060200194505050565b60008060408385031215611cac57600080fd5b82356001600160401b03811115611cc257600080fd5b611cce85828601611ba9565b9250506020830135611cdf81611a39565b809150509250929050565b60005b83811015611d05578181015183820152602001611ced565b50506000910152565b60008151808452611d26816020860160208601611cea565b601f01601f19169290920160200192915050565b608081526000611d4d6080830187611d0e565b65ffffffffffff8616602084015265ffffffffffff851660408401528281036060840152611d7b8185611d0e565b979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715611dbe57611dbe611d86565b60405290565b60405161010081016001600160401b0381118282101715611dbe57611dbe611d86565b604051601f8201601f191681016001600160401b0381118282101715611e0f57611e0f611d86565b604052919050565b60006001600160401b03821115611e3057611e30611d86565b50601f01601f191660200190565b600082601f830112611e4f57600080fd5b8135611e62611e5d82611e17565b611de7565b818152846020838601011115611e7757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611eac57600080fd5b8535611eb781611a39565b94506020860135611ec781611a39565b935060408601356001600160401b03811115611ee257600080fd5b611eee88828901611e3e565b9350506060860135915060808601356001600160401b03811115611f1157600080fd5b611f1d88828901611e3e565b9150509295509295909350565b60006001600160401b03821115611f4357611f43611d86565b5060051b60200190565b600082601f830112611f5e57600080fd5b8135611f6c611e5d82611f2a565b8082825260208201915060208360051b860101925085831115611f8e57600080fd5b602085015b83811015611fb4578035611fa681611a39565b835260209283019201611f93565b5095945050505050565b600082601f830112611fcf57600080fd5b8135611fdd611e5d82611f2a565b8082825260208201915060208360051b860101925085831115611fff57600080fd5b602085015b83811015611fb45780356001600160401b0381111561202257600080fd5b86016040818903601f1901121561203857600080fd5b612040611d9c565b602082013561204e81611a39565b815260408201356001600160401b0381111561206957600080fd5b6120788a602083860101611e3e565b6020830152508085525050602083019250602081019050612004565b6000602082840312156120a657600080fd5b81356001600160401b038111156120bc57600080fd5b820161010081850312156120cf57600080fd5b6120d7611dc4565b6120e082611a4e565b815260208201356001600160401b038111156120fb57600080fd5b61210786828501611f4d565b6020830152506040828101359082015261212360608301611a4e565b606082015260808201356001600160401b0381111561214157600080fd5b61214d86828501611e3e565b60808301525061215f60a08301611a4e565b60a082015260c08201356001600160401b0381111561217d57600080fd5b61218986828501611fbe565b60c08301525060e08201356001600160401b038111156121a857600080fd5b6121b486828501611e3e565b60e083015250949350505050565b6020815260006121d56020830184611d0e565b9392505050565b6000602082840312156121ee57600080fd5b5035919050565b60008060008060008060008060008060008060e08d8f03121561221757600080fd5b6122208d611a4e565b9b506001600160401b0360208e0135111561223a57600080fd5b61224a8e60208f01358f01611a59565b909b5099506001600160401b0360408e0135111561226757600080fd5b6122778e60408f01358f01611a59565b90995097506001600160401b0360608e0135111561229457600080fd5b6122a48e60608f01358f01611a59565b90975095506001600160401b0360808e013511156122c157600080fd5b6122d18e60808f01358f01611a59565b90955093506001600160401b0360a08e013511156122ee57600080fd5b6122fe8e60a08f01358f01611a59565b909350915061230f60c08e01611aa4565b90509295989b509295989b509295989b565b60006020828403121561233357600080fd5b81356001600160401b0381111561234957600080fd5b820161010081850312156121d557600080fd5b600082825180855260208501945060208160051b8301016020850160005b838110156123cc57848303601f19018852815180516001600160a01b031684526020908101516040918501829052906123b590850182611d0e565b6020998a019990945092909201915060010161237a565b50909695505050505050565b6000808335601e198436030181126123ef57600080fd5b83016020810192503590506001600160401b0381111561240e57600080fd5b803603821315611a9d57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208501945060208460051b8201018360005b868110156123cc57838303601f19018852813536879003603e1901811261248557600080fd5b8601803561249281611a39565b6001600160a01b031684526124aa60208201826123d8565b9150604060208601526124c160408601838361241d565b60209a8b019a9095509390930192505060010161245f565b600081518084526020840193506020830160005b828110156125145781516001600160a01b03168652602095860195909101906001016124ed565b5093949350505050565b60018060a01b038151168252600060208201516060602085015261254560608501826124d9565b60409384015160ff16949093019390935250919050565b60a08152600061256f60a083018b61235c565b8281036020840152612582818a8c612446565b9050828103604084015261259781888a612446565b905082810360608401526125ac818688612446565b905082810360808401526125c0818561251e565b9b9a5050505050505050505050565b6000808335601e198436030181126125e657600080fd5b8301803591506001600160401b0382111561260057600080fd5b602001915036819003821315611a9d57600080fd5b6000808585111561262557600080fd5b8386111561263257600080fd5b5050820193919092039150565b80356001600160e01b03198116906004841015612670576001600160e01b0319600485900360031b81901b82161691505b5092915050565b6020815260006121d5602083018461235c565b6000835161269c818460208801611cea565b60609390931b6001600160601b0319169190920190815260140192915050565b600082516126ce818460208701611cea565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b612708826126fb83611a4e565b6001600160a01b03169052565b60208181013590830152600061272160408301836123d8565b61012060408601526127386101208601828461241d565b91505061274860608401846123d8565b858303606087015261275b83828461241d565b6080868101359088015260a0808701359088015260c08087013590880152925061278b91505060e08401846123d8565b85830360e087015261279e83828461241d565b925050506127b06101008401846123d8565b8583036101008701526127c483828461241d565b9695505050505050565b6040815260006127e160408301856126ee565b90508260208301529392505050565b60006020828403121561280257600080fd5b5051919050565b8183823760009101908152919050565b80356001600160d01b03198116906006841015612670576001600160d01b031960069490940360031b84901b1690921692915050565b60006020828403121561286157600080fd5b81356121d581611a39565b6000835161287e818460208801611cea565b9190910191825250602001919050565b6001600160a01b038816815260e0602082018190526000906128b2908301896124d9565b604083018890526001600160a01b038716606084015282810360808401526128da8187611d0e565b6001600160a01b03861660a085015283810360c085015290506128fd818561235c565b9a9950505050505050505050565b60a08152600061291f60a083018b8d612446565b8281036020840152612932818a8c612446565b9050828103604084015261294781888a612446565b9050828103606084015261295c818688612446565b90508281036080840152612970818561251e565b9c9b505050505050505050505050565b6000808335601e1984360301811261299757600080fd5b8301803591506001600160401b038211156129b157600080fd5b6020019150600581901b3603821315611a9d57600080fd5b61010080825281018a905260008b6101208301825b8d811015612a0e5782356129f181611a39565b6001600160a01b03168252602092830192909101906001016129de565b508b6020850152612a2a604085018c6001600160a01b03169052565b8381036060850152612a3d818a8c61241d565b92505050612a5660808301876001600160a01b03169052565b6001600160a01b03851660a08301528360c08301526125c060e08301846001600160a01b03169052565b8284823760609190911b6001600160601b0319169101908152601401919050565b604081526000612ab460408301856126ee565b905060018060a01b03831660208301529392505050565b600082601f830112612adc57600080fd5b8151612aea611e5d82611e17565b818152846020838601011115612aff57600080fd5b612b10826020830160208701611cea565b949350505050565b805165ffffffffffff8116811461136e57600080fd5b60008060008060808587031215612b4457600080fd5b84516001600160401b03811115612b5a57600080fd5b612b6687828801612acb565b945050612b7560208601612b18565b9250612b8360408601612b18565b915060608501516001600160401b03811115612b9e57600080fd5b612baa87828801612acb565b91505092959194509250565b634e487b7160e01b600052601160045260246000fd5b600060018201612bde57612bde612bb6565b5060010190565b808202811582820484141761158a5761158a612bb6565b8082018082111561158a5761158a612bb6565b828152604060208201526000612b106040830184611d0e565b600060208284031215612c3a57600080fd5b81516001600160e01b0319811681146121d557600080fd5b60ff828116828216039081111561158a5761158a612bb656fe982e06ee6a56dfc0f1ac189a5d23506361ca0a3ce45a9c7b8d33d65d43746a24a2646970667358221220b8570cdd622e1fbbf9414238ac24ec7629c0bf87595f396efe2bec7415eff9ce64736f6c634300081a0033"; + hex"60e060405234801561000f575f5ffd5b50604051612d0b380380612d0b83398101604081905261002e91610087565b6001600160a01b03821661005557604051632039d3c960e01b815260040160405180910390fd5b306080526001600160a01b0391821660a0521660c0526100bf565b6001600160a01b0381168114610084575f5ffd5b50565b5f5f60408385031215610098575f5ffd5b82516100a381610070565b60208401519092506100b481610070565b809150509250929050565b60805160a05160c051612beb6101205f395f8181610151015281816104720152610ede01525f81816101a10152818161059901528181610fb901526112e701525f818160f0015281816105440152818161095501526110210152612beb5ff3fe6080604052600436106100e7575f3560e01c8063663c87d811610087578063d78343d911610057578063d78343d914610335578063d9ed0e8f14610354578063f2dc691d14610373578063f698da2514610392575f5ffd5b8063663c87d81461027d578063928107f91461029c5780639cfd7cff146102bb578063d03c791414610306575f5ffd5b806319822f7c116100c257806319822f7c146101e25780633c9de1b81461020f5780634fff40e11461022f57806355d559f41461024e575f5ffd5b806306433b1b14610140578063137e051e1461019057806315cca638146101c3575f5ffd5b3661013c575f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161461013a576040516308e3edd160e41b815260040160405180910390fd5b005b5f5ffd5b34801561014b575f5ffd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561019b575f5ffd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b3480156101ce575f5ffd5b5061013a6101dd36600461198b565b6103a6565b3480156101ed575f5ffd5b506102016101fc366004611a75565b61053f565b604051908152602001610187565b34801561021a575f5ffd5b505f516020612b965f395f51905f5254610201565b34801561023a575f5ffd5b5061013a610249366004611ac3565b610951565b348015610259575f5ffd5b5061026d610268366004611c70565b610a79565b6040516101879493929190611dd4565b348015610288575f5ffd5b50610173610297366004611e1f565b610c3a565b3480156102a7575f5ffd5b506102016102b636600461200f565b610d13565b3480156102c6575f5ffd5b50604080518082018252601a81527f7268696e6573746f6e652e73616665373537392e76312e302e30000000000000602082015290516101879190612135565b348015610311575f5ffd5b50610325610320366004612147565b610d64565b6040519015158152602001610187565b348015610340575f5ffd5b5061013a61034f36600461215e565b610e12565b34801561035f575f5ffd5b5061013a61036e36600461227e565b610fae565b34801561037e575f5ffd5b5061032561038d366004612147565b611226565b34801561039d575f5ffd5b50610201611273565b3330146103c657604051630a57d61d60e01b815260040160405180910390fd5b60405163610b592560e01b81526001600160a01b038b166004820152309063610b5925906024015f604051808303815f87803b158015610404575f5ffd5b505af1158015610416573d5f5f3e3d5ffd5b5050604080515f8082526020820190925230935063540fb4f992509061045e565b604080518082019091525f8152606060208201528152602001906001900390816104375790505b508b8b8b8b8b8b60405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018d8d808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525050509082525060ff8c166020909101526040516001600160e01b031960e08b901b1681526105069897969594939291906004016124a8565b5f604051808303815f87803b15801561051d575f5ffd5b505af115801561052f573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f80547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161461058e576040516308e3edd160e41b815260040160405180910390fd5b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105d757604051632039d3c960e01b815260040160405180910390fd5b6105e4606085018561251a565b6105f2916004915f9161255c565b6105fb91612583565b6001600160e01b03191663d9ed0e8f60e01b1461062b5760405163c3d40f7760e01b815260040160405180910390fd5b5f610639606086018661251a565b61064791600490829061255c565b810190610654919061200f565b905061066b5f516020612b965f395f51905f525490565b61067482610d13565b146106925760405163278328b160e21b815260040160405180910390fd5b5f5f866020013590508060601c91505f8360a001516001600160a01b03168460c001516040516024016106c591906125bb565b60408051601f19818403018152918152602080830180516001600160e01b0316633cd56b0760e11b17905290516106ff92913391016125e4565b60408051601f19818403018152908290526107199161260b565b5f604051808303815f865af19150503d805f8114610752576040519150601f19603f3d011682016040523d82523d5f602084013e610757565b606091505b50509050806107795760405163c3d40f7760e01b815260040160405180910390fd5b60c0840151515f90815b81811015610893575f8760c0015182815181106107a2576107a2612616565b60200260200101515f01519050806001600160a01b0316636d61fe708960c0015184815181106107d4576107d4612616565b6020026020010151602001516040518263ffffffff1660e01b81526004016107fc9190612135565b5f604051808303815f87803b158015610813575f5ffd5b505af1158015610825573d5f5f3e3d5ffd5b505060408051600181526001600160a01b03851660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123935001905060405180910390a1866001600160a01b0316816001600160a01b03160361088a57600193505b50600101610783565b50811561090f57604051639700320360e01b81526001600160a01b038616906397003203906108c8908d908d90600401612709565b6020604051808303815f875af11580156108e4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610908919061272a565b9650610934565b5f5f5f61091c898e6112cb565b92509250925061092e83158383611437565b99505050505b8715610944575f5f5f5f8b335af1505b5050505050509392505050565b5f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161461099f576040516308e3edd160e41b815260040160405180910390fd5b5f6109b55f516020612b965f395f51905f525490565b146109d35760405163d4d496e560e01b815260040160405180910390fd5b6109e8845f516020612b965f395f51905f5255565b6001600160a01b03831615610a73575f836001600160a01b03168383604051610a12929190612741565b5f60405180830381855af49150503d805f8114610a4a576040519150601f19603f3d011682016040523d82523d5f602084013e610a4f565b606091505b5050905080610a7157604051631f57fed560e31b815260040160405180910390fd5b505b50505050565b6101008201516060905f9081908390610a948184600661146f565b610a9d90612750565b60d01c9350610aaf816006600c61146f565b610ab890612750565b60d01c9250610ac881600c6114d4565b9150505f604051806101c001604052807fc03dfc11d8b10bf9cf703d558958c8c42777f785d998c62060d85a4f0ef6ea7f5f1b8152602001885f01516001600160a01b031681526020018860200151815260200188604001518051906020012081526020018860600151805190602001208152602001610b47896114e2565b6001600160801b03168152602001610b5e896114f7565b6001600160801b031681526020018860a001518152602001610b7f8961150c565b6001600160801b03168152602001610b968961151b565b6001600160801b0316815260e089015180516020918201209082015265ffffffffffff8087166040830152851660608201526001600160a01b0388166080909101526101c08120909150601960f81b600160f81b610bf2611273565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529550505092959194509250565b5f818051906020012083604051602001610c5e929190918252602082015260400190565b60405160208183030381529060405280519060200120925060ff60f81b858486896001600160a01b0316604051602001610c9992919061278a565b60405160208183030381529060405280519060200120604051602001610cf194939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b80516020808301516040808501516060860151608087015160a088015160c089015194515f98610d479890979691016127a2565b604051602081830303815290604052805190602001209050919050565b5f81600881901b6001600160f81b03198216600160f81b03610d895760019250610dc4565b6001600160f81b03198216610da15760019250610dc4565b6001600160f81b031980831603610dbb5760019250610dc4565b505f9392505050565b828015610dd957506001600160f81b03198116155b15610de5575050919050565b828015610dff57506001600160f81b03198116600160f81b145b15610dbb575050919050565b5050919050565b60405163610b592560e01b81526001600160a01b038d166004820152309063610b5925906024015f604051808303815f87803b158015610e50575f5ffd5b505af1158015610e62573d5f5f3e3d5ffd5b505060405163f08a032360e01b81526001600160a01b038f16600482015230925063f08a032391506024015f604051808303815f87803b158015610ea4575f5ffd5b505af1158015610eb6573d5f5f3e3d5ffd5b50505050306001600160a01b031663540fb4f98c8c8c8c8c8c8c8c60405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525050509082525060ff8d166020909101526040516001600160e01b031960e08c901b168152610f739998979695949392919060040161281e565b5f604051808303815f87803b158015610f8a575f5ffd5b505af1158015610f9c573d5f5f3e3d5ffd5b50505050505050505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ff757604051632039d3c960e01b815260040160405180910390fd5b6110046020820182612892565b5f80546001600160a01b0319166001600160a01b039283161790557f0000000000000000000000000000000000000000000000000000000000000000166110516080830160608401612892565b6001600160a01b03161461107857604051633007073760e01b815260040160405180910390fd5b6302b994c760e31b61108d608083018361251a565b61109b916004915f9161255c565b6110a491612583565b6001600160e01b031916146110cc57604051633007073760e01b815260040160405180910390fd5b3063b63e800d6110df60208401846128ad565b60408501356110f46080870160608801612892565b611101608088018861251a565b61111160c08a0160a08b01612892565b5f5f5f6040518b63ffffffff1660e01b81526004016111399a999897969594939291906128f2565b5f604051808303815f87803b158015611150575f5ffd5b505af1158015611162573d5f5f3e3d5ffd5b50505f5f516020612b965f395f51905f52555061117c9050565b5f8061118e60c0840160a08501612892565b6001600160a01b03166111a460e085018561251a565b306040516020016111b7939291906129a8565b60408051601f19818403018152908290526111d19161260b565b5f604051808303815f865af19150503d805f811461120a576040519150601f19603f3d011682016040523d82523d5f602084013e61120f565b606091505b50915091508161122157805160208201fd5b505050565b5f6001820361123757506001919050565b6002820361124757506001919050565b6003820361125757506001919050565b6004820361126757506001919050565b505f919050565b919050565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218602082015246918101919091523060608201525f9060800160405160208183030381529060405280519060200120905090565b5f5f5f6060808660a001516001600160a01b03166355d559f4877f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016113239291906129c9565b5f60405180830381865afa15801561133d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113649190810190612a54565b8351602085012060408c0151929850929650929450919250905f9061138c9083908590611530565b9050611397816116de565b60208901516113a5816116de565b6113ae816116ea565b80515f805b82811015611424575f6113e88583815181106113d1576113d1612616565b6020026020010151876116f390919063ffffffff16565b509050801561141b57826113fb81612aeb565b9350508d60400151831061141b5760019b50505050505050505050611430565b506001016113b3565b505f9950505050505050505b9250925092565b5f60d08265ffffffffffff16901b60a08465ffffffffffff16901b8561145d575f611460565b60015b60ff16171790505b9392505050565b6060835182811161147e578092505b838111611489578093505b50818310156114685750604051828203848401601f19601f830181165b82810151858201528101806114a6575050508060208301015f81526020810160405250808252509392505050565b606061146883835f1961146f565b5f6114f1826080015160801c90565b92915050565b5f6114f182608001516001600160801b031690565b5f6114f18260c0015160801c90565b5f6114f18260c001516001600160801b031690565b81516060905f611541604183612b03565b9050806001600160401b0381111561155b5761155b611b46565b604051908082528060200260200182016040528015611584578160200160208202803683370190505b509250838110156115a857604051638baa579f60e01b815260040160405180910390fd5b5f5f5b828110156116b2575f5f5f5f6115d88b8660410201602081015160408201516060909201515f1a92909190565b9250925092508260ff165f036115fc576115f58c8c84848c611714565b935061165a565b601e8360ff16111561164b576115f56116398d6020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b611644600486612b22565b84846117dc565b6116578c8484846117dc565b93505b6001600160a01b03841615611677578561167381612aeb565b9650505b8389868151811061168a5761168a612616565b6001600160a01b03909216602092830291909101909101525050600190920191506115ab9050565b50848110156116d457604051638baa579f60e01b815260040160405180910390fd5b5050509392505050565b6116e781611816565b50565b6116e78161186b565b5f8061170984846001600160a01b03165f6118b4565b909590945092505050565b838201602001518390826117288583612b3b565b611733906020612b3b565b1115611742575f9150506117d3565b604051630b135d3f60e11b808252878601602001916001600160a01b03851690631626ba7e90611778908c908690600401612b4e565b602060405180830381865afa158015611793573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b79190612b6e565b6001600160e01b031916146117d0575f925050506117d3565b50505b95945050505050565b5f604051855f5260ff851660205283604052826060526020604060805f60015afa505f6060523d6060185191508060405250949350505050565b80515f82528060051b8201601f19602084015b602001828111611864578051828201805182811161184957505050611829565b5b60208201528301805182811161184a575060200152611829565b5050509052565b60028151106116e7576020810160408201600183510160051b83015b815183511461189b57602083019250815183525b60208201915080820361188757505081900360051c9052565b5f5f5f19600186515f87870197505b81830160011c94508460051b89015187019050878114828411176118fd578088116118f25783850191506118c3565b6001850192506118c3565b84151597148716989290930190950295509350505050565b6001600160a01b03811681146116e7575f5ffd5b803561126e81611915565b5f5f83601f840112611944575f5ffd5b5081356001600160401b0381111561195a575f5ffd5b6020830191508360208260051b8501011115611974575f5ffd5b9250929050565b803560ff8116811461126e575f5ffd5b5f5f5f5f5f5f5f5f5f5f60c08b8d0312156119a4575f5ffd5b6119ad8b611929565b995060208b01356001600160401b038111156119c7575f5ffd5b6119d38d828e01611934565b909a5098505060408b01356001600160401b038111156119f1575f5ffd5b6119fd8d828e01611934565b90985096505060608b01356001600160401b03811115611a1b575f5ffd5b611a278d828e01611934565b90965094505060808b01356001600160401b03811115611a45575f5ffd5b611a518d828e01611934565b9094509250611a64905060a08c0161197b565b90509295989b9194979a5092959850565b5f5f5f60608486031215611a87575f5ffd5b83356001600160401b03811115611a9c575f5ffd5b84016101208187031215611aae575f5ffd5b95602085013595506040909401359392505050565b5f5f5f5f60608587031215611ad6575f5ffd5b843593506020850135611ae881611915565b925060408501356001600160401b03811115611b02575f5ffd5b8501601f81018713611b12575f5ffd5b80356001600160401b03811115611b27575f5ffd5b876020828401011115611b38575f5ffd5b949793965060200194505050565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b0381118282101715611b7d57611b7d611b46565b60405290565b604080519081016001600160401b0381118282101715611b7d57611b7d611b46565b60405161010081016001600160401b0381118282101715611b7d57611b7d611b46565b604051601f8201601f191681016001600160401b0381118282101715611bf057611bf0611b46565b604052919050565b5f6001600160401b03821115611c1057611c10611b46565b50601f01601f191660200190565b5f82601f830112611c2d575f5ffd5b8135611c40611c3b82611bf8565b611bc8565b818152846020838601011115611c54575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215611c81575f5ffd5b82356001600160401b03811115611c96575f5ffd5b83016101208186031215611ca8575f5ffd5b611cb0611b5a565b611cb982611929565b81526020828101359082015260408201356001600160401b03811115611cdd575f5ffd5b611ce987828501611c1e565b60408301525060608201356001600160401b03811115611d07575f5ffd5b611d1387828501611c1e565b6060830152506080828101359082015260a0808301359082015260c0808301359082015260e08201356001600160401b03811115611d4f575f5ffd5b611d5b87828501611c1e565b60e0830152506101008201356001600160401b03811115611d7a575f5ffd5b611d8687828501611c1e565b610100830152509250611d9d905060208401611929565b90509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f611de66080830187611da6565b65ffffffffffff8616602084015265ffffffffffff851660408401528281036060840152611e148185611da6565b979650505050505050565b5f5f5f5f5f60a08688031215611e33575f5ffd5b8535611e3e81611915565b94506020860135611e4e81611915565b935060408601356001600160401b03811115611e68575f5ffd5b611e7488828901611c1e565b9350506060860135915060808601356001600160401b03811115611e96575f5ffd5b611ea288828901611c1e565b9150509295509295909350565b5f6001600160401b03821115611ec757611ec7611b46565b5060051b60200190565b5f82601f830112611ee0575f5ffd5b8135611eee611c3b82611eaf565b8082825260208201915060208360051b860101925085831115611f0f575f5ffd5b602085015b83811015611f35578035611f2781611915565b835260209283019201611f14565b5095945050505050565b5f82601f830112611f4e575f5ffd5b8135611f5c611c3b82611eaf565b8082825260208201915060208360051b860101925085831115611f7d575f5ffd5b602085015b83811015611f355780356001600160401b03811115611f9f575f5ffd5b86016040818903601f19011215611fb4575f5ffd5b611fbc611b83565b6020820135611fca81611915565b815260408201356001600160401b03811115611fe4575f5ffd5b611ff38a602083860101611c1e565b6020830152508085525050602083019250602081019050611f82565b5f6020828403121561201f575f5ffd5b81356001600160401b03811115612034575f5ffd5b82016101008185031215612046575f5ffd5b61204e611ba5565b61205782611929565b815260208201356001600160401b03811115612071575f5ffd5b61207d86828501611ed1565b6020830152506040828101359082015261209960608301611929565b606082015260808201356001600160401b038111156120b6575f5ffd5b6120c286828501611c1e565b6080830152506120d460a08301611929565b60a082015260c08201356001600160401b038111156120f1575f5ffd5b6120fd86828501611f3f565b60c08301525060e08201356001600160401b0381111561211b575f5ffd5b61212786828501611c1e565b60e083015250949350505050565b602081525f6114686020830184611da6565b5f60208284031215612157575f5ffd5b5035919050565b5f5f5f5f5f5f5f5f5f5f5f5f60e08d8f031215612179575f5ffd5b6121828d611929565b9b506001600160401b0360208e0135111561219b575f5ffd5b6121ab8e60208f01358f01611934565b909b5099506001600160401b0360408e013511156121c7575f5ffd5b6121d78e60408f01358f01611934565b90995097506001600160401b0360608e013511156121f3575f5ffd5b6122038e60608f01358f01611934565b90975095506001600160401b0360808e0135111561221f575f5ffd5b61222f8e60808f01358f01611934565b90955093506001600160401b0360a08e0135111561224b575f5ffd5b61225b8e60a08f01358f01611934565b909350915061226c60c08e0161197b565b90509295989b509295989b509295989b565b5f6020828403121561228e575f5ffd5b81356001600160401b038111156122a3575f5ffd5b82016101008185031215611468575f5ffd5b5f82825180855260208501945060208160051b830101602085015f5b8381101561232357848303601f19018852815180516001600160a01b0316845260209081015160409185018290529061230c90850182611da6565b6020998a01999094509290920191506001016122d1565b50909695505050505050565b5f5f8335601e19843603018112612344575f5ffd5b83016020810192503590506001600160401b03811115612362575f5ffd5b803603821315611974575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208501945060208460051b820101835f5b8681101561232357838303601f19018852813536879003603e190181126123d4575f5ffd5b860180356123e181611915565b6001600160a01b031684526123f9602082018261232f565b915060406020860152612410604086018383612370565b60209a8b019a909550939093019250506001016123af565b5f8151808452602084019350602083015f5b828110156124615781516001600160a01b031686526020958601959091019060010161243a565b5093949350505050565b60018060a01b0381511682525f6020820151606060208501526124916060850182612428565b60409384015160ff16949093019390935250919050565b60a081525f6124ba60a083018b6122b5565b82810360208401526124cd818a8c612398565b905082810360408401526124e281888a612398565b905082810360608401526124f7818688612398565b9050828103608084015261250b818561246b565b9b9a5050505050505050505050565b5f5f8335601e1984360301811261252f575f5ffd5b8301803591506001600160401b03821115612548575f5ffd5b602001915036819003821315611974575f5ffd5b5f5f8585111561256a575f5ffd5b83861115612576575f5ffd5b5050820193919092039150565b80356001600160e01b031981169060048410156125b4576001600160e01b0319600485900360031b81901b82161691505b5092915050565b602081525f61146860208301846122b5565b5f81518060208401855e5f93019283525090919050565b5f6125ef82856125cd565b60609390931b6001600160601b03191683525050601401919050565b5f61146882846125cd565b634e487b7160e01b5f52603260045260245ffd5b6126448261263783611929565b6001600160a01b03169052565b602081810135908301525f61265c604083018361232f565b610120604086015261267361012086018284612370565b915050612683606084018461232f565b8583036060870152612696838284612370565b6080868101359088015260a0808701359088015260c0808701359088015292506126c691505060e084018461232f565b85830360e08701526126d9838284612370565b925050506126eb61010084018461232f565b8583036101008701526126ff838284612370565b9695505050505050565b604081525f61271b604083018561262a565b90508260208301529392505050565b5f6020828403121561273a575f5ffd5b5051919050565b818382375f9101908152919050565b805160208201516001600160d01b0319811691906006821015610e0b576001600160d01b031960069290920360031b82901b161692915050565b5f61279582856125cd565b9283525050602001919050565b6001600160a01b038816815260e0602082018190525f906127c590830189612428565b604083018890526001600160a01b038716606084015282810360808401526127ed8187611da6565b6001600160a01b03861660a085015283810360c0850152905061281081856122b5565b9a9950505050505050505050565b60a081525f61283160a083018b8d612398565b8281036020840152612844818a8c612398565b9050828103604084015261285981888a612398565b9050828103606084015261286e818688612398565b90508281036080840152612882818561246b565b9c9b505050505050505050505050565b5f602082840312156128a2575f5ffd5b813561146881611915565b5f5f8335601e198436030181126128c2575f5ffd5b8301803591506001600160401b038211156128db575f5ffd5b6020019150600581901b3603821315611974575f5ffd5b61010080825281018a90525f8b6101208301825b8d81101561293657823561291981611915565b6001600160a01b0316825260209283019290910190600101612906565b508b6020850152612952604085018c6001600160a01b03169052565b8381036060850152612965818a8c612370565b9250505061297e60808301876001600160a01b03169052565b6001600160a01b03851660a08301528360c083015261250b60e08301846001600160a01b03169052565b8284823760609190911b6001600160601b0319169101908152601401919050565b604081525f6129db604083018561262a565b905060018060a01b03831660208301529392505050565b5f82601f830112612a01575f5ffd5b8151612a0f611c3b82611bf8565b818152846020838601011115612a23575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805165ffffffffffff8116811461126e575f5ffd5b5f5f5f5f60808587031215612a67575f5ffd5b84516001600160401b03811115612a7c575f5ffd5b612a88878288016129f2565b945050612a9760208601612a3f565b9250612aa560408601612a3f565b915060608501516001600160401b03811115612abf575f5ffd5b612acb878288016129f2565b91505092959194509250565b634e487b7160e01b5f52601160045260245ffd5b5f60018201612afc57612afc612ad7565b5060010190565b5f82612b1d57634e487b7160e01b5f52601260045260245ffd5b500490565b60ff82811682821603908111156114f1576114f1612ad7565b808201808211156114f1576114f1612ad7565b828152604060208201525f612b666040830184611da6565b949350505050565b5f60208284031215612b7e575f5ffd5b81516001600160e01b031981168114611468575f5ffdfe982e06ee6a56dfc0f1ac189a5d23506361ca0a3ce45a9c7b8d33d65d43746a24a2646970667358221220cbd281b9702b507f3035a563b8dd778e1de241408898a1097f986f9f583f684964736f6c634300081c0033"; bytes public constant SAFE_PROXY_BYTECODE = - hex"6080604052348015600e575f80fd5b50604051610163380380610163833981016040819052602b9160b2565b6001600160a01b038116608f5760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b5f80546001600160a01b0319166001600160a01b039290921691909117905560dd565b5f6020828403121560c1575f80fd5b81516001600160a01b038116811460d6575f80fd5b9392505050565b607a806100e95f395ff3fe60806040525f80546001600160a01b03169035632cf35bc960e11b01602657805f5260205ff35b365f80375f80365f845af490503d5f803e80603f573d5ffd5b503d5ff3fea2646970667358221220072b6bb43f6b7adb3b22a0bfcaf5874c3195bd6688d65d6da798d9bf701f6dce64736f6c63430008190033"; + hex"6080604052348015600e575f5ffd5b50604051610163380380610163833981016040819052602b9160b2565b6001600160a01b038116608f5760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b5f80546001600160a01b0319166001600160a01b039290921691909117905560dd565b5f6020828403121560c1575f5ffd5b81516001600160a01b038116811460d6575f5ffd5b9392505050565b607a806100e95f395ff3fe60806040525f80546001600160a01b03169035632cf35bc960e11b01602657805f5260205ff35b365f5f375f5f365f845af490503d5f5f3e80603f573d5ffd5b503d5ff3fea2646970667358221220640def201af13e0821a9dcaf5c656634c958a7cf37a69d829387126c436276e364736f6c634300081c0033"; bytes public constant SAFE_SINGLETON_BYTECODE = hex"6080604052348015600e575f80fd5b506001600455612fad806100215f395ff3fe6080604052600436106101d0575f3560e01c8063affed0e0116100f6578063e19a9dd911610094578063f08a032311610063578063f08a0323146105d2578063f698da25146105f1578063f8dc5dd914610605578063ffa1ad74146106245761020c565b8063e19a9dd914610561578063e318b52b14610580578063e75235b81461059f578063e86637db146105b35761020c565b8063cc2f8452116100d0578063cc2f8452146104d7578063d4d9bdcd14610504578063d8d11f7814610523578063e009cfde146105425761020c565b8063affed0e014610484578063b4faba0914610499578063b63e800d146104b85761020c565b80635624b25b1161016e5780636a7612021161013d5780636a761202146103fb5780637d8329741461040e578063934f3a1114610444578063a0e67e2b146104635761020c565b80635624b25b146103665780635ae6bd3714610392578063610b5925146103bd578063694e80c3146103dc5761020c565b80632f54bf6e116101aa5780632f54bf6e146102df5780633408e470146102fe578063468721a71461031a5780635229073f146103395761020c565b80630d582f131461026b57806312fb68e01461028c5780632d9ad53d146102ab5761020c565b3661020c5760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b348015610217575f80fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024257005b365f80373360601b36525f80601436015f80855af190503d5f803e80610266573d5ffd5b503d5ff35b348015610276575f80fd5b5061028a610285366004612507565b610654565b005b348015610297575f80fd5b5061028a6102a63660046125ce565b6107a9565b3480156102b6575f80fd5b506102ca6102c536600461263e565b610c3a565b60405190151581526020015b60405180910390f35b3480156102ea575f80fd5b506102ca6102f936600461263e565b610c73565b348015610309575f80fd5b50465b6040519081526020016102d6565b348015610325575f80fd5b506102ca610334366004612667565b610ca9565b348015610344575f80fd5b50610358610353366004612667565b610d7d565b6040516102d69291906126fb565b348015610371575f80fd5b50610385610380366004612715565b610db1565b6040516102d69190612735565b34801561039d575f80fd5b5061030c6103ac366004612747565b60076020525f908152604090205481565b3480156103c8575f80fd5b5061028a6103d736600461263e565b610e2b565b3480156103e7575f80fd5b5061028a6103f6366004612747565b610f62565b6102ca6104093660046127a3565b611000565b348015610419575f80fd5b5061030c610428366004612507565b600860209081525f928352604080842090915290825290205481565b34801561044f575f80fd5b5061028a61045e366004612873565b611339565b34801561046e575f80fd5b50610477611383565b6040516102d6919061291e565b34801561048f575f80fd5b5061030c60055481565b3480156104a4575f80fd5b5061028a6104b3366004612930565b611471565b3480156104c3575f80fd5b5061028a6104d236600461297d565b611490565b3480156104e2575f80fd5b506104f66104f1366004612507565b61158f565b6040516102d6929190612a67565b34801561050f575f80fd5b5061028a61051e366004612747565b611747565b34801561052e575f80fd5b5061030c61053d366004612a90565b6117da565b34801561054d575f80fd5b5061028a61055c366004612b49565b611806565b34801561056c575f80fd5b5061028a61057b36600461263e565b611926565b34801561058b575f80fd5b5061028a61059a366004612b80565b611a39565b3480156105aa575f80fd5b5060045461030c565b3480156105be575f80fd5b506103856105cd366004612a90565b611c10565b3480156105dd575f80fd5b5061028a6105ec36600461263e565b611ce7565b3480156105fc575f80fd5b5061030c611d2e565b348015610610575f80fd5b5061028a61061f366004612bc8565b611d84565b34801561062f575f80fd5b5061038560405180604001604052806005815260200164312e342e3160d81b81525081565b61065c611eec565b6001600160a01b0382161580159061067e57506001600160a01b038216600114155b801561069357506001600160a01b0382163014155b6106b85760405162461bcd60e51b81526004016106af90612c06565b60405180910390fd5b6001600160a01b038281165f9081526002602052604090205416156106ef5760405162461bcd60e51b81526004016106af90612c25565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e080546001600160a01b038481165f818152604081208054939094166001600160a01b03199384161790935560018352835490911617909155600380549161075b83612c58565b90915550506040516001600160a01b038316907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26905f90a280600454146107a5576107a581610f62565b5050565b6107b4816041611f25565b825110156107ec5760405162461bcd60e51b8152602060048201526005602482015264047533032360dc1b60448201526064016106af565b5f80805f805f5b86811015610c2e576041818102890160208101516040820151919092015160ff16955090935091505f8490036109fe57885160208a01208a146108605760405162461bcd60e51b8152602060048201526005602482015264475330323760d81b60448201526064016106af565b9193508391610870876041611f25565b8210156108a75760405162461bcd60e51b8152602060048201526005602482015264475330323160d81b60448201526064016106af565b87516108b4836020611f5c565b11156108ea5760405162461bcd60e51b815260206004820152600560248201526423a998191960d91b60448201526064016106af565b60208289018101518951909161090d908390610907908790611f5c565b90611f5c565b11156109435760405162461bcd60e51b8152602060048201526005602482015264475330323360d81b60448201526064016106af565b6040516320c13b0b60e01b8082528a8501602001916001600160a01b038916906320c13b0b90610979908f908690600401612c70565b602060405180830381865afa158015610994573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b89190612c94565b6001600160e01b031916146109f75760405162461bcd60e51b815260206004820152600560248201526411d4cc0c8d60da1b60448201526064016106af565b5050610b9e565b8360ff16600103610a7f579193508391336001600160a01b0384161480610a4657506001600160a01b0385165f9081526008602090815260408083208d845290915290205415155b610a7a5760405162461bcd60e51b8152602060048201526005602482015264475330323560d81b60448201526064016106af565b610b9e565b601e8460ff161115610b41576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610ae49190612cbb565b604080515f8152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610b30573d5f803e3d5ffd5b505050602060405103519450610b9e565b604080515f8152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610b91573d5f803e3d5ffd5b5050506020604051035194505b856001600160a01b0316856001600160a01b0316118015610bd757506001600160a01b038581165f908152600260205260409020541615155b8015610bed57506001600160a01b038516600114155b610c215760405162461bcd60e51b815260206004820152600560248201526423a998191b60d91b60448201526064016106af565b93945084936001016107f3565b50505050505050505050565b5f60016001600160a01b03831614801590610c6d57506001600160a01b038281165f908152600160205260409020541615155b92915050565b5f6001600160a01b038216600114801590610c6d5750506001600160a01b039081165f9081526002602052604090205416151590565b5f33600114801590610cd15750335f908152600160205260409020546001600160a01b031615155b610d055760405162461bcd60e51b815260206004820152600560248201526411d4cc4c0d60da1b60448201526064016106af565b610d13858585855f19611f76565b90508015610d4a5760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8905f90a2610d75565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375905f90a25b949350505050565b5f6060610d8c86868686610ca9565b915060405160203d0181016040523d81523d5f602083013e8091505094509492505050565b60605f610dbf836020612cd4565b67ffffffffffffffff811115610dd757610dd7612531565b6040519080825280601f01601f191660200182016040528015610e01576020820181803683370190505b5090505f5b83811015610e235784810154602080830284010152600101610e06565b509392505050565b610e33611eec565b6001600160a01b03811615801590610e5557506001600160a01b038116600114155b610e895760405162461bcd60e51b8152602060048201526005602482015264475331303160d81b60448201526064016106af565b6001600160a01b038181165f908152600160205260409020541615610ed85760405162461bcd60e51b815260206004820152600560248201526423a998981960d91b60448201526064016106af565b600160208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80546001600160a01b038481165f81815260408082208054949095166001600160a01b031994851617909455948552835490911681179092555190917fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091a250565b610f6a611eec565b600354811115610f8c5760405162461bcd60e51b81526004016106af90612ceb565b6001811015610fc55760405162461bcd60e51b815260206004820152600560248201526423a999181960d91b60448201526064016106af565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939060200160405180910390a150565b5f805f6110188e8e8e8e8e8e8e8e8e8e600554611c10565b600580549192505f61102983612c58565b9091555050805160208201209150611042828286611339565b505f61106c7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b90506001600160a01b038116156110ed57806001600160a01b03166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016110bf9c9b9a99989796959493929190612d3e565b5f604051808303815f87803b1580156110d6575f80fd5b505af11580156110e8573d5f803e3d5ffd5b505050505b6111196110fc8a6109c4612e01565b603f6111098c6040612cd4565b6111139190612e14565b90611fba565b611125906101f4612e01565b5a101561115c5760405162461bcd60e51b8152602060048201526005602482015264047533031360dc1b60448201526064016106af565b5f5a90506111ca8f8f8f8f8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508e8c5f146111b7578e611f76565b6109c45a6111c59190612e33565b611f76565b93506111d75a8290611fd0565b905083806111e457508915155b806111ee57508715155b6112225760405162461bcd60e51b8152602060048201526005602482015264475330313360d81b60448201526064016106af565b5f881561123957611236828b8b8b8b611fe8565b90505b841561127e57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8260405161127191815260200190565b60405180910390a26112b9565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040516112b091815260200190565b60405180910390a25b50506001600160a01b0381161561132857604051631264e26d60e31b81526004810183905283151560248201526001600160a01b038216906393271368906044015f604051808303815f87803b158015611311575f80fd5b505af1158015611323573d5f803e3d5ffd5b505050505b50509b9a5050505050505050505050565b600454806113715760405162461bcd60e51b8152602060048201526005602482015264475330303160d81b60448201526064016106af565b61137d848484846107a9565b50505050565b60605f60035467ffffffffffffffff8111156113a1576113a1612531565b6040519080825280602002602001820160405280156113ca578160200160208202803683370190505b5060015f90815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054919250906001600160a01b03165b6001600160a01b038116600114611469578083838151811061142a5761142a612e46565b6001600160a01b039283166020918202929092018101919091529181165f9081526002909252604090912054168161146181612c58565b925050611406565b509092915050565b5f80825160208401855af4805f52503d6020523d5f60403e60403d015ffd5b6114cd8a8a808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508c92506120ec915050565b6001600160a01b038416156114e5576114e5846122c2565b6115248787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061232692505050565b811561153a57611538825f60018685611fe8565b505b336001600160a01b03167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405161157b959493929190612e5a565b60405180910390a250505050505050505050565b60605f6001600160a01b038416600114806115ae57506115ae84610c3a565b6115e25760405162461bcd60e51b8152602060048201526005602482015264475331303560d81b60448201526064016106af565b5f83116116195760405162461bcd60e51b815260206004820152600560248201526423a998981b60d91b60448201526064016106af565b8267ffffffffffffffff81111561163257611632612531565b60405190808252806020026020018201604052801561165b578160200160208202803683370190505b506001600160a01b038086165f90815260016020526040812054929450911691505b6001600160a01b0382161580159061169f57506001600160a01b038216600114155b80156116aa57508381105b1561170457818382815181106116c2576116c2612e46565b6001600160a01b039283166020918202929092018101919091529281165f908152600190935260409092205490911690806116fc81612c58565b91505061167d565b6001600160a01b03821660011461173c5782611721600183612e33565b8151811061173157611731612e46565b602002602001015191505b808352509250929050565b335f908152600260205260409020546001600160a01b03166117935760405162461bcd60e51b8152602060048201526005602482015264047533033360dc1b60448201526064016106af565b335f818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b5f6117ee8c8c8c8c8c8c8c8c8c8c8c611c10565b8051906020012090509b9a5050505050505050505050565b61180e611eec565b6001600160a01b0381161580159061183057506001600160a01b038116600114155b6118645760405162461bcd60e51b8152602060048201526005602482015264475331303160d81b60448201526064016106af565b6001600160a01b038281165f908152600160205260409020548116908216146118b75760405162461bcd60e51b8152602060048201526005602482015264475331303360d81b60448201526064016106af565b6001600160a01b038181165f81815260016020526040808220805487861684528284208054919096166001600160a01b0319918216179095558383528054909416909355915190917faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691a25050565b61192e611eec565b6001600160a01b038116156119de576040516301ffc9a760e01b815263736bd41d60e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015611986573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119aa9190612ec5565b6119de5760405162461bcd60e51b8152602060048201526005602482015264047533330360dc1b60448201526064016106af565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c88181556040516001600160a01b038316907f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa2905f90a25050565b611a41611eec565b6001600160a01b03811615801590611a6357506001600160a01b038116600114155b8015611a7857506001600160a01b0381163014155b611a945760405162461bcd60e51b81526004016106af90612c06565b6001600160a01b038181165f908152600260205260409020541615611acb5760405162461bcd60e51b81526004016106af90612c25565b6001600160a01b03821615801590611aed57506001600160a01b038216600114155b611b095760405162461bcd60e51b81526004016106af90612c06565b6001600160a01b038381165f90815260026020526040902054811690831614611b5c5760405162461bcd60e51b8152602060048201526005602482015264475332303560d81b60448201526064016106af565b6001600160a01b038281165f81815260026020526040808220805486861680855283852080549288166001600160a01b03199384161790559589168452828420805482169096179095558383528054909416909355915190917ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf91a26040516001600160a01b038216907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26905f90a2505050565b60605f7fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d85f1b8d8d8d8d604051611c48929190612ee4565b604051908190038120611c6e949392918e908e908e908e908e908e908e90602001612ef3565b60408051601f1981840301815291905280516020909101209050601960f81b600160f81b611c9a611d2e565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b611cef611eec565b611cf8816122c2565b6040516001600160a01b038216907f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b0905f90a250565b5f7f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b611d8c611eec565b806001600354611d9c9190612e33565b1015611dba5760405162461bcd60e51b81526004016106af90612ceb565b6001600160a01b03821615801590611ddc57506001600160a01b038216600114155b611df85760405162461bcd60e51b81526004016106af90612c06565b6001600160a01b038381165f90815260026020526040902054811690831614611e4b5760405162461bcd60e51b8152602060048201526005602482015264475332303560d81b60448201526064016106af565b6001600160a01b038281165f81815260026020526040808220805488861684529183208054929095166001600160a01b03199283161790945591815282549091169091556003805491611e9d83612f62565b90915550506040516001600160a01b038316907ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf905f90a28060045414611ee757611ee781610f62565b505050565b333014611f235760405162461bcd60e51b8152602060048201526005602482015264475330333160d81b60448201526064016106af565b565b5f825f03611f3457505f610c6d565b5f611f3f8385612cd4565b905082611f4c8583612e14565b14611f55575f80fd5b9392505050565b5f80611f688385612e01565b905083811015611f55575f80fd5b5f6001836001811115611f8b57611f8b612d0a565b03611fa2575f808551602087018986f49050611fb1565b5f80855160208701888a87f190505b95945050505050565b5f81831015611fc95781611f55565b5090919050565b5f82821115611fdd575f80fd5b5f610d758385612e33565b5f806001600160a01b03831615611fff5782612001565b325b90506001600160a01b038416612093576120333a8610612021573a612023565b855b61202d8989611f5c565b90611f25565b6040519092506001600160a01b0382169083156108fc029084905f818181858888f1935050505061208e5760405162461bcd60e51b8152602060048201526005602482015264475330313160d81b60448201526064016106af565b6120e2565b6120a18561202d8989611f5c565b91506120ae848284612454565b6120e25760405162461bcd60e51b815260206004820152600560248201526423a998189960d91b60448201526064016106af565b5095945050505050565b600454156121245760405162461bcd60e51b8152602060048201526005602482015264047533230360dc1b60448201526064016106af565b81518111156121455760405162461bcd60e51b81526004016106af90612ceb565b600181101561217e5760405162461bcd60e51b815260206004820152600560248201526423a999181960d91b60448201526064016106af565b60015f5b8351811015612290575f84828151811061219e5761219e612e46565b602002602001015190505f6001600160a01b0316816001600160a01b0316141580156121d457506001600160a01b038116600114155b80156121e957506001600160a01b0381163014155b80156122075750806001600160a01b0316836001600160a01b031614155b6122235760405162461bcd60e51b81526004016106af90612c06565b6001600160a01b038181165f90815260026020526040902054161561225a5760405162461bcd60e51b81526004016106af90612c25565b6001600160a01b039283165f90815260026020526040902080546001600160a01b03191693821693909317909255600101612182565b506001600160a01b03165f90815260026020526040902080546001600160a01b03191660011790559051600355600455565b306001600160a01b038216036123025760405162461bcd60e51b8152602060048201526005602482015264047533430360dc1b60448201526064016106af565b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b60015f8190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f546001600160a01b03161561238f5760405162461bcd60e51b8152602060048201526005602482015264047533130360dc1b60448201526064016106af565b60015f81905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80546001600160a01b03191690911790556001600160a01b038216156107a557813b6124115760405162461bcd60e51b815260206004820152600560248201526423a998181960d91b60448201526064016106af565b612420825f8360015f19611f76565b6107a55760405162461bcd60e51b8152602060048201526005602482015264047533030360dc1b60448201526064016106af565b604080516001600160a01b03841660248201526044808201849052825180830390910181526064909101909152602080820180516001600160e01b031663a9059cbb60e01b17815282515f93929184919082896127105a03f13d80156124c457602081146124cc575f93506124d6565b8193506124d6565b5f51158215171593505b5050509392505050565b6001600160a01b03811681146124f4575f80fd5b50565b8035612502816124e0565b919050565b5f8060408385031215612518575f80fd5b8235612523816124e0565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612554575f80fd5b813567ffffffffffffffff8082111561256f5761256f612531565b604051601f8301601f19908116603f0116810190828211818310171561259757612597612531565b816040528381528660208588010111156125af575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f80608085870312156125e1575f80fd5b84359350602085013567ffffffffffffffff808211156125ff575f80fd5b61260b88838901612545565b94506040870135915080821115612620575f80fd5b5061262d87828801612545565b949793965093946060013593505050565b5f6020828403121561264e575f80fd5b8135611f55816124e0565b803560028110612502575f80fd5b5f805f806080858703121561267a575f80fd5b8435612685816124e0565b935060208501359250604085013567ffffffffffffffff8111156126a7575f80fd5b6126b387828801612545565b9250506126c260608601612659565b905092959194509250565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8215158152604060208201525f610d7560408301846126cd565b5f8060408385031215612726575f80fd5b50508035926020909101359150565b602081525f611f5560208301846126cd565b5f60208284031215612757575f80fd5b5035919050565b5f8083601f84011261276e575f80fd5b50813567ffffffffffffffff811115612785575f80fd5b60208301915083602082850101111561279c575f80fd5b9250929050565b5f805f805f805f805f805f6101408c8e0312156127be575f80fd5b6127c78c6124f7565b9a5060208c0135995067ffffffffffffffff8060408e013511156127e9575f80fd5b6127f98e60408f01358f0161275e565b909a50985061280a60608e01612659565b975060808d0135965060a08d0135955060c08d0135945061282d60e08e016124f7565b935061283c6101008e016124f7565b9250806101208e0135111561284f575f80fd5b506128618d6101208e01358e01612545565b90509295989b509295989b9093969950565b5f805f60608486031215612885575f80fd5b83359250602084013567ffffffffffffffff808211156128a3575f80fd5b6128af87838801612545565b935060408601359150808211156128c4575f80fd5b506128d186828701612545565b9150509250925092565b5f815180845260208085019450602084015f5b838110156129135781516001600160a01b0316875295820195908201906001016128ee565b509495945050505050565b602081525f611f5560208301846128db565b5f8060408385031215612941575f80fd5b823561294c816124e0565b9150602083013567ffffffffffffffff811115612967575f80fd5b61297385828601612545565b9150509250929050565b5f805f805f805f805f806101008b8d031215612997575f80fd5b8a3567ffffffffffffffff808211156129ae575f80fd5b818d0191508d601f8301126129c1575f80fd5b8135818111156129cf575f80fd5b8e60208260051b85010111156129e3575f80fd5b60208381019d50909b508d013599506129fe60408e016124f7565b985060608d0135915080821115612a13575f80fd5b50612a208d828e0161275e565b9097509550612a33905060808c016124f7565b9350612a4160a08c016124f7565b925060c08b01359150612a5660e08c016124f7565b90509295989b9194979a5092959850565b604081525f612a7960408301856128db565b905060018060a01b03831660208301529392505050565b5f805f805f805f805f805f6101408c8e031215612aab575f80fd5b8b35612ab6816124e0565b9a5060208c0135995060408c013567ffffffffffffffff811115612ad8575f80fd5b612ae48e828f0161275e565b909a509850612af7905060608d01612659565b965060808c0135955060a08c0135945060c08c0135935060e08c0135612b1c816124e0565b92506101008c0135612b2d816124e0565b809250506101208c013590509295989b509295989b9093969950565b5f8060408385031215612b5a575f80fd5b8235612b65816124e0565b91506020830135612b75816124e0565b809150509250929050565b5f805f60608486031215612b92575f80fd5b8335612b9d816124e0565b92506020840135612bad816124e0565b91506040840135612bbd816124e0565b809150509250925092565b5f805f60608486031215612bda575f80fd5b8335612be5816124e0565b92506020840135612bf5816124e0565b929592945050506040919091013590565b602080825260059082015264475332303360d81b604082015260600190565b60208082526005908201526411d4cc8c0d60da1b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f60018201612c6957612c69612c44565b5060010190565b604081525f612c8260408301856126cd565b8281036020840152611fb181856126cd565b5f60208284031215612ca4575f80fd5b81516001600160e01b031981168114611f55575f80fd5b60ff8281168282160390811115610c6d57610c6d612c44565b8082028115828204841417610c6d57610c6d612c44565b602080825260059082015264475332303160d81b604082015260600190565b634e487b7160e01b5f52602160045260245ffd5b60028110612d3a57634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b038d168152602081018c90526101606040820181905281018a90525f6101808b8d828501375f838d01820152601f8c01601f19168301612d88606085018d612d1e565b8a60808501528960a08501528860c0850152612daf60e08501896001600160a01b03169052565b6001600160a01b0387166101008501528184820301610120850152612dd6828201876126cd565b92505050612df06101408301846001600160a01b03169052565b9d9c50505050505050505050505050565b80820180821115610c6d57610c6d612c44565b5f82612e2e57634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610c6d57610c6d612c44565b634e487b7160e01b5f52603260045260245ffd5b608080825281018590525f8660a08301825b88811015612e9c578235612e7f816124e0565b6001600160a01b0316825260209283019290910190600101612e6c565b50602084019690965250506001600160a01b039283166040820152911660609091015292915050565b5f60208284031215612ed5575f80fd5b81518015158114611f55575f80fd5b818382375f9101908152919050565b8b81526001600160a01b038b81166020830152604082018b9052606082018a9052610160820190612f27608084018b612d1e565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b5f81612f7057612f70612c44565b505f19019056fea2646970667358221220d98ce5a63765aa68dee25f430f678dd1c6cba6c1883c4942b2363d367a9039f464736f6c63430008190033"; bytes public constant SAFE_PROXY_FACTORY_BYTECODE = - hex"6080604052348015600e575f80fd5b506107638061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c80631688f0b9146100595780633408e4701461008957806353e5d93514610097578063d18af54d146100ac578063ec9e80bb146100bf575b5f80fd5b61006c610067366004610470565b6100d2565b6040516001600160a01b0390911681526020015b60405180910390f35b604051468152602001610080565b61009f610166565b60405161008091906104f3565b61006c6100ba36600461050c565b610190565b61006c6100cd366004610470565b61025f565b5f808380519060200120836040516020016100f7929190918252602082015260400190565b60405160208183030381529060405280519060200120905061011a858583610290565b6040516001600160a01b038781168252919350908316907f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2359060200160405180910390a2509392505050565b606060405180602001610178906103af565b601f1982820381018352601f90910116604052919050565b5f8083836040516020016101c092919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001205f1c90506101e58686836100d2565b91506001600160a01b03831615610256576040516303ca56a360e31b81526001600160a01b03841690631e52b518906102289085908a908a908a90600401610574565b5f604051808303815f87803b15801561023f575f80fd5b505af1158015610251573d5f803e3d5ffd5b505050505b50949350505050565b5f808380519060200120836102714690565b60408051602081019490945283019190915260608201526080016100f7565b5f833b6102e45760405162461bcd60e51b815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f7965640060448201526064015b60405180910390fd5b5f604051806020016102f5906103af565b601f1982820381018352601f90910116604081905261032291906001600160a01b038816906020016105b0565b6040516020818303038152906040529050828151826020015ff591506001600160a01b03821661038a5760405162461bcd60e51b815260206004820152601360248201527210dc99585d194c8818d85b1b0819985a5b1959606a1b60448201526064016102db565b8351156103a7575f805f8651602088015f875af1036103a7575f80fd5b509392505050565b610163806105cb83390190565b6001600160a01b03811681146103d0575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126103f6575f80fd5b813567ffffffffffffffff80821115610411576104116103d3565b604051601f8301601f19908116603f01168101908282118183101715610439576104396103d3565b81604052838152866020858801011115610451575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f60608486031215610482575f80fd5b833561048d816103bc565b9250602084013567ffffffffffffffff8111156104a8575f80fd5b6104b4868287016103e7565b925050604084013590509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61050560208301846104c5565b9392505050565b5f805f806080858703121561051f575f80fd5b843561052a816103bc565b9350602085013567ffffffffffffffff811115610545575f80fd5b610551878288016103e7565b935050604085013591506060850135610569816103bc565b939692955090935050565b6001600160a01b038581168252841660208201526080604082018190525f9061059f908301856104c5565b905082606083015295945050505050565b5f83518060208601845e919091019182525060200191905056fe6080604052348015600e575f80fd5b50604051610163380380610163833981016040819052602b9160b2565b6001600160a01b038116608f5760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b5f80546001600160a01b0319166001600160a01b039290921691909117905560dd565b5f6020828403121560c1575f80fd5b81516001600160a01b038116811460d6575f80fd5b9392505050565b607a806100e95f395ff3fe60806040525f80546001600160a01b03169035632cf35bc960e11b01602657805f5260205ff35b365f80375f80365f845af490503d5f803e80603f573d5ffd5b503d5ff3fea2646970667358221220072b6bb43f6b7adb3b22a0bfcaf5874c3195bd6688d65d6da798d9bf701f6dce64736f6c63430008190033a264697066735822122018d9d7e9dde24bc3ee1d7ea436ba27a4c59b787d7aa27df78255144c4c11019b64736f6c63430008190033"; + hex"6080604052348015600e575f5ffd5b506107668061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80631688f0b9146100595780633408e4701461008957806353e5d93514610097578063d18af54d146100ac578063ec9e80bb146100bf575b5f5ffd5b61006c610067366004610472565b6100d2565b6040516001600160a01b0390911681526020015b60405180910390f35b604051468152602001610080565b61009f610166565b60405161008091906104f6565b61006c6100ba36600461050f565b610190565b61006c6100cd366004610472565b61025f565b5f5f8380519060200120836040516020016100f7929190918252602082015260400190565b60405160208183030381529060405280519060200120905061011a858583610290565b6040516001600160a01b038781168252919350908316907f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2359060200160405180910390a2509392505050565b606060405180602001610178906103af565b601f1982820381018352601f90910116604052919050565b5f5f83836040516020016101c092919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001205f1c90506101e58686836100d2565b91506001600160a01b03831615610256576040516303ca56a360e31b81526001600160a01b03841690631e52b518906102289085908a908a908a90600401610577565b5f604051808303815f87803b15801561023f575f5ffd5b505af1158015610251573d5f5f3e3d5ffd5b505050505b50949350505050565b5f5f8380519060200120836102714690565b60408051602081019490945283019190915260608201526080016100f7565b5f833b6102e45760405162461bcd60e51b815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f7965640060448201526064015b60405180910390fd5b5f604051806020016102f5906103af565b601f1982820381018352601f90910116604081905261032291906001600160a01b038816906020016105b3565b6040516020818303038152906040529050828151826020015ff591506001600160a01b03821661038a5760405162461bcd60e51b815260206004820152601360248201527210dc99585d194c8818d85b1b0819985a5b1959606a1b60448201526064016102db565b8351156103a7575f5f5f8651602088015f875af1036103a7575f5ffd5b509392505050565b610163806105ce83390190565b6001600160a01b03811681146103d0575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126103f6575f5ffd5b813567ffffffffffffffff811115610410576104106103d3565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561043f5761043f6103d3565b604052818152838201602001851015610456575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f60608486031215610484575f5ffd5b833561048f816103bc565b9250602084013567ffffffffffffffff8111156104aa575f5ffd5b6104b6868287016103e7565b93969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61050860208301846104c8565b9392505050565b5f5f5f5f60808587031215610522575f5ffd5b843561052d816103bc565b9350602085013567ffffffffffffffff811115610548575f5ffd5b610554878288016103e7565b93505060408501359150606085013561056c816103bc565b939692955090935050565b6001600160a01b038581168252841660208201526080604082018190525f906105a2908301856104c8565b905082606083015295945050505050565b5f83518060208601845e919091019182525060200191905056fe6080604052348015600e575f5ffd5b50604051610163380380610163833981016040819052602b9160b2565b6001600160a01b038116608f5760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b5f80546001600160a01b0319166001600160a01b039290921691909117905560dd565b5f6020828403121560c1575f5ffd5b81516001600160a01b038116811460d6575f5ffd5b9392505050565b607a806100e95f395ff3fe60806040525f80546001600160a01b03169035632cf35bc960e11b01602657805f5260205ff35b365f5f375f5f365f845af490503d5f5f3e80603f573d5ffd5b503d5ff3fea2646970667358221220640def201af13e0821a9dcaf5c656634c958a7cf37a69d829387126c436276e364736f6c634300081c0033a2646970667358221220e6be85b164b5d425d66785699e181cd85bffd8ff4fcbc6d6b2c6e7b4dacdeb4664736f6c634300081c0033"; } From c608187cccfd4520fc5f33ecdda3aa7acf927ac2 Mon Sep 17 00:00:00 2001 From: highskore Date: Thu, 20 Feb 2025 22:17:03 +0100 Subject: [PATCH 09/15] feat(SafeHelpers): add install/unintsall pvh functions --- src/test/helpers/SafeHelpers.sol | 72 +++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/src/test/helpers/SafeHelpers.sol b/src/test/helpers/SafeHelpers.sol index 8186a055..4c35d99d 100644 --- a/src/test/helpers/SafeHelpers.sol +++ b/src/test/helpers/SafeHelpers.sol @@ -8,7 +8,9 @@ import { MODULE_TYPE_HOOK, MODULE_TYPE_VALIDATOR, MODULE_TYPE_EXECUTOR, - MODULE_TYPE_FALLBACK + MODULE_TYPE_FALLBACK, + MODULE_TYPE_PREVALIDATION_HOOK_ERC1271, + MODULE_TYPE_PREVALIDATION_HOOK_ERC4337 } from "../../accounts/common/interfaces/IERC7579Module.sol"; import { HookType } from "../../accounts/safe/types/DataTypes.sol"; import { CALLTYPE_STATIC } from "../../accounts/common/lib/ModeLib.sol"; @@ -271,6 +273,74 @@ contract SafeHelpers is HelperBase { data = abi.encode(selector, _initData); } + /// @notice get callData to install an ERC1271 prevalidation hook + /// @param initData bytes the data to pass to the module + /// @return data bytes the callData to install the prevalidation hook ERC1271 + function getInstallPrevalidationHookERC1271Data( + AccountInstance memory, // instance + address, // module + bytes memory initData + ) + public + view + virtual + override + returns (bytes memory data) + { + data = abi.encode(MODULE_TYPE_PREVALIDATION_HOOK_ERC1271, initData); + } + + /// @notice get callData to install an ERC4337 prevalidation hook ERC4337 + /// @param initData bytes the data to pass to the module + /// @return data bytes the callData to install the prevalidation hook ERC4337 + function getInstallPrevalidationHookERC4337Data( + AccountInstance memory, // instance + address, // module + bytes memory initData + ) + public + view + virtual + override + returns (bytes memory data) + { + data = abi.encode(MODULE_TYPE_PREVALIDATION_HOOK_ERC4337, initData); + } + + /// @notice get callData to uninstall an ERC1271 prevalidation hook + /// @param initData bytes the data to pass to the module + /// @return data bytes the callData to uninstall the prevalidation hook ERC1271 + function getUninstallPrevalidationHookERC1271Data( + AccountInstance memory, // instance + address, // module + bytes memory initData + ) + public + view + virtual + override + returns (bytes memory data) + { + data = abi.encode(MODULE_TYPE_PREVALIDATION_HOOK_ERC1271, initData); + } + + /// @notice get callData to uninstall an ERC4337 prevalidation hook + /// @param initData bytes the data to pass to the module + /// @return data bytes the callData to uninstall the prevalidation hook ERC4337 + function getUninstallPrevalidationHookERC4337Data( + AccountInstance memory, // instance + address, // module + bytes memory initData + ) + public + view + virtual + override + returns (bytes memory data) + { + data = abi.encode(MODULE_TYPE_PREVALIDATION_HOOK_ERC4337, initData); + } + /// @notice Checks if a module is installed on an account instance /// @param instance AccountInstance the account instance to check /// @param moduleTypeId uint256 the type of the module From 7fcb4cb865980c5a3a0acd9099cf3d3d87139c02 Mon Sep 17 00:00:00 2001 From: highskore Date: Thu, 20 Feb 2025 22:22:02 +0100 Subject: [PATCH 10/15] feat(SafeHelpers): update isModuleInstalled --- src/test/helpers/SafeHelpers.sol | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/helpers/SafeHelpers.sol b/src/test/helpers/SafeHelpers.sol index 4c35d99d..20555b12 100644 --- a/src/test/helpers/SafeHelpers.sol +++ b/src/test/helpers/SafeHelpers.sol @@ -363,6 +363,13 @@ contract SafeHelpers is HelperBase { data = abi.encode(HookType.GLOBAL, bytes4(0x0), data); } + if ( + moduleTypeId == MODULE_TYPE_PREVALIDATION_HOOK_ERC4337 + || moduleTypeId == MODULE_TYPE_PREVALIDATION_HOOK_ERC1271 + ) { + data = abi.encode(moduleTypeId, data); + } + return IERC7579Account(instance.account).isModuleInstalled(moduleTypeId, module, data); } From 32e132caaccb7d2d562f622bba3f3ea340ca0079 Mon Sep 17 00:00:00 2001 From: highskore Date: Tue, 25 Feb 2025 17:30:53 +0100 Subject: [PATCH 11/15] feat: add debug logs --- src/deployment/precompiles/ERC7579Precompiles.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/deployment/precompiles/ERC7579Precompiles.sol b/src/deployment/precompiles/ERC7579Precompiles.sol index bc71db78..b144d21c 100644 --- a/src/deployment/precompiles/ERC7579Precompiles.sol +++ b/src/deployment/precompiles/ERC7579Precompiles.sol @@ -57,9 +57,9 @@ contract ERC7579Precompiles is BytecodeDeployer { /* solhint-disable max-line-length */ bytes public constant ERC7579_BYTECODE = - hex"6080604052348015600e575f5ffd5b5061424e8061001c5f395ff3fe60806040526004361061012d575f3560e01c80639517e29f116100aa578063d691c9641161006e578063d691c9641461048d578063e9ae5c53146104ad578063ea5f61d0146104c0578063eab77e17146104df578063eac9b20d146104fe578063f2dc691d1461054b57610134565b80639517e29f146103db5780639cfd7cff146103ee578063a71763a814610439578063b0d691fe1461044c578063d03c79141461046e57610134565b8063492a88a2116100f1578063492a88a2146103535780634b6a1419146103675780635faac46b1461037a5780638626e88b146103a75780638dd7712f146103c857610134565b80630a664dba1461027b578063112d3a7d146102ac5780631626ba7e146102db57806319822f7c146103135780631de6f24f1461033457610134565b3661013457005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a028214171561015f57806020526020603cf35b505f61016961056a565b5f80356001600160e01b03191681526002919091016020526040902080549091506001600160a01b03811690600160a01b900460f81b816101cf57604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b6101dd81607f60f91b61058e565b1561022e5760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa905061021d3d60408051918201905290565b3d5f823e8161022a573d81fd5b3d81f35b610238815f61058e565b156102795760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af1905061021d3d60408051918201905290565b005b348015610286575f5ffd5b5061028f6105a5565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102b7575f5ffd5b506102cb6102c636600461375f565b6105c0565b60405190151581526020016102a3565b3480156102e6575f5ffd5b506102fa6102f53660046137b6565b610641565b6040516001600160e01b031990911681526020016102a3565b6103266103213660046138e2565b610725565b6040519081526020016102a3565b34801561033f575f5ffd5b5061028f61034e366004613a16565b61088c565b34801561035e575f5ffd5b506102cb610896565b610279610375366004613a2d565b6108c5565b348015610385575f5ffd5b50610399610394366004613a6b565b610968565b6040516102a3929190613a95565b3480156103b2575f5ffd5b506103bb61098e565b6040516102a39190613af7565b6102796103d6366004613b39565b610a05565b6102796103e936600461375f565b610ad0565b3480156103f9575f5ffd5b50604080518082018252601b81527f754d53412e616476616e6365642f77697468486f6f6b2e76302e310000000000602082015290516102a39190613b9f565b61027961044736600461375f565b610fa3565b348015610457575f5ffd5b506f71727de22e5e9d8baf0edac6f37da03261028f565b348015610479575f5ffd5b506102cb610488366004613a16565b611248565b6104a061049b3660046137b6565b6112e3565b6040516102a39190613bb1565b6102796104bb3660046137b6565b6119ef565b3480156104cb575f5ffd5b506103996104da366004613a6b565b611e2a565b3480156104ea575f5ffd5b506102796104f9366004613c14565b611e46565b348015610509575f5ffd5b5061051d610518366004613cc2565b611f03565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016102a3565b348015610556575f5ffd5b506102cb610565366004613a16565b611f70565b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a90090565b6001600160f81b0319828116908216145b92915050565b5f6105bb5f5160206141d95f395f51905f525490565b905090565b5f600185036105d9576105d284611fd9565b9050610639565b600285036105ea576105d284611ff6565b60038503610607576105d261060183850185613cc2565b8561200f565b60048503610618576105d28461204b565b60088514806106275750600985145b15610636576105d2848661207b565b505f5b949350505050565b5f806106506014828587613cdd565b61065991613d04565b60601c905061066781611fd9565b61068f57604051635c93ff2f60e11b81526001600160a01b03821660048201526024016101c6565b60606106a7866106a2866014818a613cdd565b6120a0565b604051637aa8f17760e11b815291975091506001600160a01b0383169063f551e2ee906106dc9033908a908690600401613d44565b602060405180830381865afa1580156106f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071b9190613d73565b9695505050505050565b5f336f71727de22e5e9d8baf0edac6f37da0321461075657604051635629665f60e11b815260040160405180910390fd5b60208401518290606081901c9061076c82611fd9565b6107ed57610778612186565b6107e2575f6107b96107ae886020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b8961010001516121b2565b90506001600160a01b03811630146107d75760019450505050610874565b5f9450505050610874565b600193505050610874565b6107f886888761223e565b610100890152604051639700320360e01b81529096506001600160a01b0383169063970032039061082f908a908a90600401613e2e565b6020604051808303815f875af115801561084b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086f9190613e4f565b935050505b8015610884575f385f3884335af1505b509392505050565b5f61059f8261229c565b5f3330146108b757604051630e93a1f960e01b815260040160405180910390fd5b6108bf6122f8565b50600190565b3330146108d4576108d461232f565b6108dc6123a1565b303f7feadcdba66a79ab5dce91622d1d75c8cff5cff0b96944c3bf1072cd08ce0183291480156109455761092f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9006123c4565b6109455f5160206141d95f395f51905f526123c4565b5f8061095384860186613e66565b915091506109618282612417565b5050505050565b60605f5f61097461056a565b905061098181868661247f565b92509250505b9250929050565b7fc473de86d0138e06e4d4918a106463a7cc005258d2e21915272bcb4594c189008054604080516020808402820181019092528281526060939290918391908301828280156109fa57602002820191905f5260205f20905b8154815260200190600101908083116109e6575b505050505091505090565b336f71727de22e5e9d8baf0edac6f37da03214610a3557604051635629665f60e11b815260040160405180910390fd5b365f610a446060850185613eb2565b610a52916004908290613cdd565b915091505f306001600160a01b03168383604051610a71929190613ef4565b5f60405180830381855af49150503d805f8114610aa9576040519150601f19603f3d011682016040523d82523d5f602084013e610aae565b606091505b505090508061096157604051632b3f6d1160e21b815260040160405180910390fd5b336f71727de22e5e9d8baf0edac6f37da0321480610aed57503330145b610b0a57604051635629665f60e11b815260040160405180910390fd5b5f610b205f5160206141d95f395f51905f525490565b90506001600160a01b038116610cff575f54849086906001600160a01b03168015610ba2576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b158015610b8b575f5ffd5b505afa158015610b9d573d5f5f3e3d5ffd5b505050505b60405163ecd0596160e01b8152600481018990526001600160a01b0388169063ecd0596190602401602060405180830381865afa158015610be5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c099190613f03565b610c29576040516369c9a24560e11b8152600481018990526024016101c6565b60018803610c4157610c3c878787612626565b610cb6565b60028803610c5457610c3c878787612669565b60038803610c6757610c3c878787612681565b60048803610c7a57610c3c8787876127ff565b6008881480610c895750600988145b15610c9a57610c3c8789888861285f565b60405163041c38b360e41b8152600481018990526024016101c6565b604080518981526001600160a01b03891660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123910160405180910390a1505050610961565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590610d33903390349086903690600401613f4a565b5f604051808303815f875af1158015610d4e573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d759190810190613fbe565b5f54909150859087906001600160a01b03168015610dea576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b158015610dd3575f5ffd5b505afa158015610de5573d5f5f3e3d5ffd5b505050505b60405163ecd0596160e01b8152600481018a90526001600160a01b0389169063ecd0596190602401602060405180830381865afa158015610e2d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e519190613f03565b610e71576040516369c9a24560e11b8152600481018a90526024016101c6565b60018903610e8957610e84888888612626565b610efe565b60028903610e9c57610e84888888612669565b60038903610eaf57610e84888888612681565b60048903610ec257610e848888886127ff565b6008891480610ed15750600989145b15610ee257610e84888a898961285f565b60405163041c38b360e41b8152600481018a90526024016101c6565b604080518a81526001600160a01b038a1660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123910160405180910390a15050604051630b9dfbed60e11b81526001600160a01b038416915063173bf7da90610f6e908490600401613b9f565b5f604051808303815f87803b158015610f85575f5ffd5b505af1158015610f97573d5f5f3e3d5ffd5b50505050505050505050565b336f71727de22e5e9d8baf0edac6f37da0321480610fc057503330145b610fdd57604051635629665f60e11b815260040160405180910390fd5b5f610ff35f5160206141d95f395f51905f525490565b90506001600160a01b0381166110d6576001850361101b57611016848484612965565b611090565b6002850361102e576110168484846129ba565b60038503611041576110168484846129d6565b6004850361105457611016848484612bdb565b60088514806110635750600985145b156110745761101684868585612c50565b60405163041c38b360e41b8152600481018690526024016101c6565b604080518681526001600160a01b03861660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e910160405180910390a1610961565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f60259061110a903390349086903690600401613f4a565b5f604051808303815f875af1158015611125573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261114c9190810190613fbe565b90506001860361116657611161858585612965565b6111db565b60028603611179576111618585856129ba565b6003860361118c576111618585856129d6565b6004860361119f57611161858585612bdb565b60088614806111ae5750600986145b156111bf5761116185878686612c50565b60405163041c38b360e41b8152600481018790526024016101c6565b604080518781526001600160a01b03871660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e910160405180910390a1604051630b9dfbed60e11b81526001600160a01b0383169063173bf7da90610f6e908490600401613b9f565b5f81600881901b61125d82600160f81b61058e565b1561126b57600192506112ac565b611275825f61058e565b1561128357600192506112ac565b611295826001600160f81b031961058e565b156112a357600192506112ac565b505f9392505050565b6112b6815f61058e565b156112c457600192506112dc565b6112d281600160f81b61058e565b156112a357600192505b5050919050565b60605f6112ee61056a565b60010190506112fd8133612d44565b61131c57604051635c93ff2f60e11b81523360048201526024016101c6565b5f6113325f5160206141d95f395f51905f525490565b90506001600160a01b038116611669575f5433906002906001600160a01b031680156113b5576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b15801561139e575f5ffd5b505afa1580156113b0573d5f5f3e3d5ffd5b505050505b88600881901b6113c982600160f81b61058e565b1561143e57365f6113da8c8c612d7c565b90925090506113e9835f61058e565b156113ff576113f88282612e12565b9950611437565b61140d83600160f81b61058e565b1561141c576113f88282612ee9565b826040516308c3ee0360e11b81526004016101c69190613fef565b505061165f565b611448825f61058e565b1561158f575f5f365f61145b8e8e613014565b6040805160018082528183019092529498509296509094509250816020015b606081526020019060019003908161147a579050509b505f61149c868261058e565b156114cf576114ad85858585613064565b8d5f815181106114bf576114bf614004565b6020026020010181905250611585565b6114dd86600160f81b61058e565b1561156a576114ee85858585613097565b8e5f8151811061150057611500614004565b6020908102919091010152905080611565577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8e5f8151811061154657611546614004565b602002602001015160405161155c929190614018565b60405180910390a15b611585565b856040516308c3ee0360e11b81526004016101c69190613fef565b505050505061165f565b6115a1826001600160f81b031961058e565b15611644575f6115b46014828c8e613cdd565b6115bd91613d04565b60601c9050365f8c8c60149080926115d793929190613cdd565b90925090506115e6845f61058e565b156115fc576115f68383836130c5565b5061163c565b61160a84600160f81b61058e565b156116215761161a8383836130f6565b505061163c565b836040516308c3ee0360e11b81526004016101c69190613fef565b50505061165f565b81604051632e5bf3f960e21b81526004016101c69190613fef565b50505050506119e6565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f60259061169d903390349086903690600401613f4a565b5f604051808303815f875af11580156116b8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116df9190810190613fbe565b5f5490915033906002906001600160a01b03168015611755576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b15801561173e575f5ffd5b505afa158015611750573d5f5f3e3d5ffd5b505050505b89600881901b61176982600160f81b61058e565b156117c357365f61177a8d8d612d7c565b9092509050611789835f61058e565b1561179f576117988282612e12565b9a506117bc565b6117ad83600160f81b61058e565b1561141c576117988282612ee9565b5050611986565b6117cd825f61058e565b156118f4575f5f365f6117e08f8f613014565b6040805160018082528183019092529498509296509094509250816020015b60608152602001906001900390816117ff579050509c505f611821868261058e565b156118545761183285858585613064565b8e5f8151811061184457611844614004565b60200260200101819052506118ea565b61186286600160f81b61058e565b1561156a5761187385858585613097565b8f5f8151811061188557611885614004565b60209081029190910101529050806118ea577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8f5f815181106118cb576118cb614004565b60200260200101516040516118e1929190614018565b60405180910390a15b5050505050611986565b611906826001600160f81b031961058e565b15611644575f6119196014828d8f613cdd565b61192291613d04565b60601c9050365f8d8d601490809261193c93929190613cdd565b909250905061194b845f61058e565b156119615761195b8383836130c5565b50611982565b61196f84600160f81b61058e565b156116215761197f8383836130f6565b50505b5050505b5050604051630b9dfbed60e11b81526001600160a01b038616935063173bf7da92506119b791508490600401613b9f565b5f604051808303815f87803b1580156119ce575f5ffd5b505af11580156119e0573d5f5f3e3d5ffd5b50505050505b50509392505050565b336f71727de22e5e9d8baf0edac6f37da0321480611a0c57503330145b611a2957604051635629665f60e11b815260040160405180910390fd5b5f611a3f5f5160206141d95f395f51905f525490565b90506001600160a01b038116611be25783600881901b611a6382600160f81b61058e565b15611abc57365f611a748787612d7c565b9092509050611a83835f61058e565b15611a9857611a928282612e12565b50611ab5565b611aa683600160f81b61058e565b1561141c57611a928282612ee9565b5050611bdb565b611ac6825f61058e565b15611b4f575f5f365f611ad98989613014565b9350935093509350611aee855f60f81b61058e565b15611b0557611aff84848484613064565b50611b46565b611b1385600160f81b61058e565b15611b2b57611b2484848484613097565b5050611b46565b846040516308c3ee0360e11b81526004016101c69190613fef565b50505050611bdb565b611b61826001600160f81b031961058e565b15611644575f611b746014828789613cdd565b611b7d91613d04565b60601c9050365f611b91876014818b613cdd565b9092509050611ba0845f61058e565b15611bb657611bb08383836130c5565b50611bd7565b611bc484600160f81b61058e565b1561162157611bd48383836130f6565b50505b5050505b5050611e24565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590611c16903390349086903690600401613f4a565b5f604051808303815f875af1158015611c31573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c589190810190613fbe565b905084600881901b611c6e82600160f81b61058e565b15611cc757365f611c7f8888612d7c565b9092509050611c8e835f61058e565b15611ca357611c9d8282612e12565b50611cc0565b611cb183600160f81b61058e565b1561141c57611c9d8282612ee9565b5050611dc7565b611cd1825f61058e565b15611d3b575f5f365f611ce48a8a613014565b9350935093509350611cf9855f60f81b61058e565b15611d1057611d0a84848484613064565b50611d32565b611d1e85600160f81b61058e565b15611b2b57611d2f84848484613097565b50505b50505050611dc7565b611d4d826001600160f81b031961058e565b15611644575f611d60601482888a613cdd565b611d6991613d04565b60601c9050365f611d7d886014818c613cdd565b9092509050611d8c845f61058e565b15611da257611d9c8383836130c5565b50611dc3565b611db084600160f81b61058e565b1561162157611dc08383836130f6565b50505b5050505b5050604051630b9dfbed60e11b81526001600160a01b0383169063173bf7da90611df5908490600401613b9f565b5f604051808303815f87803b158015611e0c575f5ffd5b505af1158015611e1e573d5f5f3e3d5ffd5b50505050505b50505050565b60605f5f611e3661056a565b600101905061098181868661247f565b336f71727de22e5e9d8baf0edac6f37da0321480611e6357503330145b611e8057604051635629665f60e11b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0386161790558115611e245760405163f05c04e160e01b81526001600160a01b0385169063f05c04e190611ed090849087908790600401614030565b5f604051808303815f87803b158015611ee7575f5ffd5b505af1158015611ef9573d5f5f3e3d5ffd5b5050505050505050565b604080518082019091525f8082526020820152611f1e61056a565b6001600160e01b0319929092165f908152600290920160209081526040928390208351808501909452546001600160a01b0381168452600160a01b900460f81b6001600160f81b031916908301525090565b5f60018203611f8157506001919050565b60028203611f9157506001919050565b60038203611fa157506001919050565b60048203611fb157506001919050565b6008821480611fc05750600982145b15611fcd57506001919050565b505f919050565b919050565b5f5f611fe361056a565b9050611fef8184612d44565b9392505050565b5f5f61200061056a565b6001019050611fef8184612d44565b5f5f61201961056a565b6001600160e01b0319949094165f908152600290940160205250506040909120546001600160a01b0390811691161490565b5f816001600160a01b031661206b5f5160206141d95f395f51905f525490565b6001600160a01b03161492915050565b5f826001600160a01b031661208f8361229c565b6001600160a01b0316149392505050565b5f60605f6120ae600861229c565b90506001600160a01b0381166121055785858581818080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525095985091965061217e95505050505050565b604051637a0468b760e01b81526001600160a01b03821690637a0468b7906121379033908a908a908a90600401613f4a565b5f60405180830381865afa158015612151573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121789190810190614087565b92509250505b935093915050565b5f5f61219061056a565b60015f90815260209190915260409020546001600160a01b0316151592915050565b5f6040518251604081146121ce57604181146121ef575061222a565b604084015160ff81901c601b016020526001600160ff1b0316606052612202565b60608401515f1a60205260408401516060525b50835f5260208301516040526020600160805f60015afa5191505f606052806040523d612237575b638baa579f5f526004601cfd5b5092915050565b5f60605f61224c600961229c565b90506001600160a01b03811661226c57505050610100820151839061217e565b60405163e24f8f9360e01b81526001600160a01b0382169063e24f8f939061213790889088908b906004016140c0565b5f5f5160206141f95f395f51905f5260071983016122c457546001600160a01b031692915050565b600983036122df57600101546001600160a01b031692915050565b604051635691922f60e01b815260040160405180910390fd5b612300613122565b61230861320a565b6123256123205f5160206141d95f395f51905f525490565b6132f5565b61232d6123a1565b565b5f60ff1961235e60017ff63b257b7881773a84d328ab92140e19ab791f7b439c76ba9837aa0d6ad30af06140f8565b60405160200161237091815260200190565b60405160208183030381529060405280519060200120169050805c8061239d5763aed595955f526004601cfd5b5050565b5f6123aa61056a565b90506123b8816001016133bc565b6123c1816133bc565b50565b7fc473de86d0138e06e4d4918a106463a7cc005258d2e21915272bcb4594c1890080546001810182555f919091527fdb3901c0862740f848a4aebebd6b3d645e6b3bc6adf2cf46e83a846b3a3439330155565b5f826001600160a01b031682604051612430919061410b565b5f60405180830381855af49150503d805f8114612468576040519150601f19603f3d011682016040523d82523d5f602084013e61246d565b606091505b505090508061247a575f5ffd5b505050565b60605f6001600160a01b0384166001148015906124a357506124a18585612d44565b155b156124cc57604051637c84ecfb60e01b81526001600160a01b03851660048201526024016101c6565b825f036124ec5760405163f725081760e01b815260040160405180910390fd5b826001600160401b03811115612504576125046137fd565b60405190808252806020026020018201604052801561252d578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b0382161580159061257157506001600160a01b038216600114155b801561257c57508381105b156125d5578183828151811061259457612594614004565b6001600160a01b039283166020918202929092018101919091529281165f9081529287905260409092205490911690806125cd81614121565b91505061254f565b6001600160a01b0382166001148015906125ee57505f81115b1561261a57826125ff6001836140f8565b8151811061260f5761260f614004565b602002602001015191505b80835250935093915050565b5f61262f61056a565b905061263b8185613417565b6040516306d61fe760e41b81526001600160a01b03851690636d61fe7090611ed09086908690600401614139565b5f61267261056a565b600101905061263b8185613417565b5f61268f6004828486613cdd565b6126989161414c565b90505f838360048181106126ae576126ae614004565b909101356001600160f81b03191691505f90506126ce8460058188613cdd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092935061271092508591506134eb9050565b1561275d5760405162461bcd60e51b815260206004820152601e60248201527f46756e6374696f6e2073656c6563746f7220616c72656164792075736564000060448201526064016101c6565b604080518082019091526001600160a01b03871681526001600160f81b03198316602082015261278b61056a565b6001600160e01b031985165f908152600291909101602090815260409182902083518154949092015160f81c600160a01b026001600160a81b03199094166001600160a01b039283161793909317909255516306d61fe760e41b815290871690636d61fe7090610f6e908490600401613b9f565b5f6128155f5160206141d95f395f51905f525490565b90506001600160a01b0381161561284a5760405163741cbe0360e01b81526001600160a01b03821660048201526024016101c6565b61263b845f5160206141d95f395f51905f5255565b5f5160206141f95f395f51905f525f6128778561229c565b90506001600160a01b038116156128ac5760405163786ae23560e01b81526001600160a01b03821660048201526024016101c6565b6128b68686613523565b600885036129215781546040516306d61fe760e41b81526001600160a01b0390911690636d61fe70906128ef9087908790600401614139565b5f604051808303815f87803b158015612906575f5ffd5b505af1158015612918573d5f5f3e3d5ffd5b5050505061295d565b6009850361295d5760018201546040516306d61fe760e41b81526001600160a01b0390911690636d61fe7090610f6e9087908790600401614139565b505050505050565b5f61296e61056a565b90505f8061297e84860186613e66565b909250905061298e838388613586565b604051638a91b0e360e01b81526001600160a01b03871690638a91b0e390610f6e908490600401613b9f565b5f6129c361056a565b60010190505f8061297e84860186613e66565b5f6129e46004828486613cdd565b6129ed9161414c565b90505f6129fd8360048187613cdd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350612a3f92508491506134eb9050565b612a8b5760405162461bcd60e51b815260206004820152601a60248201527f46756e6374696f6e2073656c6563746f72206e6f74207573656400000000000060448201526064016101c6565b5f612a9461056a565b6001600160e01b031984165f90815260029190910160209081526040918290208251808401909352546001600160a01b03808216808552600160a01b90920460f81b6001600160f81b03191692840192909252919250871614612b4c5760405162461bcd60e51b815260206004820152602a60248201527f46756e6374696f6e2073656c6563746f72206e6f74207573656420627920746860448201526934b9903430b7323632b960b11b60648201526084016101c6565b604080518082019091525f8082526020820152612b6761056a565b6001600160e01b031985165f908152600291909101602090815260409182902083518154949092015160f81c600160a01b026001600160a81b03199094166001600160a01b03928316179390931790925551638a91b0e360e01b815290871690638a91b0e390610f6e908590600401613b9f565b612bf05f5f5160206141d95f395f51905f5255565b604051638a91b0e360e01b81526001600160a01b03841690638a91b0e390612c1e9085908590600401614139565b5f604051808303815f87803b158015612c35575f5ffd5b505af1158015612c47573d5f5f3e3d5ffd5b50505050505050565b5f5160206141f95f395f51905f52600884148015612c7a575080546001600160a01b038681169116145b15612ce2578054604051638a91b0e360e01b81526001600160a01b0390911690638a91b0e390612cb09086908690600401614139565b5f604051808303815f87803b158015612cc7575f5ffd5b505af1158015612cd9573d5f5f3e3d5ffd5b50505050612d3a565b600984148015612d01575060018101546001600160a01b038681169116145b156122df576001810154604051638a91b0e360e01b81526001600160a01b0390911690638a91b0e390612cb09086908690600401614139565b6109615f85613523565b5f60016001600160a01b03831614801590611fef5750506001600160a01b039081165f90815260209290925260409091205416151590565b365f833580850160208587010360208201945081359350808460051b8301118360401c1715612db25763ba597e7e5f526004601cfd5b8315612e08578392505b6001830392508260051b850135915081850160408101358082018381358201118460408501111782861782351760401c1715612dff5763ba597e7e5f526004601cfd5b50505082612dbc575b5050509250929050565b606081806001600160401b03811115612e2d57612e2d6137fd565b604051908082528060200260200182016040528015612e6057816020015b6060815260200190600190039081612e4b5790505b5091505f5b81811015612ee15736858583818110612e8057612e80614004565b9050602002810190612e929190614182565b9050612ebb612ea460208301836141a0565b6020830135612eb66040850185613eb2565b613064565b848381518110612ecd57612ecd614004565b602090810291909101015250600101612e65565b505092915050565b606081806001600160401b03811115612f0457612f046137fd565b604051908082528060200260200182016040528015612f3757816020015b6060815260200190600190039081612f225790505b5091505f5b81811015612ee15736858583818110612f5757612f57614004565b9050602002810190612f699190614182565b90505f612f93612f7c60208401846141a0565b6020840135612f8e6040860186613eb2565b613097565b868581518110612fa557612fa5614004565b602090810291909101015290508061300a577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb783868581518110612feb57612feb614004565b6020026020010151604051613001929190614018565b60405180910390a15b5050600101612f3c565b5f8036816130256014828789613cdd565b61302e91613d04565b60601c9350613041603460148789613cdd565b61304a916141bb565b92506130598560348189613cdd565b949793965094505050565b604051818382375f38838387895af161307f573d5f823e3d81fd5b3d8152602081013d5f823e3d01604052949350505050565b6040515f90828482375f388483888a5af191503d8152602081013d5f823e3d81016040525094509492505050565b604051818382375f388383875af46130df573d5f823e3d81fd5b3d8152602081013d5f823e3d016040529392505050565b6040515f90828482375f388483885af491503d8152602081013d5f823e3d810160405250935093915050565b5f61312b61056a565b90505f613139826001613659565b90505b6001600160a01b03811660011461320157604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b158015613192575f5ffd5b505af19250505080156131a3575060015b6131f057604080516001600160a01b0383168152602081018290525f8183015290517f6c31ee2929752d85a6dc461efcf817aa81394aff41db1856ebfd71679fffc5709181900360600190a15b6131fa8282613659565b905061313c565b61239d826136ac565b5f61321361056a565b60010190505f61322d60018361365990919063ffffffff16565b90505b6001600160a01b03811660011461320157604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b158015613286575f5ffd5b505af1925050508015613297575060015b6132e457604080516001600160a01b0383168152602081018290525f8183015290517ffdea4600cf09065ff861064d4cd43cde3fae2134d9fbe6d66fd77cc67135c8829181900360600190a15b6132ee8282613659565b9050613230565b6001600160a01b038116156123c157604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b158015613349575f5ffd5b505af192505050801561335a575060015b6133a757604080516001600160a01b0383168152602081018290525f8183015290517f57af23cbd8e148da6020d15e1ff9fb3c531aa9003d6bab6915013a7d8fd032369181900360600190a15b6123c15f5f5160206141d95f395f51905f5255565b60015f908152602082905260409020546001600160a01b0316156133f3576040516329e42f3360e11b815260040160405180910390fd5b60015f818152602092909252604090912080546001600160a01b0319169091179055565b6001600160a01b038116158061343657506001600160a01b0381166001145b1561345f57604051637c84ecfb60e01b81526001600160a01b03821660048201526024016101c6565b6001600160a01b038181165f9081526020849052604090205416156134a257604051631034f46960e21b81526001600160a01b03821660048201526024016101c6565b60015f818152602093909352604080842080546001600160a01b039485168087529286208054959091166001600160a01b03199586161790559190935280549091169091179055565b5f5f6134f561056a565b6001600160e01b03199093165f908152600293909301602052505060409020546001600160a01b0316151590565b5f5160206141f95f395f51905f52600719820161355a5780546001600160a01b0384166001600160a01b0319909116178155505050565b600982036122df576001810180546001600160a01b0385166001600160a01b0319909116179055505050565b6001600160a01b03811615806135a557506001600160a01b0381166001145b156135ce57604051637c84ecfb60e01b81526001600160a01b03831660048201526024016101c6565b6001600160a01b038281165f9081526020859052604090205481169082161461361557604051637c84ecfb60e01b81526001600160a01b03821660048201526024016101c6565b6001600160a01b039081165f8181526020949094526040808520805494841686529085208054949093166001600160a01b0319948516179092559092528154169055565b5f6001600160a01b03821661368c57604051637c84ecfb60e01b81526001600160a01b03831660048201526024016101c6565b506001600160a01b039081165f9081526020929092526040909120541690565b60015f908152602082905260409020546001600160a01b03165b6001600160a01b0381161561239d576001600160a01b039081165f90815260208390526040902080546001600160a01b03198116909155166136c6565b6001600160a01b03811681146123c1575f5ffd5b8035611fd481613703565b5f5f83601f840112613732575f5ffd5b5081356001600160401b03811115613748575f5ffd5b602083019150836020828501011115610987575f5ffd5b5f5f5f5f60608587031215613772575f5ffd5b84359350602085013561378481613703565b925060408501356001600160401b0381111561379e575f5ffd5b6137aa87828801613722565b95989497509550505050565b5f5f5f604084860312156137c8575f5ffd5b8335925060208401356001600160401b038111156137e4575f5ffd5b6137f086828701613722565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b0381118282101715613834576138346137fd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613862576138626137fd565b604052919050565b5f6001600160401b03821115613882576138826137fd565b50601f01601f191660200190565b5f82601f83011261389f575f5ffd5b81356138b26138ad8261386a565b61383a565b8181528460208386010111156138c6575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f606084860312156138f4575f5ffd5b83356001600160401b03811115613909575f5ffd5b8401610120818703121561391b575f5ffd5b613923613811565b61392c82613717565b81526020828101359082015260408201356001600160401b03811115613950575f5ffd5b61395c88828501613890565b60408301525060608201356001600160401b0381111561397a575f5ffd5b61398688828501613890565b6060830152506080828101359082015260a0808301359082015260c0808301359082015260e08201356001600160401b038111156139c2575f5ffd5b6139ce88828501613890565b60e0830152506101008201356001600160401b038111156139ed575f5ffd5b6139f988828501613890565b610100830152509660208601359650604090950135949350505050565b5f60208284031215613a26575f5ffd5b5035919050565b5f5f60208385031215613a3e575f5ffd5b82356001600160401b03811115613a53575f5ffd5b613a5f85828601613722565b90969095509350505050565b5f5f60408385031215613a7c575f5ffd5b8235613a8781613703565b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b81811015613ad75783516001600160a01b0316835260209384019390920191600101613ab0565b50506001600160a01b039490941660209390930192909252509092915050565b602080825282518282018190525f918401906040840190835b81811015613b2e578351835260209384019390920191600101613b10565b509095945050505050565b5f5f60408385031215613b4a575f5ffd5b82356001600160401b03811115613b5f575f5ffd5b83016101208186031215613a87575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611fef6020830184613b71565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613c0857603f19878603018452613bf3858351613b71565b94506020938401939190910190600101613bd7565b50929695505050505050565b5f5f5f5f60608587031215613c27575f5ffd5b8435613c3281613703565b935060208501356001600160401b03811115613c4c575f5ffd5b8501601f81018713613c5c575f5ffd5b80356001600160401b03811115613c71575f5ffd5b8760208260051b8401011115613c85575f5ffd5b60209190910193509150604085013560ff81168114613ca2575f5ffd5b939692955090935050565b6001600160e01b0319811681146123c1575f5ffd5b5f60208284031215613cd2575f5ffd5b8135611fef81613cad565b5f5f85851115613ceb575f5ffd5b83861115613cf7575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015612237576bffffffffffffffffffffffff1960149490940360031b84901b1690921692915050565b60018060a01b0384168152826020820152606060408201525f613d6a6060830184613b71565b95945050505050565b5f60208284031215613d83575f5ffd5b8151611fef81613cad565b80516001600160a01b03168252602081015160208301525f60408201516101206040850152613dc1610120850182613b71565b905060608301518482036060860152613dda8282613b71565b9150506080830151608085015260a083015160a085015260c083015160c085015260e083015184820360e0860152613e128282613b71565b915050610100830151848203610100860152613d6a8282613b71565b604081525f613e406040830185613d8e565b90508260208301529392505050565b5f60208284031215613e5f575f5ffd5b5051919050565b5f5f60408385031215613e77575f5ffd5b8235613e8281613703565b915060208301356001600160401b03811115613e9c575f5ffd5b613ea885828601613890565b9150509250929050565b5f5f8335601e19843603018112613ec7575f5ffd5b8301803591506001600160401b03821115613ee0575f5ffd5b602001915036819003821315610987575f5ffd5b818382375f9101908152919050565b5f60208284031215613f13575f5ffd5b81518015158114611fef575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201525f61071b606083018486613f22565b5f82601f830112613f80575f5ffd5b8151613f8e6138ad8261386a565b818152846020838601011115613fa2575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613fce575f5ffd5b81516001600160401b03811115613fe3575f5ffd5b61063984828501613f71565b6001600160f81b031991909116815260200190565b634e487b7160e01b5f52603260045260245ffd5b828152604060208201525f6106396040830184613b71565b60ff8416815260406020820181905281018290525f8360608301825b8581101561407c57823561405f81613703565b6001600160a01b031682526020928301929091019060010161404c565b509695505050505050565b5f5f60408385031215614098575f5ffd5b8251915060208301516001600160401b038111156140b4575f5ffd5b613ea885828601613f71565b606081525f6140d26060830186613d8e565b60208301949094525060400152919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561059f5761059f6140e4565b5f82518060208501845e5f920191825250919050565b5f60018201614132576141326140e4565b5060010190565b602081525f610639602083018486613f22565b80356001600160e01b03198116906004841015612237576001600160e01b031960049490940360031b84901b1690921692915050565b5f8235605e19833603018112614196575f5ffd5b9190910192915050565b5f602082840312156141b0575f5ffd5b8135611fef81613703565b8035602083101561059f575f19602084900360031b1b169291505056fecd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e4598200088e45215d3756b04bd240e41d75700a696139d5b53082481ffc3914e4840000a26469706673582212208ef474b5e93ab0fb487109f065363bc30e321d6f427467264ec03cb10a92962564736f6c634300081c0033"; + hex"6080604052348015600e575f5ffd5b506143d38061001c5f395ff3fe60806040526004361061012d575f3560e01c80639517e29f116100aa578063d691c9641161006e578063d691c9641461048d578063e9ae5c53146104ad578063ea5f61d0146104c0578063eab77e17146104df578063eac9b20d146104fe578063f2dc691d1461054b57610134565b80639517e29f146103db5780639cfd7cff146103ee578063a71763a814610439578063b0d691fe1461044c578063d03c79141461046e57610134565b8063492a88a2116100f1578063492a88a2146103535780634b6a1419146103675780635faac46b1461037a5780638626e88b146103a75780638dd7712f146103c857610134565b80630a664dba1461027b578063112d3a7d146102ac5780631626ba7e146102db57806319822f7c146103135780631de6f24f1461033457610134565b3661013457005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a028214171561015f57806020526020603cf35b505f61016961056a565b5f80356001600160e01b03191681526002919091016020526040902080549091506001600160a01b03811690600160a01b900460f81b816101cf57604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b6101dd81607f60f91b61058e565b1561022e5760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa905061021d3d60408051918201905290565b3d5f823e8161022a573d81fd5b3d81f35b610238815f61058e565b156102795760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af1905061021d3d60408051918201905290565b005b348015610286575f5ffd5b5061028f6105a5565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102b7575f5ffd5b506102cb6102c63660046138bb565b6105c0565b60405190151581526020016102a3565b3480156102e6575f5ffd5b506102fa6102f5366004613912565b610641565b6040516001600160e01b031990911681526020016102a3565b610326610321366004613a3e565b610725565b6040519081526020016102a3565b34801561033f575f5ffd5b5061028f61034e366004613b72565b610938565b34801561035e575f5ffd5b506102cb610942565b610279610375366004613b89565b610971565b348015610385575f5ffd5b50610399610394366004613bc7565b610a14565b6040516102a3929190613bf1565b3480156103b2575f5ffd5b506103bb610a3a565b6040516102a39190613c53565b6102796103d6366004613c95565b610ab1565b6102796103e93660046138bb565b610b7c565b3480156103f9575f5ffd5b50604080518082018252601b81527f754d53412e616476616e6365642f77697468486f6f6b2e76302e310000000000602082015290516102a39190613cfb565b6102796104473660046138bb565b61104f565b348015610457575f5ffd5b506f71727de22e5e9d8baf0edac6f37da03261028f565b348015610479575f5ffd5b506102cb610488366004613b72565b6112f4565b6104a061049b366004613912565b61138f565b6040516102a39190613d0d565b6102796104bb366004613912565b611a9b565b3480156104cb575f5ffd5b506103996104da366004613bc7565b611ed6565b3480156104ea575f5ffd5b506102796104f9366004613d70565b611ef2565b348015610509575f5ffd5b5061051d610518366004613e1e565b611faf565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016102a3565b348015610556575f5ffd5b506102cb610565366004613b72565b61201c565b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a90090565b6001600160f81b0319828116908216145b92915050565b5f6105bb5f51602061435e5f395f51905f525490565b905090565b5f600185036105d9576105d284612085565b9050610639565b600285036105ea576105d2846120a2565b60038503610607576105d261060183850185613e1e565b856120bb565b60048503610618576105d2846120f7565b60088514806106275750600985145b15610636576105d28486612127565b505f5b949350505050565b5f806106506014828587613e39565b61065991613e60565b60601c905061066781612085565b61068f57604051635c93ff2f60e11b81526001600160a01b03821660048201526024016101c6565b60606106a7866106a2866014818a613e39565b61214c565b604051637aa8f17760e11b815291975091506001600160a01b0383169063f551e2ee906106dc9033908a908690600401613ea0565b602060405180830381865afa1580156106f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071b9190613ecf565b9695505050505050565b5f336f71727de22e5e9d8baf0edac6f37da0321461075657604051635629665f60e11b815260040160405180910390fd5b815f5f866020015190508060601c91506107936040518060400160405280600b81526020016a02b30b634b230ba37b91d160ad1b81525083612232565b61079c82612085565b610899576107de6040518060400160405280601781526020017f56616c696461746f72206e6f7420696e7374616c6c656400000000000000000081525061227b565b6107e66122c1565b61088e576108286040518060400160405280601781526020017f4163636f756e74206e6f7420696e697469616c697a656400000000000000000081525061227b565b5f61086561085a886020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b8961010001516122ed565b90506001600160a01b03811630146108835760019450505050610920565b5f9450505050610920565b600193505050610920565b6108a4868887612379565b610100890152604051639700320360e01b81529096506001600160a01b038316906397003203906108db908a908a90600401613f8a565b6020604051808303815f875af11580156108f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091b9190613fab565b935050505b8015610930575f385f3884335af1505b509392505050565b5f61059f826123d7565b5f33301461096357604051630e93a1f960e01b815260040160405180910390fd5b61096b612433565b50600190565b3330146109805761098061246a565b6109886124d8565b303f7feadcdba66a79ab5dce91622d1d75c8cff5cff0b96944c3bf1072cd08ce0183291480156109f1576109db7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9006124f8565b6109f15f51602061435e5f395f51905f526124f8565b5f806109ff84860186613fc2565b91509150610a0d828261254b565b5050505050565b60605f5f610a2061056a565b9050610a2d8186866125b3565b92509250505b9250929050565b7fc473de86d0138e06e4d4918a106463a7cc005258d2e21915272bcb4594c18900805460408051602080840282018101909252828152606093929091839190830182828015610aa657602002820191905f5260205f20905b815481526020019060010190808311610a92575b505050505091505090565b336f71727de22e5e9d8baf0edac6f37da03214610ae157604051635629665f60e11b815260040160405180910390fd5b365f610af0606085018561400e565b610afe916004908290613e39565b915091505f306001600160a01b03168383604051610b1d929190614050565b5f60405180830381855af49150503d805f8114610b55576040519150601f19603f3d011682016040523d82523d5f602084013e610b5a565b606091505b5050905080610a0d57604051632b3f6d1160e21b815260040160405180910390fd5b336f71727de22e5e9d8baf0edac6f37da0321480610b9957503330145b610bb657604051635629665f60e11b815260040160405180910390fd5b5f610bcc5f51602061435e5f395f51905f525490565b90506001600160a01b038116610dab575f54849086906001600160a01b03168015610c4e576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b158015610c37575f5ffd5b505afa158015610c49573d5f5f3e3d5ffd5b505050505b60405163ecd0596160e01b8152600481018990526001600160a01b0388169063ecd0596190602401602060405180830381865afa158015610c91573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb5919061405f565b610cd5576040516369c9a24560e11b8152600481018990526024016101c6565b60018803610ced57610ce887878761275a565b610d62565b60028803610d0057610ce887878761279d565b60038803610d1357610ce88787876127b5565b60048803610d2657610ce8878787612933565b6008881480610d355750600988145b15610d4657610ce887898888612993565b60405163041c38b360e41b8152600481018990526024016101c6565b604080518981526001600160a01b03891660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123910160405180910390a1505050610a0d565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590610ddf9033903490869036906004016140a6565b5f604051808303815f875af1158015610dfa573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e21919081019061411a565b5f54909150859087906001600160a01b03168015610e96576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b158015610e7f575f5ffd5b505afa158015610e91573d5f5f3e3d5ffd5b505050505b60405163ecd0596160e01b8152600481018a90526001600160a01b0389169063ecd0596190602401602060405180830381865afa158015610ed9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd919061405f565b610f1d576040516369c9a24560e11b8152600481018a90526024016101c6565b60018903610f3557610f3088888861275a565b610faa565b60028903610f4857610f3088888861279d565b60038903610f5b57610f308888886127b5565b60048903610f6e57610f30888888612933565b6008891480610f7d5750600989145b15610f8e57610f30888a8989612993565b60405163041c38b360e41b8152600481018a90526024016101c6565b604080518a81526001600160a01b038a1660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123910160405180910390a15050604051630b9dfbed60e11b81526001600160a01b038416915063173bf7da9061101a908490600401613cfb565b5f604051808303815f87803b158015611031575f5ffd5b505af1158015611043573d5f5f3e3d5ffd5b50505050505050505050565b336f71727de22e5e9d8baf0edac6f37da032148061106c57503330145b61108957604051635629665f60e11b815260040160405180910390fd5b5f61109f5f51602061435e5f395f51905f525490565b90506001600160a01b03811661118257600185036110c7576110c2848484612a99565b61113c565b600285036110da576110c2848484612aee565b600385036110ed576110c2848484612b0a565b60048503611100576110c2848484612d0f565b600885148061110f5750600985145b15611120576110c284868585612d84565b60405163041c38b360e41b8152600481018690526024016101c6565b604080518681526001600160a01b03861660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e910160405180910390a1610a0d565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f6025906111b69033903490869036906004016140a6565b5f604051808303815f875af11580156111d1573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111f8919081019061411a565b9050600186036112125761120d858585612a99565b611287565b600286036112255761120d858585612aee565b600386036112385761120d858585612b0a565b6004860361124b5761120d858585612d0f565b600886148061125a5750600986145b1561126b5761120d85878686612d84565b60405163041c38b360e41b8152600481018790526024016101c6565b604080518781526001600160a01b03871660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e910160405180910390a1604051630b9dfbed60e11b81526001600160a01b0383169063173bf7da9061101a908490600401613cfb565b5f81600881901b61130982600160f81b61058e565b156113175760019250611358565b611321825f61058e565b1561132f5760019250611358565b611341826001600160f81b031961058e565b1561134f5760019250611358565b505f9392505050565b611362815f61058e565b156113705760019250611388565b61137e81600160f81b61058e565b1561134f57600192505b5050919050565b60605f61139a61056a565b60010190506113a98133612e78565b6113c857604051635c93ff2f60e11b81523360048201526024016101c6565b5f6113de5f51602061435e5f395f51905f525490565b90506001600160a01b038116611715575f5433906002906001600160a01b03168015611461576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b15801561144a575f5ffd5b505afa15801561145c573d5f5f3e3d5ffd5b505050505b88600881901b61147582600160f81b61058e565b156114ea57365f6114868c8c612eb0565b9092509050611495835f61058e565b156114ab576114a48282612f46565b99506114e3565b6114b983600160f81b61058e565b156114c8576114a4828261301d565b826040516308c3ee0360e11b81526004016101c6919061414b565b505061170b565b6114f4825f61058e565b1561163b575f5f365f6115078e8e613148565b6040805160018082528183019092529498509296509094509250816020015b6060815260200190600190039081611526579050509b505f611548868261058e565b1561157b5761155985858585613198565b8d5f8151811061156b5761156b614160565b6020026020010181905250611631565b61158986600160f81b61058e565b156116165761159a858585856131cb565b8e5f815181106115ac576115ac614160565b6020908102919091010152905080611611577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8e5f815181106115f2576115f2614160565b6020026020010151604051611608929190614174565b60405180910390a15b611631565b856040516308c3ee0360e11b81526004016101c6919061414b565b505050505061170b565b61164d826001600160f81b031961058e565b156116f0575f6116606014828c8e613e39565b61166991613e60565b60601c9050365f8c8c601490809261168393929190613e39565b9092509050611692845f61058e565b156116a8576116a28383836131f9565b506116e8565b6116b684600160f81b61058e565b156116cd576116c683838361322a565b50506116e8565b836040516308c3ee0360e11b81526004016101c6919061414b565b50505061170b565b81604051632e5bf3f960e21b81526004016101c6919061414b565b5050505050611a92565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f6025906117499033903490869036906004016140a6565b5f604051808303815f875af1158015611764573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261178b919081019061411a565b5f5490915033906002906001600160a01b03168015611801576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b1580156117ea575f5ffd5b505afa1580156117fc573d5f5f3e3d5ffd5b505050505b89600881901b61181582600160f81b61058e565b1561186f57365f6118268d8d612eb0565b9092509050611835835f61058e565b1561184b576118448282612f46565b9a50611868565b61185983600160f81b61058e565b156114c857611844828261301d565b5050611a32565b611879825f61058e565b156119a0575f5f365f61188c8f8f613148565b6040805160018082528183019092529498509296509094509250816020015b60608152602001906001900390816118ab579050509c505f6118cd868261058e565b15611900576118de85858585613198565b8e5f815181106118f0576118f0614160565b6020026020010181905250611996565b61190e86600160f81b61058e565b156116165761191f858585856131cb565b8f5f8151811061193157611931614160565b6020908102919091010152905080611996577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8f5f8151811061197757611977614160565b602002602001015160405161198d929190614174565b60405180910390a15b5050505050611a32565b6119b2826001600160f81b031961058e565b156116f0575f6119c56014828d8f613e39565b6119ce91613e60565b60601c9050365f8d8d60149080926119e893929190613e39565b90925090506119f7845f61058e565b15611a0d57611a078383836131f9565b50611a2e565b611a1b84600160f81b61058e565b156116cd57611a2b83838361322a565b50505b5050505b5050604051630b9dfbed60e11b81526001600160a01b038616935063173bf7da9250611a6391508490600401613cfb565b5f604051808303815f87803b158015611a7a575f5ffd5b505af1158015611a8c573d5f5f3e3d5ffd5b50505050505b50509392505050565b336f71727de22e5e9d8baf0edac6f37da0321480611ab857503330145b611ad557604051635629665f60e11b815260040160405180910390fd5b5f611aeb5f51602061435e5f395f51905f525490565b90506001600160a01b038116611c8e5783600881901b611b0f82600160f81b61058e565b15611b6857365f611b208787612eb0565b9092509050611b2f835f61058e565b15611b4457611b3e8282612f46565b50611b61565b611b5283600160f81b61058e565b156114c857611b3e828261301d565b5050611c87565b611b72825f61058e565b15611bfb575f5f365f611b858989613148565b9350935093509350611b9a855f60f81b61058e565b15611bb157611bab84848484613198565b50611bf2565b611bbf85600160f81b61058e565b15611bd757611bd0848484846131cb565b5050611bf2565b846040516308c3ee0360e11b81526004016101c6919061414b565b50505050611c87565b611c0d826001600160f81b031961058e565b156116f0575f611c206014828789613e39565b611c2991613e60565b60601c9050365f611c3d876014818b613e39565b9092509050611c4c845f61058e565b15611c6257611c5c8383836131f9565b50611c83565b611c7084600160f81b61058e565b156116cd57611c8083838361322a565b50505b5050505b5050611ed0565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590611cc29033903490869036906004016140a6565b5f604051808303815f875af1158015611cdd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d04919081019061411a565b905084600881901b611d1a82600160f81b61058e565b15611d7357365f611d2b8888612eb0565b9092509050611d3a835f61058e565b15611d4f57611d498282612f46565b50611d6c565b611d5d83600160f81b61058e565b156114c857611d49828261301d565b5050611e73565b611d7d825f61058e565b15611de7575f5f365f611d908a8a613148565b9350935093509350611da5855f60f81b61058e565b15611dbc57611db684848484613198565b50611dde565b611dca85600160f81b61058e565b15611bd757611ddb848484846131cb565b50505b50505050611e73565b611df9826001600160f81b031961058e565b156116f0575f611e0c601482888a613e39565b611e1591613e60565b60601c9050365f611e29886014818c613e39565b9092509050611e38845f61058e565b15611e4e57611e488383836131f9565b50611e6f565b611e5c84600160f81b61058e565b156116cd57611e6c83838361322a565b50505b5050505b5050604051630b9dfbed60e11b81526001600160a01b0383169063173bf7da90611ea1908490600401613cfb565b5f604051808303815f87803b158015611eb8575f5ffd5b505af1158015611eca573d5f5f3e3d5ffd5b50505050505b50505050565b60605f5f611ee261056a565b6001019050610a2d8186866125b3565b336f71727de22e5e9d8baf0edac6f37da0321480611f0f57503330145b611f2c57604051635629665f60e11b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0386161790558115611ed05760405163f05c04e160e01b81526001600160a01b0385169063f05c04e190611f7c9084908790879060040161418c565b5f604051808303815f87803b158015611f93575f5ffd5b505af1158015611fa5573d5f5f3e3d5ffd5b5050505050505050565b604080518082019091525f8082526020820152611fca61056a565b6001600160e01b0319929092165f908152600290920160209081526040928390208351808501909452546001600160a01b0381168452600160a01b900460f81b6001600160f81b031916908301525090565b5f6001820361202d57506001919050565b6002820361203d57506001919050565b6003820361204d57506001919050565b6004820361205d57506001919050565b600882148061206c5750600982145b1561207957506001919050565b505f919050565b919050565b5f5f61208f61056a565b905061209b8184612e78565b9392505050565b5f5f6120ac61056a565b600101905061209b8184612e78565b5f5f6120c561056a565b6001600160e01b0319949094165f908152600290940160205250506040909120546001600160a01b0390811691161490565b5f816001600160a01b03166121175f51602061435e5f395f51905f525490565b6001600160a01b03161492915050565b5f826001600160a01b031661213b836123d7565b6001600160a01b0316149392505050565b5f60605f61215a60086123d7565b90506001600160a01b0381166121b15785858581818080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525095985091965061222a95505050505050565b604051637a0468b760e01b81526001600160a01b03821690637a0468b7906121e39033908a908a908a906004016140a6565b5f60405180830381865afa1580156121fd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261222491908101906141e3565b92509250505b935093915050565b612277828260405160240161224892919061421c565b60408051601f198184030181529190526020810180516001600160e01b031663319af33360e01b179052613256565b5050565b6122be8160405160240161228f9190613cfb565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052613256565b50565b5f5f6122cb61056a565b60015f90815260209190915260409020546001600160a01b0316151592915050565b5f604051825160408114612309576041811461232a5750612365565b604084015160ff81901c601b016020526001600160ff1b031660605261233d565b60608401515f1a60205260408401516060525b50835f5260208301516040526020600160805f60015afa5191505f606052806040523d612372575b638baa579f5f526004601cfd5b5092915050565b5f60605f61238760096123d7565b90506001600160a01b0381166123a757505050610100820151839061222a565b60405163e24f8f9360e01b81526001600160a01b0382169063e24f8f93906121e390889088908b90600401614245565b5f5f51602061437e5f395f51905f5260071983016123ff57546001600160a01b031692915050565b6009830361241a57600101546001600160a01b031692915050565b604051635691922f60e01b815260040160405180910390fd5b61243b61325f565b612443613347565b61246061245b5f51602061435e5f395f51905f525490565b613432565b6124686124d8565b565b5f60ff1961249960017ff63b257b7881773a84d328ab92140e19ab791f7b439c76ba9837aa0d6ad30af061427d565b6040516020016124ab91815260200190565b60405160208183030381529060405280519060200120169050805c806122775763aed595955f526004601cfd5b5f6124e161056a565b90506124ef816001016134f9565b6122be816134f9565b7fc473de86d0138e06e4d4918a106463a7cc005258d2e21915272bcb4594c1890080546001810182555f919091527fdb3901c0862740f848a4aebebd6b3d645e6b3bc6adf2cf46e83a846b3a3439330155565b5f826001600160a01b0316826040516125649190614290565b5f60405180830381855af49150503d805f811461259c576040519150601f19603f3d011682016040523d82523d5f602084013e6125a1565b606091505b50509050806125ae575f5ffd5b505050565b60605f6001600160a01b0384166001148015906125d757506125d58585612e78565b155b1561260057604051637c84ecfb60e01b81526001600160a01b03851660048201526024016101c6565b825f036126205760405163f725081760e01b815260040160405180910390fd5b826001600160401b0381111561263857612638613959565b604051908082528060200260200182016040528015612661578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b038216158015906126a557506001600160a01b038216600114155b80156126b057508381105b1561270957818382815181106126c8576126c8614160565b6001600160a01b039283166020918202929092018101919091529281165f908152928790526040909220549091169080612701816142a6565b915050612683565b6001600160a01b03821660011480159061272257505f81115b1561274e578261273360018361427d565b8151811061274357612743614160565b602002602001015191505b80835250935093915050565b5f61276361056a565b905061276f8185613554565b6040516306d61fe760e41b81526001600160a01b03851690636d61fe7090611f7c90869086906004016142be565b5f6127a661056a565b600101905061276f8185613554565b5f6127c36004828486613e39565b6127cc916142d1565b90505f838360048181106127e2576127e2614160565b909101356001600160f81b03191691505f90506128028460058188613e39565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092935061284492508591506136289050565b156128915760405162461bcd60e51b815260206004820152601e60248201527f46756e6374696f6e2073656c6563746f7220616c72656164792075736564000060448201526064016101c6565b604080518082019091526001600160a01b03871681526001600160f81b0319831660208201526128bf61056a565b6001600160e01b031985165f908152600291909101602090815260409182902083518154949092015160f81c600160a01b026001600160a81b03199094166001600160a01b039283161793909317909255516306d61fe760e41b815290871690636d61fe709061101a908490600401613cfb565b5f6129495f51602061435e5f395f51905f525490565b90506001600160a01b0381161561297e5760405163741cbe0360e01b81526001600160a01b03821660048201526024016101c6565b61276f845f51602061435e5f395f51905f5255565b5f51602061437e5f395f51905f525f6129ab856123d7565b90506001600160a01b038116156129e05760405163786ae23560e01b81526001600160a01b03821660048201526024016101c6565b6129ea8686613660565b60088503612a555781546040516306d61fe760e41b81526001600160a01b0390911690636d61fe7090612a2390879087906004016142be565b5f604051808303815f87803b158015612a3a575f5ffd5b505af1158015612a4c573d5f5f3e3d5ffd5b50505050612a91565b60098503612a915760018201546040516306d61fe760e41b81526001600160a01b0390911690636d61fe709061101a90879087906004016142be565b505050505050565b5f612aa261056a565b90505f80612ab284860186613fc2565b9092509050612ac28383886136c3565b604051638a91b0e360e01b81526001600160a01b03871690638a91b0e39061101a908490600401613cfb565b5f612af761056a565b60010190505f80612ab284860186613fc2565b5f612b186004828486613e39565b612b21916142d1565b90505f612b318360048187613e39565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350612b7392508491506136289050565b612bbf5760405162461bcd60e51b815260206004820152601a60248201527f46756e6374696f6e2073656c6563746f72206e6f74207573656400000000000060448201526064016101c6565b5f612bc861056a565b6001600160e01b031984165f90815260029190910160209081526040918290208251808401909352546001600160a01b03808216808552600160a01b90920460f81b6001600160f81b03191692840192909252919250871614612c805760405162461bcd60e51b815260206004820152602a60248201527f46756e6374696f6e2073656c6563746f72206e6f74207573656420627920746860448201526934b9903430b7323632b960b11b60648201526084016101c6565b604080518082019091525f8082526020820152612c9b61056a565b6001600160e01b031985165f908152600291909101602090815260409182902083518154949092015160f81c600160a01b026001600160a81b03199094166001600160a01b03928316179390931790925551638a91b0e360e01b815290871690638a91b0e39061101a908590600401613cfb565b612d245f5f51602061435e5f395f51905f5255565b604051638a91b0e360e01b81526001600160a01b03841690638a91b0e390612d5290859085906004016142be565b5f604051808303815f87803b158015612d69575f5ffd5b505af1158015612d7b573d5f5f3e3d5ffd5b50505050505050565b5f51602061437e5f395f51905f52600884148015612dae575080546001600160a01b038681169116145b15612e16578054604051638a91b0e360e01b81526001600160a01b0390911690638a91b0e390612de490869086906004016142be565b5f604051808303815f87803b158015612dfb575f5ffd5b505af1158015612e0d573d5f5f3e3d5ffd5b50505050612e6e565b600984148015612e35575060018101546001600160a01b038681169116145b1561241a576001810154604051638a91b0e360e01b81526001600160a01b0390911690638a91b0e390612de490869086906004016142be565b610a0d5f85613660565b5f60016001600160a01b0383161480159061209b5750506001600160a01b039081165f90815260209290925260409091205416151590565b365f833580850160208587010360208201945081359350808460051b8301118360401c1715612ee65763ba597e7e5f526004601cfd5b8315612f3c578392505b6001830392508260051b850135915081850160408101358082018381358201118460408501111782861782351760401c1715612f335763ba597e7e5f526004601cfd5b50505082612ef0575b5050509250929050565b606081806001600160401b03811115612f6157612f61613959565b604051908082528060200260200182016040528015612f9457816020015b6060815260200190600190039081612f7f5790505b5091505f5b818110156130155736858583818110612fb457612fb4614160565b9050602002810190612fc69190614307565b9050612fef612fd86020830183614325565b6020830135612fea604085018561400e565b613198565b84838151811061300157613001614160565b602090810291909101015250600101612f99565b505092915050565b606081806001600160401b0381111561303857613038613959565b60405190808252806020026020018201604052801561306b57816020015b60608152602001906001900390816130565790505b5091505f5b81811015613015573685858381811061308b5761308b614160565b905060200281019061309d9190614307565b90505f6130c76130b06020840184614325565b60208401356130c2604086018661400e565b6131cb565b8685815181106130d9576130d9614160565b602090810291909101015290508061313e577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb78386858151811061311f5761311f614160565b6020026020010151604051613135929190614174565b60405180910390a15b5050600101613070565b5f8036816131596014828789613e39565b61316291613e60565b60601c9350613175603460148789613e39565b61317e91614340565b925061318d8560348189613e39565b949793965094505050565b604051818382375f38838387895af16131b3573d5f823e3d81fd5b3d8152602081013d5f823e3d01604052949350505050565b6040515f90828482375f388483888a5af191503d8152602081013d5f823e3d81016040525094509492505050565b604051818382375f388383875af4613213573d5f823e3d81fd5b3d8152602081013d5f823e3d016040529392505050565b6040515f90828482375f388483885af491503d8152602081013d5f823e3d810160405250935093915050565b6122be81613796565b5f61326861056a565b90505f6132768260016137b5565b90505b6001600160a01b03811660011461333e57604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b1580156132cf575f5ffd5b505af19250505080156132e0575060015b61332d57604080516001600160a01b0383168152602081018290525f8183015290517f6c31ee2929752d85a6dc461efcf817aa81394aff41db1856ebfd71679fffc5709181900360600190a15b61333782826137b5565b9050613279565b61227782613808565b5f61335061056a565b60010190505f61336a6001836137b590919063ffffffff16565b90505b6001600160a01b03811660011461333e57604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b1580156133c3575f5ffd5b505af19250505080156133d4575060015b61342157604080516001600160a01b0383168152602081018290525f8183015290517ffdea4600cf09065ff861064d4cd43cde3fae2134d9fbe6d66fd77cc67135c8829181900360600190a15b61342b82826137b5565b905061336d565b6001600160a01b038116156122be57604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b158015613486575f5ffd5b505af1925050508015613497575060015b6134e457604080516001600160a01b0383168152602081018290525f8183015290517f57af23cbd8e148da6020d15e1ff9fb3c531aa9003d6bab6915013a7d8fd032369181900360600190a15b6122be5f5f51602061435e5f395f51905f5255565b60015f908152602082905260409020546001600160a01b031615613530576040516329e42f3360e11b815260040160405180910390fd5b60015f818152602092909252604090912080546001600160a01b0319169091179055565b6001600160a01b038116158061357357506001600160a01b0381166001145b1561359c57604051637c84ecfb60e01b81526001600160a01b03821660048201526024016101c6565b6001600160a01b038181165f9081526020849052604090205416156135df57604051631034f46960e21b81526001600160a01b03821660048201526024016101c6565b60015f818152602093909352604080842080546001600160a01b039485168087529286208054959091166001600160a01b03199586161790559190935280549091169091179055565b5f5f61363261056a565b6001600160e01b03199093165f908152600293909301602052505060409020546001600160a01b0316151590565b5f51602061437e5f395f51905f5260071982016136975780546001600160a01b0384166001600160a01b0319909116178155505050565b6009820361241a576001810180546001600160a01b0385166001600160a01b0319909116179055505050565b6001600160a01b03811615806136e257506001600160a01b0381166001145b1561370b57604051637c84ecfb60e01b81526001600160a01b03831660048201526024016101c6565b6001600160a01b038281165f9081526020859052604090205481169082161461375257604051637c84ecfb60e01b81526001600160a01b03821660048201526024016101c6565b6001600160a01b039081165f8181526020949094526040808520805494841686529085208054949093166001600160a01b0319948516179092559092528154169055565b5f6a636f6e736f6c652e6c6f6790505f5f835160208501845afa505050565b5f6001600160a01b0382166137e857604051637c84ecfb60e01b81526001600160a01b03831660048201526024016101c6565b506001600160a01b039081165f9081526020929092526040909120541690565b60015f908152602082905260409020546001600160a01b03165b6001600160a01b03811615612277576001600160a01b039081165f90815260208390526040902080546001600160a01b0319811690915516613822565b6001600160a01b03811681146122be575f5ffd5b80356120808161385f565b5f5f83601f84011261388e575f5ffd5b5081356001600160401b038111156138a4575f5ffd5b602083019150836020828501011115610a33575f5ffd5b5f5f5f5f606085870312156138ce575f5ffd5b8435935060208501356138e08161385f565b925060408501356001600160401b038111156138fa575f5ffd5b6139068782880161387e565b95989497509550505050565b5f5f5f60408486031215613924575f5ffd5b8335925060208401356001600160401b03811115613940575f5ffd5b61394c8682870161387e565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b038111828210171561399057613990613959565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139be576139be613959565b604052919050565b5f6001600160401b038211156139de576139de613959565b50601f01601f191660200190565b5f82601f8301126139fb575f5ffd5b8135613a0e613a09826139c6565b613996565b818152846020838601011115613a22575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f60608486031215613a50575f5ffd5b83356001600160401b03811115613a65575f5ffd5b84016101208187031215613a77575f5ffd5b613a7f61396d565b613a8882613873565b81526020828101359082015260408201356001600160401b03811115613aac575f5ffd5b613ab8888285016139ec565b60408301525060608201356001600160401b03811115613ad6575f5ffd5b613ae2888285016139ec565b6060830152506080828101359082015260a0808301359082015260c0808301359082015260e08201356001600160401b03811115613b1e575f5ffd5b613b2a888285016139ec565b60e0830152506101008201356001600160401b03811115613b49575f5ffd5b613b55888285016139ec565b610100830152509660208601359650604090950135949350505050565b5f60208284031215613b82575f5ffd5b5035919050565b5f5f60208385031215613b9a575f5ffd5b82356001600160401b03811115613baf575f5ffd5b613bbb8582860161387e565b90969095509350505050565b5f5f60408385031215613bd8575f5ffd5b8235613be38161385f565b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b81811015613c335783516001600160a01b0316835260209384019390920191600101613c0c565b50506001600160a01b039490941660209390930192909252509092915050565b602080825282518282018190525f918401906040840190835b81811015613c8a578351835260209384019390920191600101613c6c565b509095945050505050565b5f5f60408385031215613ca6575f5ffd5b82356001600160401b03811115613cbb575f5ffd5b83016101208186031215613be3575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61209b6020830184613ccd565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613d6457603f19878603018452613d4f858351613ccd565b94506020938401939190910190600101613d33565b50929695505050505050565b5f5f5f5f60608587031215613d83575f5ffd5b8435613d8e8161385f565b935060208501356001600160401b03811115613da8575f5ffd5b8501601f81018713613db8575f5ffd5b80356001600160401b03811115613dcd575f5ffd5b8760208260051b8401011115613de1575f5ffd5b60209190910193509150604085013560ff81168114613dfe575f5ffd5b939692955090935050565b6001600160e01b0319811681146122be575f5ffd5b5f60208284031215613e2e575f5ffd5b813561209b81613e09565b5f5f85851115613e47575f5ffd5b83861115613e53575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015612372576bffffffffffffffffffffffff1960149490940360031b84901b1690921692915050565b60018060a01b0384168152826020820152606060408201525f613ec66060830184613ccd565b95945050505050565b5f60208284031215613edf575f5ffd5b815161209b81613e09565b80516001600160a01b03168252602081015160208301525f60408201516101206040850152613f1d610120850182613ccd565b905060608301518482036060860152613f368282613ccd565b9150506080830151608085015260a083015160a085015260c083015160c085015260e083015184820360e0860152613f6e8282613ccd565b915050610100830151848203610100860152613ec68282613ccd565b604081525f613f9c6040830185613eea565b90508260208301529392505050565b5f60208284031215613fbb575f5ffd5b5051919050565b5f5f60408385031215613fd3575f5ffd5b8235613fde8161385f565b915060208301356001600160401b03811115613ff8575f5ffd5b614004858286016139ec565b9150509250929050565b5f5f8335601e19843603018112614023575f5ffd5b8301803591506001600160401b0382111561403c575f5ffd5b602001915036819003821315610a33575f5ffd5b818382375f9101908152919050565b5f6020828403121561406f575f5ffd5b8151801515811461209b575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201525f61071b60608301848661407e565b5f82601f8301126140dc575f5ffd5b81516140ea613a09826139c6565b8181528460208386010111156140fe575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561412a575f5ffd5b81516001600160401b0381111561413f575f5ffd5b610639848285016140cd565b6001600160f81b031991909116815260200190565b634e487b7160e01b5f52603260045260245ffd5b828152604060208201525f6106396040830184613ccd565b60ff8416815260406020820181905281018290525f8360608301825b858110156141d85782356141bb8161385f565b6001600160a01b03168252602092830192909101906001016141a8565b509695505050505050565b5f5f604083850312156141f4575f5ffd5b8251915060208301516001600160401b03811115614210575f5ffd5b614004858286016140cd565b604081525f61422e6040830185613ccd565b905060018060a01b03831660208301529392505050565b606081525f6142576060830186613eea565b60208301949094525060400152919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561059f5761059f614269565b5f82518060208501845e5f920191825250919050565b5f600182016142b7576142b7614269565b5060010190565b602081525f61063960208301848661407e565b80356001600160e01b03198116906004841015612372576001600160e01b031960049490940360031b84901b1690921692915050565b5f8235605e1983360301811261431b575f5ffd5b9190910192915050565b5f60208284031215614335575f5ffd5b813561209b8161385f565b8035602083101561059f575f19602084900360031b1b169291505056fecd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e4598200088e45215d3756b04bd240e41d75700a696139d5b53082481ffc3914e4840000a26469706673582212200ecbb5c01a4fb76482ae9158c584ef0c9c061949b52b095e41d0e02516c2a14064736f6c634300081c0033"; bytes public constant ERC7579_BOOTSTRAP_BYTECODE = - hex"6080604052348015600e575f5ffd5b506112a48061001c5f395ff3fe60806040526004361061007e575f3560e01c80636b0d5cc41161004d5780636b0d5cc414610271578063b0d691fe14610290578063ea5f61d0146102b2578063eac9b20d146102d157610085565b80630a664dba146101c85780635e87556d146101f95780635faac46b14610225578063642219af1461025257610085565b3661008557005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a02821417156100b057806020526020603cf35b505f80356001600160e01b03191681525f51602061124f5f395f51905f526020526040902080546001600160a01b03811690600160a01b900460f81b8161011c57604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b61012a81607f60f91b610384565b1561017b5760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa905061016a3d60408051918201905290565b3d5f823e81610177573d81fd5b3d81f35b610185815f610384565b156101c65760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af1905061016a3d60408051918201905290565b005b3480156101d3575f5ffd5b506101dc61039b565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610204575f5ffd5b50610218610213366004610d11565b6103c9565b6040516101f09190610e0c565b348015610230575f5ffd5b5061024461023f366004610e35565b610452565b6040516101f0929190610e5f565b34801561025d575f5ffd5b506101c661026c366004610d11565b61048e565b34801561027c575f5ffd5b506101c661028b366004610ec1565b6106d4565b34801561029b575f5ffd5b506f71727de22e5e9d8baf0edac6f37da0326101dc565b3480156102bd575f5ffd5b506102446102cc366004610e35565b6106e4565b3480156102dc575f5ffd5b506103566102eb366004610f41565b6040805180820182525f80825260209182018190526001600160e01b03199390931683525f51602061124f5f395f51905f528152918190208151808301909252546001600160a01b0381168252600160a01b900460f81b6001600160f81b0319169181019190915290565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016101f0565b6001600160f81b0319828116908216145b92915050565b5f6103c47fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005490565b905090565b606030306001600160a01b031663642219af8a8a8a8a8a8a8a6040516024016103f89796959493929190611071565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506040516020016104369291906110ce565b6040516020818303038152906040529050979650505050505050565b60605f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a90061048181868661070f565b92509250505b9250929050565b5f5b8681101561050c576105048888838181106104ad576104ad6110f9565b90506020028101906104bf919061110d565b6104cd90602081019061112b565b8989848181106104df576104df6110f9565b90506020028101906104f1919061110d565b6104ff906020810190611146565b6108b7565b600101610490565b505f5b848110156105cc575f86868381811061052a5761052a6110f9565b905060200281019061053c919061110d565b61054a90602081019061112b565b6001600160a01b0316146105c4576105c486868381811061056d5761056d6110f9565b905060200281019061057f919061110d565b61058d90602081019061112b565b87878481811061059f5761059f6110f9565b90506020028101906105b1919061110d565b6105bf906020810190611146565b610939565b60010161050f565b505f6105db602085018561112b565b6001600160a01b03161461060b5761060b6105f9602085018561112b565b6106066020860186611146565b610964565b5f5b818110156106ca575f838383818110610628576106286110f9565b905060200281019061063a919061110d565b61064890602081019061112b565b6001600160a01b0316146106c2576106c283838381811061066b5761066b6110f9565b905060200281019061067d919061110d565b61068b90602081019061112b565b84848481811061069d5761069d6110f9565b90506020028101906106af919061110d565b6106bd906020810190611146565b6109ea565b60010161060d565b5050505050505050565b6106df8383836108b7565b505050565b60605f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9016104818186865b60605f6001600160a01b03841660011480159061073357506107318585610b90565b155b1561075c57604051637c84ecfb60e01b81526001600160a01b0385166004820152602401610113565b825f0361077c5760405163f725081760e01b815260040160405180910390fd5b8267ffffffffffffffff81111561079557610795611189565b6040519080825280602002602001820160405280156107be578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b0382161580159061080257506001600160a01b038216600114155b801561080d57508381105b156108665781838281518110610825576108256110f9565b6001600160a01b039283166020918202929092018101919091529281165f90815292879052604090922054909116908061085e816111b1565b9150506107e0565b6001600160a01b03821660011480159061087f57505f81115b156108ab57826108906001836111c9565b815181106108a0576108a06110f9565b602002602001015191505b80835250935093915050565b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9006108e28185610bca565b6040516306d61fe760e41b81526001600160a01b03851690636d61fe709061091090869086906004016111dc565b5f604051808303815f87803b158015610927575f5ffd5b505af11580156106ca573d5f5f3e3d5ffd5b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9016108e28185610bca565b5f61098d7fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005490565b90506001600160a01b038116156109c25760405163741cbe0360e01b81526001600160a01b0382166004820152602401610113565b6108e2847fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e459820055565b5f6109f860048284866111ef565b610a0191611216565b90505f83836004818110610a1757610a176110f9565b909101356001600160f81b03191691505f9050610a3784600581886111ef565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350610a799250859150610c9e9050565b15610ac65760405162461bcd60e51b815260206004820152601e60248201527f46756e6374696f6e2073656c6563746f7220616c7265616479207573656400006044820152606401610113565b6040805180820182526001600160a01b038881168083526001600160f81b0319861660208085019182526001600160e01b031989165f9081525f51602061124f5f395f51905f5290915285902093518454915160f81c600160a01b026001600160a81b03199092169316929092179190911790915590516306d61fe760e41b8152636d61fe7090610b5b908490600401610e0c565b5f604051808303815f87803b158015610b72575f5ffd5b505af1158015610b84573d5f5f3e3d5ffd5b50505050505050505050565b5f60016001600160a01b03831614801590610bc357506001600160a01b038281165f908152602085905260409020541615155b9392505050565b6001600160a01b0381161580610be957506001600160a01b0381166001145b15610c1257604051637c84ecfb60e01b81526001600160a01b0382166004820152602401610113565b6001600160a01b038181165f908152602084905260409020541615610c5557604051631034f46960e21b81526001600160a01b0382166004820152602401610113565b60015f818152602093909352604080842080546001600160a01b039485168087529286208054959091166001600160a01b03199586161790559190935280549091169091179055565b6001600160e01b0319165f9081525f51602061124f5f395f51905f5260205260409020546001600160a01b0316151590565b5f5f83601f840112610ce0575f5ffd5b50813567ffffffffffffffff811115610cf7575f5ffd5b6020830191508360208260051b8501011115610487575f5ffd5b5f5f5f5f5f5f5f6080888a031215610d27575f5ffd5b873567ffffffffffffffff811115610d3d575f5ffd5b610d498a828b01610cd0565b909850965050602088013567ffffffffffffffff811115610d68575f5ffd5b610d748a828b01610cd0565b909650945050604088013567ffffffffffffffff811115610d93575f5ffd5b88016040818b031215610da4575f5ffd5b9250606088013567ffffffffffffffff811115610dbf575f5ffd5b610dcb8a828b01610cd0565b989b979a50959850939692959293505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610bc36020830184610dde565b6001600160a01b0381168114610e32575f5ffd5b50565b5f5f60408385031215610e46575f5ffd5b8235610e5181610e1e565b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b81811015610ea15783516001600160a01b0316835260209384019390920191600101610e7a565b50506001600160a01b039490941660209390930192909252509092915050565b5f5f5f60408486031215610ed3575f5ffd5b8335610ede81610e1e565b9250602084013567ffffffffffffffff811115610ef9575f5ffd5b8401601f81018613610f09575f5ffd5b803567ffffffffffffffff811115610f1f575f5ffd5b866020828401011115610f30575f5ffd5b939660209190910195509293505050565b5f60208284031215610f51575f5ffd5b81356001600160e01b031981168114610bc3575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135610f9c81610e1e565b6001600160a01b03168352602082013536839003601e19018112610fbe575f5ffd5b820160208101903567ffffffffffffffff811115610fda575f5ffd5b803603821315610fe8575f5ffd5b60406020860152610ffd604086018284610f68565b95945050505050565b5f8383855260208501945060208460051b820101835f5b8681101561106557838303601f19018852813536879003603e19018112611042575f5ffd5b61104e84888301610f90565b6020998a019990945092909201915060010161101d565b50909695505050505050565b608081525f61108460808301898b611006565b828103602084015261109781888a611006565b905082810360408401526110ab8187610f90565b905082810360608401526110c0818587611006565b9a9950505050505050505050565b6001600160a01b03831681526040602082018190525f906110f190830184610dde565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112611121575f5ffd5b9190910192915050565b5f6020828403121561113b575f5ffd5b8135610bc381610e1e565b5f5f8335601e1984360301811261115b575f5ffd5b83018035915067ffffffffffffffff821115611175575f5ffd5b602001915036819003821315610487575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016111c2576111c261119d565b5060010190565b818103818111156103955761039561119d565b602081525f6110f1602083018486610f68565b5f5f858511156111fd575f5ffd5b83861115611209575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015611247576001600160e01b0319600485900360031b81901b82161691505b509291505056fee3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a902a2646970667358221220840aaf482814aab1ad892b5651c64fa9e92a08ceec981e947f5bad9f932b5d3b64736f6c634300081c0033"; + hex"6080604052348015600e575f5ffd5b506112a48061001c5f395ff3fe60806040526004361061007e575f3560e01c80636b0d5cc41161004d5780636b0d5cc414610271578063b0d691fe14610290578063ea5f61d0146102b2578063eac9b20d146102d157610085565b80630a664dba146101c85780635e87556d146101f95780635faac46b14610225578063642219af1461025257610085565b3661008557005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a02821417156100b057806020526020603cf35b505f80356001600160e01b03191681525f51602061124f5f395f51905f526020526040902080546001600160a01b03811690600160a01b900460f81b8161011c57604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b61012a81607f60f91b610384565b1561017b5760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa905061016a3d60408051918201905290565b3d5f823e81610177573d81fd5b3d81f35b610185815f610384565b156101c65760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af1905061016a3d60408051918201905290565b005b3480156101d3575f5ffd5b506101dc61039b565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610204575f5ffd5b50610218610213366004610d11565b6103c9565b6040516101f09190610e0c565b348015610230575f5ffd5b5061024461023f366004610e35565b610452565b6040516101f0929190610e5f565b34801561025d575f5ffd5b506101c661026c366004610d11565b61048e565b34801561027c575f5ffd5b506101c661028b366004610ec1565b6106d4565b34801561029b575f5ffd5b506f71727de22e5e9d8baf0edac6f37da0326101dc565b3480156102bd575f5ffd5b506102446102cc366004610e35565b6106e4565b3480156102dc575f5ffd5b506103566102eb366004610f41565b6040805180820182525f80825260209182018190526001600160e01b03199390931683525f51602061124f5f395f51905f528152918190208151808301909252546001600160a01b0381168252600160a01b900460f81b6001600160f81b0319169181019190915290565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016101f0565b6001600160f81b0319828116908216145b92915050565b5f6103c47fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005490565b905090565b606030306001600160a01b031663642219af8a8a8a8a8a8a8a6040516024016103f89796959493929190611071565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506040516020016104369291906110ce565b6040516020818303038152906040529050979650505050505050565b60605f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a90061048181868661070f565b92509250505b9250929050565b5f5b8681101561050c576105048888838181106104ad576104ad6110f9565b90506020028101906104bf919061110d565b6104cd90602081019061112b565b8989848181106104df576104df6110f9565b90506020028101906104f1919061110d565b6104ff906020810190611146565b6108b7565b600101610490565b505f5b848110156105cc575f86868381811061052a5761052a6110f9565b905060200281019061053c919061110d565b61054a90602081019061112b565b6001600160a01b0316146105c4576105c486868381811061056d5761056d6110f9565b905060200281019061057f919061110d565b61058d90602081019061112b565b87878481811061059f5761059f6110f9565b90506020028101906105b1919061110d565b6105bf906020810190611146565b610939565b60010161050f565b505f6105db602085018561112b565b6001600160a01b03161461060b5761060b6105f9602085018561112b565b6106066020860186611146565b610964565b5f5b818110156106ca575f838383818110610628576106286110f9565b905060200281019061063a919061110d565b61064890602081019061112b565b6001600160a01b0316146106c2576106c283838381811061066b5761066b6110f9565b905060200281019061067d919061110d565b61068b90602081019061112b565b84848481811061069d5761069d6110f9565b90506020028101906106af919061110d565b6106bd906020810190611146565b6109ea565b60010161060d565b5050505050505050565b6106df8383836108b7565b505050565b60605f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9016104818186865b60605f6001600160a01b03841660011480159061073357506107318585610b90565b155b1561075c57604051637c84ecfb60e01b81526001600160a01b0385166004820152602401610113565b825f0361077c5760405163f725081760e01b815260040160405180910390fd5b8267ffffffffffffffff81111561079557610795611189565b6040519080825280602002602001820160405280156107be578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b0382161580159061080257506001600160a01b038216600114155b801561080d57508381105b156108665781838281518110610825576108256110f9565b6001600160a01b039283166020918202929092018101919091529281165f90815292879052604090922054909116908061085e816111b1565b9150506107e0565b6001600160a01b03821660011480159061087f57505f81115b156108ab57826108906001836111c9565b815181106108a0576108a06110f9565b602002602001015191505b80835250935093915050565b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9006108e28185610bca565b6040516306d61fe760e41b81526001600160a01b03851690636d61fe709061091090869086906004016111dc565b5f604051808303815f87803b158015610927575f5ffd5b505af11580156106ca573d5f5f3e3d5ffd5b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9016108e28185610bca565b5f61098d7fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005490565b90506001600160a01b038116156109c25760405163741cbe0360e01b81526001600160a01b0382166004820152602401610113565b6108e2847fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e459820055565b5f6109f860048284866111ef565b610a0191611216565b90505f83836004818110610a1757610a176110f9565b909101356001600160f81b03191691505f9050610a3784600581886111ef565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350610a799250859150610c9e9050565b15610ac65760405162461bcd60e51b815260206004820152601e60248201527f46756e6374696f6e2073656c6563746f7220616c7265616479207573656400006044820152606401610113565b6040805180820182526001600160a01b038881168083526001600160f81b0319861660208085019182526001600160e01b031989165f9081525f51602061124f5f395f51905f5290915285902093518454915160f81c600160a01b026001600160a81b03199092169316929092179190911790915590516306d61fe760e41b8152636d61fe7090610b5b908490600401610e0c565b5f604051808303815f87803b158015610b72575f5ffd5b505af1158015610b84573d5f5f3e3d5ffd5b50505050505050505050565b5f60016001600160a01b03831614801590610bc357506001600160a01b038281165f908152602085905260409020541615155b9392505050565b6001600160a01b0381161580610be957506001600160a01b0381166001145b15610c1257604051637c84ecfb60e01b81526001600160a01b0382166004820152602401610113565b6001600160a01b038181165f908152602084905260409020541615610c5557604051631034f46960e21b81526001600160a01b0382166004820152602401610113565b60015f818152602093909352604080842080546001600160a01b039485168087529286208054959091166001600160a01b03199586161790559190935280549091169091179055565b6001600160e01b0319165f9081525f51602061124f5f395f51905f5260205260409020546001600160a01b0316151590565b5f5f83601f840112610ce0575f5ffd5b50813567ffffffffffffffff811115610cf7575f5ffd5b6020830191508360208260051b8501011115610487575f5ffd5b5f5f5f5f5f5f5f6080888a031215610d27575f5ffd5b873567ffffffffffffffff811115610d3d575f5ffd5b610d498a828b01610cd0565b909850965050602088013567ffffffffffffffff811115610d68575f5ffd5b610d748a828b01610cd0565b909650945050604088013567ffffffffffffffff811115610d93575f5ffd5b88016040818b031215610da4575f5ffd5b9250606088013567ffffffffffffffff811115610dbf575f5ffd5b610dcb8a828b01610cd0565b989b979a50959850939692959293505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610bc36020830184610dde565b6001600160a01b0381168114610e32575f5ffd5b50565b5f5f60408385031215610e46575f5ffd5b8235610e5181610e1e565b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b81811015610ea15783516001600160a01b0316835260209384019390920191600101610e7a565b50506001600160a01b039490941660209390930192909252509092915050565b5f5f5f60408486031215610ed3575f5ffd5b8335610ede81610e1e565b9250602084013567ffffffffffffffff811115610ef9575f5ffd5b8401601f81018613610f09575f5ffd5b803567ffffffffffffffff811115610f1f575f5ffd5b866020828401011115610f30575f5ffd5b939660209190910195509293505050565b5f60208284031215610f51575f5ffd5b81356001600160e01b031981168114610bc3575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135610f9c81610e1e565b6001600160a01b03168352602082013536839003601e19018112610fbe575f5ffd5b820160208101903567ffffffffffffffff811115610fda575f5ffd5b803603821315610fe8575f5ffd5b60406020860152610ffd604086018284610f68565b95945050505050565b5f8383855260208501945060208460051b820101835f5b8681101561106557838303601f19018852813536879003603e19018112611042575f5ffd5b61104e84888301610f90565b6020998a019990945092909201915060010161101d565b50909695505050505050565b608081525f61108460808301898b611006565b828103602084015261109781888a611006565b905082810360408401526110ab8187610f90565b905082810360608401526110c0818587611006565b9a9950505050505050505050565b6001600160a01b03831681526040602082018190525f906110f190830184610dde565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112611121575f5ffd5b9190910192915050565b5f6020828403121561113b575f5ffd5b8135610bc381610e1e565b5f5f8335601e1984360301811261115b575f5ffd5b83018035915067ffffffffffffffff821115611175575f5ffd5b602001915036819003821315610487575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016111c2576111c261119d565b5060010190565b818103818111156103955761039561119d565b602081525f6110f1602083018486610f68565b5f5f858511156111fd575f5ffd5b83861115611209575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015611247576001600160e01b0319600485900360031b81901b82161691505b509291505056fee3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a902a264697066735822122072b04b2f972cc253a90e875921f15eb7f82b8e0a5d58d5743d0eca74f391c67364736f6c634300081c0033"; bytes public constant ERC7579_RHINESTONE_TRAMPOLOINE_BYTECODE = hex"6080604052348015600e575f5ffd5b5061081d8061001c5f395ff3fe608060405260043610610058575f3560e01c80630a664dba146101b55780635faac46b146101e6578063b0d691fe14610213578063e1c7392a14610235578063ea5f61d014610249578063eac9b20d146102685761005f565b3661005f57005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a028214171561008a57806020526020603cf35b505f80356001600160e01b03191681527ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea046020526040902080546001600160a01b03811690600160a01b900460f81b8161010957604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b61011781607f60f91b61032e565b156101685760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa90506101573d60408051918201905290565b3d5f823e81610164573d81fd5b3d81f35b610172815f61032e565b156101b35760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af190506101573d60408051918201905290565b005b3480156101c0575f5ffd5b506101c9610345565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101f1575f5ffd5b5061020561020036600461068d565b610373565b6040516101dd9291906106c2565b34801561021e575f5ffd5b506f71727de22e5e9d8baf0edac6f37da0326101c9565b348015610240575f5ffd5b506101b36103ae565b348015610254575f5ffd5b5061020561026336600461068d565b610480565b348015610273575f5ffd5b50610300610282366004610724565b6040805180820182525f80825260209182018190526001600160e01b03199390931683527ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea048152918190208151808301909252546001600160a01b0381168252600160a01b900460f81b6001600160f81b0319169181019190915290565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016101dd565b6001600160f81b0319828116908216145b92915050565b5f61036e7f36e05829dd1b9a4411d96a3549582172d7f071c1c0db5c573fcf94eb284316085490565b905090565b60605f7ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea026103a28186866104ab565b92509250509250929050565b6103ea7334dedac925c00d63bd91800ff821e535fe59d6f57f36e05829dd1b9a4411d96a3549582172d7f071c1c0db5c573fcf94eb2843160855565b60408051737066f491ce8b5f782f315dfbd549f2107a32641360611b60208201528151601481830301815260348201928390526306d61fe760e41b9092527334dedac925c00d63bd91800ff821e535fe59d6f591636d61fe7091610451919060380161074b565b5f604051808303815f87803b158015610468575f5ffd5b505af115801561047a573d5f5f3e3d5ffd5b50505050565b60605f7ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea036103a28186865b60605f6001600160a01b0384166001148015906104cf57506104cd8585610653565b155b156104f857604051637c84ecfb60e01b81526001600160a01b0385166004820152602401610100565b825f036105185760405163f725081760e01b815260040160405180910390fd5b8267ffffffffffffffff81111561053157610531610780565b60405190808252806020026020018201604052801561055a578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b0382161580159061059e57506001600160a01b038216600114155b80156105a957508381105b1561060257818382815181106105c1576105c1610794565b6001600160a01b039283166020918202929092018101919091529281165f9081529287905260409092205490911690806105fa816107bc565b91505061057c565b6001600160a01b03821660011480159061061b57505f81115b15610647578261062c6001836107d4565b8151811061063c5761063c610794565b602002602001015191505b80835250935093915050565b5f60016001600160a01b0383161480159061068657506001600160a01b038281165f908152602085905260409020541615155b9392505050565b5f5f6040838503121561069e575f5ffd5b82356001600160a01b03811681146106b4575f5ffd5b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b818110156107045783516001600160a01b03168352602093840193909201916001016106dd565b50506001600160a01b039490941660209390930192909252509092915050565b5f60208284031215610734575f5ffd5b81356001600160e01b031981168114610686575f5ffd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016107cd576107cd6107a8565b5060010190565b8181038181111561033f5761033f6107a856fea26469706673582212208b8d179eb9f1d514092184d86650903af803b01f367d0d2440620538d93230ac64736f6c634300081b0033"; bytes public constant MSAPROXY_BYTECODE = From a882beb66c3b03fad5a68421469fac73687ab74f Mon Sep 17 00:00:00 2001 From: highskore Date: Tue, 4 Mar 2025 12:01:43 +0100 Subject: [PATCH 12/15] fix(IERC7579Module): make preValidationHookERC4337 non view --- src/accounts/common/interfaces/IERC7579Module.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/src/accounts/common/interfaces/IERC7579Module.sol b/src/accounts/common/interfaces/IERC7579Module.sol index a388e84d..25990c6d 100644 --- a/src/accounts/common/interfaces/IERC7579Module.sol +++ b/src/accounts/common/interfaces/IERC7579Module.sol @@ -158,6 +158,5 @@ interface IPreValidationHookERC4337 is IModule { bytes32 userOpHash ) external - view returns (bytes32 hookHash, bytes memory hookSignature); } From af069b62276e60fe4b96b04390e1e6d36aee58ae Mon Sep 17 00:00:00 2001 From: highskore Date: Thu, 6 Mar 2025 11:26:17 +0100 Subject: [PATCH 13/15] fix: change pvh to non view --- src/accounts/common/interfaces/IERC7579Module.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/src/accounts/common/interfaces/IERC7579Module.sol b/src/accounts/common/interfaces/IERC7579Module.sol index 25990c6d..55ebd16b 100644 --- a/src/accounts/common/interfaces/IERC7579Module.sol +++ b/src/accounts/common/interfaces/IERC7579Module.sol @@ -147,7 +147,6 @@ interface IPreValidationHookERC1271 is IModule { bytes calldata data ) external - view returns (bytes32 hookHash, bytes memory hookSignature); } From 033939ee621cb5c9ef9255d2621358ee861caccc Mon Sep 17 00:00:00 2001 From: highskore Date: Fri, 7 Mar 2025 09:48:18 +0100 Subject: [PATCH 14/15] chore: update 7579 btyecode --- src/accounts/common/interfaces/IERC7579Module.sol | 1 + src/deployment/precompiles/ERC7579Precompiles.sol | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/accounts/common/interfaces/IERC7579Module.sol b/src/accounts/common/interfaces/IERC7579Module.sol index 55ebd16b..25990c6d 100644 --- a/src/accounts/common/interfaces/IERC7579Module.sol +++ b/src/accounts/common/interfaces/IERC7579Module.sol @@ -147,6 +147,7 @@ interface IPreValidationHookERC1271 is IModule { bytes calldata data ) external + view returns (bytes32 hookHash, bytes memory hookSignature); } diff --git a/src/deployment/precompiles/ERC7579Precompiles.sol b/src/deployment/precompiles/ERC7579Precompiles.sol index b144d21c..335c4387 100644 --- a/src/deployment/precompiles/ERC7579Precompiles.sol +++ b/src/deployment/precompiles/ERC7579Precompiles.sol @@ -57,11 +57,11 @@ contract ERC7579Precompiles is BytecodeDeployer { /* solhint-disable max-line-length */ bytes public constant ERC7579_BYTECODE = - hex"6080604052348015600e575f5ffd5b506143d38061001c5f395ff3fe60806040526004361061012d575f3560e01c80639517e29f116100aa578063d691c9641161006e578063d691c9641461048d578063e9ae5c53146104ad578063ea5f61d0146104c0578063eab77e17146104df578063eac9b20d146104fe578063f2dc691d1461054b57610134565b80639517e29f146103db5780639cfd7cff146103ee578063a71763a814610439578063b0d691fe1461044c578063d03c79141461046e57610134565b8063492a88a2116100f1578063492a88a2146103535780634b6a1419146103675780635faac46b1461037a5780638626e88b146103a75780638dd7712f146103c857610134565b80630a664dba1461027b578063112d3a7d146102ac5780631626ba7e146102db57806319822f7c146103135780631de6f24f1461033457610134565b3661013457005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a028214171561015f57806020526020603cf35b505f61016961056a565b5f80356001600160e01b03191681526002919091016020526040902080549091506001600160a01b03811690600160a01b900460f81b816101cf57604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b6101dd81607f60f91b61058e565b1561022e5760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa905061021d3d60408051918201905290565b3d5f823e8161022a573d81fd5b3d81f35b610238815f61058e565b156102795760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af1905061021d3d60408051918201905290565b005b348015610286575f5ffd5b5061028f6105a5565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102b7575f5ffd5b506102cb6102c63660046138bb565b6105c0565b60405190151581526020016102a3565b3480156102e6575f5ffd5b506102fa6102f5366004613912565b610641565b6040516001600160e01b031990911681526020016102a3565b610326610321366004613a3e565b610725565b6040519081526020016102a3565b34801561033f575f5ffd5b5061028f61034e366004613b72565b610938565b34801561035e575f5ffd5b506102cb610942565b610279610375366004613b89565b610971565b348015610385575f5ffd5b50610399610394366004613bc7565b610a14565b6040516102a3929190613bf1565b3480156103b2575f5ffd5b506103bb610a3a565b6040516102a39190613c53565b6102796103d6366004613c95565b610ab1565b6102796103e93660046138bb565b610b7c565b3480156103f9575f5ffd5b50604080518082018252601b81527f754d53412e616476616e6365642f77697468486f6f6b2e76302e310000000000602082015290516102a39190613cfb565b6102796104473660046138bb565b61104f565b348015610457575f5ffd5b506f71727de22e5e9d8baf0edac6f37da03261028f565b348015610479575f5ffd5b506102cb610488366004613b72565b6112f4565b6104a061049b366004613912565b61138f565b6040516102a39190613d0d565b6102796104bb366004613912565b611a9b565b3480156104cb575f5ffd5b506103996104da366004613bc7565b611ed6565b3480156104ea575f5ffd5b506102796104f9366004613d70565b611ef2565b348015610509575f5ffd5b5061051d610518366004613e1e565b611faf565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016102a3565b348015610556575f5ffd5b506102cb610565366004613b72565b61201c565b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a90090565b6001600160f81b0319828116908216145b92915050565b5f6105bb5f51602061435e5f395f51905f525490565b905090565b5f600185036105d9576105d284612085565b9050610639565b600285036105ea576105d2846120a2565b60038503610607576105d261060183850185613e1e565b856120bb565b60048503610618576105d2846120f7565b60088514806106275750600985145b15610636576105d28486612127565b505f5b949350505050565b5f806106506014828587613e39565b61065991613e60565b60601c905061066781612085565b61068f57604051635c93ff2f60e11b81526001600160a01b03821660048201526024016101c6565b60606106a7866106a2866014818a613e39565b61214c565b604051637aa8f17760e11b815291975091506001600160a01b0383169063f551e2ee906106dc9033908a908690600401613ea0565b602060405180830381865afa1580156106f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071b9190613ecf565b9695505050505050565b5f336f71727de22e5e9d8baf0edac6f37da0321461075657604051635629665f60e11b815260040160405180910390fd5b815f5f866020015190508060601c91506107936040518060400160405280600b81526020016a02b30b634b230ba37b91d160ad1b81525083612232565b61079c82612085565b610899576107de6040518060400160405280601781526020017f56616c696461746f72206e6f7420696e7374616c6c656400000000000000000081525061227b565b6107e66122c1565b61088e576108286040518060400160405280601781526020017f4163636f756e74206e6f7420696e697469616c697a656400000000000000000081525061227b565b5f61086561085a886020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b8961010001516122ed565b90506001600160a01b03811630146108835760019450505050610920565b5f9450505050610920565b600193505050610920565b6108a4868887612379565b610100890152604051639700320360e01b81529096506001600160a01b038316906397003203906108db908a908a90600401613f8a565b6020604051808303815f875af11580156108f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091b9190613fab565b935050505b8015610930575f385f3884335af1505b509392505050565b5f61059f826123d7565b5f33301461096357604051630e93a1f960e01b815260040160405180910390fd5b61096b612433565b50600190565b3330146109805761098061246a565b6109886124d8565b303f7feadcdba66a79ab5dce91622d1d75c8cff5cff0b96944c3bf1072cd08ce0183291480156109f1576109db7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9006124f8565b6109f15f51602061435e5f395f51905f526124f8565b5f806109ff84860186613fc2565b91509150610a0d828261254b565b5050505050565b60605f5f610a2061056a565b9050610a2d8186866125b3565b92509250505b9250929050565b7fc473de86d0138e06e4d4918a106463a7cc005258d2e21915272bcb4594c18900805460408051602080840282018101909252828152606093929091839190830182828015610aa657602002820191905f5260205f20905b815481526020019060010190808311610a92575b505050505091505090565b336f71727de22e5e9d8baf0edac6f37da03214610ae157604051635629665f60e11b815260040160405180910390fd5b365f610af0606085018561400e565b610afe916004908290613e39565b915091505f306001600160a01b03168383604051610b1d929190614050565b5f60405180830381855af49150503d805f8114610b55576040519150601f19603f3d011682016040523d82523d5f602084013e610b5a565b606091505b5050905080610a0d57604051632b3f6d1160e21b815260040160405180910390fd5b336f71727de22e5e9d8baf0edac6f37da0321480610b9957503330145b610bb657604051635629665f60e11b815260040160405180910390fd5b5f610bcc5f51602061435e5f395f51905f525490565b90506001600160a01b038116610dab575f54849086906001600160a01b03168015610c4e576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b158015610c37575f5ffd5b505afa158015610c49573d5f5f3e3d5ffd5b505050505b60405163ecd0596160e01b8152600481018990526001600160a01b0388169063ecd0596190602401602060405180830381865afa158015610c91573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb5919061405f565b610cd5576040516369c9a24560e11b8152600481018990526024016101c6565b60018803610ced57610ce887878761275a565b610d62565b60028803610d0057610ce887878761279d565b60038803610d1357610ce88787876127b5565b60048803610d2657610ce8878787612933565b6008881480610d355750600988145b15610d4657610ce887898888612993565b60405163041c38b360e41b8152600481018990526024016101c6565b604080518981526001600160a01b03891660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123910160405180910390a1505050610a0d565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590610ddf9033903490869036906004016140a6565b5f604051808303815f875af1158015610dfa573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e21919081019061411a565b5f54909150859087906001600160a01b03168015610e96576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b158015610e7f575f5ffd5b505afa158015610e91573d5f5f3e3d5ffd5b505050505b60405163ecd0596160e01b8152600481018a90526001600160a01b0389169063ecd0596190602401602060405180830381865afa158015610ed9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd919061405f565b610f1d576040516369c9a24560e11b8152600481018a90526024016101c6565b60018903610f3557610f3088888861275a565b610faa565b60028903610f4857610f3088888861279d565b60038903610f5b57610f308888886127b5565b60048903610f6e57610f30888888612933565b6008891480610f7d5750600989145b15610f8e57610f30888a8989612993565b60405163041c38b360e41b8152600481018a90526024016101c6565b604080518a81526001600160a01b038a1660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123910160405180910390a15050604051630b9dfbed60e11b81526001600160a01b038416915063173bf7da9061101a908490600401613cfb565b5f604051808303815f87803b158015611031575f5ffd5b505af1158015611043573d5f5f3e3d5ffd5b50505050505050505050565b336f71727de22e5e9d8baf0edac6f37da032148061106c57503330145b61108957604051635629665f60e11b815260040160405180910390fd5b5f61109f5f51602061435e5f395f51905f525490565b90506001600160a01b03811661118257600185036110c7576110c2848484612a99565b61113c565b600285036110da576110c2848484612aee565b600385036110ed576110c2848484612b0a565b60048503611100576110c2848484612d0f565b600885148061110f5750600985145b15611120576110c284868585612d84565b60405163041c38b360e41b8152600481018690526024016101c6565b604080518681526001600160a01b03861660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e910160405180910390a1610a0d565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f6025906111b69033903490869036906004016140a6565b5f604051808303815f875af11580156111d1573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111f8919081019061411a565b9050600186036112125761120d858585612a99565b611287565b600286036112255761120d858585612aee565b600386036112385761120d858585612b0a565b6004860361124b5761120d858585612d0f565b600886148061125a5750600986145b1561126b5761120d85878686612d84565b60405163041c38b360e41b8152600481018790526024016101c6565b604080518781526001600160a01b03871660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e910160405180910390a1604051630b9dfbed60e11b81526001600160a01b0383169063173bf7da9061101a908490600401613cfb565b5f81600881901b61130982600160f81b61058e565b156113175760019250611358565b611321825f61058e565b1561132f5760019250611358565b611341826001600160f81b031961058e565b1561134f5760019250611358565b505f9392505050565b611362815f61058e565b156113705760019250611388565b61137e81600160f81b61058e565b1561134f57600192505b5050919050565b60605f61139a61056a565b60010190506113a98133612e78565b6113c857604051635c93ff2f60e11b81523360048201526024016101c6565b5f6113de5f51602061435e5f395f51905f525490565b90506001600160a01b038116611715575f5433906002906001600160a01b03168015611461576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b15801561144a575f5ffd5b505afa15801561145c573d5f5f3e3d5ffd5b505050505b88600881901b61147582600160f81b61058e565b156114ea57365f6114868c8c612eb0565b9092509050611495835f61058e565b156114ab576114a48282612f46565b99506114e3565b6114b983600160f81b61058e565b156114c8576114a4828261301d565b826040516308c3ee0360e11b81526004016101c6919061414b565b505061170b565b6114f4825f61058e565b1561163b575f5f365f6115078e8e613148565b6040805160018082528183019092529498509296509094509250816020015b6060815260200190600190039081611526579050509b505f611548868261058e565b1561157b5761155985858585613198565b8d5f8151811061156b5761156b614160565b6020026020010181905250611631565b61158986600160f81b61058e565b156116165761159a858585856131cb565b8e5f815181106115ac576115ac614160565b6020908102919091010152905080611611577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8e5f815181106115f2576115f2614160565b6020026020010151604051611608929190614174565b60405180910390a15b611631565b856040516308c3ee0360e11b81526004016101c6919061414b565b505050505061170b565b61164d826001600160f81b031961058e565b156116f0575f6116606014828c8e613e39565b61166991613e60565b60601c9050365f8c8c601490809261168393929190613e39565b9092509050611692845f61058e565b156116a8576116a28383836131f9565b506116e8565b6116b684600160f81b61058e565b156116cd576116c683838361322a565b50506116e8565b836040516308c3ee0360e11b81526004016101c6919061414b565b50505061170b565b81604051632e5bf3f960e21b81526004016101c6919061414b565b5050505050611a92565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f6025906117499033903490869036906004016140a6565b5f604051808303815f875af1158015611764573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261178b919081019061411a565b5f5490915033906002906001600160a01b03168015611801576040516396fb721760e01b81526001600160a01b038481166004830152602482018490528216906396fb7217906044015f6040518083038186803b1580156117ea575f5ffd5b505afa1580156117fc573d5f5f3e3d5ffd5b505050505b89600881901b61181582600160f81b61058e565b1561186f57365f6118268d8d612eb0565b9092509050611835835f61058e565b1561184b576118448282612f46565b9a50611868565b61185983600160f81b61058e565b156114c857611844828261301d565b5050611a32565b611879825f61058e565b156119a0575f5f365f61188c8f8f613148565b6040805160018082528183019092529498509296509094509250816020015b60608152602001906001900390816118ab579050509c505f6118cd868261058e565b15611900576118de85858585613198565b8e5f815181106118f0576118f0614160565b6020026020010181905250611996565b61190e86600160f81b61058e565b156116165761191f858585856131cb565b8f5f8151811061193157611931614160565b6020908102919091010152905080611996577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8f5f8151811061197757611977614160565b602002602001015160405161198d929190614174565b60405180910390a15b5050505050611a32565b6119b2826001600160f81b031961058e565b156116f0575f6119c56014828d8f613e39565b6119ce91613e60565b60601c9050365f8d8d60149080926119e893929190613e39565b90925090506119f7845f61058e565b15611a0d57611a078383836131f9565b50611a2e565b611a1b84600160f81b61058e565b156116cd57611a2b83838361322a565b50505b5050505b5050604051630b9dfbed60e11b81526001600160a01b038616935063173bf7da9250611a6391508490600401613cfb565b5f604051808303815f87803b158015611a7a575f5ffd5b505af1158015611a8c573d5f5f3e3d5ffd5b50505050505b50509392505050565b336f71727de22e5e9d8baf0edac6f37da0321480611ab857503330145b611ad557604051635629665f60e11b815260040160405180910390fd5b5f611aeb5f51602061435e5f395f51905f525490565b90506001600160a01b038116611c8e5783600881901b611b0f82600160f81b61058e565b15611b6857365f611b208787612eb0565b9092509050611b2f835f61058e565b15611b4457611b3e8282612f46565b50611b61565b611b5283600160f81b61058e565b156114c857611b3e828261301d565b5050611c87565b611b72825f61058e565b15611bfb575f5f365f611b858989613148565b9350935093509350611b9a855f60f81b61058e565b15611bb157611bab84848484613198565b50611bf2565b611bbf85600160f81b61058e565b15611bd757611bd0848484846131cb565b5050611bf2565b846040516308c3ee0360e11b81526004016101c6919061414b565b50505050611c87565b611c0d826001600160f81b031961058e565b156116f0575f611c206014828789613e39565b611c2991613e60565b60601c9050365f611c3d876014818b613e39565b9092509050611c4c845f61058e565b15611c6257611c5c8383836131f9565b50611c83565b611c7084600160f81b61058e565b156116cd57611c8083838361322a565b50505b5050505b5050611ed0565b60405163d68f602560e01b81525f906001600160a01b0383169063d68f602590611cc29033903490869036906004016140a6565b5f604051808303815f875af1158015611cdd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d04919081019061411a565b905084600881901b611d1a82600160f81b61058e565b15611d7357365f611d2b8888612eb0565b9092509050611d3a835f61058e565b15611d4f57611d498282612f46565b50611d6c565b611d5d83600160f81b61058e565b156114c857611d49828261301d565b5050611e73565b611d7d825f61058e565b15611de7575f5f365f611d908a8a613148565b9350935093509350611da5855f60f81b61058e565b15611dbc57611db684848484613198565b50611dde565b611dca85600160f81b61058e565b15611bd757611ddb848484846131cb565b50505b50505050611e73565b611df9826001600160f81b031961058e565b156116f0575f611e0c601482888a613e39565b611e1591613e60565b60601c9050365f611e29886014818c613e39565b9092509050611e38845f61058e565b15611e4e57611e488383836131f9565b50611e6f565b611e5c84600160f81b61058e565b156116cd57611e6c83838361322a565b50505b5050505b5050604051630b9dfbed60e11b81526001600160a01b0383169063173bf7da90611ea1908490600401613cfb565b5f604051808303815f87803b158015611eb8575f5ffd5b505af1158015611eca573d5f5f3e3d5ffd5b50505050505b50505050565b60605f5f611ee261056a565b6001019050610a2d8186866125b3565b336f71727de22e5e9d8baf0edac6f37da0321480611f0f57503330145b611f2c57604051635629665f60e11b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0386161790558115611ed05760405163f05c04e160e01b81526001600160a01b0385169063f05c04e190611f7c9084908790879060040161418c565b5f604051808303815f87803b158015611f93575f5ffd5b505af1158015611fa5573d5f5f3e3d5ffd5b5050505050505050565b604080518082019091525f8082526020820152611fca61056a565b6001600160e01b0319929092165f908152600290920160209081526040928390208351808501909452546001600160a01b0381168452600160a01b900460f81b6001600160f81b031916908301525090565b5f6001820361202d57506001919050565b6002820361203d57506001919050565b6003820361204d57506001919050565b6004820361205d57506001919050565b600882148061206c5750600982145b1561207957506001919050565b505f919050565b919050565b5f5f61208f61056a565b905061209b8184612e78565b9392505050565b5f5f6120ac61056a565b600101905061209b8184612e78565b5f5f6120c561056a565b6001600160e01b0319949094165f908152600290940160205250506040909120546001600160a01b0390811691161490565b5f816001600160a01b03166121175f51602061435e5f395f51905f525490565b6001600160a01b03161492915050565b5f826001600160a01b031661213b836123d7565b6001600160a01b0316149392505050565b5f60605f61215a60086123d7565b90506001600160a01b0381166121b15785858581818080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525095985091965061222a95505050505050565b604051637a0468b760e01b81526001600160a01b03821690637a0468b7906121e39033908a908a908a906004016140a6565b5f60405180830381865afa1580156121fd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261222491908101906141e3565b92509250505b935093915050565b612277828260405160240161224892919061421c565b60408051601f198184030181529190526020810180516001600160e01b031663319af33360e01b179052613256565b5050565b6122be8160405160240161228f9190613cfb565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052613256565b50565b5f5f6122cb61056a565b60015f90815260209190915260409020546001600160a01b0316151592915050565b5f604051825160408114612309576041811461232a5750612365565b604084015160ff81901c601b016020526001600160ff1b031660605261233d565b60608401515f1a60205260408401516060525b50835f5260208301516040526020600160805f60015afa5191505f606052806040523d612372575b638baa579f5f526004601cfd5b5092915050565b5f60605f61238760096123d7565b90506001600160a01b0381166123a757505050610100820151839061222a565b60405163e24f8f9360e01b81526001600160a01b0382169063e24f8f93906121e390889088908b90600401614245565b5f5f51602061437e5f395f51905f5260071983016123ff57546001600160a01b031692915050565b6009830361241a57600101546001600160a01b031692915050565b604051635691922f60e01b815260040160405180910390fd5b61243b61325f565b612443613347565b61246061245b5f51602061435e5f395f51905f525490565b613432565b6124686124d8565b565b5f60ff1961249960017ff63b257b7881773a84d328ab92140e19ab791f7b439c76ba9837aa0d6ad30af061427d565b6040516020016124ab91815260200190565b60405160208183030381529060405280519060200120169050805c806122775763aed595955f526004601cfd5b5f6124e161056a565b90506124ef816001016134f9565b6122be816134f9565b7fc473de86d0138e06e4d4918a106463a7cc005258d2e21915272bcb4594c1890080546001810182555f919091527fdb3901c0862740f848a4aebebd6b3d645e6b3bc6adf2cf46e83a846b3a3439330155565b5f826001600160a01b0316826040516125649190614290565b5f60405180830381855af49150503d805f811461259c576040519150601f19603f3d011682016040523d82523d5f602084013e6125a1565b606091505b50509050806125ae575f5ffd5b505050565b60605f6001600160a01b0384166001148015906125d757506125d58585612e78565b155b1561260057604051637c84ecfb60e01b81526001600160a01b03851660048201526024016101c6565b825f036126205760405163f725081760e01b815260040160405180910390fd5b826001600160401b0381111561263857612638613959565b604051908082528060200260200182016040528015612661578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b038216158015906126a557506001600160a01b038216600114155b80156126b057508381105b1561270957818382815181106126c8576126c8614160565b6001600160a01b039283166020918202929092018101919091529281165f908152928790526040909220549091169080612701816142a6565b915050612683565b6001600160a01b03821660011480159061272257505f81115b1561274e578261273360018361427d565b8151811061274357612743614160565b602002602001015191505b80835250935093915050565b5f61276361056a565b905061276f8185613554565b6040516306d61fe760e41b81526001600160a01b03851690636d61fe7090611f7c90869086906004016142be565b5f6127a661056a565b600101905061276f8185613554565b5f6127c36004828486613e39565b6127cc916142d1565b90505f838360048181106127e2576127e2614160565b909101356001600160f81b03191691505f90506128028460058188613e39565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092935061284492508591506136289050565b156128915760405162461bcd60e51b815260206004820152601e60248201527f46756e6374696f6e2073656c6563746f7220616c72656164792075736564000060448201526064016101c6565b604080518082019091526001600160a01b03871681526001600160f81b0319831660208201526128bf61056a565b6001600160e01b031985165f908152600291909101602090815260409182902083518154949092015160f81c600160a01b026001600160a81b03199094166001600160a01b039283161793909317909255516306d61fe760e41b815290871690636d61fe709061101a908490600401613cfb565b5f6129495f51602061435e5f395f51905f525490565b90506001600160a01b0381161561297e5760405163741cbe0360e01b81526001600160a01b03821660048201526024016101c6565b61276f845f51602061435e5f395f51905f5255565b5f51602061437e5f395f51905f525f6129ab856123d7565b90506001600160a01b038116156129e05760405163786ae23560e01b81526001600160a01b03821660048201526024016101c6565b6129ea8686613660565b60088503612a555781546040516306d61fe760e41b81526001600160a01b0390911690636d61fe7090612a2390879087906004016142be565b5f604051808303815f87803b158015612a3a575f5ffd5b505af1158015612a4c573d5f5f3e3d5ffd5b50505050612a91565b60098503612a915760018201546040516306d61fe760e41b81526001600160a01b0390911690636d61fe709061101a90879087906004016142be565b505050505050565b5f612aa261056a565b90505f80612ab284860186613fc2565b9092509050612ac28383886136c3565b604051638a91b0e360e01b81526001600160a01b03871690638a91b0e39061101a908490600401613cfb565b5f612af761056a565b60010190505f80612ab284860186613fc2565b5f612b186004828486613e39565b612b21916142d1565b90505f612b318360048187613e39565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350612b7392508491506136289050565b612bbf5760405162461bcd60e51b815260206004820152601a60248201527f46756e6374696f6e2073656c6563746f72206e6f74207573656400000000000060448201526064016101c6565b5f612bc861056a565b6001600160e01b031984165f90815260029190910160209081526040918290208251808401909352546001600160a01b03808216808552600160a01b90920460f81b6001600160f81b03191692840192909252919250871614612c805760405162461bcd60e51b815260206004820152602a60248201527f46756e6374696f6e2073656c6563746f72206e6f74207573656420627920746860448201526934b9903430b7323632b960b11b60648201526084016101c6565b604080518082019091525f8082526020820152612c9b61056a565b6001600160e01b031985165f908152600291909101602090815260409182902083518154949092015160f81c600160a01b026001600160a81b03199094166001600160a01b03928316179390931790925551638a91b0e360e01b815290871690638a91b0e39061101a908590600401613cfb565b612d245f5f51602061435e5f395f51905f5255565b604051638a91b0e360e01b81526001600160a01b03841690638a91b0e390612d5290859085906004016142be565b5f604051808303815f87803b158015612d69575f5ffd5b505af1158015612d7b573d5f5f3e3d5ffd5b50505050505050565b5f51602061437e5f395f51905f52600884148015612dae575080546001600160a01b038681169116145b15612e16578054604051638a91b0e360e01b81526001600160a01b0390911690638a91b0e390612de490869086906004016142be565b5f604051808303815f87803b158015612dfb575f5ffd5b505af1158015612e0d573d5f5f3e3d5ffd5b50505050612e6e565b600984148015612e35575060018101546001600160a01b038681169116145b1561241a576001810154604051638a91b0e360e01b81526001600160a01b0390911690638a91b0e390612de490869086906004016142be565b610a0d5f85613660565b5f60016001600160a01b0383161480159061209b5750506001600160a01b039081165f90815260209290925260409091205416151590565b365f833580850160208587010360208201945081359350808460051b8301118360401c1715612ee65763ba597e7e5f526004601cfd5b8315612f3c578392505b6001830392508260051b850135915081850160408101358082018381358201118460408501111782861782351760401c1715612f335763ba597e7e5f526004601cfd5b50505082612ef0575b5050509250929050565b606081806001600160401b03811115612f6157612f61613959565b604051908082528060200260200182016040528015612f9457816020015b6060815260200190600190039081612f7f5790505b5091505f5b818110156130155736858583818110612fb457612fb4614160565b9050602002810190612fc69190614307565b9050612fef612fd86020830183614325565b6020830135612fea604085018561400e565b613198565b84838151811061300157613001614160565b602090810291909101015250600101612f99565b505092915050565b606081806001600160401b0381111561303857613038613959565b60405190808252806020026020018201604052801561306b57816020015b60608152602001906001900390816130565790505b5091505f5b81811015613015573685858381811061308b5761308b614160565b905060200281019061309d9190614307565b90505f6130c76130b06020840184614325565b60208401356130c2604086018661400e565b6131cb565b8685815181106130d9576130d9614160565b602090810291909101015290508061313e577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb78386858151811061311f5761311f614160565b6020026020010151604051613135929190614174565b60405180910390a15b5050600101613070565b5f8036816131596014828789613e39565b61316291613e60565b60601c9350613175603460148789613e39565b61317e91614340565b925061318d8560348189613e39565b949793965094505050565b604051818382375f38838387895af16131b3573d5f823e3d81fd5b3d8152602081013d5f823e3d01604052949350505050565b6040515f90828482375f388483888a5af191503d8152602081013d5f823e3d81016040525094509492505050565b604051818382375f388383875af4613213573d5f823e3d81fd5b3d8152602081013d5f823e3d016040529392505050565b6040515f90828482375f388483885af491503d8152602081013d5f823e3d810160405250935093915050565b6122be81613796565b5f61326861056a565b90505f6132768260016137b5565b90505b6001600160a01b03811660011461333e57604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b1580156132cf575f5ffd5b505af19250505080156132e0575060015b61332d57604080516001600160a01b0383168152602081018290525f8183015290517f6c31ee2929752d85a6dc461efcf817aa81394aff41db1856ebfd71679fffc5709181900360600190a15b61333782826137b5565b9050613279565b61227782613808565b5f61335061056a565b60010190505f61336a6001836137b590919063ffffffff16565b90505b6001600160a01b03811660011461333e57604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b1580156133c3575f5ffd5b505af19250505080156133d4575060015b61342157604080516001600160a01b0383168152602081018290525f8183015290517ffdea4600cf09065ff861064d4cd43cde3fae2134d9fbe6d66fd77cc67135c8829181900360600190a15b61342b82826137b5565b905061336d565b6001600160a01b038116156122be57604051638a91b0e360e01b8152602060048201525f60248201526001600160a01b03821690638a91b0e3906044015f604051808303815f87803b158015613486575f5ffd5b505af1925050508015613497575060015b6134e457604080516001600160a01b0383168152602081018290525f8183015290517f57af23cbd8e148da6020d15e1ff9fb3c531aa9003d6bab6915013a7d8fd032369181900360600190a15b6122be5f5f51602061435e5f395f51905f5255565b60015f908152602082905260409020546001600160a01b031615613530576040516329e42f3360e11b815260040160405180910390fd5b60015f818152602092909252604090912080546001600160a01b0319169091179055565b6001600160a01b038116158061357357506001600160a01b0381166001145b1561359c57604051637c84ecfb60e01b81526001600160a01b03821660048201526024016101c6565b6001600160a01b038181165f9081526020849052604090205416156135df57604051631034f46960e21b81526001600160a01b03821660048201526024016101c6565b60015f818152602093909352604080842080546001600160a01b039485168087529286208054959091166001600160a01b03199586161790559190935280549091169091179055565b5f5f61363261056a565b6001600160e01b03199093165f908152600293909301602052505060409020546001600160a01b0316151590565b5f51602061437e5f395f51905f5260071982016136975780546001600160a01b0384166001600160a01b0319909116178155505050565b6009820361241a576001810180546001600160a01b0385166001600160a01b0319909116179055505050565b6001600160a01b03811615806136e257506001600160a01b0381166001145b1561370b57604051637c84ecfb60e01b81526001600160a01b03831660048201526024016101c6565b6001600160a01b038281165f9081526020859052604090205481169082161461375257604051637c84ecfb60e01b81526001600160a01b03821660048201526024016101c6565b6001600160a01b039081165f8181526020949094526040808520805494841686529085208054949093166001600160a01b0319948516179092559092528154169055565b5f6a636f6e736f6c652e6c6f6790505f5f835160208501845afa505050565b5f6001600160a01b0382166137e857604051637c84ecfb60e01b81526001600160a01b03831660048201526024016101c6565b506001600160a01b039081165f9081526020929092526040909120541690565b60015f908152602082905260409020546001600160a01b03165b6001600160a01b03811615612277576001600160a01b039081165f90815260208390526040902080546001600160a01b0319811690915516613822565b6001600160a01b03811681146122be575f5ffd5b80356120808161385f565b5f5f83601f84011261388e575f5ffd5b5081356001600160401b038111156138a4575f5ffd5b602083019150836020828501011115610a33575f5ffd5b5f5f5f5f606085870312156138ce575f5ffd5b8435935060208501356138e08161385f565b925060408501356001600160401b038111156138fa575f5ffd5b6139068782880161387e565b95989497509550505050565b5f5f5f60408486031215613924575f5ffd5b8335925060208401356001600160401b03811115613940575f5ffd5b61394c8682870161387e565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b038111828210171561399057613990613959565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139be576139be613959565b604052919050565b5f6001600160401b038211156139de576139de613959565b50601f01601f191660200190565b5f82601f8301126139fb575f5ffd5b8135613a0e613a09826139c6565b613996565b818152846020838601011115613a22575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f60608486031215613a50575f5ffd5b83356001600160401b03811115613a65575f5ffd5b84016101208187031215613a77575f5ffd5b613a7f61396d565b613a8882613873565b81526020828101359082015260408201356001600160401b03811115613aac575f5ffd5b613ab8888285016139ec565b60408301525060608201356001600160401b03811115613ad6575f5ffd5b613ae2888285016139ec565b6060830152506080828101359082015260a0808301359082015260c0808301359082015260e08201356001600160401b03811115613b1e575f5ffd5b613b2a888285016139ec565b60e0830152506101008201356001600160401b03811115613b49575f5ffd5b613b55888285016139ec565b610100830152509660208601359650604090950135949350505050565b5f60208284031215613b82575f5ffd5b5035919050565b5f5f60208385031215613b9a575f5ffd5b82356001600160401b03811115613baf575f5ffd5b613bbb8582860161387e565b90969095509350505050565b5f5f60408385031215613bd8575f5ffd5b8235613be38161385f565b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b81811015613c335783516001600160a01b0316835260209384019390920191600101613c0c565b50506001600160a01b039490941660209390930192909252509092915050565b602080825282518282018190525f918401906040840190835b81811015613c8a578351835260209384019390920191600101613c6c565b509095945050505050565b5f5f60408385031215613ca6575f5ffd5b82356001600160401b03811115613cbb575f5ffd5b83016101208186031215613be3575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61209b6020830184613ccd565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613d6457603f19878603018452613d4f858351613ccd565b94506020938401939190910190600101613d33565b50929695505050505050565b5f5f5f5f60608587031215613d83575f5ffd5b8435613d8e8161385f565b935060208501356001600160401b03811115613da8575f5ffd5b8501601f81018713613db8575f5ffd5b80356001600160401b03811115613dcd575f5ffd5b8760208260051b8401011115613de1575f5ffd5b60209190910193509150604085013560ff81168114613dfe575f5ffd5b939692955090935050565b6001600160e01b0319811681146122be575f5ffd5b5f60208284031215613e2e575f5ffd5b813561209b81613e09565b5f5f85851115613e47575f5ffd5b83861115613e53575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015612372576bffffffffffffffffffffffff1960149490940360031b84901b1690921692915050565b60018060a01b0384168152826020820152606060408201525f613ec66060830184613ccd565b95945050505050565b5f60208284031215613edf575f5ffd5b815161209b81613e09565b80516001600160a01b03168252602081015160208301525f60408201516101206040850152613f1d610120850182613ccd565b905060608301518482036060860152613f368282613ccd565b9150506080830151608085015260a083015160a085015260c083015160c085015260e083015184820360e0860152613f6e8282613ccd565b915050610100830151848203610100860152613ec68282613ccd565b604081525f613f9c6040830185613eea565b90508260208301529392505050565b5f60208284031215613fbb575f5ffd5b5051919050565b5f5f60408385031215613fd3575f5ffd5b8235613fde8161385f565b915060208301356001600160401b03811115613ff8575f5ffd5b614004858286016139ec565b9150509250929050565b5f5f8335601e19843603018112614023575f5ffd5b8301803591506001600160401b0382111561403c575f5ffd5b602001915036819003821315610a33575f5ffd5b818382375f9101908152919050565b5f6020828403121561406f575f5ffd5b8151801515811461209b575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201525f61071b60608301848661407e565b5f82601f8301126140dc575f5ffd5b81516140ea613a09826139c6565b8181528460208386010111156140fe575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561412a575f5ffd5b81516001600160401b0381111561413f575f5ffd5b610639848285016140cd565b6001600160f81b031991909116815260200190565b634e487b7160e01b5f52603260045260245ffd5b828152604060208201525f6106396040830184613ccd565b60ff8416815260406020820181905281018290525f8360608301825b858110156141d85782356141bb8161385f565b6001600160a01b03168252602092830192909101906001016141a8565b509695505050505050565b5f5f604083850312156141f4575f5ffd5b8251915060208301516001600160401b03811115614210575f5ffd5b614004858286016140cd565b604081525f61422e6040830185613ccd565b905060018060a01b03831660208301529392505050565b606081525f6142576060830186613eea565b60208301949094525060400152919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561059f5761059f614269565b5f82518060208501845e5f920191825250919050565b5f600182016142b7576142b7614269565b5060010190565b602081525f61063960208301848661407e565b80356001600160e01b03198116906004841015612372576001600160e01b031960049490940360031b84901b1690921692915050565b5f8235605e1983360301811261431b575f5ffd5b9190910192915050565b5f60208284031215614335575f5ffd5b813561209b8161385f565b8035602083101561059f575f19602084900360031b1b169291505056fecd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e4598200088e45215d3756b04bd240e41d75700a696139d5b53082481ffc3914e4840000a26469706673582212200ecbb5c01a4fb76482ae9158c584ef0c9c061949b52b095e41d0e02516c2a14064736f6c634300081c0033"; + hex"6080604052348015600e575f5ffd5b506175818061001c5f395ff3fe60806040526004361061012d575f3560e01c80639517e29f116100aa578063d691c9641161006e578063d691c96414610620578063e9ae5c5314610650578063ea5f61d01461066c578063eab77e17146106a9578063eac9b20d146106d1578063f2dc691d1461070d57610134565b80639517e29f146105585780639cfd7cff14610574578063a71763a81461059e578063b0d691fe146105ba578063d03c7914146105e457610134565b8063492a88a2116100f1578063492a88a21461048f5780634b6a1419146104b95780635faac46b146104d55780638626e88b146105125780638dd7712f1461053c57610134565b80630a664dba14610381578063112d3a7d146103ab5780631626ba7e146103e757806319822f7c146104235780631de6f24f1461045357610134565b3661013457005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a028214171561015f57806020526020603cf35b505f610169610749565b6002015f5f357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f2090505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f825f0160149054906101000a900460f81b90505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102ab575f357fffffffff00000000000000000000000000000000000000000000000000000000166040517f48c9ceda0000000000000000000000000000000000000000000000000000000081526004016102a29190615b6c565b60405180910390fd5b6102b98160fe60f81b610777565b15610315576102d4565b5f6040519050818101604052919050565b6102dd366102c3565b365f82376102eb60146102c3565b3360601b81525f5f6014360184875afa6103043d6102c3565b3d5f823e81610311573d81fd5b3d81f35b610322815f60f81b610777565b1561037f5761033d565b5f6040519050818101604052919050565b6103463661032c565b365f8237610354601461032c565b3360601b81525f5f60143601845f885af161036e3d61032c565b3d5f823e8161037b573d81fd5b3d81f35b005b34801561038c575f5ffd5b506103956107c7565b6040516103a29190615bc4565b60405180910390f35b3480156103b6575f5ffd5b506103d160048036038101906103cc9190615cac565b6107d5565b6040516103de9190615d37565b60405180910390f35b3480156103f2575f5ffd5b5061040d60048036038101906104089190615d83565b610876565b60405161041a9190615b6c565b60405180910390f35b61043d6004803603810190610438919061606d565b610a3d565b60405161044a91906160e8565b60405180910390f35b34801561045e575f5ffd5b5061047960048036038101906104749190616101565b610bf2565b6040516104869190615bc4565b60405180910390f35b34801561049a575f5ffd5b506104a3610c03565b6040516104b09190615d37565b60405180910390f35b6104d360048036038101906104ce919061612c565b610c78565b005b3480156104e0575f5ffd5b506104fb60048036038101906104f69190616177565b610d66565b60405161050992919061626c565b60405180910390f35b34801561051d575f5ffd5b50610526610d97565b6040516105339190616351565b60405180910390f35b61055660048036038101906105519190616394565b610e13565b005b610572600480360381019061056d9190615cac565b610f4d565b005b34801561057f575f5ffd5b5061058861161e565b604051610595919061644e565b60405180910390f35b6105b860048036038101906105b39190615cac565b61165b565b005b3480156105c5575f5ffd5b506105ce611a32565b6040516105db9190615bc4565b60405180910390f35b3480156105ef575f5ffd5b5061060a60048036038101906106059190616498565b611a49565b6040516106179190615d37565b60405180910390f35b61063a600480360381019061063591906164c3565b611b04565b604051610647919061662d565b60405180910390f35b61066a600480360381019061066591906164c3565b61252d565b005b348015610677575f5ffd5b50610692600480360381019061068d9190616177565b612c31565b6040516106a092919061626c565b60405180910390f35b3480156106b4575f5ffd5b506106cf60048036038101906106ca9190616713565b612c63565b005b3480156106dc575f5ffd5b506106f760048036038101906106f291906167ae565b612dc0565b6040516107049190616851565b60405180910390f35b348015610718575f5ffd5b50610733600480360381019061072e9190616101565b612ee0565b6040516107409190615d37565b60405180910390f35b5f5f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9005f1b90508091505090565b5f817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614905092915050565b5f6107d0612f4b565b905090565b5f600185036107ee576107e784612f7a565b905061086e565b60028503610806576107ff84612fa3565b905061086e565b6003850361082d57610826838381019061082091906167ae565b85612fcd565b905061086e565b600485036108455761083e84613083565b905061086e565b60088514806108545750600985145b1561086a5761086384866130c1565b905061086e565b5f90505b949350505050565b5f5f83835f9060149261088b93929190616872565b9061089691906168ed565b60601c90506108a481612f7a565b61098f576108b0613101565b610952575f61090a6108c18761311e565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061314e565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361095057631626ba7e60e01b92505050610a36565b505b806040517fb927fe5e0000000000000000000000000000000000000000000000000000000081526004016109869190615bc4565b60405180910390fd5b60606109ad86868660149080926109a893929190616872565b6131df565b80925081975050508173ffffffffffffffffffffffffffffffffffffffff1663f551e2ee3388846040518463ffffffff1660e01b81526004016109f2939291906169a2565b602060405180830381865afa158015610a0d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3191906169f2565b925050505b9392505050565b5f610a46611a32565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aaa576040517fac52ccbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f5f866020015190508060601c9150610ac382612f7a565b610b4257610acf613101565b610b37575f610aeb610ae08861311e565b89610100015161314e565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b2c5760019450505050610bda565b5f9450505050610bda565b600193505050610bda565b610b4d868887613306565b886101000181905281975050508173ffffffffffffffffffffffffffffffffffffffff16639700320388886040518363ffffffff1660e01b8152600401610b95929190616b03565b6020604051808303815f875af1158015610bb1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd59190616b45565b935050505b8015610bea575f385f3884335af1505b509392505050565b5f610bfc826133e8565b9050919050565b5f3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c69576040517f0e93a1f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c71613492565b6001905090565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cb457610cb36134bc565b5b610cbc613532565b5f7feadcdba66a79ab5dce91622d1d75c8cff5cff0b96944c3bf1072cd08ce018329303f1490508015610d4057610d147fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9005f1b613557565b610d3f7fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005f1b613557565b5b5f5f8484810190610d519190616bab565b91509150610d5f82826135a6565b5050505050565b60605f5f610d72610749565b5f019050610d8b85858361361b9092919063ffffffff16565b92509250509250929050565b60605f7fc473de86d0138e06e4d4918a106463a7cc005258d2e21915272bcb4594c189009050805f01805480602002602001604051908101604052809291908181526020018280548015610e0857602002820191905f5260205f20905b815481526020019060010190808311610df4575b505050505091505090565b610e1b611a32565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e7f576040517fac52ccbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b365f838060600190610e919190616c11565b6004908092610ea293929190616872565b915091505f3073ffffffffffffffffffffffffffffffffffffffff168383604051610ece929190616ca1565b5f60405180830381855af49150503d805f8114610f06576040519150601f19603f3d011682016040523d82523d5f602084013e610f0b565b606091505b5050905080610f46576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b610f55611a32565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610fb957503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610fef576040517fac52ccbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610ff8612f4b565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112ae5783855f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110ee578073ffffffffffffffffffffffffffffffffffffffff166396fb721784846040518363ffffffff1660e01b81526004016110c1929190616cb9565b5f6040518083038186803b1580156110d7575f5ffd5b505afa1580156110e9573d5f5f3e3d5ffd5b505050505b8673ffffffffffffffffffffffffffffffffffffffff1663ecd05961896040518263ffffffff1660e01b815260040161112791906160e8565b602060405180830381865afa158015611142573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111669190616d0a565b6111a757876040517fd393448a00000000000000000000000000000000000000000000000000000000815260040161119e91906160e8565b60405180910390fd5b600188036111bf576111ba87878761393e565b61126d565b600288036111d7576111d28787876139cc565b61126c565b600388036111ef576111ea878787613a5b565b61126b565b6004880361120757611202878787613cb8565b61126a565b60088814806112165750600988145b1561122c5761122787898888613daa565b611269565b876040517f41c38b3000000000000000000000000000000000000000000000000000000000815260040161126091906160e8565b60405180910390fd5b5b5b5b5b7fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123888860405161129e929190616d35565b60405180910390a1505050611617565b5f8173ffffffffffffffffffffffffffffffffffffffff1663d68f602533345f366040518563ffffffff1660e01b81526004016112ee9493929190616d88565b5f604051808303815f875af1158015611309573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906113319190616e34565b905084865f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113f4578073ffffffffffffffffffffffffffffffffffffffff166396fb721784846040518363ffffffff1660e01b81526004016113c7929190616cb9565b5f6040518083038186803b1580156113dd575f5ffd5b505afa1580156113ef573d5f5f3e3d5ffd5b505050505b8773ffffffffffffffffffffffffffffffffffffffff1663ecd059618a6040518263ffffffff1660e01b815260040161142d91906160e8565b602060405180830381865afa158015611448573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146c9190616d0a565b6114ad57886040517fd393448a0000000000000000000000000000000000000000000000000000000081526004016114a491906160e8565b60405180910390fd5b600189036114c5576114c088888861393e565b611573565b600289036114dd576114d88888886139cc565b611572565b600389036114f5576114f0888888613a5b565b611571565b6004890361150d57611508888888613cb8565b611570565b600889148061151c5750600989145b156115325761152d888a8989613daa565b61156f565b886040517f41c38b3000000000000000000000000000000000000000000000000000000000815260040161156691906160e8565b60405180910390fd5b5b5b5b5b7fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef12389896040516115a4929190616d35565b60405180910390a15050508173ffffffffffffffffffffffffffffffffffffffff1663173bf7da826040518263ffffffff1660e01b81526004016115e89190616e7b565b5f604051808303815f87803b1580156115ff575f5ffd5b505af1158015611611573d5f5f3e3d5ffd5b50505050505b5050505050565b60606040518060400160405280601b81526020017f754d53412e616476616e6365642f77697468486f6f6b2e76302e310000000000815250905090565b611663611a32565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116c757503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116fd576040517fac52ccbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611706612f4b565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361183f57600185036117535761174e848484613f6f565b611801565b6002850361176b57611766848484614014565b611800565b600385036117835761177e8484846140ba565b6117ff565b6004850361179b5761179684848461447d565b6117fe565b60088514806117aa5750600985145b156117c0576117bb848685856144f3565b6117fd565b846040517f41c38b300000000000000000000000000000000000000000000000000000000081526004016117f491906160e8565b60405180910390fd5b5b5b5b5b7f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e8585604051611832929190616d35565b60405180910390a1611a2b565b5f8173ffffffffffffffffffffffffffffffffffffffff1663d68f602533345f366040518563ffffffff1660e01b815260040161187f9493929190616d88565b5f604051808303815f875af115801561189a573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906118c29190616e34565b9050600186036118dc576118d7858585613f6f565b61198a565b600286036118f4576118ef858585614014565b611989565b6003860361190c576119078585856140ba565b611988565b600486036119245761191f85858561447d565b611987565b60088614806119335750600986145b1561194957611944858786866144f3565b611986565b856040517f41c38b3000000000000000000000000000000000000000000000000000000000815260040161197d91906160e8565b60405180910390fd5b5b5b5b5b7f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e86866040516119bb929190616d35565b60405180910390a18173ffffffffffffffffffffffffffffffffffffffff1663173bf7da826040518263ffffffff1660e01b81526004016119fc9190616e7b565b5f604051808303815f87803b158015611a13575f5ffd5b505af1158015611a25573d5f5f3e3d5ffd5b50505050505b5050505050565b5f6f71727de22e5e9d8baf0edac6f37da032905090565b5f5f5f611a5584614726565b505091509150611a6982600160f81b610777565b15611a775760019250611aba565b611a84825f60f81b610777565b15611a925760019250611ab9565b611aa08260ff60f81b610777565b15611aae5760019250611ab8565b5f92505050611aff565b5b5b611ac7815f60f81b614746565b15611ad55760019250611afc565b611ae381600160f81b614746565b15611af15760019250611afb565b5f92505050611aff565b5b50505b919050565b60605f611b0f610749565b6001019050611b27338261479690919063ffffffff16565b611b6857336040517fb927fe5e000000000000000000000000000000000000000000000000000000008152600401611b5f9190615bc4565b60405180910390fd5b5f611b71612f4b565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ff1573360025f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c68578073ffffffffffffffffffffffffffffffffffffffff166396fb721784846040518363ffffffff1660e01b8152600401611c3b929190616cb9565b5f6040518083038186803b158015611c51575f5ffd5b505afa158015611c63573d5f5f3e3d5ffd5b505050505b5f5f611c738b614726565b505091509150611c8782600160f81b610777565b15611d2857365f611c988c8c614865565b91509150611ca9835f60f81b614746565b15611cbf57611cb8828261490e565b9950611d21565b611ccd83600160f81b614746565b15611ce357611cdc82826149fc565b9950611d20565b826040517f1187dc06000000000000000000000000000000000000000000000000000000008152600401611d179190616eaa565b60405180910390fd5b5b5050611fe7565b611d35825f60f81b610777565b15611eca575f5f365f611d488e8e614b49565b9350935093509350600167ffffffffffffffff811115611d6b57611d6a615df4565b5b604051908082528060200260200182016040528015611d9e57816020015b6060815260200190600190039081611d895790505b509b505f611daf865f60f81b614746565b15611de357611dc085858585614bb3565b8d5f81518110611dd357611dd2616ec3565b5b6020026020010181905250611ec0565b611df186600160f81b614746565b15611e8257611e0285858585614bec565b8e5f81518110611e1557611e14616ec3565b5b60200260200101819052819250505080611e7d577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8e5f81518110611e5e57611e5d616ec3565b5b6020026020010151604051611e74929190616f32565b60405180910390a15b611ebf565b856040517f1187dc06000000000000000000000000000000000000000000000000000000008152600401611eb69190616eaa565b60405180910390fd5b5b5050505050611fe6565b611ed88260ff60f81b610777565b15611fa8575f8a8a5f90601492611ef193929190616872565b90611efc91906168ed565b60601c9050365f8c8c6014908092611f1693929190616872565b91509150611f27845f60f81b614746565b15611f3d57611f37838383614c1d565b50611fa0565b611f4b84600160f81b614746565b15611f6257611f5b838383614c54565b5050611f9f565b836040517f1187dc06000000000000000000000000000000000000000000000000000000008152600401611f969190616eaa565b60405180910390fd5b5b505050611fe5565b816040517fb96fcfe4000000000000000000000000000000000000000000000000000000008152600401611fdc9190616f6f565b60405180910390fd5b5b5b5050505050612524565b5f8173ffffffffffffffffffffffffffffffffffffffff1663d68f602533345f366040518563ffffffff1660e01b81526004016120319493929190616d88565b5f604051808303815f875af115801561204c573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906120749190616e34565b90503360025f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612138578073ffffffffffffffffffffffffffffffffffffffff166396fb721784846040518363ffffffff1660e01b815260040161210b929190616cb9565b5f6040518083038186803b158015612121575f5ffd5b505afa158015612133573d5f5f3e3d5ffd5b505050505b5f5f6121438c614726565b50509150915061215782600160f81b610777565b156121f857365f6121688d8d614865565b91509150612179835f60f81b614746565b1561218f57612188828261490e565b9a506121f1565b61219d83600160f81b614746565b156121b3576121ac82826149fc565b9a506121f0565b826040517f1187dc060000000000000000000000000000000000000000000000000000000081526004016121e79190616eaa565b60405180910390fd5b5b50506124b7565b612205825f60f81b610777565b1561239a575f5f365f6122188f8f614b49565b9350935093509350600167ffffffffffffffff81111561223b5761223a615df4565b5b60405190808252806020026020018201604052801561226e57816020015b60608152602001906001900390816122595790505b509c505f61227f865f60f81b614746565b156122b35761229085858585614bb3565b8e5f815181106122a3576122a2616ec3565b5b6020026020010181905250612390565b6122c186600160f81b614746565b15612352576122d285858585614bec565b8f5f815181106122e5576122e4616ec3565b5b6020026020010181905281925050508061234d577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb75f8f5f8151811061232e5761232d616ec3565b5b6020026020010151604051612344929190616f32565b60405180910390a15b61238f565b856040517f1187dc060000000000000000000000000000000000000000000000000000000081526004016123869190616eaa565b60405180910390fd5b5b50505050506124b6565b6123a88260ff60f81b610777565b15612478575f8b8b5f906014926123c193929190616872565b906123cc91906168ed565b60601c9050365f8d8d60149080926123e693929190616872565b915091506123f7845f60f81b614746565b1561240d57612407838383614c1d565b50612470565b61241b84600160f81b614746565b156124325761242b838383614c54565b505061246f565b836040517f1187dc060000000000000000000000000000000000000000000000000000000081526004016124669190616eaa565b60405180910390fd5b5b5050506124b5565b816040517fb96fcfe40000000000000000000000000000000000000000000000000000000081526004016124ac9190616f6f565b60405180910390fd5b5b5b50505050508173ffffffffffffffffffffffffffffffffffffffff1663173bf7da826040518263ffffffff1660e01b81526004016124f59190616e7b565b5f604051808303815f87803b15801561250c575f5ffd5b505af115801561251e573d5f5f3e3d5ffd5b50505050505b50509392505050565b612535611a32565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061259957503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6125cf576040517fac52ccbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6125d8612f4b565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128a8575f5f61261886614726565b50509150915061262c82600160f81b610777565b156126cb57365f61263d8787614865565b9150915061264e835f60f81b614746565b156126635761265d828261490e565b506126c4565b61267183600160f81b614746565b156126865761268082826149fc565b506126c3565b826040517f1187dc060000000000000000000000000000000000000000000000000000000081526004016126ba9190616eaa565b60405180910390fd5b5b50506128a1565b6126d8825f60f81b610777565b15612784575f5f365f6126eb8989614b49565b9350935093509350612700855f60f81b614746565b156127175761271184848484614bb3565b5061277b565b61272585600160f81b614746565b1561273d5761273684848484614bec565b505061277a565b846040517f1187dc060000000000000000000000000000000000000000000000000000000081526004016127719190616eaa565b60405180910390fd5b5b505050506128a0565b6127928260ff60f81b610777565b15612862575f85855f906014926127ab93929190616872565b906127b691906168ed565b60601c9050365f878760149080926127d093929190616872565b915091506127e1845f60f81b614746565b156127f7576127f1838383614c1d565b5061285a565b61280584600160f81b614746565b1561281c57612815838383614c54565b5050612859565b836040517f1187dc060000000000000000000000000000000000000000000000000000000081526004016128509190616eaa565b60405180910390fd5b5b50505061289f565b816040517fb96fcfe40000000000000000000000000000000000000000000000000000000081526004016128969190616f6f565b60405180910390fd5b5b5b5050612c2b565b5f8173ffffffffffffffffffffffffffffffffffffffff1663d68f602533345f366040518563ffffffff1660e01b81526004016128e89493929190616d88565b5f604051808303815f875af1158015612903573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061292b9190616e34565b90505f5f61293887614726565b50509150915061294c82600160f81b610777565b156129eb57365f61295d8888614865565b9150915061296e835f60f81b614746565b156129835761297d828261490e565b506129e4565b61299183600160f81b614746565b156129a6576129a082826149fc565b506129e3565b826040517f1187dc060000000000000000000000000000000000000000000000000000000081526004016129da9190616eaa565b60405180910390fd5b5b5050612bc1565b6129f8825f60f81b610777565b15612aa4575f5f365f612a0b8a8a614b49565b9350935093509350612a20855f60f81b614746565b15612a3757612a3184848484614bb3565b50612a9b565b612a4585600160f81b614746565b15612a5d57612a5684848484614bec565b5050612a9a565b846040517f1187dc06000000000000000000000000000000000000000000000000000000008152600401612a919190616eaa565b60405180910390fd5b5b50505050612bc0565b612ab28260ff60f81b610777565b15612b82575f86865f90601492612acb93929190616872565b90612ad691906168ed565b60601c9050365f88886014908092612af093929190616872565b91509150612b01845f60f81b614746565b15612b1757612b11838383614c1d565b50612b7a565b612b2584600160f81b614746565b15612b3c57612b35838383614c54565b5050612b79565b836040517f1187dc06000000000000000000000000000000000000000000000000000000008152600401612b709190616eaa565b60405180910390fd5b5b505050612bbf565b816040517fb96fcfe4000000000000000000000000000000000000000000000000000000008152600401612bb69190616f6f565b60405180910390fd5b5b5b50508173ffffffffffffffffffffffffffffffffffffffff1663173bf7da826040518263ffffffff1660e01b8152600401612bfc9190616e7b565b5f604051808303815f87803b158015612c13575f5ffd5b505af1158015612c25573d5f5f3e3d5ffd5b50505050505b50505050565b60605f5f612c3d610749565b6001019050612c5785858361361b9092919063ffffffff16565b92509250509250929050565b612c6b611a32565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612ccf57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612d05576040517fac52ccbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f838390501115612dba578373ffffffffffffffffffffffffffffffffffffffff1663f05c04e18285856040518463ffffffff1660e01b8152600401612d8c9392919061701d565b5f604051808303815f87803b158015612da3575f5ffd5b505af1158015612db5573d5f5f3e3d5ffd5b505050505b50505050565b612dc8615ae2565b612dd0610749565b6002015f837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900460f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815250509050919050565b5f60018203612ef25760019050612f46565b60028203612f035760019050612f46565b60038203612f145760019050612f46565b60048203612f255760019050612f46565b6008821480612f345750600982145b15612f425760019050612f46565b5f90505b919050565b5f5f7fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005f1b9050805491505090565b5f5f612f84610749565b5f019050612f9b838261479690919063ffffffff16565b915050919050565b5f5f612fad610749565b6001019050612fc5838261479690919063ffffffff16565b915050919050565b5f5f612fd7610749565b6002015f857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f2090508273ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161491505092915050565b5f8173ffffffffffffffffffffffffffffffffffffffff166130a3612f4b565b73ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f8273ffffffffffffffffffffffffffffffffffffffff166130e2836133e8565b73ffffffffffffffffffffffffffffffffffffffff1614905092915050565b5f5f61310b610749565b9050613118815f01614c83565b91505090565b5f816020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c6004209050919050565b5f6040516001156131d857825160408114613171576041811461319057506131cb565b6040840151601b8160ff1c016020528060011b60011c606052506131a3565b60608401515f1a60205260408401516060525b50835f5260208301516040526020600160805f60015afa5191505f606052806040523d6131d8575b638baa579f5f526004601cfd5b5092915050565b5f60605f6131ed60086133e8565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036132775785858581818080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050509050905092509250506132fe565b8073ffffffffffffffffffffffffffffffffffffffff16637a0468b7338888886040518563ffffffff1660e01b81526004016132b6949392919061704d565b5f60405180830381865afa1580156132d0573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906132f8919061709f565b92509250505b935093915050565b5f60605f61331460096133e8565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361335a578585610100015192509250506133e0565b8073ffffffffffffffffffffffffffffffffffffffff1663e24f8f938686896040518463ffffffff1660e01b8152600401613397939291906170f9565b5f604051808303815f875af11580156133b2573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906133da919061709f565b92509250505b935093915050565b5f5f6133f2614d19565b90506008830361342757805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505061348d565b6009830361345b57806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505061348d565b6040517f5691922f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61349a614d47565b6134a2614e67565b6134b26134ad612f4b565b614f88565b6134ba613532565b565b5f60ff5f1b1960017ff63b257b7881773a84d328ab92140e19ab791f7b439c76ba9837aa0d6ad30af05f1c6134f19190617162565b60405160200161350191906160e8565b60405160208183030381529060405280519060200120169050805c8061352e5763aed595955f526004601cfd5b5050565b5f61353b610749565b905061354981600101615068565b613554815f01615068565b50565b5f7fc473de86d0138e06e4d4918a106463a7cc005258d2e21915272bcb4594c189009050805f0182908060018154018082558091505060019003905f5260205f20015f90919091909150555050565b5f8273ffffffffffffffffffffffffffffffffffffffff16826040516135cc91906171c5565b5f60405180830381855af49150503d805f8114613604576040519150601f19603f3d011682016040523d82523d5f602084013e613609565b606091505b5050905080613616575f5ffd5b505050565b60605f600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561366257506136608585614796565b155b156136a457836040517f7c84ecfb00000000000000000000000000000000000000000000000000000000815260040161369b9190615bc4565b60405180910390fd5b5f83036136dd576040517ff725081700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8267ffffffffffffffff8111156136f7576136f6615df4565b5b6040519080825280602002602001820160405280156137255781602001602082028036833780820191505090505b5091505f5f9050855f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156137f65750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561380157508381105b156138c7578183828151811061381a57613819616ec3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050855f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915080806138bf906171db565b91505061378d565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561390357505f81115b1561393257826001826139169190617162565b8151811061392757613926616ec3565b5b602002602001015191505b80835250935093915050565b5f613947610749565b5f01905061395e848261512990919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16636d61fe7084846040518363ffffffff1660e01b8152600401613999929190617222565b5f604051808303815f87803b1580156139b0575f5ffd5b505af11580156139c2573d5f5f3e3d5ffd5b5050505050505050565b5f6139d5610749565b60010190506139ed848261512990919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16636d61fe7084846040518363ffffffff1660e01b8152600401613a28929190617222565b5f604051808303815f87803b158015613a3f575f5ffd5b505af1158015613a51573d5f5f3e3d5ffd5b5050505050505050565b5f82825f90600492613a6f93929190616872565b90613a7a9190617244565b90505f83836004818110613a9157613a90616ec3565b5b9050013560f81c60f81b90505f84846005908092613ab193929190616872565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050509050613afe836153f9565b15613b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b35906172ec565b60405180910390fd5b60405180604001604052808773ffffffffffffffffffffffffffffffffffffffff168152602001837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815250613b93610749565b6002015f857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a81548160ff021916908360f81c02179055509050508573ffffffffffffffffffffffffffffffffffffffff16636d61fe70826040518263ffffffff1660e01b8152600401613c839190616e7b565b5f604051808303815f87803b158015613c9a575f5ffd5b505af1158015613cac573d5f5f3e3d5ffd5b50505050505050505050565b5f613cc1612f4b565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613d3357806040517f741cbe03000000000000000000000000000000000000000000000000000000008152600401613d2a9190615bc4565b60405180910390fd5b613d3c846154af565b8373ffffffffffffffffffffffffffffffffffffffff16636d61fe7084846040518363ffffffff1660e01b8152600401613d77929190617222565b5f604051808303815f87803b158015613d8e575f5ffd5b505af1158015613da0573d5f5f3e3d5ffd5b5050505050505050565b5f613db3614d19565b90505f613dbf856133e8565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613e3157806040517f786ae235000000000000000000000000000000000000000000000000000000008152600401613e289190615bc4565b60405180910390fd5b613e3b86866154dc565b60088503613ed257815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636d61fe7085856040518363ffffffff1660e01b8152600401613ea0929190617222565b5f604051808303815f87803b158015613eb7575f5ffd5b505af1158015613ec9573d5f5f3e3d5ffd5b50505050613f67565b60098503613f6657816001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636d61fe7085856040518363ffffffff1660e01b8152600401613f38929190617222565b5f604051808303815f87803b158015613f4f575f5ffd5b505af1158015613f61573d5f5f3e3d5ffd5b505050505b5b505050505050565b5f613f78610749565b5f0190505f5f8484810190613f8d9190616bab565b91509150613fa68287856155bc9092919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff16638a91b0e3826040518263ffffffff1660e01b8152600401613fdf9190616e7b565b5f604051808303815f87803b158015613ff6575f5ffd5b505af1158015614008573d5f5f3e3d5ffd5b50505050505050505050565b5f61401d610749565b60010190505f5f84848101906140339190616bab565b9150915061404c8287856155bc9092919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff16638a91b0e3826040518263ffffffff1660e01b81526004016140859190616e7b565b5f604051808303815f87803b15801561409c575f5ffd5b505af11580156140ae573d5f5f3e3d5ffd5b50505050505050505050565b5f82825f906004926140ce93929190616872565b906140d99190617244565b90505f838360049080926140ef93929190616872565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050905061413c826153f9565b61417b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161417290617354565b60405180910390fd5b5f614184610749565b6002015f847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900460f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505090508573ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff1614614300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142f7906173e2565b60405180910390fd5b60405180604001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815250614358610749565b6002015f857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a81548160ff021916908360f81c02179055509050508573ffffffffffffffffffffffffffffffffffffffff16638a91b0e3836040518263ffffffff1660e01b81526004016144489190616e7b565b5f604051808303815f87803b15801561445f575f5ffd5b505af1158015614471573d5f5f3e3d5ffd5b50505050505050505050565b6144865f6154af565b8273ffffffffffffffffffffffffffffffffffffffff16638a91b0e383836040518363ffffffff1660e01b81526004016144c1929190617222565b5f604051808303815f87803b1580156144d8575f5ffd5b505af11580156144ea573d5f5f3e3d5ffd5b50505050505050565b5f6144fc614d19565b905060088414801561455b57508473ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156145ef57805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638a91b0e384846040518363ffffffff1660e01b81526004016145bd929190617222565b5f604051808303815f87803b1580156145d4575f5ffd5b505af11580156145e6573d5f5f3e3d5ffd5b50505050614715565b60098414801561464d57508473ffffffffffffffffffffffffffffffffffffffff16816001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156146e257806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638a91b0e384846040518363ffffffff1660e01b81526004016146b0929190617222565b5f604051808303815f87803b1580156146c7575f5ffd5b505af11580156146d9573d5f5f3e3d5ffd5b50505050614714565b6040517f5691922f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b61471f5f856154dc565b5050505050565b5f5f5f5f8493508460081b92508460301b91508460501b90509193509193565b5f817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614905092915050565b5f8173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561485d57505f73ffffffffffffffffffffffffffffffffffffffff16835f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b365f833580850160208587010360208201945081359350808460051b8301118360401c171561489b5763ba597e7e5f526004601cfd5b831561490457835b600115614902576001810390508060051b86013580870160408101358082018581358201118660408501111782851782351760401c17156148eb5763ba597e7e5f526004601cfd5b846148f95750505050614902565b505050506148a3565b505b5050509250929050565b60605f8383905090508067ffffffffffffffff81111561493157614930615df4565b5b60405190808252806020026020018201604052801561496457816020015b606081526020019060019003908161494f5790505b5091505f5b818110156149f4573685858381811061498557614984616ec3565b5b90506020028101906149979190617400565b90506149c8815f0160208101906149ae9190617427565b82602001358380604001906149c39190616c11565b614bb3565b8483815181106149db576149da616ec3565b5b6020026020010181905250508080600101915050614969565b505092915050565b60605f8383905090508067ffffffffffffffff811115614a1f57614a1e615df4565b5b604051908082528060200260200182016040528015614a5257816020015b6060815260200190600190039081614a3d5790505b5091505f5b81811015614b415736858583818110614a7357614a72616ec3565b5b9050602002810190614a859190617400565b90505f614ab7825f016020810190614a9d9190617427565b8360200135848060400190614ab29190616c11565b614bec565b868581518110614aca57614ac9616ec3565b5b60200260200101819052819250505080614b32577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb783868581518110614b1357614b12616ec3565b5b6020026020010151604051614b29929190617452565b60405180910390a15b50508080600101915050614a57565b505092915050565b5f5f365f85855f90601492614b6093929190616872565b90614b6b91906168ed565b60601c93508585601490603492614b8493929190616872565b90614b8f9190617480565b5f1c925085856034908092614ba693929190616872565b9150915092959194509250565b60606040519050818382375f38838387895af1614bd2573d5f823e3d81fd5b3d8152602081013d5f823e3d810160405250949350505050565b5f60606040519050828482375f388483888a5af191503d8152602081013d5f823e3d81016040525094509492505050565b60606040519050818382375f388383875af4614c3b573d5f823e3d81fd5b3d8152602081013d5f823e3d8101604052509392505050565b5f60606040519050828482375f388483885af491503d8152602081013d5f823e3d810160405250935093915050565b5f5f73ffffffffffffffffffffffffffffffffffffffff16825f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f5f7f088e45215d3756b04bd240e41d75700a696139d5b53082481ffc3914e48400005f1b90508091505090565b5f614d50610749565b5f0190505f614d6960018361588b90919063ffffffff16565b90505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614e5a578073ffffffffffffffffffffffffffffffffffffffff16638a91b0e36040518163ffffffff1660e01b8152600401614dd790617501565b5f604051808303815f87803b158015614dee575f5ffd5b505af1925050508015614dff575060015b614e3f577f6c31ee2929752d85a6dc461efcf817aa81394aff41db1856ebfd71679fffc57081604051614e32919061751f565b60405180910390a1614e40565b5b614e53818361588b90919063ffffffff16565b9050614d6c565b614e6382615962565b5050565b5f614e70610749565b60010190505f614e8a60018361588b90919063ffffffff16565b90505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614f7b578073ffffffffffffffffffffffffffffffffffffffff16638a91b0e36040518163ffffffff1660e01b8152600401614ef890617501565b5f604051808303815f87803b158015614f0f575f5ffd5b505af1925050508015614f20575060015b614f60577ffdea4600cf09065ff861064d4cd43cde3fae2134d9fbe6d66fd77cc67135c88281604051614f53919061751f565b60405180910390a1614f61565b5b614f74818361588b90919063ffffffff16565b9050614e8d565b614f8482615962565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614615065578073ffffffffffffffffffffffffffffffffffffffff16638a91b0e36040518163ffffffff1660e01b8152600401614ff290617501565b5f604051808303815f87803b158015615009575f5ffd5b505af192505050801561501a575060015b61505a577f57af23cbd8e148da6020d15e1ff9fb3c531aa9003d6bab6915013a7d8fd032368160405161504d919061751f565b60405180910390a161505b565b5b6150645f6154af565b5b50565b61507181614c83565b156150a8576040517f53c85e6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001815f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061518f5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156151d157806040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016151c89190615bc4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16825f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461529e57806040517f40d3d1a40000000000000000000000000000000000000000000000000000000081526004016152959190615bc4565b60405180910390fd5b815f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16825f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080825f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f5f615403610749565b6002015f847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f2090505f73ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415915050919050565b5f7fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005f1b90508181555050565b5f6154e5614d19565b9050600882036155355782815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506155b7565b600982036155845782816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506155b6565b6040517f5691922f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806156225750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b1561566457816040517f7c84ecfb00000000000000000000000000000000000000000000000000000000815260040161565b9190615bc4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16835f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461573157806040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016157289190615bc4565b60405180910390fd5b825f015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16835f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f835f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036158fc57816040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016158f39190615bc4565b60405180910390fd5b825f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b5f815f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614615ade575f819050825f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505f835f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506159c5565b5050565b60405180604001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b615b6681615b32565b82525050565b5f602082019050615b7f5f830184615b5d565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f615bae82615b85565b9050919050565b615bbe81615ba4565b82525050565b5f602082019050615bd75f830184615bb5565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f819050919050565b615c0081615bee565b8114615c0a575f5ffd5b50565b5f81359050615c1b81615bf7565b92915050565b615c2a81615ba4565b8114615c34575f5ffd5b50565b5f81359050615c4581615c21565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112615c6c57615c6b615c4b565b5b8235905067ffffffffffffffff811115615c8957615c88615c4f565b5b602083019150836001820283011115615ca557615ca4615c53565b5b9250929050565b5f5f5f5f60608587031215615cc457615cc3615be6565b5b5f615cd187828801615c0d565b9450506020615ce287828801615c37565b935050604085013567ffffffffffffffff811115615d0357615d02615bea565b5b615d0f87828801615c57565b925092505092959194509250565b5f8115159050919050565b615d3181615d1d565b82525050565b5f602082019050615d4a5f830184615d28565b92915050565b5f819050919050565b615d6281615d50565b8114615d6c575f5ffd5b50565b5f81359050615d7d81615d59565b92915050565b5f5f5f60408486031215615d9a57615d99615be6565b5b5f615da786828701615d6f565b935050602084013567ffffffffffffffff811115615dc857615dc7615bea565b5b615dd486828701615c57565b92509250509250925092565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b615e2a82615de4565b810181811067ffffffffffffffff82111715615e4957615e48615df4565b5b80604052505050565b5f615e5b615bdd565b9050615e678282615e21565b919050565b5f5ffd5b5f5ffd5b5f67ffffffffffffffff821115615e8e57615e8d615df4565b5b615e9782615de4565b9050602081019050919050565b828183375f83830152505050565b5f615ec4615ebf84615e74565b615e52565b905082815260208101848484011115615ee057615edf615e70565b5b615eeb848285615ea4565b509392505050565b5f82601f830112615f0757615f06615c4b565b5b8135615f17848260208601615eb2565b91505092915050565b5f6101208284031215615f3657615f35615de0565b5b615f41610120615e52565b90505f615f5084828501615c37565b5f830152506020615f6384828501615c0d565b602083015250604082013567ffffffffffffffff811115615f8757615f86615e6c565b5b615f9384828501615ef3565b604083015250606082013567ffffffffffffffff811115615fb757615fb6615e6c565b5b615fc384828501615ef3565b6060830152506080615fd784828501615d6f565b60808301525060a0615feb84828501615c0d565b60a08301525060c0615fff84828501615d6f565b60c08301525060e082013567ffffffffffffffff81111561602357616022615e6c565b5b61602f84828501615ef3565b60e08301525061010082013567ffffffffffffffff81111561605457616053615e6c565b5b61606084828501615ef3565b6101008301525092915050565b5f5f5f6060848603121561608457616083615be6565b5b5f84013567ffffffffffffffff8111156160a1576160a0615bea565b5b6160ad86828701615f20565b93505060206160be86828701615d6f565b92505060406160cf86828701615c0d565b9150509250925092565b6160e281615bee565b82525050565b5f6020820190506160fb5f8301846160d9565b92915050565b5f6020828403121561611657616115615be6565b5b5f61612384828501615c0d565b91505092915050565b5f5f6020838503121561614257616141615be6565b5b5f83013567ffffffffffffffff81111561615f5761615e615bea565b5b61616b85828601615c57565b92509250509250929050565b5f5f6040838503121561618d5761618c615be6565b5b5f61619a85828601615c37565b92505060206161ab85828601615c0d565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6161e781615ba4565b82525050565b5f6161f883836161de565b60208301905092915050565b5f602082019050919050565b5f61621a826161b5565b61622481856161bf565b935061622f836161cf565b805f5b8381101561625f57815161624688826161ed565b975061625183616204565b925050600181019050616232565b5085935050505092915050565b5f6040820190508181035f8301526162848185616210565b90506162936020830184615bb5565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6162cc81615d50565b82525050565b5f6162dd83836162c3565b60208301905092915050565b5f602082019050919050565b5f6162ff8261629a565b61630981856162a4565b9350616314836162b4565b805f5b8381101561634457815161632b88826162d2565b9750616336836162e9565b925050600181019050616317565b5085935050505092915050565b5f6020820190508181035f83015261636981846162f5565b905092915050565b5f5ffd5b5f610120828403121561638b5761638a616371565b5b81905092915050565b5f5f604083850312156163aa576163a9615be6565b5b5f83013567ffffffffffffffff8111156163c7576163c6615bea565b5b6163d385828601616375565b92505060206163e485828601615d6f565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f616420826163ee565b61642a81856163f8565b935061643a818560208601616408565b61644381615de4565b840191505092915050565b5f6020820190508181035f8301526164668184616416565b905092915050565b61647781615d50565b8114616481575f5ffd5b50565b5f813590506164928161646e565b92915050565b5f602082840312156164ad576164ac615be6565b5b5f6164ba84828501616484565b91505092915050565b5f5f5f604084860312156164da576164d9615be6565b5b5f6164e786828701616484565b935050602084013567ffffffffffffffff81111561650857616507615bea565b5b61651486828701615c57565b92509250509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f61656d82616549565b6165778185616553565b9350616587818560208601616408565b61659081615de4565b840191505092915050565b5f6165a68383616563565b905092915050565b5f602082019050919050565b5f6165c482616520565b6165ce818561652a565b9350836020820285016165e08561653a565b805f5b8581101561661b57848403895281516165fc858261659b565b9450616607836165ae565b925060208a019950506001810190506165e3565b50829750879550505050505092915050565b5f6020820190508181035f83015261664581846165ba565b905092915050565b5f61665782615ba4565b9050919050565b6166678161664d565b8114616671575f5ffd5b50565b5f813590506166828161665e565b92915050565b5f5f83601f84011261669d5761669c615c4b565b5b8235905067ffffffffffffffff8111156166ba576166b9615c4f565b5b6020830191508360208202830111156166d6576166d5615c53565b5b9250929050565b5f60ff82169050919050565b6166f2816166dd565b81146166fc575f5ffd5b50565b5f8135905061670d816166e9565b92915050565b5f5f5f5f6060858703121561672b5761672a615be6565b5b5f61673887828801616674565b945050602085013567ffffffffffffffff81111561675957616758615bea565b5b61676587828801616688565b93509350506040616778878288016166ff565b91505092959194509250565b61678d81615b32565b8114616797575f5ffd5b50565b5f813590506167a881616784565b92915050565b5f602082840312156167c3576167c2615be6565b5b5f6167d08482850161679a565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b5f61680e826167d9565b9050919050565b61681e81616804565b82525050565b604082015f8201516168385f8501826161de565b50602082015161684b6020850182616815565b50505050565b5f6040820190506168645f830184616824565b92915050565b5f5ffd5b5f5ffd5b5f5f858511156168855761688461686a565b5b838611156168965761689561686e565b5b6001850283019150848603905094509492505050565b5f82905092915050565b5f7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b5f82821b905092915050565b5f6168f883836168ac565b8261690381356168b6565b925060148210156169435761693e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026168e1565b831692505b505092915050565b61695481615d50565b82525050565b5f82825260208201905092915050565b5f61697482616549565b61697e818561695a565b935061698e818560208601616408565b61699781615de4565b840191505092915050565b5f6060820190506169b55f830186615bb5565b6169c2602083018561694b565b81810360408301526169d4818461696a565b9050949350505050565b5f815190506169ec81616784565b92915050565b5f60208284031215616a0757616a06615be6565b5b5f616a14848285016169de565b91505092915050565b616a2681615bee565b82525050565b5f61012083015f830151616a425f8601826161de565b506020830151616a556020860182616a1d565b5060408301518482036040860152616a6d8282616563565b91505060608301518482036060860152616a878282616563565b9150506080830151616a9c60808601826162c3565b5060a0830151616aaf60a0860182616a1d565b5060c0830151616ac260c08601826162c3565b5060e083015184820360e0860152616ada8282616563565b915050610100830151848203610100860152616af68282616563565b9150508091505092915050565b5f6040820190508181035f830152616b1b8185616a2c565b9050616b2a602083018461694b565b9392505050565b5f81519050616b3f81615bf7565b92915050565b5f60208284031215616b5a57616b59615be6565b5b5f616b6784828501616b31565b91505092915050565b5f616b7a82615b85565b9050919050565b616b8a81616b70565b8114616b94575f5ffd5b50565b5f81359050616ba581616b81565b92915050565b5f5f60408385031215616bc157616bc0615be6565b5b5f616bce85828601616b97565b925050602083013567ffffffffffffffff811115616bef57616bee615bea565b5b616bfb85828601615ef3565b9150509250929050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83356001602003843603038112616c2d57616c2c616c05565b5b80840192508235915067ffffffffffffffff821115616c4f57616c4e616c09565b5b602083019250600182023603831315616c6b57616c6a616c0d565b5b509250929050565b5f81905092915050565b5f616c888385616c73565b9350616c95838584615ea4565b82840190509392505050565b5f616cad828486616c7d565b91508190509392505050565b5f604082019050616ccc5f830185615bb5565b616cd960208301846160d9565b9392505050565b616ce981615d1d565b8114616cf3575f5ffd5b50565b5f81519050616d0481616ce0565b92915050565b5f60208284031215616d1f57616d1e615be6565b5b5f616d2c84828501616cf6565b91505092915050565b5f604082019050616d485f8301856160d9565b616d556020830184615bb5565b9392505050565b5f616d67838561695a565b9350616d74838584615ea4565b616d7d83615de4565b840190509392505050565b5f606082019050616d9b5f830187615bb5565b616da860208301866160d9565b8181036040830152616dbb818486616d5c565b905095945050505050565b5f616dd8616dd384615e74565b615e52565b905082815260208101848484011115616df457616df3615e70565b5b616dff848285616408565b509392505050565b5f82601f830112616e1b57616e1a615c4b565b5b8151616e2b848260208601616dc6565b91505092915050565b5f60208284031215616e4957616e48615be6565b5b5f82015167ffffffffffffffff811115616e6657616e65615bea565b5b616e7284828501616e07565b91505092915050565b5f6020820190508181035f830152616e93818461696a565b905092915050565b616ea481616804565b82525050565b5f602082019050616ebd5f830184616e9b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f819050919050565b5f616f1c616f17616f1284616ef0565b616ef9565b615bee565b9050919050565b616f2c81616f02565b82525050565b5f604082019050616f455f830185616f23565b8181036020830152616f57818461696a565b90509392505050565b616f6981616804565b82525050565b5f602082019050616f825f830184616f60565b92915050565b616f91816166dd565b82525050565b5f819050919050565b5f616fae6020840184615c37565b905092915050565b5f602082019050919050565b5f616fcd83856161bf565b9350616fd882616f97565b805f5b8581101561701057616fed8284616fa0565b616ff788826161ed565b975061700283616fb6565b925050600181019050616fdb565b5085925050509392505050565b5f6040820190506170305f830186616f88565b8181036020830152617043818486616fc2565b9050949350505050565b5f6060820190506170605f830187615bb5565b61706d602083018661694b565b8181036040830152617080818486616d5c565b905095945050505050565b5f8151905061709981615d59565b92915050565b5f5f604083850312156170b5576170b4615be6565b5b5f6170c28582860161708b565b925050602083015167ffffffffffffffff8111156170e3576170e2615bea565b5b6170ef85828601616e07565b9150509250929050565b5f6060820190508181035f8301526171118186616a2c565b905061712060208301856160d9565b61712d604083018461694b565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61716c82615bee565b915061717783615bee565b925082820390508181111561718f5761718e617135565b5b92915050565b5f61719f82616549565b6171a98185616c73565b93506171b9818560208601616408565b80840191505092915050565b5f6171d08284617195565b915081905092915050565b5f6171e582615bee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361721757617216617135565b5b600182019050919050565b5f6020820190508181035f83015261723b818486616d5c565b90509392505050565b5f61724f83836168ac565b8261725a8135615b32565b9250600482101561729a576172957fffffffff00000000000000000000000000000000000000000000000000000000836004036008026168e1565b831692505b505092915050565b7f46756e6374696f6e2073656c6563746f7220616c7265616479207573656400005f82015250565b5f6172d6601e836163f8565b91506172e1826172a2565b602082019050919050565b5f6020820190508181035f830152617303816172ca565b9050919050565b7f46756e6374696f6e2073656c6563746f72206e6f7420757365640000000000005f82015250565b5f61733e601a836163f8565b91506173498261730a565b602082019050919050565b5f6020820190508181035f83015261736b81617332565b9050919050565b7f46756e6374696f6e2073656c6563746f72206e6f7420757365642062792074685f8201527f69732068616e646c657200000000000000000000000000000000000000000000602082015250565b5f6173cc602a836163f8565b91506173d782617372565b604082019050919050565b5f6020820190508181035f8301526173f9816173c0565b9050919050565b5f8235600160600383360303811261741b5761741a616c05565b5b80830191505092915050565b5f6020828403121561743c5761743b615be6565b5b5f61744984828501615c37565b91505092915050565b5f6040820190506174655f8301856160d9565b8181036020830152617477818461696a565b90509392505050565b5f61748b83836168ac565b826174968135615d50565b925060208210156174d6576174d17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026168e1565b831692505b505092915050565b50565b5f6174ec5f8361695a565b91506174f7826174de565b5f82019050919050565b5f6020820190508181035f830152617518816174e1565b9050919050565b5f6040820190506175325f830184615bb5565b8181036020830152617543816174e1565b90509291505056fea2646970667358221220a3ab10abccfc1e4991ad9a5f687ec3515e4bba3b7da0e732e5f7a7255be4dc6964736f6c634300081c0033"; bytes public constant ERC7579_BOOTSTRAP_BYTECODE = - hex"6080604052348015600e575f5ffd5b506112a48061001c5f395ff3fe60806040526004361061007e575f3560e01c80636b0d5cc41161004d5780636b0d5cc414610271578063b0d691fe14610290578063ea5f61d0146102b2578063eac9b20d146102d157610085565b80630a664dba146101c85780635e87556d146101f95780635faac46b14610225578063642219af1461025257610085565b3661008557005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a02821417156100b057806020526020603cf35b505f80356001600160e01b03191681525f51602061124f5f395f51905f526020526040902080546001600160a01b03811690600160a01b900460f81b8161011c57604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b61012a81607f60f91b610384565b1561017b5760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa905061016a3d60408051918201905290565b3d5f823e81610177573d81fd5b3d81f35b610185815f610384565b156101c65760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af1905061016a3d60408051918201905290565b005b3480156101d3575f5ffd5b506101dc61039b565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610204575f5ffd5b50610218610213366004610d11565b6103c9565b6040516101f09190610e0c565b348015610230575f5ffd5b5061024461023f366004610e35565b610452565b6040516101f0929190610e5f565b34801561025d575f5ffd5b506101c661026c366004610d11565b61048e565b34801561027c575f5ffd5b506101c661028b366004610ec1565b6106d4565b34801561029b575f5ffd5b506f71727de22e5e9d8baf0edac6f37da0326101dc565b3480156102bd575f5ffd5b506102446102cc366004610e35565b6106e4565b3480156102dc575f5ffd5b506103566102eb366004610f41565b6040805180820182525f80825260209182018190526001600160e01b03199390931683525f51602061124f5f395f51905f528152918190208151808301909252546001600160a01b0381168252600160a01b900460f81b6001600160f81b0319169181019190915290565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016101f0565b6001600160f81b0319828116908216145b92915050565b5f6103c47fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005490565b905090565b606030306001600160a01b031663642219af8a8a8a8a8a8a8a6040516024016103f89796959493929190611071565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506040516020016104369291906110ce565b6040516020818303038152906040529050979650505050505050565b60605f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a90061048181868661070f565b92509250505b9250929050565b5f5b8681101561050c576105048888838181106104ad576104ad6110f9565b90506020028101906104bf919061110d565b6104cd90602081019061112b565b8989848181106104df576104df6110f9565b90506020028101906104f1919061110d565b6104ff906020810190611146565b6108b7565b600101610490565b505f5b848110156105cc575f86868381811061052a5761052a6110f9565b905060200281019061053c919061110d565b61054a90602081019061112b565b6001600160a01b0316146105c4576105c486868381811061056d5761056d6110f9565b905060200281019061057f919061110d565b61058d90602081019061112b565b87878481811061059f5761059f6110f9565b90506020028101906105b1919061110d565b6105bf906020810190611146565b610939565b60010161050f565b505f6105db602085018561112b565b6001600160a01b03161461060b5761060b6105f9602085018561112b565b6106066020860186611146565b610964565b5f5b818110156106ca575f838383818110610628576106286110f9565b905060200281019061063a919061110d565b61064890602081019061112b565b6001600160a01b0316146106c2576106c283838381811061066b5761066b6110f9565b905060200281019061067d919061110d565b61068b90602081019061112b565b84848481811061069d5761069d6110f9565b90506020028101906106af919061110d565b6106bd906020810190611146565b6109ea565b60010161060d565b5050505050505050565b6106df8383836108b7565b505050565b60605f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9016104818186865b60605f6001600160a01b03841660011480159061073357506107318585610b90565b155b1561075c57604051637c84ecfb60e01b81526001600160a01b0385166004820152602401610113565b825f0361077c5760405163f725081760e01b815260040160405180910390fd5b8267ffffffffffffffff81111561079557610795611189565b6040519080825280602002602001820160405280156107be578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b0382161580159061080257506001600160a01b038216600114155b801561080d57508381105b156108665781838281518110610825576108256110f9565b6001600160a01b039283166020918202929092018101919091529281165f90815292879052604090922054909116908061085e816111b1565b9150506107e0565b6001600160a01b03821660011480159061087f57505f81115b156108ab57826108906001836111c9565b815181106108a0576108a06110f9565b602002602001015191505b80835250935093915050565b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9006108e28185610bca565b6040516306d61fe760e41b81526001600160a01b03851690636d61fe709061091090869086906004016111dc565b5f604051808303815f87803b158015610927575f5ffd5b505af11580156106ca573d5f5f3e3d5ffd5b7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9016108e28185610bca565b5f61098d7fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005490565b90506001600160a01b038116156109c25760405163741cbe0360e01b81526001600160a01b0382166004820152602401610113565b6108e2847fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e459820055565b5f6109f860048284866111ef565b610a0191611216565b90505f83836004818110610a1757610a176110f9565b909101356001600160f81b03191691505f9050610a3784600581886111ef565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929350610a799250859150610c9e9050565b15610ac65760405162461bcd60e51b815260206004820152601e60248201527f46756e6374696f6e2073656c6563746f7220616c7265616479207573656400006044820152606401610113565b6040805180820182526001600160a01b038881168083526001600160f81b0319861660208085019182526001600160e01b031989165f9081525f51602061124f5f395f51905f5290915285902093518454915160f81c600160a01b026001600160a81b03199092169316929092179190911790915590516306d61fe760e41b8152636d61fe7090610b5b908490600401610e0c565b5f604051808303815f87803b158015610b72575f5ffd5b505af1158015610b84573d5f5f3e3d5ffd5b50505050505050505050565b5f60016001600160a01b03831614801590610bc357506001600160a01b038281165f908152602085905260409020541615155b9392505050565b6001600160a01b0381161580610be957506001600160a01b0381166001145b15610c1257604051637c84ecfb60e01b81526001600160a01b0382166004820152602401610113565b6001600160a01b038181165f908152602084905260409020541615610c5557604051631034f46960e21b81526001600160a01b0382166004820152602401610113565b60015f818152602093909352604080842080546001600160a01b039485168087529286208054959091166001600160a01b03199586161790559190935280549091169091179055565b6001600160e01b0319165f9081525f51602061124f5f395f51905f5260205260409020546001600160a01b0316151590565b5f5f83601f840112610ce0575f5ffd5b50813567ffffffffffffffff811115610cf7575f5ffd5b6020830191508360208260051b8501011115610487575f5ffd5b5f5f5f5f5f5f5f6080888a031215610d27575f5ffd5b873567ffffffffffffffff811115610d3d575f5ffd5b610d498a828b01610cd0565b909850965050602088013567ffffffffffffffff811115610d68575f5ffd5b610d748a828b01610cd0565b909650945050604088013567ffffffffffffffff811115610d93575f5ffd5b88016040818b031215610da4575f5ffd5b9250606088013567ffffffffffffffff811115610dbf575f5ffd5b610dcb8a828b01610cd0565b989b979a50959850939692959293505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610bc36020830184610dde565b6001600160a01b0381168114610e32575f5ffd5b50565b5f5f60408385031215610e46575f5ffd5b8235610e5181610e1e565b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b81811015610ea15783516001600160a01b0316835260209384019390920191600101610e7a565b50506001600160a01b039490941660209390930192909252509092915050565b5f5f5f60408486031215610ed3575f5ffd5b8335610ede81610e1e565b9250602084013567ffffffffffffffff811115610ef9575f5ffd5b8401601f81018613610f09575f5ffd5b803567ffffffffffffffff811115610f1f575f5ffd5b866020828401011115610f30575f5ffd5b939660209190910195509293505050565b5f60208284031215610f51575f5ffd5b81356001600160e01b031981168114610bc3575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135610f9c81610e1e565b6001600160a01b03168352602082013536839003601e19018112610fbe575f5ffd5b820160208101903567ffffffffffffffff811115610fda575f5ffd5b803603821315610fe8575f5ffd5b60406020860152610ffd604086018284610f68565b95945050505050565b5f8383855260208501945060208460051b820101835f5b8681101561106557838303601f19018852813536879003603e19018112611042575f5ffd5b61104e84888301610f90565b6020998a019990945092909201915060010161101d565b50909695505050505050565b608081525f61108460808301898b611006565b828103602084015261109781888a611006565b905082810360408401526110ab8187610f90565b905082810360608401526110c0818587611006565b9a9950505050505050505050565b6001600160a01b03831681526040602082018190525f906110f190830184610dde565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112611121575f5ffd5b9190910192915050565b5f6020828403121561113b575f5ffd5b8135610bc381610e1e565b5f5f8335601e1984360301811261115b575f5ffd5b83018035915067ffffffffffffffff821115611175575f5ffd5b602001915036819003821315610487575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016111c2576111c261119d565b5060010190565b818103818111156103955761039561119d565b602081525f6110f1602083018486610f68565b5f5f858511156111fd575f5ffd5b83861115611209575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015611247576001600160e01b0319600485900360031b81901b82161691505b509291505056fee3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a902a264697066735822122072b04b2f972cc253a90e875921f15eb7f82b8e0a5d58d5743d0eca74f391c67364736f6c634300081c0033"; + hex"6080604052348015600e575f5ffd5b506123028061001c5f395ff3fe60806040526004361061007e575f3560e01c80636b0d5cc41161004d5780636b0d5cc41461039d578063b0d691fe146103c5578063ea5f61d0146103ef578063eac9b20d1461042c57610085565b80630a664dba146102d25780635e87556d146102fc5780635faac46b14610338578063642219af1461037557610085565b3661008557005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a02821417156100b057806020526020603cf35b505f6100ba610468565b6002015f5f357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f2090505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f825f0160149054906101000a900460f81b90505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036101fc575f357fffffffff00000000000000000000000000000000000000000000000000000000166040517f48c9ceda0000000000000000000000000000000000000000000000000000000081526004016101f39190611706565b60405180910390fd5b61020a8160fe60f81b610496565b1561026657610225565b5f6040519050818101604052919050565b61022e36610214565b365f823761023c6014610214565b3360601b81525f5f6014360184875afa6102553d610214565b3d5f823e81610262573d81fd5b3d81f35b610273815f60f81b610496565b156102d05761028e565b5f6040519050818101604052919050565b6102973661027d565b365f82376102a5601461027d565b3360601b81525f5f60143601845f885af16102bf3d61027d565b3d5f823e816102cc573d81fd5b3d81f35b005b3480156102dd575f5ffd5b506102e66104e6565b6040516102f3919061175e565b60405180910390f35b348015610307575f5ffd5b50610322600480360381019061031d9190611802565b6104f4565b60405161032f9190611952565b60405180910390f35b348015610343575f5ffd5b5061035e600480360381019061035991906119cf565b61059f565b60405161036c929190611ac4565b60405180910390f35b348015610380575f5ffd5b5061039b60048036038101906103969190611802565b6105d0565b005b3480156103a8575f5ffd5b506103c360048036038101906103be9190611b82565b6108c3565b005b3480156103d0575f5ffd5b506103d96108d3565b6040516103e6919061175e565b60405180910390f35b3480156103fa575f5ffd5b50610415600480360381019061041091906119cf565b6108ea565b604051610423929190611ac4565b60405180910390f35b348015610437575f5ffd5b50610452600480360381019061044d9190611c09565b61091c565b60405161045f9190611cac565b60405180910390f35b5f5f7fe3a55571e8f241b58442871487cc151a8cb048bb4ad24e833467f724ec89a9005f1b90508091505090565b5f817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614905092915050565b5f6104ef610a3c565b905090565b6060303073ffffffffffffffffffffffffffffffffffffffff1663642219af8a8a8a8a8a8a8a6040516024016105309796959493929190611efc565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001610583929190611f61565b6040516020818303038152906040529050979650505050505050565b60605f5f6105ab610468565b5f0190506105c4858583610a6b9092919063ffffffff16565b92509250509250929050565b5f5b8787905081101561065c5761064f8888838181106105f3576105f2611f8f565b5b90506020028101906106059190611fc8565b5f0160208101906106169190611fef565b89898481811061062957610628611f8f565b5b905060200281019061063b9190611fc8565b806020019061064a919061201a565b610d8e565b80806001019150506105d2565b505f5b85859050811015610753575f73ffffffffffffffffffffffffffffffffffffffff1686868381811061069457610693611f8f565b5b90506020028101906106a69190611fc8565b5f0160208101906106b79190611fef565b73ffffffffffffffffffffffffffffffffffffffff160315610746576107458686838181106106e9576106e8611f8f565b5b90506020028101906106fb9190611fc8565b5f01602081019061070c9190611fef565b87878481811061071f5761071e611f8f565b5b90506020028101906107319190611fc8565b8060200190610740919061201a565b610e1c565b5b808060010191505061065f565b505f73ffffffffffffffffffffffffffffffffffffffff16835f01602081019061077d9190611fef565b73ffffffffffffffffffffffffffffffffffffffff16146107c3576107c2835f0160208101906107ad9190611fef565b8480602001906107bd919061201a565b610eab565b5b5f5b828290508110156108b9575f73ffffffffffffffffffffffffffffffffffffffff168383838181106107fa576107f9611f8f565b5b905060200281019061080c9190611fc8565b5f01602081019061081d9190611fef565b73ffffffffffffffffffffffffffffffffffffffff1603156108ac576108ab83838381811061084f5761084e611f8f565b5b90506020028101906108619190611fc8565b5f0160208101906108729190611fef565b84848481811061088557610884611f8f565b5b90506020028101906108979190611fc8565b80602001906108a6919061201a565b610f9d565b5b80806001019150506107c5565b5050505050505050565b6108ce838383610d8e565b505050565b5f6f71727de22e5e9d8baf0edac6f37da032905090565b60605f5f6108f6610468565b6001019050610910858583610a6b9092919063ffffffff16565b92509250509250929050565b61092461167c565b61092c610468565b6002015f837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900460f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815250509050919050565b5f5f7fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005f1b9050805491505090565b60605f600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015610ab25750610ab085856111fa565b155b15610af457836040517f7c84ecfb000000000000000000000000000000000000000000000000000000008152600401610aeb919061175e565b60405180910390fd5b5f8303610b2d576040517ff725081700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8267ffffffffffffffff811115610b4757610b4661207c565b5b604051908082528060200260200182016040528015610b755781602001602082028036833780820191505090505b5091505f5f9050855f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610c465750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015610c5157508381105b15610d175781838281518110610c6a57610c69611f8f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050855f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508080610d0f906120d6565b915050610bdd565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610d5357505f81115b15610d825782600182610d66919061211d565b81518110610d7757610d76611f8f565b5b602002602001015191505b80835250935093915050565b5f610d97610468565b5f019050610dae84826112c990919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16636d61fe7084846040518363ffffffff1660e01b8152600401610de992919061217c565b5f604051808303815f87803b158015610e00575f5ffd5b505af1158015610e12573d5f5f3e3d5ffd5b5050505050505050565b5f610e25610468565b6001019050610e3d84826112c990919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16636d61fe7084846040518363ffffffff1660e01b8152600401610e7892919061217c565b5f604051808303815f87803b158015610e8f575f5ffd5b505af1158015610ea1573d5f5f3e3d5ffd5b5050505050505050565b5f610eb4610a3c565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f2657806040517f741cbe03000000000000000000000000000000000000000000000000000000008152600401610f1d919061175e565b60405180910390fd5b610f2f84611599565b8373ffffffffffffffffffffffffffffffffffffffff16636d61fe7084846040518363ffffffff1660e01b8152600401610f6a92919061217c565b5f604051808303815f87803b158015610f81575f5ffd5b505af1158015610f93573d5f5f3e3d5ffd5b5050505050505050565b5f82825f90600492610fb1939291906121a6565b90610fbc91906121f6565b90505f83836004818110610fd357610fd2611f8f565b5b9050013560f81c60f81b90505f84846005908092610ff3939291906121a6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050509050611040836115c6565b15611080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611077906122ae565b60405180910390fd5b60405180604001604052808773ffffffffffffffffffffffffffffffffffffffff168152602001837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152506110d5610468565b6002015f857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a81548160ff021916908360f81c02179055509050508573ffffffffffffffffffffffffffffffffffffffff16636d61fe70826040518263ffffffff1660e01b81526004016111c59190611952565b5f604051808303815f87803b1580156111dc575f5ffd5b505af11580156111ee573d5f5f3e3d5ffd5b50505050505050505050565b5f8173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff16141580156112c157505f73ffffffffffffffffffffffffffffffffffffffff16835f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061132f5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b1561137157806040517f7c84ecfb000000000000000000000000000000000000000000000000000000008152600401611368919061175e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16825f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461143e57806040517f40d3d1a4000000000000000000000000000000000000000000000000000000008152600401611435919061175e565b60405180910390fd5b815f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16825f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080825f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f7fcd97a6611018468306afd07ac8b14141bc76df8b844b3bcba1768d81e45982005f1b90508181555050565b5f5f6115d0610468565b6002015f847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f2090505f73ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415915050919050565b60405180604001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611700816116cc565b82525050565b5f6020820190506117195f8301846116f7565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117488261171f565b9050919050565b6117588161173e565b82525050565b5f6020820190506117715f83018461174f565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126117a05761179f61177f565b5b8235905067ffffffffffffffff8111156117bd576117bc611783565b5b6020830191508360208202830111156117d9576117d8611787565b5b9250929050565b5f5ffd5b5f604082840312156117f9576117f86117e0565b5b81905092915050565b5f5f5f5f5f5f5f6080888a03121561181d5761181c611777565b5b5f88013567ffffffffffffffff81111561183a5761183961177b565b5b6118468a828b0161178b565b9750975050602088013567ffffffffffffffff8111156118695761186861177b565b5b6118758a828b0161178b565b9550955050604088013567ffffffffffffffff8111156118985761189761177b565b5b6118a48a828b016117e4565b935050606088013567ffffffffffffffff8111156118c5576118c461177b565b5b6118d18a828b0161178b565b925092505092959891949750929550565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611924826118e2565b61192e81856118ec565b935061193e8185602086016118fc565b6119478161190a565b840191505092915050565b5f6020820190508181035f83015261196a818461191a565b905092915050565b61197b8161173e565b8114611985575f5ffd5b50565b5f8135905061199681611972565b92915050565b5f819050919050565b6119ae8161199c565b81146119b8575f5ffd5b50565b5f813590506119c9816119a5565b92915050565b5f5f604083850312156119e5576119e4611777565b5b5f6119f285828601611988565b9250506020611a03858286016119bb565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611a3f8161173e565b82525050565b5f611a508383611a36565b60208301905092915050565b5f602082019050919050565b5f611a7282611a0d565b611a7c8185611a17565b9350611a8783611a27565b805f5b83811015611ab7578151611a9e8882611a45565b9750611aa983611a5c565b925050600181019050611a8a565b5085935050505092915050565b5f6040820190508181035f830152611adc8185611a68565b9050611aeb602083018461174f565b9392505050565b5f611afc8261173e565b9050919050565b611b0c81611af2565b8114611b16575f5ffd5b50565b5f81359050611b2781611b03565b92915050565b5f5f83601f840112611b4257611b4161177f565b5b8235905067ffffffffffffffff811115611b5f57611b5e611783565b5b602083019150836001820283011115611b7b57611b7a611787565b5b9250929050565b5f5f5f60408486031215611b9957611b98611777565b5b5f611ba686828701611b19565b935050602084013567ffffffffffffffff811115611bc757611bc661177b565b5b611bd386828701611b2d565b92509250509250925092565b611be8816116cc565b8114611bf2575f5ffd5b50565b5f81359050611c0381611bdf565b92915050565b5f60208284031215611c1e57611c1d611777565b5b5f611c2b84828501611bf5565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b5f611c6982611c34565b9050919050565b611c7981611c5f565b82525050565b604082015f820151611c935f850182611a36565b506020820151611ca66020850182611c70565b50505050565b5f604082019050611cbf5f830184611c7f565b92915050565b5f82825260208201905092915050565b5f819050919050565b5f611cec6020840184611988565b905092915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83356001602003843603038112611d1c57611d1b611cfc565b5b83810192508235915060208301925067ffffffffffffffff821115611d4457611d43611cf4565b5b600182023603831315611d5a57611d59611cf8565b5b509250929050565b5f82825260208201905092915050565b828183375f83830152505050565b5f611d8b8385611d62565b9350611d98838584611d72565b611da18361190a565b840190509392505050565b5f60408301611dbd5f840184611cde565b611dc95f860182611a36565b50611dd76020840184611d00565b8583036020870152611dea838284611d80565b925050508091505092915050565b5f611e038383611dac565b905092915050565b5f82356001604003833603038112611e2657611e25611cfc565b5b82810191505092915050565b5f602082019050919050565b5f611e498385611cc5565b935083602084028501611e5b84611cd5565b805f5b87811015611e9e578484038952611e758284611e0b565b611e7f8582611df8565b9450611e8a83611e32565b925060208a01995050600181019050611e5e565b50829750879450505050509392505050565b5f60408301611ec15f840184611cde565b611ecd5f860182611a36565b50611edb6020840184611d00565b8583036020870152611eee838284611d80565b925050508091505092915050565b5f6080820190508181035f830152611f1581898b611e3e565b90508181036020830152611f2a818789611e3e565b90508181036040830152611f3e8186611eb0565b90508181036060830152611f53818486611e3e565b905098975050505050505050565b5f604082019050611f745f83018561174f565b8181036020830152611f86818461191a565b90509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f82356001604003833603038112611fe357611fe2611fbc565b5b80830191505092915050565b5f6020828403121561200457612003611777565b5b5f61201184828501611988565b91505092915050565b5f5f8335600160200384360303811261203657612035611fbc565b5b80840192508235915067ffffffffffffffff82111561205857612057611fc0565b5b60208301925060018202360383131561207457612073611fc4565b5b509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6120e08261199c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612112576121116120a9565b5b600182019050919050565b5f6121278261199c565b91506121328361199c565b925082820390508181111561214a576121496120a9565b5b92915050565b5f61215b83856118ec565b9350612168838584611d72565b6121718361190a565b840190509392505050565b5f6020820190508181035f830152612195818486612150565b90509392505050565b5f5ffd5b5f5ffd5b5f5f858511156121b9576121b861219e565b5b838611156121ca576121c96121a2565b5b6001850283019150848603905094509492505050565b5f82905092915050565b5f82821b905092915050565b5f61220183836121e0565b8261220c81356116cc565b9250600482101561224c576122477fffffffff00000000000000000000000000000000000000000000000000000000836004036008026121ea565b831692505b505092915050565b5f82825260208201905092915050565b7f46756e6374696f6e2073656c6563746f7220616c7265616479207573656400005f82015250565b5f612298601e83612254565b91506122a382612264565b602082019050919050565b5f6020820190508181035f8301526122c58161228c565b905091905056fea2646970667358221220b90741b9c42163f6c8d87ffeafdf59adca32d114497979a80f2aabbe52604d3764736f6c634300081c0033"; bytes public constant ERC7579_RHINESTONE_TRAMPOLOINE_BYTECODE = hex"6080604052348015600e575f5ffd5b5061081d8061001c5f395ff3fe608060405260043610610058575f3560e01c80630a664dba146101b55780635faac46b146101e6578063b0d691fe14610213578063e1c7392a14610235578063ea5f61d014610249578063eac9b20d146102685761005f565b3661005f57005b5f3560e01c63bc197c81811463f23a6e6182141763150b7a028214171561008a57806020526020603cf35b505f80356001600160e01b03191681527ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea046020526040902080546001600160a01b03811690600160a01b900460f81b8161010957604051632464e76d60e11b81526001600160e01b03195f351660048201526024015b60405180910390fd5b61011781607f60f91b61032e565b156101685760408051368101909152365f823760408051601481019091523360601b90525f803660140183865afa90506101573d60408051918201905290565b3d5f823e81610164573d81fd5b3d81f35b610172815f61032e565b156101b35760408051368101909152365f823760408051601481019091523360601b90525f80366014018382875af190506101573d60408051918201905290565b005b3480156101c0575f5ffd5b506101c9610345565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101f1575f5ffd5b5061020561020036600461068d565b610373565b6040516101dd9291906106c2565b34801561021e575f5ffd5b506f71727de22e5e9d8baf0edac6f37da0326101c9565b348015610240575f5ffd5b506101b36103ae565b348015610254575f5ffd5b5061020561026336600461068d565b610480565b348015610273575f5ffd5b50610300610282366004610724565b6040805180820182525f80825260209182018190526001600160e01b03199390931683527ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea048152918190208151808301909252546001600160a01b0381168252600160a01b900460f81b6001600160f81b0319169181019190915290565b6040805182516001600160a01b031681526020928301516001600160f81b03191692810192909252016101dd565b6001600160f81b0319828116908216145b92915050565b5f61036e7f36e05829dd1b9a4411d96a3549582172d7f071c1c0db5c573fcf94eb284316085490565b905090565b60605f7ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea026103a28186866104ab565b92509250509250929050565b6103ea7334dedac925c00d63bd91800ff821e535fe59d6f57f36e05829dd1b9a4411d96a3549582172d7f071c1c0db5c573fcf94eb2843160855565b60408051737066f491ce8b5f782f315dfbd549f2107a32641360611b60208201528151601481830301815260348201928390526306d61fe760e41b9092527334dedac925c00d63bd91800ff821e535fe59d6f591636d61fe7091610451919060380161074b565b5f604051808303815f87803b158015610468575f5ffd5b505af115801561047a573d5f5f3e3d5ffd5b50505050565b60605f7ff88ce1fdb7fb1cbd3282e49729100fa3f2d6ee9f797961fe4fb1871cea89ea036103a28186865b60605f6001600160a01b0384166001148015906104cf57506104cd8585610653565b155b156104f857604051637c84ecfb60e01b81526001600160a01b0385166004820152602401610100565b825f036105185760405163f725081760e01b815260040160405180910390fd5b8267ffffffffffffffff81111561053157610531610780565b60405190808252806020026020018201604052801561055a578160200160208202803683370190505b506001600160a01b038086165f90815260208890526040812054929450911691505b6001600160a01b0382161580159061059e57506001600160a01b038216600114155b80156105a957508381105b1561060257818382815181106105c1576105c1610794565b6001600160a01b039283166020918202929092018101919091529281165f9081529287905260409092205490911690806105fa816107bc565b91505061057c565b6001600160a01b03821660011480159061061b57505f81115b15610647578261062c6001836107d4565b8151811061063c5761063c610794565b602002602001015191505b80835250935093915050565b5f60016001600160a01b0383161480159061068657506001600160a01b038281165f908152602085905260409020541615155b9392505050565b5f5f6040838503121561069e575f5ffd5b82356001600160a01b03811681146106b4575f5ffd5b946020939093013593505050565b604080825283519082018190525f9060208501906060840190835b818110156107045783516001600160a01b03168352602093840193909201916001016106dd565b50506001600160a01b039490941660209390930192909252509092915050565b5f60208284031215610734575f5ffd5b81356001600160e01b031981168114610686575f5ffd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016107cd576107cd6107a8565b5060010190565b8181038181111561033f5761033f6107a856fea26469706673582212208b8d179eb9f1d514092184d86650903af803b01f367d0d2440620538d93230ac64736f6c634300081b0033"; bytes public constant MSAPROXY_BYTECODE = - hex"608060405260405161045a38038061045a833981016040819052610022916102a7565b61002a61003b565b610034828261009c565b50506103ab565b5f60ff1961006a60017ff63b257b7881773a84d328ab92140e19ab791f7b439c76ba9837aa0d6ad30af0610376565b60405160200161007c91815260200190565b604051602081830303815290604052805190602001201690506001815d50565b6100a5826100fa565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100ee576100e98282610175565b505050565b6100f66101ea565b5050565b806001600160a01b03163b5f0361013457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b0316846040516101919190610395565b5f60405180830381855af49150503d805f81146101c9576040519150601f19603f3d011682016040523d82523d5f602084013e6101ce565b606091505b5090925090506101df85838361020b565b925050505b92915050565b34156102095760405163b398979f60e01b815260040160405180910390fd5b565b6060826102205761021b8261026a565b610263565b815115801561023757506001600160a01b0384163b155b1561026057604051639996b31560e01b81526001600160a01b038516600482015260240161012b565b50805b9392505050565b80511561027a5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156102b8575f5ffd5b82516001600160a01b03811681146102ce575f5ffd5b60208401519092506001600160401b038111156102e9575f5ffd5b8301601f810185136102f9575f5ffd5b80516001600160401b0381111561031257610312610293565b604051601f8201601f19908116603f011681016001600160401b038111828210171561034057610340610293565b604052818152828201602001871015610357575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b818103818111156101e457634e487b7160e01b5f52601160045260245ffd5b5f82518060208501845e5f920191825250919050565b60a3806103b75f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156069573d5ff35b3d5ffdfea2646970667358221220917b117bd639a5c1424676eeebd5c60b66b5c82bd16f9df87d1255745f0c121964736f6c634300081c0033"; + hex"60806040526040516107983803806107988339818101604052810190610025919061054b565b61003361004a60201b60201c565b61004382826100af60201b60201c565b50506106b8565b5f60ff5f1b1960017ff63b257b7881773a84d328ab92140e19ab791f7b439c76ba9837aa0d6ad30af05f1c61007f91906105db565b60405160200161008f919061061d565b604051602081830303815290604052805190602001201690506001815d50565b6100be8261013360201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156101205761011a828261020260201b60201c565b5061012f565b61012e61028860201b60201c565b5b5050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361018e57806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016101859190610645565b60405180910390fd5b806101c07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6102c460201b60201c565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f5f8473ffffffffffffffffffffffffffffffffffffffff168460405161022b91906106a2565b5f60405180830381855af49150503d805f8114610263576040519150601f19603f3d011682016040523d82523d5f602084013e610268565b606091505b509150915061027e8583836102cd60201b60201c565b9250505092915050565b5f3411156102c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f819050919050565b6060826102e8576102e38261036060201b60201c565b610358565b5f825114801561030e57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561035057836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016103479190610645565b60405180910390fd5b819050610359565b5b9392505050565b5f815111156103725780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103de826103b5565b9050919050565b6103ee816103d4565b81146103f8575f5ffd5b50565b5f81519050610409816103e5565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61045d82610417565b810181811067ffffffffffffffff8211171561047c5761047b610427565b5b80604052505050565b5f61048e6103a4565b905061049a8282610454565b919050565b5f67ffffffffffffffff8211156104b9576104b8610427565b5b6104c282610417565b9050602081019050919050565b8281835e5f83830152505050565b5f6104ef6104ea8461049f565b610485565b90508281526020810184848401111561050b5761050a610413565b5b6105168482856104cf565b509392505050565b5f82601f8301126105325761053161040f565b5b81516105428482602086016104dd565b91505092915050565b5f5f60408385031215610561576105606103ad565b5b5f61056e858286016103fb565b925050602083015167ffffffffffffffff81111561058f5761058e6103b1565b5b61059b8582860161051e565b9150509250929050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6105e5826105a5565b91506105f0836105a5565b9250828203905081811115610608576106076105ae565b5b92915050565b610617816105a5565b82525050565b5f6020820190506106305f83018461060e565b92915050565b61063f816103d4565b82525050565b5f6020820190506106585f830184610636565b92915050565b5f81519050919050565b5f81905092915050565b5f61067c8261065e565b6106868185610668565b93506106968185602086016104cf565b80840191505092915050565b5f6106ad8284610672565b915081905092915050565b60d4806106c45f395ff3fe6080604052600a600c565b005b60186014601a565b6026565b565b5f60216044565b905090565b365f5f375f5f365f845af43d5f5f3e805f81146040573d5ff35b3d5ffd5b5f606e7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6095565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f81905091905056fea2646970667358221220c1de7109ed587fe9e758c24d4d24494182d4b6d7c4bdda4e7a5f1fea44ff709564736f6c634300081c0033"; } From def50fd9c902b281a0a36dcd1ba873d75e4ea85e Mon Sep 17 00:00:00 2001 From: highskore Date: Wed, 19 Mar 2025 12:29:48 +0000 Subject: [PATCH 15/15] chore: remove unnecessary changes --- foundry.toml | 2 -- package.json | 3 +-- pnpm-lock.yaml | 8 -------- remappings.txt | 3 +-- src/Mocks.sol | 4 ++-- test/Diff.t.sol | 3 ++- 6 files changed, 6 insertions(+), 17 deletions(-) diff --git a/foundry.toml b/foundry.toml index 53eaa08c..a6c68942 100644 --- a/foundry.toml +++ b/foundry.toml @@ -11,8 +11,6 @@ ignored_warnings_from = ["node_modules", "src/integrations"] gas_limit = "18446744073709551615" memory_limit = 2147483648 verbosity = 3 -optimizer_runs = 200 -bytecode_hash = 'none' [rpc_endpoints] mainnet = "${MAINNET_RPC_URL}" diff --git a/package.json b/package.json index ac860bbc..5c53b8c4 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,7 @@ "forge-std": "github:foundry-rs/forge-std", "solady": "github:vectorized/solady", "solarray": "github:sablier-labs/solarray", - "solhint": "^5.0.3", - "solmate": "^6.8.0" + "solhint": "^5.0.3" }, "devDependencies": { "@changesets/cli": "^2.27.9" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 970336d8..4f1b2aa7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,9 +41,6 @@ importers: solhint: specifier: ^5.0.3 version: 5.0.3(typescript@4.9.5) - solmate: - specifier: ^6.8.0 - version: 6.8.0 devDependencies: '@changesets/cli': specifier: ^2.27.9 @@ -1906,9 +1903,6 @@ packages: peerDependencies: hardhat: ^2.11.0 - solmate@6.8.0: - resolution: {integrity: sha512-/oI8kgEvSxGG1mrFv3FmCEZd0F8Z9VzRmoYMIhzmmzt6mjtPwfdCm3oh8yOL7bMHJBSfXJuMpnMPrM0uyaKsKg==} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -4559,8 +4553,6 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solmate@6.8.0: {} - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 diff --git a/remappings.txt b/remappings.txt index cc31c92e..556ee76f 100644 --- a/remappings.txt +++ b/remappings.txt @@ -9,5 +9,4 @@ forge-std/=node_modules/forge-std/src/ solady/=node_modules/solady/src/ solarray/=node_modules/solarray/src/ @prb/math/=node_modules/@prb/math/src/ -ExcessivelySafeCall/=node_modules/excessively-safe-call/src/ -solmate/=node_modules/solmate/src/ \ No newline at end of file +ExcessivelySafeCall/=node_modules/excessively-safe-call/src/ \ No newline at end of file diff --git a/src/Mocks.sol b/src/Mocks.sol index 1457248d..e149e041 100644 --- a/src/Mocks.sol +++ b/src/Mocks.sol @@ -27,5 +27,5 @@ import { MockFallback } from "./module-bases/mocks/MockFallback.sol"; TOKENS //////////////////////////////////////////////////////////////*/ -import { MockERC20 } from "solmate/test/utils/mocks/MockERC20.sol"; -import { MockERC721 } from "solmate/test/utils/mocks/MockERC721.sol"; +import { MockERC20 } from "forge-std/mocks/MockERC20.sol"; +import { MockERC721 } from "forge-std/mocks/MockERC721.sol"; diff --git a/test/Diff.t.sol b/test/Diff.t.sol index 713b2337..851ee6f1 100644 --- a/test/Diff.t.sol +++ b/test/Diff.t.sol @@ -48,7 +48,8 @@ contract ERC7579DifferentialModuleKitLibTest is BaseTest { mockTarget = new MockTarget(); // Setup aux - token = new MockERC20("Mock Token", "MTK", 18); + token = new MockERC20(); + token.initialize("Mock Token", "MTK", 18); deal(address(token), instance.account, 100 ether); vm.deal(instance.account, 1000 ether); }