false
false

Contract Address Details

0x5e1ee626420a354bbc9a95fea1bad4492e3bcb86

Contract Name
ArbMulticall2
Creator
0xa4b1cd–f7984d at 0xaa57d6–6b56c9
Balance
0 ETH ( )
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
67857780
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
ArbMulticall2




Optimization enabled
true
Compiler version
v0.8.7+commit.e28d00a7




Optimization runs
100
Verified at
2023-08-24T23:26:33.523000Z

contracts/rpc-utils/MulticallV2.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
pragma experimental ABIEncoderV2;

import "arbos-precompiles/arbos/builtin/ArbSys.sol";

// implementation from https://github.com/makerdao/multicall/blob/1e1b44362640820bef92d0ccf5eeee25d9b41474/src/Multicall2.sol MIT License

/// @title Multicall2 - Aggregate results from multiple read-only function calls
/// @author Michael Elliot <[email protected]>
/// @author Joshua Levine <[email protected]>
/// @author Nick Johnson <[email protected]>

contract Multicall2 {
    struct Call {
        address target;
        bytes callData;
    }
    struct Result {
        bool success;
        bytes returnData;
    }

    function aggregate(Call[] memory calls)
        public
        returns (uint256 blockNumber, bytes[] memory returnData)
    {
        blockNumber = block.number;
        returnData = new bytes[](calls.length);
        for (uint256 i = 0; i < calls.length; i++) {
            (bool success, bytes memory ret) = calls[i].target.call(calls[i].callData);
            require(success, "Multicall aggregate: call failed");
            returnData[i] = ret;
        }
    }

    function blockAndAggregate(Call[] memory calls)
        public
        returns (
            uint256 blockNumber,
            bytes32 blockHash,
            Result[] memory returnData
        )
    {
        (blockNumber, blockHash, returnData) = tryBlockAndAggregate(true, calls);
    }

    function getBlockHash(uint256 blockNumber) public view returns (bytes32 blockHash) {
        blockHash = blockhash(blockNumber);
    }

    function getBlockNumber() public view returns (uint256 blockNumber) {
        blockNumber = block.number;
    }

    function getCurrentBlockCoinbase() public view returns (address coinbase) {
        coinbase = block.coinbase;
    }

    function getCurrentBlockDifficulty() public view returns (uint256 difficulty) {
        difficulty = block.difficulty;
    }

    function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) {
        gaslimit = block.gaslimit;
    }

    function getCurrentBlockTimestamp() public view returns (uint256 timestamp) {
        timestamp = block.timestamp;
    }

    function getEthBalance(address addr) public view returns (uint256 balance) {
        balance = addr.balance;
    }

    function getLastBlockHash() public view returns (bytes32 blockHash) {
        blockHash = blockhash(block.number - 1);
    }

    function tryAggregate(bool requireSuccess, Call[] memory calls)
        public
        returns (Result[] memory returnData)
    {
        returnData = new Result[](calls.length);
        for (uint256 i = 0; i < calls.length; i++) {
            (bool success, bytes memory ret) = calls[i].target.call(calls[i].callData);

            if (requireSuccess) {
                require(success, "Multicall2 aggregate: call failed");
            }

            returnData[i] = Result(success, ret);
        }
    }

    function tryBlockAndAggregate(bool requireSuccess, Call[] memory calls)
        public
        returns (
            uint256 blockNumber,
            bytes32 blockHash,
            Result[] memory returnData
        )
    {
        blockNumber = block.number;
        blockHash = blockhash(block.number);
        returnData = tryAggregate(requireSuccess, calls);
    }
}

/// @title Arbitrum Multicall2 - Multicall2 contracts with L1 and L2 block numbers
contract ArbMulticall2 {
    struct Call {
        address target;
        bytes callData;
    }
    struct Result {
        bool success;
        bytes returnData;
    }

    function aggregate(Call[] memory calls)
        public
        returns (uint256 blockNumber, bytes[] memory returnData)
    {
        blockNumber = ArbSys(address(100)).arbBlockNumber();
        returnData = new bytes[](calls.length);
        for (uint256 i = 0; i < calls.length; i++) {
            (bool success, bytes memory ret) = calls[i].target.call(calls[i].callData);
            require(success, "Multicall aggregate: call failed");
            returnData[i] = ret;
        }
    }

    function blockAndAggregate(Call[] memory calls)
        public
        returns (
            uint256 blockNumber,
            bytes32 blockHash,
            Result[] memory returnData
        )
    {
        (blockNumber, blockHash, returnData) = tryBlockAndAggregate(true, calls);
    }

    function getBlockHash(uint256 blockNumber) public view returns (bytes32 blockHash) {
        blockHash = blockhash(blockNumber);
    }

    function getBlockNumber() public view returns (uint256 blockNumber) {
        blockNumber = ArbSys(address(100)).arbBlockNumber();
    }

    function getL1BlockNumber() public view returns (uint256 l1BlockNumber) {
        l1BlockNumber = block.number;
    }

    function getCurrentBlockCoinbase() public view returns (address coinbase) {
        coinbase = block.coinbase;
    }

    function getCurrentBlockDifficulty() public view returns (uint256 difficulty) {
        difficulty = block.difficulty;
    }

    function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) {
        gaslimit = block.gaslimit;
    }

    function getCurrentBlockTimestamp() public view returns (uint256 timestamp) {
        timestamp = block.timestamp;
    }

    function getEthBalance(address addr) public view returns (uint256 balance) {
        balance = addr.balance;
    }

    function getLastBlockHash() public view returns (bytes32 blockHash) {
        blockHash = blockhash(ArbSys(address(100)).arbBlockNumber() - 1);
    }

    function tryAggregate(bool requireSuccess, Call[] memory calls)
        public
        returns (Result[] memory returnData)
    {
        returnData = new Result[](calls.length);
        for (uint256 i = 0; i < calls.length; i++) {
            (bool success, bytes memory ret) = calls[i].target.call(calls[i].callData);

            if (requireSuccess) {
                require(success, "Multicall2 aggregate: call failed");
            }

            returnData[i] = Result(success, ret);
        }
    }

    function tryBlockAndAggregate(bool requireSuccess, Call[] memory calls)
        public
        returns (
            uint256 blockNumber,
            bytes32 blockHash,
            Result[] memory returnData
        )
    {
        blockNumber = ArbSys(address(100)).arbBlockNumber();
        blockHash = blockhash(ArbSys(address(100)).arbBlockNumber());
        returnData = tryAggregate(requireSuccess, calls);
    }
}
        

arbos-precompiles/arbos/builtin/ArbSys.sol

pragma solidity >=0.6.9 <0.9.0;

/**
 * @title Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. Exposes a variety of system-level functionality.
 */
interface ArbSys {
    /**
     * @notice Get internal version number identifying an ArbOS build
     * @return version number as int
     */
    function arbOSVersion() external pure returns (uint256);

    function arbChainID() external view returns (uint256);

    /**
     * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)
     * @return block number as int
     */
    function arbBlockNumber() external view returns (uint256);

    /**
     * @notice Send given amount of Eth to dest from sender.
     * This is a convenience function, which is equivalent to calling sendTxToL1 with empty calldataForL1.
     * @param destination recipient address on L1
     * @return unique identifier for this L2-to-L1 transaction.
     */
    function withdrawEth(address destination) external payable returns (uint256);

    /**
     * @notice Send a transaction to L1
     * @param destination recipient address on L1
     * @param calldataForL1 (optional) calldata for L1 contract call
     * @return a unique identifier for this L2-to-L1 transaction.
     */
    function sendTxToL1(address destination, bytes calldata calldataForL1)
        external
        payable
        returns (uint256);

    /**
     * @notice get the number of transactions issued by the given external account or the account sequence number of the given contract
     * @param account target account
     * @return the number of transactions issued by the given external account or the account sequence number of the given contract
     */
    function getTransactionCount(address account) external view returns (uint256);

    /**
     * @notice get the value of target L2 storage slot
     * This function is only callable from address 0 to prevent contracts from being able to call it
     * @param account target account
     * @param index target index of storage slot
     * @return stotage value for the given account at the given index
     */
    function getStorageAt(address account, uint256 index) external view returns (uint256);

    /**
     * @notice check if current call is coming from l1
     * @return true if the caller of this was called directly from L1
     */
    function isTopLevelCall() external view returns (bool);

    /**
     * @notice check if the caller (of this caller of this) is an aliased L1 contract address
     * @return true iff the caller's address is an alias for an L1 contract address
     */
    function wasMyCallersAddressAliased() external view returns (bool);

    /**
     * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing
     * @return address of the caller's caller, without applying L1 contract address aliasing
     */
    function myCallersAddressWithoutAliasing() external view returns (address);

    /**
     * @notice map L1 sender contract address to its L2 alias
     * @param sender sender address
     * @param dest destination address
     * @return aliased sender address
     */
    function mapL1SenderContractAddressToL2Alias(address sender, address dest)
        external
        pure
        returns (address);

    /**
     * @notice get the caller's amount of available storage gas
     * @return amount of storage gas available to the caller
     */
    function getStorageGasAvailable() external view returns (uint256);

    event L2ToL1Transaction(
        address caller,
        address indexed destination,
        uint256 indexed uniqueId,
        uint256 indexed batchNumber,
        uint256 indexInBatch,
        uint256 arbBlockNum,
        uint256 ethBlockNum,
        uint256 timestamp,
        uint256 callvalue,
        bytes data
    );
}
          

Contract ABI

[{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"blockNumber","internalType":"uint256"},{"type":"bytes[]","name":"returnData","internalType":"bytes[]"}],"name":"aggregate","inputs":[{"type":"tuple[]","name":"calls","internalType":"struct ArbMulticall2.Call[]","components":[{"type":"address","name":"target","internalType":"address"},{"type":"bytes","name":"callData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"blockNumber","internalType":"uint256"},{"type":"bytes32","name":"blockHash","internalType":"bytes32"},{"type":"tuple[]","name":"returnData","internalType":"struct ArbMulticall2.Result[]","components":[{"type":"bool","name":"success","internalType":"bool"},{"type":"bytes","name":"returnData","internalType":"bytes"}]}],"name":"blockAndAggregate","inputs":[{"type":"tuple[]","name":"calls","internalType":"struct ArbMulticall2.Call[]","components":[{"type":"address","name":"target","internalType":"address"},{"type":"bytes","name":"callData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"blockHash","internalType":"bytes32"}],"name":"getBlockHash","inputs":[{"type":"uint256","name":"blockNumber","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"blockNumber","internalType":"uint256"}],"name":"getBlockNumber","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"coinbase","internalType":"address"}],"name":"getCurrentBlockCoinbase","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"difficulty","internalType":"uint256"}],"name":"getCurrentBlockDifficulty","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"gaslimit","internalType":"uint256"}],"name":"getCurrentBlockGasLimit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"timestamp","internalType":"uint256"}],"name":"getCurrentBlockTimestamp","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"balance","internalType":"uint256"}],"name":"getEthBalance","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"l1BlockNumber","internalType":"uint256"}],"name":"getL1BlockNumber","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"blockHash","internalType":"bytes32"}],"name":"getLastBlockHash","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"tuple[]","name":"returnData","internalType":"struct ArbMulticall2.Result[]","components":[{"type":"bool","name":"success","internalType":"bool"},{"type":"bytes","name":"returnData","internalType":"bytes"}]}],"name":"tryAggregate","inputs":[{"type":"bool","name":"requireSuccess","internalType":"bool"},{"type":"tuple[]","name":"calls","internalType":"struct ArbMulticall2.Call[]","components":[{"type":"address","name":"target","internalType":"address"},{"type":"bytes","name":"callData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"blockNumber","internalType":"uint256"},{"type":"bytes32","name":"blockHash","internalType":"bytes32"},{"type":"tuple[]","name":"returnData","internalType":"struct ArbMulticall2.Result[]","components":[{"type":"bool","name":"success","internalType":"bool"},{"type":"bytes","name":"returnData","internalType":"bytes"}]}],"name":"tryBlockAndAggregate","inputs":[{"type":"bool","name":"requireSuccess","internalType":"bool"},{"type":"tuple[]","name":"calls","internalType":"struct ArbMulticall2.Call[]","components":[{"type":"address","name":"target","internalType":"address"},{"type":"bytes","name":"callData","internalType":"bytes"}]}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50610c43806100206000396000f3fe608060405234801561001057600080fd5b50600436106100bf5760003560e01c806372425d9d1161007c57806372425d9d1461014757806386d516e81461014d578063a8b0574e14610153578063b9b3efe914610161578063bce38bd714610167578063c3077fa914610187578063ee82ac5e1461019a57600080fd5b80630f28c97d146100c4578063252dba42146100d957806327e86d6e146100fa578063399542e91461010257806342cbb15c146101245780634d2301cc1461012c575b600080fd5b425b6040519081526020015b60405180910390f35b6100ec6100e73660046108f4565b6101ac565b6040516100d0929190610a7f565b6100c66103a6565b610115610110366004610930565b61042c565b6040516100d093929190610ae9565b6100c661052d565b6100c661013a3660046108d2565b6001600160a01b03163190565b446100c6565b456100c6565b6040514181526020016100d0565b436100c6565b61017a610175366004610930565b6105a6565b6040516100d09190610a6c565b6101156101953660046108f4565b61075f565b6100c66101a8366004610984565b4090565b6000606060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156101ea57600080fd5b505afa1580156101fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610222919061099d565b915082516001600160401b0381111561023d5761023d610bf7565b60405190808252806020026020018201604052801561027057816020015b606081526020019060019003908161025b5790505b50905060005b83518110156103a05760008085838151811061029457610294610be1565b6020026020010151600001516001600160a01b03168684815181106102bb576102bb610be1565b6020026020010151602001516040516102d49190610a50565b6000604051808303816000865af19150503d8060008114610311576040519150601f19603f3d011682016040523d82523d6000602084013e610316565b606091505b50915091508161036d5760405162461bcd60e51b815260206004820181905260248201527f4d756c746963616c6c206167677265676174653a2063616c6c206661696c656460448201526064015b60405180910390fd5b8084848151811061038057610380610be1565b60200260200101819052505050808061039890610bb0565b915050610276565b50915091565b6000600160646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103e457600080fd5b505afa1580156103f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041c919061099d565b6104269190610b69565b40905090565b600080606060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561046b57600080fd5b505afa15801561047f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a3919061099d565b925060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104df57600080fd5b505afa1580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610517919061099d565b40915061052485856105a6565b90509250925092565b600060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561056957600080fd5b505afa15801561057d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a1919061099d565b905090565b606081516001600160401b038111156105c1576105c1610bf7565b60405190808252806020026020018201604052801561060757816020015b6040805180820190915260008152606060208201528152602001906001900390816105df5790505b50905060005b82518110156107585760008084838151811061062b5761062b610be1565b6020026020010151600001516001600160a01b031685848151811061065257610652610be1565b60200260200101516020015160405161066b9190610a50565b6000604051808303816000865af19150503d80600081146106a8576040519150601f19603f3d011682016040523d82523d6000602084013e6106ad565b606091505b5091509150851561070f578161070f5760405162461bcd60e51b815260206004820152602160248201527f4d756c746963616c6c32206167677265676174653a2063616c6c206661696c656044820152601960fa1b6064820152608401610364565b604051806040016040528083151581526020018281525084848151811061073857610738610be1565b60200260200101819052505050808061075090610bb0565b91505061060d565b5092915050565b600080606061076f60018561042c565b9196909550909350915050565b80356001600160a01b038116811461079357600080fd5b919050565b600082601f8301126107a957600080fd5b813560206001600160401b03808311156107c5576107c5610bf7565b8260051b6107d4838201610b39565b8481528381019087850183890186018a10156107ef57600080fd5b600093505b868410156108c55780358581111561080b57600080fd5b89016040601f19828d03810182131561082357600080fd5b61082b610b11565b6108368a850161077c565b8152828401358981111561084957600080fd5b8085019450508d603f85011261085e57600080fd5b898401358981111561087257610872610bf7565b6108828b84601f84011601610b39565b92508083528e8482870101111561089857600080fd5b808486018c85013760009083018b0152808a019190915285525050600193909301929185019185016107f4565b5098975050505050505050565b6000602082840312156108e457600080fd5b6108ed8261077c565b9392505050565b60006020828403121561090657600080fd5b81356001600160401b0381111561091c57600080fd5b61092884828501610798565b949350505050565b6000806040838503121561094357600080fd5b8235801515811461095357600080fd5b915060208301356001600160401b0381111561096e57600080fd5b61097a85828601610798565b9150509250929050565b60006020828403121561099657600080fd5b5035919050565b6000602082840312156109af57600080fd5b5051919050565b600082825180855260208086019550808260051b84010181860160005b84811015610a1757858303601f1901895281518051151584528401516040858501819052610a0381860183610a24565b9a86019a94505050908301906001016109d3565b5090979650505050505050565b60008151808452610a3c816020860160208601610b80565b601f01601f19169290920160200192915050565b60008251610a62818460208701610b80565b9190910192915050565b6020815260006108ed60208301846109b6565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610adb57605f19888703018452610ac9868351610a24565b95509284019290840190600101610aad565b509398975050505050505050565b838152826020820152606060408201526000610b0860608301846109b6565b95945050505050565b604080519081016001600160401b0381118282101715610b3357610b33610bf7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610b6157610b61610bf7565b604052919050565b600082821015610b7b57610b7b610bcb565b500390565b60005b83811015610b9b578181015183820152602001610b83565b83811115610baa576000848401525b50505050565b6000600019821415610bc457610bc4610bcb565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220c2bd56613c4f572d72f2ffe8a62d7401794c77d7a55054211c4f42a98ca8ab7b64736f6c63430008070033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100bf5760003560e01c806372425d9d1161007c57806372425d9d1461014757806386d516e81461014d578063a8b0574e14610153578063b9b3efe914610161578063bce38bd714610167578063c3077fa914610187578063ee82ac5e1461019a57600080fd5b80630f28c97d146100c4578063252dba42146100d957806327e86d6e146100fa578063399542e91461010257806342cbb15c146101245780634d2301cc1461012c575b600080fd5b425b6040519081526020015b60405180910390f35b6100ec6100e73660046108f4565b6101ac565b6040516100d0929190610a7f565b6100c66103a6565b610115610110366004610930565b61042c565b6040516100d093929190610ae9565b6100c661052d565b6100c661013a3660046108d2565b6001600160a01b03163190565b446100c6565b456100c6565b6040514181526020016100d0565b436100c6565b61017a610175366004610930565b6105a6565b6040516100d09190610a6c565b6101156101953660046108f4565b61075f565b6100c66101a8366004610984565b4090565b6000606060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156101ea57600080fd5b505afa1580156101fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610222919061099d565b915082516001600160401b0381111561023d5761023d610bf7565b60405190808252806020026020018201604052801561027057816020015b606081526020019060019003908161025b5790505b50905060005b83518110156103a05760008085838151811061029457610294610be1565b6020026020010151600001516001600160a01b03168684815181106102bb576102bb610be1565b6020026020010151602001516040516102d49190610a50565b6000604051808303816000865af19150503d8060008114610311576040519150601f19603f3d011682016040523d82523d6000602084013e610316565b606091505b50915091508161036d5760405162461bcd60e51b815260206004820181905260248201527f4d756c746963616c6c206167677265676174653a2063616c6c206661696c656460448201526064015b60405180910390fd5b8084848151811061038057610380610be1565b60200260200101819052505050808061039890610bb0565b915050610276565b50915091565b6000600160646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103e457600080fd5b505afa1580156103f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041c919061099d565b6104269190610b69565b40905090565b600080606060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561046b57600080fd5b505afa15801561047f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a3919061099d565b925060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104df57600080fd5b505afa1580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610517919061099d565b40915061052485856105a6565b90509250925092565b600060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561056957600080fd5b505afa15801561057d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a1919061099d565b905090565b606081516001600160401b038111156105c1576105c1610bf7565b60405190808252806020026020018201604052801561060757816020015b6040805180820190915260008152606060208201528152602001906001900390816105df5790505b50905060005b82518110156107585760008084838151811061062b5761062b610be1565b6020026020010151600001516001600160a01b031685848151811061065257610652610be1565b60200260200101516020015160405161066b9190610a50565b6000604051808303816000865af19150503d80600081146106a8576040519150601f19603f3d011682016040523d82523d6000602084013e6106ad565b606091505b5091509150851561070f578161070f5760405162461bcd60e51b815260206004820152602160248201527f4d756c746963616c6c32206167677265676174653a2063616c6c206661696c656044820152601960fa1b6064820152608401610364565b604051806040016040528083151581526020018281525084848151811061073857610738610be1565b60200260200101819052505050808061075090610bb0565b91505061060d565b5092915050565b600080606061076f60018561042c565b9196909550909350915050565b80356001600160a01b038116811461079357600080fd5b919050565b600082601f8301126107a957600080fd5b813560206001600160401b03808311156107c5576107c5610bf7565b8260051b6107d4838201610b39565b8481528381019087850183890186018a10156107ef57600080fd5b600093505b868410156108c55780358581111561080b57600080fd5b89016040601f19828d03810182131561082357600080fd5b61082b610b11565b6108368a850161077c565b8152828401358981111561084957600080fd5b8085019450508d603f85011261085e57600080fd5b898401358981111561087257610872610bf7565b6108828b84601f84011601610b39565b92508083528e8482870101111561089857600080fd5b808486018c85013760009083018b0152808a019190915285525050600193909301929185019185016107f4565b5098975050505050505050565b6000602082840312156108e457600080fd5b6108ed8261077c565b9392505050565b60006020828403121561090657600080fd5b81356001600160401b0381111561091c57600080fd5b61092884828501610798565b949350505050565b6000806040838503121561094357600080fd5b8235801515811461095357600080fd5b915060208301356001600160401b0381111561096e57600080fd5b61097a85828601610798565b9150509250929050565b60006020828403121561099657600080fd5b5035919050565b6000602082840312156109af57600080fd5b5051919050565b600082825180855260208086019550808260051b84010181860160005b84811015610a1757858303601f1901895281518051151584528401516040858501819052610a0381860183610a24565b9a86019a94505050908301906001016109d3565b5090979650505050505050565b60008151808452610a3c816020860160208601610b80565b601f01601f19169290920160200192915050565b60008251610a62818460208701610b80565b9190910192915050565b6020815260006108ed60208301846109b6565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610adb57605f19888703018452610ac9868351610a24565b95509284019290840190600101610aad565b509398975050505050505050565b838152826020820152606060408201526000610b0860608301846109b6565b95945050505050565b604080519081016001600160401b0381118282101715610b3357610b33610bf7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610b6157610b61610bf7565b604052919050565b600082821015610b7b57610b7b610bcb565b500390565b60005b83811015610b9b578181015183820152602001610b83565b83811115610baa576000848401525b50505050565b6000600019821415610bc457610bc4610bcb565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220c2bd56613c4f572d72f2ffe8a62d7401794c77d7a55054211c4f42a98ca8ab7b64736f6c63430008070033