Source Code
Overview
HYPE Balance
HYPE Value
$0.00Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 4 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
1988429 | 95 days ago | Contract Creation | 0 HYPE | |||
1988429 | 95 days ago | Contract Creation | 0 HYPE | |||
1988429 | 95 days ago | Contract Creation | 0 HYPE | |||
1988429 | 95 days ago | Contract Creation | 0 HYPE |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x404f000C...F7deeA98A The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Deployer1Deployer
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity 0.8.28; import {MORPHO_INIT_CODE, IRM_INIT_CODE, PUBLIC_ALLOCATOR_INIT_CODE} from "./libraries/BytecodesLib.sol"; import {ISafeProxyFactory} from "./interfaces/ISafeProxyFactory.sol"; import {ISafe} from "./interfaces/ISafe.sol"; import {ConfigLib, THRESHOLD} from "./libraries/ConfigLib.sol"; import {UtilsLib} from "./libraries/UtilsLib.sol"; import {IMorpho} from "../lib/morpho-blue/src/interfaces/IMorpho.sol"; contract Deployer1 { // For Etherscan verification: disambiguate the contract's deployed code. address public immutable self = address(this); constructor(address safeProxyFactory, address safeSingleton, address safeFallbackHandler, uint256 chainId) { // Prevent deploying at the same address on another chain. require(chainId == block.chainid, "Deployer1: Invalid chain ID"); // Deploy Morpho. address morpho = UtilsLib.deploy(MORPHO_INIT_CODE, abi.encode(address(this)), "Morpho"); // Deploy IRM. address adaptiveCurveIrm = UtilsLib.deploy(IRM_INIT_CODE, abi.encode(morpho), "AdaptiveCurveIrm"); // Deploy safe. address safe = ISafeProxyFactory(safeProxyFactory).createChainSpecificProxyWithNonce({ singleton: safeSingleton, initializer: hex"", saltNonce: uint256(uint160(address(this))) }); UtilsLib.logBookEntry("Safe", safe); // Config safe. ISafe(safe).setup( ConfigLib.owners(), THRESHOLD, address(0), hex"", safeFallbackHandler, address(0), 0, payable(0) ); // Config Morpho. IMorpho(morpho).enableIrm(address(0)); IMorpho(morpho).enableIrm(adaptiveCurveIrm); IMorpho(morpho).enableLltv(0); IMorpho(morpho).enableLltv(385000000000000000); IMorpho(morpho).enableLltv(625000000000000000); IMorpho(morpho).enableLltv(770000000000000000); IMorpho(morpho).enableLltv(860000000000000000); IMorpho(morpho).enableLltv(915000000000000000); IMorpho(morpho).enableLltv(945000000000000000); IMorpho(morpho).enableLltv(965000000000000000); IMorpho(morpho).enableLltv(980000000000000000); IMorpho(morpho).setOwner(safe); // Deploy PublicAllocator. UtilsLib.deploy(PUBLIC_ALLOCATOR_INIT_CODE, abi.encode(morpho), "PublicAllocator"); } } contract Deployer1Deployer { // For Etherscan verification: disambiguate the contract's deployed code. address public immutable self = address(this); constructor(address safeProxyFactory, address safeSingleton, address safeFallbackHandler) { UtilsLib.logBookEntry("Deployer1Deployer", address(this)); address deployer1 = address(new Deployer1{salt: 0}(safeProxyFactory, safeSingleton, safeFallbackHandler, block.chainid)); UtilsLib.logBookEntry("Deployer1", deployer1); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; function _sendLogPayloadImplementation(bytes memory payload) internal view { address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { pop( staticcall( gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0 ) ) } } function _castToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castToPure(_sendLogPayloadImplementation)(payload); } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, int256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.5.0; type Id is bytes32; struct MarketParams { address loanToken; address collateralToken; address oracle; address irm; uint256 lltv; } /// @dev Warning: For `feeRecipient`, `supplyShares` does not contain the accrued shares since the last interest /// accrual. struct Position { uint256 supplyShares; uint128 borrowShares; uint128 collateral; } /// @dev Warning: `totalSupplyAssets` does not contain the accrued interest since the last interest accrual. /// @dev Warning: `totalBorrowAssets` does not contain the accrued interest since the last interest accrual. /// @dev Warning: `totalSupplyShares` does not contain the additional shares accrued by `feeRecipient` since the last /// interest accrual. struct Market { uint128 totalSupplyAssets; uint128 totalSupplyShares; uint128 totalBorrowAssets; uint128 totalBorrowShares; uint128 lastUpdate; uint128 fee; } struct Authorization { address authorizer; address authorized; bool isAuthorized; uint256 nonce; uint256 deadline; } struct Signature { uint8 v; bytes32 r; bytes32 s; } /// @dev This interface is used for factorizing IMorphoStaticTyping and IMorpho. /// @dev Consider using the IMorpho interface instead of this one. interface IMorphoBase { /// @notice The EIP-712 domain separator. /// @dev Warning: Every EIP-712 signed message based on this domain separator can be reused on chains sharing the /// same chain id and on forks because the domain separator would be the same. function DOMAIN_SEPARATOR() external view returns (bytes32); /// @notice The owner of the contract. /// @dev It has the power to change the owner. /// @dev It has the power to set fees on markets and set the fee recipient. /// @dev It has the power to enable but not disable IRMs and LLTVs. function owner() external view returns (address); /// @notice The fee recipient of all markets. /// @dev The recipient receives the fees of a given market through a supply position on that market. function feeRecipient() external view returns (address); /// @notice Whether the `irm` is enabled. function isIrmEnabled(address irm) external view returns (bool); /// @notice Whether the `lltv` is enabled. function isLltvEnabled(uint256 lltv) external view returns (bool); /// @notice Whether `authorized` is authorized to modify `authorizer`'s position on all markets. /// @dev Anyone is authorized to modify their own positions, regardless of this variable. function isAuthorized(address authorizer, address authorized) external view returns (bool); /// @notice The `authorizer`'s current nonce. Used to prevent replay attacks with EIP-712 signatures. function nonce(address authorizer) external view returns (uint256); /// @notice Sets `newOwner` as `owner` of the contract. /// @dev Warning: No two-step transfer ownership. /// @dev Warning: The owner can be set to the zero address. function setOwner(address newOwner) external; /// @notice Enables `irm` as a possible IRM for market creation. /// @dev Warning: It is not possible to disable an IRM. function enableIrm(address irm) external; /// @notice Enables `lltv` as a possible LLTV for market creation. /// @dev Warning: It is not possible to disable a LLTV. function enableLltv(uint256 lltv) external; /// @notice Sets the `newFee` for the given market `marketParams`. /// @param newFee The new fee, scaled by WAD. /// @dev Warning: The recipient can be the zero address. function setFee(MarketParams memory marketParams, uint256 newFee) external; /// @notice Sets `newFeeRecipient` as `feeRecipient` of the fee. /// @dev Warning: If the fee recipient is set to the zero address, fees will accrue there and will be lost. /// @dev Modifying the fee recipient will allow the new recipient to claim any pending fees not yet accrued. To /// ensure that the current recipient receives all due fees, accrue interest manually prior to making any changes. function setFeeRecipient(address newFeeRecipient) external; /// @notice Creates the market `marketParams`. /// @dev Here is the list of assumptions on the market's dependencies (tokens, IRM and oracle) that guarantees /// Morpho behaves as expected: /// - The token should be ERC-20 compliant, except that it can omit return values on `transfer` and `transferFrom`. /// - The token balance of Morpho should only decrease on `transfer` and `transferFrom`. In particular, tokens with /// burn functions are not supported. /// - The token should not re-enter Morpho on `transfer` nor `transferFrom`. /// - The token balance of the sender (resp. receiver) should decrease (resp. increase) by exactly the given amount /// on `transfer` and `transferFrom`. In particular, tokens with fees on transfer are not supported. /// - The IRM should not re-enter Morpho. /// - The oracle should return a price with the correct scaling. /// @dev Here is a list of assumptions on the market's dependencies which, if broken, could break Morpho's liveness /// properties (funds could get stuck): /// - The token should not revert on `transfer` and `transferFrom` if balances and approvals are right. /// - The amount of assets supplied and borrowed should not go above ~1e35 (otherwise the computation of /// `toSharesUp` and `toSharesDown` can overflow). /// - The IRM should not revert on `borrowRate`. /// - The IRM should not return a very high borrow rate (otherwise the computation of `interest` in /// `_accrueInterest` can overflow). /// - The oracle should not revert `price`. /// - The oracle should not return a very high price (otherwise the computation of `maxBorrow` in `_isHealthy` or of /// `assetsRepaid` in `liquidate` can overflow). /// @dev The borrow share price of a market with less than 1e4 assets borrowed can be decreased by manipulations, to /// the point where `totalBorrowShares` is very large and borrowing overflows. function createMarket(MarketParams memory marketParams) external; /// @notice Supplies `assets` or `shares` on behalf of `onBehalf`, optionally calling back the caller's /// `onMorphoSupply` function with the given `data`. /// @dev Either `assets` or `shares` should be zero. Most use cases should rely on `assets` as an input so the /// caller is guaranteed to have `assets` tokens pulled from their balance, but the possibility to mint a specific /// amount of shares is given for full compatibility and precision. /// @dev Supplying a large amount can revert for overflow. /// @dev Supplying an amount of shares may lead to supply more or fewer assets than expected due to slippage. /// Consider using the `assets` parameter to avoid this. /// @param marketParams The market to supply assets to. /// @param assets The amount of assets to supply. /// @param shares The amount of shares to mint. /// @param onBehalf The address that will own the increased supply position. /// @param data Arbitrary data to pass to the `onMorphoSupply` callback. Pass empty data if not needed. /// @return assetsSupplied The amount of assets supplied. /// @return sharesSupplied The amount of shares minted. function supply( MarketParams memory marketParams, uint256 assets, uint256 shares, address onBehalf, bytes memory data ) external returns (uint256 assetsSupplied, uint256 sharesSupplied); /// @notice Withdraws `assets` or `shares` on behalf of `onBehalf` and sends the assets to `receiver`. /// @dev Either `assets` or `shares` should be zero. To withdraw max, pass the `shares`'s balance of `onBehalf`. /// @dev `msg.sender` must be authorized to manage `onBehalf`'s positions. /// @dev Withdrawing an amount corresponding to more shares than supplied will revert for underflow. /// @dev It is advised to use the `shares` input when withdrawing the full position to avoid reverts due to /// conversion roundings between shares and assets. /// @param marketParams The market to withdraw assets from. /// @param assets The amount of assets to withdraw. /// @param shares The amount of shares to burn. /// @param onBehalf The address of the owner of the supply position. /// @param receiver The address that will receive the withdrawn assets. /// @return assetsWithdrawn The amount of assets withdrawn. /// @return sharesWithdrawn The amount of shares burned. function withdraw( MarketParams memory marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver ) external returns (uint256 assetsWithdrawn, uint256 sharesWithdrawn); /// @notice Borrows `assets` or `shares` on behalf of `onBehalf` and sends the assets to `receiver`. /// @dev Either `assets` or `shares` should be zero. Most use cases should rely on `assets` as an input so the /// caller is guaranteed to borrow `assets` of tokens, but the possibility to mint a specific amount of shares is /// given for full compatibility and precision. /// @dev `msg.sender` must be authorized to manage `onBehalf`'s positions. /// @dev Borrowing a large amount can revert for overflow. /// @dev Borrowing an amount of shares may lead to borrow fewer assets than expected due to slippage. /// Consider using the `assets` parameter to avoid this. /// @param marketParams The market to borrow assets from. /// @param assets The amount of assets to borrow. /// @param shares The amount of shares to mint. /// @param onBehalf The address that will own the increased borrow position. /// @param receiver The address that will receive the borrowed assets. /// @return assetsBorrowed The amount of assets borrowed. /// @return sharesBorrowed The amount of shares minted. function borrow( MarketParams memory marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver ) external returns (uint256 assetsBorrowed, uint256 sharesBorrowed); /// @notice Repays `assets` or `shares` on behalf of `onBehalf`, optionally calling back the caller's /// `onMorphoRepay` function with the given `data`. /// @dev Either `assets` or `shares` should be zero. To repay max, pass the `shares`'s balance of `onBehalf`. /// @dev Repaying an amount corresponding to more shares than borrowed will revert for underflow. /// @dev It is advised to use the `shares` input when repaying the full position to avoid reverts due to conversion /// roundings between shares and assets. /// @dev An attacker can front-run a repay with a small repay making the transaction revert for underflow. /// @param marketParams The market to repay assets to. /// @param assets The amount of assets to repay. /// @param shares The amount of shares to burn. /// @param onBehalf The address of the owner of the debt position. /// @param data Arbitrary data to pass to the `onMorphoRepay` callback. Pass empty data if not needed. /// @return assetsRepaid The amount of assets repaid. /// @return sharesRepaid The amount of shares burned. function repay( MarketParams memory marketParams, uint256 assets, uint256 shares, address onBehalf, bytes memory data ) external returns (uint256 assetsRepaid, uint256 sharesRepaid); /// @notice Supplies `assets` of collateral on behalf of `onBehalf`, optionally calling back the caller's /// `onMorphoSupplyCollateral` function with the given `data`. /// @dev Interest are not accrued since it's not required and it saves gas. /// @dev Supplying a large amount can revert for overflow. /// @param marketParams The market to supply collateral to. /// @param assets The amount of collateral to supply. /// @param onBehalf The address that will own the increased collateral position. /// @param data Arbitrary data to pass to the `onMorphoSupplyCollateral` callback. Pass empty data if not needed. function supplyCollateral(MarketParams memory marketParams, uint256 assets, address onBehalf, bytes memory data) external; /// @notice Withdraws `assets` of collateral on behalf of `onBehalf` and sends the assets to `receiver`. /// @dev `msg.sender` must be authorized to manage `onBehalf`'s positions. /// @dev Withdrawing an amount corresponding to more collateral than supplied will revert for underflow. /// @param marketParams The market to withdraw collateral from. /// @param assets The amount of collateral to withdraw. /// @param onBehalf The address of the owner of the collateral position. /// @param receiver The address that will receive the collateral assets. function withdrawCollateral(MarketParams memory marketParams, uint256 assets, address onBehalf, address receiver) external; /// @notice Liquidates the given `repaidShares` of debt asset or seize the given `seizedAssets` of collateral on the /// given market `marketParams` of the given `borrower`'s position, optionally calling back the caller's /// `onMorphoLiquidate` function with the given `data`. /// @dev Either `seizedAssets` or `repaidShares` should be zero. /// @dev Seizing more than the collateral balance will underflow and revert without any error message. /// @dev Repaying more than the borrow balance will underflow and revert without any error message. /// @dev An attacker can front-run a liquidation with a small repay making the transaction revert for underflow. /// @param marketParams The market of the position. /// @param borrower The owner of the position. /// @param seizedAssets The amount of collateral to seize. /// @param repaidShares The amount of shares to repay. /// @param data Arbitrary data to pass to the `onMorphoLiquidate` callback. Pass empty data if not needed. /// @return The amount of assets seized. /// @return The amount of assets repaid. function liquidate( MarketParams memory marketParams, address borrower, uint256 seizedAssets, uint256 repaidShares, bytes memory data ) external returns (uint256, uint256); /// @notice Executes a flash loan. /// @dev Flash loans have access to the whole balance of the contract (the liquidity and deposited collateral of all /// markets combined, plus donations). /// @dev Warning: Not ERC-3156 compliant but compatibility is easily reached: /// - `flashFee` is zero. /// - `maxFlashLoan` is the token's balance of this contract. /// - The receiver of `assets` is the caller. /// @param token The token to flash loan. /// @param assets The amount of assets to flash loan. /// @param data Arbitrary data to pass to the `onMorphoFlashLoan` callback. function flashLoan(address token, uint256 assets, bytes calldata data) external; /// @notice Sets the authorization for `authorized` to manage `msg.sender`'s positions. /// @param authorized The authorized address. /// @param newIsAuthorized The new authorization status. function setAuthorization(address authorized, bool newIsAuthorized) external; /// @notice Sets the authorization for `authorization.authorized` to manage `authorization.authorizer`'s positions. /// @dev Warning: Reverts if the signature has already been submitted. /// @dev The signature is malleable, but it has no impact on the security here. /// @dev The nonce is passed as argument to be able to revert with a different error message. /// @param authorization The `Authorization` struct. /// @param signature The signature. function setAuthorizationWithSig(Authorization calldata authorization, Signature calldata signature) external; /// @notice Accrues interest for the given market `marketParams`. function accrueInterest(MarketParams memory marketParams) external; /// @notice Returns the data stored on the different `slots`. function extSloads(bytes32[] memory slots) external view returns (bytes32[] memory); } /// @dev This interface is inherited by Morpho so that function signatures are checked by the compiler. /// @dev Consider using the IMorpho interface instead of this one. interface IMorphoStaticTyping is IMorphoBase { /// @notice The state of the position of `user` on the market corresponding to `id`. /// @dev Warning: For `feeRecipient`, `supplyShares` does not contain the accrued shares since the last interest /// accrual. function position(Id id, address user) external view returns (uint256 supplyShares, uint128 borrowShares, uint128 collateral); /// @notice The state of the market corresponding to `id`. /// @dev Warning: `totalSupplyAssets` does not contain the accrued interest since the last interest accrual. /// @dev Warning: `totalBorrowAssets` does not contain the accrued interest since the last interest accrual. /// @dev Warning: `totalSupplyShares` does not contain the accrued shares by `feeRecipient` since the last interest /// accrual. function market(Id id) external view returns ( uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee ); /// @notice The market params corresponding to `id`. /// @dev This mapping is not used in Morpho. It is there to enable reducing the cost associated to calldata on layer /// 2s by creating a wrapper contract with functions that take `id` as input instead of `marketParams`. function idToMarketParams(Id id) external view returns (address loanToken, address collateralToken, address oracle, address irm, uint256 lltv); } /// @title IMorpho /// @author Morpho Labs /// @custom:contact [email protected] /// @dev Use this interface for Morpho to have access to all the functions with the appropriate function signatures. interface IMorpho is IMorphoBase { /// @notice The state of the position of `user` on the market corresponding to `id`. /// @dev Warning: For `feeRecipient`, `p.supplyShares` does not contain the accrued shares since the last interest /// accrual. function position(Id id, address user) external view returns (Position memory p); /// @notice The state of the market corresponding to `id`. /// @dev Warning: `m.totalSupplyAssets` does not contain the accrued interest since the last interest accrual. /// @dev Warning: `m.totalBorrowAssets` does not contain the accrued interest since the last interest accrual. /// @dev Warning: `m.totalSupplyShares` does not contain the accrued shares by `feeRecipient` since the last /// interest accrual. function market(Id id) external view returns (Market memory m); /// @notice The market params corresponding to `id`. /// @dev This mapping is not used in Morpho. It is there to enable reducing the cost associated to calldata on layer /// 2s by creating a wrapper contract with functions that take `id` as input instead of `marketParams`. function idToMarketParams(Id id) external view returns (MarketParams memory); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >= 0.5.0; interface ISafe { /** * @notice Sets an initial storage of the Safe contract. * @dev This method can only be called once. * If a proxy was created without setting up, anyone can call setup and claim the proxy. * @param _owners List of Safe owners. * @param _threshold Number of required confirmations for a Safe transaction. * @param to Contract address for optional delegate call. * @param data Data payload for optional delegate call. * @param fallbackHandler Handler for fallback calls to this contract * @param paymentToken Token that should be used for the payment (0 is ETH) * @param payment Value that should be paid * @param paymentReceiver Address that should receive the payment (or 0 if tx.origin) */ function setup( address[] calldata _owners, uint256 _threshold, address to, bytes calldata data, address fallbackHandler, address paymentToken, uint256 payment, address payable paymentReceiver ) external; /** * @notice Returns a list of Safe owners. * @return Array of Safe owners. */ function getOwners() external view returns (address[] memory); /** * @notice Returns the number of required confirmations for a Safe transaction aka the threshold. * @return Threshold number. */ function getThreshold() external view returns (uint256); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >= 0.5.0; interface ISafeProxyFactory { function proxyCreationCode() external view returns (bytes memory); function createChainSpecificProxyWithNonce(address singleton, bytes memory initializer, uint256 saltNonce) external returns (address proxy); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.0; bytes constant MORPHO_INIT_CODE = hex"60a034620001aa576001600160401b0390601f1990601f62003e8e3881900391820184168301929185841183851017620001395780839260409586528339602092839181010312620001aa57516001600160a01b0381169390849003620001aa5782518381018181108782111762000139578452600c81526b7a65726f206164647265737360a01b8382015284156200014f5750508151908101917f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921883524681830152306060830152606082526080820194828610908611176200013957849052519020608052600080546001600160a01b031916821781557f167d3e9c1016ab80e58802ca9da10ce5c6a0f4debc46a2e7a2cd9e56899a4fb59080a2613cde9081620001b0823960805181818161188a01526124b90152f35b634e487b7160e01b600052604160045260246000fd5b82845192839162461bcd60e51b835280600484015283519081602485015260005b828110620001925750506044935080600085601f938601015201168101030190fd5b80860182015187820160440152869450810162000170565b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c806313af403514612b90578063151c1ade14612b2057806320b76e81146128c1578063238d6579146126f75780632b4f013c1461256e5780632c3c9157146124dc5780633644e5151461248357806346904840146124315780634d98a93b1461231557806350d8cd4b146120815780635a64f51e14611fa95780635c2bea4914611d485780635c60e39a14611cb757806365e4ad9e14611c3757806370ae92d214611bd45780637784c68514611a685780638069218f1461167f5780638720316d1461150f5780638c1358a2146111f85780638da5cb5b146111a757806393c520621461110e578063a99aad8914610eda578063b485f3b814610e8d578063d8eabcb8146104e5578063e0232b4214610398578063e74b981b146102cd578063eecea000146101bb5763f2b863ce1461015157600080fd5b346101b85760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b85760ff604060209273ffffffffffffffffffffffffffffffffffffffff6101a4612c5a565b168152600484522054166040519015158152f35b80fd5b50346101b85760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b8576101f3612c5a565b602435801515908181036102c85761029790338552600660205273ffffffffffffffffffffffffffffffffffffffff604086209416938460005260205261024f60ff604060002054161515841415610249612fdd565b90612f41565b3385526006602052604085208460005260205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b60405190815233907fd5e969f01efe921d3f766bdebad25f0a05e3f237311f56482bf132d0326309c060203392a480f35b600080fd5b50346101b85760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b85761036c610308612c5a565b7fffffffffffffffffffffffff000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff91610350838654163314610249612f08565b826001549116938493610361612fdd565b908316851415612f41565b16176001557f2e979f80fe4d43055c584cf4a8467c55875ea36728fc37176c05acd784eb7a738280a280f35b50346101b85760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b8576103d0612c5a565b6024358260443567ffffffffffffffff81116104e15761040973ffffffffffffffffffffffffffffffffffffffff913690600401612de8565b91909461041f6104176132c2565b861515612f41565b1693846040518581527fc76f1b4fe4396ac07a9fa55a415d4ca430e72651d37d3401f3bed7cb13fc4f1260203392a361045984338761394a565b333b156104d25761049b91839160405193849283927f31f57072000000000000000000000000000000000000000000000000000000008452886004850161319c565b038183335af180156104d6576104be575b50506104bb9130903390613ab9565b80f35b6104c790612cc3565b6104d25782386104ac565b8280fd5b6040513d84823e3d90fd5b5080fd5b50346101b8576101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b85761051f36612d50565b9073ffffffffffffffffffffffffffffffffffffffff60a4351660a435036102c8576101043567ffffffffffffffff81116104e157610562903690600401612de8565b9160c4359260e4359260a0862093848452600360205261059f6fffffffffffffffffffffffffffffffff6002604087200154161515610249613016565b6105b46105aa6130f9565b8215881518612f41565b6105be858861336e565b6004602073ffffffffffffffffffffffffffffffffffffffff60408a015116604051928380927fa035b1fe0000000000000000000000000000000000000000000000000000000082525afa908115610e82578591610e50575b506106666106298260a435898c61376d565b156040519061063782612cf3565b601382527f706f736974696f6e206973206865616c746879000000000000000000000000006020830152612f41565b6080880151670de0b6b3a764000003670de0b6b3a76400008111610ca057670429d069189e00009080820291820403610ccd57670de0b6b3a764000090049182670de0b6b3a76400000392670de0b6b3a76400008411610e2357670de0b6b3a764000014610df4578715610cfc57506106df908761383b565b6ec097ce7bc90715b34b9f0fffffffff8101809111610ccd576ec097ce7bc90715b34b9f1000000000900480670de0b6b3a7640000810204670de0b6b3a76400001481151715610ccd57670ff59ee833b300006ec097ce7bc90715b34b9f10000000008390048082189082110281187fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810111610ca057610807926107d9926ec097ce7bc90715b34b9f10000000009190910480831890831102909118906107d4907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830190670de0b6b3a76400000261316b565b61384e565b85855260036020526001604086200154906fffffffffffffffffffffffffffffffff8260801c921690613c33565b935b808452600360205261083960016040862001546fffffffffffffffffffffffffffffffff8160801c911687613c55565b9461084381613c78565b82865260026020526040862073ffffffffffffffffffffffffffffffffffffffff60a4351660005260205260016040600020016fffffffffffffffffffffffffffffffff61089582549382851661322e565b167fffffffffffffffffffffffffffffffff000000000000000000000000000000008093161790556109266108c983613c78565b84885260036020526108e6600160408a200191825460801c61322e565b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b82865260036020526109576fffffffffffffffffffffffffffffffff60016040892001541688808203911102613c78565b83875260036020526fffffffffffffffffffffffffffffffff600160408920019116828254161790556109cd61098c89613c78565b84885260026020526040882073ffffffffffffffffffffffffffffffffffffffff60a435166000526020526108e6600160406000200191825460801c61322e565b8590869084885260026020526040882073ffffffffffffffffffffffffffffffffffffffff60a4351660005260205260016040600020015460801c15610b39575b506040519288845260208401528860408401526060830152608082015273ffffffffffffffffffffffffffffffffffffffff60a43516917fa4946ede45d0c6f06a0f5ce92c9ad3b4751452d2fe0e25010783bcab57a67e4160a03393a4610a90853373ffffffffffffffffffffffffffffffffffffffff60208a01511661394a565b81610acc575b505050610ac08173ffffffffffffffffffffffffffffffffffffffff604095511630903390613ab9565b82519182526020820152f35b333b156104d257610b0e91839160405193849283927fcf7ea196000000000000000000000000000000000000000000000000000000008452886004850161319c565b038183335af180156104d657610b25575b80610a96565b610b2f8291612cc3565b6101b85780610b1f565b91505082865260026020526040862073ffffffffffffffffffffffffffffffffffffffff60a435166000526020526fffffffffffffffffffffffffffffffff600160406000200154169083875260036020526001604088200154610bb46fffffffffffffffffffffffffffffffff82169160801c8285613c55565b818110908218021890610bc682613c78565b8589526003602052600160408a200190826fffffffffffffffffffffffffffffffff610bf684549382851661322e565b169116179055610c0582613c78565b85895260036020526040892090826fffffffffffffffffffffffffffffffff610c3284549382851661322e565b169116179055610c61610c4484613c78565b868a5260036020526108e6600160408c200191825460801c61322e565b84885260026020526040882073ffffffffffffffffffffffffffffffffffffffff60a43516600052602052600160406000200190815416905538610a0e565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b95965090610d78670de0b6b3a7640000918887526003602052610d73600160408920015491670ff59ee833b300009081816ec097ce7bc90715b34b9f10000000000410906ec097ce7bc90715b34b9f10000000000482180218916fffffffffffffffffffffffffffffffff8160801c91168a613c0d565b61383b565b04806ec097ce7bc90715b34b9f10000000008102046ec097ce7bc90715b34b9f10000000001481151715610dc757906ec097ce7bc90715b34b9f1000000000610dc1920261384e565b94610809565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b90506020813d602011610e7a575b81610e6b60209383612d0f565b810103126102c8575138610617565b3d9150610e5e565b6040513d87823e3d90fd5b50346101b85760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b85760ff60406020926004358152600584522054166040519015158152f35b50346101b857610ee936612e16565b849691959296958460a08520808552602096600388526fffffffffffffffffffffffffffffffff98610f288a600260408a200154161515610249613016565b1592610f3e610f356130f9565b82158618612f41565b73ffffffffffffffffffffffffffffffffffffffff809c1693610f62610417613132565b610f6c848a61336e565b6110e757505080855260038752610f8e6040862054898160801c91168b613be8565b975b81865260028852604086208360005288526040600020610fb18a825461316b565b9055610fd8610fbf8a613c78565b83885260038a526108e66040892091825460801c613178565b610fe18a613c78565b828752600389527fffffffffffffffffffffffffffffffff00000000000000000000000000000000604088209261101c845493828516613178565b1691161790556040519089825288888301527fedf8870433c83823eb071d3df1caa8d008f12f6440918c20d75a3602cda30fe060403393a48161107a575b5050508360409561107092511630903390613ab9565b8351928352820152f35b333b156104d2576110bc91839160405193849283927f2075be030000000000000000000000000000000000000000000000000000000084528b6004850161319c565b038183335af180156104d6576110d3575b8061105a565b6110dd8291612cc3565b6101b857806110cd565b61110891999a50828752600389526040872054908b8260801c921690613c55565b98610f90565b50346101b85760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b85773ffffffffffffffffffffffffffffffffffffffff604061115d612ca0565b926004358152600260205220911660005260205260606040600020600181549101546040519182526fffffffffffffffffffffffffffffffff8116602083015260801c6040820152f35b50346101b857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b85773ffffffffffffffffffffffffffffffffffffffff6020915416604051908152f35b50346101b85760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b85761123136612d50565b60a0812090606081019173ffffffffffffffffffffffffffffffffffffffff808451168552602093600485526112a360ff6040882054166040519061127582612cf3565b600f82527f49524d206e6f7420656e61626c6564000000000000000000000000000000000088830152612f41565b6080840180518752600586526112f560ff604089205416604051906112c782612cf3565b601082527f4c4c5456206e6f7420656e61626c65640000000000000000000000000000000089830152612f41565b838752600386526fffffffffffffffffffffffffffffffff61135681600260408b20015416156040519061132882612cf3565b601682527f6d61726b657420616c72656164792063726561746564000000000000000000008a830152612f41565b84885260038752600260408920019042167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161790556008865260046040882091848751167fffffffffffffffffffffffff0000000000000000000000000000000000000000908185541617845560018401868a8a01511682825416179055600284018660408a015116828254161790556003840190868651169082541617905551910155827fac4b2400f169220b0c0afdde7a0b32e775ba727ea1cb30b35f935cdaab8683ac60a060405161147281896080809173ffffffffffffffffffffffffffffffffffffffff80825116855280602083015116602086015280604083015116604086015260608201511660608501520151910152565ba25116918261147f578480f35b6114c69284928652600383526040862091866040518096819582947f9451fed40000000000000000000000000000000000000000000000000000000084526004840161304f565b03925af18015611504576114db575b80808480f35b813d83116114fd575b6114ee8183612d0f565b810103126102c85738806114d5565b503d6114e4565b6040513d85823e3d90fd5b50346101b8576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b85761154936612d50565b60a435611554612c7d565b60e4359073ffffffffffffffffffffffffffffffffffffffff90818316948584036102c8576104bb958760209361164561163d60a0862092838552600388526115ba6fffffffffffffffffffffffffffffffff6002604088200154161515610249613016565b6115cd6115c56132c2565b8c1515612f41565b6115e06115d8613132565b871515612f41565b6115f46115ec82613328565b6102496131e8565b6115fe848861336e565b611636604061160c8d613c78565b9686815260028b5220958a831696876000528a526108e6600160406000200191825460801c61322e565b838761367c565b610249613289565b60408051338152602081018a90527fe80ebd7cc9223d7382aab2e0d1d6155c65651f83d53c8b9b06901d167e3211429190a401511661394a565b50346101b857610100367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc018181126104d25760a0136104e1576040516116c581612cd7565b6116cd612c5a565b81526116d7612ca0565b906020908181019283526044359384151585036102c85760408201948552606082016064358152608435608084019080825260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c360112611a64576040516117749161174382612cf3565b601182527f7369676e6174757265206578706972656400000000000000000000000000000088830152421115612f41565b8151926117e873ffffffffffffffffffffffffffffffffffffffff94858751168b526007885260408b208054906117aa826132fb565b9055604051916117b983612cf3565b600d83527f696e76616c6964206e6f6e6365000000000000000000000000000000000000008a84015214612f41565b60405191868301907f81d0284fb0e2cde18d0553b06189d6f7613c96a01bb5b5e7828eade6a0dcac918252858751166040850152858951166060850152895115156080850152845160a08501525160c084015260c0835260e083019167ffffffffffffffff9184841083851117611a35578360405284519020908401907f190100000000000000000000000000000000000000000000000000000000000082527f00000000000000000000000000000000000000000000000000000000000000006101028601526101228501526042835261016084019183831090831117611a35578a92826040525190209060a4359360ff8516809503611a31578894608093835261018082015260c4356101a08201526101c060e43591015282805260015afa15611a26577fd5e969f01efe921d3f766bdebad25f0a05e3f237311f56482bf132d0326309c092829161197f838a51168015159081611a19575b506040519061195182612cf3565b601182527f696e76616c6964207369676e617475726500000000000000000000000000000089830152612f41565b8282511690516040519081527fa58af1a0c70dba0c7aa60d1a1a147ebd61000d1690a968828ac718bca927f2c7873392a3611a0387511515838351168a526006875260408a2084895116600052875260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b511693511693511515916040519283523392a480f35b9050848451161438611943565b6040513d88823e3d90fd5b8380fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8880fd5b50346101b8576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104e1576004359067ffffffffffffffff90818311611a315736602384011215611a31578260040135918211611a3157602491600590368482841b87010111611bd057849181611ae58893613823565b95611af36040519788612d0f565b818752611aff82613823565b947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08789019601368737845b838110611b7557505050505060405193838594850191818652518092526040850193925b828110611b5e57505050500390f35b835185528695509381019392810192600101611b4f565b9497959694611b83816132fb565b9084811015611ba457851b82018301355481861b8801529597949695611b2b565b838a7f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b8580fd5b50346101b85760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b857604060209173ffffffffffffffffffffffffffffffffffffffff611c26612c5a565b168152600783522054604051908152f35b50346101b85760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b857611c6f612c5a565b6040611c79612ca0565b9273ffffffffffffffffffffffffffffffffffffffff80931681526006602052209116600052602052602060ff604060002054166040519015158152f35b50346101b85760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b857604060c091600435815260036020522080546002600183015492015490604051926fffffffffffffffffffffffffffffffff91828116855260801c6020850152818116604085015260801c60608401528116608083015260801c60a0820152f35b50346101b857604090611d5a36612e98565b9294939190858260a08520918288526003602052611d946fffffffffffffffffffffffffffffffff60028c8b200154161515610249613016565b1593611daa611da16130f9565b82158718612f41565b73ffffffffffffffffffffffffffffffffffffffff871694611dcd6115d8613132565b611dd96115ec86613328565b611de3848861336e565b611f4e57505092610ac0949273ffffffffffffffffffffffffffffffffffffffff9285899689526003602052611f0e8b611e37818c20546fffffffffffffffffffffffffffffffff8160801c91168b613c33565b9a5b8381526002602052878282209516948560005260205281600020611e5e8d8254613221565b9055611e85611e6c8d613c78565b85835260036020526108e684842091825460801c61322e565b611e8e8a613c78565b8482526003602052828220907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffffffffffffffffffff611eda84549382851661322e565b1691161790558381526003602052206fffffffffffffffffffffffffffffffff806001830154169154161015610249613250565b8a5133815260208101889052604081018a90527fa56fc0ad5702ec05ce63666221f796fb62437c32db1aa1aa075fc6484cf58fbf90606090a4511661394a565b8998509282611f0e611fa173ffffffffffffffffffffffffffffffffffffffff968b9996610ac09b99969c5260036020528c8a2054906fffffffffffffffffffffffffffffffff8260801c921690613c0d565b9a8b98611e39565b50346101b85760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b857611fe1612c5a565b73ffffffffffffffffffffffffffffffffffffffff90612008828454163314610249612f08565b16808252600460205261202560ff60408420541615610249612fdd565b80825260046020526040822060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f590e04cdebeccba40f566186b9746ad295a4cd358ea4fefaaea6ce79630d96c08280a280f35b50346101b85761209036612e98565b909291948294869160a08220958682526003966020968888526fffffffffffffffffffffffffffffffff906120d2826002604088200154161515610249613016565b15936120e86120df6130f9565b8d158718612f41565b73ffffffffffffffffffffffffffffffffffffffff968789169561211561210d613132565b881515612f41565b6121216115ec87613328565b61212b858961336e565b6122e657508a9b5082819b98999a9b528a8a526121566001604083200154838160801c91168a613c33565b9a8b945b61216386613c78565b85845260028d528c8360408620988c8516998a60005283526040600020600101888154958187169061219491613178565b167fffffffffffffffffffffffffffffffff000000000000000000000000000000008096161790556121c590613c78565b91888752526040852060010190815460801c906121e191613178565b81546fffffffffffffffffffffffffffffffff1660809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000161790558c8361222b8d613c78565b91888752526040852060010191868354928184169061224991613178565b16911617905561225a90858961367c565b612262613289565b61226b91612f41565b8382528a526040902090806001830154169154161015612289613250565b61229291612f41565b60408051338152602081018890529081018a90527f570954540bed6b1304a87dfe815a5eda4a648f7097a16240dcd85c9b5fd42a4390606090a45116916122d89261394a565b604051928352820152604090f35b9a5061230d8b9498999a9c8483528d8c52600160408420015490848260801c921690613c0d565b9b8c9861215a565b50346101b85760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b8577f297b80e7a896fad470c630f6575072d609bde997260ff3db851939405ec29139602060043561239073ffffffffffffffffffffffffffffffffffffffff8554163314610249612f08565b808452600582526123ab60ff60408620541615610249612fdd565b6123f36040516123ba81612cf3565b601181527f6d6178204c4c545620657863656564656400000000000000000000000000000084820152670de0b6b3a76400008310612f41565b808452600582526040842060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055604051908152a180f35b50346101b857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b857602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346101b857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b85760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346101b85760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b857604060a091600435815260086020522073ffffffffffffffffffffffffffffffffffffffff8082541691816001820154169160048160028401541691600384015416920154926040519485526020850152604084015260608301526080820152f35b50346101b85760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b8576125a736612d50565b7f139d6f58e9a127229667c8e3b36e88890a66cfc8ab1024ddc513e189e125b75b602060a4356125f273ffffffffffffffffffffffffffffffffffffffff8654163314610249612f08565b6126ed60a08520948587526003845261269c866fffffffffffffffffffffffffffffffff9261262e84600260408d200154161515610249613016565b818a526003875261264e600260408c20015460801c871415610249612fdd565b61269760405161265d81612cf3565b601081527f6d61782066656520657863656564656400000000000000000000000000000000898201526703782dace9d90000881115612f41565b61336e565b85875260038452821660026040882001906fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b604051908152a280f35b50346101b8576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b85761273136612d50565b9060a43561273d612c7d565b60e43567ffffffffffffffff8111611a315761275d903690600401612de8565b9060a0862080865260036020526127916fffffffffffffffffffffffffffffffff6002604089200154161515610249613016565b61279c6104176132c2565b73ffffffffffffffffffffffffffffffffffffffff809416906127c86127c0613132565b831515612f41565b6127fb6127d487613c78565b828952600260205260408920848a526020526108e6600160408b200191825460801c613178565b604051908682527fa3b9472a1399e17e123f3c2e6586c23e504184d504de59cdaa2b375e880c618460203393a481612843575b505060206104bb939401511630903390613ab9565b333b156128bd5761288591859160405193849283927fb1022fdf000000000000000000000000000000000000000000000000000000008452886004850161319c565b038183335af180156128b25761289c575b8061282e565b6104bb936128ab602092612cc3565b9350612896565b6040513d86823e3d90fd5b8480fd5b50346101b8576128d036612e16565b849691959296958460a0852080855260036020978189526fffffffffffffffffffffffffffffffff996129108b600260408b200154161515610249613016565b159361291d611da16130f9565b73ffffffffffffffffffffffffffffffffffffffff809d16946129416115d8613132565b61294b858b61336e565b612af757505081865280885261296f60016040882001548a8160801c91168c613be8565b985b61297a8a613c78565b9083885260028a52604088208589528a5260016040892001816129a182549482861661322e565b167fffffffffffffffffffffffffffffffff000000000000000000000000000000008094161790556129f06129d58c613c78565b858a52848c526108e6600160408c200191825460801c61322e565b838852828a52612a0f81600160408b200154168d808203911102613c78565b928489528a52600160408920019216908254161790556040519089825288888301527f52acb05cebbd3cd39715469f22afbf5a17496295ef3bc9bb5944056c63ccaa0960403393a481612a72575050508360409561107092511630903390613ab9565b333b156104d257918091612ab59360405194859283927f05b4591c0000000000000000000000000000000000000000000000000000000084528b6004850161319c565b038183335af1908115612aeb575095611070928692604098612adc575b509281975061105a565b612ae590612cc3565b38612ad2565b604051903d90823e3d90fd5b612b1a919a9b50838852828a526001604089200154908c8260801c921690613c55565b99612971565b50346101b85760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b8576104bb612b5c36612d50565b60a081209081845260036020526126976fffffffffffffffffffffffffffffffff6002604087200154161515610249613016565b50346101b85760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b857612c2f612bcb612c5a565b7fffffffffffffffffffffffff0000000000000000000000000000000000000000835473ffffffffffffffffffffffffffffffffffffffff80821693612c1a612c12612f08565b863314612f41565b16938493612c26612fdd565b90851415612f41565b161782557f167d3e9c1016ab80e58802ca9da10ce5c6a0f4debc46a2e7a2cd9e56899a4fb58280a280f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102c857565b60c4359073ffffffffffffffffffffffffffffffffffffffff821682036102c857565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102c857565b67ffffffffffffffff8111611a3557604052565b60a0810190811067ffffffffffffffff821117611a3557604052565b6040810190811067ffffffffffffffff821117611a3557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611a3557604052565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60a09101126102c85760405190612d8782612cd7565b8173ffffffffffffffffffffffffffffffffffffffff60043581811681036102c857825260243581811681036102c857602083015260443581811681036102c857604083015260643590811681036102c85760608201526080608435910152565b9181601f840112156102c85782359167ffffffffffffffff83116102c857602083818601950101116102c857565b6101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102c857612e4a81612d50565b9160a4359160c4359160e43573ffffffffffffffffffffffffffffffffffffffff811681036102c85791610104359067ffffffffffffffff82116102c857612e9491600401612de8565b9091565b6101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102c857612ecc90612d50565b9060a4359060c4359073ffffffffffffffffffffffffffffffffffffffff9060e43582811681036102c857916101043590811681036102c85790565b60405190612f1582612cf3565b600982527f6e6f74206f776e657200000000000000000000000000000000000000000000006020830152565b15612f495750565b604051907f08c379a000000000000000000000000000000000000000000000000000000000825281602080600483015282519283602484015260005b848110612fc6575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201612f85565b60405190612fea82612cf3565b600b82527f616c7265616479207365740000000000000000000000000000000000000000006020830152565b6040519061302382612cf3565b601282527f6d61726b6574206e6f74206372656174656400000000000000000000000000006020830152565b909291610140906130a9836101608101966080809173ffffffffffffffffffffffffffffffffffffffff80825116855280602083015116602086015280604083015116604086015260608201511660608501520151910152565b60028154916fffffffffffffffffffffffffffffffff9283811660a087015260801c60c0860152600181015483811660e087015260801c610100860152015490811661012084015260801c910152565b6040519061310682612cf3565b601282527f696e636f6e73697374656e7420696e70757400000000000000000000000000006020830152565b6040519061313f82612cf3565b600c82527f7a65726f206164647265737300000000000000000000000000000000000000006020830152565b91908201809211610ccd57565b9190916fffffffffffffffffffffffffffffffff80809416911601918211610ccd57565b9183606094601f927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0948652604060208701528160408701528686013760008582860101520116010190565b604051906131f582612cf3565b600c82527f756e617574686f72697a656400000000000000000000000000000000000000006020830152565b91908203918211610ccd57565b6fffffffffffffffffffffffffffffffff9182169082160391908211610ccd57565b6040519061325d82612cf3565b601682527f696e73756666696369656e74206c6971756964697479000000000000000000006020830152565b6040519061329682612cf3565b601782527f696e73756666696369656e7420636f6c6c61746572616c0000000000000000006020830152565b604051906132cf82612cf3565b600b82527f7a65726f206173736574730000000000000000000000000000000000000000006020830152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ccd5760010190565b73ffffffffffffffffffffffffffffffffffffffff1680331490811561334c575090565b9050600052600660205260406000203360005260205260ff6040600020541690565b91906000908082526003916020928084526fffffffffffffffffffffffffffffffff936040936133a686600287872001541642613221565b80156136715773ffffffffffffffffffffffffffffffffffffffff908160608b01511680613409575b50505060029596975083525220019042167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b61344d8591858952878352898920898b519e8f94859384927f9451fed40000000000000000000000000000000000000000000000000000000084526004840161304f565b03925af1998a1561366757869a613637575b50606088999a6134f087898796898860029f8f7f9d9bd501d0657d7dfe415f779a620a62b78bc508ddc0891fbbd8b7ac0f8fce879a8387528785526134fb6134b0846001858b20015416928c61383b565b916134f5671bc16d674ec800006134c7858061383b565b0493670de0b6b3a76400009c856729a2241af62c00008f97846134e99161383b565b049261316b565b61316b565b9061383b565b049561350687613c78565b84825288865260018383200184613521825493828516613178565b167fffffffffffffffffffffffffffffffff0000000000000000000000000000000080931617905561355288613c78565b858352898752838320918561356b845493828516613178565b16911617905580978482528086526002838320015460801c998a6135aa575b505090519889525050505050888401528a83015250a287969538806133cf565b8899506135bf6135ce97989b6135e19a61383b565b04968795835252205416613221565b888d528b8b528d8d205460801c91613be8565b91868b528c89528b8b2090600154168b5288528a8a2061360283825461316b565b905561362761361083613c78565b878c528a8a526108e68d8d2091825460801c613178565b819038898f89908f8f8f8661358a565b9099508381813d8311613660575b61364f8183612d0f565b81010312611bd0575198606061345f565b503d613645565b87513d88823e3d90fd5b505050505050509050565b909291600093808552602092600284526040862073ffffffffffffffffffffffffffffffffffffffff90818516885285526fffffffffffffffffffffffffffffffff600160408920015416156137625784600491604084015116604051928380927fa035b1fe0000000000000000000000000000000000000000000000000000000082525afa948515613757578795613720575b505061371d94955061376d565b90565b9080929550813d8311613750575b6137388183612d0f565b81010312611bd05761371d9495505192859438613710565b503d61372e565b6040513d89823e3d90fd5b506001955050505050565b60806ec097ce7bc90715b34b9f100000000061381361381d949660016040670de0b6b3a7640000986000908b8252600260205273ffffffffffffffffffffffffffffffffffffffff8383209116908183526020526137f86fffffffffffffffffffffffffffffffff8d8187878720015416908552600360205286868620015491828c1c921690613c55565b9b82526002602052828220908252602052200154841c61383b565b049101519061383b565b04101590565b67ffffffffffffffff8111611a355760051b60200190565b81810292918115918404141715610ccd57565b8115610df4570490565b906138629161383b565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810191818311610ccd5761371d926107d49161316b565b604051906138a882612cf3565b600782527f6e6f20636f6465000000000000000000000000000000000000000000000000006020830152565b3d1561392d573d9067ffffffffffffffff8211611a35576040519161392160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184612d0f565b82523d6000602084013e565b606090565b908160209103126102c8575180151581036102c85790565b613a9d92600092836139da613a0673ffffffffffffffffffffffffffffffffffffffff83961694613980863b151561024961389b565b60405192839160208301967fa9059cbb000000000000000000000000000000000000000000000000000000008852602484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612d0f565b51925af1613a52613a156138d4565b9160405190613a2382612cf3565b601182527f7472616e736665722072657665727465640000000000000000000000000000006020830152612f41565b8051908115918215613a9f575b505060405190613a6e82612cf3565b601782527f7472616e736665722072657475726e65642066616c73650000000000000000006020830152612f41565b565b613ab29250602080918301019101613932565b3880613a5f565b60009291838093613a9d9673ffffffffffffffffffffffffffffffffffffffff80951694613aec863b151561024961389b565b604051928160208501967f23b872dd000000000000000000000000000000000000000000000000000000008852166024850152166044830152606482015260648152613b3781612cd7565b51925af1613b83613b466138d4565b9160405190613b5482612cf3565b601582527f7472616e7366657246726f6d20726576657274656400000000000000000000006020830152612f41565b8051908115918215613bce575b505060405190613b9f82612cf3565b601b82527f7472616e7366657246726f6d2072657475726e65642066616c736500000000006020830152612f41565b613be19250602080918301019101613932565b3880613b90565b620f42408301809311610ccd5760018201809211610ccd5761371d926107d49161383b565b6001820192918310610ccd57620f42408201809211610ccd5761371d926107d49161383b565b91620f42408101809111610ccd5760018201809211610ccd5761371d92613858565b919060018101809111610ccd57620f42408201809211610ccd5761371d92613858565b60405190613c8582612cf3565b601482527f6d61782075696e743132382065786365656465640000000000000000000000006020830152613ccd6fffffffffffffffffffffffffffffffff9283831115612f41565b169056fea164736f6c6343000813000a"; bytes constant IRM_INIT_CODE = hex"60a03461011c57601f19610a0c38819003601f810183168401936001600160401b03939092909183861085871117610106578084926040978852833960209384918101031261011c5751926001600160a01b03841680850361011c5785519182870190811183821017610106578652600c82526b7a65726f206164647265737360a01b84830152156100ad57505050608052516108ea9081610122823960805181818160bc015261026b0152f35b82855192839162461bcd60e51b835280600484015283519081602485015260005b8281106100ef5750506044935080600085601f938601015201168101030190fd5b8086018201518782016044015286945081016100ce565b634e487b7160e01b600052604160045260246000fd5b600080fdfe6080604090808252600436101561001557600080fd5b600090813560e01c90816301977b571461028f575080633acb5624146102205780638c00bf6b146101f457639451fed41461004f57600080fd5b346101f15761005d366102d6565b8351939184830167ffffffffffffffff8111868210176101c4578352600a85526020947f6e6f74204d6f7270686f000000000000000000000000000000000000000000008682015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101315750828061011460a07f7120161a7b3d31251e01294ab351ef15a41b91659a36032e4641bb89b121e321942094856104ff565b91878684939952808a52205581519086825287820152a251908152f35b84908685519283917f08c379a0000000000000000000000000000000000000000000000000000000008352806004840152835193846024850152825b8581106101ad57505050601f837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092604480968601015201168101030190fd5b81810183015187820160440152869450820161016d565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80fd5b50903461021c5760209061021460a061020c366102d6565b9190206104ff565b509051908152f35b5080fd5b50903461021c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021c576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b905082346102d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d257602092600435815280845220548152f35b8280fd5b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820161016081126104415760a013610441576040805167ffffffffffffffff919060a081018381118282101761044657825273ffffffffffffffffffffffffffffffffffffffff6004358181168103610441578252602435818116810361044157602083015260443581811681036104415783830152606435908116810361044157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c91606060c094015260843560808201529501126104415780519160c08301908111838210176104465781526fffffffffffffffffffffffffffffffff9060a435828116810361044157835260c435828116810361044157602084015260e435908282168203610441578301526101043581811681036104415760608301526101243581811681036104415760808301526101443590811681036104415760a082015290565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8181029291600082127f80000000000000000000000000000000000000000000000000000000000000008214166104b45781840514901517156104b457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919091600083820193841291129080158216911516176104b457565b81519092916fffffffffffffffffffffffffffffffff91821680156000816107c357508360408401511690670de0b6b3a7640000918281029281840414901517156104b45761078f5704915b670c7d713b49da0000808413156107be575067016345785d8a00005b7ffffffffffffffffffffffffffffffffffffffffffffffffff3828ec4b626000084019384136001166104b457670de0b6b3a764000093848102908082058614901517156104b457811561078f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82147f80000000000000000000000000000000000000000000000000000000000000008214166104b4570594600052600060205260406000205491600091831560001461067a5750505050634b9a1eff8161064482955b600081121561066c57670a688906bd8b0000610475565b059082820191600084841291129080158216911516176104b45761066791610475565b059190565b6729a2241af62c0000610475565b650171268b5ad49187830292830588036107625760800151164203904282116107355790846106a99205610475565b806106bb57505081610644829561062d565b906106e1826106db6106d1869560029a976107cc565b98899205856107cc565b936104e3565b908260011b926002840503610708575060046107018593610644936104e3565b059261062d565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b610567565b9150509161054b565b6107e8906107e2670de0b6b3a764000093610807565b90610475565b05640ec41a0ddf81811290821802186301e3da5f818113908218021890565b7ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d881126108d7576805168fd0946fc0415f8112156108b95760008112156108aa577ffffffffffffffffffffffffffffffffffffffffffffffffffb30b927e6d498d2905b67099e8db03256ce5d80928201059182029003670de0b6b3a764000090600282828002050501019060008112156000146108a3571b90565b6000031d90565b6704cf46d8192b672e9061086b565b50780931d81650c7d88b800000000000000000000000000000000090565b5060009056fea164736f6c6343000813000a"; bytes constant METAMORPHO_V1_1_FACTORY_INIT_CODE = hex"60a034608057601f615fe938819003918201601f19168301916001600160401b03831184841017608457808492602094604052833981010312608057516001600160a01b03811680820360805715607157608052604051615f509081610099823960805181818160f301526102120152f35b63d92e233d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816329b5352c14610241575080633acb5624146101fd5763b51020251461003d575f80fd5b346101f95760c03660031901126101f957610056610279565b6024356044356001600160a01b038116908190036101f95760643567ffffffffffffffff81116101f95761008e90369060040161028f565b9160843567ffffffffffffffff81116101f9576100af90369060040161028f565b9060a43591604051615c28908181019781891067ffffffffffffffff8a11176101e5576101478291879461031c843960018060a01b0316998a815260018060a01b037f000000000000000000000000000000000000000000000000000000000000000016602082015286604082015288606082015260c0608082015261013860c082018b6102f7565b9060a0818303910152856102f7565b03905ff59586156101da576101c67fed8c95d05909b0f217f3e68171ef917df4b278d5addfe4dda888e90279be7d1d926101b860209960018060a01b0316988996875f525f8c5260405f20600160ff198254161790556040519586528b86015260a0604086015260a08501906102f7565b9083820360608501526102f7565b9360808201528033940390a4604051908152f35b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b346101f9575f3660031901126101f9576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101f95760203660031901126101f9576020906001600160a01b03610265610279565b165f525f825260ff60405f20541615158152f35b600435906001600160a01b03821682036101f957565b81601f820112156101f95780359067ffffffffffffffff82116101e55760405192601f8301601f19908116603f0116840167ffffffffffffffff8111858210176101e557604052828452602083830101116101f957815f926020809301838601378301015290565b805180835260209291819084018484015e5f828201840152601f01601f191601019056fe6101e0806040523461065157615c28803803809161001d8285610a31565b8339810160c0828203126106515761003482610a54565b9061004160208401610a54565b9160408401519161005460608601610a54565b60808601519095906001600160401b0381116106515782610076918301610a83565b60a08201519092906001600160401b038111610651576100969201610a83565b90602094604051966100a88789610a31565b5f885260018060a01b0316936040516100c18882610a31565b5f8152604051986100d2898b610a31565b5f8a526040998a51926100e58c85610a31565b60018452603160f81b8b8501528051906001600160401b03821161075a5760035490600182811c92168015610a27575b8d83101461073c578c82601f8594116109d5575b50508c90601f831160011461096e575f92610963575b50508160011b915f199060031b1c1916176003555b8051906001600160401b03821161075a5760045490600182811c92168015610959575b8c83101461073c5781601f84931161090a575b508b90601f83116001146108a3575f92610898575b50508160011b915f199060031b1c1916176004555b6101bd87610dc2565b9015610890575b60a052866080526101d481610af3565b610160526101e182610c5b565b6101805288815191012090816101205288815191012080610140524660e052895190898201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f84528b83015260608201524660808201523060a082015260a0815261024e60c082610a31565b51902060c05230610100526001600160a01b031690811561087d57600980546001600160a01b03199081169091556008805491821684179055885192906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36001600160a01b031694851561086e578061083b575b80600e5581527fd28e9b90ee9b37c5936ff84392d71f29ff18117d7e76bcee60615262a90a3f75863392a25f60115580516001600160401b03811161075a57601854600181811c91168015610831575b8782101461073c57601f81116107ed575b5085601f8211600114610779579181610377925f80516020615c08833981519152945f9161076e575b508160011b915f199060031b1c1916176018555b875191829182610ac9565b0390a180516001600160401b03811161075a57601954600181811c91168015610750575b8682101461073c57601f81116106f8575b5084601f8211600114610671579181610407927fadf3ae8bd543b3007d464f15cb8ea1db3f44e84d41d203164f40b95e27558ac6945f91610666575b508160011b915f199060031b1c1916176019555b865191829182610ac9565b0390a16101a0829052835163313ce56760e01b81528381600481855afa90811561065c575f91610620575b5060ff809116806012039060121102166101c0528351915f8085850163095ea7b360e01b81528360248701528119604487015260448652610474606487610a31565b85519082865af1610483610d93565b816105f0575b50806105e6575b156105a1575b8451614ce99081610f1f82396080518181816122bc01528181612552015281816139200152613d3b015260a05181612618015260c05181613298015260e0518161335501526101005181613262015261012051816132e70152610140518161330d015261016051816113230152610180518161134c01526101a0518181816118280152818161195e015281816121240152818161233d0152818161250e01528181612fb6015281816135530152818161362401528181613a6e01528181613e1e01528181613f11015281816145bb015281816149740152614c1701526101c051818181610e60015281816125f4015281816138330152818161387901528181613b9b0152613bde0152f35b6105dd936105d89186519163095ea7b360e01b9083015260248201525f6044820152604481526105d2606482610a31565b82610e55565b610e55565b5f808080610496565b50813b1515610490565b80518015925086908315610608575b5050505f610489565b6106189350820181019101610e3d565b5f85816105ff565b90508381813d8311610655575b6106378183610a31565b81010312610651575160ff811681036106515760ff610432565b5f80fd5b503d61062d565b85513d5f823e3d90fd5b90508201515f6103e8565b601f1982169060195f52865f20915f5b888282106106e2575050927fadf3ae8bd543b3007d464f15cb8ea1db3f44e84d41d203164f40b95e27558ac694926001928261040796106106ca575b5050811b016019556103fc565b8401515f1960f88460031b161c191690555f806106bd565b6001849582939589015181550194019201610681565b60195f52855f20601f830160051c810191878410610732575b601f0160051c01905b81811061072757506103ac565b5f815560010161071a565b9091508190610711565b634e487b7160e01b5f52602260045260245ffd5b90607f169061039b565b634e487b7160e01b5f52604160045260245ffd5b90508201515f610358565b601f1982169060185f52875f20915f5b898282106107d7575050925f80516020615c0883398151915294926001928261037796106107bf575b5050811b0160185561036c565b8401515f1960f88460031b161c191690555f806107b2565b6001849582939589015181550194019201610789565b60185f52865f20601f830160051c810191888410610827575b601f0160051c01905b81811061081c575061032f565b5f815560010161080f565b9091508190610806565b90607f169061031e565b62127500811161085f57620151808110156102ce57631a1593df60e11b5f5260045ffd5b6346fedb5760e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b631e4fbdf760e01b5f525f60045260245ffd5b5060126101c4565b015190505f8061019f565b60045f9081528d81209350601f198516908e5b8282106108f35750509084600195949392106108db575b505050811b016004556101b4565b01515f1960f88460031b161c191690555f80806108cd565b60018596829396860151815501950193018e6108b6565b90915060045f528b5f20601f840160051c8101918d851061094f575b90601f859493920160051c01905b818110610941575061018a565b5f8155849350600101610934565b9091508190610926565b91607f1691610177565b015190505f8061013f565b60035f9081528e81209350601f198516908f5b8282106109be5750509084600195949392106109a6575b505050811b01600355610154565b01515f1960f88460031b161c191690555f8080610998565b60018596829396860151815501950193018f610981565b9091925060035f52815f2090601f850160051c8201928510610a1d575b90601f859493920160051c01905b818110610a0f578e9150610129565b5f8155849350600101610a00565b90915081906109f2565b91607f1691610115565b601f909101601f19168101906001600160401b0382119082101761075a57604052565b51906001600160a01b038216820361065157565b6001600160401b03811161075a57601f01601f191660200190565b81601f8201121561065157805190610a9a82610a68565b92610aa86040519485610a31565b8284526020838301011161065157815f9260208093018386015e8301015290565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b908151602081105f14610b4e575090601f815111610b2d576020815191015160208210610b1e571790565b5f198260200360031b1b161790565b60405163305a27a960e01b8152908190610b4a9060048301610ac9565b0390fd5b6001600160401b03811161075a57600554600181811c91168015610c51575b602082101461073c57601f8111610c1e575b50602092601f8211600114610bbd57928192935f92610bb2575b50508160011b915f199060031b1c19161760055560ff90565b015190505f80610b99565b601f1982169360055f52805f20915f5b868110610c065750836001959610610bee575b505050811b0160055560ff90565b01515f1960f88460031b161c191690555f8080610be0565b91926020600181928685015181550194019201610bcd565b60055f52601f60205f20910160051c810190601f830160051c015b818110610c465750610b7f565b5f8155600101610c39565b90607f1690610b6d565b908151602081105f14610c86575090601f815111610b2d576020815191015160208210610b1e571790565b6001600160401b03811161075a57600654600181811c91168015610d89575b602082101461073c57601f8111610d56575b50602092601f8211600114610cf557928192935f92610cea575b50508160011b915f199060031b1c19161760065560ff90565b015190505f80610cd1565b601f1982169360065f52805f20915f5b868110610d3e5750836001959610610d26575b505050811b0160065560ff90565b01515f1960f88460031b161c191690555f8080610d18565b91926020600181928685015181550194019201610d05565b60065f52601f60205f20910160051c810190601f830160051c015b818110610d7e5750610cb7565b5f8155600101610d71565b90607f1690610ca5565b3d15610dbd573d90610da482610a68565b91610db26040519384610a31565b82523d5f602084013e565b606090565b5f8091604051602081019063313ce56760e01b825260048152610de6602482610a31565b51916001600160a01b03165afa610dfb610d93565b9080610e31575b610e0e575b505f905f90565b602081805181010312610651576020015160ff8111610e07579060ff6001921690565b50602081511015610e02565b90816020910312610651575180151581036106515790565b5f80610e7d9260018060a01b03169360208151910182865af1610e76610d93565b9083610ec0565b8051908115159182610ea5575b5050610e935750565b635274afe760e01b5f5260045260245ffd5b610eb89250602080918301019101610e3d565b155f80610e8a565b90610ee45750805115610ed557805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580610f15575b610ef5575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15610eed56fe60806040526004361015610011575f80fd5b5f3560e01c806301e1d11414612aff57806306fdde0314612a6d57806307a2d13a14611ded578063095ea7b314612a475780630a28a47714612a1e578063102f7b6c1461298d57806318160ddd146129705780631ecca77c1461290757806321cb4b14146128ea57806323b872dd146128b25780632acc56f9146126bc5780632b30997b1461264f578063313ce567146125e057806333f91ebb146125c35780633644e515146125a9578063388af5b51461258157806338d52e0f1461253d5780633acb5624146124f95780633b24c2bf14612270578063402d267d1461224c57806341b6783314611ee7578063452a932014611ebf5780634690484014611e9f5780634b998de514611df25780634cdad50614611ded5780634dedf20e14611db0578063568efc0714611d9357806362518ddf14611d6a57806369fe0e2d14611cb05780636e553f6514611c6e5780636fda386814611c1257806370a0823114611bdb578063715018a614611b765780637224a51214611a8c5780637299aa3114611683578063762c31ba1461164957806379ba5097146115c35780637cc4d9a1146115925780637ecebe001461155a57806384755b5f1461140357806384b0196e1461130b5780638a2c7b39146112d65780638da5cb5b146112ae57806394bf804d1461126c57806395d89b41146111b55780639d6b4a45146110da578063a17b3130146110bd578063a31be5d614611076578063a5f31d611461101a578063a9059cbb14610fe9578063ac9650d814610e84578063aea70acc14610e47578063b192a84a14610dae578063b3d7f6b914610d7a578063b460af9414610d44578063b84c824614610ba1578063ba08765214610b6a578063bc25cf7714610a7d578063c47f0027146108c0578063c63d75b61461087d578063c6e6f59214610405578063c9649aa914610805578063cc718f76146107bc578063ce96cb7714610794578063d33219b414610777578063d505accf14610632578063d905777e146105fe578063dd62ed3e146105ae578063ddca3f4314610588578063e30c397814610560578063e66f53b714610538578063e74b981b14610486578063e90956cf1461040a578063ef8b30f714610405578063f2fde38b146103995763f7d185211461035d575f80fd5b346103955760203660031901126103955760043560145481101561039557610386602091612ce5565b90549060031b1c604051908152f35b5f80fd5b34610395576020366003190112610395576103b2612b71565b6103ba61324b565b600980546001600160a01b0319166001600160a01b039283169081179091556008549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b612dc6565b3461039557602036600319011261039557610423612b71565b61042b61324b565b600a546001600160a01b039182169181168214610477576001600160a01b0319168117600a557fbd0a63c12948fbc9194a5839019f99c9d71db924e5c70018265bc778b8f1a5065f80a2005b63a741a04560e01b5f5260045ffd5b346103955760203660031901126103955761049f612b71565b6104a761324b565b6012546001600160a01b0382169190606081901c83146104775782159081610525575b50610516576104d761378c565b6001600160601b036012549181199060601b169116176012557f2e979f80fe4d43055c584cf4a8467c55875ea36728fc37176c05acd784eb7a735f80a2005b6333fe7c6560e21b5f5260045ffd5b6001600160601b039150161515836104ca565b34610395575f36600319011261039557600a546040516001600160a01b039091168152602090f35b34610395575f366003190112610395576009546040516001600160a01b039091168152602090f35b34610395575f3660031901126103955760206001600160601b0360125416604051908152f35b34610395576040366003190112610395576105c7612b71565b6105cf612b87565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461039557602036600319011261039557602061062a61062461061f612b71565b613de0565b9161386f565b604051908152f35b346103955760e03660031901126103955761064b612b71565b610653612b87565b604435906064359260843560ff8116810361039557844211610764576107276107309160018060a01b03841696875f52600760205260405f20908154916001830190556040519060208201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c984528a604084015260018060a01b038916606084015289608084015260a083015260c082015260c081526106f560e082612c17565b51902061070061325f565b906040519161190160f01b83526002830152602282015260c43591604260a4359220614a61565b90929192614b01565b6001600160a01b031684810361074d575061074b935061410a565b005b84906325c0072360e11b5f5260045260245260445ffd5b8463313c898160e11b5f5260045260245ffd5b34610395575f366003190112610395576020600e54604051908152f35b346103955760203660031901126103955760206107b261061f612b71565b5050604051908152f35b34610395576020366003190112610395576004355f52600d602052606060405f20546040519060018060b81b038116825260ff8160b81c161515602083015260c01c6040820152f35b34610395575f366003190112610395576008546001600160a01b031633141580610868575b610859575f601155337f921828337692c347c634c5d2aacbc7b756014674bd236f3cc2058d8e284a951b5f80a2005b637cf97e4d60e11b5f5260045ffd5b50600c546001600160a01b031633141561082a565b3461039557602036600319011261039557610896612b71565b50602061062a6108ba6108a761361c565b6108af612fad565b509290600254612f03565b9061386f565b34610395576108ce36612d88565b6108d661324b565b80516001600160401b038111610a69576108f1601854612def565b601f8111610a01575b506020601f821160011461096f57918161095f927f4df9dcd34ae35f40f2c756fd8ac83210ed0b76d065543ee73d868aec7c7fcf02945f91610964575b508160011b915f199060031b1c1916176018555b604051918291602083526020830190612b24565b0390a1005b905082015185610937565b601f1982169060185f525f80516020614c9d833981519152915f5b8181106109e95750927f4df9dcd34ae35f40f2c756fd8ac83210ed0b76d065543ee73d868aec7c7fcf0294926001928261095f96106109d1575b5050811b0160185561094b565b8401515f1960f88460031b161c1916905585806109c4565b9192602060018192868901518155019401920161098a565b60185f52601f820160051c5f80516020614c9d833981519152019060208310610a54575b601f0160051c5f80516020614c9d83398151915201905b818110610a4957506108fa565b5f8155600101610a3c565b5f80516020614c9d8339815191529150610a25565b634e487b7160e01b5f52604160045260245ffd5b3461039557602036600319011261039557610a96612b71565b6013546001600160a01b0316908115610b5b576040516370a0823160e01b81523060048201526001600160a01b039190911691602082602481865afa918215610b50575f92610b1a575b5081610aec9184613da0565b6040519081527f2ae72b44f59d038340fca5739135a1d51fc5ab720bb02d983e4c5ff4119ca7b860203392a3005b9091506020813d602011610b48575b81610b3660209383612c17565b81010312610395575190610aec610ae0565b3d9150610b29565b6040513d5f823e3d90fd5b63d92e233d60e01b5f5260045ffd5b3461039557602061062a610b7d36612cfd565b929190610b8861378c565b610b986002546016549084613bc5565b93849133613c7b565b3461039557610baf36612d88565b610bb761324b565b80516001600160401b038111610a6957610bd2601954612def565b601f8111610cdc575b506020601f8211600114610c4a57918161095f927fadf3ae8bd543b3007d464f15cb8ea1db3f44e84d41d203164f40b95e27558ac6945f91610c3f575b508160011b915f199060031b1c191617601955604051918291602083526020830190612b24565b905082015185610c18565b601f1982169060195f525f80516020614cbd833981519152915f5b818110610cc45750927fadf3ae8bd543b3007d464f15cb8ea1db3f44e84d41d203164f40b95e27558ac694926001928261095f9610610cac575b5050811b0160195561094b565b8401515f1960f88460031b161c191690558580610c9f565b91926020600181928689015181550194019201610c65565b60195f52601f820160051c5f80516020614cbd833981519152019060208310610d2f575b601f0160051c5f80516020614cbd83398151915201905b818110610d245750610bdb565b5f8155600101610d17565b5f80516020614cbd8339815191529150610d00565b3461039557602061062a610d5736612cfd565b9291610d6161378c565b610d716002546016549083613829565b93849233613c7b565b3461039557602036600319011261039557602061062a610da6610d9b612fad565b509190600254612f03565b600435613b81565b3461039557604036600319011261039557610dc7612b71565b6024359081151580920361039557610ddd61324b565b6001600160a01b03165f818152600b602052604090205490919060ff16151581146104775760207f74dc60cbc81a9472d04ad1d20e151d369c41104d655ed3f2f3091166a502cd8d91835f52600b825260405f2060ff1981541660ff8316179055604051908152a2005b34610395575f36600319011261039557602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610395576020366003190112610395576004356001600160401b03811161039557610eb4903690600401612bb1565b90610ebe82612ecb565b91610ecc6040519384612c17565b808352601f19610edb82612ecb565b015f5b818110610fd8575050905f90601e1981360301915b83811015610f71578060051b82013583811215610395578201908135916001600160401b038311610395576020018236038113610395575f80610f3d610f55936001963691612d52565b602081519101305af4610f4e613c4c565b903061485d565b610f5f8288612eef565b52610f6a8187612eef565b5001610ef3565b846040518091602082016020835281518091526040830190602060408260051b8601019301915f905b828210610fa957505050500390f35b91936001919395506020610fc88192603f198a82030186528851612b24565b9601920192018594939192610f9a565b806060602080938801015201610ede565b346103955760403660031901126103955761100f611005612b71565b602435903361318e565b602060405160018152f35b34610395575f36600319011261039557600f546001600160401b038160a01c1680156110675742106110585761074b906001600160a01b0316613c02565b63333bd2cb60e11b5f5260045ffd5b63e5f408a560e01b5f5260045ffd5b34610395576020366003190112610395576004355f908152601060209081526040918290205482516001600160c01b038216815260c09190911c91810191909152f35b0390f35b34610395575f366003190112610395576020601454604051908152f35b34610395576020366003190112610395576110f3612b71565b6110fb61324b565b600c546001600160a01b03828116929116828114610477576001600160401b03600f5460a01c166111a6576111345761074b9150613c02565b50611155600e54826001600160601b0360a01b600f541617600f5542612f03565b600f805467ffffffffffffffff60a01b191660a09290921b67ffffffffffffffff60a01b169190911790557f7633313af54753bce8a149927263b1a55eba857ba4ef1d13c6aee25d384d3c4b5f80a2005b6324d9026760e11b5f5260045ffd5b34610395575f366003190112610395576040515f6019546111d581612def565b808452906001811690811561124857506001146111fd575b6110b98361094b81850382612c17565b60195f9081525f80516020614cbd833981519152939250905b80821061122e5750909150810160200161094b6111ed565b919260018160209254838588010152019101909291611216565b60ff191660208086019190915291151560051b8401909101915061094b90506111ed565b3461039557604036600319011261039557602060043561062a61128d612b87565b9161129661378c565b6112a66002546016549083613b81565b8093336138b4565b34610395575f366003190112610395576008546040516001600160a01b039091168152602090f35b34610395575f366003190112610395576011548060c01c80156110675742106110585761074b906001600160c01b0316613979565b34610395575f366003190112610395576113a76113477f00000000000000000000000000000000000000000000000000000000000000006147c6565b6113707f0000000000000000000000000000000000000000000000000000000000000000614826565b60206113b5604051926113838385612c17565b5f84525f368137604051958695600f60f81b875260e08588015260e0870190612b24565b908582036040870152612b24565b4660608501523060808501525f60a085015283810360c08501528180845192838152019301915f5b8281106113ec57505050500390f35b8351855286955093810193928101926001016113dd565b346103955760a03660031901126103955761141d36612c38565b600a546001600160a01b031633141580611545575b6115365760a09020805f52600d60205260405f205460c01c6111a6575f818152600d60205260409020546001600160b81b031661152757805f52600d60205260ff60405f205460b81c161561151557805f52601060205260405f205460c01c611504576114dd6001600160401b036114ac600e5442612f03565b5f848152600d6020526040902080546001600160c01b03169290911660c01b6001600160c01b031916919091179055565b337f3240fc70754c5a2b4dab10bf7081a00024bfc8491581ee3d355360ec0dd91f165f80a3005b62463af360e81b5f5260045260245ffd5b636113d8c760e01b5f5260045260245ffd5b63624718b960e11b5f5260045ffd5b6332a2673b60e21b5f5260045ffd5b506008546001600160a01b0316331415611432565b34610395576020366003190112610395576001600160a01b0361157b612b71565b165f526007602052602060405f2054604051908152f35b34610395575f36600319011261039557601154604080516001600160c01b038316815260c09290921c602083015290f35b34610395575f36600319011261039557600954336001600160a01b039091160361163657600980546001600160a01b0319908116909155600880543392811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b63118cdaa760e01b5f523360045260245ffd5b34610395575f36600319011261039557600f54604080516001600160a01b038316815260a09290921c6001600160401b0316602083015290f35b34610395576020366003190112610395576004356001600160401b03811161039557366023820112156103955780600401356001600160401b0381116103955736602460c083028401011161039557335f52600b60205260ff60405f2054161580611a77575b80611a62575b611a53575f918290815b83831015611a3c5760c083028201906023198236030160c08112610395576040519060408201908282106001600160401b03831117610a695760a091604052126103955760a060405161174b81612be1565b61175760248601612b9d565b815261176560448601612b9d565b602082015261177660648601612b9d565b604082015261178760848601612b9d565b606082015260a4850135608082015280835260c46020840195013585522092835f52600d60205260ff60405f205460b81c1615611a29576117c9848351613a3d565b5082518083118184030294929085156118e95750505f9251156118de575b5051604051635c2bea4960e01b81529290611806906004850190612f26565b60a483015260c48201523060e48201819052610104820152604081610124815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610b50576001936118a1935f935f916118aa575b506040519084825260208201527fdd8bf5226dff861316e0fa7863fdb7dc7b87c614eb29a135f524eb79d5a1189a60403392a3612f03565b925b01916116f9565b90506118ce91935060403d81116118d7575b6118c68183612c17565b810190612f10565b9290928a611869565b503d6118bc565b5f93509150896117e7565b9293509497999350505f1981145f14611a1c575081860382871102925b8315611a0e575f858152600d60205260409020546001600160b81b03169061192f908590612f03565b116119fb5790604061195993925181518095819263a99aad8960e01b835286309160048501612f65565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1938415610b50576001946119d5945f916119db575b506040519084825260208201527f89bf199df65bf65155e3e0a8abc4ad4a1be606220c8295840dba2ab5656c1f6d60403392a3612f03565b946118a3565b6119f3915060403d81116118d7576118c68183612c17565b90508a61199d565b83635e25afa560e01b5f5260045260245ffd5b5050959050600191506118a3565b8380820391110292611906565b83636113d8c760e01b5f5260045260245ffd5b8403611a4457005b6309e36b8960e41b5f5260045ffd5b63f7137c0f60e01b5f5260045ffd5b506008546001600160a01b03163314156116ef565b50600a546001600160a01b03163314156116e9565b3461039557602036600319011261039557600435611aa861324b565b600e548082146104775760115460c01c6111a657621275008211611b6757620151808210611b585780821115611ae2575061074b90613979565b601180546001600160c01b0319166001600160b81b0384161790557fb3aa0ade2442acf51d06713c2d1a5a3ec0373cce969d42b53f4689f97bccf38091602091611b2c9042612f03565b601180546001600160c01b031660c09290921b6001600160c01b031916919091179055604051908152a1005b631a1593df60e11b5f5260045ffd5b6346fedb5760e01b5f5260045ffd5b34610395575f36600319011261039557611b8e61324b565b600980546001600160a01b03199081169091556008805491821690555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610395576020366003190112610395576001600160a01b03611bfc612b71565b165f525f602052602060405f2054604051908152f35b346103955760a036600319011261039557611c2c36612c38565b60a081205f52601060205260405f205460c01c8015611067574210611058578060a061074b9220805f52601060205260018060b81b0360405f2054169161345e565b3461039557604036600319011261039557602060043561062a611c8f612b87565b611c9761378c565b611ca7600254601654908561386f565b928391336138b4565b3461039557602036600319011261039557600435611ccc61324b565b6012546001600160601b0381168214610477576706f05b59d3b200008211611d5b578115159081611d4f575b50610516576001600160601b0390611d0e61378c565b16806001600160601b031960125416176012556040519081527f01fe2943baee27f47add82886c2200f910c749c461c9b63c5fe83901a53bdb4960203392a2005b905060601c1582611cf8565b63f4df6ae560e01b5f5260045ffd5b346103955760203660031901126103955760043560155481101561039557610386602091612cb9565b34610395575f366003190112610395576020601654604051908152f35b34610395576020366003190112610395576001600160a01b03611dd1612b71565b165f52600b602052602060ff60405f2054166040519015158152f35b612b48565b346103955760203660031901126103955760043560018060a01b03600c541633141580611e8a575b80611e75575b611e66575f818152600d6020526040812080546001600160c01b0316905533907fcbeb8ecdaa5a3c133e62219b63bfc35bce3fda13065d2bed32e3b7dde60a59f49080a3005b63d080fa3160e01b5f5260045ffd5b506008546001600160a01b0316331415611e20565b50600a546001600160a01b0316331415611e1a565b34610395575f36600319011261039557602060125460601c604051908152f35b34610395575f36600319011261039557600c546040516001600160a01b039091168152602090f35b34610395576020366003190112610395576004356001600160401b03811161039557611f17903690600401612bb1565b90335f52600b60205260ff60405f2054161580612237575b80612222575b611a5357601554611f4581612ecb565b611f526040519182612c17565b818152601f19611f6183612ecb565b01366020830137611f7184612ecb565b92611f7f6040519485612c17565b848452611f8b85612ecb565b602085019590601f19013687375f5b8181106121c2575050505f5b8281106120c35750505080516001600160401b038111610a6957600160401b8111610a69576015548160155580821061207f575b508260155f525f5b82811061204b5750505060405190602082019060208352518091526040820192905f5b81811061203557337fe0c2db6b54586be6d7d49943139fccf0dd315ba63e55364a76c73cd8fdba724d85870386a2005b8251855260209485019490920191600101612005565b60019060208351930192817f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475015501611fe2565b60155f527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4759081019082015b8181106120b85750611fda565b5f81556001016120ab565b6120cd8183612eef565b51156120dc575b600101611fa6565b6120e581612cb9565b905460039190911b1c5f818152600d60205260409020546001600160b81b03166121b057805f52601060205260405f205460c01c6115045761214830827f00000000000000000000000000000000000000000000000000000000000000006136d4565b612160575b5f908152600d60205260408120556120d4565b805f52600d60205260405f205460c01c1561219e57805f52600d60205260405f205460c01c42101561214d57632cd5119960e21b5f5260045260245ffd5b63af8ae28760e01b5f5260045260245ffd5b63401d83d960e11b5f5260045260245ffd5b6121cd818385612ea8565b356121d781612cb9565b90549060031b1c906121e98187612eef565b5161220f579060016121fd81949388612eef565b526122088289612eef565b5201611f9a565b506392a726c360e01b5f5260045260245ffd5b506008546001600160a01b0316331415611f35565b50600a546001600160a01b0316331415611f2f565b3461039557602036600319011261039557612265612b71565b50602061062a61361c565b346103955760c03660031901126103955761228a36612c38565b60a4359060018060a01b03600a5416331415806124e4575b6115365760a0812081519092906001600160a01b039081167f0000000000000000000000000000000000000000000000000000000000000000909116036124d15760405160208101908482526003604082015260408152612304606082612c17565b519020600281018091116124bd575f61231f6123399261416d565b60405180938192637784c68560e01b8352600483016133f4565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610b50576001600160801b0391612388915f9161249b575b50612ee2565b51161561248c57825f52601060205260405f205460c01c6111a657825f52600d60205260405f205460c01c61247d575f838152600d60205260409020546001600160b81b0316818114610477578110156123ef57916123e961074b9361342d565b9161345e565b9050815f52601060205261244f60405f206001600160401b036124306124148561342d565b600e549060018060b81b03168360c01b85541617845542612f03565b82546001600160c01b0316911660c01b6001600160c01b031916179055565b6040519081527fe851bb5856808a50efd748be463b8f35bcfb5ec74c5bfde776fe0a4d2a26db2760203392a3005b6325f600a360e11b5f5260045ffd5b6396e1352960e01b5f5260045ffd5b6124b791503d805f833e6124af8183612c17565b81019061337b565b86612382565b634e487b7160e01b5f52601160045260245ffd5b826333cbfd2760e21b5f5260045260245ffd5b506008546001600160a01b03163314156122a2565b34610395575f366003190112610395576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610395575f366003190112610395576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610395575f366003190112610395576013546040516001600160a01b039091168152602090f35b34610395575f36600319011261039557602061062a61325f565b34610395575f366003190112610395576020601554604051908152f35b34610395575f3660031901126103955760ff7f00000000000000000000000000000000000000000000000000000000000000001660ff7f0000000000000000000000000000000000000000000000000000000000000000160160ff81116124bd5760209060ff60405191168152f35b3461039557602036600319011261039557612668612b71565b61267061324b565b6013546001600160a01b039182169181168214610477576001600160a01b03191681176013557f2e7908865670e21b9779422cadf5f1cba271a62bb95c71eaaf615c0a1c48ebee5f80a2005b34610395576020366003190112610395576004356001600160401b038111610395576126ec903690600401612bb1565b335f52600b60205260ff60405f205416158061289d575b80612888575b611a5357601e8111612879575f5b81811061282c57506001600160401b038111610a6957600160401b8111610a6957601454816014558082106127e8575b508160145f525f5b8281106127b457505060405190806020830160208452526040820192905f5b81811061279e57337f6ce31538fc7fba95714ddc8a275a09252b4b1fb8f33d2550aa58a5f62ad934de85870386a2005b823585526020948501949092019160010161276e565b60019060208335930192817fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec01550161274f565b60145f527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9081019082015b8181106128215750612747565b5f8155600101612814565b612837818385612ea8565b355f908152600d60205260409020546001600160b81b03161561285c57600101612717565b9061286692612ea8565b3563067f0a2560e41b5f5260045260245ffd5b6340797bd760e11b5f5260045ffd5b506008546001600160a01b0316331415612709565b50600a546001600160a01b0316331415612703565b346103955760603660031901126103955761100f6128ce612b71565b6128d6612b87565b604435916128e58333836130c8565b61318e565b34610395575f366003190112610395576020601754604051908152f35b34610395575f366003190112610395576008546001600160a01b03163314158061295b575b610859575f600f55337fc40a085ccfa20f5fd518ade5c3a77a7ecbdfbb4c75efcdca6146a8e3c841d6635f80a2005b50600c546001600160a01b031633141561292c565b34610395575f366003190112610395576020600254604051908152f35b346103955760203660031901126103955760043560018060a01b03600c541633141580612a09575b806129f4575b611e6657805f5260106020525f6040812055337f1026ceca5ed3747eb5edec555732d4a6f901ce1a875ecf981064628cadde11205f80a3005b506008546001600160a01b03163314156129bb565b50600a546001600160a01b03163314156129b5565b3461039557602036600319011261039557602061062a612a3f610d9b612fad565b600435613829565b346103955760403660031901126103955761100f612a63612b71565b602435903361410a565b34610395575f366003190112610395576040515f601854612a8d81612def565b80845290600181169081156112485750600114612ab4576110b98361094b81850382612c17565b60185f9081525f80516020614c9d833981519152939250905b808210612ae55750909150810160200161094b6111ed565b919260018160209254838588010152019101909291612acd565b34610395575f366003190112610395576020612b19612fad565b509050604051908152f35b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b3461039557602036600319011261039557602061062a612b69610d9b612fad565b600435613bc5565b600435906001600160a01b038216820361039557565b602435906001600160a01b038216820361039557565b35906001600160a01b038216820361039557565b9181601f84011215610395578235916001600160401b038311610395576020808501948460051b01011161039557565b60a081019081106001600160401b03821117610a6957604052565b60c081019081106001600160401b03821117610a6957604052565b90601f801991011681019081106001600160401b03821117610a6957604052565b60a09060031901126103955760405190612c5182612be1565b816004356001600160a01b03811681036103955781526024356001600160a01b03811681036103955760208201526044356001600160a01b03811681036103955760408201526064356001600160a01b03811681036103955760608201526080608435910152565b601554811015612cd15760155f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b601454811015612cd15760145f5260205f2001905f90565b606090600319011261039557600435906024356001600160a01b038116810361039557906044356001600160a01b03811681036103955790565b6001600160401b038111610a6957601f01601f191660200190565b929192612d5e82612d37565b91612d6c6040519384612c17565b829481845281830111610395578281602093845f960137010152565b602060031982011261039557600435906001600160401b038211610395578060238301121561039557816024612dc393600401359101612d52565b90565b3461039557602036600319011261039557602061062a612de7610d9b612fad565b60043561386f565b90600182811c92168015612e1d575b6020831014612e0957565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612dfe565b5f9291815491612e3683612def565b8083529260018116908115612e8b5750600114612e5257505050565b5f9081526020812093945091925b838310612e71575060209250010190565b600181602092949394548385870101520191019190612e60565b915050602093945060ff929192191683830152151560051b010190565b9190811015612cd15760051b0190565b818102929181159184041417156124bd57565b6001600160401b038111610a695760051b60200190565b805115612cd15760200190565b8051821015612cd15760209160051b010190565b919082018092116124bd57565b9190826040910312610395576020825192015190565b80516001600160a01b03908116835260208083015182169084015260408083015182169084015260608083015190911690830152608090810151910152565b91612f74836101409593612f26565b60a08301525f60c083015260018060a01b031660e08201526101206101008201525f6101208201520190565b919082039182116124bd57565b5f905f806015547f00000000000000000000000000000000000000000000000000000000000000005b8183106130755750505060165491601754612ff18185612fa0565b83101561306757506130176130106130098486612fa0565b8094612f03565b9384612fa0565b80151580613053575b6130275750565b613050919450613043906001600160601b036012541690613fe4565b6002546106248286612fa0565b92565b506001600160601b03601254161515613020565b613010613017918094612f03565b9091926130bf6001916130b961309961308d88612cb9565b90549060031b1c613eca565b6130b16130aa3060a08420896136d4565b91876141e5565b5050916147a0565b90612f03565b93019190612fd6565b6001600160a01b039081165f81815260016020818152604080842095871684529490529290205493929184016130ff575b50505050565b82841061316b578015613158576001600160a01b03821615613145575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f8080806130f9565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115613238576001600160a01b031691821561322557815f525f60205260405f205481811061320c57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b6008546001600160a01b0316330361163657565b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480613352575b156132ba577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815261334c60c082612c17565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614613291565b602081830312610395578051906001600160401b03821161039557019080601f830112156103955781516133ae81612ecb565b926133bc6040519485612c17565b81845260208085019260051b82010192831161039557602001905b8282106133e45750505090565b81518152602091820191016133d7565b60206040818301928281528451809452019201905f5b8181106134175750505090565b825184526020938401939092019160010161340a565b6001600160b81b038111613447576001600160b81b031690565b6306dfcc6560e41b5f5260b860045260245260445ffd5b5f828152600d6020526040902093926001600160b81b031690816134d0575b508192938168ffffffffffffffffff60b81b8254161790556040519081527fe86b6d3313d3098f4c5f689c935de8fde876a597c185def2cedab85efedac68660203392a35f5260106020525f6040812055565b60ff855460b81c16156134f2575b5083546001600160c01b031684558161347d565b601554600160401b811015610a69578060016135119201601555612cb9565b81549060031b9085821b915f19901b1916179055601e601554116128795761358761358c91600160b81b60ff60b81b198854161787556130b9601654916130b17f0000000000000000000000000000000000000000000000000000000000000000916135813060a08320856136d4565b926141e5565b614194565b604051936020850160208652601554809152604086019060155f527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475905f5b818110613606575050507fe0c2db6b54586be6d7d49943139fccf0dd315ba63e55364a76c73cd8fdba724d8685969733930390a293926134de565b82548452602090930192600192830192016135cb565b5f905f6014547f00000000000000000000000000000000000000000000000000000000000000005b81831061365057505050565b90919361365c85612ce5565b905460039190911b1c5f818152600d60205260409020546001600160b81b03169081156136c957916136bf916136b36001946136ab6136a561369f30848b6136d4565b92613eca565b886141e5565b5050916144cd565b80820391110290612f03565b945b019190613644565b5050936001906136c1565b61372f61374b935f936040516020810191825260026040820152604081526136fd606082612c17565b51902060405190602082019260018060a01b03168352604082015260408152613727606082612c17565b51902061416d565b906040518080958194637784c68560e01b8352600483016133f4565b03916001600160a01b03165afa8015610b505761376e915f916137725750612ee2565b5190565b61378691503d805f833e6124af8183612c17565b5f612382565b7ff66f28b40975dbb933913542c7e6a0f50a1d0f20aa74ea6e0efe65ab616323ec60407f548669ea9bcc24888e6d74a69c9865fa98d795686853b8aa3eb87814261bbb7160206137da612fad565b6137e78295939492614194565b806017558551908152a180613804575b82519182526020820152a1565b6138138160125460601c61450c565b6137f7565b60ff16604d81116124bd57600a0a90565b90613857906130b97f0000000000000000000000000000000000000000000000000000000000000000613818565b91600181018091116124bd57612dc392600192614569565b9061389d906130b97f0000000000000000000000000000000000000000000000000000000000000000613818565b91600181018091116124bd57612dc3925f92614569565b92613977937fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7604061358795946139448251946323b872dd60e01b602087015260018060a01b0316948560248201523060448201528760648201526064815261391e608482612c17565b7f00000000000000000000000000000000000000000000000000000000000000006149ed565b61394e858261450c565b815186815260208101959095526001600160a01b031693a361396f816145b9565b601654612f03565b565b80600e556040519081527fd28e9b90ee9b37c5936ff84392d71f29ff18117d7e76bcee60615262a90a3f7560203392a25f601155565b51906001600160801b038216820361039557565b908160c091031261039557613a3560a0604051926139e084612bfc565b6139e9816139af565b84526139f7602082016139af565b6020850152613a08604082016139af565b6040850152613a19606082016139af565b6060850152613a2a608082016139af565b6080850152016139af565b60a082015290565b905f915f60a0604051613a4f81612bfc565b82815282602082015282604082015282606082015282608082015201527f00000000000000000000000000000000000000000000000000000000000000009060018060a01b03821690813b1561039557604051630a8e0d6f60e11b815290613abb906004830190612f26565b5f8160a48183865af18015610b5057613b6b575b5060c060249160405192838092632e3071cd60e11b82528760048301525afa938415613b5f5793613b26575b50613b0c61305091849330916136d4565b926001600160801b036020818351169201511690846147a0565b613050919350613b50613b0c9160c03d60c011613b58575b613b488183612c17565b8101906139c3565b939150613afb565b503d613b3e565b604051903d90823e3d90fd5b613b789194505f90612c17565b5f9260c0613acf565b600183018093116124bd57612dc392613bbf6001936130b97f0000000000000000000000000000000000000000000000000000000000000000613818565b91614569565b600183018093116124bd57612dc392613bbf5f936130b97f0000000000000000000000000000000000000000000000000000000000000000613818565b600c80546001600160a01b0319166001600160a01b03929092169182179055337fcb11cc8aade2f5a556749d1b2380d108a16fac3431e6a5d5ce12ef9de0bd76e35f80a35f600f55565b3d15613c76573d90613c5d82612d37565b91613c6b6040519384612c17565b82523d5f602084013e565b606090565b9193613c8f60165485808203911102614194565b613c98846148bb565b6001600160a01b0385811695908416938290878603613d8f575b505050841561323857845f525f60205260405f2054818110613d765791816040927ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db94885f525f60205203835f205580600254036002555f877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208651858152a3613d5f86837f0000000000000000000000000000000000000000000000000000000000000000613da0565b825195865260208601526001600160a01b031693a4565b8563391434e360e21b5f5260045260245260445260645ffd5b613d98926130c8565b5f8181613cb2565b60405163a9059cbb60e01b60208201526001600160a01b03909216602483015260448083019390935291815261397791613ddb606483612c17565b6149ed565b613e1590613dec612fad565b50613dfb819492600254612f03565b9260018060a01b03165f525f6020528260405f2054613bc5565b6015549290805f7f00000000000000000000000000000000000000000000000000000000000000005b868210613e54575b505061305092939450612fa0565b9092613e9b613e6285612cb9565b90549060031b1c613e95613e81613e7883613eca565b923090876136d4565b613e8b83876141e5565b50939180936147a0565b92614bef565b808203911102928315613eb15760010190613e3e565b613e46565b51906001600160a01b038216820361039557565b5f6080604051613ed981612be1565b828152826020820152826040820152826060820152015260405190632c3c915760e01b8252600482015260a081602481600180851b037f0000000000000000000000000000000000000000000000000000000000000000165afa908115610b50575f91613f44575090565b905060a0813d60a011613fbe575b81613f5f60a09383612c17565b8101031261039557608060405191613f7683612be1565b613f7f81613eb6565b8352613f8d60208201613eb6565b6020840152613f9e60408201613eb6565b6040840152613faf60608201613eb6565b60608401520151608082015290565b3d9150613f52565b8115613fd0570490565b634e487b7160e01b5f52601260045260245ffd5b9190915f838202915f19858209918380841093039280840393146140635782670de0b6b3a7640000111561405457507faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106699394670de0b6b3a7640000910990828211900360ee1b910360121c170290565b63227bc15360e01b8152600490fd5b505050670de0b6b3a76400009192500490565b9091828202915f19848209938380861095039480860395146140fd57848311156140ee57829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b63227bc15360e01b5f5260045ffd5b505090612dc39250613fc6565b6001600160a01b0316908115613158576001600160a01b03169182156131455760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b6040519061417c604083612c17565b600182526020368184013761419082612ee2565b5290565b60207f15c027cc4fd826d986cad358803439f7326d3aa4ed969ff90dbee4bc150f68e99180601655604051908152a1565b906001600160801b03809116911601906001600160801b0382116124bd57565b9060c060a08220602460405180958193632e3071cd60e11b8352600483015260018060a01b03165afa918215610b50575f926144ac575b50608082016142356001600160801b0382511642612fa0565b9182151580614496575b80614480575b614283575b5050506001600160801b038151166001600160801b03602083015116926001600160801b03606081604086015116940151169193929190565b6060810151604051638c00bf6b60e01b8152916001600160a01b03909116906142b0906004840190612f26565b6001600160801b0385511660a483015260208501936001600160801b0385511660c48401526001600160801b0360408701948186511660e48601528160608901511661010486015251166101248401526020836101648160a08a01956001600160801b038751166101448301525afa928315610b50575f9361444a575b506143906001600160801b039361438a614354670de0b6b3a7640000948789511693612eb8565b614385671bc16d674ec8000061436a8380612eb8565b046729a2241af62c000061437e8483612eb8565b0492612f03565b612f03565b90612eb8565b0492826143a861439f86614b7d565b828451166141c5565b169052816143c16143b885614b7d565b828851166141c5565b168552511690811561424a57670de0b6b3a7640000916143e091612eb8565b046143f5816001600160801b03855116612fa0565b6001600160801b0383511691620f424083018093116124bd57600182018092116124bd5761443a61443f926144356001600160801b039561439f94612eb8565b613fc6565b614b7d565b1690525f808061424a565b92506020833d602011614478575b8161446560209383612c17565b810103126103955791519161439061432d565b3d9150614458565b5060608101516001600160a01b03161515614245565b506001600160801b03604085015116151561423f565b6144c691925060c03d60c011613b5857613b488183612c17565b905f61421c565b90600181018091116124bd57620f42408301918284116124bd57620f423f916144f591612eb8565b9201918183116124bd57612dc39261443591612f03565b6001600160a01b0316908115613225577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208261454d5f94600254612f03565b60025584845283825260408420818154019055604051908152a3565b9190600180614579848487614076565b9561458381614ae3565b161492836145a4575b5050506145965790565b600181018091116124bd5790565b909180935015613fd0570915155f808061458c565b7f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382165f5b601454811015614787576145fa81612ce5565b905460039190911b1c5f818152600d60205260409020546001600160b81b0316801561477d5761462982613eca565b91843b1561039557604051630a8e0d6f60e11b815261464b6004820185612f26565b5f8160a481838a5af18015610b505761476d575b50604051632e3071cd60e11b8152600481018290529060c082602481895afa908115610b50576146b6925f92614749575b5061469d9030908a6136d4565b906001600160801b0360208183511692015116916144cd565b808203911102908185108583180280831892036146e0575b505082156130f9576001905b016145e7565b60406147029181518093819263a99aad8960e01b835286309160048501612f65565b03815f885af1908161472c575b5061471b575b806146ce565b6147259193612fa0565b915f614715565b6147439060403d81116118d7576118c68183612c17565b5061470f565b61469d9192506147669060c03d8111613b5857613b488183612c17565b9190614690565b5f61477791612c17565b5f61465f565b50506001906146da565b5050905061479157565b63ded0652d60e01b5f5260045ffd5b60018201929183106124bd57620f424082018092116124bd57612dc39261443591612eb8565b60ff811461480c5760ff811690601f82116147fd57604051916147ea604084612c17565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b50604051612dc38161481f816005612e27565b0382612c17565b60ff811461484a5760ff811690601f82116147fd57604051916147ea604084612c17565b50604051612dc38161481f816006612e27565b90614881575080511561487257805190602001fd5b630a12f52160e11b5f5260045ffd5b815115806148b2575b614892575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561488a565b5f5b6015548110156149d7576148d081612cb9565b90549060031b1c6149086148ed6148e683613eca565b9283613a3d565b90506001600160801b03604081835116920151169084614bef565b9081841084831802808318920361492e575b5050811561492a576001016148bd565b5050565b604051635c2bea4960e01b81529061494a906004830190612f26565b8160a48201525f60c48201523060e482015230610104820152604081610124815f60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190816149ba575b506149a9575b8061491a565b6149b39192612fa0565b905f6149a3565b6149d19060403d81116118d7576118c68183612c17565b5061499d565b506149de57565b634323a55560e01b5f5260045ffd5b5f80614a159260018060a01b03169360208151910182865af1614a0e613c4c565b908361485d565b8051908115159182614a3d575b5050614a2b5750565b635274afe760e01b5f5260045260245ffd5b81925090602091810103126103955760200151801590811503610395575f80614a22565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411614ad8579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610b50575f516001600160a01b03811615614ace57905f905f90565b505f906001905f90565b5050505f9160039190565b60041115614aed57565b634e487b7160e01b5f52602160045260245ffd5b614b0a81614ae3565b80614b13575050565b614b1c81614ae3565b60018103614b335763f645eedf60e01b5f5260045ffd5b614b3c81614ae3565b60028103614b57575063fce698f760e01b5f5260045260245ffd5b600390614b6381614ae3565b14614b6b5750565b6335e2f38360e21b5f5260045260245ffd5b604051614b8b604082612c17565b60148152731b585e081d5a5b9d0c4c8e08195e18d95959195960621b60208201526001600160801b038211614bc757506001600160801b031690565b60405162461bcd60e51b815260206004820152908190614beb906024830190612b24565b0390fd5b91614bfe602091602493612fa0565b92516040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301529093849290918391165afa908115610b50575f91614c6a575b508181109082180218818110908218021890565b90506020813d602011614c94575b81614c8560209383612c17565b8101031261039557515f614c56565b3d9150614c7856feb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695a164736f6c634300081a000a4df9dcd34ae35f40f2c756fd8ac83210ed0b76d065543ee73d868aec7c7fcf02a164736f6c634300081a000a"; bytes constant PUBLIC_ALLOCATOR_INIT_CODE = hex"60a03461008857601f6122ce38819003918201601f19168301916001600160401b0383118484101761008d5780849260209460405283398101031261008857516001600160a01b038116908190036100885760805260405161222a90816100a48239608051818181610e1801528181610f2501528181611053015281816110dd0152611baa0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b60003560e01c9081630e4eecf814611bce575080633acb562414611b5f57806363a846f814611af95780636fcca69b14611a94578063833947fd1461089757806391b114b2146108325780639dbcd5b9146107a6578063c55b6bb71461064b578063e55156b5146104f55763f46180461461008d57600080fd5b346104f05760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f0576100c4611d1b565b6024906024359067ffffffffffffffff8083116104f057366023840112156104f05782600401359081116104f0576024830192606090602436918385020101116104f05773ffffffffffffffffffffffffffffffffffffffff80931694856000526020936000855280604060002054163314159081610479575b5061044f576000939291935b8281106101e95750506040519281838501848652526040840194926000905b83821061019a5787337f709e1cb4b0ac458eb1c1a9c708e841ee963b229247afbf1437bd39e01ae4aa14888a0389a3005b90919293958380600192893581526fffffffffffffffffffffffffffffffff806101c5878d016120ac565b16868301526101d660408c016120ac565b1660408201520197019493920190610169565b6101f88184889795969761209c565b356040517fcc718f76000000000000000000000000000000000000000000000000000000008152816004820152848185818c5afa8015610443578791600091610416575b50015115806103c8575b610398576fffffffffffffffffffffffffffffffff91906f7fffffffffffffffffffffffffffffff80846102858a61027f878c8f61209c565b0161200b565b1611908484898c8515610378575b505050505061034e576001926103046040610344936102b3868b8e61209c565b908d60005260038c5282600020906000528b5281600020936102d68c830161200b565b167fffffffffffffffffffffffffffffffff000000000000000000000000000000008554161784550161200b565b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b019392919361014a565b60046040517fb9860d64000000000000000000000000000000000000000000000000000000008152fd5b61038c939495509161027f9160409361209c565b1611388484898c610293565b9050604051907f6113d8c70000000000000000000000000000000000000000000000000000000082526004820152fd5b506fffffffffffffffffffffffffffffffff806103ea8861027f868a8d61209c565b1615908115916103fb575b50610246565b905061040d604061027f85898c61209c565b161515386103f5565b6104369150863d881161043c575b61042e8183611dc7565b810190611f3b565b3861023c565b503d610424565b6040513d6000823e3d90fd5b60046040517f26d3a7bf000000000000000000000000000000000000000000000000000000008152fd5b90506040517f8da5cb5b00000000000000000000000000000000000000000000000000000000815285816004818b5afa908115610443576000916104c3575b50163314153861013e565b6104e39150863d88116104e9575b6104db8183611dc7565b810190611e08565b386104b8565b503d6104d1565b600080fd5b346104f05760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f05761052c611d1b565b60243573ffffffffffffffffffffffffffffffffffffffff809216918260005260209060008252806040600020541633141590816105e4575b5061044f57826000526001815281604060002054146105ba577f44a6d70a601a6f8a85c075467e9d7245897140cbf6dd505c9d9d764459f5fb64908360005260018152826040600020556040519283523392a3005b60046040517fa741a045000000000000000000000000000000000000000000000000000000008152fd5b90506040517f8da5cb5b0000000000000000000000000000000000000000000000000000000081528281600481885afa9081156104435760009161062e575b501633141584610565565b6106459150833d85116104e9576104db8183611dc7565b85610623565b346104f05760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f057610682611d1b565b60243573ffffffffffffffffffffffffffffffffffffffff918282168092036104f0578216918260005260209060008252806040600020541633141580610740575b61044f578290846000526000835260406000205416146105ba577fc51248b3e510a1244e01043dffdc0132d10194bd4506382cbcf83d05f6ec57ef9083600052600081526040600020837fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556040519283523392a3005b506040517f8da5cb5b0000000000000000000000000000000000000000000000000000000081528281600481885afa8015610443578291600091610789575b50163314156106c4565b6107a09150843d86116104e9576104db8183611dc7565b8661077f565b346104f05760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f05773ffffffffffffffffffffffffffffffffffffffff6107f2611d1b565b1660005260036020526040600020602435600052602052604080600020548151906fffffffffffffffffffffffffffffffff8116825260801c6020820152f35b346104f05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f05773ffffffffffffffffffffffffffffffffffffffff61087e611d1b565b1660005260026020526020604060002054604051908152f35b60e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f0576108c9611d1b565b60243567ffffffffffffffff81116104f057366023820112156104f05767ffffffffffffffff8160040135116104f05736602460c0836004013502830101116104f05760a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc3601126104f05773ffffffffffffffffffffffffffffffffffffffff821660005260016020526040600020543403611a6a5734611a34575b806004013515611a0a5760a061097c36611e41565b20916040517fcc718f7600000000000000000000000000000000000000000000000000000000815283600482015260608160248173ffffffffffffffffffffffffffffffffffffffff86165afa8015610443576020916000916119eb575b5001511561194d57600482013560018101919082106113c7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610a36610a2084611fb4565b93610a2e6040519586611dc7565b808552611fb4565b0160005b81811061199d5750506000926000805b82600401358210610d2c57505073ffffffffffffffffffffffffffffffffffffffff821660005260036020526040600020856000526020526fffffffffffffffffffffffffffffffff93846040600020541694808216809610610cfb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92610b74602093610b989373ffffffffffffffffffffffffffffffffffffffff88166000526003865260406000208b60005286526040600020907fffffffffffffffffffffffffffffffff00000000000000000000000000000000825491610b328582851661204c565b16911617905573ffffffffffffffffffffffffffffffffffffffff87166000526003855260406000208a6000528552610304604060002091825460801c612028565b610b8281600401358761207b565b51610b8c36611e41565b9052600401358561207b565b51015273ffffffffffffffffffffffffffffffffffffffff81163b156104f05760405180927f7299aa310000000000000000000000000000000000000000000000000000000082526024820160206004840152815180915260206044840192019060005b818110610c8957505050908060009203818373ffffffffffffffffffffffffffffffffffffffff86165af19182156104435773ffffffffffffffffffffffffffffffffffffffff92610c7a575b5060405192835216907ff8ae80b0854dfc3c73d3eb4b6160df1996a5859e6c1d11d10f3980a7f469199160203392a4005b610c8390611d97565b84610c49565b91935091602060c0600192828751610ce68382516080809173ffffffffffffffffffffffffffffffffffffffff80825116855280602083015116602086015280604083015116604086015260608201511660608501520151910152565b015160a0820152019401910191859392610bfc565b602487604051907f2e581b4e0000000000000000000000000000000000000000000000000000000082526004820152fd5b949060a0610d4b36610d4684876004013560248901611fcc565b611ed9565b20916040517fcc718f7600000000000000000000000000000000000000000000000000000000815283600482015260608160248173ffffffffffffffffffffffffffffffffffffffff8a165afa80156104435760209160009161197e575b5001511561194d57610dc860a061027f84876004013560248901611fcc565b966fffffffffffffffffffffffffffffffff88161561191c578311156118f2578783146118c857610e0182856004013560248701611fcc565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163b156104f0576080604051917f151c1ade00000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff610e8582611d3e565b16600484015273ffffffffffffffffffffffffffffffffffffffff610eac60208301611d3e565b16602484015273ffffffffffffffffffffffffffffffffffffffff610ed360408301611d3e565b16604484015273ffffffffffffffffffffffffffffffffffffffff610efa60608301611d3e565b1660648401520135608482015260008160a4818373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af18015610443576118b9575b50610f6936610d4684876004013560248901611fcc565b60a08120604051602081019182526002604082015260408152610f8b81611dab565b519020604051602081019173ffffffffffffffffffffffffffffffffffffffff89168352604082015260408152610fc181611dab565b519020604051610fd081611d5f565b6001815260208101916020368437610fe78261206e565b526040519182917f7784c685000000000000000000000000000000000000000000000000000000008352602483019060206004850152518091526044830191906000905b80821061189d575050509080600092038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610443576000906117f1575b61108d915061206e565b519060a0812090604051917f5c60e39a000000000000000000000000000000000000000000000000000000008352600483015260c08260248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9182156104435760009261170b575b5060808201906111316fffffffffffffffffffffffffffffffff8351164261208f565b90811515806116ec575b806116c9575b6113f6575b5050506fffffffffffffffffffffffffffffffff602081835116920151166001820182116113c757620f4240810181116113c757611196926001620f424061119193019301906120e6565b6121e4565b73ffffffffffffffffffffffffffffffffffffffff861660005260036020526040600020846000526020526fffffffffffffffffffffffffffffffff881660406000205460801c10611396576fffffffffffffffffffffffffffffffff88168110611365576113078884936112f387948b6112d86112cf896112c98f9c8f73ffffffffffffffffffffffffffffffffffffffff60019f8e828216600052600360205260406000209060005260205260406000208d7fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffffffffffffffffffff61128a845493828516612028565b16911617905516600052600360205260406000208d6000526020526112bb60406000206103048d825460801c61204c565b602481600401359101611fcc565b9361207b565b51913690611ed9565b90526fffffffffffffffffffffffffffffffff84169061208f565b60206112ff878d61207b565b510152612028565b976fffffffffffffffffffffffffffffffff6040519116815273ffffffffffffffffffffffffffffffffffffffff8716907f6218cdb9e8efb3d0e8136d32c91d9446eaf19e2e486bc67dfcb3d574ca60d50460203392a40190610a4a565b602484604051907f8c4bfb140000000000000000000000000000000000000000000000000000000082526004820152fd5b602484604051907fad5f61d30000000000000000000000000000000000000000000000000000000082526004820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6114a46101648273ffffffffffffffffffffffffffffffffffffffff60606020950151166fffffffffffffffffffffffffffffffff60405197889586947f8c00bf6b00000000000000000000000000000000000000000000000000000000865260048601906080809173ffffffffffffffffffffffffffffffffffffffff80825116855280602083015116602086015280604083015116604086015260608201511660608501520151910152565b818a511660a485015281878b01511660c48501528160408b01511660e48501528160608b01511661010485015251166101248301526fffffffffffffffffffffffffffffffff60a0890151166101448301525afa91821561044357600092611693575b509061157a61153061156f936fffffffffffffffffffffffffffffffff604087015116936120e6565b91611574671bc16d674ec8000061154785806120e6565b0493670de0b6b3a764000095856729a2241af62c0000611568848a996120e6565b0492611e34565b611e34565b906120e6565b046fffffffffffffffffffffffffffffffff6115a4611598836120f9565b82604087015116612028565b1660408401526fffffffffffffffffffffffffffffffff6115d06115c7836120f9565b82865116612028565b1683526fffffffffffffffffffffffffffffffff60a0840151168015611146576115f9916120e6565b04611617816fffffffffffffffffffffffffffffffff84511661208f565b6fffffffffffffffffffffffffffffffff60208401511690620f4240820182116113c7576001810181116113c757611674611685926111916fffffffffffffffffffffffffffffffff95620f4240600161167996019301906120e6565b6120f9565b82602085015116612028565b1660208201528a8080611146565b91506020823d6020116116c1575b816116ae60209383611dc7565b810103126104f05790519061157a611507565b3d91506116a1565b5073ffffffffffffffffffffffffffffffffffffffff6060820151161515611141565b506fffffffffffffffffffffffffffffffff604085015116151561113b565b90915060c0813d60c0116117e9575b8161172760c09383611dc7565b810103126104f057604051908160c081011067ffffffffffffffff60c0840111176117ba5760a06117ae9160c08401604052611762816120c9565b8452611770602082016120c9565b6020850152611781604082016120c9565b6040850152611792606082016120c9565b60608501526117a3608082016120c9565b6080850152016120c9565b60a0820152908b61110e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3d915061171a565b503d90816000823e6118038282611dc7565b60208183810103126104f05780519167ffffffffffffffff83116104f057808201601f8484010112156104f057828201519161183e83611fb4565b9361184c6040519586611dc7565b8385526020850192820160208560051b8385010101116104f057602081830101925b60208560051b8385010101841061188d57505050505061108d90611083565b835181526020938401930161186e565b919350916020806001928651815201940192018493929161102b565b6118c290611d97565b88610f52565b60046040517f898ca719000000000000000000000000000000000000000000000000000000008152fd5b60046040517fc9527748000000000000000000000000000000000000000000000000000000008152fd5b602484604051907f9565ed900000000000000000000000000000000000000000000000000000000082526004820152fd5b602483604051907f6113d8c70000000000000000000000000000000000000000000000000000000082526004820152fd5b611997915060603d60601161043c5761042e8183611dc7565b8a610da9565b6020906040516119ac81611d5f565b6040516119b881611d7b565b60008152600084820152600060408201526000606082015260006080820152815260008382015282828701015201610a3a565b611a04915060603d60601161043c5761042e8183611dc7565b856109da565b60046040517f76da5945000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff821660005260026020526040600020611a63348254611e34565b9055610967565b60046040517fcd3cb2bb000000000000000000000000000000000000000000000000000000008152fd5b346104f05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f05773ffffffffffffffffffffffffffffffffffffffff611ae0611d1b565b1660005260016020526020604060002054604051908152f35b346104f05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f057602073ffffffffffffffffffffffffffffffffffffffff80611b48611d1b565b166000526000825260406000205416604051908152f35b346104f05760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104f05760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f057611c05611d1b565b906024359173ffffffffffffffffffffffffffffffffffffffff908184168094036104f057811691826000526020916000835280604060002054163314159182611cb5575b505061044f578160005260028152604060002090600082549255600082858115611cab575b600092839283928392f115610443577f6ab9f885fa0bfd2af57586f4cdde83bbfc79294d0cd2d61d4b31e9a3d1be6e2c906040519283523392a4005b6108fc9250611c6f565b9091507f8da5cb5b0000000000000000000000000000000000000000000000000000000081528281600481875afa90811561044357600091611cfe575b50163314158480611c4a565b611d159150833d85116104e9576104db8183611dc7565b85611cf2565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036104f057565b359073ffffffffffffffffffffffffffffffffffffffff821682036104f057565b6040810190811067ffffffffffffffff8211176117ba57604052565b60a0810190811067ffffffffffffffff8211176117ba57604052565b67ffffffffffffffff81116117ba57604052565b6060810190811067ffffffffffffffff8211176117ba57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176117ba57604052565b908160209103126104f0575173ffffffffffffffffffffffffffffffffffffffff811681036104f05790565b919082018092116113c757565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc60a09101126104f05760405190611e7882611d7b565b8173ffffffffffffffffffffffffffffffffffffffff60443581811681036104f057825260643581811681036104f057602083015260843581811681036104f057604083015260a43590811681036104f0576060820152608060c435910152565b91908260a09103126104f057604051611ef181611d7b565b6080808294611eff81611d3e565b8452611f0d60208201611d3e565b6020850152611f1e60408201611d3e565b6040850152611f2f60608201611d3e565b60608501520135910152565b908160609103126104f0576040519067ffffffffffffffff9060608301828111848210176117ba57604052805176ffffffffffffffffffffffffffffffffffffffffffffff811681036104f057835260208101519081151582036104f0576040916020850152015190811681036104f057604082015290565b67ffffffffffffffff81116117ba5760051b60200190565b9190811015611fdc5760c0020190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b356fffffffffffffffffffffffffffffffff811681036104f05790565b9190916fffffffffffffffffffffffffffffffff808094169116019182116113c757565b6fffffffffffffffffffffffffffffffff91821690821603919082116113c757565b805115611fdc5760200190565b8051821015611fdc5760209160051b010190565b919082039182116113c757565b9190811015611fdc576060020190565b35906fffffffffffffffffffffffffffffffff821682036104f057565b51906fffffffffffffffffffffffffffffffff821682036104f057565b818102929181159184041417156113c757565b6fffffffffffffffffffffffffffffffff9060405161211781611d5f565b601481526020907f6d61782075696e7431323820657863656564656400000000000000000000000060208201528383116121515750501690565b60405180927f08c379a00000000000000000000000000000000000000000000000000000000082526020600483015282519283602484015260005b8481106121cd575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b81810183015186820160440152859350820161218c565b81156121ee570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c6343000818000a"; bytes constant MORPHO_CHAINLINK_ORACLE_V2_FACTORY_INIT_CODE = hex"6080806040523461001657611170908161001c8239f35b600080fdfe60806040818152600436101561001457600080fd5b600091823560e01c9081634cf4a26414610204575063b32cddf41461003857600080fd5b34610200576101607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102005760043573ffffffffffffffffffffffffffffffffffffffff908181168091036101fc576044358281168091036101f8576064358381168091036101f45760a4358481168091036101f05760e435908582168092036101ec5761010435928684168094036101e857875194610ef5968787019787891067ffffffffffffffff8a11176101bb5761026f883987526024356020880152888701526060860152608435608086015260a085015260c43560c085015260e08401526101008301526101243561012083015261014081610144359303019085f580156101af579180916020949316928381528085522060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f6436acb89463dbc9036f1e52aebf32ac0bf5f69e3987c067110c3ac403ebda338180513381528486820152a151908152f35b505051903d90823e3d90fd5b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8880fd5b8780fd5b8680fd5b8580fd5b8480fd5b8380fd5b5080fd5b9190503461026a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026a5760043573ffffffffffffffffffffffffffffffffffffffff81168091036101fc578352602083815292205460ff1615158152f35b8280fdfe6101a08060405234620002fa578062000ef5803803809162000022828562000331565b833961014092839181010312620002fa576200003e8162000355565b91602082015190620000536040840162000355565b90620000626060850162000355565b926080850151956200007760a0870162000355565b9060c0870151956200008c60e0890162000355565b95610100996200009e8b8b0162000355565b6101209a8b0151956001600160a01b0386811615801590620002ef575b620000d190620000ca6200036a565b90620003bf565b811615801590620002e4575b620000ec90620000ca6200036a565b8715956200015a6040516200010181620002ff565b601f8152620001397f7661756c7420636f6e76657273696f6e2073616d706c65206973207a65726f00918260208201528a15620003bf565b604051906200014882620002ff565b601f825260208201528d1515620003bf565b6080528760a05260c0528960e052828c52838b5288885261016098818a52602496870190818811620002cf57620001bd620001ca94620001c4620001bd95620001b6620001bd620001d19b9a97620001b6620001ca986200045b565b9062000429565b916200045b565b6200044d565b906200044d565b604d8111620002ba57600a0a868102968188041490151715620002a55762000291575061018093048352604051936109fd9586620004f8873960805186818161014b0152610304015260a0518681816102e301526105b9015260c0518681816103ac0152610560015260e05186818161038b01526104f301525185818160d9015261032d0152518481816101b9015261035c0152518381816103d5015261049a01525182818161027f01526103fe01525181818161021201526104250152f35b634e487b7160e01b60009081526012600452fd5b50634e487b7160e01b60009081526011600452fd5b82634e487b7160e01b60005260116004526000fd5b87634e487b7160e01b60005260116004526000fd5b5060018b14620000dd565b5060018914620000bb565b600080fd5b604081019081106001600160401b038211176200031b57604052565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b038211908210176200031b57604052565b51906001600160a01b0382168203620002fa57565b60405190606082016001600160401b038111838210176200031b5760405260228252616e6560f01b6040837f7661756c7420636f6e76657273696f6e2073616d706c65206973206e6f74206f60208201520152565b15620003c85750565b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b8285106200040f575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350620003eb565b919082018092116200043757565b634e487b7160e01b600052601160045260246000fd5b919082039182116200043757565b6001600160a01b03168015620004f15760206004916040519283809263313ce56760e01b82525afa908115620004e5576000916200049b575b5060ff1690565b6020813d8211620004dc575b81620004b66020938362000331565b81010312620004d857519060ff82168203620004d5575060ff62000494565b80fd5b5080fd5b3d9150620004a7565b6040513d6000823e3d90fd5b5060009056fe60806040818152600436101561001457600080fd5b600091823560e01c908163054f7ac014610584575080632e6f20a614610516578063461739d2146104be57806356095e1114610450578063a035b1fe146102a3578063acfbd39e14610235578063ce4b5bbe146101dd578063dc53858c1461016f578063eaa2d7b4146101015763f50a47181461009057600080fd5b346100fd57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5080fd5b50346100fd57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346100fd57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346100fd57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd57602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346100fd57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346100fd57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd576020906104496103806103576103287f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061094a565b6103517f00000000000000000000000000000000000000000000000000000000000000006107a5565b906105dc565b6103517f00000000000000000000000000000000000000000000000000000000000000006107a5565b6104226103f96103d07f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061094a565b6103517f00000000000000000000000000000000000000000000000000000000000000006107a5565b6103517f00000000000000000000000000000000000000000000000000000000000000006107a5565b907f000000000000000000000000000000000000000000000000000000000000000061061e565b9051908152f35b50346100fd57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346100fd57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd57602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346100fd57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b8390346100fd57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd576020907f00000000000000000000000000000000000000000000000000000000000000008152f35b818102929181159184041417156105ef57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9091828202917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848209938380861095039480860395146106dc57848311156106b25782910981600003821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b60046040517f227bc153000000000000000000000000000000000000000000000000000000008152fd5b5050809250156106ea570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761075a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b519069ffffffffffffffffffff821682036107a057565b600080fd5b73ffffffffffffffffffffffffffffffffffffffff1680156109445760049060a06040918251938480927ffeaf968c0000000000000000000000000000000000000000000000000000000082525afa918215610939576000926108e8575b50805181810181811067ffffffffffffffff82111761075a578252600f81526020917f6e6567617469766520616e73776572000000000000000000000000000000000083830152600084126108585750505090565b5180927f08c379a000000000000000000000000000000000000000000000000000000000825280600483015282519283602484015260005b8481106108d1575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201610890565b909160a0823d8211610931575b8161090260a09383610719565b8101031261092e575061091481610789565b50610926608060208301519201610789565b509038610803565b80fd5b3d91506108f5565b50513d6000823e3d90fd5b50600190565b73ffffffffffffffffffffffffffffffffffffffff169081156109e9576020906024604051809481937f07a2d13a00000000000000000000000000000000000000000000000000000000835260048301525afa9081156109dd576000916109af575090565b906020823d82116109d5575b816109c860209383610719565b8101031261092e57505190565b3d91506109bb565b6040513d6000823e3d90fd5b505060019056fea164736f6c6343000815000aa164736f6c6343000815000a"; bytes constant PRE_LIQUIDATION_FACTORY_INIT_CODE = hex"60a034608257601f61215838819003918201601f19168301916001600160401b03831184841017608657808492602094604052833981010312608257516001600160a01b0381169081900360825780156073576080526040516120bd908161009b8239608051818181608701526101b30152f35b63d92e233d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c9081631c32209214610119575080631ea36725146100af57633acb56241461003d575f80fd5b346100ab575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ab57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5f80fd5b346100ab5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ab5760043573ffffffffffffffffffffffffffffffffffffffff81168091036100ab575f525f602052602060ff60405f2054166040519015158152f35b346100ab5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ab576004359060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126100ab57611dac9081810181811067ffffffffffffffff82111761028a5781610100915f94610305833973ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681528560208201526101e7604082016102b7565b03019082f5801561027f576020917fc36ddf254f2ae7c3a2c82dc525fed9a804cdaf8102b19b3caa5aeda5afcca38273ffffffffffffffffffffffffffffffffffffffff60e093169283926040519081526102438682016102b7565ba2805f525f825260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055604051908152f35b6040513d5f823e3d90fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b602435815260443560208201526064356040820152608435606082015260a435608082015260c4359073ffffffffffffffffffffffffffffffffffffffff82168092036100ab5760a0015256fe61022080604052346104675780611dac803803809161001e8285610545565b83398101039061010082126104675761003681610568565b60c0602083015193603f19011261046757604051916100548361052a565b60408101518352606081015193602084019485526080820151926040850193845260a0830151906060860191825261009a60e060c0860151956080890196875201610568565b60a08701908152604051632e3071cd60e11b8152600481018590526001600160a01b0390921694909160c081602481895afa908115610473575f9161048d575b50608001516001600160801b03161561047e57604051632c3c915760e01b8152600481018590529260a084602481895afa938415610473575f946103c2575b508751966080850197885111156103b35789518151106103a457670de0b6b3a76400008a5111610395578151670de0b6b3a76400001161038657815183511061037757825188518015610363576ec097ce7bc90715b34b9f1000000000041061035457608087905260a09590955283516001600160a01b0390811660c052602085810151821660e052604080870151831661010052606087015183166101205298516101405298516101605298516101805293516101a05292516101c05291516101e052905185166102005251915163095ea7b360e01b815260048101919091525f19602482015291925f9260449290918491165af13d15601f3d1160015f51141617161561031e5760405161181b908161059182396080518181816101ce0152818161028d0152611113015260a0518181816095015281816103b3015281816104180152610a94015260c051818181611361015261167f015260e051816116b8015261010051816116f401526101205181611730015261014051818181610590015281816106a101526117570152610160518181816105ca01528181610655015281816106800152610f740152610180518181816108310152610fbe01526101a0518181816108570152610fe501526101c0518181816106f0015261100d01526101e05181818161071701526110370152610200518181816104b4015261105d0152f35b60405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b6044820152606490fd5b6331aff75360e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b63141da4bd60e21b5f5260045ffd5b630136247b60e51b5f5260045ffd5b630287fe3b60e31b5f5260045ffd5b631bc4f82360e01b5f5260045ffd5b63f0586c2360e01b5f5260045ffd5b90935060a0813d60a01161046b575b816103de60a09383610545565b81010312610467576040519060a08201906001600160401b038211838310176104535760809160405261041081610568565b835261041e60208201610568565b602084015261042f60408201610568565b604084015261044060608201610568565b606084015201516080820152925f610119565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b3d91506103d1565b6040513d5f823e3d90fd5b630ecde9b360e31b5f5260045ffd5b905060c0813d60c011610522575b816104a860c09383610545565b810103126104675761051760a0604051926104c28461052a565b6104cb8161057c565b84526104d96020820161057c565b60208501526104ea6040820161057c565b60408501526104fb6060820161057c565b606085015261050c6080820161057c565b60808501520161057c565b60a08201525f6100da565b3d915061049b565b60c081019081106001600160401b0382111761045357604052565b601f909101601f19168101906001600160401b0382119082101761045357604052565b51906001600160a01b038216820361046757565b51906001600160801b03821682036104675756fe6080806040526004361015610012575f80fd5b5f905f3560e01c90816305b4591c146110a6575080631d553cee14610f165780633078f50a146101f25780633acb5624146101835780637b9e68f2146100bb5763b3cea21714610060575f80fd5b346100b857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b85760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b80fd5b50346100b857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b85760a06100f4611636565b61018160405180926080809173ffffffffffffffffffffffffffffffffffffffff815116845273ffffffffffffffffffffffffffffffffffffffff602082015116602085015273ffffffffffffffffffffffffffffffffffffffff604082015116604085015273ffffffffffffffffffffffffffffffffffffffff60608201511660608501520151910152565bf35b50346100b857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346100b85760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b85760043573ffffffffffffffffffffffffffffffffffffffff81168103610f125760243560643567ffffffffffffffff8111610f0e576102659036906004016114f4565b60443594918391908215871514610ee65773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016926102b6611636565b843b15610eb657610371604051917f151c1ade00000000000000000000000000000000000000000000000000000000835260048301906080809173ffffffffffffffffffffffffffffffffffffffff815116845273ffffffffffffffffffffffffffffffffffffffff602082015116602085015273ffffffffffffffffffffffffffffffffffffffff604082015116604085015273ffffffffffffffffffffffffffffffffffffffff60608201511660608501520151910152565b858160a48183895af18015610ec257908691610ecd575b5050604051907f5c60e39a0000000000000000000000000000000000000000000000000000000082527f0000000000000000000000000000000000000000000000000000000000000000600483015260c082602481885afa918215610ec2578692610e1f575b50604051917f93c520620000000000000000000000000000000000000000000000000000000083527f0000000000000000000000000000000000000000000000000000000000000000600484015273ffffffffffffffffffffffffffffffffffffffff89166024840152606083604481895afa928315610e14578793610d6c575b50604051917fa035b1fe00000000000000000000000000000000000000000000000000000000835260208360048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa928315610d61578893610d29575b5060206ec097ce7bc90715b34b9f1000000000610517856fffffffffffffffffffffffffffffffff60408901511661177e565b049401926fffffffffffffffffffffffffffffffff8451166fffffffffffffffffffffffffffffffff6040850151166fffffffffffffffffffffffffffffffff6060860151169160018201809211610c7f57620f42408301809311610c7f579061058192916117c8565b94670de0b6b3a76400006105b57f00000000000000000000000000000000000000000000000000000000000000008361177e565b048611610d0157670de0b6b3a76400006105ef7f00000000000000000000000000000000000000000000000000000000000000008361177e565b04861115610cd957670de0b6b3a76400009586810290808204881490151715610cac577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820190828211610c7f579161064e6106539261067a94611629565b611791565b7f00000000000000000000000000000000000000000000000000000000000000009061161c565b9b6106c57f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061161c565b9c86810290808204881490151715610b78578a876107429c9d9e9f6106ed9061074894611791565b9c7f0000000000000000000000000000000000000000000000000000000000000000928e61073b857f000000000000000000000000000000000000000000000000000000000000000061161c565b915061177e565b04611629565b9215610ba55750610759908b61177e565b6ec097ce7bc90715b34b9f0fffffffff8101809111610b4b576ec097ce7bc90715b34b9f1000000000900484810290808204861490151715610b4b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820190828211610b78576107ce929161064e91611629565b6fffffffffffffffffffffffffffffffff6060816040850151169301511690620f42408201809211610b4b5760018301809311610b4b5761082861088394936fffffffffffffffffffffffffffffffff9361087b936117c8565b985b856107428c7f00000000000000000000000000000000000000000000000000000000000000009361073b857f000000000000000000000000000000000000000000000000000000000000000061161c565b91511661177e565b04808511610b1b5750610a2f9261093160c0887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f876040988e9873ffffffffffffffffffffffffffffffffffffffff8b519a8b976020890152168b8701523360608701526080808701528160a0870152868601378b8582860101520116810103017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810184528361157b565b6109f38661093d611636565b8551968795869485937f20b76e8100000000000000000000000000000000000000000000000000000000855260048501906080809173ffffffffffffffffffffffffffffffffffffffff815116845273ffffffffffffffffffffffffffffffffffffffff602082015116602085015273ffffffffffffffffffffffffffffffffffffffff604082015116604085015273ffffffffffffffffffffffffffffffffffffffff60608201511660608501520151910152565b8360a48401528960c484015273ffffffffffffffffffffffffffffffffffffffff8d1660e48401526101206101048401526101248301906115bc565b03925af1928315610b0f578093610ac1575b505073ffffffffffffffffffffffffffffffffffffffff60409485519284845260208401528486840152169033907fd5b01f148b35d6069b626af105bf8881bc2e30ee1ce3de4630903abab0ba858060607f000000000000000000000000000000000000000000000000000000000000000092a482519182526020820152f35b909492506040853d604011610b07575b81610ade6040938361157b565b810103126100b8575073ffffffffffffffffffffffffffffffffffffffff604094519294610a41565b3d9150610ad1565b604051903d90823e3d90fd5b85604491867f44bb1e75000000000000000000000000000000000000000000000000000000008352600452602452fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60248b7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b989a50916fffffffffffffffffffffffffffffffff606081604084015116920151169060018101809111610b7857620f42408201809211610b785791610bf5610bfa9261064e889560443561177e565b61177e565b046ec097ce7bc90715b34b9f10000000008102908082046ec097ce7bc90715b34b9f10000000001490151715610c525761087b610c4c61088394936fffffffffffffffffffffffffffffffff93611791565b9a61082a565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60048a7f0bb9a651000000000000000000000000000000000000000000000000000000008152fd5b60048a7ff78266a2000000000000000000000000000000000000000000000000000000008152fd5b9092506020813d602011610d59575b81610d456020938361157b565b81010312610d555751915f6104e4565b8780fd5b3d9150610d38565b6040513d8a823e3d90fd5b9092506060813d606011610e0c575b81610d886060938361157b565b81010312610e0857604051906060820182811067ffffffffffffffff821117610ddb57610dcf91604091825280518452610dc4602082016115ff565b6020850152016115ff565b6040820152915f61046f565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8680fd5b3d9150610d7b565b6040513d89823e3d90fd5b90915060c0813d60c011610eba575b81610e3b60c0938361157b565b81010312610eb657610eaa60a060405192610e5584611543565b610e5e816115ff565b8452610e6c602082016115ff565b6020850152610e7d604082016115ff565b6040850152610e8e606082016115ff565b6060850152610e9f608082016115ff565b6080850152016115ff565b60a0820152905f6103ee565b8580fd5b3d9150610e2e565b6040513d88823e3d90fd5b81610ed79161157b565b610ee257845f610388565b8480fd5b6004847ff0732dd7000000000000000000000000000000000000000000000000000000008152fd5b8380fd5b5080fd5b50346100b857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b85760a0604051610f5381611543565b828152826020820152826040820152826060820152826080820152015260c07f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff604051610fb481611543565b82815260208101907f00000000000000000000000000000000000000000000000000000000000000008252604081017f0000000000000000000000000000000000000000000000000000000000000000815260608201907f0000000000000000000000000000000000000000000000000000000000000000825260a060808401937f000000000000000000000000000000000000000000000000000000000000000085520193857f0000000000000000000000000000000000000000000000000000000000000000168552604051968752516020870152516040860152516060850152516080840152511660a0820152f35b90503461149b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261149b5760043560243567ffffffffffffffff811161149b576110fa9036906004016114f4565b929073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016938433036114cc5781019360808286031261149b5761115460208301611522565b9461116160408401611522565b606084013567ffffffffffffffff811161149b5784019180601f8401121561149b5782359067ffffffffffffffff821161149f576111c760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116018861157b565b8187526020828501011161149b576020815f928273ffffffffffffffffffffffffffffffffffffffff9601838a0137870101521694611204611636565b91803b1561149b575f92836101049273ffffffffffffffffffffffffffffffffffffffff6112e19560405198899788967f8720316d00000000000000000000000000000000000000000000000000000000885260048801906080809173ffffffffffffffffffffffffffffffffffffffff815116845273ffffffffffffffffffffffffffffffffffffffff602082015116602085015273ffffffffffffffffffffffffffffffffffffffff604082015116604085015273ffffffffffffffffffffffffffffffffffffffff60608201511660608501520151910152565b3560a48601521660c48401528960e48401525af1801561149057611479575b5090818492516113f7575b50602092606491604051917f23b872dd000000000000000000000000000000000000000000000000000000008352600483015230602483015260448201528273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af13d15601f3d116001845114161716156113995780f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b833b15611475578261144491604051809381927f8e8beec40000000000000000000000000000000000000000000000000000000083528660048401526040602484015260448301906115bc565b038183885af1801561146a571561130b5761146083809261157b565b610f12575f61130b565b6040513d85823e3d90fd5b8280fd5b611487919294505f9061157b565b5f92905f611300565b6040513d5f823e3d90fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7fe51b5123000000000000000000000000000000000000000000000000000000005f5260045ffd5b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b60c0810190811067ffffffffffffffff82111761149f57604052565b60a0810190811067ffffffffffffffff82111761149f57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761149f57604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b51906fffffffffffffffffffffffffffffffff8216820361149b57565b91908203918211610cac57565b91908201809211610cac57565b5f60806040516116458161155f565b82815282602082015282604082015282606082015201526040516116688161155f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660608201527f0000000000000000000000000000000000000000000000000000000000000000608082015290565b81810292918115918404141715610cac57565b811561179b570490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b906117d29161177e565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810191818311610cac5761180b9261064e91611629565b9056fea164736f6c634300081b000aa164736f6c634300081b000a"; bytes constant URD_FACTORY_INIT_CODE = hex"6080806040523461001657610fb5908161001c8239f35b600080fdfe6080604090808252600436101561001557600080fd5b600090813560e01c90816309bf14231461012d5750638683fbdd1461003957600080fd5b3461012a5760a036600319011261012a5761005261016b565b916024356044359060643560843590845193610e22948581019581871067ffffffffffffffff88111761011657908491610187823960808160018060a01b03809c1698898152886020820152858b82015286606082015203019089f5801561010c5760209887911697888152808a5220600160ff19825416179055855193845287840152848301526060820152837fb08f131b4d26f626f4bd2fa639786c2b37988240728dcb975897a27ddc87ddb260803393a451908152f35b86513d89823e3d90fd5b634e487b7160e01b89526041600452602489fd5b80fd5b905082346101675760203660031901126101675760209260ff91906001600160a01b0361015861016b565b16815280855220541615158152f35b8280fd5b600435906001600160a01b038216820361018157565b600080fdfe60803461011057601f610e2238819003918201601f19168301916001600160401b03831184841017610115578084926080946040528339810103126101105780516001600160a01b0381169190829003610110576020810151907f980b903efea70e6b1bd235b1fb05f1a5da73cbd478b73c9538053f9eb29f129f602060606040840151930151938560018060a01b03196003541617600355604051906000967f50146d0e3c60aa1d17a70635b05494f864e86144a2201275021014fbf08bafe28880a2806005558152a1808355816001558260065582600755826008557f901232fc92ac16700a7d4b60706cbd27dec177bc85c9c2dbd2e2871d63b22a236040519380a3610cf6908161012c8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004908136101561001657600080fd5b600092833560e01c9081630c9cbf0e14610a645750806313af4035146109db5780631e891c0a1461096c57806342af83fb146108695780634b387053146107e05780634fdfb086146107a357806353739410146106fe578063750588cf146106ce5780638da5cb5b146106a5578063c623674f14610686578063d33219b414610667578063d61825ef14610551578063ebf0c71714610534578063ed075ec51461048a5763fabed412146100c957600080fd5b34610486576080366003190112610486576100e2610aaa565b6100ea610ac5565b6044359360643567ffffffffffffffff968782116103e257366023830112156103e25781830135978089116103e55760249260059036858c841b83010111610482579088979161016b9b8554918a519461014386610af1565b600f865260209e8f966e1c9bdbdd081a5cc81b9bdd081cd95d608a1b88820152851515610bc1565b8d8c51908782019260018060a01b038091169d8e855216809e83015260608201526060815261019981610b23565b5190208c518681019182528681526101b081610af1565b5190209387955b83871061042d575050505061020292508951916101d383610af1565b601883527f696e76616c69642070726f6f66206f72206578706972656400000000000000008d84015214610bc1565b84825260028952868220868352895261024887832054891188519061022682610af1565b6011825270636c61696d61626c6520746f6f206c6f7760781b8c830152610bc1565b8482526002895286822086835289528682205488039780891161041b5790899186845260028352888420888552835288842055828089518481019063a9059cbb60e01b825289888201528c6044820152604481526102a581610b23565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648c51966102d288610af1565b8088528701525190828b5af13d1561040d573d8281116103fb57895192601f8201601f19908116603f01168401908111848210176103e9578a5282526103219291903d858d84013e5b88610c14565b8051918215918a83156103be575b5050509050156103695750507ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd3992683858451868152a351908152f35b845162461bcd60e51b8152918201879052602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b9193818094500103126103e5578801519081151582036103e257508038808a61032f565b80fd5b5080fd5b634e487b7160e01b8652604188528686fd5b634e487b7160e01b8552604187528585fd5b61032192915060609061031b565b5050634e487b7160e01b815260118352fd5b89878394959697931b8501013591828110600014610476578952528b87205b9460001981146104645760010194939291908e6101b7565b634e487b7160e01b885260118a528888fd5b918952528b872061044c565b8380fd5b8280fd5b8382346103e557816003193601126103e5576008546104f3916104b66104ae610be9565b831515610bc1565b51906104c182610af1565b601782527f74696d656c6f636b206973206e6f7420657870697265640000000000000000006020830152421015610bc1565b60065460075490808355816001558260065582600755826008557f901232fc92ac16700a7d4b60706cbd27dec177bc85c9c2dbd2e2871d63b22a238380a380f35b8382346103e557816003193601126103e557602091549051908152f35b5090346104865761056136610adb565b9290913385528060205260ff82862054168015610653575b61058b90610585610b3f565b90610bc1565b6006548314801590610647575b82516105c8916105a782610af1565b600f82526e616c72656164792070656e64696e6760881b6020830152610bc1565b600554420191824211610634575167ffffffffffffffff6060820191821091111761062157508160065582600755600855337f922a2513428e5d51dd666942f04a14788d1db1ab35373059a8a29f025d6342cb8480a480f35b634e487b7160e01b855260419052602484fd5b634e487b7160e01b865260118252602486fd5b50600754841415610598565b506003546001600160a01b03163314610579565b8382346103e557816003193601126103e5576020906005549051908152f35b8382346103e557816003193601126103e5576020906001549051908152f35b8382346103e557816003193601126103e55760035490516001600160a01b039091168152602090f35b8382346103e557816003193601126103e55760609060065490600754906008549181519384526020840152820152f35b5034610486578060031936011261048657610717610aaa565b60243580151580910361079f577fefa819ca5209d17f1dfd20e7c0c2100700ae10239d28140f00fa620742b2d8429260209260018060a01b039061076382600354163314610585610cb0565b16948587528084526107828360ff848a20541615151415610585610c89565b858752835280862060ff1981541660ff841617905551908152a280f35b8480fd5b5090346104865760203660031901126104865760209260ff918391906001600160a01b036107cf610aaa565b168252855220541690519015158152f35b503461048657826003193601126104865760ff91338452602052822054168015610855575b61081190610585610b3f565b6108216008541515610585610be9565b806006558060075580600855337ffc5bc87b2339664e063f6f7cd154075756d9c3b2c38ca2b950fef2f8b3f6dc408280a280f35b506003546001600160a01b03163314610805565b509034610486576108fd61087c36610adb565b93909233865260205260ff81862054168015610958575b61089f90610585610b3f565b8454831480159061094c575b6108b790610585610c89565b60055415908115610937575b51906108ce82610af1565b601f82527f756e617574686f72697a656420746f206368616e67652074686520726f6f74006020830152610bc1565b808355816001558260065582600755826008557f901232fc92ac16700a7d4b60706cbd27dec177bc85c9c2dbd2e2871d63b22a238380a380f35b6003546001600160a01b0316331491506108c3565b506001548414156108ab565b506003546001600160a01b03163314610893565b509034610486576020366003190112610486577f980b903efea70e6b1bd235b1fb05f1a5da73cbd478b73c9538053f9eb29f129f9160209135906109be60018060a01b03600354163314610585610cb0565b6109cf600554831415610585610c89565b8160055551908152a180f35b83346103e25760203660031901126103e257610a2f6109f8610aaa565b6003546001600160a01b0380821692610a1a610a12610cb0565b853314610bc1565b16928392610a26610c89565b90841415610bc1565b6001600160a01b031916176003557f50146d0e3c60aa1d17a70635b05494f864e86144a2201275021014fbf08bafe28280a280f35b92505034610486578060031936011261048657602092610a82610aaa565b610a8a610ac5565b6001600160a01b0391821683526002865283832091168252845220548152f35b600435906001600160a01b0382168203610ac057565b600080fd5b602435906001600160a01b0382168203610ac057565b6040906003190112610ac0576004359060243590565b6040810190811067ffffffffffffffff821117610b0d57604052565b634e487b7160e01b600052604160045260246000fd5b6080810190811067ffffffffffffffff821117610b0d57604052565b60405190610b4c82610af1565b601f82527f63616c6c657220686173206e6f7420746865207570646174657220726f6c65006020830152565b6020808252825181830181905290939260005b828110610bad57505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501610b8b565b15610bc95750565b60405162461bcd60e51b8152908190610be59060048301610b78565b0390fd5b60405190610bf682610af1565b600f82526e1b9bc81c195b991a5b99c81c9bdbdd608a1b6020830152565b91929015610c765750815115610c28575090565b3b15610c315790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610bc95750805190602001fd5b60405190610c9682610af1565b600b82526a185b1c9958591e481cd95d60aa1b6020830152565b60405190610cbd82610af1565b601782527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000602083015256fea164736f6c6343000813000aa164736f6c6343000813000a"; bytes constant BUNDLER3_INIT_CODE = hex"6080806040523460155761060b908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f5f3560e01c8063374f435d146101ae5780635c39fcc11461015e578063803a7fba146100845763e69fe13414610046575f80fd5b3461008157807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008157602060015c604051908152f35b80fd5b3461015a5761009236610254565b60015c3660041161015a5761011b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36016100cc81610334565b6100d960405191826102c6565b8181526020810191600483375f601c36830101525190207fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1661036e565b6020815191012003610132576101309161041e565b005b7f1a60d856000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f80fd5b3461015a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015a57602073ffffffffffffffffffffffffffffffffffffffff5f5c16604051908152f35b6101b736610254565b73ffffffffffffffffffffffffffffffffffffffff5f5c1661022c5761020491337fffffffffffffffffffffffff00000000000000000000000000000000000000005f5c16175f5d61041e565b7fffffffffffffffffffffffff00000000000000000000000000000000000000005f5c165f5d005b7f36d80ace000000000000000000000000000000000000000000000000000000005f5260045ffd5b9060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261015a5760043567ffffffffffffffff811161015a578260238201121561015a5780600401359267ffffffffffffffff841161015a5760248460051b8301011161015a576024019190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761030757604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff811161030757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b91907fffffffffffffffffffffffffffffffffffffffff000000000000000000000000604051931660208401526034830152603482526103af6054836102c6565b565b91908110156103f15760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618136030182121561015a570190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81156105d6575f5b82811061043257505050565b61043d8184846103b1565b3573ffffffffffffffffffffffffffffffffffffffff8116810361015a5760806104688386866103b1565b01358061059857505f60015d5b60406104828386866103b1565b0135906104908386866103b1565b6020810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015a57019081359167ffffffffffffffff831161015a5760200191803603831361015a575f938493826040519384928337810185815203925af13d15610590573d9061050a82610334565b9161051860405193846102c6565b82523d5f602084013e5b606061052f8487876103b1565b01359081159182150361015a5781610587575b5061057f575060015c61055757600101610426565b7fe2eea516000000000000000000000000000000000000000000000000000000005f5260045ffd5b805190602001fd5b9050155f610542565b606090610522565b6105c7907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008360601b1661036e565b6020815191012060015d610475565b7f558c44fc000000000000000000000000000000000000000000000000000000005f5260045ffdfea164736f6c634300081c000a"; bytes constant GENERAL_ADAPTER_1_INIT_CODE = hex"60e0346101b257601f6137e538819003918201601f19168301916001600160401b038311848410176101b6578084926060946040528339810103126101b257610047816101ca565b906100606040610059602084016101ca565b92016101ca565b916001600160a01b038116156101a3576080526001600160a01b03169081156101a3576001600160a01b03169081156101a35760a05260c05260405161360690816101df823960805181818161017f015281816103290152818161052901528181610798015281816109c301528181610c4201528181610e50015281816111270152818161117501528181611456015281816116b40152818161197b01528181611a1101528181611cae0152818161203201528181612214015281816123ec0152818161255c015281816128ef0152612fe4015260a05181818161038701528181610847015281816112200152818161138f01528181611abf01528181611d8501528181611e2001528181611fe4015281816125c7015281816127570152612855015260c0518181816104dd01528181610cae01528181610dae01526124570152f35b63d92e233d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101b25756fe6080604052600436101561001a575b3615610018575f80fd5b005b5f5f3560e01c806305b4591c14610e225780631af3bbc6146125025780632075be0314610e2257806331f5707214610e225780633244c12c146123995780633790767d146121ed57806339029ab6146120085780633acb562414611f995780634d5fcf6814611c815780635b866db6146119e457806362577ad01461194f5780636ef5eeae1461168b578063827fcfcc1461142c57806384d287ef1461114b578063a317e4b5146110dc578063a7f6e60614610e27578063b1022fdf14610e22578063b172af6d14610bf0578063c95657061461099a578063ca4636731461071b578063d96ca0b914610501578063d999984d14610492578063e2975912146102b55763f2522bcd1461012d575061000e565b346102b25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b25761016461296e565b6024359073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361028a5773ffffffffffffffffffffffffffffffffffffffff16908082156102625730831461023a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810361020d575050475b806101fe578280f35b61020791613486565b5f808280f35b6101f5575b6004837f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004847fde8b5909000000000000000000000000000000000000000000000000000000008152fd5b6004847fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b6004837f08094908000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346102b25760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b2576102ed61296e565b60243560443567ffffffffffffffff811161048e576103109036906004016127c1565b909273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361046657821561043e579073ffffffffffffffffffffffffffffffffffffffff859392169173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906103b28285613192565b813b1561043a57848094610407604051988996879586947fe0232b4200000000000000000000000000000000000000000000000000000000865260048601526024850152606060448501526064840191612ed1565b03925af1801561042d576104185780f35b61042191612c68565b805f126102b2575f8180f35b50604051903d90823e3d90fd5b8480fd5b6004857f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004857f08094908000000000000000000000000000000000000000000000000000000008152fd5b8380fd5b50346102b257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102b257610510366129b2565b919073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036106f35773ffffffffffffffffffffffffffffffffffffffff83911680156106cb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610596612fa1565b9414610612575b811561043e579173ffffffffffffffffffffffffffffffffffffffff9161060f949383604051957f23b872dd0000000000000000000000000000000000000000000000000000000060208801521660248601526044850152606484015260648352610609608484612c68565b16613572565b80f35b90506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260208160248173ffffffffffffffffffffffffffffffffffffffff87165afa9081156106c057859161068a575b509061059d565b90506020813d6020116106b8575b816106a560209383612c68565b810103126106b457515f610683565b5f80fd5b3d9150610698565b6040513d87823e3d90fd5b6004857fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b6004847f08094908000000000000000000000000000000000000000000000000000000008152fd5b50346102b2577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360161010081126109965760a0136102b25760a43561075f612928565b60e43567ffffffffffffffff811161048e5761077f9036906004016127c1565b909273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610466579173ffffffffffffffffffffffffffffffffffffffff168230821461096e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146108d1575b821561043e579084929173ffffffffffffffffffffffffffffffffffffffff61082b612e77565b169061086e73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168093613192565b813b1561043a57848094610407604051988996879586947f238d65790000000000000000000000000000000000000000000000000000000086526108b460048701612d0b565b60a486015260c485015261010060e4850152610104840191612ed1565b91506024602073ffffffffffffffffffffffffffffffffffffffff6108f4612e77565b16604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156106c057859161093c575b5091610804565b90506020813d602011610966575b8161095760209383612c68565b810103126106b457515f610935565b3d915061094a565b6004867fde8b5909000000000000000000000000000000000000000000000000000000008152fd5b5080fd5b50346102b2576109a936612b88565b91939073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610bc85773ffffffffffffffffffffffffffffffffffffffff811615610ba05773ffffffffffffffffffffffffffffffffffffffff8316308114908115610b79575b5015610b51578315610b29576040517fb460af940000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff91821660248201529281166044840152919291602091849160649183918991165af1918215610b1e578492610ae8575b5090610ab3610ab892613311565b61336a565b10610ac05780f35b807f8199f5f30000000000000000000000000000000000000000000000000000000060049252fd5b91506020823d602011610b16575b81610b0360209383612c68565b810103126106b457905190610ab3610aa5565b3d9150610af6565b6040513d86823e3d90fd5b6004867f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004867fd459cda8000000000000000000000000000000000000000000000000000000008152fd5b905073ffffffffffffffffffffffffffffffffffffffff610b98612fa1565b16145f610a27565b6004867fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b6004867f08094908000000000000000000000000000000000000000000000000000000008152fd5b50346102b25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b257600435610c2b61294b565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361028a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214610d62575b8115610212578273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b15610996578180916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528960048401525af18015610d5757610d3b575b505073ffffffffffffffffffffffffffffffffffffffff16903082036101fe578280f35b90610d4591612c68565b825f12610d5357825f610d17565b8280fd5b6040513d84823e3d90fd5b90506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526020816024818673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1908115610e17578391610de5575b5090610c90565b90506020813d602011610e0f575b81610e0060209383612c68565b810103126106b457515f610dde565b3d9150610df3565b6040513d85823e3d90fd5b6127ef565b50346102b257610e3636612b88565b91939073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610bc8578373ffffffffffffffffffffffffffffffffffffffff8216156110b45773ffffffffffffffffffffffffffffffffffffffff841690308214801561108e575b15611066577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610fc5575b508315610f9d576040517fba0876520000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff91821660248201529281166044840152919291602091849160649183918991165af1918215610b1e578492610f67575b50610ab3610ab892613311565b91506020823d602011610f95575b81610f8260209383612c68565b810103126106b457905190610ab3610f5a565b3d9150610f75565b6004867f9811e0c7000000000000000000000000000000000000000000000000000000008152fd5b909350604051907f70a08231000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff86165afa90811561105b578691611029575b50925f610ee1565b90506020813d602011611053575b8161104460209383612c68565b810103126106b457515f611021565b3d9150611037565b6040513d88823e3d90fd5b6004887fd459cda8000000000000000000000000000000000000000000000000000000008152fd5b5073ffffffffffffffffffffffffffffffffffffffff6110ac612fa1565b168214610eb5565b6004877fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346102b257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102b25761115a36612b23565b73ffffffffffffffffffffffffffffffffffffffff949391947f0000000000000000000000000000000000000000000000000000000000000000163303610bc8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8314611293575b92611206604093946111d3612fa1565b855196879586957f5c2bea4900000000000000000000000000000000000000000000000000000000875260048701612f5a565b03818673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af18015610e1757610ab8918490859261125f575b50610ab390613311565b610ab39250611286915060403d60401161128c575b61127e8183612c68565b810190612ebb565b91611255565b503d611274565b91506113765f61134360a06112a83688612ca9565b2061130f61133b6112b7612fa1565b926040516020810191825260026040820152604081526112d8606082612c68565b5190206040519283916020830195866020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612c68565b51902061354b565b604051809381927f7784c685000000000000000000000000000000000000000000000000000000008352600483016130b6565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015611421576113c8915f916113ff575b506130ef565b519283156113d75792916111c3565b7f1f2a2005000000000000000000000000000000000000000000000000000000005f5260045ffd5b61141b91503d805f833e6114138183612c68565b810190613030565b5f6113c2565b6040513d5f823e3d90fd5b50346102b25761143b366129b2565b9073ffffffffffffffffffffffffffffffffffffffff9392937f000000000000000000000000000000000000000000000000000000000000000016330361028a5773ffffffffffffffffffffffffffffffffffffffff829116938415610262577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6114c4612fa1565b93146115e1575b81156115b95773ffffffffffffffffffffffffffffffffffffffff82116115915783946e22d473030f116ddee9f6b43ac78ba33b1561043a5773ffffffffffffffffffffffffffffffffffffffff92839182604051967f36c7851600000000000000000000000000000000000000000000000000000000885216600487015260248601521660448401521660648201528181608481836e22d473030f116ddee9f6b43ac78ba35af18015610d57576115805750f35b8161158a91612c68565b6102b25780f35b6004847fc4bd89a9000000000000000000000000000000000000000000000000000000008152fd5b6004847f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b90506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260208160248173ffffffffffffffffffffffffffffffffffffffff86165afa908115610b1e578491611659575b50906114cb565b90506020813d602011611683575b8161167460209383612c68565b810103126106b457515f611652565b3d9150611667565b50346102b25761169a36612a24565b90929173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361046657809173ffffffffffffffffffffffffffffffffffffffff811615610ba05773ffffffffffffffffffffffffffffffffffffffff8416906040517f38d52e0f000000000000000000000000000000000000000000000000000000008152602081600481865afa908115611944577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9173ffffffffffffffffffffffffffffffffffffffff918a91611915575b5016931461188c575b83156118645761180183926020926117a8888b9897613192565b6040519687809481937f6e553f65000000000000000000000000000000000000000000000000000000008352896004840190929173ffffffffffffffffffffffffffffffffffffffff6020916040840195845216910152565b03925af192831561105b57869361182e575b5061182693611821916132b1565b6133a1565b11610ac05780f35b9092506020813d60201161185c575b8161184a60209383612c68565b810103126106b4575191611826611813565b3d915061183d565b6004877f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b92506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481865afa90811561190a5787916118d8575b509261178e565b90506020813d602011611902575b816118f360209383612c68565b810103126106b457515f6118d1565b3d91506118e6565b6040513d89823e3d90fd5b611937915060203d60201161193d575b61192f8183612c68565b810190612e4b565b5f611785565b503d611925565b6040513d8a823e3d90fd5b50346102b25761195e36612b23565b73ffffffffffffffffffffffffffffffffffffffff9491949392937f0000000000000000000000000000000000000000000000000000000000000000163303610bc85790611206604093926119b1612fa1565b855196879586957f50d8cd4b00000000000000000000000000000000000000000000000000000000875260048701612f5a565b50346102b2576119f336612a9a565b93929573ffffffffffffffffffffffffffffffffffffffff959192957f0000000000000000000000000000000000000000000000000000000000000000163303611c5957813073ffffffffffffffffffffffffffffffffffffffff881614611c3157907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff899214611b5a575b611b1b60409673ffffffffffffffffffffffffffffffffffffffff611aa384612e9a565b1695611ae673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168098613192565b8851998a98899788967fa99aad8900000000000000000000000000000000000000000000000000000000885260048801612f0f565b03925af18015610e17576118269184908592611b38575b506133a1565b9050611b53915060403d60401161128c5761127e8183612c68565b905f611b32565b9150506024919293602073ffffffffffffffffffffffffffffffffffffffff611b8284612e9a565b16604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa928315611944578893611bfd575b508215611bd557939291908790611a7f565b6004887f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b9092506020813d602011611c29575b81611c1960209383612c68565b810103126106b45751915f611bc3565b3d9150611c0c565b6004897fde8b5909000000000000000000000000000000000000000000000000000000008152fd5b6004887f08094908000000000000000000000000000000000000000000000000000000008152fd5b50346102b257611c9036612a9a565b93929573ffffffffffffffffffffffffffffffffffffffff959192957f0000000000000000000000000000000000000000000000000000000000000000163303611c595783823073ffffffffffffffffffffffffffffffffffffffff891614611f7157907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a939214611e93575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14611de1575b611b1b60409673ffffffffffffffffffffffffffffffffffffffff611d6984612e9a565b1695611dac73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168098613192565b8851998a98899788967f20b76e8100000000000000000000000000000000000000000000000000000000885260048801612f0f565b91929350611e0790611343611e028860a0611dfc3688612ca9565b20613513565b61354b565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611944576fffffffffffffffffffffffffffffffff91611e6b918a91611e7f57506130ef565b5116938415611bd557939291908790611d45565b61141b91503d808c833e6114138183612c68565b90915060249250602073ffffffffffffffffffffffffffffffffffffffff611eba84612e9a565b16604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa928315611f66578993611f32575b508215611f0a57908891611d1e565b6004897f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b9092506020813d602011611f5e575b81611f4e60209383612c68565b810103126106b45751915f611efb565b3d9150611f41565b6040513d8b823e3d90fd5b60048a7fde8b5909000000000000000000000000000000000000000000000000000000008152fd5b50346102b257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102b25761201736612a24565b73ffffffffffffffffffffffffffffffffffffffff939291937f00000000000000000000000000000000000000000000000000000000000000001633036104665773ffffffffffffffffffffffffffffffffffffffff8116156106cb5781156121c557849073ffffffffffffffffffffffffffffffffffffffff8416604051907f38d52e0f000000000000000000000000000000000000000000000000000000008252602082600481845afa908115610b1e5773ffffffffffffffffffffffffffffffffffffffff6121539260209487916121a8575b5016936120fa8886613192565b6040519586809481937f94bf804d0000000000000000000000000000000000000000000000000000000083528a6004840190929173ffffffffffffffffffffffffffffffffffffffff6020916040840195845216910152565b03925af191821561105b578692612172575061182693611821916132b1565b9091506020813d6020116121a0575b8161218e60209383612c68565b810103126106b4575190611826611813565b3d9150612181565b6121bf9150853d871161193d5761192f8183612c68565b5f6120ed565b6004857f9811e0c7000000000000000000000000000000000000000000000000000000008152fd5b50346102b2576121fc366129b2565b9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036106f3578173ffffffffffffffffffffffffffffffffffffffff82168015610ba0573014612371577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8103612345575090506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260208160248173ffffffffffffffffffffffffffffffffffffffff87165afa908115610b1e578491612313575b50905b816122ed578380f35b73ffffffffffffffffffffffffffffffffffffffff61230c9316613129565b5f80808380f35b90506020813d60201161233d575b8161232e60209383612c68565b810103126106b457515f6122e1565b3d9150612321565b6122e4576004847f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004857fde8b5909000000000000000000000000000000000000000000000000000000008152fd5b50346102b25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b2576004356123d461294b565b9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361028a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124fb575b80156102125773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691823b1561048e57836040517fd0e30db0000000000000000000000000000000000000000000000000000000008152818160048187895af18015610d57576124e6575b50503073ffffffffffffffffffffffffffffffffffffffff8216036124dd578380f35b61230c92613129565b816124f091612c68565b61048e57835f6124ba565b504761243a565b50346106b4577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360160e081126106b45760a0136106b45760a435612545612928565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303612799577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214612679575b81156113d75773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166125ef612fa1565b90803b156106b45773ffffffffffffffffffffffffffffffffffffffff935f6101049286829660405198899788967f8720316d00000000000000000000000000000000000000000000000000000000885261264c60048901612d0b565b60a48801521660c48601521660e48401525af180156114215761266d575080f35b61001891505f90612c68565b905060405161268781612c1f565b60043573ffffffffffffffffffffffffffffffffffffffff811681036106b457815260243573ffffffffffffffffffffffffffffffffffffffff811681036106b457602082015260443573ffffffffffffffffffffffffffffffffffffffff811681036106b45760408201526064359073ffffffffffffffffffffffffffffffffffffffff821682036106b457611343611e0260a08361273e9560605f960152608435608082015220612738612fa1565b90613513565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156114215761278f915f916113ff57506130ef565b5160801c906125aa565b7f08094908000000000000000000000000000000000000000000000000000000005f5260045ffd5b9181601f840112156106b45782359167ffffffffffffffff83116106b457602083818601950101116106b457565b346106b45760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b45760243567ffffffffffffffff81116106b45761283e9036906004016127c1565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303612799575f9182916128ea602460405183819460208301967f803a7fba000000000000000000000000000000000000000000000000000000008852848401378101868382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612c68565b5190827f00000000000000000000000000000000000000000000000000000000000000005af1612918613429565b901561292057005b805190602001fd5b60c4359073ffffffffffffffffffffffffffffffffffffffff821682036106b457565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036106b457565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036106b457565b359073ffffffffffffffffffffffffffffffffffffffff821682036106b457565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126106b45760043573ffffffffffffffffffffffffffffffffffffffff811681036106b4579060243573ffffffffffffffffffffffffffffffffffffffff811681036106b4579060443590565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60809101126106b45760043573ffffffffffffffffffffffffffffffffffffffff811681036106b45790602435906044359060643573ffffffffffffffffffffffffffffffffffffffff811681036106b45790565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820161014081126106b45760a0136106b45760049160a4359160c4359160e435916101043573ffffffffffffffffffffffffffffffffffffffff811681036106b45791610124359067ffffffffffffffff82116106b457612b1f916004016127c1565b9091565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0161012081126106b45760a0136106b45760049060a4359060c4359060e435906101043573ffffffffffffffffffffffffffffffffffffffff811681036106b45790565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60a09101126106b45760043573ffffffffffffffffffffffffffffffffffffffff811681036106b45790602435906044359060643573ffffffffffffffffffffffffffffffffffffffff811681036106b4579060843573ffffffffffffffffffffffffffffffffffffffff811681036106b45790565b60a0810190811067ffffffffffffffff821117612c3b57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612c3b57604052565b91908260a09103126106b457604051612cc181612c1f565b6080808294612ccf81612991565b8452612cdd60208201612991565b6020850152612cee60408201612991565b6040850152612cff60608201612991565b60608501520135910152565b60043573ffffffffffffffffffffffffffffffffffffffff81168091036106b457815260243573ffffffffffffffffffffffffffffffffffffffff81168091036106b457602082015260443573ffffffffffffffffffffffffffffffffffffffff81168091036106b457604082015260643573ffffffffffffffffffffffffffffffffffffffff81168091036106b45760608201526080608435910152565b6080809173ffffffffffffffffffffffffffffffffffffffff612dcc82612991565b16845273ffffffffffffffffffffffffffffffffffffffff612df060208301612991565b16602085015273ffffffffffffffffffffffffffffffffffffffff612e1760408301612991565b16604085015273ffffffffffffffffffffffffffffffffffffffff612e3e60608301612991565b1660608501520135910152565b908160209103126106b4575173ffffffffffffffffffffffffffffffffffffffff811681036106b45790565b60243573ffffffffffffffffffffffffffffffffffffffff811681036106b45790565b3573ffffffffffffffffffffffffffffffffffffffff811681036106b45790565b91908260409103126106b4576020825192015190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093818652868601375f8582860101520116010190565b919361012093612f579795612f398573ffffffffffffffffffffffffffffffffffffffff95612daa565b60a085015260c08401521660e0820152816101008201520191612ed1565b90565b9373ffffffffffffffffffffffffffffffffffffffff929061010094849298979398612f8b8861012081019b612daa565b60a088015260c08701521660e085015216910152565b6040517f5c39fcc100000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611421575f91613017575090565b612f57915060203d60201161193d5761192f8183612c68565b6020818303126106b45780519067ffffffffffffffff82116106b457019080601f830112156106b45781519167ffffffffffffffff8311612c3b578260051b9060208201936130826040519586612c68565b84526020808501928201019283116106b457602001905b8282106130a65750505090565b8151815260209182019101613099565b60206040818301928281528451809452019201905f5b8181106130d95750505090565b82518452602093840193909201916001016130cc565b8051156130fc5760200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9290921660248301526044808301939093529181526131909161318b606483612c68565b613572565b565b6040519060205f73ffffffffffffffffffffffffffffffffffffffff828501957f095ea7b300000000000000000000000000000000000000000000000000000000875216948560248601527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604486015260448552613212606486612c68565b84519082855af15f513d8261327f575b50501561322e57505050565b61318b61319093604051907f095ea7b300000000000000000000000000000000000000000000000000000000602083015260248201525f604482015260448152613279606482612c68565b82613572565b9091506132a9575073ffffffffffffffffffffffffffffffffffffffff81163b15155b5f80613222565b6001146132a2565b6040519060205f73ffffffffffffffffffffffffffffffffffffffff828501957f095ea7b3000000000000000000000000000000000000000000000000000000008752169485602486015281604486015260448552613212606486612c68565b906b033b2e3c9fd0803ce80000008202918083046b033b2e3c9fd0803ce8000000149015171561333d57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8115613374570490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b906b033b2e3c9fd0803ce80000008202918083046b033b2e3c9fd0803ce8000000149015171561333d57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81011161333d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183010180921161333d57612f579161336a565b3d15613481573d9067ffffffffffffffff8211612c3b576040519161347660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184612c68565b82523d5f602084013e565b606090565b8147106134e3575f80809373ffffffffffffffffffffffffffffffffffffffff8294165af16134b3613429565b50156134bb57565b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b50477fcf479181000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61353a61130f916040516020810191825260026040820152604081526112d8606082612c68565b5190206001810180911161333d5790565b6040519061355a604083612c68565b600182526020368184013761356e826130ef565b5290565b905f602091828151910182855af115611421575f513d6135f0575073ffffffffffffffffffffffffffffffffffffffff81163b155b6135ae5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b600114156135a756fea164736f6c634300081c000a"; bytes constant PARASWAP_ADAPTER_INIT_CODE = hex"60e03461010257601f61216b38819003918201601f19168301916001600160401b0383118484101761010657808492606094604052833981010312610102576100478161011a565b9061006060406100596020840161011a565b920161011a565b916001600160a01b038116156100f3576080526001600160a01b03169081156100f3576001600160a01b03169081156100f35760c05260a05260405161203c908161012f823960805181818160c7015281816106b201528181610f90015281816110930152611702015260a05181818161073601528181611118015261166b015260c0518181816104bc01526115fd0152f35b63d92e233d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101025756fe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80633790767d1461168f5780633a829867146116215780633acb5624146115b357806360776d6e146114e1578063678215ac14610fb4578063a317e4b514610f46578063db8a5d09146102655763f2522bcd0361000e57346102615760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610261576100ad611840565b60243573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610239579073ffffffffffffffffffffffffffffffffffffffff16818115610211573082146101e9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81036101bc57504791505b8161014557005b81471061018c575f80809381935af161015c611ad0565b501561016457005b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b50477fcf479181000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61013e575b7f1f2a2005000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fde8b5909000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fd92e233d000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f08094908000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f80fd5b34610261576101a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102615761029d611840565b60243567ffffffffffffffff8111610261576102bd903690600401611948565b6102c5611863565b60a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c3601126102615760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefc36011261026157610164359173ffffffffffffffffffffffffffffffffffffffff831680930361026157610184359173ffffffffffffffffffffffffffffffffffffffff8316918284036102615760405160a0810181811067ffffffffffffffff821117610e5b57604052610385611886565b815260843573ffffffffffffffffffffffffffffffffffffffff81168103610261576020820190815260a4359073ffffffffffffffffffffffffffffffffffffffff82168203610261576040830191825260c43573ffffffffffffffffffffffffffffffffffffffff811681036102615760608401908152608084019860e4358a5260a0852060405160208101918252600260408201526040815261042b6060826118cd565b519020604051906020820192835260408201526040815261044d6060826118cd565b5190209360018501809511610abc576040998a519561046c8c886118cd565b6001875260208701907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08d013683376104a488611df2565b5273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016968c519182917f7784c685000000000000000000000000000000000000000000000000000000008352602483019060206004850152518091526044830191905f5b818110610f2d5750505090805f9203818a5afa908115610d6b575f91610e90575b506105596fffffffffffffffffffffffffffffffff91611df2565b51169460c08c602460a086209151809a81937f5c60e39a00000000000000000000000000000000000000000000000000000000835260048301525afa968715610d6b57908c92915f98610db3575b5060808801946105ca6fffffffffffffffffffffffffffffffff87511642611a61565b9687151580610d95575b80610d75575b610ae9575b505050506fffffffffffffffffffffffffffffffff93506060925083915085015116930151169160018101809111610abc57620f4240830191828411610abc57620f423f9161062d91611f41565b920191818311610abc576106499261064491611bbf565b611e7b565b9586156101c1576064359673ffffffffffffffffffffffffffffffffffffffff88168098036102615761067f90610104846119f6565b61068c6101243583611a6e565b9161069a6101043582611a6e565b9373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102395787517ffb04e17b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115610a4f575f91610a81575b5015610a595785156102115784156101c15773ffffffffffffffffffffffffffffffffffffffff168751927f70a08231000000000000000000000000000000000000000000000000000000008452306004850152602084602481855afa928315610a4f575f93610a1a575b89517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015294506020856024818e5afa948515610a10575f956109dc575b505f80916108238486611c73565b60208151910182855af1610835611ad0565b90156109d457508161084c60209260249594611d92565b8951938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9182156109ca575f92610996575b5087517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526020816024818d5afa98891561098d57505f98610951575b506108e492916108de91611a61565b96611a61565b94116109295783106109015730036108f857005b6100189261198e565b7fb4057249000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f63d5d62e000000000000000000000000000000000000000000000000000000005f5260045ffd5b9097506020929192813d602011610985575b81610970602093836118cd565b810103126102615751969091906108e46108cf565b3d9150610963565b513d5f823e3d90fd5b9091506020813d6020116109c2575b816109b2602093836118cd565b810103126102615751908961088b565b3d91506109a5565b88513d5f823e3d90fd5b805190602001fd5b9094506020813d602011610a08575b816109f8602093836118cd565b810103126102615751935f610815565b3d91506109eb565b8a513d5f823e3d90fd5b92506020843d602011610a47575b81610a35602093836118cd565b810103126102615760249351926107d1565b3d9150610a28565b89513d5f823e3d90fd5b7f60ff36f8000000000000000000000000000000000000000000000000000000005f5260045ffd5b90506020813d602011610ab4575b81610a9c602093836118cd565b8101031261026157518015158103610261578a610766565b3d9150610a8f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff9283809281808651169851997f8c00bf6b000000000000000000000000000000000000000000000000000000008b52511660048a01525116602488015251166044860152511660648401525160848301526fffffffffffffffffffffffffffffffff86511660a483015260208601936fffffffffffffffffffffffffffffffff85511660c48401526fffffffffffffffffffffffffffffffff8c8801948186511660e48601528160608a01511661010486015251166101248401526020836101648160a08b01956fffffffffffffffffffffffffffffffff8751166101448301525afa928315610d6b575f93610d35575b50610c5b6fffffffffffffffffffffffffffffffff93610c55610c1f670de0b6b3a7640000948789511693611f41565b610c50671bc16d674ec80000610c358380611f41565b046729a2241af62c0000610c498483611f41565b0492611bbf565b611bbf565b90611f41565b049282610c73610c6a86611f54565b82845116611e49565b16905281610c8c610c8385611f54565b82895116611e49565b16865251169081610ca2575b89818080806105df565b670de0b6b3a764000091610cb591611f41565b04610cd3816fffffffffffffffffffffffffffffffff865116611a61565b6fffffffffffffffffffffffffffffffff83511691620f42408301809311610abc5760018201809211610abc57610d25610d2a926106446fffffffffffffffffffffffffffffffff95610c6a94611f41565b611f54565b169052888080610c98565b92506020833d602011610d63575b81610d50602093836118cd565b8101031261026157915191610c5b610bef565b3d9150610d43565b8c513d5f823e3d90fd5b5073ffffffffffffffffffffffffffffffffffffffff82511615156105da565b506fffffffffffffffffffffffffffffffff858b01511615156105d4565b9250965060c0823d60c011610e88575b81610dd060c093836118cd565b81010312610261578b5160c081019281841067ffffffffffffffff851117610e5b5760a0610e4f918f958652610e0581611e2c565b8452610e1360208201611e2c565b6020850152610e23868201611e2c565b86850152610e3360608201611e2c565b6060850152610e4460808201611e2c565b608085015201611e2c565b60a0820152968e6105a7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b3d9150610dc3565b90503d805f833e610ea181836118cd565b8101906020818303126102615780519067ffffffffffffffff821161026157019080601f8301121561026157815167ffffffffffffffff8111610e5b578d5192600582901b91610ef460208401866118cd565b845260208085019282010192831161026157602001905b828210610f1d5750505061055961053e565b8151815260209182019101610f0b565b825184528594506020938401939092019160010161051d565b34610261575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610261576101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026157610fec611840565b60243567ffffffffffffffff81116102615761100c903690600401611948565b611014611863565b9061101d611886565b916084359182151583036102615760607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c3601126102615761105d6118a9565b926113e5575b61106f60a43582611a6e565b61107b60c43583611a6e565b9173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610239576040517ffb04e17b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156112f1575f916113aa575b5015610a595773ffffffffffffffffffffffffffffffffffffffff85169384156102115783156101c15773ffffffffffffffffffffffffffffffffffffffff16604051967f70a08231000000000000000000000000000000000000000000000000000000008852306004890152602088602481855afa9788156112f1575f98611362575b5073ffffffffffffffffffffffffffffffffffffffff1697604051927f70a082310000000000000000000000000000000000000000000000000000000084523060048501526020846024818d5afa9384156112f1575f9461132e575b505f80916112368486611c73565b60208151910182855af1611248611ad0565b90156109d457508161125e602092602494611d92565b604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156112f1575f916112fc575b50604051967f70a082310000000000000000000000000000000000000000000000000000000088523060048901526020886024818c5afa9788156112f1575f9861095157506108e492916108de91611a61565b6040513d5f823e3d90fd5b90506020813d602011611326575b81611317602093836118cd565b8101031261026157518861129e565b3d915061130a565b9093506020813d60201161135a575b8161134a602093836118cd565b810103126102615751925f611228565b3d915061133d565b9097506020813d6020116113a2575b8161137e602093836118cd565b8101031261026157519673ffffffffffffffffffffffffffffffffffffffff6111cc565b3d9150611371565b90506020813d6020116113dd575b816113c5602093836118cd565b81010312610261575180151581036102615788611148565b3d91506113b8565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260208160248173ffffffffffffffffffffffffffffffffffffffff87165afa9081156112f1575f916114af575b5060a435611457826114508386611a6e565b9285611b86565b61147a60c4356114736001848661146e858a611a6e565b611bcc565b9085611b86565b60e435908161148c575b505050611063565b60016114a0916114a79461146e8588611a6e565b9083611b86565b858080611484565b90506020813d6020116114d9575b816114ca602093836118cd565b8101031261026157518661143e565b3d91506114bd565b34610261576101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026157611519611840565b60243567ffffffffffffffff811161026157611539903690600401611948565b611541611863565b9061154a611886565b916084359160607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c360112610261576115816118a9565b92806115a1575b5061159560c43582611a6e565b61107b60a43583611a6e565b6115ad9060a4836119f6565b85611588565b34610261575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610261575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102615760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610261576116c6611840565b60243573ffffffffffffffffffffffffffffffffffffffff8116908181036102615760443573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361023957809280156102115730146101e9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8103611814575090506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260208160248173ffffffffffffffffffffffffffffffffffffffff87165afa9081156112f1575f916117e2575b50905b816117c357005b73ffffffffffffffffffffffffffffffffffffffff610018931661198e565b90506020813d60201161180c575b816117fd602093836118cd565b810103126102615751836117b9565b3d91506117f0565b6117bc577f1f2a2005000000000000000000000000000000000000000000000000000000005f5260045ffd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361026157565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361026157565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361026157565b610104359073ffffffffffffffffffffffffffffffffffffffff8216820361026157565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610e5b57604052565b67ffffffffffffffff8111610e5b57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f820112156102615780359061195f8261190e565b9261196d60405194856118cd565b8284526020838301011161026157815f926020809301838601378301015290565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff90921660248301526044808301939093529181526119f4916119ef6064836118cd565b611aff565b565b906040813591611a1185611a0a8587611a6e565b9486611b86565b611a306020820135611a295f868961146e858b611a6e565b9086611b86565b01359081611a3f575b50505050565b5f611a5291611a589561146e8587611a6e565b91611b86565b5f808080611a39565b91908203918211610abc57565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101908111610abc578211611aa857016020015190565b7f01da1572000000000000000000000000000000000000000000000000000000005f5260045ffd5b3d15611afa573d90611ae18261190e565b91611aef60405193846118cd565b82523d5f602084013e565b606090565b905f602091828151910182855af1156112f1575f513d611b7d575073ffffffffffffffffffffffffffffffffffffffff81163b155b611b3b5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b60011415611b34565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101908111610abc578211611aa8570160200152565b91908201809211610abc57565b9291611bd9818386611e85565b926004811015611c46576001809116149182611c02575b5050611bff9250151590611bbf565b90565b9080925015611c1957611bff930915155f80611bf0565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6040519060205f73ffffffffffffffffffffffffffffffffffffffff828501957f095ea7b300000000000000000000000000000000000000000000000000000000875216948560248601527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604486015260448552611cf36064866118cd565b84519082855af15f513d82611d60575b505015611d0f57505050565b6119ef6119f493604051907f095ea7b300000000000000000000000000000000000000000000000000000000602083015260248201525f604482015260448152611d5a6064826118cd565b82611aff565b909150611d8a575073ffffffffffffffffffffffffffffffffffffffff81163b15155b5f80611d03565b600114611d83565b6040519060205f73ffffffffffffffffffffffffffffffffffffffff828501957f095ea7b3000000000000000000000000000000000000000000000000000000008752169485602486015281604486015260448552611cf36064866118cd565b805115611dff5760200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b51906fffffffffffffffffffffffffffffffff8216820361026157565b906fffffffffffffffffffffffffffffffff809116911601906fffffffffffffffffffffffffffffffff8211610abc57565b8115611c19570490565b91818302917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81850993838086109503948086039514611f345784831115611f1c5790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b505090611bff9250611e7b565b81810292918115918404141715610abc57565b604051611f626040826118cd565b6014815260208101907f6d61782075696e7431323820657863656564656400000000000000000000000082526fffffffffffffffffffffffffffffffff8311611fbc5750506fffffffffffffffffffffffffffffffff1690565b6044907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040519485937f08c379a0000000000000000000000000000000000000000000000000000000008552602060048601525180918160248701528686015e5f85828601015201168101030190fdfea164736f6c634300081c000a";
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.0; address constant OWNER1 = 0xe0aeb6811d33Df42A09066857CDaFca16b506086; address constant OWNER2 = 0x84D3E4EE550DD5F99e76a548aC59a6BE1C8dCf79; address constant OWNER3 = 0xC100c251bdD297A66795112f04356E6BA5f89D80; address constant OWNER4 = 0x264c86DBbD2E4165FbBf0C35b0ddf0e00AEc6b31; address constant OWNER5 = 0x30E7c016fC702cDe9A50720a469d418490b7b652; address constant OWNER6 = 0x8f02b4a44Eacd9b8eE7739aa0BA58833DD45d002; address constant OWNER7 = 0xCF263cEe139763114fAaFC5F52865135412F50Ec; address constant OWNER8 = 0x69FcEFDe2B48503d675181448B3D4272128bca9c; address constant OWNER9 = 0x13cA8756E9470b71B8e998352c8741706217f963; uint256 constant THRESHOLD = 5; library ConfigLib { function owners() internal pure returns (address[] memory) { address[] memory res = new address[](9); res[0] = OWNER1; res[1] = OWNER2; res[2] = OWNER3; res[3] = OWNER4; res[4] = OWNER5; res[5] = OWNER6; res[6] = OWNER7; res[7] = OWNER8; res[8] = OWNER9; return res; } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.0; import {console} from "../../lib/forge-std/src/console.sol"; library UtilsLib { function deploy(bytes memory initCode, bytes memory constructorArgs, string memory name) internal returns (address addr) { bytes memory creationCode = bytes.concat(initCode, constructorArgs); assembly ("memory-safe") { addr := create2(0, add(creationCode, 0x20), mload(creationCode), 0) } require(addr != address(0), "deployment failed"); logBookEntry(name, addr); return addr; } function logBookEntry(string memory name, address addr) internal pure { console.log(string.concat('"', name, '": "'), addr, '",'); } }
{ "evmVersion": "cancun", "libraries": {}, "metadata": { "appendCBOR": true, "bytecodeHash": "none", "useLiteralContent": false }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "remappings": [ "solmate/=lib/bundler3/lib/permit2/lib/solmate/", "@openzeppelin/contracts/=lib/metamorpho-1.1/lib/openzeppelin-contracts/contracts/", "bundler3/=lib/bundler3/", "ds-test/=lib/metamorpho-1.1/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/metamorpho-1.1/lib/erc4626-tests/", "forge-gas-snapshot/=lib/bundler3/lib/permit2/lib/forge-gas-snapshot/src/", "forge-std/=lib/forge-std/src/", "halmos-cheatcodes/=lib/morpho-blue/lib/halmos-cheatcodes/src/", "metamorpho-1.1/=lib/metamorpho-1.1/", "metamorpho/=lib/public-allocator/lib/metamorpho/", "morpho-blue-irm/=lib/morpho-blue-irm/src/", "morpho-blue-oracles/=lib/morpho-blue-oracles/src/", "morpho-blue/=lib/morpho-blue/", "murky/=lib/universal-rewards-distributor/lib/murky/src/", "openzeppelin-contracts/=lib/metamorpho-1.1/lib/openzeppelin-contracts/", "openzeppelin/=lib/universal-rewards-distributor/lib/openzeppelin-contracts/contracts/", "permit2/=lib/bundler3/lib/permit2/", "pre-liquidation/=lib/pre-liquidation/src/", "public-allocator/=lib/public-allocator/src/", "safe-smart-account/=lib/safe-smart-account/", "universal-rewards-distributor/=lib/universal-rewards-distributor/" ], "viaIR": true }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"safeProxyFactory","type":"address"},{"internalType":"address","name":"safeSingleton","type":"address"},{"internalType":"address","name":"safeFallbackHandler","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"self","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
0x60a080604052346172ef575f906080816175d480380380916100218285617386565b8339810103126172ef57610034816173bd565b610040602083016173bd565b606061004e604085016173bd565b930151306080524603617341575f602061406c604051610070613ec082617386565b613e8e81527f60a034620001aa576001600160401b0390601f1990601f62003e8e3881900391838201527f820184168301929185841183851017620001395780839260409586528339602060408201527f92839181010312620001aa57516001600160a01b0381169390849003620001aa60608201527f5782518381018181108782111762000139578452600c81526b7a65726f20616460808201527f647265737360a01b8382015284156200014f5750508151908101917f47e7953460a08201527fa245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188352468160c08201527f830152306060830152606082526080820194828610908611176200013957849060e08201527f52519020608052600080546001600160a01b031916821781557f167d3e9c10166101008201527fab80e58802ca9da10ce5c6a0f4debc46a2e7a2cd9e56899a4fb59080a2613cde6101208201527f9081620001b0823960805181818161188a01526124b90152f35b634e487b71606101408201527fe01b600052604160045260246000fd5b82845192839162461bcd60e51b8352806101608201527f600484015283519081602485015260005b8281106200019257505060449350806101808201527f600085601f938601015201168101030190fd5b808601820151878201604401526101a08201527f869450810162000170565b600080fdfe608060405260043610156100125760006101c08201527f80fd5b6000803560e01c806313af403514612b90578063151c1ade14612b20576101e08201527f806320b76e81146128c1578063238d6579146126f75780632b4f013c1461256e6102008201527f5780632c3c9157146124dc5780633644e51514612483578063469048401461246102208201527f315780634d98a93b1461231557806350d8cd4b146120815780635a64f51e14616102408201527f1fa95780635c2bea4914611d485780635c60e39a14611cb757806365e4ad9e146102608201527f611c3757806370ae92d214611bd45780637784c68514611a685780638069218f6102808201527f1461167f5780638720316d1461150f5780638c1358a2146111f85780638da5cb6102a08201527f5b146111a757806393c520621461110e578063a99aad8914610eda578063b4856102c08201527ff3b814610e8d578063d8eabcb8146104e5578063e0232b4214610398578063e76102e08201527f4b981b146102cd578063eecea000146101bb5763f2b863ce146101515760008061030082015260016901fab668c20370aec04160b71b036103208201526ef27fbb67bf91ea27c027efe7f7db63603a1b19610340820152729efe5b9ed3a5a9a4e97ead9ffb7baddfabe99f1961036082015260017380a3202a2b02a5e6b701fab6a068c20370aec081605f1b036103808201526b03c9feed9efe47a89efe0c9e196103a08201527f2c5a565b602435801515908181036102c85761029790338552600660205273ff6103c08201526c9fbf79df6be96c7b9fffad9fdf196103e08201527f5261024f60ff604060002054161515841415610249612fdd565b90612f41565b6104008201527f3385526006602052604085208460005260205260406000209060ff7fffffffff61042082015264ff7cabe96e196104408201527f151516179055565b60405190815233907fd5e969f01efe921d3f766bdebad25f6104608201527f0a05e3f237311f56482bf132d0326309c060203392a480f35b600080fd5b5034610480820152600165c20370aec04160cf1b036104a08201819052720793fddb3dfc8f513df9273df9ef3da74b534960371b196104c0830152601d602a1b600160d01b03196104e0830152706e9efcaf7c79abe9cceb9efdb69ed0f7a9196105008301527f5b826001549116938493610361612fdd565b908316851415612f41565b1617606105208301527f01557f2e979f80fe4d43055c584cf4a8467c55875ea36728fc37176c05acd78461054083015260017101d6f4e705014501e6b6a068c20370aec0c160771b036105608301526e03c9feed9efe47a89efc2f9ed3a5a9196105808301526e7eee9efb1ea89efbf68c0000000001680b6c0486b04c0886ad60bb1b036105a0830152706ec96f9ffbfe9ed217a9a46e6f6b9efbe0196105c08301527f6104176132c2565b861515612f41565b1693846040518581527fc76f1b4fe4396105e08301527f6ac07a9fa55a415d4ca430e72651d37d3401f3bed7cb13fc4f1260203392a3616106008301527f045984338761394a565b333b156104d25761049b91839160405193849283927f6106208301526318fab83960e11b6106408301527f8452886004850161319c565b038183335af180156104d6576104be575b5050616106608301527f04bb9130903390613ab9565b80f35b6104c790612cc3565b6104d257823861046106808301527fac565b8280fd5b6040513d84823e3d90fd5b5080fd5b50346101b8576101207f6106a08301526003196106c083018190526001710d804498406e15d84147cd984b541596e41d60721b036106e0840152607e7013eb795d33eb795f93dfa6f513dfdf7953604b1b01196107008401527f116104e157610562903690600401612de8565b9160c4359260e4359260a08620610720840152629ffda06c093848452600360205261059f7609c1b036107408401527f4087200154161515610249613016565b6105b46105aa6130f9565b8215881518610760840152600173184bd05596d8416fa162184cdb9596d80118081d60621b03610780840152779fbf75feaee99fbfae6d7c7f6d805fca4e01ffffffffffff196107a08401526982525afa908115610e826107c08401527f578591610e50575b506106666106298260a435898c61376d565b1560405190616107e08401527f063782612cf3565b601382527f706f736974696f6e206973206865616c746879610800840152726020830152612f41565b6080880151670de0b66108208401527fb3a764000003670de0b6b3a76400008111610ca057670429d069189e000090806108408401527f820291820403610ccd57670de0b6b3a764000090049182670de0b6b3a76400006108608401527f0392670de0b6b3a76400008411610e2357670de0b6b3a764000014610df457876108808401527f15610cfc57506106df908761383b565b6ec097ce7bc90715b34b9f0fffffffff6108a08401527f8101809111610ccd576ec097ce7bc90715b34b9f1000000000900480670de0b66108c08401527fb3a7640000810204670de0b6b3a76400001481151715610ccd57670ff59ee8336108e08401527fb300006ec097ce7bc90715b34b9f10000000008390048082189082110281187f61090084015285196109208401527f810111610ca057610807926107d9926ec097ce7bc90715b34b9f100000000091610940840152600172012122090106312106220521223120c20fa921606f1b036109608401526c7cfe6f98f21f494c589bfffffd196109808401527f61316b565b61384e565b85855260036020526001604086200154906fffffffff6109a0840152737d9f7fe36de96f9ec3cca9a46ca47f7bad9ffc9f196109c0840152617ea06d020526108396001604086200154760941b036109e08401527f801c911687613c55565b9461084381613c78565b828652600260205260408620610a008401526a9f5bcae99fffad9fdfada0601d60fa1b03610a20840152679ef76a7dab6c7d7b661604060002001760c41b03610a40840152600160401b662cc2645cacb62d60c71b03610a60840152778093161790556109266108c983613c78565b848852600360610a80840152600177020526108e6600160408a200191825460801c61322e565b760441b03610aa084015266ffffffffffffff600160bf1b0119610ac08401527683549260801b169116179055565b828652600360205261610ae08401526c9ffe9fbf76dffeabe9777f7dfd61957760ec1b03610b008401526001700911102613c78565b83875260036020527607c1b03610b208401527fff600160408920019116828254161790556109cd61098c89613c78565b848852610b40840152619f5c691800980814981022081d60b21b03610b608401527f35166000526020526108e6600160406000200191825460801c61322e565b8590610b8084015260016e21a42122149800980814981022081d608a1b03610ba08401527c9f5bcae99fffad9fdfad9ffe9fbf9fffdffeab9f7fe3ea9ef4c6a8a4af19610bc08401527f6040519288845260208401528860408401526060830152608082015273ffffff610be08401526e9f5bcae96e805b6b9121ba2f390f9519610c008401527f0f5ce92c9ad3b4751452d2fe0e25010783bcab57a67e4160a03393a4610a9085610c20840152699fdf75feaee99ec6b5aa610cdd60f21b03610c4084015260016e16e05842b315d6d414141842b0205d608a1b03610c608401527c9fbf6aaee9cf6fcc6f9ec546a9a47dae6e7dad9fdf7dfead0ca4ccc4ea19610c808401527f6104d257610b0e91839160405193849283927fcf7ea196000000000000000000610ca08401526c8452886004850161319c565b03610cc08401527f8183335af180156104d657610b25575b80610a96565b610b2f8291612cc3565b610ce08401527f6101b85780610b1f565b91505082865260026020526040862073ffffffffffff610d008401526a09f5bcae99fffad9fdfad9603c1b19610d20840152769ffe9fbf9fffdffeabe96f7c78ad9ffc9fdfad9ffe9fbf19610d40840152677de96e9f7fe37d7b67088200154610bb4760c41b03610d608401527f613c55565b818110908218021890610bc682613c78565b858952600360205260610d80840152669ef4097bab6c7e67160408a20019082760bc1b03610da08401527f851661322e565b169116179055610c0582613c78565b85895260036020526040610dc08401526a9ef3cd7bab6c7d7ae99ece64089209082760dc1b03610de08401527f2e565b169116179055610c61610c4484613c78565b868a5260036020526108e6610e008401527f600160408c200191825460801c61322e565b84885260026020526040882073ff610e208401526c9f5bcae99fffad9fdfad9ffe9f19610e408401527f406000200190815416905538610a0e565b6024867f4e487b7100000000000000610e608401526a81526011600452fd5b7f4e610e80840152606062487b7160e81b01610ea08401527e52601160045260246000fd5b95965090610d78670de0b6b3a7640000918887610ec08401527f526003602052610d73600160408920015491670ff59ee833b300009081816ec0610ee08401527f97ce7bc90715b34b9f10000000000410906ec097ce7bc90715b34b9f10000000610f00840152677e9f7fe36ee9759f6548218021891760c41b03610f208401527f3c0d565b61383b565b04806ec097ce7bc90715b34b9f10000000008102046ec0610f408401527f97ce7bc90715b34b9f10000000001481151715610dc757906ec097ce7bc90715610f608401527fb34b9f1000000000610dc1920261384e565b94610809565b6024857f4e487b71610f808401526381526011610fa084015269600452fd5b7f4e487b7160b01b610fc084015279600052601260045260246000fd5b6024877f4e487b7100000000610fe08401526781526011600452fd6110008401527f5b90506020813d602011610e7a575b81610e6b60209383612d0f565b810103126110208401527f6102c8575138610617565b3d9150610e5e565b6040513d87823e3d90fd5b50346110408401526110608301919091527903c9feed9efe47a89f009fbf9fdf6d9ffbca7ead9ffa7baddfab196110808301527f166040519015158152f35b50346101b857610ee936612e16565b8496919592966110a08301526001700958460a08520808552602096600388527607c1b036110c08301527fff98610f288a600260408a200154161515610249613016565b1592610f3e610f6110e083015260016f0d584c3e5596e0856186184bd05596dd60821b036111008301527b7f63e96c9ef09d9efbe89ececda9a49ef0937b759ecc91a9a49eef18196111208301527f57505080855260038752610f8e6040862054898160801c91168b613be8565b976111408301527f5b81865260028852604086208360005288526040600020610fb18a825461316b6111608301527f565b9055610fd8610fbf8a613c78565b83885260038a526108e6604089209182611180830152600178a8c10038c262f0acb6c21fc314c278f0acb7050ea4c00712a560371b036111a083015265604088209262600160b01b03196111c08301527f101c845493828516613178565b1691161790556040519089825288888301527f6111e08301527fedf8870433c83823eb071d3df1caa8d008f12f6440918c20d75a3602cda30fe06112008301527f60403393a48161107a575b5050508360409561107092511630903390613ab9566112208301527f5b8351928352820152f35b333b156104d2576110bc9183916040519384928392611240830152647f2075be0360d81b6112608301527e84528b6004850161319c565b038183335af180156104d6576110d3575b80616112808301527f105a565b6110dd8291612cc3565b6101b857806110cd565b61110891999a50826112a08301527f8752600389526040872054908b8260801c921690613c55565b98610f90565b506112c083015260016668c20370aec08160c71b036112e083015267f27fbb67bf91ea2360821b196113008301527b9fbf9eeea29ed35fa9a46d9ffbca7ead9ffd9fdfaddf6ee99fffad9f196113208301526001760205260606040600020600181549101546040519182527604c1b03611340830152787ee99fdf7cfead9f7fe39fbf7dfead0ca4afcb9efe47a87f8019611360830152611380820152639fdf6eac670d804498406e15dd60c21b036113a08201526001702cc080a32102a5e6b6a068c20370aec14160771b036113c08201526e03c9feed9efe47a89eedcec99ed2af196113e082015260016c1596d82820482418182040645d609a1b036114008201527fff808451168552602093600485526112a360ff604088205416604051906112756114208201527f82612cf3565b600f82527f49524d206e6f7420656e61626c65640000000000006114408201527488830152612f41565b6080840180518752600586526114608201527f6112f560ff604089205416604051906112c782612cf3565b601082527f4c4c546114808201527f56206e6f7420656e61626c6564000000000000000000000000000000008983016114a0820152619eed6d052612f41565b83875260038652760941b036114c08201527f5681600260408b20015416156040519061132882612cf3565b601682527f6d616114e08201527f726b657420616c72656164792063726561746564000000000000000000008a8361150082015260017702a4c25e82acb70910a4c0070ea4c004c08112400320842d603f1b036115208201526682541617905561600160b81b0319611540820152600160281b6d110ca4c008c081104123090ea22d608f1b0361156082015270908185541617845560018401868a8a01516115808201527f1682825416179055600284018660408a015116828254161790556003840190866115a08201527f8651169082541617905551910155827fac4b2400f169220b0c0afdde7a0b32e76115c08201527f75ba727ea1cb30b35f935cdaab8683ac60a060405161147281896080809173ff6115e08201526c7f7daee97aad7f9fdf7cfeaee9196116008201527f60208601528060408301511660408601526060820151166060850152015191016116208201527f52565ba25116918261147f578480f35b6114c6928492865260038352604086206116408201526f24619810146025a06560a51fe5147fb560821b6116608201527384526004840161304f565b03925af180156115046116808201527f576114db575b80808480f35b813d83116114fd575b6114ee8183612d0f565b816116a08201527f0103126102c85738806114d5565b503d6114e4565b6040513d85823e3d90fd5b6116c0820152600168a068c20370aec2020160b71b036116e08201527603c9feed9efe47a89eeab6c99ed2afa9a49f5bca9eeaab19611700820152616f7f69184b1f5596d8390d641d60b21b036117208201527f8316948584036102c8576104bb958760209361164561163d60a0862092838552611740820152679ffd9fbf77dffeac670600388526115ba760c41b036117608201527f161515610249613016565b6115cd6115c56132c2565b8c1515612f41565b61156117808201527fe06115d8613132565b871515612f41565b6115f46115ec82613328565b6102496117a08201527f6131e8565b6115fe848861336e565b611636604061160c8d613c78565b9686816117c08201527f5260028b5220958a831696876000528a526108e66001604060002001918254606117e08201527f801c61322e565b838761367c565b610249613289565b604080513381526020816118008201527f018a90527fe80ebd7cc9223d7382aab2e0d1d6155c65651f83d53c8b9b06901d6118208201527f167e3211429190a401511661394a565b50346101b857610100367fffffffffff6118408201526503fe7e7eed9e196118608201527f04d25760a0136104e1576040516116c581612cd7565b6116cd612c5a565b81526118808201527f6116d7612ca0565b906020908181019283526044359384151585036102c857606118a08201527f408201948552606082016064358152608435608084019080825260607fffffff6118c082015263a3c9feed196118e08201527f611a64576040516117749161174382612cf3565b601182527f7369676e6174756119008201527f726520657870697265640000000000000000000000000000008883015242111561192082015260016b184bd05596e054649845fa1d60a21b036119408201527f94858751168b526007885260408b208054906117aa826132fb565b90556040516119608201527f916117b983612cf3565b600d83527f696e76616c6964206e6f6e636500000000611980820152708a84015214612f41565b604051918683016119a08201527f907f81d0284fb0e2cde18d0553b06189d6f7613c96a01bb5b5e7828eade6a0dc6119c08201527fac918252858751166040850152858951166060850152895115156080850152846119e0820152616e7c750a2c1410a02a4a2c1810802a4c18106a4c1c1060322d60531b03611a008201527f841083851117611a35578360405284519020908401907f190100000000000000611a208201526882527f000000000000611a4082015265610102860152611a608201527f6101228501526042835261016084019183831090831117611a35578a92826040611a808201527f525190209060a4359360ff8516809503611a3157889460809383526101808201611aa08201527f5260c4356101a08201526101c060e43591015282805260015afa15611a26577f611ac08201527fd5e969f01efe921d3f766bdebad25f0a05e3f237311f56482bf132d0326309c0611ae08201527f92829161197f838a51168015159081611a19575b506040519061195182612cf3611b008201527f565b601182527f696e76616c6964207369676e61747572650000000000000000611b208201527889830152612f41565b8282511690516040519081527fa58af1611b408201527fa0c70dba0c7aa60d1a1a147ebd61000d1690a968828ac718bca927f2c7873392611b608201527fa3611a0387511515838351168a526006875260408a2084895116600052875260611b8082015260016680c0004120c1ff60c71b03611ba082015278ff7cabe96eeaeae9e86faaa9a4aee96caee96caeeaea6e9fbf19611bc08201527f519283523392a480f35b9050848451161438611943565b6040513d88823e3d90611be08201526afd5b8380fd5b7f4e487b7160a81b611c0082015278600052604160045260246000fd5b8880fd5b50346101b85760611c20820152600161410160ef1b03611c40820152686f7e7cee9ee5cea8c96b793fddb3df63d513ff794df3608b1b0119611c608201527f602384011215611a31578260040135918211611a315760249160059036848284611c808201527f1b87010111611bd057849181611ae58893613823565b95611af3604051978861611ca08201526001705a1eacb7030ea4c235ff04c27046acb72960771b03611cc08201526e1f7876fe69fec978c87ba47c7eef9e19611ce08201527f1b7557505050505060405193838594850191818652518092526040850193925b611d008201527f828110611b5e57505050500390f35b8351855286955093810193928101926001611d208201527f01611b4f565b9497959694611b83816132fb565b9084811015611ba457851b82611d408201527f018301355481861b8801529597949695611b2b565b838a7f4e487b7100000000611d608201526781526032600452fd611d8082015260016cb70b01fab6a068c20370aec04160971b03611da08201526cf27fbb67bf91ea27efe7f7dba3602a1b19611dc0820152709ee3d99ed3a5a9a4e97ead9ff87caddfab19611de082015260016fc080a32102a5e6b6a068c20370aec081607f1b03611e008201526f03c9feed9efe47a89ee3909ed3a5a9a419611e2082015260016b181018471e584b281596e49d60a21b03611e408201527f80931681526006602052209116600052602052602060ff604060002054166040611e6082015260016fa3202a2b02a5e6b6a068c20370aec041607f1b03611e808201526f03c9feed9efe47a89fbf9f3f6e9ffbca19611ea08201527f815260036020522080546002600183015492015490604051926fffffffffffff611ec0820152756e7d7ee97aad9f7fe39fdf7afead7e7ee99fbf7afead19611ee08201527f60801c60608401528116608083015260801c60a0820152f35b50346101b85760611f008201527f4090611d5a36612e98565b9294939190858260a0852091828852600360205261611f208201526c9ffd7374dffeabe9eaea9efdb76201d94760ec1b03611f408201527f613016565b1593611daa611da16130f9565b82158718612f41565b73ffffffff611f608201526f78e96b9ee2329eea279ececda9a49ee219611f808201527fd96115ec86613328565b611de3848861336e565b611f4e57505092610ac09492611fa08201526a6d7a766976ad9ffc9fdfae601d60fa1b03611fc0820152637e9f7fe46b0611f0e8b611e37818c2054760a41b03611fe08201527f91168b613c33565b9a5b838152600260205287828220951694856000526020526120008201527f81600020611e5e8d8254613221565b9055611e85611e6c8d613c78565b8583526120208201527f60036020526108e684842091825460801c61322e565b611e8e8a613c78565b84612040820152600160201b6b0104a4c006c040a50504412160a71b03612060820152629ee1266007609c1b036120808201527f84549382851661322e565b1691161790558381526003602052206fffffffffff6120a0820152747f9ffe7cfeabe96eabe9efea9efdb69ecdafa9a475196120c08201527f5133815260208101889052604081018a90527fa56fc0ad5702ec05ce636662216120e08201527ff796fb62437c32db1aa1aa075fc6484cf58fbf90606090a4511661394a565b89612100820152606a6a261424a09847c39847e85d60aa1b0361212082015260017508b9996610ac09b99969c5260036020528c8a205490760541b03612140820152797d9f7fe36de96f9ec3f2a9a46574679ee1c6a9a4afcb9efe47a819612160820152600161c04160ef1b036121808201526ff27fbb67bf91ea27b807a7b4e96a6923606a1b196121a0820152786f9edff77d7babe9cceb9efdb69ed0f7a9a4e97f7dad9ffb9f196121c08201527f205261202560ff60408420541615610249612fdd565b808252600460205260406121e0820152600164010440c00360df1b036122008201527bff7dabe9e86faa80a6f1fb321413345bf0a99e79468b952d6a5b32ca196122208201527f8ea4fefaaea6ce79630d96c08280a280f35b50346101b85761209036612e98566122408201527f5b909291948294869160a08220958682526003966020968888526fffffffffff612260820152746f9edf2d7d9ffd9fbf77dffeabe9eaea9efdb69ecf196122808201527f16565b15936120e86120df6130f9565b8d158718612f41565b73ffffffffffff6122a082015271697876e96a9edeea9edef29ececda9a477ea196122c08201527f15612f41565b6121216115ec87613328565b61212b858961336e565b6122e6576122e08201527f508a9b5082819b98999a9b528a8a526121566001604083200154838160801c916123008201527f168a613c33565b9a8b945b61216386613c78565b85845260028d528c836040866123208201527f20988c8516998a60005283526040600020600101888154958187169061219491612340820152600160481b65c262f0acb62d60cf1b03612360820152788096161790556121c590613c78565b9188875252604085206061238082015260017310190815460801c906121e191613178565b81547605c1b036123a082015262ffffff6701d33efedcdeddc9609f1b01196123c082015272161790558c8361222b8d613c78565b918887526123e08201527f526040852060010191868354928184169061224991613178565b1691161790556124008201527f61225a90858961367c565b612262613289565b61226b91612f41565b8382528a6124208201527f526040902090806001830154169154161015612289613250565b61229291612f6124408201527f41565b60408051338152602081018890529081018a90527f570954540bed6b136124608201527f04a87dfe815a5eda4a648f7097a16240dcd85c9b5fd42a4390606090a45116916124808201527f6122d89261394a565b604051928352820152604090f35b9a5061230d8b9498996124a08201527f9a9c8483528d8c52600160408420015490848260801c921690613c0d565b9b8c6124c082015260016e0130c242b4acb6a068c20370aec041608f1b036124e08201527103c9feed9efe47a880d6847f185769052b8f196125008201527fc630f6575072d609bde997260ff3db851939405ec291396020600435612390736125208201526b7aabe9cceb9efdb69ed0f7a9196125408201527f5b808452600582526123ab60ff60408620541615610249612fdd565b6123f3606125608201527f40516123ba81612cf3565b601181527f6d6178204c4c545620657863656564656125808201527f6400000000000000000000000000000084820152670de0b6b3a76400008310616125a08201526001705e82acb70108a4c00b04a4c0810840c00360771b036125c08201526eff7dabe9e86faa9fbfae6f7ead5e7f196125e082015260016901e6b6a068c20370af0160b71b0361260082015269f27fbb67bf91ea27f7e360621b1961262082015273013ffd57d33f7f5cdefd5a19495f973dfc8f50ff60271b196126408201526403c9feed9e196126608201526801b85760206040517f60b81b61268082015260016c0102a5e6b6a068c20370aec04160571b036126a08201526a03c9feed9efe47a89fbf9f196126c082015260016d282458010d60549802180814881d60921b036126e08201527d7f7dabe96e7e9ffe7dfeabe96e9ffb7e9ffd7bfeabe96e9ffc7bfeabe96d196127008201527f0154926040519485526020850152604084015260608301526080820152f35b5061272082015260016668c20370aec18160c71b036127408201527803c9feed9efe47a89eda58c99ed2afa9a480ec6290a7165ed8196127608201527f229667c8e3b36e88890a66cfc8ab1024ddc513e189e125b75b602060a43561256127808201526979abe9cceb9efdb69ed1613c9d60f21b036127a08201526001758565b6126ed60a08520948587526003845261269c867604c1b036127c0820152786d9ed9d17b9ffd9fbf72dffeabe9eaea9efdb69ecfe9a9a47e196127e08201527f8a526003875261264e600260408c20015460801c871415610249612fdd565b616128008201527f269760405161265d81612cf3565b601081527f6d6178206665652065786365656128208201527f64656400000000000000000000000000000000898201526703782dace9d900006128408201527f881115612f41565b61336e565b85875260038452821660026040882001906fff612860820152600160871b196128808201526f83549260801b169116179055565b60406128a0820152600170a32102a54501e6b6a068c20370aec2020160771b036128c08201526e03c9feed9efe47a89ed8cec99ed2af196128e0820152657eee9ee5cea9710acb720c1486ac24e7ac258faacb6c1c86ad60731b036129008201527f61275d903690600401612de8565b9060a0862080865260036020526127916fff612920820152709ffd9fbf76dffeabe9eaea9efdb69ecfe91961294082015260016d1596d849e7184105d84cb09596dd60921b036129608201527d7f6be96f9ed8379ed83f9ececda9a47ceaea9ed0bea9a49ed8049ed82b78196129808201527f613c78565b828952600260205260408920848a526020526108e6600160408b206129a08201527f0191825460801c613178565b604051908682527fa3b9472a1399e17e123f3c2e6129c08201527f6586c23e504184d504de59cdaa2b375e880c618460203393a481612843575b506129e08201527f5060206104bb939401511630903390613ab9565b333b156128bd576128859185612a008201526d9160405193849283927fb1022fdf60901b612a20820152758452886004850161319c565b038183335af180156128612a408201527fb25761289c575b8061282e565b6104bb936128ab602092612cc3565b93506128612a608201527f96565b6040513d86823e3d90fd5b8480fd5b50346101b8576128d036612e1656612a8082015260017805b849691959296958460a0852080855260036020978189527603c1b03612aa082015276669ed6ef749ffd9fbf74dffeabe9eaea9efdb69ecfe9a919612ac082015260016e16c564d84a47584768584c3e5596dd608a1b03612ae08201527c7f62e96b9ed6be9eea279ececda9a49ed6b47a749ecc91a9a49ed508a819612b008201527f505081865280885261296f60016040882001548a8160801c91168c613be8565b612b208201527f985b61297a8a613c78565b9083885260028a52604088208589528a5260016040612b408201526001730112400302c2534304a929050c2cc2645cacb62d60671b03612b608201526b8094161790556129f06129d6600160e01b0319612b808201527f8c613c78565b858a52848c526108e6600160408c200191825460801c61322e56612ba08201527f5b838852828a52612a0f81600160408b200154168d808203911102613c78565b612bc08201527f928489528a526001604089200192169082541617905560405190898252888883612be08201527f01527f52acb05cebbd3cd39715469f22afbf5a17496295ef3bc9bb5944056c63612c008201527fccaa0960403393a481612a72575050508360409561107092511630903390613a612c208201527fb9565b333b156104d257918091612ab59360405194859283927f05b4591c0000612c408201526584528b600485612c608201527f0161319c565b038183335af1908115612aeb575095611070928692604098612a612c808201527fdc575b509281975061105a565b612ae590612cc3565b38612ad2565b60405190612ca08201527f3d90823e3d90fd5b612b1a919a9b50838852828a526001604089200154908c82612cc0820152600178c10039242d20c278aaacb732c252e2acb6a068c20370aec14160371b03612ce08201526603c9feed9efe4719612d008201527f576104bb612b5c36612d50565b60a081209081845260036020526126976fffff612d20820152719ffd9fbf78dffeabe9eaea9efdb69ecfe9a919612d40820152600168b6a068c20370aec04160b71b03612d60820152720793fddb3dfc8f513da7a13da8693da74b5349601f1b19612d8082015262835474600160b81b0319612da08201526b7f7de96c9ed3e59ed3ed9ed019612dc08201527f08565b863314612f41565b16938493612c26612fdd565b90851415612f41565b612de08201527f161782557f167d3e9c1016ab80e58802ca9da10ce5c6a0f4debc46a2e7a2cd9e612e0082015260016f15a26693ed60a028a03cd6d8010d641d60821b03612e208201526e1f7a5f7f27bf4dea2a6927cef29be3606a1b19612e408201526e1f7a5f7f27bf4dea2a6927f6f29be360521b19612e60820152627eee9e6a0fbd2fbf93dfa6f5153493605b1b0119612e80820152677deee89ee5caa8a06f0346aaec080a4acb6c1410203210220d60831b03612ea08201526b7deee89ee5caa89fbfada9a56b080a4acb6c0810203210220d60a31b03612ec08201526001630120c03f60e71b03612ee08201526a7deee89ee5caa89fbfada96903eddfdd2fdfcdefddf3609b1b0119612f00820152600160b760f71b03612f2082015277e7d7dbbfbb67bf4dea27efeb9be7b49e1f67b4ca2a691fa360321b19612f40820152719ffbca7e7ee97efc9efd37a87dad9fdbca7e19612f608201527f811681036102c857602083015260443581811681036102c85760408301526064612f808201527f3590811681036102c85760608201526080608435910152565b9181601f840112612fa08201526e7cee9efd37a89fdf7c7e79fe6afeff6802ac20590af046b22d60bb1b03612fc082015260016922c20590aeacb6c2024160af1b03612fe082015275037dfeed9efd37a89ed1b57e9ed2afa9a46e9f5bca6e19613000820152637ee97efd6718310d6458390d5d60c21b036130208201526c7dee9efd37a89ed16b6e9ffbff6a0c20590af22c202086b20d60ab1b0361304082015260016bc25bd0acb72122acb6c20241609f1b0361306082015273037dfeed9efd37a89ed1336f9ed2afa9a46f9f5b19613080820152646f9f1bca7e660d6418310d641d60ca1b036130a08201527f811681036102c857916101043590811681036102c85790565b60405190612f156130c08201527f82612cf3565b600982527f6e6f74206f776e65720000000000000000000000006130e0820152746020830152565b15612f495750565b604051907f08613100820152608262061bcd60ed1b016131208201527f5281602080600483015282519283602484015260005b848110612fc6575050506131408201526001600160ff1b036131608201527fe0601f836000604480968601015201168101030190fd5b8181018301518682016131808201527f604401528593508201612f85565b60405190612fea82612cf3565b600b82527f6131a08201526a185b1c9958591e481cd95d60aa1b6131c08201527f6020830152565b6040519061302382612cf3565b601282527f6d61726b6574206131e08201527f6e6f74206372656174656400000000000000000000000000006020830152565b6132008201526001752424a458405024184c2a60d84058204065982020245d60521b03613220820152757f7daee97aad7f9fdf7cfeaee99fdf79fead7f9fbf7c196132408201527f015116604086015260608201511660608501520151910152565b60028154916f6132608201526f6d7c7ee99f5f78fead9f7fe39f3f79fe196132808201527f52600181015483811660e087015260801c6101008601520154908116610120846132a08201527f015260801c910152565b6040519061310682612cf3565b601282527f696e636f6132c08201527f6e73697374656e7420696e7075740000000000000000000000000000602083016132e08201527f52565b6040519061313f82612cf3565b600c82527f7a65726f206164647265736133008201527f7300000000000000000000000000000000000000006020830152565b91908201613320820152627f7f6c6c0809211610ccd57565b9190917609c1b036133408201526001742d222c03230422c2199aaeacb72306c0c128c03f2560571b036133608201526a1f6b79ad9fbf9fdf78fead196133808201527f8160408701528686013760008582860101520116010190565b604051906131f56133a08201527f82612cf3565b600c82527f756e617574686f72697a65640000000000000000006133c0820152746020830152565b91908203918211610ccd57565b6f6133e08201526f6e7de96f7de9fc6e6f7dee9ef332a8a9196134008201527f5b6040519061325d82612cf3565b601682527f696e73756666696369656e74206134208201527f6c6971756964697479000000000000000000006020830152565b6040519061326134408201527f9682612cf3565b601782527f696e73756666696369656e7420636f6c6c6174656134608201527f72616c0000000000000000006020830152565b604051906132cf82612cf3565b6134808201526f600b82527f7a65726f2061737365747360801b6134a0820152600166c0410602a4acb7609f1b036134c08201526c1fbae7bcccaa27ffbf9bea692360321b196134e082015271e97fcceb6f7eea9eccb3a8af6fa9a46faf9f196135008201527e52600660205260406000203360005260205260ff6040600020541690565b916135208201526001700906000908082526003916020928084527607c1b036135408201527fff936040936133a686600287872001541642613221565b80156136715773ffff6135608201526d6f7e9f9f74feaee97f9ecbf6a8a419613580820152600170a0a0a0c0052b2d2ea106a4a4400320842d60771b036135a08201527fffff00000000000000000000000000000000825416179055565b61344d8591856135c08201527f8952878352898920898b519e8f94859384927f9451fed40000000000000000006135e08201526c84526004840161304f565b03926136008201527f5af1998a1561366757869a613637575b50606088999a6134f0878987968988606136208201527f029f8f7f9d9bd501d0657d7dfe415f779a620a62b78bc508ddc0891fbbd8b7ac6136408201527f0f8fce879a8387528785526134fb6134b0846001858b20015416928c61383b566136608201527f5b916134f5671bc16d674ec800006134c7858061383b565b0493670de0b6b3a76136808201527f6400009c856729a2241af62c00008f97846134e99161383b565b049261316b566136a08201527f5b61316b565b9061383b565b049561350687613c78565b8482528886526001836136c08201526001730106400308c26a4304a927050a2cc262f0acb62d60671b036136e08201526b80931617905561355288613d600160e01b03196137008201527f78565b858352898752838320918561356b845493828516613178565b169116176137208201527f905580978482528086526002838320015460801c998a6135aa575b50509051986137408201527f89525050505050888401528a83015250a287969538806133cf565b88995061356137608201527fbf6135ce97989b6135e19a61383b565b04968795835252205416613221565b886137808201527f8d528b8b528d8d205460801c91613be8565b91868b528c89528b8b20906001546137a08201527f168b5288528a8a2061360283825461316b565b905561362761361083613c78566137c08201527f5b878c528a8a526108e68d8d2091825460801c613178565b819038898f89908f6137e08201527f8f8f8661358a565b9099508381813d8311613660575b61364f8183612d0f565b6138008201527f81010312611bd0575198606061345f565b503d613645565b87513d88823e3d906138208201527ffd5b505050505050509050565b90929160009380855260209260028452604086613840820152696f7e7ae977ad7aad900161081d60f21b03613860820152709ffe9fbf76dffeabe9ea9ec89da87b9ffb196138808201527f91604084015116604051928380927fa035b1fe000000000000000000000000006138a08201527082525afa948515613757578795613720576138c08201527f5b505061371d94955061376d565b90565b9080929550813d8311613750575b616138e08201527f37388183612d0f565b81010312611bd05761371d9495505192859438613710566139008201527f5b503d61372e565b6040513d89823e3d90fd5b506001955050505050565b60806139208201527f6ec097ce7bc90715b34b9f100000000061381361381d949660016040670de0b66139408201526001712ce9d900002618002422e09498009808149d60721b036139608201526f07c7cdf6ee96f7e7cad9fdfad9ec807960541b1961398082015279727e787878dffeabe96f7aad9ffc9fdfad797979dffeab6e7d73196139a08201527f1c921690613c55565b9b82526002602052828220908252602052200154841c616139c0820152627eee9f7407076acb6092202a320c27076acb608202b20acb6d605b1b036139e08201527f1a355760051b60200190565b81810292918115918404141715610ccd57565b81613a008201526001732ac21be8ae0920acb720c270c522c27076acb721605f1b03613a208201526a7efe6e7e7cee9ef332a89e19613a408201527f371d926107d49161316b565b604051906138a882612cf3565b600782527f6e6f613a608201526160206420636f646560d81b01613a80820152697dee9ee5caa89fbfae6f6d10602a4acb67a2ac2725aae7b20d60931b03613aa0820152600164c27242c04160d71b03613ac08201527a1f9fe07bfee9fe7b9ed2f0a9a47dadc29fff9fdf7bfec1a9a49f9f19613ae08201527f90565b908160209103126102c8575180151581036102c85790565b613a9d9260613b00820152617c6a6824a0d84e76984e819d60b21b03613b208201527f1694613980863b151561024961389b565b60405192839160208301967fa9059c613b408201526288526060bb60f81b01613b6082015260a06a09210058082424e4a464dd60aa1b03613b8082015260016b8104032a2d02a402a4acb607609f1b03613ba0820152731f7efe7cad7d9ed2f0a9a4ae6da50e9ec5ad9ec519613bc08201527f156138d4565b9160405190613a2382612cf3565b601182527f7472616e736665613be08201527f722072657665727465640000000000000000000000000000006020830152612f613c008201527f41565b8051908115918215613a9f575b505060405190613a6e82612cf3565b60613c208201527f1782527f7472616e736665722072657475726e65642066616c73650000000000613c408201527b6020830152612f41565b565b613ab292506020809183010191016139613c608201526001750c9596ce20184e97d596d80024a460e024d84ea7659d60521b03613c80820152757f6ae96b9ec51379c4eaea9efdb69ec764a9a49fbfae19613ca08201526b928160208501967f23b872dd60a01b613cc082015277885216602485015216604483015260648201526064815261613ce08201527f3b3781612cd7565b51925af1613b83613b466138d4565b9160405190613b5482613d008201527f612cf3565b601582527f7472616e7366657246726f6d20726576657274656400613d20820152756020830152612f41565b8051908115918215613bce57613d408201527f5b505060405190613b9f82612cf3565b601b82527f7472616e7366657246726f613d608201527f6d2072657475726e65642066616c736500000000006020830152612f41565b61613d808201527f3be19250602080918301019101613932565b3880613b90565b620f4240830180613da08201527f9311610ccd5760018201809211610ccd5761371d926107d49161383b565b6001613dc08201527f820192918310610ccd57620f42408201809211610ccd5761371d926107d49161613de08201527f383b565b91620f42408101809111610ccd5760018201809211610ccd5761371d613e008201527f92613858565b919060018101809111610ccd57620f42408201809211610ccd57613e208201527f61371d92613858565b60405190613c8582612cf3565b601482527f6d61782075613e408201527f696e743132382065786365656465640000000000000000000000006020830152613e608201526b6d7c7ceeea9ed0bea9a4e970630613ccd760e41b03613e808201527f56fea164736f6c6343000813000a000000000000000000000000000000000000613ea0820152604080513085820152848152906140469082617386565b60405191614055604084617386565b60068352654d6f7270686f60d01b858401526173d1565b936084614aba604051614081610a4082617386565b610a0c81527f60a03461011c57601f19610a0c38819003601f81018316840193600160016040858201527f1b039390929091838610858711176101065780849260409788528339602093846040808301919091527f918101031261011c5751926001600160a01b03841680850361011c578551918260608301527f870190811183821017610106578652600c82526b7a65726f206164647265737360808301527f60a01b84830152156100ad57505050608052516108ea9081610122823960805160a08301527f81818160bc015261026b0152f35b82855192839162461bcd60e51b835280600460c08301527f84015283519081602485015260005b8281106100ef575050604493508060008560e08301527f601f938601015201168101030190fd5b808601820151878201604401528694506101008301527f81016100ce565b634e487b7160e01b600052604160045260246000fd5b6000806101208301527ffdfe6080604090808252600436101561001557600080fd5b600090813560e01c6101408301527f90816301977b571461028f575080633acb5624146102205780638c00bf6b14616101608301527f01f457639451fed41461004f57600080fd5b346101f15761005d366102d6565b6101808301526f7eee797defe89efe3ba87cad9ff57aae67106a32723090602d60c31b036101a08301526d6020947f6e6f74204d6f7270686f60901b6101c0830152628100006421a080549d60ba1b036101e08301526116336102008301527f036101315750828061011460a07f7120161a7b3d31251e01294ab351ef15a41b6102208301527f91659a36032e4641bb89b121e321942094856104ff565b91878684939952808a6102408301527f52205581519086825287820152a251908152f35b84908685519283917f08c37961026083015262835280600560fd1b016102808301527f6004840152835193846024850152825b8581106101ad57505050601f837fffff6102a0830152621f6d9f196102c08301527f4480968601015201168101030190fd5b818101830151878201604401528694506102e08301526e820161016d565b6024857f4e487b7160881b6103008301527481526041600452fd5b80fd5b50903461021c5760206103208301527f9061021460a061020c366102d6565b9190206104ff565b509051908152f35b5061034083015260016b0101fab6a12068c20438af0360a71b036103608301526bf27fbb67bf78ea27f7dbeba360421b196103808301526001608160981b03196103a083015272168152f35b905082346102d25760207fffffff6103c08301526303c9feed196103e08301527f6102d257602092600435815280845220548152f35b8280fd5b907fffffffffff61040083015265037dfe9efe9f19610420830152656e6f9f5f7eff7110224c20882aec14026c20882aec08100a2d60731b0361044083015260016d20e04460a08405d8411195e0949d60921b036104608301527d9ffbca7e7ee97efc9efbbea87dad9fdbca7e7ee97efc9efbbea89fdf7cfe196104808301527f5260443581811681036104415783830152606435908116810361044157817fff6104a083015261a36e196104c08301527f606060c094015260843560808201529501126104415780519160c083019081116104e0830152646f9f5bca7e6a083821017610446578152760ac1b036105008301527f8116810361044157835260c435828116810361044157602084015260e43590826105208301527f82168203610441578301526101043581811681036104415760608301526101246105408301527f3581811681036104415760808301526101443590811681036104415760a082016105608301526d5290565b600080fd5b7f4e487b7160901b61058083015275600052604160045260246000fd5b81810292916000826105a08301526124ff60ef1b6105c08301527d8214166104b45781840514901517156104b457565b7f4e487b71000000006105e08301526760005260116004526106008301527f60246000fd5b919091600083820193841291129080158216911516176104b457610620830152676e7de97fea9fff7f670565b8151909291760c41b036106408301527f6107c357508360408401511690670de0b6b3a7640000918281029281840414906106608301527f1517156104b45761078f5704915b670c7d713b49da0000808413156107be5750610680830152600169ce02c68af0bb140000b760af1b036106a08301527ffffffff3828ec4b626000084019384136001166104b457670de0b6b3a76400006106c083015260017801270902052101040b0c29202a2e2ac20968af022ac20f1eaf603f1b036106e0830152667deb807fffffff1961070083015263821416616107208301527f04b4570594600052600060205260406000205491600091831560001461067a576107408301527f50505050634b9a1eff8161064482955b600081121561066c57670a688906bd8b6107608301527d610475565b059082820191600084841291129080158216911516176104b46107808301527f5761066791610475565b059190565b6729a2241af62c0000610475565b6501716107a08301527f268b5ad4918783029283058803610762576080015116420390428211610735576107c08301527f90846106a99205610475565b806106bb57505081610644829561062d565b90616107e08301527f06e1826106db6106d1869560029a976107cc565b98899205856107cc565b93616108008301527f04e3565b908260011b92600284050361070857506004610701859361064493616108208301527004e3565b059261062d565b807f4e487b7160781b61084083015272602492526011600452fd5b6024837f4e487b7161086083015263815260116108808301526c600452fd5b6024847f4e487b7160981b6108a08301527681526011600452fd5b7f4e487b710000000000000000006108c08301526c600052601260045260246000fd6108e08301527f5b610567565b9150509161054b565b6107e8906107e2670de0b6b3a7640000936109008301527f610807565b90610475565b05640ec41a0ddf81811290821802186301e3da5f8161092083015260016a010227210430043120acb760af1b036109408301527d023f2fa8f6da5b9d277eed9ef728a897fae9702f6b903fbea07eedea9ef71961096083015260016b0172aec00102242ac21154af60a71b036109808301527b04cf46d8192b672d6fa498f661724fcda931a27f6d7dfefa6e7dfd6f196109a08301527f03670de0b6b3a7640000906002828280020505010190600081121560001461086109c08301527fa3571b90565b6000031d90565b6704cf46d8192b672e9061086b565b507809316109e08301527fd81650c7d88b800000000000000000000000000000000090565b5060009056fe610a008301526b50b239b7b631a1800409800560a11b610a2083015280516001600160a01b03909916898701819052868a529890614a8a9082617386565b60405191614a99604084617386565b601083526f4164617074697665437572766549726d60801b878401526173d1565b60405163ec9e80bb60e01b81526001600160a01b03968716600482015260606024820152606481018690523060448201529095909485938492165af19081156172c2575f91617307575b50614b2d81604051614b17604082617386565b60048152635361666560e01b602082015261746a565b604051610140946001600160a01b03929092169291614b4c8683617386565b600982526020820190601f1987013683378251156172f35773e0aeb6811d33df42a09066857cdafca16b50608682528251600110156172f3577384d3e4ee550dd5f99e76a548ac59a6be1c8dcf7960408401528251600210156172f35773c100c251bdd297a66795112f04356e6ba5f89d8060608401528251600310156172f35773264c86dbbd2e4165fbbf0c35b0ddf0e00aec6b3160808401528251600410156172f3577330e7c016fc702cde9a50720a469d418490b7b65260a08401528251600510156172f357738f02b4a44eacd9b8ee7739aa0ba58833dd45d00260c08401528251600610156172f35773cf263cee139763114faafc5f52865135412f50ec60e08401528251600710156172f3577369fcefde2b48503d675181448b3d4272128bca9c6101008401528251600810156172f3577313ca8756e9470b71b8e998352c8741706217f963610120840152843b156172ef5760405163b63e800d60e01b815261010060048201529251610104840181905290918391610124830191905f5b8181106172cd575050506020905f93600560248501528460448501528484830392600319840160648701525260018060a01b031660848401528360a48401528360c48401528360e4840152018183875af180156172c2576172ad575b508490833b1561728957604051632d327a8f60e11b815260048101839052828160248183895af19081156172a257839161728d575b5050833b1561728957604051632d327a8f60e11b81526001600160a01b039091166004820152818160248183885af180156171c157617274575b5050813b156171a85783604051634d98a93b60e01b8152816004820152818160248183885af180156171c15761725f575b5050813b156171a857604051634d98a93b60e01b8152670557cb75ce86800060048201528490818160248183885af180156171c15761724a575b5050813b156171a857604051634d98a93b60e01b81526708ac7230489e800060048201528490818160248183885af180156171c157617235575b5050813b156171a857604051634d98a93b60e01b8152670aaf96eb9d0d000060048201528490818160248183885af180156171c157617220575b5050813b156171a857604051634d98a93b60e01b8152670bef55718ad6000060048201528490818160248183885af180156171c15761720b575b5050813b156171a857604051634d98a93b60e01b8152670cb2bba6f17b800060048201528490818160248183885af180156171c1576171f6575b5050813b156171a857604051634d98a93b60e01b8152670d1d507e40be800060048201528490818160248183885af180156171c1576171e1575b5050813b156171a857604051634d98a93b60e01b8152670d645e632040800060048201528490818160248183885af180156171c1576171cc575b5050813b156171a857604051634d98a93b60e01b8152670d99a8cec7e2000060048201528490818160248183885af180156171c1576171ac575b5050813b156171a857604051906313af403560e01b82526004820152838160248183865af1801561719d57617184575b508261716d93507f04f55763f46180461461008d57600080fd5b346104f05760407fffffffffffff6040519361500461230086617386565b6122ce85527f60a03461008857601f6122ce38819003918201601f19168301916001600160406020808701919091527f1b0383118484101761008d5780849260209460405283398101031261008857516040808801919091527f6001600160a01b038116908190036100885760805260405161222a90816100a460608801527f8239608051818181610e1801528181610f2501528181611053015281816110dd60808801527f0152611baa0152f35b600080fd5b634e487b7160e01b6000526041600452602460a08801527f6000fdfe608080604052600436101561001357600080fd5b60003560e01c908160c08801527f630e4eecf814611bce575080633acb562414611b5f57806363a846f814611af960e08801527f5780636fcca69b14611a94578063833947fd1461089757806391b114b21461086101008801527f325780639dbcd5b9146107a6578063c55b6bb71461064b578063e55156b51461610120880152918601929092526603c9feed9efb0f19610160860152667f7cee9efb0fa9700aec20188c23a36acb6c04920c0486b20d607b1b036101808601527f366023840112156104f05782600401359081116104f0576024830192606090606101a086015260016d090da460e14080404458413c15dd60921b036101c08601527fffff8093169485600052602093600085528060406000205416331415908161046101e08601527f79575b5061044f576000939291935b8281106101e957505060405192818385016102008601527f848652526040840194926000905b83821061019a5787337f709e1cb4b0ac458e6102208601527fb1c1a9c708e841ee963b229247afbf1437bd39e01ae4aa14888a0389a3005b90610240860152617f9f6d091929395838060019289358152760941b036102608601527f01c5878d016120ac565b16868301526101d660408c016120ac565b16604082016102808601527f520197019493920190610169565b6101f88184889795969761209c565b3560406102a08601526528bfe638c7bb60d11b6102c08601527d8152816004820152848185818c5afa8015610443578791600091610416576102e086015260016f05b50015115806103c8575b61039857760841b036103008601526c7f7b9efd7a759efd807873709f63012320df60e71b036103208601527f209c565b0161200b565b1611908484898c8515610378575b505050505061034e6103408601527f576001926103046040610344936102b3868b8e61209c565b908d60005260038c6103608601527f5282600020906000528b5281600020936102d68c830161200b565b167fffffff61038086015262855417600160981b03196103a0860152658000000000016901784550161200b565b760b41b036103c0860152648354926081600160a81b03196103e08601527f1b169116179055565b019392919361014a565b60046040517fb9860d64000000610400860152668152fd5b61038c6104208601527f939495509161027f9160409361209c565b1611388484898c610293565b905060610440860152674051907f6113d8c760c01b61046086015260806a082526004820152fd5b507608c1b036104808601527f6103ea8861027f868a8d61209c565b1615908115916103fb575b50610246565b6104a08601527f905061040d604061027f85898c61209c565b161515386103f5565b61043691506104c08601527f863d881161043c575b61042e8183611dc7565b810190611f3b565b3861023c566104e08601527f5b503d610424565b6040513d6000823e3d90fd5b60046040517f26d3a7bf0000610500860152658152fd5b9050610520860152676040517f8da5cb5b60c01b6105408601527b815285816004818b5afa908115610443576000916104c3575b5016336105608601527f14153861013e565b6104e39150863d88116104e9575b6104db8183611dc7565b6105808601527f810190611e08565b386104b8565b503d6104d1565b600080fd5b346104f057606105a08601526001608160f71b036105c086015272f27fbb67bec3ea27beb4e7b8b92a6927f6f2a3605a1b196105e0860152767f6de96e7d9fffad9fdf6f9fff7dad7f9fbf9fffdfabe9196106008601527f33141590816105e4575b5061044f5782600052600181528160406000205414616106208601527f05ba577f44a6d70a601a6f8a85c075467e9d7245897140cbf6dd505c9d9d76446106408601527f59f5fb64908360005260018152826040600020556040519283523392a3005b6061066086015268046040517fa741a04560b81b6106808601527a8152fd5b90506040517f8da5cb5b000000000000000000000000006106a08601527081528281600481885afa908115610443576106c08601527f60009161062e575b501633141584610565565b6106459150833d85116104e9576106e0860152600176c209b70306c23b8eacb70ac20c46acb668c209e0aec08160471b036107008601526803c9feed9efb0fa89e19610720860152606f6a01a0984746d596d8090d5d60aa1b036107408601527f8282168092036104f057821691826000526020906000825280604060002054166107608601527f33141580610740575b61044f57829084600052600083526040600020541614616107808601527f05ba577fc51248b3e510a1244e01043dffdc0132d10194bd4506382cbcf83d056107a086015260017301edd8afdf2106c000a4c00102a4c080c000410760671b036107c08601526b8254161790556040519283526107e08601526d3392a3005b506040517f8da5cb5b60901b6108008601527581528281600481885afa8015610443578291600091616108208601527f0789575b50163314156106c4565b6107a09150843d86116104e9576104db8183610840860152600171c23b8eacb70cc20efeacb668c209e0aec081606f1b0361086086015267f27fbb67bec3ea23602a1b19610880860152709ef80d9ee2e4a9a4e99fffad9ffc9fdfad196108a08601527f6040600020602435600052602052604080600020548151906fffffffffffffff6108c0860152767ee97dad9f7fe39fdf7dfead0ca4cb9efb0fa89fdf8000196108e08601526103c9196109008601819052649ef7819ee3654498413c15dd60ca1b036109208701527f1b565b1660005260026020526020604060002054604051908152f35b60e07fff610940870152610960860152657eee9efb0fa970224c209e0aec21192c23a36acb6c0486ad60731b036109808601526b7e9ffbfecaee9efb0fa8c9a06b06cc0470402242ac209e0aed60a31b036109a086015260017248c18106c008026a0506020222c209e0aec14160671b036109c08601526810f27fbb67bec3ea2360221b196109e08601526f7de99fffad9ffe9fdfad9fbf9fffdfab19610a008601527f3403611a6a5734611a34575b806004013515611a0a5760a061097c36611e4156610a208601526a2d9048b02028bfe638c7bb60a91b610a4086015260016e2054a0d8012080549818205809205d60521b03610a608601527579e9a5057fea9efbbca89fdf6e9fff6e9ee614a8a4af19610a8086015260017702a22ac2329aaec00904026ac003020323210420c2278eaf603f1b03610aa0860152671f9ef5c99ef5df7b19610ac08601527f611fb4565b93610a2e6040519586611dc7565b808552611fb4565b0160005b81610ae08601527f811061199d5750506000926000805b82600401358210610d2c57505073ffffff610b008601526e7de99fffad9ffc9fdfad9fbf9fffdf19610b20860152676c7b9fbf9fffdfac67085600052602052760c41b03610b4086015260016b2d2901042d012c20c219f6af609f1b03610b608601526b1b67bd22e7f7db27bd19db23603a1b19610b808601527277e99fffad9ffc79ad9fbf9fffdf749fffad7919610ba0860152600160401b66a4c080c000412160c71b03610bc086015277825491610b328582851661204c565b16911617905573ffff610be08601526d78e99fffad9ffc7aad9fbf9fffdf19610c008601527f8a6000528552610304604060002091825460801c612028565b610b8281600401610c208601527f358761207b565b51610b8c36611e41565b9052600401358561207b565b510152610c408601526a7ee9c4ea9efb0fa89fbfaf601d60fa1b03610c608601526680927f7299aa3160c81b610c808601527c8252602482016020600484015281518091526020604484019201906000610ca086015260017316e0604418432255d41414242018002480e060dd60621b03610cc08601526b1e7a69439b9f7aa7beef2a2360621b19610ce0860152776d9ef385a8a4af9fbfae6d7cade96f8007517f4f7ab203c319610d008601527f73d3eb4b6160df1996a5859e6c1d11d10f3980a7f469199160203392a4005b61610d208601527f0c8390611d97565b84610c49565b91935091602060c0600192828751610ce683610d40860152647f7daee97b662094582020245d60ca1b03610d608601527f5280602083015116602086015280604083015116604086015260608201511660610d808601527f608501520151910152565b015160a0820152019401910191859392610bfc565b610da08601526b301243b02028c83f972c0da760a11b610dc08601527782526004820152fd5b949060a0610d4b36610d4684876004610de08601527f013560248901611fcc565b611ed9565b20916040517fcc718f76000000000000610e008601526981528360048201526060610e208601526675e9a5057fea9f64205809205d60da1b03610e408601527f04435760209160009161197e575b5001511561194d57610dc860a061027f8487610e6086015260786e06004013560248901611fcc565b967608c1b03610e808601527f161561191c578311156118f2578783146118c857610e01828560040135602487610ea0860152608160201b655847f31596dd60ca1b03610ec086015263163b1561610ee08601526d02782bb040302028c8bf8a8e0d6f60911b610f0086015260016220d49d609a1b03610f208601526f27bc5e9f67b8b06a693a67fedeffab63607a1b19610f408601527227bc54e7f7df3fa7b8b06a693a67f6deffab6360421b19610f60860152739ef12c9fbf7cfe9ee2c1a9a4e99fbb7bfead8c0019610f808601526c9ef1059f9f7cfe9ee2c1a9a4e919610fa08601526001731819210054804d582120805498002058292060dd60621b03610fc08601526001608160b81b0319610fe086015276165af18015610443576118b9575b50610f6936610d46846110008601527f876004013560248901611fcc565b60a0812060405160208101918252600260406110208601527f82015260408152610f8b81611dab565b519020604051602081019173ffffffff6110408601526f76e97cad9fbf7dfead9fbf7ead9ef03e196110608601527f81611dab565b519020604051610fd081611d5f565b60018152602081019160206110808601527f368437610fe78261206e565b526040519182917f7784c68500000000000000006110a08601526b8352602483019060206004856110c08601527f0152518091526044830191906000905b80821061189d575050509080600092036110e0860152608160481b61205d60f21b0361110086015268165afa8015610443576111208601527f6000906117f1575b61108d915061206e565b519060a0812090604051917f5c606111408601526183526171cd60f11b0161116086015260016b180120c0549830209809205d60a21b03611180860152607f60f81b6111a08601527e165afa9182156104435760009261170b575b5060808201906111316fffffff6111c0860152727caee9bd9edf70a9a46f7eeaea7f9ee913a8a4196111e086015260a06e0806116c9575b6113f6575b5050507608c1b036112008601527f2081835116920151166001820182116113c757620f4240810181116113c757616112208601527f1196926001620f424061119193019301906120e6565b6121e4565b73ffffffff6112408601526f79e99fffad9ffc9fdfad9fbf9fffdf7b196112608601526877e99fbf9fffdfaba0660600052602052760cc1b036112808601526777e97eef9eec9aa9670801c1061139657760c41b036112a08601527f6113078884936112f387948b6112d86112cf896112c98f9c8f73ffffffffffff6112c0860152719ffe60717d7de99fffad9ffc9fdfad9fbf9f196112e086015260016d4120c000a4c040a4c080c000411b60871b0361130086015260016007607c1b036113208601527fff61128a845493828516612028565b16911617905516600052600360205260406113408601527f6000208d6000526020526112bb60406000206103048d825460801c61204c565b6113608601527f602481600401359101611fcc565b9361207b565b51913690611ed9565b90526f6113808601526f7be96f9edf70a9a49fdf9eed0078729e196113a0860152619fc06d0207b565b510152612028565b97760941b036113c08601526578e96f809de865146445a0549d60d21b036113e08601527fcdb9e8efb3d0e8136d32c91d9446eaf19e2e486bc67dfcb3d574ca60d50460206114008601527f3392a40190610a4a565b602484604051907f8c4bfb14000000000000000000006114208601526d82526004820152fd5b60248460406114408601526651907fad5f61d360c81b6114608601526d82526004820152fd5b7f4e487b7160781b61148086015272600052601160045260246000fd5b6114a461016114a0860152689f9f9fdf6afeaee9916219209d60ea1b036114c08601526f9fbfae68776a796b8073ff4094ffffff196114e08601526686526004860190611500860152667f7daee97aad8064182020245d60da1b036115208601527f60208301511660208601528060408301511660408601526060820151166060856115408601527f01520151910152565b818a511660a485015281878b01511660c48501528160406115608601527f8b01511660e48501528160608b01511661010485015251166101248301526fff611580860152709f5f76feaee99efebb7cfeada5056e7dea196115a08601527f61044357600092611693575b509061157a61153061156f936fffffffffffffff6115c0860152769fbf78feaee96c9edf19a9a46e9eea8b98e43e9298b137196115e08601527d61154785806120e6565b0493670de0b6b3a764000095856729a2241af62c6116008601527d611568848a996120e6565b0492611e34565b611e34565b906120e6565b046116208601526e9eea5b9eea677c9edf06a9a47d9fc0600760fc1b0361164086015260016f087015116612028565b166040840152760841b0361166086015260017806115d06115c7836120f9565b82865116612028565b1683527603c1b03611680860152769f5f7bfeaee97fea9eeeb9a89eea066e9edf19a9a4fb9e196116a08601526b7baee99edf70a9a490000001630161781760e41b036116c0860152729fdf7bfeaee96f9df0bdbf7dfe7dee9eec38a8196116e086015260017406001810181116113c757611674611685926111917605c1b036117008601527a6a9df0bdbf9ffe9ee98669fe6cfe6f9edf19a9a49edf06a9a47d9f196117208601527f2085015116612028565b1660208201528a8080611146565b91506020823d60206117408601527f116116c1575b816116ae60209383611dc7565b810103126104f057905190611561176086015260016f1e984541d596cf64541845a85596d41d60821b036117808601526e09f9f7dfeaee9eaea9eeebea9a4af9606c1b196117a08601527c9fbf7afeaee9eaea9eeec4a9a46f6eaf9f3f7ec29f3fee9ee816a8a47e196117c08601527f61172760c09383611dc7565b810103126104f057604051908160c081011067ff6117e0860152789f3f7bfeeee89ee845a89f5f9ee8516e9f3f7bfe9fbfad9ee8196118008601527f62816120c9565b8452611770602082016120c9565b60208501526117816040826118208601527f016120c9565b6040850152611792606082016120c9565b60608501526117a3606118408601527f8082016120c9565b6080850152016120c9565b60a0820152908b61110e565b7f611860860152634e487b7160e01b6118808601527f600052604160045260246000fd5b3d915061171a565b503d90816000823e61186118a086015260017670504c23b8eacb6c041030702020624c209e0af00a322d60431b036118c08601527f83116104f057808201601f8484010112156104f057828201519161183e83611f6118e08601527fb4565b9361184c6040519586611dc7565b8385526020850192820160208560056119008601527f1b8385010101116104f057602081830101925b60208560051b838501010184106119208601527f61188d57505050505061108d90611083565b835181526020938401930161186e6119408601527f565b919350916020806001928651815201940192018493929161102b565b61186119608601527fc290611d97565b88610f52565b60046040517f898ca7190000000000000000006119808601526c8152fd5b60046040517fc952776119a0860152628152fd600960fb1b016119c08601526c05b602484604051907f9565ed9609c1b6119e08601527682526004820152fd5b602483604051907f6113d8c70000611a0086015265825260048201611a208601527f52fd5b611997915060603d60601161043c5761042e8183611dc7565b8a610da9611a408601527f565b6020906040516119ac81611d5f565b6040516119b881611d7b565b600081611a608601527f5260008482015260006040820152600060608201526000608082015281526000611a808601527f8382015282828701015201610a3a565b611a04915060603d60601161043c5761611aa08601527f042e8183611dc7565b856109da565b60046040517f76da594500000000000000611ac08601526a8152fd5b73ffffffffffff611ae0860152717de99fffad9ffd9fdfad9fbf9fffdf9ee59c19611b008601527f348254611e34565b9055610967565b60046040517fcd3cb2bb00000000000000611b208601526a8152fd5b346104f0576020611b408601526001600160ff1b03611b60860152629ee520683f0d804498413c15dd60ba1b03611b808601527f611d1b565b1660005260016020526020604060002054604051908152f35b3461611ba086015260016409e0aec04160d71b03611bc086015269f27fbb67bec3ea27f7e360821b19611be08601527b7f9ee4b79ee2e4a9a4e99fffad9fff7dad9fbf9fffdfabe99fbfae6f19611c0086015260016b0102a5e6b668c209e0aec00160a71b03611c208601526cf27fbb67bec3ea27f7e7efeba3603a1b19611c408601526001608160901b0319611c6086015271168152f35b346104f05760407fffffffffff611c808601526503c9feed9efb19611ca086015260016f3c15d84701584746d596e418090d645d60821b03611cc08601527b6f7e7be97f6bfc9efb0fa87ee96e7d9fffad9fdf6e9fff7cad7f9fbf19611ce08601527f60002054163314159182611cb5575b505061044f578160005260028152604060611d008601527e2090600082549255600082858115611cab575b600092839283928392f11561611d208601527f0443577f6ab9f885fa0bfd2af57586f4cdde83bbfc79294d0cd2d61d4b31e9a3611d408601527fd1be6e2c906040519283523392a4005b6108fc9250611c6f565b9091507f8da5611d6086015261815261cb5b60f01b01611d808601527f8281600481875afa90811561044357600091611cfe575b50163314158480611c611da08601527f4a565b611d159150833d85116104e9576104db8183611dc7565b85611cf2565b611dc0860152667de97dfc9efb106418010d641d60da1b03611de0860152657de97dfc9efc6515d596cd641d60d21b03611e008601526b7deee89ee845a89fbfada9a56b1e0aeacb6c0810203210220d60a31b03611e208601526f7deee89ee845a89fbfada9a498000001670c1410203210220d60c31b03611e40860152720fddd3dd08b513f7f5b53493f3efdfcdefddf360431b19611e6086015260016f0104222ec22f74aec080a4acb720c03f60871b03611e808601526903eddfdd2fdfcdefddf3603b1b19611ea0860152781f7bba27ba116a27efeb6a691bdfa7f7dbbf3b67bec3ea2ba360321b19611ec0860152717ee97efc9efb0fa86fa9a46e6f7dfe7f6dee19611ee0860152600165c2278eaeacb760cf1b03611f0086015279439f5f6efeed9efb0fa89fbfae6f9ee1877d9ee284a9a47e8c0019611f208601526c9fbbca7e7ee97efc9efb0fa87d19611f408601527f5260643581811681036104f057602083015260843581811681036104f0576040611f608601527f83015260a43590811681036104f0576060820152608060c435910152565b9190611f808601527f8260a09103126104f057604051611ef181611d7b565b6080808294611eff8161611fa08601527f1d3e565b8452611f0d60208201611d3e565b6020850152611f1e60408201611d611fc08601527f3e565b6040850152611f2f60608201611d3e565b60608501520135910152565b611fe0860152676f9f9f7cfe7d7eef6f12102c0c1220624c209e0aec080a320d60831b0361200086015260016d848210176117ba5760405280517760901b036120208601527a7ee97efc9efb0fa87cad9fdf7efeae6f7eeaea7dfc9efb0fa89fbf196120408601527f916020850152015190811681036104f057604082015290565b67ffffffffffff6120608601527d7eee9ee845a89ffae49fdffe6fa9a46e6f7eefea9ee023a89f3ffdfe6fa919612080860152655b7f4e487b7160d01b6120a086015260016f0600052603260045260246000fd5b35760741b036120c08601526e07ee97efc9efb0fa86fa9a46e6f6e9607c1b196120e08601527007f7f6be96ee9fe6e7dee9eec38a8a9a4960741b196121008601527d6e7de96f7de9fc6e6f7dee9eec38a8a9a47faeea9ee023a89fdffe6fa9a4196121208601527f8051821015611fdc5760209160051b010190565b919082039182116113c7575661214086015260017305b9190811015611fdc576060020190565b3590760641b036121608601526c07de97dfc9efb0fa8a9a4ae6f9607c1b196121808601527fff821682036104f057565b818102929181159184041417156113c757565b6fff6121a0860152706f9fbfae9edee87e9ee2a0a9a49feb7ead196121c08601527f6020907f6d61782075696e7431323820657863656564656400000000000000006121e08601527b60208201528383116121515750501690565b60405180927f08c379a061220086015263825260206122208601527f600483015282519283602484015260005b8481106121cd575050507fffffffff612240860152641f9fe07c9f196122608601527e604480968601015201168101030190fd5b81810183015186820160440152856122808601527f9350820161218c565b81156121ee570490565b7f4e487b7100000000000000006122a08601526b6000526012600452602460006122c08601527ffdfea164736f6c6343000818000a0000000000000000000000000000000000006122e086015280518083019490945290835261713c9083617386565b506040519161714c604084617386565b600f83526e283ab13634b1a0b63637b1b0ba37b960891b60208401526173d1565b506040516073908161756182396080518160330152f35b61718f848092617386565b617199575f614fcc565b8280fd5b6040513d86823e3d90fd5b8380fd5b816171b691617386565b6171a857835f614f9c565b6040513d84823e3d90fd5b816171d691617386565b6171a857835f614f62565b816171eb91617386565b6171a857835f614f28565b8161720091617386565b6171a857835f614eee565b8161721591617386565b6171a857835f614eb4565b8161722a91617386565b6171a857835f614e7a565b8161723f91617386565b6171a857835f614e40565b8161725491617386565b6171a857835f614e06565b8161726991617386565b6171a857835f614dcc565b8161727e91617386565b6171a857835f614d9b565b5080fd5b8161729791617386565b61728957815f614d61565b6040513d85823e3d90fd5b6172ba9195505f90617386565b5f935f614d2c565b6040513d5f823e3d90fd5b82516001600160a01b0316845286945060209384019390920191600101614cd0565b5f80fd5b634e487b7160e01b5f52603260045260245ffd5b90506020813d602011617339575b8161732260209383617386565b810103126172ef57617333906173bd565b5f614b04565b3d9150617315565b60405162461bcd60e51b815260206004820152601b60248201527f4465706c6f796572313a20496e76616c696420636861696e20494400000000006044820152606490fd5b601f909101601f19168101906001600160401b038211908210176173a957604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036172ef57565b60206174105f93826040519384928180850197805191829101895e840190828201898152815193849201905e010185815203601f198101835282617386565b519082f5906001600160a01b03821615617431578161742e9161746a565b90565b60405162461bcd60e51b815260206004820152601160248201527019195c1b1bde5b595b9d0819985a5b1959607a1b6044820152606490fd5b60205f926174ae600460218695604051958691601160f91b828401528051918291018484015e810163111d101160e11b838201520301601b19810185520183617386565b6175296040516174bf604082617386565b6002815261088b60f21b602082015261751b6040519384926174fa602085019763e0e9ad4f60e01b895260606024870152608486019061753c565b6001600160a01b03909216604485015283820360231901606485015261753c565b03601f198101835282617386565b51906a636f6e736f6c652e6c6f675afa50565b805180835260209291819084018484015e5f828201840152601f01601f191601019056fe60808060405260043610156011575f80fd5b5f3560e01c637104ddb2146023575f80fd5b346062575f3660031901126062577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fdfea164736f6c634300081c000a0000000000000000000000004e1dcf7ad4e460cfd30791ccc4f9c8a4f820ec6700000000000000000000000041675c099f32341bf84bfc5382af534df5c7461a000000000000000000000000fd0732dc9e303f09fcef3a7388ad10a83459ec9900000000000000000000000000000000000000000000000000000000000003e7
Deployed Bytecode
0x60808060405260043610156011575f80fd5b5f3560e01c637104ddb2146023575f80fd5b346062575f3660031901126062577f00000000000000000000000025f51cb76efd41ad236ff5563da32b8d57bea3736001600160a01b03168152602090f35b5f80fdfea164736f6c634300081c000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.