ETH Price: $2,051.78 (-1.20%)

Contract

0xd3A7EBfF71Aa8AEe18967cb6f18f6AB4A6fe8b7e
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Operator225737442025-05-27 11:12:23289 days ago1748344343IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.000075531.44702274
Execute Erc20Tra...225341112025-05-21 22:02:23294 days ago1747864943IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.000104594.91346875
Execute Erc20Tra...225340132025-05-21 21:42:11294 days ago1747863731IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.000111115.21993544
Execute Erc20Tra...225192342025-05-19 19:58:23296 days ago1747684703IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.000122135.73775547
Execute Erc20Tra...224815042025-05-14 12:48:11302 days ago1747226891IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.008940838.84385346
Execute Erc20Tra...224754132025-05-13 16:13:59303 days ago1747152839IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.0044591141.66074805
Grant Role224357512025-05-08 2:06:23308 days ago1746669983IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.000111682.14680942
Execute Erc20Tra...224204562025-05-05 22:17:11310 days ago1746483431IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.000442051.92080558
Execute Erc20Tra...224202972025-05-05 21:44:59310 days ago1746481499IN
0xd3A7EBfF...4A6fe8b7e
0.00324925 ETH0.000090050.44824089
Execute Erc20Tra...224202662025-05-05 21:38:47310 days ago1746481127IN
0xd3A7EBfF...4A6fe8b7e
0.00304987 ETH0.000081360.45352171
Execute Erc20Tra...224202202025-05-05 21:29:35310 days ago1746480575IN
0xd3A7EBfF...4A6fe8b7e
0.00325196 ETH0.000085710.4266346
Execute Erc20Tra...224201452025-05-05 21:14:23310 days ago1746479663IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.000494272.02722404
Execute Erc20Tra...224200712025-05-05 20:59:23310 days ago1746478763IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.000354631.6508194
Execute Erc20Tra...224200412025-05-05 20:53:23310 days ago1746478403IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.00037281.73542765
Execute Erc20Tra...224200172025-05-05 20:48:35310 days ago1746478115IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.000416171.9372828
Execute Erc20Tra...224199892025-05-05 20:42:59310 days ago1746477779IN
0xd3A7EBfF...4A6fe8b7e
0.0032421 ETH0.000143310.62781153
Execute Erc20Tra...224198302025-05-05 20:10:59310 days ago1746475859IN
0xd3A7EBfF...4A6fe8b7e
0 ETH0.000460222.14240509
Execute Erc20Tra...224197962025-05-05 20:03:59310 days ago1746475439IN
0xd3A7EBfF...4A6fe8b7e
0.00304645 ETH0.0001010.51400086
Execute Erc20Tra...224196842025-05-05 19:40:59310 days ago1746474059IN
0xd3A7EBfF...4A6fe8b7e
0.00304131 ETH0.000091430.46527841

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer225341962025-05-21 22:19:35294 days ago1747865975
0xd3A7EBfF...4A6fe8b7e
0.00000821 ETH
Transfer225341962025-05-21 22:19:35294 days ago1747865975
0xd3A7EBfF...4A6fe8b7e
0.00000821 ETH
Deposit225341962025-05-21 22:19:35294 days ago1747865975
0xd3A7EBfF...4A6fe8b7e
0.00082885 ETH
Execute Erc20Tra...225341962025-05-21 22:19:35294 days ago1747865975
0xd3A7EBfF...4A6fe8b7e
0.00082885 ETH
Transfer225341092025-05-21 22:01:59294 days ago1747864919
0xd3A7EBfF...4A6fe8b7e
0.00002018 ETH
Transfer225341092025-05-21 22:01:59294 days ago1747864919
0xd3A7EBfF...4A6fe8b7e
0.00002018 ETH
Deposit225341092025-05-21 22:01:59294 days ago1747864919
0xd3A7EBfF...4A6fe8b7e
0.00203836 ETH
Execute Erc20Tra...225341092025-05-21 22:01:59294 days ago1747864919
0xd3A7EBfF...4A6fe8b7e
0.00203836 ETH
Transfer225340352025-05-21 21:46:35294 days ago1747863995
0xd3A7EBfF...4A6fe8b7e
0.00000804 ETH
Transfer225340352025-05-21 21:46:35294 days ago1747863995
0xd3A7EBfF...4A6fe8b7e
0.00000804 ETH
Deposit225340352025-05-21 21:46:35294 days ago1747863995
0xd3A7EBfF...4A6fe8b7e
0.00080744 ETH
Execute Erc20Tra...225340352025-05-21 21:46:35294 days ago1747863995
0xd3A7EBfF...4A6fe8b7e
0.00080744 ETH
Transfer225340112025-05-21 21:41:47294 days ago1747863707
0xd3A7EBfF...4A6fe8b7e
0.00002064 ETH
Transfer225340112025-05-21 21:41:47294 days ago1747863707
0xd3A7EBfF...4A6fe8b7e
0.00002064 ETH
Deposit225340112025-05-21 21:41:47294 days ago1747863707
0xd3A7EBfF...4A6fe8b7e
0.00204237 ETH
Execute Erc20Tra...225340112025-05-21 21:41:47294 days ago1747863707
0xd3A7EBfF...4A6fe8b7e
0.00204237 ETH
Transfer225339522025-05-21 21:29:59294 days ago1747862999
0xd3A7EBfF...4A6fe8b7e
0.0000075 ETH
Transfer225339522025-05-21 21:29:59294 days ago1747862999
0xd3A7EBfF...4A6fe8b7e
0.0000075 ETH
Deposit225339522025-05-21 21:29:59294 days ago1747862999
0xd3A7EBfF...4A6fe8b7e
0.00080906 ETH
Execute Erc20Tra...225339522025-05-21 21:29:59294 days ago1747862999
0xd3A7EBfF...4A6fe8b7e
0.00080906 ETH
Transfer225339322025-05-21 21:25:59294 days ago1747862759
0xd3A7EBfF...4A6fe8b7e
0.00001979 ETH
Transfer225339322025-05-21 21:25:59294 days ago1747862759
0xd3A7EBfF...4A6fe8b7e
0.00001979 ETH
Deposit225339322025-05-21 21:25:59294 days ago1747862759
0xd3A7EBfF...4A6fe8b7e
0.00200208 ETH
Execute Erc20Tra...225339322025-05-21 21:25:59294 days ago1747862759
0xd3A7EBfF...4A6fe8b7e
0.00200208 ETH
Transfer225338912025-05-21 21:17:47294 days ago1747862267
0xd3A7EBfF...4A6fe8b7e
0.00000817 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DeFiSmartTransfer

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2025-05-05
*/

// File: @uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol


pragma solidity >=0.5.0;

/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
    /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
    /// @dev In the implementation you must pay the pool tokens owed for the swap.
    /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
    /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
    /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
    /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
    /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
    function uniswapV3SwapCallback(
        int256 amount0Delta,
        int256 amount1Delta,
        bytes calldata data
    ) external;
}

// File: @uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol


pragma solidity >=0.7.5;
pragma abicoder v2;


/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface ISwapRouter is IUniswapV3SwapCallback {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);

    struct ExactOutputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);

    struct ExactOutputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// File: @openzeppelin/contracts/interfaces/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)

pragma solidity ^0.8.20;


// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/interfaces/IERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.20;


// File: @openzeppelin/contracts/interfaces/IERC1363.sol


// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)

pragma solidity ^0.8.20;



/**
 * @title IERC1363
 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
 *
 * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
 * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
 */
interface IERC1363 is IERC20, IERC165 {
    /*
     * Note: the ERC-165 identifier for this interface is 0xb0202a11.
     * 0xb0202a11 ===
     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^
     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
     */

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @param data Additional data with no specified format, sent in call to `spender`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.20;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC-20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    /**
     * @dev An operation with an ERC-20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
     */
    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
     */
    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     *
     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
     * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
     * set here.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            safeTransfer(token, to, value);
        } else if (!token.transferAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferFromAndCallRelaxed(
        IERC1363 token,
        address from,
        address to,
        uint256 value,
        bytes memory data
    ) internal {
        if (to.code.length == 0) {
            safeTransferFrom(token, from, to, value);
        } else if (!token.transferFromAndCall(from, to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
     * once without retrying, and relies on the returned value to be true.
     *
     * Reverts if the returned value is other than `true`.
     */
    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            forceApprove(token, to, value);
        } else if (!token.approveAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            // bubble errors
            if iszero(success) {
                let ptr := mload(0x40)
                returndatacopy(ptr, 0, returndatasize())
                revert(ptr, returndatasize())
            }
            returnSize := returndatasize()
            returnValue := mload(0)
        }

        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        bool success;
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            returnSize := returndatasize()
            returnValue := mload(0)
        }
        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
    }
}

// File: @openzeppelin/contracts/access/IAccessControl.sol


// OpenZeppelin Contracts (last updated v5.3.0) (access/IAccessControl.sol)

pragma solidity ^0.8.20;

/**
 * @dev External interface of AccessControl declared to support ERC-165 detection.
 */
interface IAccessControl {
    /**
     * @dev The `account` is missing a role.
     */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);

    /**
     * @dev The caller of a function is not the expected one.
     *
     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
     */
    error AccessControlBadConfirmation();

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted to signal this.
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).
     * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     */
    function renounceRole(bytes32 role, address callerConfirmation) external;
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v5.3.0) (access/AccessControl.sol)

pragma solidity ^0.8.20;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }

    mapping(bytes32 role => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with an {AccessControlUnauthorizedAccount} error including the required role.
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual returns (bool) {
        return _roles[role].hasRole[account];
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
     * is missing `role`.
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address callerConfirmation) public virtual {
        if (callerConfirmation != _msgSender()) {
            revert AccessControlBadConfirmation();
        }

        _revokeRole(role, callerConfirmation);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}

// File: contracts/Operator.sol


pragma solidity 0.8.20;


// Operator contract that extends OpenZeppelin's AccessControl for role management
contract Operator is AccessControl {
    // Define bytes32 identifiers for each role
    bytes32 public constant OPERATOR_ROLE =
        keccak256(abi.encodePacked("OPERATOR_ROLE"));

    error UnAuthorized();

    constructor(address _additionalAdmin, address[] memory _operators) {
        require(_additionalAdmin != address(0), "Additional admin cannot be zero address");
        require(_additionalAdmin != msg.sender, "Additional admin cannot be the deployer");

        // Grant DEFAULT_ADMIN_ROLE, only the DEFAULT_ADMIN_ROLE can add and remove operators
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(DEFAULT_ADMIN_ROLE, _additionalAdmin);

        // Setup roles for initial operators
        for (uint256 i; i < _operators.length; ) {
            require(_operators[i] != address(0), "Operator address cannot be zero");
            _grantRole(OPERATOR_ROLE, _operators[i]);
            unchecked {
                ++i;
            }
        }
    }

    // Modifier to restrict function access to users with the operator role
    modifier onlyOperator() {
        if (!hasRole(OPERATOR_ROLE, msg.sender)) {
            revert UnAuthorized();
        }
        _;
    }

    // Function to add a new operator, restricted to users with the admin role
    function addOperator(
        address _operator
    ) external onlyRole(DEFAULT_ADMIN_ROLE) {
        grantRole(OPERATOR_ROLE, _operator);
    }

    // Function to remove an existing operator, restricted to users with the admin role
    function removeOperator(
        address _operator
    ) external onlyRole(DEFAULT_ADMIN_ROLE) {
        revokeRole(OPERATOR_ROLE, _operator);
    }
}

// File: contracts/DeFiSmartContract.sol


pragma solidity 0.8.20;




interface IWETH is IERC20 {
    function deposit() external payable;

    function withdraw(uint256 wad) external;
}

contract DeFiSmartTransfer is Operator {
    using SafeERC20 for IERC20;

    ISwapRouter public immutable swapRouter;
    address public immutable WETH;
    address public constant feeReceiver =
        0xD0E698815BFE8D2Ea1fDA3Fa0748646adbd3e9bF;

    uint256 public constant MIN_ETH_TRANSFER = 0.00001 ether;
    uint256 public constant MAX_ETH_TRANSFER = 1000 ether;

    // Constructor that initializes the Operator contract with the provided operators
    constructor(
        address _additionalAdmin,
        address[] memory _operators,
        ISwapRouter _swapRouter,
        address weth
    ) Operator(_additionalAdmin, _operators) {
        swapRouter = _swapRouter;
        WETH = weth;
    }

    // A structure to define the properties of a transfer
    struct NativeTransfer {
        bytes32 id; // Unique identifier for the transfer
        uint256 amount; // Amount of tokens to be transferred
        uint256 fee; // Transfer fee amount
        address payable receiver; // Address to receive the transfer amount
    }

    // A structure to define the properties of a transfer
    struct ERC20Transfer {
        bytes32 id; // Unique identifier for the transfer
        uint256 amount; // Amount of tokens to be transferred
        uint256 fee; // Transfer fee amount
        address payable payer; // Address of the payer. It is marked as payable so we can refund the dust remained from the swap
        address payable receiver; // Address to receive the transfer amount
        address token; // Token address (address(0) for native tokens)
    }

    struct Path {
        address[] tokens;
        uint24[] fees;
    }

    struct Swap {
        uint256 amountOut;
        uint256 amountInMaximum;
    }

    // Event to be emitted when a native transfer is completed
    event NativeSmartTransferComplete(bytes32 id);
    // Event to be emitted when an ERC-20 transfer is completed
    event Erc20SmartTransferComplete(bytes32 id);

    // Custom Errors
    error AmountValueMismatch(uint256 amount, uint256 value);
    error ReceiverAddressIsNull();
    error InvalidFeeAmount(uint256 fee, uint256 amount);
    error OutOfRangeAmount(
        uint256 amount,
        uint256 minAllowed,
        uint256 maxAllowed
    );
    error NativeTransferFailed(address receiver, uint256 amount);
    error InvalidSwapPath(Path path);

    // To receive ETH from the WETH's withdraw function (it won't work without it)
    receive() external payable {}

    // Function to execute a transfer of native tokens (such as ETH)
    function executeNativeTransfer(
        NativeTransfer memory transfer
    ) external payable {
        // Input Validation
        if (transfer.amount != msg.value) {
            revert AmountValueMismatch({
                amount: transfer.amount,
                value: msg.value
            });
        }
        if ((transfer.receiver == address(0))) {
            revert ReceiverAddressIsNull();
        }
        if (transfer.fee > transfer.amount) {
            revert InvalidFeeAmount({
                fee: transfer.fee,
                amount: transfer.amount
            });
        }
        if (
            (transfer.amount < MIN_ETH_TRANSFER) ||
            (transfer.amount > MAX_ETH_TRANSFER)
        ) {
            revert OutOfRangeAmount({
                amount: transfer.amount,
                minAllowed: MIN_ETH_TRANSFER,
                maxAllowed: MAX_ETH_TRANSFER
            });
        }

        // Transfer the specified amount minus the fee to the receiver
        (bool success, ) = transfer.receiver.call{
            value: transfer.amount - transfer.fee
        }("");
        if (!success) {
            revert NativeTransferFailed({
                receiver: transfer.receiver,
                amount: transfer.amount - transfer.fee
            });
        }

        // Emit an event to indicate the transfer is complete
        emit NativeSmartTransferComplete(transfer.id);
    }

    // Function to execute a transfer of ERC20 tokens
    // This function can only be called by an operator (role enforced by `onlyOperator` modifier)
    function executeErc20Transfer(
        ERC20Transfer memory transfer
    ) external onlyOperator {
        // Transfer the specified amount minus the fee from the payer to the receiver
        IERC20(transfer.token).safeTransferFrom(
            transfer.payer,
            transfer.receiver,
            transfer.amount - transfer.fee
        );
        // Withdraw the fee from the payer
        IERC20(transfer.token).safeTransferFrom(
            transfer.payer,
            address(this),
            transfer.fee
        );

        // Emit an event to indicate the transfer is complete
        emit Erc20SmartTransferComplete(transfer.id);
    }

    function executeErc20TransferWithSwap(
        ERC20Transfer memory transfer,
        Swap memory swap,
        Path memory path
    ) external payable onlyOperator {
        if (path.fees.length + 1 != path.tokens.length) {
            revert InvalidSwapPath({path: path});
        }

        IERC20(path.tokens[0]).safeTransferFrom(
            transfer.payer,
            address(this),
            swap.amountInMaximum
        );
        IERC20(path.tokens[0]).approve(
            address(swapRouter),
            swap.amountInMaximum
        );

        ISwapRouter.ExactOutputParams memory params = ISwapRouter
            .ExactOutputParams({
                path: encodePath(path),
                recipient: address(this),
                deadline: block.timestamp,
                amountOut: swap.amountOut,
                amountInMaximum: swap.amountInMaximum
            });

        uint256 amountIn = swapRouter.exactOutput(params);

        // If the swap did not require the full amountInMaximum to achieve the exact amountOut then we refund msg.sender and approve the router to spend 0.
        if (amountIn < swap.amountInMaximum) {
            IERC20(path.tokens[0]).approve(
                address(this),
                swap.amountInMaximum - amountIn
            );
            IERC20(path.tokens[0]).safeTransferFrom(
                address(this),
                transfer.payer,
                swap.amountInMaximum - amountIn
            );
        }

        IERC20(transfer.token).approve(
            address(this),
            swap.amountOut - transfer.fee
        );
        IERC20(transfer.token).safeTransferFrom(
            address(this),
            transfer.receiver,
            swap.amountOut - transfer.fee
        );

        // Emit an event to indicate the transfer is complete
        emit Erc20SmartTransferComplete(transfer.id);
    }

    function executeErc20TransferWithNativeSwap(
        ERC20Transfer memory transfer,
        Swap memory swap,
        Path memory path
    ) external payable {
        IWETH(WETH).deposit{value: msg.value}();
        if (path.fees.length + 1 != path.tokens.length) {
            revert InvalidSwapPath({path: path});
        }

        IERC20(WETH).approve(address(swapRouter), swap.amountInMaximum);

        ISwapRouter.ExactOutputParams memory params = ISwapRouter
            .ExactOutputParams({
                path: encodePath(path),
                recipient: address(this),
                deadline: block.timestamp,
                amountOut: swap.amountOut,
                amountInMaximum: swap.amountInMaximum
            });

        uint256 amountIn = swapRouter.exactOutput(params);

        // If the swap did not require the full amountInMaximum to achieve the exact amountOut then we refund msg.sender and approve the router to spend 0.
        if (amountIn < swap.amountInMaximum) {
            IWETH(path.tokens[0]).withdraw(swap.amountInMaximum - amountIn);
            (bool success, ) = transfer.payer.call{
                value: swap.amountInMaximum - amountIn
            }("");
            require(success, "Dust refund failed");
        }

        IERC20(transfer.token).approve(
            address(this),
            swap.amountOut - transfer.fee
        );
        IERC20(transfer.token).safeTransferFrom(
            address(this),
            transfer.receiver,
            swap.amountOut - transfer.fee
        );

        // Emit an event to indicate the transfer is complete
        emit Erc20SmartTransferComplete(transfer.id);
    }

    // Enable the ADMIN to withdraw funds in this contract
    function withdraw(address token) external onlyRole(DEFAULT_ADMIN_ROLE) {
        if (token == address(0)) {
            payable(feeReceiver).transfer(address(this).balance);
        } else {
            uint256 balance = IERC20(token).balanceOf(address(this));
            IERC20(token).safeTransfer(feeReceiver, balance);
        }
    }

    function refund(
        address token,
        address payable receiver
    ) external onlyRole(DEFAULT_ADMIN_ROLE) {
        uint256 balance = IERC20(token).balanceOf(address(this));
        IERC20(token).safeTransfer(receiver, balance);
    }

    function encodePath(
        Path memory path
    ) internal pure returns (bytes memory encoded) {
        uint i = path.fees.length - 1;
        while (i >= 0) {
            encoded = bytes.concat(
                encoded,
                abi.encodePacked(path.tokens[i + 1])
            );
            encoded = bytes.concat(encoded, abi.encodePacked(path.fees[i]));
            if (i == 0) {
                break;
            }
            i--;
        }
        encoded = bytes.concat(encoded, abi.encodePacked(path.tokens[0]));
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_additionalAdmin","type":"address"},{"internalType":"address[]","name":"_operators","type":"address[]"},{"internalType":"contract ISwapRouter","name":"_swapRouter","type":"address"},{"internalType":"address","name":"weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"AmountValueMismatch","type":"error"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InvalidFeeAmount","type":"error"},{"inputs":[{"components":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint24[]","name":"fees","type":"uint24[]"}],"internalType":"struct DeFiSmartTransfer.Path","name":"path","type":"tuple"}],"name":"InvalidSwapPath","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeTransferFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAllowed","type":"uint256"},{"internalType":"uint256","name":"maxAllowed","type":"uint256"}],"name":"OutOfRangeAmount","type":"error"},{"inputs":[],"name":"ReceiverAddressIsNull","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UnAuthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"Erc20SmartTransferComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"NativeSmartTransferComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ETH_TRANSFER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_ETH_TRANSFER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address payable","name":"payer","type":"address"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"}],"internalType":"struct DeFiSmartTransfer.ERC20Transfer","name":"transfer","type":"tuple"}],"name":"executeErc20Transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address payable","name":"payer","type":"address"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"}],"internalType":"struct DeFiSmartTransfer.ERC20Transfer","name":"transfer","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"internalType":"struct DeFiSmartTransfer.Swap","name":"swap","type":"tuple"},{"components":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint24[]","name":"fees","type":"uint24[]"}],"internalType":"struct DeFiSmartTransfer.Path","name":"path","type":"tuple"}],"name":"executeErc20TransferWithNativeSwap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address payable","name":"payer","type":"address"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"}],"internalType":"struct DeFiSmartTransfer.ERC20Transfer","name":"transfer","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"internalType":"struct DeFiSmartTransfer.Swap","name":"swap","type":"tuple"},{"components":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint24[]","name":"fees","type":"uint24[]"}],"internalType":"struct DeFiSmartTransfer.Path","name":"path","type":"tuple"}],"name":"executeErc20TransferWithSwap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address payable","name":"receiver","type":"address"}],"internalType":"struct DeFiSmartTransfer.NativeTransfer","name":"transfer","type":"tuple"}],"name":"executeNativeTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address payable","name":"receiver","type":"address"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801562000010575f80fd5b50604051620036913803806200369183398181016040528101906200003691906200063a565b83835f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620000a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a0906200074c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200011a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200011190620007e0565b60405180910390fd5b6200012e5f801b33620002b560201b60201c565b50620001435f801b83620002b560201b60201c565b505f5b815181101562000240575f73ffffffffffffffffffffffffffffffffffffffff168282815181106200017d576200017c62000800565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603620001de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d5906200087b565b60405180910390fd5b62000233604051602001620001f390620008f3565b604051602081830303815290604052805190602001208383815181106200021f576200021e62000800565b5b6020026020010151620002b560201b60201c565b5080600101905062000146565b5050508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505050505062000909565b5f620002c88383620003b060201b60201c565b620003a65760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620003426200041360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050620003aa565b5f90505b92915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000456826200042b565b9050919050565b62000468816200044a565b811462000473575f80fd5b50565b5f8151905062000486816200045d565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620004d88262000490565b810181811067ffffffffffffffff82111715620004fa57620004f9620004a0565b5b80604052505050565b5f6200050e6200041a565b90506200051c8282620004cd565b919050565b5f67ffffffffffffffff8211156200053e576200053d620004a0565b5b602082029050602081019050919050565b5f80fd5b5f62000569620005638462000521565b62000503565b905080838252602082019050602084028301858111156200058f576200058e6200054f565b5b835b81811015620005bc5780620005a7888262000476565b84526020840193505060208101905062000591565b5050509392505050565b5f82601f830112620005dd57620005dc6200048c565b5b8151620005ef84826020860162000553565b91505092915050565b5f62000604826200044a565b9050919050565b6200061681620005f8565b811462000621575f80fd5b50565b5f8151905062000634816200060b565b92915050565b5f805f806080858703121562000655576200065462000423565b5b5f620006648782880162000476565b945050602085015167ffffffffffffffff81111562000688576200068762000427565b5b6200069687828801620005c6565b9350506040620006a98782880162000624565b9250506060620006bc8782880162000476565b91505092959194509250565b5f82825260208201905092915050565b7f4164646974696f6e616c2061646d696e2063616e6e6f74206265207a65726f205f8201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b5f62000734602783620006c8565b91506200074182620006d8565b604082019050919050565b5f6020820190508181035f830152620007658162000726565b9050919050565b7f4164646974696f6e616c2061646d696e2063616e6e6f742062652074686520645f8201527f65706c6f79657200000000000000000000000000000000000000000000000000602082015250565b5f620007c8602783620006c8565b9150620007d5826200076c565b604082019050919050565b5f6020820190508181035f830152620007f981620007ba565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f70657261746f7220616464726573732063616e6e6f74206265207a65726f005f82015250565b5f62000863601f83620006c8565b915062000870826200082d565b602082019050919050565b5f6020820190508181035f830152620008948162000855565b9050919050565b5f81905092915050565b7f4f50455241544f525f524f4c45000000000000000000000000000000000000005f82015250565b5f620008db600d836200089b565b9150620008e882620008a5565b600d82019050919050565b5f620008ff82620008cd565b9150819050919050565b60805160a051612d3c620009555f395f8181610bce01528181610ca4015261168c01525f8181610ce001528181610db40152818161120c015281816112e001526116c80152612d3c5ff3fe60806040526004361061012d575f3560e01c80637e66520f116100aa578063ac8a584a1161006e578063ac8a584a146103ae578063ad5c4648146103d6578063b3f0067414610400578063c31c9c071461042a578063d547741f14610454578063f5b541a61461047c57610134565b80637e66520f146102e8578063891e0d0b1461030457806391d14854146103205780639870d7fe1461035c578063a217fddf1461038457610134565b80632904027b116100f15780632904027b1461022c5780632f2ff15d1461024857806336568abe1461027057806351cff8d9146102985780635e30b8a6146102c057610134565b806301ffc9a71461013857806307dd0e21146101745780631a16d88b1461019e578063248a9ca3146101c85780632841b8da1461020457610134565b3661013457005b5f80fd5b348015610143575f80fd5b5061015e60048036038101906101599190611d4a565b6104a6565b60405161016b9190611d8f565b60405180910390f35b34801561017f575f80fd5b5061018861051f565b6040516101959190611dc0565b60405180910390f35b3480156101a9575f80fd5b506101b261052c565b6040516101bf9190611dc0565b60405180910390f35b3480156101d3575f80fd5b506101ee60048036038101906101e99190611e0c565b610536565b6040516101fb9190611e46565b60405180910390f35b34801561020f575f80fd5b5061022a6004803603810190610225919061204b565b610552565b005b610246600480360381019061024191906120eb565b610678565b005b348015610253575f80fd5b5061026e60048036038101906102699190612116565b61091b565b005b34801561027b575f80fd5b5061029660048036038101906102919190612116565b61093d565b005b3480156102a3575f80fd5b506102be60048036038101906102b99190612154565b6109b8565b005b3480156102cb575f80fd5b506102e660048036038101906102e1919061217f565b610b14565b005b61030260048036038101906102fd919061244f565b610bcc565b005b61031e6004803603810190610319919061244f565b6110c2565b005b34801561032b575f80fd5b5061034660048036038101906103419190612116565b6115a5565b6040516103539190611d8f565b60405180910390f35b348015610367575f80fd5b50610382600480360381019061037d9190612154565b611608565b005b34801561038f575f80fd5b50610398611646565b6040516103a59190611e46565b60405180910390f35b3480156103b9575f80fd5b506103d460048036038101906103cf9190612154565b61164c565b005b3480156103e1575f80fd5b506103ea61168a565b6040516103f791906124cc565b60405180910390f35b34801561040b575f80fd5b506104146116ae565b60405161042191906124cc565b60405180910390f35b348015610435575f80fd5b5061043e6116c6565b60405161044b9190612540565b60405180910390f35b34801561045f575f80fd5b5061047a60048036038101906104759190612116565b6116ea565b005b348015610487575f80fd5b5061049061170c565b60405161049d9190611e46565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610518575061051782611734565b5b9050919050565b683635c9adc5dea0000081565b6509184e72a00081565b5f805f8381526020019081526020015f20600101549050919050565b610580604051602001610564906125ad565b60405160208183030381529060405280519060200120336115a5565b6105b6576040517fbe24598300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61060281606001518260800151836040015184602001516105d791906125ee565b8460a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b61063b81606001513083604001518460a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862815f015160405161066d9190611e46565b60405180910390a150565b348160200151146106c6578060200151346040517f1d078cfc0000000000000000000000000000000000000000000000000000000081526004016106bd929190612621565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff160361072f576040517f18f7d3f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602001518160400151111561078657806040015181602001516040517f18731f9b00000000000000000000000000000000000000000000000000000000815260040161077d929190612621565b60405180910390fd5b6509184e72a000816020015110806107aa5750683635c9adc5dea000008160200151115b156108035780602001516509184e72a000683635c9adc5dea000006040517fc5edea450000000000000000000000000000000000000000000000000000000081526004016107fa93929190612648565b60405180910390fd5b5f816060015173ffffffffffffffffffffffffffffffffffffffff168260400151836020015161083391906125ee565b60405161083f906126aa565b5f6040518083038185875af1925050503d805f8114610879576040519150601f19603f3d011682016040523d82523d5f602084013e61087e565b606091505b50509050806108dd578160600151826040015183602001516108a091906125ee565b6040517fa5b05eec0000000000000000000000000000000000000000000000000000000081526004016108d49291906126de565b60405180910390fd5b7fbead3314911dea300cd80ff22fc82ef6b9c7c7e9fe5ebb1fc20d258b18a1408f825f015160405161090f9190611e46565b60405180910390a15050565b61092482610536565b61092d8161181f565b6109378383611833565b50505050565b61094561191c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109a9576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b38282611923565b505050565b5f801b6109c48161181f565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a545773d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610a4e573d5f803e3d5ffd5b50610b10565b5f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a8e91906124cc565b602060405180830381865afa158015610aa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610acd9190612719565b9050610b0e73d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf828573ffffffffffffffffffffffffffffffffffffffff16611a0c9092919063ffffffff16565b505b5050565b5f801b610b208161181f565b5f8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b5a91906124cc565b602060405180830381865afa158015610b75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b999190612719565b9050610bc683828673ffffffffffffffffffffffffffffffffffffffff16611a0c9092919063ffffffff16565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015610c32575f80fd5b505af1158015610c44573d5f803e3d5ffd5b5050505050805f0151516001826020015151610c609190612744565b14610ca257806040517ffdd040c2000000000000000000000000000000000000000000000000000000008152600401610c999190612926565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000000000000000000000000000000000000000000084602001516040518363ffffffff1660e01b8152600401610d21929190612946565b6020604051808303815f875af1158015610d3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d619190612997565b505f6040518060a00160405280610d7784611a8b565b81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152602001845f01518152602001846020015181525090505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f28c0498836040518263ffffffff1660e01b8152600401610e0b9190612abe565b6020604051808303815f875af1158015610e27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4b9190612719565b90508360200151811015610fa857825f01515f81518110610e6f57610e6e612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d828660200151610ea291906125ee565b6040518263ffffffff1660e01b8152600401610ebe9190611dc0565b5f604051808303815f87803b158015610ed5575f80fd5b505af1158015610ee7573d5f803e3d5ffd5b505050505f856060015173ffffffffffffffffffffffffffffffffffffffff16828660200151610f1791906125ee565b604051610f23906126aa565b5f6040518083038185875af1925050503d805f8114610f5d576040519150601f19603f3d011682016040523d82523d5f602084013e610f62565b606091505b5050905080610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612b65565b60405180910390fd5b505b8460a0015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308760400151875f0151610fdc91906125ee565b6040518363ffffffff1660e01b8152600401610ff9929190612946565b6020604051808303815f875af1158015611015573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110399190612997565b506110813086608001518760400151875f015161105691906125ee565b8860a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862855f01516040516110b39190611e46565b60405180910390a15050505050565b6110f06040516020016110d4906125ad565b60405160208183030381529060405280519060200120336115a5565b611126576040517fbe24598300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f015151600182602001515161113d9190612744565b1461117f57806040517ffdd040c20000000000000000000000000000000000000000000000000000000081526004016111769190612926565b60405180910390fd5b6111d18360600151308460200151845f01515f815181106111a3576111a2612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b805f01515f815181106111e7576111e6612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000000000000000000000000000000000000000000084602001516040518363ffffffff1660e01b815260040161124d929190612946565b6020604051808303815f875af1158015611269573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128d9190612997565b505f6040518060a001604052806112a384611a8b565b81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152602001845f01518152602001846020015181525090505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f28c0498836040518263ffffffff1660e01b81526004016113379190612abe565b6020604051808303815f875af1158015611353573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113779190612719565b9050836020015181101561148b57825f01515f8151811061139b5761139a612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308387602001516113cf91906125ee565b6040518363ffffffff1660e01b81526004016113ec929190612946565b6020604051808303815f875af1158015611408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061142c9190612997565b5061148a30866060015183876020015161144691906125ee565b865f01515f8151811061145c5761145b612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b5b8460a0015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308760400151875f01516114bf91906125ee565b6040518363ffffffff1660e01b81526004016114dc929190612946565b6020604051808303815f875af11580156114f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151c9190612997565b506115643086608001518760400151875f015161153991906125ee565b8860a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862855f01516040516115969190611e46565b60405180910390a15050505050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f801b6116148161181f565b611642604051602001611626906125ad565b604051602081830303815290604052805190602001208361091b565b5050565b5f801b81565b5f801b6116588161181f565b61168660405160200161166a906125ad565b60405160208183030381529060405280519060200120836116ea565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b73d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf81565b7f000000000000000000000000000000000000000000000000000000000000000081565b6116f382610536565b6116fc8161181f565b6117068383611923565b50505050565b60405160200161171b906125ad565b6040516020818303038152906040528051906020012081565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611819848573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016117d293929190612b83565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bf8565b50505050565b6118308161182b61191c565b611c93565b50565b5f61183e83836115a5565b6119125760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506118af61191c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611916565b5f90505b92915050565b5f33905090565b5f61192e83836115a5565b15611a02575f805f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061199f61191c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611a06565b5f90505b92915050565b611a86838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611a3f929190612946565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bf8565b505050565b60605f6001836020015151611aa091906125ee565b90505b5f8110611b925781835f0151600183611abc9190612744565b81518110611acd57611acc612ade565b5b6020026020010151604051602001611ae59190612bfd565b604051602081830303815290604052604051602001611b05929190612c47565b60405160208183030381529060405291508183602001518281518110611b2e57611b2d612ade565b5b6020026020010151604051602001611b469190612c9e565b604051602081830303815290604052604051602001611b66929190612c47565b60405160208183030381529060405291505f810315611b92578080611b8a90612cb8565b915050611aa3565b81835f01515f81518110611ba957611ba8612ade565b5b6020026020010151604051602001611bc19190612bfd565b604051602081830303815290604052604051602001611be1929190612c47565b604051602081830303815290604052915050919050565b5f8060205f8451602086015f885af180611c17576040513d5f823e3d81fd5b3d92505f519150505f8214611c30576001811415611c4b565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b15611c8d57836040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611c8491906124cc565b60405180910390fd5b50505050565b611c9d82826115a5565b611ce05780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611cd7929190612cdf565b60405180910390fd5b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d2981611cf5565b8114611d33575f80fd5b50565b5f81359050611d4481611d20565b92915050565b5f60208284031215611d5f57611d5e611ced565b5b5f611d6c84828501611d36565b91505092915050565b5f8115159050919050565b611d8981611d75565b82525050565b5f602082019050611da25f830184611d80565b92915050565b5f819050919050565b611dba81611da8565b82525050565b5f602082019050611dd35f830184611db1565b92915050565b5f819050919050565b611deb81611dd9565b8114611df5575f80fd5b50565b5f81359050611e0681611de2565b92915050565b5f60208284031215611e2157611e20611ced565b5b5f611e2e84828501611df8565b91505092915050565b611e4081611dd9565b82525050565b5f602082019050611e595f830184611e37565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ea982611e63565b810181811067ffffffffffffffff82111715611ec857611ec7611e73565b5b80604052505050565b5f611eda611ce4565b9050611ee68282611ea0565b919050565b5f80fd5b611ef881611da8565b8114611f02575f80fd5b50565b5f81359050611f1381611eef565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f4282611f19565b9050919050565b611f5281611f38565b8114611f5c575f80fd5b50565b5f81359050611f6d81611f49565b92915050565b5f611f7d82611f19565b9050919050565b611f8d81611f73565b8114611f97575f80fd5b50565b5f81359050611fa881611f84565b92915050565b5f60c08284031215611fc357611fc2611e5f565b5b611fcd60c0611ed1565b90505f611fdc84828501611df8565b5f830152506020611fef84828501611f05565b602083015250604061200384828501611f05565b604083015250606061201784828501611f5f565b606083015250608061202b84828501611f5f565b60808301525060a061203f84828501611f9a565b60a08301525092915050565b5f60c082840312156120605761205f611ced565b5b5f61206d84828501611fae565b91505092915050565b5f6080828403121561208b5761208a611e5f565b5b6120956080611ed1565b90505f6120a484828501611df8565b5f8301525060206120b784828501611f05565b60208301525060406120cb84828501611f05565b60408301525060606120df84828501611f5f565b60608301525092915050565b5f60808284031215612100576120ff611ced565b5b5f61210d84828501612076565b91505092915050565b5f806040838503121561212c5761212b611ced565b5b5f61213985828601611df8565b925050602061214a85828601611f9a565b9150509250929050565b5f6020828403121561216957612168611ced565b5b5f61217684828501611f9a565b91505092915050565b5f806040838503121561219557612194611ced565b5b5f6121a285828601611f9a565b92505060206121b385828601611f5f565b9150509250929050565b5f604082840312156121d2576121d1611e5f565b5b6121dc6040611ed1565b90505f6121eb84828501611f05565b5f8301525060206121fe84828501611f05565b60208301525092915050565b5f80fd5b5f67ffffffffffffffff82111561222857612227611e73565b5b602082029050602081019050919050565b5f80fd5b5f61224f61224a8461220e565b611ed1565b9050808382526020820190506020840283018581111561227257612271612239565b5b835b8181101561229b57806122878882611f9a565b845260208401935050602081019050612274565b5050509392505050565b5f82601f8301126122b9576122b861220a565b5b81356122c984826020860161223d565b91505092915050565b5f67ffffffffffffffff8211156122ec576122eb611e73565b5b602082029050602081019050919050565b5f62ffffff82169050919050565b612314816122fd565b811461231e575f80fd5b50565b5f8135905061232f8161230b565b92915050565b5f612347612342846122d2565b611ed1565b9050808382526020820190506020840283018581111561236a57612369612239565b5b835b81811015612393578061237f8882612321565b84526020840193505060208101905061236c565b5050509392505050565b5f82601f8301126123b1576123b061220a565b5b81356123c1848260208601612335565b91505092915050565b5f604082840312156123df576123de611e5f565b5b6123e96040611ed1565b90505f82013567ffffffffffffffff81111561240857612407611eeb565b5b612414848285016122a5565b5f83015250602082013567ffffffffffffffff81111561243757612436611eeb565b5b6124438482850161239d565b60208301525092915050565b5f805f610120848603121561246757612466611ced565b5b5f61247486828701611fae565b93505060c0612485868287016121bd565b92505061010084013567ffffffffffffffff8111156124a7576124a6611cf1565b5b6124b3868287016123ca565b9150509250925092565b6124c681611f73565b82525050565b5f6020820190506124df5f8301846124bd565b92915050565b5f819050919050565b5f6125086125036124fe84611f19565b6124e5565b611f19565b9050919050565b5f612519826124ee565b9050919050565b5f61252a8261250f565b9050919050565b61253a81612520565b82525050565b5f6020820190506125535f830184612531565b92915050565b5f81905092915050565b7f4f50455241544f525f524f4c45000000000000000000000000000000000000005f82015250565b5f612597600d83612559565b91506125a282612563565b600d82019050919050565b5f6125b78261258b565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6125f882611da8565b915061260383611da8565b925082820390508181111561261b5761261a6125c1565b5b92915050565b5f6040820190506126345f830185611db1565b6126416020830184611db1565b9392505050565b5f60608201905061265b5f830186611db1565b6126686020830185611db1565b6126756040830184611db1565b949350505050565b5f81905092915050565b50565b5f6126955f8361267d565b91506126a082612687565b5f82019050919050565b5f6126b48261268a565b9150819050919050565b5f6126c88261250f565b9050919050565b6126d8816126be565b82525050565b5f6040820190506126f15f8301856126cf565b6126fe6020830184611db1565b9392505050565b5f8151905061271381611eef565b92915050565b5f6020828403121561272e5761272d611ced565b5b5f61273b84828501612705565b91505092915050565b5f61274e82611da8565b915061275983611da8565b9250828201905080821115612771576127706125c1565b5b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6127a981611f73565b82525050565b5f6127ba83836127a0565b60208301905092915050565b5f602082019050919050565b5f6127dc82612777565b6127e68185612781565b93506127f183612791565b805f5b8381101561282157815161280888826127af565b9750612813836127c6565b9250506001810190506127f4565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612860816122fd565b82525050565b5f6128718383612857565b60208301905092915050565b5f602082019050919050565b5f6128938261282e565b61289d8185612838565b93506128a883612848565b805f5b838110156128d85781516128bf8882612866565b97506128ca8361287d565b9250506001810190506128ab565b5085935050505092915050565b5f604083015f8301518482035f8601526128ff82826127d2565b915050602083015184820360208601526129198282612889565b9150508091505092915050565b5f6020820190508181035f83015261293e81846128e5565b905092915050565b5f6040820190506129595f8301856124bd565b6129666020830184611db1565b9392505050565b61297681611d75565b8114612980575f80fd5b50565b5f815190506129918161296d565b92915050565b5f602082840312156129ac576129ab611ced565b5b5f6129b984828501612983565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156129f95780820151818401526020810190506129de565b5f8484015250505050565b5f612a0e826129c2565b612a1881856129cc565b9350612a288185602086016129dc565b612a3181611e63565b840191505092915050565b612a4581611da8565b82525050565b5f60a083015f8301518482035f860152612a658282612a04565b9150506020830151612a7a60208601826127a0565b506040830151612a8d6040860182612a3c565b506060830151612aa06060860182612a3c565b506080830151612ab36080860182612a3c565b508091505092915050565b5f6020820190508181035f830152612ad68184612a4b565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b7f4475737420726566756e64206661696c656400000000000000000000000000005f82015250565b5f612b4f601283612b0b565b9150612b5a82612b1b565b602082019050919050565b5f6020820190508181035f830152612b7c81612b43565b9050919050565b5f606082019050612b965f8301866124bd565b612ba360208301856124bd565b612bb06040830184611db1565b949350505050565b5f8160601b9050919050565b5f612bce82612bb8565b9050919050565b5f612bdf82612bc4565b9050919050565b612bf7612bf282611f73565b612bd5565b82525050565b5f612c088284612be6565b60148201915081905092915050565b5f612c21826129c2565b612c2b818561267d565b9350612c3b8185602086016129dc565b80840191505092915050565b5f612c528285612c17565b9150612c5e8284612c17565b91508190509392505050565b5f8160e81b9050919050565b5f612c8082612c6a565b9050919050565b612c98612c93826122fd565b612c76565b82525050565b5f612ca98284612c87565b60038201915081905092915050565b5f612cc282611da8565b91505f8203612cd457612cd36125c1565b5b600182039050919050565b5f604082019050612cf25f8301856124bd565b612cff6020830184611e37565b939250505056fea264697066735822122038775c40a94183684b5c31370f759556571909429bd1b9c9f8153dd97a3bf36964736f6c6343000814003300000000000000000000000072ed7ce76a7bb01ae6af244c561bcc483db13a150000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000003000000000000000000000000aa5dac843057407d5d5d103328a4325cce079677000000000000000000000000615d3b20ec4cf2155c5aa8b7c0faf04bec696eb800000000000000000000000028d3c19a75127dba0acaf7f86030859520791c72

Deployed Bytecode

0x60806040526004361061012d575f3560e01c80637e66520f116100aa578063ac8a584a1161006e578063ac8a584a146103ae578063ad5c4648146103d6578063b3f0067414610400578063c31c9c071461042a578063d547741f14610454578063f5b541a61461047c57610134565b80637e66520f146102e8578063891e0d0b1461030457806391d14854146103205780639870d7fe1461035c578063a217fddf1461038457610134565b80632904027b116100f15780632904027b1461022c5780632f2ff15d1461024857806336568abe1461027057806351cff8d9146102985780635e30b8a6146102c057610134565b806301ffc9a71461013857806307dd0e21146101745780631a16d88b1461019e578063248a9ca3146101c85780632841b8da1461020457610134565b3661013457005b5f80fd5b348015610143575f80fd5b5061015e60048036038101906101599190611d4a565b6104a6565b60405161016b9190611d8f565b60405180910390f35b34801561017f575f80fd5b5061018861051f565b6040516101959190611dc0565b60405180910390f35b3480156101a9575f80fd5b506101b261052c565b6040516101bf9190611dc0565b60405180910390f35b3480156101d3575f80fd5b506101ee60048036038101906101e99190611e0c565b610536565b6040516101fb9190611e46565b60405180910390f35b34801561020f575f80fd5b5061022a6004803603810190610225919061204b565b610552565b005b610246600480360381019061024191906120eb565b610678565b005b348015610253575f80fd5b5061026e60048036038101906102699190612116565b61091b565b005b34801561027b575f80fd5b5061029660048036038101906102919190612116565b61093d565b005b3480156102a3575f80fd5b506102be60048036038101906102b99190612154565b6109b8565b005b3480156102cb575f80fd5b506102e660048036038101906102e1919061217f565b610b14565b005b61030260048036038101906102fd919061244f565b610bcc565b005b61031e6004803603810190610319919061244f565b6110c2565b005b34801561032b575f80fd5b5061034660048036038101906103419190612116565b6115a5565b6040516103539190611d8f565b60405180910390f35b348015610367575f80fd5b50610382600480360381019061037d9190612154565b611608565b005b34801561038f575f80fd5b50610398611646565b6040516103a59190611e46565b60405180910390f35b3480156103b9575f80fd5b506103d460048036038101906103cf9190612154565b61164c565b005b3480156103e1575f80fd5b506103ea61168a565b6040516103f791906124cc565b60405180910390f35b34801561040b575f80fd5b506104146116ae565b60405161042191906124cc565b60405180910390f35b348015610435575f80fd5b5061043e6116c6565b60405161044b9190612540565b60405180910390f35b34801561045f575f80fd5b5061047a60048036038101906104759190612116565b6116ea565b005b348015610487575f80fd5b5061049061170c565b60405161049d9190611e46565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610518575061051782611734565b5b9050919050565b683635c9adc5dea0000081565b6509184e72a00081565b5f805f8381526020019081526020015f20600101549050919050565b610580604051602001610564906125ad565b60405160208183030381529060405280519060200120336115a5565b6105b6576040517fbe24598300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61060281606001518260800151836040015184602001516105d791906125ee565b8460a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b61063b81606001513083604001518460a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862815f015160405161066d9190611e46565b60405180910390a150565b348160200151146106c6578060200151346040517f1d078cfc0000000000000000000000000000000000000000000000000000000081526004016106bd929190612621565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff160361072f576040517f18f7d3f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602001518160400151111561078657806040015181602001516040517f18731f9b00000000000000000000000000000000000000000000000000000000815260040161077d929190612621565b60405180910390fd5b6509184e72a000816020015110806107aa5750683635c9adc5dea000008160200151115b156108035780602001516509184e72a000683635c9adc5dea000006040517fc5edea450000000000000000000000000000000000000000000000000000000081526004016107fa93929190612648565b60405180910390fd5b5f816060015173ffffffffffffffffffffffffffffffffffffffff168260400151836020015161083391906125ee565b60405161083f906126aa565b5f6040518083038185875af1925050503d805f8114610879576040519150601f19603f3d011682016040523d82523d5f602084013e61087e565b606091505b50509050806108dd578160600151826040015183602001516108a091906125ee565b6040517fa5b05eec0000000000000000000000000000000000000000000000000000000081526004016108d49291906126de565b60405180910390fd5b7fbead3314911dea300cd80ff22fc82ef6b9c7c7e9fe5ebb1fc20d258b18a1408f825f015160405161090f9190611e46565b60405180910390a15050565b61092482610536565b61092d8161181f565b6109378383611833565b50505050565b61094561191c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109a9576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b38282611923565b505050565b5f801b6109c48161181f565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a545773d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610a4e573d5f803e3d5ffd5b50610b10565b5f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a8e91906124cc565b602060405180830381865afa158015610aa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610acd9190612719565b9050610b0e73d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf828573ffffffffffffffffffffffffffffffffffffffff16611a0c9092919063ffffffff16565b505b5050565b5f801b610b208161181f565b5f8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b5a91906124cc565b602060405180830381865afa158015610b75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b999190612719565b9050610bc683828673ffffffffffffffffffffffffffffffffffffffff16611a0c9092919063ffffffff16565b50505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015610c32575f80fd5b505af1158015610c44573d5f803e3d5ffd5b5050505050805f0151516001826020015151610c609190612744565b14610ca257806040517ffdd040c2000000000000000000000000000000000000000000000000000000008152600401610c999190612926565b60405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156484602001516040518363ffffffff1660e01b8152600401610d21929190612946565b6020604051808303815f875af1158015610d3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d619190612997565b505f6040518060a00160405280610d7784611a8b565b81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152602001845f01518152602001846020015181525090505f7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663f28c0498836040518263ffffffff1660e01b8152600401610e0b9190612abe565b6020604051808303815f875af1158015610e27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4b9190612719565b90508360200151811015610fa857825f01515f81518110610e6f57610e6e612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d828660200151610ea291906125ee565b6040518263ffffffff1660e01b8152600401610ebe9190611dc0565b5f604051808303815f87803b158015610ed5575f80fd5b505af1158015610ee7573d5f803e3d5ffd5b505050505f856060015173ffffffffffffffffffffffffffffffffffffffff16828660200151610f1791906125ee565b604051610f23906126aa565b5f6040518083038185875af1925050503d805f8114610f5d576040519150601f19603f3d011682016040523d82523d5f602084013e610f62565b606091505b5050905080610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612b65565b60405180910390fd5b505b8460a0015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308760400151875f0151610fdc91906125ee565b6040518363ffffffff1660e01b8152600401610ff9929190612946565b6020604051808303815f875af1158015611015573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110399190612997565b506110813086608001518760400151875f015161105691906125ee565b8860a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862855f01516040516110b39190611e46565b60405180910390a15050505050565b6110f06040516020016110d4906125ad565b60405160208183030381529060405280519060200120336115a5565b611126576040517fbe24598300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f015151600182602001515161113d9190612744565b1461117f57806040517ffdd040c20000000000000000000000000000000000000000000000000000000081526004016111769190612926565b60405180910390fd5b6111d18360600151308460200151845f01515f815181106111a3576111a2612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b805f01515f815181106111e7576111e6612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156484602001516040518363ffffffff1660e01b815260040161124d929190612946565b6020604051808303815f875af1158015611269573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128d9190612997565b505f6040518060a001604052806112a384611a8b565b81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152602001845f01518152602001846020015181525090505f7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663f28c0498836040518263ffffffff1660e01b81526004016113379190612abe565b6020604051808303815f875af1158015611353573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113779190612719565b9050836020015181101561148b57825f01515f8151811061139b5761139a612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308387602001516113cf91906125ee565b6040518363ffffffff1660e01b81526004016113ec929190612946565b6020604051808303815f875af1158015611408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061142c9190612997565b5061148a30866060015183876020015161144691906125ee565b865f01515f8151811061145c5761145b612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b5b8460a0015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308760400151875f01516114bf91906125ee565b6040518363ffffffff1660e01b81526004016114dc929190612946565b6020604051808303815f875af11580156114f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151c9190612997565b506115643086608001518760400151875f015161153991906125ee565b8860a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862855f01516040516115969190611e46565b60405180910390a15050505050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f801b6116148161181f565b611642604051602001611626906125ad565b604051602081830303815290604052805190602001208361091b565b5050565b5f801b81565b5f801b6116588161181f565b61168660405160200161166a906125ad565b60405160208183030381529060405280519060200120836116ea565b5050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b73d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf81565b7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156481565b6116f382610536565b6116fc8161181f565b6117068383611923565b50505050565b60405160200161171b906125ad565b6040516020818303038152906040528051906020012081565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611819848573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016117d293929190612b83565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bf8565b50505050565b6118308161182b61191c565b611c93565b50565b5f61183e83836115a5565b6119125760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506118af61191c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611916565b5f90505b92915050565b5f33905090565b5f61192e83836115a5565b15611a02575f805f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061199f61191c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611a06565b5f90505b92915050565b611a86838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611a3f929190612946565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bf8565b505050565b60605f6001836020015151611aa091906125ee565b90505b5f8110611b925781835f0151600183611abc9190612744565b81518110611acd57611acc612ade565b5b6020026020010151604051602001611ae59190612bfd565b604051602081830303815290604052604051602001611b05929190612c47565b60405160208183030381529060405291508183602001518281518110611b2e57611b2d612ade565b5b6020026020010151604051602001611b469190612c9e565b604051602081830303815290604052604051602001611b66929190612c47565b60405160208183030381529060405291505f810315611b92578080611b8a90612cb8565b915050611aa3565b81835f01515f81518110611ba957611ba8612ade565b5b6020026020010151604051602001611bc19190612bfd565b604051602081830303815290604052604051602001611be1929190612c47565b604051602081830303815290604052915050919050565b5f8060205f8451602086015f885af180611c17576040513d5f823e3d81fd5b3d92505f519150505f8214611c30576001811415611c4b565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b15611c8d57836040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611c8491906124cc565b60405180910390fd5b50505050565b611c9d82826115a5565b611ce05780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611cd7929190612cdf565b60405180910390fd5b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d2981611cf5565b8114611d33575f80fd5b50565b5f81359050611d4481611d20565b92915050565b5f60208284031215611d5f57611d5e611ced565b5b5f611d6c84828501611d36565b91505092915050565b5f8115159050919050565b611d8981611d75565b82525050565b5f602082019050611da25f830184611d80565b92915050565b5f819050919050565b611dba81611da8565b82525050565b5f602082019050611dd35f830184611db1565b92915050565b5f819050919050565b611deb81611dd9565b8114611df5575f80fd5b50565b5f81359050611e0681611de2565b92915050565b5f60208284031215611e2157611e20611ced565b5b5f611e2e84828501611df8565b91505092915050565b611e4081611dd9565b82525050565b5f602082019050611e595f830184611e37565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ea982611e63565b810181811067ffffffffffffffff82111715611ec857611ec7611e73565b5b80604052505050565b5f611eda611ce4565b9050611ee68282611ea0565b919050565b5f80fd5b611ef881611da8565b8114611f02575f80fd5b50565b5f81359050611f1381611eef565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f4282611f19565b9050919050565b611f5281611f38565b8114611f5c575f80fd5b50565b5f81359050611f6d81611f49565b92915050565b5f611f7d82611f19565b9050919050565b611f8d81611f73565b8114611f97575f80fd5b50565b5f81359050611fa881611f84565b92915050565b5f60c08284031215611fc357611fc2611e5f565b5b611fcd60c0611ed1565b90505f611fdc84828501611df8565b5f830152506020611fef84828501611f05565b602083015250604061200384828501611f05565b604083015250606061201784828501611f5f565b606083015250608061202b84828501611f5f565b60808301525060a061203f84828501611f9a565b60a08301525092915050565b5f60c082840312156120605761205f611ced565b5b5f61206d84828501611fae565b91505092915050565b5f6080828403121561208b5761208a611e5f565b5b6120956080611ed1565b90505f6120a484828501611df8565b5f8301525060206120b784828501611f05565b60208301525060406120cb84828501611f05565b60408301525060606120df84828501611f5f565b60608301525092915050565b5f60808284031215612100576120ff611ced565b5b5f61210d84828501612076565b91505092915050565b5f806040838503121561212c5761212b611ced565b5b5f61213985828601611df8565b925050602061214a85828601611f9a565b9150509250929050565b5f6020828403121561216957612168611ced565b5b5f61217684828501611f9a565b91505092915050565b5f806040838503121561219557612194611ced565b5b5f6121a285828601611f9a565b92505060206121b385828601611f5f565b9150509250929050565b5f604082840312156121d2576121d1611e5f565b5b6121dc6040611ed1565b90505f6121eb84828501611f05565b5f8301525060206121fe84828501611f05565b60208301525092915050565b5f80fd5b5f67ffffffffffffffff82111561222857612227611e73565b5b602082029050602081019050919050565b5f80fd5b5f61224f61224a8461220e565b611ed1565b9050808382526020820190506020840283018581111561227257612271612239565b5b835b8181101561229b57806122878882611f9a565b845260208401935050602081019050612274565b5050509392505050565b5f82601f8301126122b9576122b861220a565b5b81356122c984826020860161223d565b91505092915050565b5f67ffffffffffffffff8211156122ec576122eb611e73565b5b602082029050602081019050919050565b5f62ffffff82169050919050565b612314816122fd565b811461231e575f80fd5b50565b5f8135905061232f8161230b565b92915050565b5f612347612342846122d2565b611ed1565b9050808382526020820190506020840283018581111561236a57612369612239565b5b835b81811015612393578061237f8882612321565b84526020840193505060208101905061236c565b5050509392505050565b5f82601f8301126123b1576123b061220a565b5b81356123c1848260208601612335565b91505092915050565b5f604082840312156123df576123de611e5f565b5b6123e96040611ed1565b90505f82013567ffffffffffffffff81111561240857612407611eeb565b5b612414848285016122a5565b5f83015250602082013567ffffffffffffffff81111561243757612436611eeb565b5b6124438482850161239d565b60208301525092915050565b5f805f610120848603121561246757612466611ced565b5b5f61247486828701611fae565b93505060c0612485868287016121bd565b92505061010084013567ffffffffffffffff8111156124a7576124a6611cf1565b5b6124b3868287016123ca565b9150509250925092565b6124c681611f73565b82525050565b5f6020820190506124df5f8301846124bd565b92915050565b5f819050919050565b5f6125086125036124fe84611f19565b6124e5565b611f19565b9050919050565b5f612519826124ee565b9050919050565b5f61252a8261250f565b9050919050565b61253a81612520565b82525050565b5f6020820190506125535f830184612531565b92915050565b5f81905092915050565b7f4f50455241544f525f524f4c45000000000000000000000000000000000000005f82015250565b5f612597600d83612559565b91506125a282612563565b600d82019050919050565b5f6125b78261258b565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6125f882611da8565b915061260383611da8565b925082820390508181111561261b5761261a6125c1565b5b92915050565b5f6040820190506126345f830185611db1565b6126416020830184611db1565b9392505050565b5f60608201905061265b5f830186611db1565b6126686020830185611db1565b6126756040830184611db1565b949350505050565b5f81905092915050565b50565b5f6126955f8361267d565b91506126a082612687565b5f82019050919050565b5f6126b48261268a565b9150819050919050565b5f6126c88261250f565b9050919050565b6126d8816126be565b82525050565b5f6040820190506126f15f8301856126cf565b6126fe6020830184611db1565b9392505050565b5f8151905061271381611eef565b92915050565b5f6020828403121561272e5761272d611ced565b5b5f61273b84828501612705565b91505092915050565b5f61274e82611da8565b915061275983611da8565b9250828201905080821115612771576127706125c1565b5b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6127a981611f73565b82525050565b5f6127ba83836127a0565b60208301905092915050565b5f602082019050919050565b5f6127dc82612777565b6127e68185612781565b93506127f183612791565b805f5b8381101561282157815161280888826127af565b9750612813836127c6565b9250506001810190506127f4565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612860816122fd565b82525050565b5f6128718383612857565b60208301905092915050565b5f602082019050919050565b5f6128938261282e565b61289d8185612838565b93506128a883612848565b805f5b838110156128d85781516128bf8882612866565b97506128ca8361287d565b9250506001810190506128ab565b5085935050505092915050565b5f604083015f8301518482035f8601526128ff82826127d2565b915050602083015184820360208601526129198282612889565b9150508091505092915050565b5f6020820190508181035f83015261293e81846128e5565b905092915050565b5f6040820190506129595f8301856124bd565b6129666020830184611db1565b9392505050565b61297681611d75565b8114612980575f80fd5b50565b5f815190506129918161296d565b92915050565b5f602082840312156129ac576129ab611ced565b5b5f6129b984828501612983565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156129f95780820151818401526020810190506129de565b5f8484015250505050565b5f612a0e826129c2565b612a1881856129cc565b9350612a288185602086016129dc565b612a3181611e63565b840191505092915050565b612a4581611da8565b82525050565b5f60a083015f8301518482035f860152612a658282612a04565b9150506020830151612a7a60208601826127a0565b506040830151612a8d6040860182612a3c565b506060830151612aa06060860182612a3c565b506080830151612ab36080860182612a3c565b508091505092915050565b5f6020820190508181035f830152612ad68184612a4b565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b7f4475737420726566756e64206661696c656400000000000000000000000000005f82015250565b5f612b4f601283612b0b565b9150612b5a82612b1b565b602082019050919050565b5f6020820190508181035f830152612b7c81612b43565b9050919050565b5f606082019050612b965f8301866124bd565b612ba360208301856124bd565b612bb06040830184611db1565b949350505050565b5f8160601b9050919050565b5f612bce82612bb8565b9050919050565b5f612bdf82612bc4565b9050919050565b612bf7612bf282611f73565b612bd5565b82525050565b5f612c088284612be6565b60148201915081905092915050565b5f612c21826129c2565b612c2b818561267d565b9350612c3b8185602086016129dc565b80840191505092915050565b5f612c528285612c17565b9150612c5e8284612c17565b91508190509392505050565b5f8160e81b9050919050565b5f612c8082612c6a565b9050919050565b612c98612c93826122fd565b612c76565b82525050565b5f612ca98284612c87565b60038201915081905092915050565b5f612cc282611da8565b91505f8203612cd457612cd36125c1565b5b600182039050919050565b5f604082019050612cf25f8301856124bd565b612cff6020830184611e37565b939250505056fea264697066735822122038775c40a94183684b5c31370f759556571909429bd1b9c9f8153dd97a3bf36964736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000072ed7ce76a7bb01ae6af244c561bcc483db13a150000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000003000000000000000000000000aa5dac843057407d5d5d103328a4325cce079677000000000000000000000000615d3b20ec4cf2155c5aa8b7c0faf04bec696eb800000000000000000000000028d3c19a75127dba0acaf7f86030859520791c72

-----Decoded View---------------
Arg [0] : _additionalAdmin (address): 0x72eD7cE76A7BB01ae6Af244C561bcc483DB13a15
Arg [1] : _operators (address[]): 0xAa5dAC843057407D5D5D103328A4325cce079677,0x615d3B20Ec4cf2155C5AA8B7c0FaF04BeC696eB8,0x28D3C19a75127dba0ACaf7f86030859520791C72
Arg [2] : _swapRouter (address): 0xE592427A0AEce92De3Edee1F18E0157C05861564
Arg [3] : weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000072ed7ce76a7bb01ae6af244c561bcc483db13a15
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 000000000000000000000000aa5dac843057407d5d5d103328a4325cce079677
Arg [6] : 000000000000000000000000615d3b20ec4cf2155c5aa8b7c0faf04bec696eb8
Arg [7] : 00000000000000000000000028d3c19a75127dba0acaf7f86030859520791c72


Deployed Bytecode Sourcemap

37611:9821:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30904:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37935:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37872:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32184:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41855:670;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40228:1465;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32616:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33753:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46262:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46615:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44479:1715;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42533:1938;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31200:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37004:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30512:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37249:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37738:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37774:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37692:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33047:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35773:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30904:204;30989:4;31028:32;31013:47;;;:11;:47;;;;:87;;;;31064:36;31088:11;31064:23;:36::i;:::-;31013:87;31006:94;;30904:204;;;:::o;37935:53::-;37978:10;37935:53;:::o;37872:56::-;37915:13;37872:56;:::o;32184:122::-;32249:7;32276:6;:12;32283:4;32276:12;;;;;;;;;;;:22;;;32269:29;;32184:122;;;:::o;41855:670::-;36813:34;35832:33;;;;;;;:::i;:::-;;;;;;;;;;;;;35822:44;;;;;;36836:10;36813:7;:34::i;:::-;36808:89;;36871:14;;;;;;;;;;;;;;36808:89;42052:156:::1;42106:8;:14;;;42135:8;:17;;;42185:8;:12;;;42167:8;:15;;;:30;;;;:::i;:::-;42059:8;:14;;;42052:39;;;;:156;;;;;;:::i;:::-;42263:134;42317:8;:14;;;42354:4;42374:8;:12;;;42270:8;:14;;;42263:39;;;;:134;;;;;;:::i;:::-;42478:39;42505:8;:11;;;42478:39;;;;;;:::i;:::-;;;;;;;;41855:670:::0;:::o;40228:1465::-;40387:9;40368:8;:15;;;:28;40364:181;;40467:8;:15;;;40508:9;40420:113;;;;;;;;;;;;:::i;:::-;;;;;;;;40364:181;40589:1;40560:31;;:8;:17;;;:31;;;40555:96;;40616:23;;;;;;;;;;;;;;40555:96;40680:8;:15;;;40665:8;:12;;;:30;40661:181;;;40760:8;:12;;;40799:8;:15;;;40719:111;;;;;;;;;;;;:::i;:::-;;;;;;;;40661:181;37915:13;40871:8;:15;;;:34;40870:89;;;;37978:10;40924:8;:15;;;:34;40870:89;40852:322;;;41037:8;:15;;;37915:13;37978:10;40993:169;;;;;;;;;;;;;:::i;:::-;;;;;;;;40852:322;41259:12;41277:8;:17;;;:22;;41339:8;:12;;;41321:8;:15;;;:30;;;;:::i;:::-;41277:89;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41258:108;;;41382:7;41377:188;;41463:8;:17;;;41525:8;:12;;;41507:8;:15;;;:30;;;;:::i;:::-;41413:140;;;;;;;;;;;;:::i;:::-;;;;;;;;41377:188;41645:40;41673:8;:11;;;41645:40;;;;;;:::i;:::-;;;;;;;;40324:1369;40228:1465;:::o;32616:138::-;32690:18;32703:4;32690:12;:18::i;:::-;30796:16;30807:4;30796:10;:16::i;:::-;32721:25:::1;32732:4;32738:7;32721:10;:25::i;:::-;;32616:138:::0;;;:::o;33753:251::-;33869:12;:10;:12::i;:::-;33847:34;;:18;:34;;;33843:104;;33905:30;;;;;;;;;;;;;;33843:104;33959:37;33971:4;33977:18;33959:11;:37::i;:::-;;33753:251;;:::o;46262:345::-;30557:4;46313:18;;30796:16;30807:4;30796:10;:16::i;:::-;46365:1:::1;46348:19;;:5;:19;;::::0;46344:256:::1;;37821:42;46384:29;;:52;46414:21;46384:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;46344:256;;;46469:15;46494:5;46487:23;;;46519:4;46487:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46469:56;;46540:48;37821:42;46580:7;46547:5;46540:26;;;;:48;;;;;:::i;:::-;46454:146;46344:256;46262:345:::0;;:::o;46615:251::-;30557:4;46715:18;;30796:16;30807:4;30796:10;:16::i;:::-;46746:15:::1;46771:5;46764:23;;;46796:4;46764:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46746:56;;46813:45;46840:8;46850:7;46820:5;46813:26;;;;:45;;;;;:::i;:::-;46735:131;46615:251:::0;;;:::o;44479:1715::-;44658:4;44652:19;;;44679:9;44652:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44730:4;:11;;;:18;44725:1;44706:4;:9;;;:16;:20;;;;:::i;:::-;:42;44702:111;;44795:4;44772:29;;;;;;;;;;;:::i;:::-;;;;;;;;44702:111;44832:4;44825:20;;;44854:10;44867:4;:20;;;44825:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44901:43;44947:288;;;;;;;;45016:16;45027:4;45016:10;:16::i;:::-;44947:288;;;;45070:4;44947:288;;;;;;45104:15;44947:288;;;;45149:4;:14;;;44947:288;;;;45199:4;:20;;;44947:288;;;44901:334;;45248:16;45267:10;:22;;;45290:6;45267:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45248:49;;45482:4;:20;;;45471:8;:31;45467:309;;;45525:4;:11;;;45537:1;45525:14;;;;;;;;:::i;:::-;;;;;;;;45519:30;;;45573:8;45550:4;:20;;;:31;;;;:::i;:::-;45519:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45598:12;45616:8;:14;;;:19;;45684:8;45661:4;:20;;;:31;;;;:::i;:::-;45616:95;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45597:114;;;45734:7;45726:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45504:272;45467:309;45795:8;:14;;;45788:30;;;45841:4;45878:8;:12;;;45861:4;:14;;;:29;;;;:::i;:::-;45788:113;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45912:154;45974:4;45994:8;:17;;;46043:8;:12;;;46026:4;:14;;;:29;;;;:::i;:::-;45919:8;:14;;;45912:39;;;;:154;;;;;;:::i;:::-;46147:39;46174:8;:11;;;46147:39;;;;;;:::i;:::-;;;;;;;;44641:1553;;44479:1715;;;:::o;42533:1938::-;36813:34;35832:33;;;;;;;:::i;:::-;;;;;;;;;;;;;35822:44;;;;;;36836:10;36813:7;:34::i;:::-;36808:89;;36871:14;;;;;;;;;;;;;;36808:89;42741:4:::1;:11;;;:18;42736:1;42717:4;:9;;;:16;:20;;;;:::i;:::-;:42;42713:111;;42806:4;42783:29;;;;;;;;;;;:::i;:::-;;;;;;;;42713:111;42836:142;42890:8;:14;;;42927:4;42947;:20;;;42843:4;:11;;;42855:1;42843:14;;;;;;;;:::i;:::-;;;;;;;;42836:39;;;;:142;;;;;;:::i;:::-;42996:4;:11;;;43008:1;42996:14;;;;;;;;:::i;:::-;;;;;;;;42989:30;;;43042:10;43068:4;:20;;;42989:110;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43112:43;43158:288;;;;;;;;43227:16;43238:4;43227:10;:16::i;:::-;43158:288;;;;43281:4;43158:288;;;;;;43315:15;43158:288;;;;43360:4;:14;;;43158:288;;;;43410:4;:20;;;43158:288;;::::0;43112:334:::1;;43459:16;43478:10;:22;;;43501:6;43478:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43459:49;;43693:4;:20;;;43682:8;:31;43678:375;;;43737:4;:11;;;43749:1;43737:14;;;;;;;;:::i;:::-;;;;;;;;43730:30;;;43787:4;43834:8;43811:4;:20;;;:31;;;;:::i;:::-;43730:127;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43872:169;43938:4;43962:8;:14;;;44018:8;43995:4;:20;;;:31;;;;:::i;:::-;43879:4;:11;;;43891:1;43879:14;;;;;;;;:::i;:::-;;;;;;;;43872:39;;;;:169;;;;;;:::i;:::-;43678:375;44072:8;:14;;;44065:30;;;44118:4;44155:8;:12;;;44138:4;:14;;;:29;;;;:::i;:::-;44065:113;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44189:154;44251:4;44271:8;:17;;;44320:8;:12;;;44303:4;:14;;;:29;;;;:::i;:::-;44196:8;:14;;;44189:39;;;;:154;;;;;;:::i;:::-;44424:39;44451:8;:11;;;44424:39;;;;;;:::i;:::-;;;;;;;;42702:1769;;42533:1938:::0;;;:::o;31200:138::-;31277:4;31301:6;:12;31308:4;31301:12;;;;;;;;;;;:20;;:29;31322:7;31301:29;;;;;;;;;;;;;;;;;;;;;;;;;31294:36;;31200:138;;;;:::o;37004:148::-;30557:4;37078:18;;30796:16;30807:4;30796:10;:16::i;:::-;37109:35:::1;35832:33;;;;;;;:::i;:::-;;;;;;;;;;;;;35822:44;;;;;;37134:9;37109;:35::i;:::-;37004:148:::0;;:::o;30512:49::-;30557:4;30512:49;;;:::o;37249:152::-;30557:4;37326:18;;30796:16;30807:4;30796:10;:16::i;:::-;37357:36:::1;35832:33;;;;;;;:::i;:::-;;;;;;;;;;;;;35822:44;;;;;;37383:9;37357:10;:36::i;:::-;37249:152:::0;;:::o;37738:29::-;;;:::o;37774:89::-;37821:42;37774:89;:::o;37692:39::-;;;:::o;33047:140::-;33122:18;33135:4;33122:12;:18::i;:::-;30796:16;30807:4;30796:10;:16::i;:::-;33153:26:::1;33165:4;33171:7;33153:11;:26::i;:::-;;33047:140:::0;;;:::o;35773:93::-;35832:33;;;;;;;:::i;:::-;;;;;;;;;;;;;35822:44;;;;;;35773:93;:::o;28240:148::-;28316:4;28355:25;28340:40;;;:11;:40;;;;28333:47;;28240:148;;;:::o;14337:190::-;14438:81;14458:5;14480;:18;;;14501:4;14507:2;14511:5;14465:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14438:19;:81::i;:::-;14337:190;;;;:::o;31553:105::-;31620:30;31631:4;31637:12;:10;:12::i;:::-;31620:10;:30::i;:::-;31553:105;:::o;34630:324::-;34707:4;34729:22;34737:4;34743:7;34729;:22::i;:::-;34724:223;;34800:4;34768:6;:12;34775:4;34768:12;;;;;;;;;;;:20;;:29;34789:7;34768:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;34851:12;:10;:12::i;:::-;34824:40;;34842:7;34824:40;;34836:4;34824:40;;;;;;;;;;34886:4;34879:11;;;;34724:223;34930:5;34923:12;;34630:324;;;;;:::o;27137:98::-;27190:7;27217:10;27210:17;;27137:98;:::o;35200:325::-;35278:4;35299:22;35307:4;35313:7;35299;:22::i;:::-;35295:223;;;35370:5;35338:6;:12;35345:4;35338:12;;;;;;;;;;;:20;;:29;35359:7;35338:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;35422:12;:10;:12::i;:::-;35395:40;;35413:7;35395:40;;35407:4;35395:40;;;;;;;;;;35457:4;35450:11;;;;35295:223;35501:5;35494:12;;35200:325;;;;;:::o;13930:162::-;14013:71;14033:5;14055;:14;;;14072:2;14076:5;14040:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14013:19;:71::i;:::-;13930:162;;;:::o;46874:555::-;46951:20;46984:6;47012:1;46993:4;:9;;;:16;:20;;;;:::i;:::-;46984:29;;47024:322;47036:1;47031;:6;47024:322;;47095:7;47138:4;:11;;;47154:1;47150;:5;;;;:::i;:::-;47138:18;;;;;;;;:::i;:::-;;;;;;;;47121:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;47064:108;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47054:118;;47210:7;47236:4;:9;;;47246:1;47236:12;;;;;;;;:::i;:::-;;;;;;;;47219:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;47197:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47187:63;;47274:1;47269;:6;47265:52;47296:5;47265:52;47331:3;;;;;:::i;:::-;;;;47024:322;;;47379:7;47405:4;:11;;;47417:1;47405:14;;;;;;;;:::i;:::-;;;;;;;;47388:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;47366:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47356:65;;46973:456;46874:555;;;:::o;21221:738::-;21302:18;21331:19;21471:4;21468:1;21461:4;21455:11;21448:4;21442;21438:15;21435:1;21428:5;21421;21416:60;21530:7;21520:180;;21575:4;21569:11;21621:16;21618:1;21613:3;21598:40;21668:16;21663:3;21656:29;21520:180;21728:16;21714:30;;21779:1;21773:8;21758:23;;21386:406;21822:1;21808:10;:15;:68;;21875:1;21860:11;:16;;21808:68;;;21856:1;21834:5;21826:26;;;:31;21808:68;21804:148;;;21933:5;21900:40;;;;;;;;;;;:::i;:::-;;;;;;;;21804:148;21291:668;;21221:738;;:::o;31794:201::-;31883:22;31891:4;31897:7;31883;:22::i;:::-;31878:110;;31962:7;31971:4;31929:47;;;;;;;;;;;;:::i;:::-;;;;;;;;31878:110;31794:201;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:77::-;1990:7;2019:5;2008:16;;1953:77;;;:::o;2036:122::-;2109:24;2127:5;2109:24;:::i;:::-;2102:5;2099:35;2089:63;;2148:1;2145;2138:12;2089:63;2036:122;:::o;2164:139::-;2210:5;2248:6;2235:20;2226:29;;2264:33;2291:5;2264:33;:::i;:::-;2164:139;;;;:::o;2309:329::-;2368:6;2417:2;2405:9;2396:7;2392:23;2388:32;2385:119;;;2423:79;;:::i;:::-;2385:119;2543:1;2568:53;2613:7;2604:6;2593:9;2589:22;2568:53;:::i;:::-;2558:63;;2514:117;2309:329;;;;:::o;2644:118::-;2731:24;2749:5;2731:24;:::i;:::-;2726:3;2719:37;2644:118;;:::o;2768:222::-;2861:4;2899:2;2888:9;2884:18;2876:26;;2912:71;2980:1;2969:9;2965:17;2956:6;2912:71;:::i;:::-;2768:222;;;;:::o;2996:117::-;3105:1;3102;3095:12;3119:102;3160:6;3211:2;3207:7;3202:2;3195:5;3191:14;3187:28;3177:38;;3119:102;;;:::o;3227:180::-;3275:77;3272:1;3265:88;3372:4;3369:1;3362:15;3396:4;3393:1;3386:15;3413:281;3496:27;3518:4;3496:27;:::i;:::-;3488:6;3484:40;3626:6;3614:10;3611:22;3590:18;3578:10;3575:34;3572:62;3569:88;;;3637:18;;:::i;:::-;3569:88;3677:10;3673:2;3666:22;3456:238;3413:281;;:::o;3700:129::-;3734:6;3761:20;;:::i;:::-;3751:30;;3790:33;3818:4;3810:6;3790:33;:::i;:::-;3700:129;;;:::o;3835:117::-;3944:1;3941;3934:12;3958:122;4031:24;4049:5;4031:24;:::i;:::-;4024:5;4021:35;4011:63;;4070:1;4067;4060:12;4011:63;3958:122;:::o;4086:139::-;4132:5;4170:6;4157:20;4148:29;;4186:33;4213:5;4186:33;:::i;:::-;4086:139;;;;:::o;4231:126::-;4268:7;4308:42;4301:5;4297:54;4286:65;;4231:126;;;:::o;4363:104::-;4408:7;4437:24;4455:5;4437:24;:::i;:::-;4426:35;;4363:104;;;:::o;4473:138::-;4554:32;4580:5;4554:32;:::i;:::-;4547:5;4544:43;4534:71;;4601:1;4598;4591:12;4534:71;4473:138;:::o;4617:155::-;4671:5;4709:6;4696:20;4687:29;;4725:41;4760:5;4725:41;:::i;:::-;4617:155;;;;:::o;4778:96::-;4815:7;4844:24;4862:5;4844:24;:::i;:::-;4833:35;;4778:96;;;:::o;4880:122::-;4953:24;4971:5;4953:24;:::i;:::-;4946:5;4943:35;4933:63;;4992:1;4989;4982:12;4933:63;4880:122;:::o;5008:139::-;5054:5;5092:6;5079:20;5070:29;;5108:33;5135:5;5108:33;:::i;:::-;5008:139;;;;:::o;5199:1247::-;5279:5;5323:4;5311:9;5306:3;5302:19;5298:30;5295:117;;;5331:79;;:::i;:::-;5295:117;5430:21;5446:4;5430:21;:::i;:::-;5421:30;;5508:1;5548:49;5593:3;5584:6;5573:9;5569:22;5548:49;:::i;:::-;5541:4;5534:5;5530:16;5523:75;5461:148;5670:2;5711:49;5756:3;5747:6;5736:9;5732:22;5711:49;:::i;:::-;5704:4;5697:5;5693:16;5686:75;5619:153;5830:2;5871:49;5916:3;5907:6;5896:9;5892:22;5871:49;:::i;:::-;5864:4;5857:5;5853:16;5846:75;5782:150;5992:2;6033:57;6086:3;6077:6;6066:9;6062:22;6033:57;:::i;:::-;6026:4;6019:5;6015:16;6008:83;5942:160;6165:3;6207:57;6260:3;6251:6;6240:9;6236:22;6207:57;:::i;:::-;6200:4;6193:5;6189:16;6182:83;6112:164;6336:3;6378:49;6423:3;6414:6;6403:9;6399:22;6378:49;:::i;:::-;6371:4;6364:5;6360:16;6353:75;6286:153;5199:1247;;;;:::o;6452:392::-;6542:6;6591:3;6579:9;6570:7;6566:23;6562:33;6559:120;;;6598:79;;:::i;:::-;6559:120;6718:1;6743:84;6819:7;6810:6;6799:9;6795:22;6743:84;:::i;:::-;6733:94;;6689:148;6452:392;;;;:::o;6897:914::-;6978:5;7022:4;7010:9;7005:3;7001:19;6997:30;6994:117;;;7030:79;;:::i;:::-;6994:117;7129:21;7145:4;7129:21;:::i;:::-;7120:30;;7207:1;7247:49;7292:3;7283:6;7272:9;7268:22;7247:49;:::i;:::-;7240:4;7233:5;7229:16;7222:75;7160:148;7369:2;7410:49;7455:3;7446:6;7435:9;7431:22;7410:49;:::i;:::-;7403:4;7396:5;7392:16;7385:75;7318:153;7529:2;7570:49;7615:3;7606:6;7595:9;7591:22;7570:49;:::i;:::-;7563:4;7556:5;7552:16;7545:75;7481:150;7694:2;7735:57;7788:3;7779:6;7768:9;7764:22;7735:57;:::i;:::-;7728:4;7721:5;7717:16;7710:83;7641:163;6897:914;;;;:::o;7817:394::-;7908:6;7957:3;7945:9;7936:7;7932:23;7928:33;7925:120;;;7964:79;;:::i;:::-;7925:120;8084:1;8109:85;8186:7;8177:6;8166:9;8162:22;8109:85;:::i;:::-;8099:95;;8055:149;7817:394;;;;:::o;8217:474::-;8285:6;8293;8342:2;8330:9;8321:7;8317:23;8313:32;8310:119;;;8348:79;;:::i;:::-;8310:119;8468:1;8493:53;8538:7;8529:6;8518:9;8514:22;8493:53;:::i;:::-;8483:63;;8439:117;8595:2;8621:53;8666:7;8657:6;8646:9;8642:22;8621:53;:::i;:::-;8611:63;;8566:118;8217:474;;;;;:::o;8697:329::-;8756:6;8805:2;8793:9;8784:7;8780:23;8776:32;8773:119;;;8811:79;;:::i;:::-;8773:119;8931:1;8956:53;9001:7;8992:6;8981:9;8977:22;8956:53;:::i;:::-;8946:63;;8902:117;8697:329;;;;:::o;9032:490::-;9108:6;9116;9165:2;9153:9;9144:7;9140:23;9136:32;9133:119;;;9171:79;;:::i;:::-;9133:119;9291:1;9316:53;9361:7;9352:6;9341:9;9337:22;9316:53;:::i;:::-;9306:63;;9262:117;9418:2;9444:61;9497:7;9488:6;9477:9;9473:22;9444:61;:::i;:::-;9434:71;;9389:126;9032:490;;;;;:::o;9565:587::-;9636:5;9680:4;9668:9;9663:3;9659:19;9655:30;9652:117;;;9688:79;;:::i;:::-;9652:117;9787:21;9803:4;9787:21;:::i;:::-;9778:30;;9872:1;9912:49;9957:3;9948:6;9937:9;9933:22;9912:49;:::i;:::-;9905:4;9898:5;9894:16;9887:75;9818:155;10043:2;10084:49;10129:3;10120:6;10109:9;10105:22;10084:49;:::i;:::-;10077:4;10070:5;10066:16;10059:75;9983:162;9565:587;;;;:::o;10158:117::-;10267:1;10264;10257:12;10281:311;10358:4;10448:18;10440:6;10437:30;10434:56;;;10470:18;;:::i;:::-;10434:56;10520:4;10512:6;10508:17;10500:25;;10580:4;10574;10570:15;10562:23;;10281:311;;;:::o;10598:117::-;10707:1;10704;10697:12;10738:710;10834:5;10859:81;10875:64;10932:6;10875:64;:::i;:::-;10859:81;:::i;:::-;10850:90;;10960:5;10989:6;10982:5;10975:21;11023:4;11016:5;11012:16;11005:23;;11076:4;11068:6;11064:17;11056:6;11052:30;11105:3;11097:6;11094:15;11091:122;;;11124:79;;:::i;:::-;11091:122;11239:6;11222:220;11256:6;11251:3;11248:15;11222:220;;;11331:3;11360:37;11393:3;11381:10;11360:37;:::i;:::-;11355:3;11348:50;11427:4;11422:3;11418:14;11411:21;;11298:144;11282:4;11277:3;11273:14;11266:21;;11222:220;;;11226:21;10840:608;;10738:710;;;;;:::o;11471:370::-;11542:5;11591:3;11584:4;11576:6;11572:17;11568:27;11558:122;;11599:79;;:::i;:::-;11558:122;11716:6;11703:20;11741:94;11831:3;11823:6;11816:4;11808:6;11804:17;11741:94;:::i;:::-;11732:103;;11548:293;11471:370;;;;:::o;11847:310::-;11923:4;12013:18;12005:6;12002:30;11999:56;;;12035:18;;:::i;:::-;11999:56;12085:4;12077:6;12073:17;12065:25;;12145:4;12139;12135:15;12127:23;;11847:310;;;:::o;12163:91::-;12199:7;12239:8;12232:5;12228:20;12217:31;;12163:91;;;:::o;12260:120::-;12332:23;12349:5;12332:23;:::i;:::-;12325:5;12322:34;12312:62;;12370:1;12367;12360:12;12312:62;12260:120;:::o;12386:137::-;12431:5;12469:6;12456:20;12447:29;;12485:32;12511:5;12485:32;:::i;:::-;12386:137;;;;:::o;12545:707::-;12640:5;12665:80;12681:63;12737:6;12681:63;:::i;:::-;12665:80;:::i;:::-;12656:89;;12765:5;12794:6;12787:5;12780:21;12828:4;12821:5;12817:16;12810:23;;12881:4;12873:6;12869:17;12861:6;12857:30;12910:3;12902:6;12899:15;12896:122;;;12929:79;;:::i;:::-;12896:122;13044:6;13027:219;13061:6;13056:3;13053:15;13027:219;;;13136:3;13165:36;13197:3;13185:10;13165:36;:::i;:::-;13160:3;13153:49;13231:4;13226:3;13222:14;13215:21;;13103:143;13087:4;13082:3;13078:14;13071:21;;13027:219;;;13031:21;12646:606;;12545:707;;;;;:::o;13274:368::-;13344:5;13393:3;13386:4;13378:6;13374:17;13370:27;13360:122;;13401:79;;:::i;:::-;13360:122;13518:6;13505:20;13543:93;13632:3;13624:6;13617:4;13609:6;13605:17;13543:93;:::i;:::-;13534:102;;13350:292;13274:368;;;;:::o;13685:942::-;13756:5;13800:4;13788:9;13783:3;13779:19;13775:30;13772:117;;;13808:79;;:::i;:::-;13772:117;13907:21;13923:4;13907:21;:::i;:::-;13898:30;;14017:1;14006:9;14002:17;13989:31;14047:18;14039:6;14036:30;14033:117;;;14069:79;;:::i;:::-;14033:117;14189:74;14259:3;14250:6;14239:9;14235:22;14189:74;:::i;:::-;14182:4;14175:5;14171:16;14164:100;13938:337;14362:2;14351:9;14347:18;14334:32;14393:18;14385:6;14382:30;14379:117;;;14415:79;;:::i;:::-;14379:117;14535:73;14604:3;14595:6;14584:9;14580:22;14535:73;:::i;:::-;14528:4;14521:5;14517:16;14510:99;14285:335;13685:942;;;;:::o;14633:932::-;14785:6;14793;14801;14850:3;14838:9;14829:7;14825:23;14821:33;14818:120;;;14857:79;;:::i;:::-;14818:120;14977:1;15002:84;15078:7;15069:6;15058:9;15054:22;15002:84;:::i;:::-;14992:94;;14948:148;15135:3;15162:75;15229:7;15220:6;15209:9;15205:22;15162:75;:::i;:::-;15152:85;;15106:141;15314:3;15303:9;15299:19;15286:33;15346:18;15338:6;15335:30;15332:117;;;15368:79;;:::i;:::-;15332:117;15473:75;15540:7;15531:6;15520:9;15516:22;15473:75;:::i;:::-;15463:85;;15257:301;14633:932;;;;;:::o;15571:118::-;15658:24;15676:5;15658:24;:::i;:::-;15653:3;15646:37;15571:118;;:::o;15695:222::-;15788:4;15826:2;15815:9;15811:18;15803:26;;15839:71;15907:1;15896:9;15892:17;15883:6;15839:71;:::i;:::-;15695:222;;;;:::o;15923:60::-;15951:3;15972:5;15965:12;;15923:60;;;:::o;15989:142::-;16039:9;16072:53;16090:34;16099:24;16117:5;16099:24;:::i;:::-;16090:34;:::i;:::-;16072:53;:::i;:::-;16059:66;;15989:142;;;:::o;16137:126::-;16187:9;16220:37;16251:5;16220:37;:::i;:::-;16207:50;;16137:126;;;:::o;16269:145::-;16338:9;16371:37;16402:5;16371:37;:::i;:::-;16358:50;;16269:145;;;:::o;16420:169::-;16526:56;16576:5;16526:56;:::i;:::-;16521:3;16514:69;16420:169;;:::o;16595:260::-;16707:4;16745:2;16734:9;16730:18;16722:26;;16758:90;16845:1;16834:9;16830:17;16821:6;16758:90;:::i;:::-;16595:260;;;;:::o;16861:148::-;16963:11;17000:3;16985:18;;16861:148;;;;:::o;17015:163::-;17155:15;17151:1;17143:6;17139:14;17132:39;17015:163;:::o;17184:402::-;17344:3;17365:85;17447:2;17442:3;17365:85;:::i;:::-;17358:92;;17459:93;17548:3;17459:93;:::i;:::-;17577:2;17572:3;17568:12;17561:19;;17184:402;;;:::o;17592:381::-;17777:3;17799:148;17943:3;17799:148;:::i;:::-;17792:155;;17964:3;17957:10;;17592:381;;;:::o;17979:180::-;18027:77;18024:1;18017:88;18124:4;18121:1;18114:15;18148:4;18145:1;18138:15;18165:194;18205:4;18225:20;18243:1;18225:20;:::i;:::-;18220:25;;18259:20;18277:1;18259:20;:::i;:::-;18254:25;;18303:1;18300;18296:9;18288:17;;18327:1;18321:4;18318:11;18315:37;;;18332:18;;:::i;:::-;18315:37;18165:194;;;;:::o;18365:332::-;18486:4;18524:2;18513:9;18509:18;18501:26;;18537:71;18605:1;18594:9;18590:17;18581:6;18537:71;:::i;:::-;18618:72;18686:2;18675:9;18671:18;18662:6;18618:72;:::i;:::-;18365:332;;;;;:::o;18703:442::-;18852:4;18890:2;18879:9;18875:18;18867:26;;18903:71;18971:1;18960:9;18956:17;18947:6;18903:71;:::i;:::-;18984:72;19052:2;19041:9;19037:18;19028:6;18984:72;:::i;:::-;19066;19134:2;19123:9;19119:18;19110:6;19066:72;:::i;:::-;18703:442;;;;;;:::o;19151:147::-;19252:11;19289:3;19274:18;;19151:147;;;;:::o;19304:114::-;;:::o;19424:398::-;19583:3;19604:83;19685:1;19680:3;19604:83;:::i;:::-;19597:90;;19696:93;19785:3;19696:93;:::i;:::-;19814:1;19809:3;19805:11;19798:18;;19424:398;;;:::o;19828:379::-;20012:3;20034:147;20177:3;20034:147;:::i;:::-;20027:154;;20198:3;20191:10;;19828:379;;;:::o;20213:134::-;20271:9;20304:37;20335:5;20304:37;:::i;:::-;20291:50;;20213:134;;;:::o;20353:147::-;20448:45;20487:5;20448:45;:::i;:::-;20443:3;20436:58;20353:147;;:::o;20506:348::-;20635:4;20673:2;20662:9;20658:18;20650:26;;20686:79;20762:1;20751:9;20747:17;20738:6;20686:79;:::i;:::-;20775:72;20843:2;20832:9;20828:18;20819:6;20775:72;:::i;:::-;20506:348;;;;;:::o;20860:143::-;20917:5;20948:6;20942:13;20933:22;;20964:33;20991:5;20964:33;:::i;:::-;20860:143;;;;:::o;21009:351::-;21079:6;21128:2;21116:9;21107:7;21103:23;21099:32;21096:119;;;21134:79;;:::i;:::-;21096:119;21254:1;21279:64;21335:7;21326:6;21315:9;21311:22;21279:64;:::i;:::-;21269:74;;21225:128;21009:351;;;;:::o;21366:191::-;21406:3;21425:20;21443:1;21425:20;:::i;:::-;21420:25;;21459:20;21477:1;21459:20;:::i;:::-;21454:25;;21502:1;21499;21495:9;21488:16;;21523:3;21520:1;21517:10;21514:36;;;21530:18;;:::i;:::-;21514:36;21366:191;;;;:::o;21563:114::-;21630:6;21664:5;21658:12;21648:22;;21563:114;;;:::o;21683:174::-;21772:11;21806:6;21801:3;21794:19;21846:4;21841:3;21837:14;21822:29;;21683:174;;;;:::o;21863:132::-;21930:4;21953:3;21945:11;;21983:4;21978:3;21974:14;21966:22;;21863:132;;;:::o;22001:108::-;22078:24;22096:5;22078:24;:::i;:::-;22073:3;22066:37;22001:108;;:::o;22115:179::-;22184:10;22205:46;22247:3;22239:6;22205:46;:::i;:::-;22283:4;22278:3;22274:14;22260:28;;22115:179;;;;:::o;22300:113::-;22370:4;22402;22397:3;22393:14;22385:22;;22300:113;;;:::o;22449:712::-;22558:3;22587:54;22635:5;22587:54;:::i;:::-;22657:76;22726:6;22721:3;22657:76;:::i;:::-;22650:83;;22757:56;22807:5;22757:56;:::i;:::-;22836:7;22867:1;22852:284;22877:6;22874:1;22871:13;22852:284;;;22953:6;22947:13;22980:63;23039:3;23024:13;22980:63;:::i;:::-;22973:70;;23066:60;23119:6;23066:60;:::i;:::-;23056:70;;22912:224;22899:1;22896;22892:9;22887:14;;22852:284;;;22856:14;23152:3;23145:10;;22563:598;;;22449:712;;;;:::o;23167:113::-;23233:6;23267:5;23261:12;23251:22;;23167:113;;;:::o;23286:173::-;23374:11;23408:6;23403:3;23396:19;23448:4;23443:3;23439:14;23424:29;;23286:173;;;;:::o;23465:131::-;23531:4;23554:3;23546:11;;23584:4;23579:3;23575:14;23567:22;;23465:131;;;:::o;23602:105::-;23677:23;23694:5;23677:23;:::i;:::-;23672:3;23665:36;23602:105;;:::o;23713:175::-;23780:10;23801:44;23841:3;23833:6;23801:44;:::i;:::-;23877:4;23872:3;23868:14;23854:28;;23713:175;;;;:::o;23894:112::-;23963:4;23995;23990:3;23986:14;23978:22;;23894:112;;;:::o;24040:704::-;24147:3;24176:53;24223:5;24176:53;:::i;:::-;24245:75;24313:6;24308:3;24245:75;:::i;:::-;24238:82;;24344:55;24393:5;24344:55;:::i;:::-;24422:7;24453:1;24438:281;24463:6;24460:1;24457:13;24438:281;;;24539:6;24533:13;24566:61;24623:3;24608:13;24566:61;:::i;:::-;24559:68;;24650:59;24702:6;24650:59;:::i;:::-;24640:69;;24498:221;24485:1;24482;24478:9;24473:14;;24438:281;;;24442:14;24735:3;24728:10;;24152:592;;;24040:704;;;;:::o;24820:731::-;24933:3;24969:4;24964:3;24960:14;25058:4;25051:5;25047:16;25041:23;25111:3;25105:4;25101:14;25094:4;25089:3;25085:14;25078:38;25137:103;25235:4;25221:12;25137:103;:::i;:::-;25129:111;;24984:267;25333:4;25326:5;25322:16;25316:23;25386:3;25380:4;25376:14;25369:4;25364:3;25360:14;25353:38;25412:101;25508:4;25494:12;25412:101;:::i;:::-;25404:109;;25261:263;25541:4;25534:11;;24938:613;24820:731;;;;:::o;25557:361::-;25694:4;25732:2;25721:9;25717:18;25709:26;;25781:9;25775:4;25771:20;25767:1;25756:9;25752:17;25745:47;25809:102;25906:4;25897:6;25809:102;:::i;:::-;25801:110;;25557:361;;;;:::o;25924:332::-;26045:4;26083:2;26072:9;26068:18;26060:26;;26096:71;26164:1;26153:9;26149:17;26140:6;26096:71;:::i;:::-;26177:72;26245:2;26234:9;26230:18;26221:6;26177:72;:::i;:::-;25924:332;;;;;:::o;26262:116::-;26332:21;26347:5;26332:21;:::i;:::-;26325:5;26322:32;26312:60;;26368:1;26365;26358:12;26312:60;26262:116;:::o;26384:137::-;26438:5;26469:6;26463:13;26454:22;;26485:30;26509:5;26485:30;:::i;:::-;26384:137;;;;:::o;26527:345::-;26594:6;26643:2;26631:9;26622:7;26618:23;26614:32;26611:119;;;26649:79;;:::i;:::-;26611:119;26769:1;26794:61;26847:7;26838:6;26827:9;26823:22;26794:61;:::i;:::-;26784:71;;26740:125;26527:345;;;;:::o;26878:98::-;26929:6;26963:5;26957:12;26947:22;;26878:98;;;:::o;26982:158::-;27055:11;27089:6;27084:3;27077:19;27129:4;27124:3;27120:14;27105:29;;26982:158;;;;:::o;27146:246::-;27227:1;27237:113;27251:6;27248:1;27245:13;27237:113;;;27336:1;27331:3;27327:11;27321:18;27317:1;27312:3;27308:11;27301:39;27273:2;27270:1;27266:10;27261:15;;27237:113;;;27384:1;27375:6;27370:3;27366:16;27359:27;27208:184;27146:246;;;:::o;27398:353::-;27474:3;27502:38;27534:5;27502:38;:::i;:::-;27556:60;27609:6;27604:3;27556:60;:::i;:::-;27549:67;;27625:65;27683:6;27678:3;27671:4;27664:5;27660:16;27625:65;:::i;:::-;27715:29;27737:6;27715:29;:::i;:::-;27710:3;27706:39;27699:46;;27478:273;27398:353;;;;:::o;27757:108::-;27834:24;27852:5;27834:24;:::i;:::-;27829:3;27822:37;27757:108;;:::o;27955:1169::-;28092:3;28128:4;28123:3;28119:14;28215:4;28208:5;28204:16;28198:23;28268:3;28262:4;28258:14;28251:4;28246:3;28242:14;28235:38;28294:71;28360:4;28346:12;28294:71;:::i;:::-;28286:79;;28143:233;28463:4;28456:5;28452:16;28446:23;28482:63;28539:4;28534:3;28530:14;28516:12;28482:63;:::i;:::-;28386:169;28641:4;28634:5;28630:16;28624:23;28660:63;28717:4;28712:3;28708:14;28694:12;28660:63;:::i;:::-;28565:168;28820:4;28813:5;28809:16;28803:23;28839:63;28896:4;28891:3;28887:14;28873:12;28839:63;:::i;:::-;28743:169;29005:4;28998:5;28994:16;28988:23;29024:63;29081:4;29076:3;29072:14;29058:12;29024:63;:::i;:::-;28922:175;29114:4;29107:11;;28097:1027;27955:1169;;;;:::o;29130:409::-;29291:4;29329:2;29318:9;29314:18;29306:26;;29378:9;29372:4;29368:20;29364:1;29353:9;29349:17;29342:47;29406:126;29527:4;29518:6;29406:126;:::i;:::-;29398:134;;29130:409;;;;:::o;29545:180::-;29593:77;29590:1;29583:88;29690:4;29687:1;29680:15;29714:4;29711:1;29704:15;29731:169;29815:11;29849:6;29844:3;29837:19;29889:4;29884:3;29880:14;29865:29;;29731:169;;;;:::o;29906:168::-;30046:20;30042:1;30034:6;30030:14;30023:44;29906:168;:::o;30080:366::-;30222:3;30243:67;30307:2;30302:3;30243:67;:::i;:::-;30236:74;;30319:93;30408:3;30319:93;:::i;:::-;30437:2;30432:3;30428:12;30421:19;;30080:366;;;:::o;30452:419::-;30618:4;30656:2;30645:9;30641:18;30633:26;;30705:9;30699:4;30695:20;30691:1;30680:9;30676:17;30669:47;30733:131;30859:4;30733:131;:::i;:::-;30725:139;;30452:419;;;:::o;30877:442::-;31026:4;31064:2;31053:9;31049:18;31041:26;;31077:71;31145:1;31134:9;31130:17;31121:6;31077:71;:::i;:::-;31158:72;31226:2;31215:9;31211:18;31202:6;31158:72;:::i;:::-;31240;31308:2;31297:9;31293:18;31284:6;31240:72;:::i;:::-;30877:442;;;;;;:::o;31325:94::-;31358:8;31406:5;31402:2;31398:14;31377:35;;31325:94;;;:::o;31425:::-;31464:7;31493:20;31507:5;31493:20;:::i;:::-;31482:31;;31425:94;;;:::o;31525:100::-;31564:7;31593:26;31613:5;31593:26;:::i;:::-;31582:37;;31525:100;;;:::o;31631:157::-;31736:45;31756:24;31774:5;31756:24;:::i;:::-;31736:45;:::i;:::-;31731:3;31724:58;31631:157;;:::o;31794:256::-;31906:3;31921:75;31992:3;31983:6;31921:75;:::i;:::-;32021:2;32016:3;32012:12;32005:19;;32041:3;32034:10;;31794:256;;;;:::o;32056:386::-;32160:3;32188:38;32220:5;32188:38;:::i;:::-;32242:88;32323:6;32318:3;32242:88;:::i;:::-;32235:95;;32339:65;32397:6;32392:3;32385:4;32378:5;32374:16;32339:65;:::i;:::-;32429:6;32424:3;32420:16;32413:23;;32164:278;32056:386;;;;:::o;32448:427::-;32624:3;32646:93;32735:3;32726:6;32646:93;:::i;:::-;32639:100;;32756:93;32845:3;32836:6;32756:93;:::i;:::-;32749:100;;32866:3;32859:10;;32448:427;;;;;:::o;32881:96::-;32915:8;32964:5;32959:3;32955:15;32934:36;;32881:96;;;:::o;32983:94::-;33021:7;33050:21;33065:5;33050:21;:::i;:::-;33039:32;;32983:94;;;:::o;33083:153::-;33186:43;33205:23;33222:5;33205:23;:::i;:::-;33186:43;:::i;:::-;33181:3;33174:56;33083:153;;:::o;33242:251::-;33352:3;33367:73;33436:3;33427:6;33367:73;:::i;:::-;33465:1;33460:3;33456:11;33449:18;;33484:3;33477:10;;33242:251;;;;:::o;33499:171::-;33538:3;33561:24;33579:5;33561:24;:::i;:::-;33552:33;;33607:4;33600:5;33597:15;33594:41;;33615:18;;:::i;:::-;33594:41;33662:1;33655:5;33651:13;33644:20;;33499:171;;;:::o;33676:332::-;33797:4;33835:2;33824:9;33820:18;33812:26;;33848:71;33916:1;33905:9;33901:17;33892:6;33848:71;:::i;:::-;33929:72;33997:2;33986:9;33982:18;33973:6;33929:72;:::i;:::-;33676:332;;;;;:::o

Swarm Source

ipfs://38775c40a94183684b5c31370f759556571909429bd1b9c9f8153dd97a3bf369

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.