ETH Price: $1,831.45 (-2.60%)
 

Overview

ETH Balance

0.000562806787598249 ETH

Eth Value

$1.03 (@ $1,831.45/ETH)

More Info

Private Name Tags

Multichain Info

Transaction Hash
Method
Block
From
To
Execute204413002024-08-02 13:56:59570 days ago1722607019IN
0xef3c8e08...427f5AbcB
0.000253 ETH0.000755954.45127403
Execute204412902024-08-02 13:54:59570 days ago1722606899IN
0xef3c8e08...427f5AbcB
0.000253 ETH0.004232145.55357761
Withdraw196389332024-04-12 10:28:23682 days ago1712917703IN
0xef3c8e08...427f5AbcB
0 ETH0.000525317.03828504
Execute196150522024-04-09 2:16:11686 days ago1712628971IN
0xef3c8e08...427f5AbcB
0.00138485 ETH0.0243735122.11817225
Execute194157282024-03-12 1:29:47714 days ago1710206987IN
0xef3c8e08...427f5AbcB
0.01111332 ETH0.0488571344.3362581
Execute193485142024-03-02 15:55:59723 days ago1709394959IN
0xef3c8e08...427f5AbcB
0.00789316 ETH0.065408255.8813359
Update Router192935922024-02-23 23:33:47731 days ago1708731227IN
0xef3c8e08...427f5AbcB
0 ETH0.0007713926.41493368
Execute192751742024-02-21 9:35:11733 days ago1708508111IN
0xef3c8e08...427f5AbcB
0.00001321 ETH0.0054042132.07841606
Execute192751342024-02-21 9:26:35733 days ago1708507595IN
0xef3c8e08...427f5AbcB
0.0002028 ETH0.0056109633.30563911
Execute192751302024-02-21 9:25:47733 days ago1708507547IN
0xef3c8e08...427f5AbcB
0.00068663 ETH0.0339530830.87171417
Execute191326802024-02-01 9:24:59753 days ago1706779499IN
0xef3c8e08...427f5AbcB
0.00002025 ETH0.0034163320.27871328
Execute191326802024-02-01 9:24:59753 days ago1706779499IN
0xef3c8e08...427f5AbcB
0.00046343 ETH0.0034163320.27871328
Execute191326732024-02-01 9:23:35753 days ago1706779415IN
0xef3c8e08...427f5AbcB
0.00009649 ETH0.0031744618.84303933
Execute191326702024-02-01 9:22:59753 days ago1706779379IN
0xef3c8e08...427f5AbcB
0.00058327 ETH0.021807919.8287604
Execute190786832024-01-24 19:49:23761 days ago1706125763IN
0xef3c8e08...427f5AbcB
0.00052193 ETH0.012017310.92669448
Execute190786492024-01-24 19:42:23761 days ago1706125343IN
0xef3c8e08...427f5AbcB
0.00052193 ETH0.0125809411.43917775
Execute190782792024-01-24 18:27:23761 days ago1706120843IN
0xef3c8e08...427f5AbcB
0.0005226 ETH0.0154253214.02542194
Execute190782702024-01-24 18:25:35761 days ago1706120735IN
0xef3c8e08...427f5AbcB
0.0005226 ETH0.0165434615.04208351
Execute190779742024-01-24 17:25:59761 days ago1706117159IN
0xef3c8e08...427f5AbcB
0.00052369 ETH0.0176045316.00703399
Execute190777982024-01-24 16:50:23761 days ago1706115023IN
0xef3c8e08...427f5AbcB
0.00009576 ETH0.0022882713.58279454
Execute190777982024-01-24 16:50:23761 days ago1706115023IN
0xef3c8e08...427f5AbcB
0.00046641 ETH0.0022882713.58279454
Execute190776422024-01-24 16:18:59761 days ago1706113139IN
0xef3c8e08...427f5AbcB
0.00057981 ETH0.0164971815
Execute190716292024-01-23 20:04:59762 days ago1706040299IN
0xef3c8e08...427f5AbcB
0.00057792 ETH0.0149832613.62347878
Execute190649132024-01-22 21:25:11763 days ago1705958711IN
0xef3c8e08...427f5AbcB
0.0000031 ETH0.0024948614.8090459
Execute190649052024-01-22 21:23:35763 days ago1705958615IN
0xef3c8e08...427f5AbcB
0.00047483 ETH0.0163447816.56399004
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Ccip Send204413002024-08-02 13:56:59570 days ago1722607019
0xef3c8e08...427f5AbcB
0.0002024 ETH
Ccip Send204412902024-08-02 13:54:59570 days ago1722606899
0xef3c8e08...427f5AbcB
0.0002024 ETH
0x60806040204412902024-08-02 13:54:59570 days ago1722606899
0xef3c8e08...427f5AbcB
 Contract Creation0 ETH
Ccip Send197688692024-04-30 14:57:59664 days ago1714489079
0xef3c8e08...427f5AbcB
0.00041623 ETH
Execute197688692024-04-30 14:57:59664 days ago1714489079
0xef3c8e08...427f5AbcB
0.00052029 ETH
Ccip Send197688652024-04-30 14:57:11664 days ago1714489031
0xef3c8e08...427f5AbcB
0.00024555 ETH
Execute197688652024-04-30 14:57:11664 days ago1714489031
0xef3c8e08...427f5AbcB
0.00030694 ETH
Ccip Send197688542024-04-30 14:54:59664 days ago1714488899
0xef3c8e08...427f5AbcB
0.00041623 ETH
Ccip Send197688542024-04-30 14:54:59664 days ago1714488899
0xef3c8e08...427f5AbcB
0.00035912 ETH
Ccip Send197688542024-04-30 14:54:59664 days ago1714488899
0xef3c8e08...427f5AbcB
0.0002108 ETH
Ccip Send197688542024-04-30 14:54:59664 days ago1714488899
0xef3c8e08...427f5AbcB
0.00024555 ETH
0x60806040197688542024-04-30 14:54:59664 days ago1714488899
0xef3c8e08...427f5AbcB
 Contract Creation0 ETH
Execute197688542024-04-30 14:54:59664 days ago1714488899
0xef3c8e08...427f5AbcB
0.00152788 ETH
Transfer196389332024-04-12 10:28:23682 days ago1712917703
0xef3c8e08...427f5AbcB
0.11127704 ETH
Ccip Send196223842024-04-10 2:55:35685 days ago1712717735
0xef3c8e08...427f5AbcB
0.00018708 ETH
Execute196223842024-04-10 2:55:35685 days ago1712717735
0xef3c8e08...427f5AbcB
0.00023385 ETH
Ccip Send196223732024-04-10 2:53:11685 days ago1712717591
0xef3c8e08...427f5AbcB
0.00024352 ETH
Ccip Send196223732024-04-10 2:53:11685 days ago1712717591
0xef3c8e08...427f5AbcB
0.00033144 ETH
Ccip Send196223732024-04-10 2:53:11685 days ago1712717591
0xef3c8e08...427f5AbcB
0.00018708 ETH
Ccip Send196223732024-04-10 2:53:11685 days ago1712717591
0xef3c8e08...427f5AbcB
0.00022838 ETH
0x60806040196223732024-04-10 2:53:11685 days ago1712717591
0xef3c8e08...427f5AbcB
 Contract Creation0 ETH
Execute196223732024-04-10 2:53:11685 days ago1712717591
0xef3c8e08...427f5AbcB
0.00123806 ETH
Ccip Send196150522024-04-09 2:16:11686 days ago1712628971
0xef3c8e08...427f5AbcB
0.00043313 ETH
Ccip Send196150522024-04-09 2:16:11686 days ago1712628971
0xef3c8e08...427f5AbcB
0.00030816 ETH
Ccip Send196150522024-04-09 2:16:11686 days ago1712628971
0xef3c8e08...427f5AbcB
0.00018232 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:
KlasterGatewaySingleton

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2023-10-31
*/

// Sources flattened with hardhat v2.17.2 https://hardhat.org

// SPDX-License-Identifier: MIT

// File @chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol@v0.7.6

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;

// End consumer library.
library Client {
  struct EVMTokenAmount {
    address token; // token address on the local chain.
    uint256 amount; // Amount of tokens.
  }

  struct Any2EVMMessage {
    bytes32 messageId; // MessageId corresponding to ccipSend on source.
    uint64 sourceChainSelector; // Source chain selector.
    bytes sender; // abi.decode(sender) if coming from an EVM chain.
    bytes data; // payload sent in original message.
    EVMTokenAmount[] destTokenAmounts; // Tokens and their amounts in their destination chain representation.
  }

  // If extraArgs is empty bytes, the default is 200k gas limit and strict = false.
  struct EVM2AnyMessage {
    bytes receiver; // abi.encode(receiver address) for dest EVM chains
    bytes data; // Data payload
    EVMTokenAmount[] tokenAmounts; // Token transfers
    address feeToken; // Address of feeToken. address(0) means you will send msg.value.
    bytes extraArgs; // Populate this with _argsToBytes(EVMExtraArgsV1)
  }

  // extraArgs will evolve to support new features
  // bytes4(keccak256("CCIP EVMExtraArgsV1"));
  bytes4 public constant EVM_EXTRA_ARGS_V1_TAG = 0x97a657c9;
  struct EVMExtraArgsV1 {
    uint256 gasLimit; // ATTENTION!!! MAX GAS LIMIT 4M FOR BETA TESTING
    bool strict; // See strict sequencing details below.
  }

  function _argsToBytes(EVMExtraArgsV1 memory extraArgs) internal pure returns (bytes memory bts) {
    return abi.encodeWithSelector(EVM_EXTRA_ARGS_V1_TAG, extraArgs);
  }
}


// File @chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IAny2EVMMessageReceiver.sol@v0.7.6

/// @notice Application contracts that intend to receive messages from
/// the router should implement this interface.
interface IAny2EVMMessageReceiver {
  /// @notice Called by the Router to deliver a message.
  /// If this reverts, any token transfers also revert. The message
  /// will move to a FAILED state and become available for manual execution.
  /// @param message CCIP Message
  /// @dev Note ensure you check the msg.sender is the OffRampRouter
  function ccipReceive(Client.Any2EVMMessage calldata message) external;
}


// File @chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.0/utils/introspection/IERC165.sol@v0.7.6

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * 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[EIP 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 @chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol@v0.7.6

/// @title CCIPReceiver - Base contract for CCIP applications that can receive messages.
abstract contract CCIPReceiver is IAny2EVMMessageReceiver, IERC165 {
  address internal i_router;

  constructor(address router) {
    if (router == address(0)) revert InvalidRouter(address(0));
    i_router = router;
  }

  /// @notice IERC165 supports an interfaceId
  /// @param interfaceId The interfaceId to check
  /// @return true if the interfaceId is supported
  function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
    return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId;
  }

  /// @inheritdoc IAny2EVMMessageReceiver
  function ccipReceive(Client.Any2EVMMessage calldata message) external virtual override onlyRouter {
    _ccipReceive(message);
  }

  /// @notice Override this function in your implementation.
  /// @param message Any2EVMMessage
  function _ccipReceive(Client.Any2EVMMessage memory message) internal virtual;

  /////////////////////////////////////////////////////////////////////
  // Plumbing
  /////////////////////////////////////////////////////////////////////

  /// @notice Return the current router
  /// @return i_router address
  function getRouter() public view returns (address) {
    return address(i_router);
  }

  error InvalidRouter(address router);

  /// @dev only calls from the set router are accepted.
  modifier onlyRouter() {
    if (msg.sender != address(i_router)) revert InvalidRouter(msg.sender);
    _;
  }
}


// File @chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol@v0.7.6

interface IRouterClient {
  error UnsupportedDestinationChain(uint64 destChainSelector);
  error InsufficientFeeTokenAmount();
  error InvalidMsgValue();

  /// @notice Checks if the given chain ID is supported for sending/receiving.
  /// @param chainSelector The chain to check.
  /// @return supported is true if it is supported, false if not.
  function isChainSupported(uint64 chainSelector) external view returns (bool supported);

  /// @notice Gets a list of all supported tokens which can be sent or received
  /// to/from a given chain id.
  /// @param chainSelector The chainSelector.
  /// @return tokens The addresses of all tokens that are supported.
  function getSupportedTokens(uint64 chainSelector) external view returns (address[] memory tokens);

  /// @param destinationChainSelector The destination chainSelector
  /// @param message The cross-chain CCIP message including data and/or tokens
  /// @return fee returns guaranteed execution fee for the specified message
  /// delivery to destination chain
  /// @dev returns 0 fee on invalid message.
  function getFee(
    uint64 destinationChainSelector,
    Client.EVM2AnyMessage memory message
  ) external view returns (uint256 fee);

  /// @notice Request a message to be sent to the destination chain
  /// @param destinationChainSelector The destination chain ID
  /// @param message The cross-chain CCIP message including data and/or tokens
  /// @return messageId The message ID
  /// @dev Note if msg.value is larger than the required fee (from getFee) we accept
  /// the overpayment with no refund.
  function ccipSend(
    uint64 destinationChainSelector,
    Client.EVM2AnyMessage calldata message
  ) external payable returns (bytes32);
}


// File @openzeppelin/contracts/access/IAccessControl.sol@v4.9.3

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @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 signaling this.
     *
     * _Available since v3.1._
     */
    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, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    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 `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}


// File @openzeppelin/contracts/utils/Context.sol@v4.9.3

/**
 * @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;
    }
}

// File @openzeppelin/contracts/utils/introspection/ERC165.sol@v4.9.3

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 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);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


// File @openzeppelin/contracts/utils/math/Math.sol@v4.9.3

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}


// File @openzeppelin/contracts/utils/math/SignedMath.sol@v4.9.3

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}


// File @openzeppelin/contracts/utils/Strings.sol@v4.9.3

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}


// File @openzeppelin/contracts/access/AccessControl.sol@v4.9.3

/**
 * @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 => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    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 override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @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 override 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 override 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 override 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 `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @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 Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// File @openzeppelin/contracts/access/Ownable.sol@v4.9.3

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File contracts/interface/IERC1271.sol

interface IERC1271 {
  // bytes4(keccak256("isValidSignature(bytes32,bytes)")
  // bytes4 constant internal MAGICVALUE = 0x1626ba7e;
    function isValidSignature(bytes32 _hash, bytes memory _signature) external view returns (bytes4 magicValue);
}


// File contracts/interface/IKlasterGatewayWallet.sol

interface IKlasterGatewayWallet {

    function execute(
        address destination,
        uint256 value,
        bytes memory data
    ) external returns (bool, address);

    function executeWithData(
        address destination,
        uint256 value,
        bytes memory data,
        bytes32 extraData
    ) external returns (bool, address);

}


// File contracts/gateway/KlasterGatewayWallet.sol

contract KlasterGatewayWallet is Ownable, IERC1271, IKlasterGatewayWallet {

    address public klasterGatewaySingleton;

    mapping (bytes32 => bool) public signatures;

    constructor(address _owner) {
        klasterGatewaySingleton = msg.sender;
        _transferOwnership(_owner);
    }

    function executeWithData(
        address destination,
        uint256 value,
        bytes memory data,
        bytes32 extraData
    ) external returns (bool, address) {
        if (destination == address(0)) { // contract deployment
            if (extraData == "") { // deploy using create()
                return (true, _performCreate(value, data));
            } else { // deploy using create2()
                return (true, _performCreate2(value, data, extraData));
            }
        } else { // transaction execution (use extra data as contract wallet signature as per ERC-1271)
            if (extraData != "") { signatures[extraData] = true; }
            return execute(destination, value, data);
        }
    }

    function execute(
        address destination,
        uint256 value,
        bytes memory data
    ) public returns (bool, address) {
        require(
            msg.sender == klasterGatewaySingleton || msg.sender == owner(),
            "Not an owner!"
        );
        bool result;
        uint dataLength = data.length;
        assembly {
            let x := mload(0x40)   // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention)
            let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that
            result := call(
                sub(gas(), 34710),   // 34710 is the value that solidity is currently emitting
                                   // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) +
                                   // callNewAccountGas (25000, in case the destination address does not exist and needs creating)
                destination,
                value,
                d,
                dataLength,        // Size of the input (in bytes) - this is what fixes the padding problem
                x,
                0                  // Output is ignored, therefore the output size is zero
            )
        }
        return (result, address(0));
    }

    function isValidSignature(bytes32 _hash, bytes memory _signature) external view returns (bytes4 magicValue) {
        if (signatures[_hash]) {
            magicValue = 0x1626ba7e; // ERC1271: valid signature = bytes4(keccak256("isValidSignature(bytes32,bytes)")
        }
    }

    function _performCreate(
        uint256 value,
        bytes memory deploymentData
    ) internal returns (address newContract) {
        /* solhint-disable no-inline-assembly */
        /// @solidity memory-safe-assembly
        assembly {
            newContract := create(value, add(deploymentData, 0x20), mload(deploymentData))
        }
        /* solhint-enable no-inline-assembly */
        require(newContract != address(0), "Could not deploy contract");
    }

    function _performCreate2(
        uint256 value,
        bytes memory deploymentData,
        bytes32 salt
    ) internal returns (address newContract) {
        /* solhint-disable no-inline-assembly */
        /// @solidity memory-safe-assembly
        assembly {
            newContract := create2(value, add(0x20, deploymentData), mload(deploymentData), salt)
        }
        /* solhint-enable no-inline-assembly */
        require(newContract != address(0), "Could not deploy contract");
    }

    /// @notice Fallback function to allow the contract to receive Ether.
    /// @dev This function has no function body, making it a default function for receiving Ether.
    /// It is automatically called when Ether is sent to the contract without any data.
    receive() external payable {}

}


// File contracts/interface/IKlasterGatewaySingleton.sol

interface IKlasterGatewaySingleton {

    /************************** EVENTS **************************/

    // Event emitted when a new gateway wallet instance has been deployed.
    event WalletDeploy(
        address indexed owner,
        address gatewayWallet
    );
    
    // Event emitted when a message is sent to another chain.
    event SendRTC(
        bytes32 indexed messageId, // The unique ID of the CCIP message.
        address indexed caller, // Wallet initiating the RTC
        uint64 destinationChainSelector, // The chain selector of the destination chain.
        uint64 execChainSelector, // The chain selector of the execution chain.
        address targetContract, // Remote contract to execute on dest chain
        bytes32 extraData, // Message hash used for ERC-1271 or salt used for create2
        address feeToken, // the token address used to pay CCIP fees.
        uint256 ccipfees, // The fees paid for sending the CCIP message.
        uint256 totalFees // Total fees (ccip + platform fee)
    );

    // Event emitted when a message is received from another chain.
    event ReceiveRTC(
        bytes32 indexed messageId, // The unique ID of the CCIP message.
        uint64 indexed sourceChainSelector, // The chain selector of the destination chain.
        address caller, // Wallet initiating the RTC.
        address targetContract, // Remote contract to execute on dest chain,
        bytes32 extraData // Message hash used for ERC-1271 or salt used for create2
    );

    // Event emitted when any gateway wallet action gets executed
    event Execute(
        address indexed caller,
        address indexed gatewayWallet,
        address indexed destination,
        bool status,
        address contractDeployed,
        bytes32 extraData
    );

    /************************** WRITE **************************/

    function deploy(string memory salt) external returns (address);

    function batchExecute(
        uint64[][] memory execChainSelectors,
        string[] memory salt,
        address[] memory destination,
        uint256[] memory value,
        bytes[] memory data,
        uint256[] memory gasLimit,
        bytes32[] memory extraData
    ) external payable returns (bool[] memory, address[] memory, bytes32[] memory);

    function execute(
        uint64[] memory execChainSelectors,
        string memory salt,
        address destination,
        uint value,
        bytes memory data,
        uint256 gasLimit,
        bytes32 extraData
    ) external payable returns (bool, address, bytes32);

    /************************** READ **************************/

    function getDeployedWallets(address owner) external view returns (address[] memory);
    
    function calculateBatchExecuteFee(
        address caller,
        uint64[][] memory execChainSelectors,
        string[] memory salt,
        address[] memory destination,
        uint256[] memory value,
        bytes[] memory data,
        uint256[] memory gasLimit,
        bytes32[] memory extraData
    ) external view returns (uint256);

    function calculateExecuteFee(
        address caller,
        uint64[] memory execChainSelectors,
        string memory salt,
        address destination,
        uint value,
        bytes memory data,
        uint256 gasLimit,
        bytes32 extraData
    ) external view returns (uint256);

    function calculateAddress(address owner, string memory salt) external view returns (address);

    function calculateCreate2Address(
        address owner,
        string memory salt,
        bytes memory byteCode,
        bytes32 create2Salt
    ) external view returns (address);

}


// File contracts/interface/IOwnable.sol

interface IOwnable {
    function owner() external view returns (address);
}


// File contracts/gateway/KlasterGatewaySingleton.sol

contract KlasterGatewaySingleton is IKlasterGatewaySingleton, CCIPReceiver, AccessControl {

    bytes32 public constant FEE_MANAGER_ROLE = keccak256("FEE_MANAGER_ROLE");
    bytes32 public constant HARVEST_MANAGER_ROLE = keccak256("HARVEST_MANAGER_ROLE");
    bytes32 public constant CCIP_MANAGER_ROLE = keccak256("CCIP_MANAGER_ROLE");

    uint256 public feePercentage; // percentage fee on top of the ccip fees (modifiable by the owner)
    uint64 public thisChainSelector; // current chain selector
    uint64 public relayerChainSelector; // relayer chain selector (sepolia for testnet, eth for mainnet)
    
    mapping (address => bool) public deployed;
    mapping (address => uint64) public controllingChains; // gateway wallet => controlling chain id
    mapping (address => string) public salts; // gateway wallet => salt
    mapping (address => address[]) public instances; // user => gateway wallet[]

    constructor(
        address _sourceRouter,
        uint64 _thisChainSelector,
        uint64 _relayerChainSelector,
        address _roleManager,
        address _ccipManager,
        address _harvestManager,
        address _feeManager,
        uint256 _feePercentage
    ) CCIPReceiver(_sourceRouter) {
        thisChainSelector = _thisChainSelector;
        relayerChainSelector = _relayerChainSelector;
        feePercentage = _feePercentage;
        _grantRole(DEFAULT_ADMIN_ROLE, _roleManager);
        _grantRole(FEE_MANAGER_ROLE, _feeManager);
        _grantRole(HARVEST_MANAGER_ROLE, _harvestManager);
        _grantRole(CCIP_MANAGER_ROLE, _ccipManager);

        // sanity checks
        require(
            _relayerChainSelector == _thisChainSelector ||
            IRouterClient(getRouter()).isChainSupported(relayerChainSelector),
            "Invalid relayer chain configuration."
        );
        require(_feeManager != address(0), "Fee manager is 0x0");
        require(_ccipManager != address(0), "CCIP manager is 0x0");
    }

    function deploy(string memory salt) public override returns (address) {
       return _deploy(msg.sender, salt, thisChainSelector);
    }

    /***
     * FEE_MANAGER FUNCTIONS (SENSITIVE)
     * 
     * Append only. Cant break anything or shut down the service.
     * KlasterGatewayWallet wallets will always work and in that sense it's permissionless.
     * The only two things a fee manager can affect and change post deployment are:
     *     1) Update platform fee - CAPPED TO 100% of the CCIP fee (!)
     *     2) Withdraw platform fee earnings
     */
    function updateFee(uint256 _feePercentage) external {
        require(hasRole(FEE_MANAGER_ROLE, msg.sender), "Caller is not a fee manager.");
        require(_feePercentage <= 100, "Platform fee is capped to 100% of the CCIP fee.");
        feePercentage = _feePercentage;
    }

    function withdraw(uint256 amount) external {
        require(hasRole(HARVEST_MANAGER_ROLE, msg.sender), "Caller is not a harvest manager.");
        payable(msg.sender).transfer(amount);
    }

    /***
     * CCIP_MANAGER FUNCTIONS (SENSITIVE)
     * 
     * CCIP manager is the only address that can update the router addresses.
     * This is a temporary role to be used only once. Chainlink's CCIP team is going to deploy
     * new router addresses after the GA launch, and this function will be used to store the new
     * router address and replace the old ones. After the update is complete, CCIP manager will renounce
     * its role.
     */
    function updateRouter(address _newRouterAddress) external {
        require(hasRole(CCIP_MANAGER_ROLE, msg.sender), "Caller is not a ccip manager.");
        i_router = _newRouterAddress;
    }

    /************ PUBLIC WRITE FUNCTIONS ************/

    function batchExecute(
        uint64[][] memory execChainSelectors,
        string[] memory salt,
        address[] memory destination,
        uint256[] memory value,
        bytes[] memory data,
        uint256[] memory gasLimit,
        bytes32[] memory extraData
    ) external payable override returns (bool[] memory success, address[] memory contractDeployed, bytes32[] memory messageId) {
        success = new bool[](execChainSelectors.length);
        contractDeployed = new address[](execChainSelectors.length);
        messageId = new bytes32[](execChainSelectors.length);
        for (uint256 i = 0; i < execChainSelectors.length; i++) {
            (success[i], contractDeployed[i], messageId[i]) = execute(
                execChainSelectors[i],
                salt[i],
                destination[i],
                value[i],
                data[i],
                gasLimit[i],
                extraData[i]
            );
        }
    }

    function execute(
        uint64[] memory execChainSelectors,
        string memory salt,
        address destination,
        uint256 value,
        bytes memory data,
        uint256 gasLimit,
        bytes32 extraData
    ) public payable override returns (bool success, address contractDeployed, bytes32 messageId) {
        
        if (destination != address(0) && extraData != "") { // if executing contract call (destination != 0) and extra data exists, then verify if the extra data is a valid signature
            require(
                IERC1271(msg.sender).isValidSignature(
                    extraData,
                    ""
                ) == 0x1626ba7e, // ERC1271: valid signature = bytes4(keccak256("isValidSignature(bytes32,bytes)")
                "Invalid signature."
            );
        }

        for (uint256 i = 0; i < execChainSelectors.length; i++) {
            (success, contractDeployed, messageId) = _execute(
                ExecutionData(
                    msg.sender,
                    thisChainSelector,
                    execChainSelectors[i],
                    salt,
                    destination,
                    value,
                    data,
                    gasLimit,
                    extraData,
                    true
                )
            );
        }
    }

    /************ PUBLIC READ FUNCTIONS ************/

    function getDeployedWallets(address owner) external view override returns (address[] memory) {
        return instances[owner];
    }

    function calculateBatchExecuteFee(
        address caller,
        uint64[][] memory execChainSelectors,
        string[] memory salt,
        address[] memory destination,
        uint256[] memory value,
        bytes[] memory data,
        uint256[] memory gasLimit,
        bytes32[] memory extraData
    ) external view override returns (uint256 totalFee) {
        for (uint256 i = 0; i < execChainSelectors.length; i++) {
            totalFee += calculateExecuteFee(
                caller,
                execChainSelectors[i],
                salt[i],
                destination[i],
                value[i],
                data[i],
                gasLimit[i],
                extraData[i]
            );
        }
    }

    function calculateExecuteFee(
        address caller,
        uint64[] memory execChainSelectors,
        string memory salt,
        address destination,
        uint256 value,
        bytes memory data,
        uint256 gasLimit,
        bytes32 extraData
    ) public view override returns (uint256 totalFee) {
        for (uint256 i = 0; i < execChainSelectors.length; i++) {
            uint64 execChainSelector = execChainSelectors[i];
            if (execChainSelector != thisChainSelector) {
                // Get available lane    
                uint64 destChainSelector = _getDestChainSelector(execChainSelector);
        
                // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message
                Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(
                    address(this),
                    abi.encode(caller, thisChainSelector, execChainSelector, salt, destination, value, data, gasLimit, extraData),
                    address(0),
                    gasLimit
                );

                (, uint256 fee) = _getFees(destChainSelector, execChainSelector, evm2AnyMessage);
                totalFee += fee;
            }
        }
    }

    function calculateAddress(address owner, string memory salt) public view override returns (address) {
        bytes32 hash = keccak256(
            abi.encodePacked(
                bytes1(0xff), address(this), keccak256(abi.encodePacked(owner, salt)), keccak256(_getBytecode(owner))
            )
        );
        return address(uint160(uint(hash)));
    }

    function calculateCreate2Address(
        address owner,
        string memory salt,
        bytes memory byteCode,
        bytes32 create2Salt
    ) external view override returns (address) {
        bytes32 hash_ = keccak256(
            abi.encodePacked(
                bytes1(0xff),
                calculateAddress(owner, salt),
                create2Salt,
                keccak256(byteCode)
            )
        );
        return address(uint160(uint256(hash_)));
    }

    /************ INTERNAL FUNCTIONS ************/
    
    struct ExecutionData {
        address caller;
        uint64 sourceChainSelector;
        uint64 execChainSelector;
        string salt;
        address destination;
        uint256 value;
        bytes data;
        uint256 gasLimit;
        bytes32 extraData;
        bool feeEnabled;
    }
    function _execute(
        ExecutionData memory execData
    ) internal returns (bool success, address contractDeployed, bytes32 messageId) {
        if (execData.execChainSelector == thisChainSelector) { // execute on this chain
            (success, contractDeployed) = _executeOnWallet(
                execData.sourceChainSelector,
                execData.caller,
                execData.salt,
                execData.destination,
                execData.value,
                execData.data,
                execData.extraData
            );
        } else { // remote execution on target chain via CCIP

            // Get available lane  
            uint64 destChainSelector = _getDestChainSelector(execData.execChainSelector);

            // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message
            Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(
                address(this),
                abi.encode(
                    execData.caller,
                    execData.sourceChainSelector,
                    execData.execChainSelector,
                    execData.salt,
                    execData.destination,
                    execData.value,
                    execData.data,
                    execData.gasLimit,
                    execData.extraData
                ),
                address(0),
                execData.gasLimit
            );

            (uint256 ccipFees, uint256 totalFee) = _getFees(
                destChainSelector,
                execData.execChainSelector,
                evm2AnyMessage
            );

            // Take into account platform fee
            if (execData.feeEnabled) {
                require(msg.value >= totalFee, "Ether amount too low. Send more ether to execute call.");
            }
            
            success = true;
            messageId = IRouterClient(getRouter()).ccipSend{value: ccipFees}(
                destChainSelector,
                evm2AnyMessage
            );

            emit SendRTC(
                    messageId,
                    execData.caller,
                    destChainSelector,
                    execData.execChainSelector,
                    execData.destination,
                    execData.extraData,
                    address(0),
                    ccipFees,
                    totalFee
            );
        }
    }

    // executes given action on the callers gateway wallet
    function _executeOnWallet(
        uint64 sourceChainSelector,
        address caller,
        string memory salt,
        address destination,
        uint256 value,
        bytes memory data,
        bytes32 extraData
    ) internal returns (bool status, address contractDeployed) {
        address walletInstanceAddress = calculateAddress(caller, salt);
        if (!deployed[walletInstanceAddress]) {
            _deploy(caller, salt, sourceChainSelector);
        } else {
            require(
                sourceChainSelector == controllingChains[walletInstanceAddress],
                "Can only execute from controlling chain."
            );
        }
        
        IKlasterGatewayWallet walletInstance = IKlasterGatewayWallet(walletInstanceAddress);
        
        require(IOwnable(walletInstanceAddress).owner() == caller, "Not an owner!");
        (status, contractDeployed) = walletInstance.executeWithData(destination, value, data, extraData);
        
        emit Execute(caller, walletInstanceAddress, destination, status, contractDeployed, extraData);
    }

    // deploys new gateway wallet for given owner and salt
    function _deploy(
        address owner,
        string memory salt,
        uint64 sourceChainSelector
    ) private returns (address walletInstance) {
        require(!deployed[calculateAddress(owner, salt)], "Already deployed! Use different salt!");
        
        bytes memory bytecode = _getBytecode(owner);
        bytes32 calculatedSalt = keccak256(abi.encodePacked(owner, salt));
        assembly {
            walletInstance := create2(0, add(bytecode, 32), mload(bytecode), calculatedSalt)
        }
        deployed[walletInstance] = true;
        salts[walletInstance] = salt;
        controllingChains[walletInstance] = sourceChainSelector;
        instances[owner].push(walletInstance);
        
        emit WalletDeploy(owner, walletInstance);
    }

    // get the bytecode of the contract KlasterGatewayWallet with encoded constructor
    function _getBytecode(address owner) private pure returns (bytes memory) {
        bytes memory bytecode = type(KlasterGatewayWallet).creationCode;
        return abi.encodePacked(bytecode, abi.encode(owner));
    }

    // @notice Construct a CCIP message.
    /// @dev This function will create an EVM2AnyMessage struct with all the necessary information for sending arbitrary bytes cross chain.
    /// @param _receiver The address of the receiver.
    /// @param _message The bytes data to be sent.
    /// @param _feeTokenAddress The address of the token used for fees. Set address(0) for native gas.
    /// @param _gasLimit Gas limit.
    /// @return Client.EVM2AnyMessage Returns an EVM2AnyMessage struct which contains information for sending a CCIP message.
    function _buildCCIPMessage(
        address _receiver,
        bytes memory _message,
        address _feeTokenAddress,
        uint256 _gasLimit
    ) internal pure returns (Client.EVM2AnyMessage memory) {
        // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message
        Client.EVM2AnyMessage memory evm2AnyMessage = Client.EVM2AnyMessage({
            receiver: abi.encode(_receiver), // ABI-encoded receiver address
            data: _message, // ABI-encoded string
            tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array aas no tokens are transferred
            extraArgs: Client._argsToBytes(
                // Additional arguments, setting gas limit and non-strict sequencing mode
                Client.EVMExtraArgsV1({gasLimit: _gasLimit, strict: false})
            ),
            // Set the feeToken to a feeTokenAddress, indicating specific asset will be used for fees
            feeToken: _feeTokenAddress
        });
        return evm2AnyMessage;
    }

    /// handle received execution message
    function _ccipReceive(
        Client.Any2EVMMessage memory any2EvmMessage
    )
        internal
        override
    {
        require(
            abi.decode(any2EvmMessage.sender, (address)) == address(this),
            "Only official KlasterGatewaySingleton can send CCIP messages."
        );

        (
            address caller,
            uint64 sourceChainSelector,
            uint64 execChainSelector,
            string memory salt,
            address destination,
            uint256 value,
            bytes memory data,
            uint256 gasLimit,
            bytes32 extraData
        ) = abi.decode(
            any2EvmMessage.data,
            (
                address,
                uint64,
                uint64,
                string,
                address,
                uint256,
                bytes,
                uint256,
                bytes32
            )
        );

        _execute(
            ExecutionData(
                caller,
                sourceChainSelector,
                execChainSelector,
                salt,
                destination,
                value,
                data,
                gasLimit,
                extraData,
                false
            )
        );

        emit ReceiveRTC(
            any2EvmMessage.messageId,
            any2EvmMessage.sourceChainSelector,
            caller,
            destination,
            extraData
        );
    }

    function _getFees(
        uint64 destChainSelector,
        uint64 execChainSelector,
        Client.EVM2AnyMessage memory message
    ) internal view returns (uint256 ccipFee, uint256 totalFee) {
        // Multiply fees by 2 if not a direct lane
        uint256 laneMultiplier = (destChainSelector == execChainSelector) ? 1 : 2;
        ccipFee = IRouterClient(getRouter()).getFee(destChainSelector, message);
        totalFee = (ccipFee + (ccipFee * feePercentage / 100)) * laneMultiplier;
    }

    function _directLaneExists(uint64 execChainSelector) internal view returns (bool) {
        return IRouterClient(getRouter()).isChainSupported(execChainSelector);
    }
    
    function _getDestChainSelector(uint64 execChainSelector) internal view returns (uint64 selector) {
        selector = _directLaneExists(execChainSelector) ? execChainSelector : relayerChainSelector;
    }

    /// @notice Fallback function to allow the contract to receive Ether.
    /// @dev This function has no function body, making it a default function for receiving Ether.
    /// It is automatically called when Ether is sent to the contract without any data.
    receive() external payable {}

    /// ERC165
    function supportsInterface(
        bytes4 interfaceId
    ) public view override(CCIPReceiver, AccessControl) returns (bool) {
        return CCIPReceiver.supportsInterface(interfaceId) || AccessControl.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_sourceRouter","type":"address"},{"internalType":"uint64","name":"_thisChainSelector","type":"uint64"},{"internalType":"uint64","name":"_relayerChainSelector","type":"uint64"},{"internalType":"address","name":"_roleManager","type":"address"},{"internalType":"address","name":"_ccipManager","type":"address"},{"internalType":"address","name":"_harvestManager","type":"address"},{"internalType":"address","name":"_feeManager","type":"address"},{"internalType":"uint256","name":"_feePercentage","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"InvalidRouter","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"gatewayWallet","type":"address"},{"indexed":true,"internalType":"address","name":"destination","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"},{"indexed":false,"internalType":"address","name":"contractDeployed","type":"address"},{"indexed":false,"internalType":"bytes32","name":"extraData","type":"bytes32"}],"name":"Execute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"address","name":"targetContract","type":"address"},{"indexed":false,"internalType":"bytes32","name":"extraData","type":"bytes32"}],"name":"ReceiveRTC","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"execChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"targetContract","type":"address"},{"indexed":false,"internalType":"bytes32","name":"extraData","type":"bytes32"},{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"ccipfees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalFees","type":"uint256"}],"name":"SendRTC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"gatewayWallet","type":"address"}],"name":"WalletDeploy","type":"event"},{"inputs":[],"name":"CCIP_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HARVEST_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64[][]","name":"execChainSelectors","type":"uint64[][]"},{"internalType":"string[]","name":"salt","type":"string[]"},{"internalType":"address[]","name":"destination","type":"address[]"},{"internalType":"uint256[]","name":"value","type":"uint256[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"uint256[]","name":"gasLimit","type":"uint256[]"},{"internalType":"bytes32[]","name":"extraData","type":"bytes32[]"}],"name":"batchExecute","outputs":[{"internalType":"bool[]","name":"success","type":"bool[]"},{"internalType":"address[]","name":"contractDeployed","type":"address[]"},{"internalType":"bytes32[]","name":"messageId","type":"bytes32[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"salt","type":"string"}],"name":"calculateAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"uint64[][]","name":"execChainSelectors","type":"uint64[][]"},{"internalType":"string[]","name":"salt","type":"string[]"},{"internalType":"address[]","name":"destination","type":"address[]"},{"internalType":"uint256[]","name":"value","type":"uint256[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"uint256[]","name":"gasLimit","type":"uint256[]"},{"internalType":"bytes32[]","name":"extraData","type":"bytes32[]"}],"name":"calculateBatchExecuteFee","outputs":[{"internalType":"uint256","name":"totalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"salt","type":"string"},{"internalType":"bytes","name":"byteCode","type":"bytes"},{"internalType":"bytes32","name":"create2Salt","type":"bytes32"}],"name":"calculateCreate2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"uint64[]","name":"execChainSelectors","type":"uint64[]"},{"internalType":"string","name":"salt","type":"string"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes32","name":"extraData","type":"bytes32"}],"name":"calculateExecuteFee","outputs":[{"internalType":"uint256","name":"totalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"destTokenAmounts","type":"tuple[]"}],"internalType":"struct Client.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"controllingChains","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"salt","type":"string"}],"name":"deploy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deployed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"execChainSelectors","type":"uint64[]"},{"internalType":"string","name":"salt","type":"string"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes32","name":"extraData","type":"bytes32"}],"name":"execute","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"address","name":"contractDeployed","type":"address"},{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getDeployedWallets","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":[],"name":"getRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"instances","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"relayerChainSelector","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","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":"address","name":"","type":"address"}],"name":"salts","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thisChainSelector","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feePercentage","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRouterAddress","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040516200436f3803806200436f8339810160408190526200003491620003c0565b876001600160a01b03811662000065576040516335fdcccd60e21b8152600060048201526024015b60405180910390fd5b600080546001600160a01b039092166001600160a01b0319909216919091178155600380546001600160401b0389811668010000000000000000026001600160801b0319909216908b16171790556002829055620000c4908662000302565b620000f07f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c8362000302565b6200011c7f5e63ccb182cbf95a0325198ff9446f31e71dd50ca9c82361f97e85a24288d0fa8462000302565b620001487f6345c8a37e6dd89e52f65ade6338347620ff8f8c79b86d67c52eb45b0cf457bf8562000302565b866001600160401b0316866001600160401b03161480620001f557506000546001600160a01b0316600354604051631491520b60e31b8152680100000000000000009091046001600160401b031660048201526001600160a01b03919091169063a48a905890602401602060405180830381865afa158015620001cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f591906200045f565b6200024f5760405162461bcd60e51b8152602060048201526024808201527f496e76616c69642072656c6179657220636861696e20636f6e6669677572617460448201526334b7b71760e11b60648201526084016200005c565b6001600160a01b0382166200029c5760405162461bcd60e51b81526020600482015260126024820152710466565206d616e61676572206973203078360741b60448201526064016200005c565b6001600160a01b038416620002f45760405162461bcd60e51b815260206004820152601360248201527f43434950206d616e61676572206973203078300000000000000000000000000060448201526064016200005c565b50505050505050506200048a565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620003875760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45b5050565b80516001600160a01b0381168114620003a357600080fd5b919050565b80516001600160401b0381168114620003a357600080fd5b600080600080600080600080610100898b031215620003de57600080fd5b620003e9896200038b565b9750620003f960208a01620003a8565b96506200040960408a01620003a8565b95506200041960608a016200038b565b94506200042960808a016200038b565b93506200043960a08a016200038b565b92506200044960c08a016200038b565b915060e089015190509295985092959890939650565b6000602082840312156200047257600080fd5b815180151581146200048357600080fd5b9392505050565b613ed5806200049a6000396000f3fe608060405260043610620001f75760003560e01c80638f42671c116200010b578063b23e448011620000a1578063d7bf860a116200006c578063d7bf860a1462000684578063e191233214620006a9578063e6114eb414620006ce578063fe408529146200070b57600080fd5b8063b23e448014620005e1578063c76023161462000615578063c851cc32146200063a578063d547741f146200065f57600080fd5b8063a001ecdd11620000e2578063a001ecdd146200055c578063a217fddf1462000574578063a6ca3e46146200058b578063b0f479a114620005c157600080fd5b80638f42671c14620004dc5780639012c4a8146200051257806391d14854146200053757600080fd5b80632f2ff15d116200018d5780636ac6dfce11620001585780636ac6dfce146200041557806385572ffb146200044f57806385bb392314620004745780638d891b1414620004a857600080fd5b80632f2ff15d146200036457806336568abe14620003895780634a927eb214620003ae57806353a77fa114620003ec57600080fd5b80630c3823a911620001ce5780630c3823a914620002be578063248a9ca314620002e357806329ca78d214620003185780632e1a7d4d146200033d57600080fd5b806301ffc9a7146200020457806305db2f41146200023e57806309c6df00146200028357600080fd5b36620001ff57005b600080fd5b3480156200021157600080fd5b5062000229620002233660046200227f565b62000733565b60405190151581526020015b60405180910390f35b3480156200024b57600080fd5b50620002747f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c81565b60405190815260200162000235565b3480156200029057600080fd5b50600354620002a5906001600160401b031681565b6040516001600160401b03909116815260200162000235565b348015620002cb57600080fd5b5062000274620002dd36600462002711565b62000758565b348015620002f057600080fd5b50620002746200030236600462002854565b6000908152600160208190526040909120015490565b3480156200032557600080fd5b5062000274620003373660046200286e565b6200086c565b3480156200034a57600080fd5b50620003626200035c36600462002854565b62000958565b005b3480156200037157600080fd5b50620003626200038336600462002942565b62000a08565b3480156200039657600080fd5b5062000362620003a836600462002942565b62000a37565b348015620003bb57600080fd5b50620003d3620003cd36600462002975565b62000ab5565b6040516001600160a01b03909116815260200162000235565b348015620003f957600080fd5b50600354620002a590600160401b90046001600160401b031681565b3480156200042257600080fd5b50620002a562000434366004620029a4565b6005602052600090815260409020546001600160401b031681565b3480156200045c57600080fd5b50620003626200046e366004620029c4565b62000aee565b3480156200048157600080fd5b506200022962000493366004620029a4565b60046020526000908152604090205460ff1681565b348015620004b557600080fd5b50620004cd620004c7366004620029a4565b62000b35565b60405162000235919062002a47565b348015620004e957600080fd5b50620002747f6345c8a37e6dd89e52f65ade6338347620ff8f8c79b86d67c52eb45b0cf457bf81565b3480156200051f57600080fd5b50620003626200053136600462002854565b62000bad565b3480156200054457600080fd5b50620002296200055636600462002942565b62000c97565b3480156200056957600080fd5b506200027460025481565b3480156200058157600080fd5b5062000274600081565b3480156200059857600080fd5b50620002747f5e63ccb182cbf95a0325198ff9446f31e71dd50ca9c82361f97e85a24288d0fa81565b348015620005ce57600080fd5b506000546001600160a01b0316620003d3565b348015620005ee57600080fd5b506200060662000600366004620029a4565b62000cc2565b60405162000235919062002ab0565b3480156200062257600080fd5b50620003d36200063436600462002ac5565b62000d64565b3480156200064757600080fd5b506200036262000659366004620029a4565b62000d82565b3480156200066c57600080fd5b50620003626200067e36600462002942565b62000e1e565b3480156200069157600080fd5b50620003d3620006a336600462002b05565b62000e48565b348015620006b657600080fd5b50620003d3620006c836600462002b8b565b62000ea0565b620006e5620006df36600462002be0565b62000f19565b6040805193151584526001600160a01b0390921660208401529082015260600162000235565b620007226200071c36600462002ca5565b620010c9565b604051620002359392919062002dd5565b600062000740826200130d565b80620007525750620007528262001344565b92915050565b6000805b88518110156200085f576200083c8a8a838151811062000780576200078062002e6d565b60200260200101518a84815181106200079d576200079d62002e6d565b60200260200101518a8581518110620007ba57620007ba62002e6d565b60200260200101518a8681518110620007d757620007d762002e6d565b60200260200101518a8781518110620007f457620007f462002e6d565b60200260200101518a888151811062000811576200081162002e6d565b60200260200101518a89815181106200082e576200082e62002e6d565b60200260200101516200086c565b62000848908362002e99565b915080620008568162002eaf565b9150506200075c565b5098975050505050505050565b6000805b88518110156200085f57600089828151811062000891576200089162002e6d565b60209081029190910101516003549091506001600160401b0380831691161462000942576000620008c2826200137b565b905060006200091b308e600360009054906101000a90046001600160401b0316868f8f8f8f8f8f604051602001620009039998979695949392919062002ecb565b60405160208183030381529060405260008a620013aa565b905060006200092c838584620014e4565b91506200093c9050818762002e99565b95505050505b50806200094f8162002eaf565b91505062000870565b620009847f5e63ccb182cbf95a0325198ff9446f31e71dd50ca9c82361f97e85a24288d0fa3362000c97565b620009d65760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f7420612068617276657374206d616e616765722e60448201526064015b60405180910390fd5b604051339082156108fc029083906000818181858888f1935050505015801562000a04573d6000803e3d6000fd5b5050565b6000828152600160208190526040909120015462000a2681620015dd565b62000a328383620015e9565b505050565b6001600160a01b038116331462000aa95760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401620009cd565b62000a04828262001657565b6007602052816000526040600020818154811062000ad257600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000546001600160a01b0316331462000b1d576040516335fdcccd60e21b8152336004820152602401620009cd565b62000b3262000b2c8262002fdd565b620016c1565b50565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801562000ba157602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000b82575b50505050509050919050565b62000bd97f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c3362000c97565b62000c275760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74206120666565206d616e616765722e000000006044820152606401620009cd565b606481111562000c925760405162461bcd60e51b815260206004820152602f60248201527f506c6174666f726d206665652069732063617070656420746f2031303025206f60448201526e33103a34329021a1a4a8103332b29760891b6064820152608401620009cd565b600255565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6006602052600090815260409020805462000cdd9062003097565b80601f016020809104026020016040519081016040528092919081815260200182805462000d0b9062003097565b801562000d5c5780601f1062000d305761010080835404028352916020019162000d5c565b820191906000526020600020905b81548152906001019060200180831162000d3e57829003601f168201915b505050505081565b6003546000906200075290339084906001600160401b031662001883565b62000dae7f6345c8a37e6dd89e52f65ade6338347620ff8f8c79b86d67c52eb45b0cf457bf3362000c97565b62000dfc5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f7420612063636970206d616e616765722e0000006044820152606401620009cd565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600160208190526040909120015462000e3c81620015dd565b62000a32838362001657565b6000806001600160f81b031962000e60878762000ea0565b84868051906020012060405160200162000e7e9493929190620030d3565b60408051808303601f1901815291905280516020909101209695505050505050565b60008060ff60f81b30858560405160200162000ebe9291906200310c565b6040516020818303038152906040528051906020012062000edf8762001a33565b805160209182012060405162000ef99594939201620030d3565b60408051808303601f190181529190528051602090910120949350505050565b600080806001600160a01b0388161580159062000f3557508315155b15620010045760408051630b135d3f60e11b8152600481018690526024810191909152600060448201523390631626ba7e90606401602060405180830381865afa15801562000f88573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fae919062003146565b6001600160e01b031916631626ba7e60e01b14620010045760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b6044820152606401620009cd565b60005b8a51811015620010bb5760408051610140810182523381526003546001600160401b031660208201528c516200109f928201908e90859081106200104f576200104f62002e6d565b60200260200101516001600160401b031681526020018c81526020018b6001600160a01b031681526020018a81526020018981526020018881526020018781526020016001151581525062001aaa565b9195509350915080620010b28162002eaf565b91505062001007565b509750975097945050505050565b606080606089516001600160401b03811115620010ea57620010ea620022c7565b60405190808252806020026020018201604052801562001114578160200160208202803683370190505b50925089516001600160401b03811115620011335762001133620022c7565b6040519080825280602002602001820160405280156200115d578160200160208202803683370190505b50915089516001600160401b038111156200117c576200117c620022c7565b604051908082528060200260200182016040528015620011a6578160200160208202803683370190505b50905060005b8a51811015620010bb576200128b8b8281518110620011cf57620011cf62002e6d565b60200260200101518b8381518110620011ec57620011ec62002e6d565b60200260200101518b848151811062001209576200120962002e6d565b60200260200101518b858151811062001226576200122662002e6d565b60200260200101518b868151811062001243576200124362002e6d565b60200260200101518b878151811062001260576200126062002e6d565b60200260200101518b88815181106200127d576200127d62002e6d565b602002602001015162000f19565b868481518110620012a057620012a062002e6d565b60200260200101868581518110620012bc57620012bc62002e6d565b60200260200101868681518110620012d857620012d862002e6d565b60209081029190910101929092526001600160a01b039092169052901515905280620013048162002eaf565b915050620011ac565b60006001600160e01b031982166385572ffb60e01b14806200075257506001600160e01b031982166301ffc9a760e01b1492915050565b60006001600160e01b03198216637965db0b60e01b14806200075257506301ffc9a760e01b6001600160e01b031983161462000752565b6000620013888262001d31565b620013a657600354600160401b90046001600160401b031662000752565b5090565b620013e66040518060a0016040528060608152602001606081526020016060815260200160006001600160a01b03168152602001606081525090565b6040805160a0810182526001600160a01b03871660c0808301919091528251808303909101815260e082018352815260208082018790528251600080825291810184529092820190836200145d565b6040805180820190915260008082526020820152815260200190600190039081620014355790505b508152602001856001600160a01b03168152602001620014d86040518060400160405280878152602001600015158152506040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180516001600160e01b03166397a657c960e01b17905290565b90529695505050505050565b6000806000846001600160401b0316866001600160401b0316146200150b5760026200150e565b60015b60ff169050620015266000546001600160a01b031690565b6001600160a01b03166320487ded87866040518363ffffffff1660e01b81526004016200155592919062003166565b602060405180830381865afa15801562001573573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001599919062003247565b925080606460025485620015ae919062003261565b620015ba91906200327b565b620015c6908562002e99565b620015d2919062003261565b915050935093915050565b62000b32813362001db4565b620015f5828262000c97565b62000a045760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62001663828262000c97565b1562000a045760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b306001600160a01b03168160400151806020019051810190620016e59190620032ab565b6001600160a01b031614620017635760405162461bcd60e51b815260206004820152603d60248201527f4f6e6c79206f6666696369616c204b6c61737465724761746577617953696e6760448201527f6c65746f6e2063616e2073656e642043434950206d657373616765732e0000006064820152608401620009cd565b600080600080600080600080600089606001518060200190518101906200178b919062003324565b985098509850985098509850985098509850620018146040518061014001604052808b6001600160a01b031681526020018a6001600160401b03168152602001896001600160401b03168152602001888152602001876001600160a01b031681526020018681526020018581526020018481526020018381526020016000151581525062001aaa565b5050506020808b01518b51604080516001600160a01b03808f1682528a169481019490945283018490526001600160401b03909116917ff5e17f7f42e761b9417b96f6728922396e5f6f9d08346396ccd4f6d80789fcfc9060600160405180910390a350505050505050505050565b60006004600062001895868662000ea0565b6001600160a01b0316815260208101919091526040016000205460ff16156200190f5760405162461bcd60e51b815260206004820152602560248201527f416c7265616479206465706c6f796564212055736520646966666572656e742060448201526473616c742160d81b6064820152608401620009cd565b60006200191c8562001a33565b905060008585604051602001620019359291906200310c565b604051602081830303815290604052805190602001209050808251602084016000f56001600160a01b0381166000908152600460209081526040808320805460ff19166001179055600690915290209093506200199386826200344d565b506001600160a01b038381166000818152600560209081526040808320805467ffffffffffffffff19166001600160401b038b16179055938a168083526007825284832080546001810182559084529282902090920180546001600160a01b031916841790559251918252917f408e677a4fb5b1bbb99ce4cceadc347f28a7ce8480b12a9a1fcb4e7cef3b527d910160405180910390a250509392505050565b606060006040518060200162001a49906200225a565b601f1982820381018352601f9091011660408181526001600160a01b038616602083015291925082910160408051601f198184030181529082905262001a93929160200162003519565b604051602081830303815290604052915050919050565b6003546040820151600091829182916001600160401b0390811691160362001b055762001afa84602001518560000151866060015187608001518860a001518960c001518a610100015162001e18565b909350915062001d2a565b600062001b1685604001516200137b565b9050600062001b83308760000151886020015189604001518a606001518b608001518c60a001518d60c001518e60e001518f610100015160405160200162001b679998979695949392919062002ecb565b60405160208183030381529060405260008960e00151620013aa565b905060008062001b9984896040015185620014e4565b915091508761012001511562001c1a578034101562001c1a5760405162461bcd60e51b815260206004820152603660248201527f457468657220616d6f756e7420746f6f206c6f772e2053656e64206d6f72652060448201527532ba3432b9103a379032bc32b1baba329031b0b6361760511b6064820152608401620009cd565b6000546040516396f4e9f960e01b8152600198506001600160a01b03909116906396f4e9f990849062001c54908890889060040162003166565b60206040518083038185885af115801562001c73573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062001c9a919062003247565b88516040808b01516080808d01516101008e015184516001600160401b038c8116825290941660208501526001600160a01b0391821684860152606084015260009183019190915260a0820187905260c08201869052915193985091169187917faf3488626caa53f1d25b5a3850e43280695530019d11e81740d16209391587da919081900360e00190a3505050505b9193909250565b600080546001600160a01b0316604051631491520b60e31b81526001600160401b03841660048201526001600160a01b03919091169063a48a905890602401602060405180830381865afa15801562001d8e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200075291906200355d565b62001dc0828262000c97565b62000a045762001dd08162002087565b62001ddd8360206200209a565b60405160200162001df09291906200357b565b60408051601f198184030181529082905262461bcd60e51b8252620009cd9160040162002ab0565b600080600062001e29898962000ea0565b6001600160a01b03811660009081526004602052604090205490915060ff1662001e615762001e5a89898c62001883565b5062001ee7565b6001600160a01b0381166000908152600560205260409020546001600160401b038b811691161462001ee75760405162461bcd60e51b815260206004820152602860248201527f43616e206f6e6c7920657865637574652066726f6d20636f6e74726f6c6c696e604482015267339031b430b4b71760c11b6064820152608401620009cd565b6000819050896001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001f35573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f5b9190620032ab565b6001600160a01b03161462001fa35760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420616e206f776e65722160981b6044820152606401620009cd565b604051637c5c4e6360e11b81526001600160a01b0382169063f8b89cc69062001fd7908b908b908b908b90600401620035f4565b60408051808303816000875af115801562001ff6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200201c91906200362e565b6040805183151581526001600160a01b038084166020830152918101899052929650909450808a1691848216918d16907f164339a296eae5d2a4502454bf4bfcd3a03e70fc5b9116b91eb4b055e22a5aa59060600160405180910390a4505097509795505050505050565b6060620007526001600160a01b03831660145b60606000620020ab83600262003261565b620020b890600262002e99565b6001600160401b03811115620020d257620020d2620022c7565b6040519080825280601f01601f191660200182016040528015620020fd576020820181803683370190505b509050600360fc1b816000815181106200211b576200211b62002e6d565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106200214d576200214d62002e6d565b60200101906001600160f81b031916908160001a90535060006200217384600262003261565b6200218090600162002e99565b90505b600181111562002202576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620021b857620021b862002e6d565b1a60f81b828281518110620021d157620021d162002e6d565b60200101906001600160f81b031916908160001a90535060049490941c93620021fa816200365f565b905062002183565b508315620022535760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620009cd565b9392505050565b610826806200367a83390190565b6001600160e01b03198116811462000b3257600080fd5b6000602082840312156200229257600080fd5b8135620022538162002268565b6001600160a01b038116811462000b3257600080fd5b8035620022c2816200229f565b919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620023025762002302620022c7565b60405290565b60405160a081016001600160401b0381118282101715620023025762002302620022c7565b604051601f8201601f191681016001600160401b0381118282101715620023585762002358620022c7565b604052919050565b60006001600160401b038211156200237c576200237c620022c7565b5060051b60200190565b6001600160401b038116811462000b3257600080fd5b8035620022c28162002386565b600082601f830112620023bb57600080fd5b81356020620023d4620023ce8362002360565b6200232d565b82815260059290921b84018101918181019086841115620023f457600080fd5b8286015b848110156200241c5780356200240e8162002386565b8352918301918301620023f8565b509695505050505050565b600082601f8301126200243957600080fd5b813560206200244c620023ce8362002360565b82815260059290921b840181019181810190868411156200246c57600080fd5b8286015b848110156200241c5780356001600160401b03811115620024915760008081fd5b620024a18986838b0101620023a9565b84525091830191830162002470565b60006001600160401b03821115620024cc57620024cc620022c7565b50601f01601f191660200190565b600082601f830112620024ec57600080fd5b8135620024fd620023ce82620024b0565b8181528460208386010111156200251357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126200254257600080fd5b8135602062002555620023ce8362002360565b82815260059290921b840181019181810190868411156200257557600080fd5b8286015b848110156200241c5780356001600160401b038111156200259a5760008081fd5b620025aa8986838b0101620024da565b84525091830191830162002579565b600082601f830112620025cb57600080fd5b81356020620025de620023ce8362002360565b82815260059290921b84018101918181019086841115620025fe57600080fd5b8286015b848110156200241c57803562002618816200229f565b835291830191830162002602565b600082601f8301126200263857600080fd5b813560206200264b620023ce8362002360565b82815260059290921b840181019181810190868411156200266b57600080fd5b8286015b848110156200241c57803583529183019183016200266f565b600082601f8301126200269a57600080fd5b81356020620026ad620023ce8362002360565b82815260059290921b84018101918181019086841115620026cd57600080fd5b8286015b848110156200241c5780356001600160401b03811115620026f25760008081fd5b620027028986838b0101620024da565b845250918301918301620026d1565b600080600080600080600080610100898b0312156200272f57600080fd5b6200273a89620022b5565b975060208901356001600160401b03808211156200275757600080fd5b620027658c838d0162002427565b985060408b01359150808211156200277c57600080fd5b6200278a8c838d0162002530565b975060608b0135915080821115620027a157600080fd5b620027af8c838d01620025b9565b965060808b0135915080821115620027c657600080fd5b620027d48c838d0162002626565b955060a08b0135915080821115620027eb57600080fd5b620027f98c838d0162002688565b945060c08b01359150808211156200281057600080fd5b6200281e8c838d0162002626565b935060e08b01359150808211156200283557600080fd5b50620028448b828c0162002626565b9150509295985092959890939650565b6000602082840312156200286757600080fd5b5035919050565b600080600080600080600080610100898b0312156200288c57600080fd5b6200289789620022b5565b975060208901356001600160401b0380821115620028b457600080fd5b620028c28c838d01620023a9565b985060408b0135915080821115620028d957600080fd5b620028e78c838d01620024da565b9750620028f760608c01620022b5565b965060808b0135955060a08b01359150808211156200291557600080fd5b50620029248b828c01620024da565b93505060c0890135915060e089013590509295985092959890939650565b600080604083850312156200295657600080fd5b8235915060208301356200296a816200229f565b809150509250929050565b600080604083850312156200298957600080fd5b823562002996816200229f565b946020939093013593505050565b600060208284031215620029b757600080fd5b813562002253816200229f565b600060208284031215620029d757600080fd5b81356001600160401b03811115620029ee57600080fd5b820160a081850312156200225357600080fd5b600081518084526020808501945080840160005b8381101562002a3c5781516001600160a01b03168752958201959082019060010162002a15565b509495945050505050565b60208152600062002253602083018462002a01565b60005b8381101562002a7957818101518382015260200162002a5f565b50506000910152565b6000815180845262002a9c81602086016020860162002a5c565b601f01601f19169290920160200192915050565b60208152600062002253602083018462002a82565b60006020828403121562002ad857600080fd5b81356001600160401b0381111562002aef57600080fd5b62002afd84828501620024da565b949350505050565b6000806000806080858703121562002b1c57600080fd5b843562002b29816200229f565b935060208501356001600160401b038082111562002b4657600080fd5b62002b5488838901620024da565b9450604087013591508082111562002b6b57600080fd5b5062002b7a87828801620024da565b949793965093946060013593505050565b6000806040838503121562002b9f57600080fd5b823562002bac816200229f565b915060208301356001600160401b0381111562002bc857600080fd5b62002bd685828601620024da565b9150509250929050565b600080600080600080600060e0888a03121562002bfc57600080fd5b87356001600160401b038082111562002c1457600080fd5b62002c228b838c01620023a9565b985060208a013591508082111562002c3957600080fd5b62002c478b838c01620024da565b975060408a0135915062002c5b826200229f565b909550606089013594506080890135908082111562002c7957600080fd5b5062002c888a828b01620024da565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600060e0888a03121562002cc157600080fd5b87356001600160401b038082111562002cd957600080fd5b62002ce78b838c0162002427565b985060208a013591508082111562002cfe57600080fd5b62002d0c8b838c0162002530565b975060408a013591508082111562002d2357600080fd5b62002d318b838c01620025b9565b965060608a013591508082111562002d4857600080fd5b62002d568b838c0162002626565b955060808a013591508082111562002d6d57600080fd5b62002d7b8b838c0162002688565b945060a08a013591508082111562002d9257600080fd5b62002da08b838c0162002626565b935060c08a013591508082111562002db757600080fd5b5062002dc68a828b0162002626565b91505092959891949750929550565b606080825284519082018190526000906020906080840190828801845b8281101562002e1257815115158452928401929084019060010162002df2565b5050508381038285015262002e28818762002a01565b8481036040860152855180825283870192509083019060005b8181101562002e5f5783518352928401929184019160010162002e41565b509098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111562000752576200075262002e83565b60006001820162002ec45762002ec462002e83565b5060010190565b6001600160a01b038a811682526001600160401b038a81166020840152891660408301526101206060830181905260009162002f0a8483018b62002a82565b91508089166080850152508660a084015282810360c084015262002f2f818762002a82565b60e084019590955250506101000152979650505050505050565b600082601f83011262002f5b57600080fd5b8135602062002f6e620023ce8362002360565b82815260069290921b8401810191818101908684111562002f8e57600080fd5b8286015b848110156200241c576040818903121562002fad5760008081fd5b62002fb7620022dd565b813562002fc4816200229f565b8152818501358582015283529183019160400162002f92565b600060a0823603121562002ff057600080fd5b62002ffa62002308565b823581526200300c602084016200239c565b602082015260408301356001600160401b03808211156200302c57600080fd5b6200303a36838701620024da565b604084015260608501359150808211156200305457600080fd5b6200306236838701620024da565b606084015260808501359150808211156200307c57600080fd5b506200308b3682860162002f49565b60808301525092915050565b600181811c90821680620030ac57607f821691505b602082108103620030cd57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b6bffffffffffffffffffffffff198360601b168152600082516200313881601485016020870162002a5c565b919091016014019392505050565b6000602082840312156200315957600080fd5b8151620022538162002268565b600060406001600160401b038516835260208181850152845160a0838601526200319460e086018262002a82565b905081860151603f1980878403016060880152620031b3838362002a82565b88860151888203830160808a01528051808352908601945060009350908501905b808410156200320857845180516001600160a01b0316835286015186830152938501936001939093019290860190620031d4565b5060608901516001600160a01b031660a08901526080890151888203830160c08a0152955062003239818762002a82565b9a9950505050505050505050565b6000602082840312156200325a57600080fd5b5051919050565b808202811582820484141762000752576200075262002e83565b6000826200329957634e487b7160e01b600052601260045260246000fd5b500490565b8051620022c2816200229f565b600060208284031215620032be57600080fd5b815162002253816200229f565b8051620022c28162002386565b600082601f830112620032ea57600080fd5b8151620032fb620023ce82620024b0565b8181528460208386010111156200331157600080fd5b62002afd82602083016020870162002a5c565b60008060008060008060008060006101208a8c0312156200334457600080fd5b895162003351816200229f565b60208b0151909950620033648162002386565b97506200337460408b01620032cb565b965060608a01516001600160401b03808211156200339157600080fd5b6200339f8d838e01620032d8565b9750620033af60808d016200329e565b965060a08c0151955060c08c0151915080821115620033cd57600080fd5b50620033dc8c828d01620032d8565b93505060e08a015191506101008a015190509295985092959850929598565b601f82111562000a3257600081815260208120601f850160051c81016020861015620034245750805b601f850160051c820191505b81811015620034455782815560010162003430565b505050505050565b81516001600160401b03811115620034695762003469620022c7565b62003481816200347a845462003097565b84620033fb565b602080601f831160018114620034b95760008415620034a05750858301515b600019600386901b1c1916600185901b17855562003445565b600085815260208120601f198616915b82811015620034ea57888601518255948401946001909101908401620034c9565b5085821015620035095787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600083516200352d81846020880162002a5c565b8351908301906200354381836020880162002a5c565b01949350505050565b80518015158114620022c257600080fd5b6000602082840312156200357057600080fd5b62002253826200354c565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351620035b581601785016020880162002a5c565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351620035e881602884016020880162002a5c565b01602801949350505050565b60018060a01b03851681528360208201526080604082015260006200361d608083018562002a82565b905082606083015295945050505050565b600080604083850312156200364257600080fd5b6200364d836200354c565b915060208301516200296a816200229f565b60008162003671576200367162002e83565b50600019019056fe608060405234801561001057600080fd5b5060405161082638038061082683398101604081905261002f916100a9565b61003833610059565b600180546001600160a01b0319163317905561005381610059565b506100d9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100bb57600080fd5b81516001600160a01b03811681146100d257600080fd5b9392505050565b61073e806100e86000396000f3fe60806040526004361061007f5760003560e01c80638da5cb5b1161004e5780638da5cb5b14610158578063b61d27f614610176578063f2fde38b146101b5578063f8b89cc6146101d557600080fd5b80631626ba7e1461008b5780632422224e146100c9578063361f107414610109578063715018a61461014157600080fd5b3661008657005b600080fd5b34801561009757600080fd5b506100ab6100a63660046105bb565b6101f5565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156100d557600080fd5b506100f96100e4366004610602565b60026020526000908152604090205460ff1681565b60405190151581526020016100c0565b34801561011557600080fd5b50600154610129906001600160a01b031681565b6040516001600160a01b0390911681526020016100c0565b34801561014d57600080fd5b5061015661021c565b005b34801561016457600080fd5b506000546001600160a01b0316610129565b34801561018257600080fd5b50610196610191366004610637565b610230565b6040805192151583526001600160a01b039091166020830152016100c0565b3480156101c157600080fd5b506101566101d036600461068e565b6102c2565b3480156101e157600080fd5b506101966101f03660046106a9565b61033b565b60008281526002602052604081205460ff16156102165750630b135d3f60e11b5b92915050565b6102246103aa565b61022e6000610404565b565b60015460009081906001600160a01b031633148061025857506000546001600160a01b031633145b6102995760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420616e206f776e65722160981b60448201526064015b60405180910390fd5b82516040516000919060208601838284838b8d6187965a03f19960009950975050505050505050565b6102ca6103aa565b6001600160a01b03811661032f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610290565b61033881610404565b50565b6000806001600160a01b03861661037657826000036103695760016103608686610454565b915091506103a1565b60016103608686866104b2565b8215610396576000838152600260205260409020805460ff191660011790555b610360868686610230565b94509492505050565b6000546001600160a01b0316331461022e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610290565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081516020830184f090506001600160a01b0381166102165760405162461bcd60e51b815260206004820152601960248201527810dbdd5b19081b9bdd0819195c1b1bde4818dbdb9d1c9858dd603a1b6044820152606401610290565b60008183518460200186f590506001600160a01b0381166105115760405162461bcd60e51b815260206004820152601960248201527810dbdd5b19081b9bdd0819195c1b1bde4818dbdb9d1c9858dd603a1b6044820152606401610290565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261053f57600080fd5b813567ffffffffffffffff8082111561055a5761055a610518565b604051601f8301601f19908116603f0116810190828211818310171561058257610582610518565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156105ce57600080fd5b82359150602083013567ffffffffffffffff8111156105ec57600080fd5b6105f88582860161052e565b9150509250929050565b60006020828403121561061457600080fd5b5035919050565b80356001600160a01b038116811461063257600080fd5b919050565b60008060006060848603121561064c57600080fd5b6106558461061b565b925060208401359150604084013567ffffffffffffffff81111561067857600080fd5b6106848682870161052e565b9150509250925092565b6000602082840312156106a057600080fd5b6105118261061b565b600080600080608085870312156106bf57600080fd5b6106c88561061b565b935060208501359250604085013567ffffffffffffffff8111156106eb57600080fd5b6106f78782880161052e565b94979396509394606001359350505056fea2646970667358221220e2b31b94af507bab95c4b1ccb782f9f42cd3b276ae3cbb934710dc22d31b8b8764736f6c63430008130033a26469706673582212200322c853cf2005918976253b0b9e50d25fdcf53549046b221b62a4959d5bb9a164736f6c63430008130033000000000000000000000000e561d5e02207fb5eb32cca20a699e0d8919a147600000000000000000000000000000000000000000000000045849994fc9c7b1500000000000000000000000000000000000000000000000045849994fc9c7b15000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac70170000000000000000000000000000000000000000000000000000000000000019

Deployed Bytecode

0x608060405260043610620001f75760003560e01c80638f42671c116200010b578063b23e448011620000a1578063d7bf860a116200006c578063d7bf860a1462000684578063e191233214620006a9578063e6114eb414620006ce578063fe408529146200070b57600080fd5b8063b23e448014620005e1578063c76023161462000615578063c851cc32146200063a578063d547741f146200065f57600080fd5b8063a001ecdd11620000e2578063a001ecdd146200055c578063a217fddf1462000574578063a6ca3e46146200058b578063b0f479a114620005c157600080fd5b80638f42671c14620004dc5780639012c4a8146200051257806391d14854146200053757600080fd5b80632f2ff15d116200018d5780636ac6dfce11620001585780636ac6dfce146200041557806385572ffb146200044f57806385bb392314620004745780638d891b1414620004a857600080fd5b80632f2ff15d146200036457806336568abe14620003895780634a927eb214620003ae57806353a77fa114620003ec57600080fd5b80630c3823a911620001ce5780630c3823a914620002be578063248a9ca314620002e357806329ca78d214620003185780632e1a7d4d146200033d57600080fd5b806301ffc9a7146200020457806305db2f41146200023e57806309c6df00146200028357600080fd5b36620001ff57005b600080fd5b3480156200021157600080fd5b5062000229620002233660046200227f565b62000733565b60405190151581526020015b60405180910390f35b3480156200024b57600080fd5b50620002747f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c81565b60405190815260200162000235565b3480156200029057600080fd5b50600354620002a5906001600160401b031681565b6040516001600160401b03909116815260200162000235565b348015620002cb57600080fd5b5062000274620002dd36600462002711565b62000758565b348015620002f057600080fd5b50620002746200030236600462002854565b6000908152600160208190526040909120015490565b3480156200032557600080fd5b5062000274620003373660046200286e565b6200086c565b3480156200034a57600080fd5b50620003626200035c36600462002854565b62000958565b005b3480156200037157600080fd5b50620003626200038336600462002942565b62000a08565b3480156200039657600080fd5b5062000362620003a836600462002942565b62000a37565b348015620003bb57600080fd5b50620003d3620003cd36600462002975565b62000ab5565b6040516001600160a01b03909116815260200162000235565b348015620003f957600080fd5b50600354620002a590600160401b90046001600160401b031681565b3480156200042257600080fd5b50620002a562000434366004620029a4565b6005602052600090815260409020546001600160401b031681565b3480156200045c57600080fd5b50620003626200046e366004620029c4565b62000aee565b3480156200048157600080fd5b506200022962000493366004620029a4565b60046020526000908152604090205460ff1681565b348015620004b557600080fd5b50620004cd620004c7366004620029a4565b62000b35565b60405162000235919062002a47565b348015620004e957600080fd5b50620002747f6345c8a37e6dd89e52f65ade6338347620ff8f8c79b86d67c52eb45b0cf457bf81565b3480156200051f57600080fd5b50620003626200053136600462002854565b62000bad565b3480156200054457600080fd5b50620002296200055636600462002942565b62000c97565b3480156200056957600080fd5b506200027460025481565b3480156200058157600080fd5b5062000274600081565b3480156200059857600080fd5b50620002747f5e63ccb182cbf95a0325198ff9446f31e71dd50ca9c82361f97e85a24288d0fa81565b348015620005ce57600080fd5b506000546001600160a01b0316620003d3565b348015620005ee57600080fd5b506200060662000600366004620029a4565b62000cc2565b60405162000235919062002ab0565b3480156200062257600080fd5b50620003d36200063436600462002ac5565b62000d64565b3480156200064757600080fd5b506200036262000659366004620029a4565b62000d82565b3480156200066c57600080fd5b50620003626200067e36600462002942565b62000e1e565b3480156200069157600080fd5b50620003d3620006a336600462002b05565b62000e48565b348015620006b657600080fd5b50620003d3620006c836600462002b8b565b62000ea0565b620006e5620006df36600462002be0565b62000f19565b6040805193151584526001600160a01b0390921660208401529082015260600162000235565b620007226200071c36600462002ca5565b620010c9565b604051620002359392919062002dd5565b600062000740826200130d565b80620007525750620007528262001344565b92915050565b6000805b88518110156200085f576200083c8a8a838151811062000780576200078062002e6d565b60200260200101518a84815181106200079d576200079d62002e6d565b60200260200101518a8581518110620007ba57620007ba62002e6d565b60200260200101518a8681518110620007d757620007d762002e6d565b60200260200101518a8781518110620007f457620007f462002e6d565b60200260200101518a888151811062000811576200081162002e6d565b60200260200101518a89815181106200082e576200082e62002e6d565b60200260200101516200086c565b62000848908362002e99565b915080620008568162002eaf565b9150506200075c565b5098975050505050505050565b6000805b88518110156200085f57600089828151811062000891576200089162002e6d565b60209081029190910101516003549091506001600160401b0380831691161462000942576000620008c2826200137b565b905060006200091b308e600360009054906101000a90046001600160401b0316868f8f8f8f8f8f604051602001620009039998979695949392919062002ecb565b60405160208183030381529060405260008a620013aa565b905060006200092c838584620014e4565b91506200093c9050818762002e99565b95505050505b50806200094f8162002eaf565b91505062000870565b620009847f5e63ccb182cbf95a0325198ff9446f31e71dd50ca9c82361f97e85a24288d0fa3362000c97565b620009d65760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f7420612068617276657374206d616e616765722e60448201526064015b60405180910390fd5b604051339082156108fc029083906000818181858888f1935050505015801562000a04573d6000803e3d6000fd5b5050565b6000828152600160208190526040909120015462000a2681620015dd565b62000a328383620015e9565b505050565b6001600160a01b038116331462000aa95760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401620009cd565b62000a04828262001657565b6007602052816000526040600020818154811062000ad257600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000546001600160a01b0316331462000b1d576040516335fdcccd60e21b8152336004820152602401620009cd565b62000b3262000b2c8262002fdd565b620016c1565b50565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801562000ba157602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000b82575b50505050509050919050565b62000bd97f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c3362000c97565b62000c275760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74206120666565206d616e616765722e000000006044820152606401620009cd565b606481111562000c925760405162461bcd60e51b815260206004820152602f60248201527f506c6174666f726d206665652069732063617070656420746f2031303025206f60448201526e33103a34329021a1a4a8103332b29760891b6064820152608401620009cd565b600255565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6006602052600090815260409020805462000cdd9062003097565b80601f016020809104026020016040519081016040528092919081815260200182805462000d0b9062003097565b801562000d5c5780601f1062000d305761010080835404028352916020019162000d5c565b820191906000526020600020905b81548152906001019060200180831162000d3e57829003601f168201915b505050505081565b6003546000906200075290339084906001600160401b031662001883565b62000dae7f6345c8a37e6dd89e52f65ade6338347620ff8f8c79b86d67c52eb45b0cf457bf3362000c97565b62000dfc5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f7420612063636970206d616e616765722e0000006044820152606401620009cd565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600160208190526040909120015462000e3c81620015dd565b62000a32838362001657565b6000806001600160f81b031962000e60878762000ea0565b84868051906020012060405160200162000e7e9493929190620030d3565b60408051808303601f1901815291905280516020909101209695505050505050565b60008060ff60f81b30858560405160200162000ebe9291906200310c565b6040516020818303038152906040528051906020012062000edf8762001a33565b805160209182012060405162000ef99594939201620030d3565b60408051808303601f190181529190528051602090910120949350505050565b600080806001600160a01b0388161580159062000f3557508315155b15620010045760408051630b135d3f60e11b8152600481018690526024810191909152600060448201523390631626ba7e90606401602060405180830381865afa15801562000f88573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fae919062003146565b6001600160e01b031916631626ba7e60e01b14620010045760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b6044820152606401620009cd565b60005b8a51811015620010bb5760408051610140810182523381526003546001600160401b031660208201528c516200109f928201908e90859081106200104f576200104f62002e6d565b60200260200101516001600160401b031681526020018c81526020018b6001600160a01b031681526020018a81526020018981526020018881526020018781526020016001151581525062001aaa565b9195509350915080620010b28162002eaf565b91505062001007565b509750975097945050505050565b606080606089516001600160401b03811115620010ea57620010ea620022c7565b60405190808252806020026020018201604052801562001114578160200160208202803683370190505b50925089516001600160401b03811115620011335762001133620022c7565b6040519080825280602002602001820160405280156200115d578160200160208202803683370190505b50915089516001600160401b038111156200117c576200117c620022c7565b604051908082528060200260200182016040528015620011a6578160200160208202803683370190505b50905060005b8a51811015620010bb576200128b8b8281518110620011cf57620011cf62002e6d565b60200260200101518b8381518110620011ec57620011ec62002e6d565b60200260200101518b848151811062001209576200120962002e6d565b60200260200101518b858151811062001226576200122662002e6d565b60200260200101518b868151811062001243576200124362002e6d565b60200260200101518b878151811062001260576200126062002e6d565b60200260200101518b88815181106200127d576200127d62002e6d565b602002602001015162000f19565b868481518110620012a057620012a062002e6d565b60200260200101868581518110620012bc57620012bc62002e6d565b60200260200101868681518110620012d857620012d862002e6d565b60209081029190910101929092526001600160a01b039092169052901515905280620013048162002eaf565b915050620011ac565b60006001600160e01b031982166385572ffb60e01b14806200075257506001600160e01b031982166301ffc9a760e01b1492915050565b60006001600160e01b03198216637965db0b60e01b14806200075257506301ffc9a760e01b6001600160e01b031983161462000752565b6000620013888262001d31565b620013a657600354600160401b90046001600160401b031662000752565b5090565b620013e66040518060a0016040528060608152602001606081526020016060815260200160006001600160a01b03168152602001606081525090565b6040805160a0810182526001600160a01b03871660c0808301919091528251808303909101815260e082018352815260208082018790528251600080825291810184529092820190836200145d565b6040805180820190915260008082526020820152815260200190600190039081620014355790505b508152602001856001600160a01b03168152602001620014d86040518060400160405280878152602001600015158152506040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180516001600160e01b03166397a657c960e01b17905290565b90529695505050505050565b6000806000846001600160401b0316866001600160401b0316146200150b5760026200150e565b60015b60ff169050620015266000546001600160a01b031690565b6001600160a01b03166320487ded87866040518363ffffffff1660e01b81526004016200155592919062003166565b602060405180830381865afa15801562001573573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001599919062003247565b925080606460025485620015ae919062003261565b620015ba91906200327b565b620015c6908562002e99565b620015d2919062003261565b915050935093915050565b62000b32813362001db4565b620015f5828262000c97565b62000a045760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62001663828262000c97565b1562000a045760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b306001600160a01b03168160400151806020019051810190620016e59190620032ab565b6001600160a01b031614620017635760405162461bcd60e51b815260206004820152603d60248201527f4f6e6c79206f6666696369616c204b6c61737465724761746577617953696e6760448201527f6c65746f6e2063616e2073656e642043434950206d657373616765732e0000006064820152608401620009cd565b600080600080600080600080600089606001518060200190518101906200178b919062003324565b985098509850985098509850985098509850620018146040518061014001604052808b6001600160a01b031681526020018a6001600160401b03168152602001896001600160401b03168152602001888152602001876001600160a01b031681526020018681526020018581526020018481526020018381526020016000151581525062001aaa565b5050506020808b01518b51604080516001600160a01b03808f1682528a169481019490945283018490526001600160401b03909116917ff5e17f7f42e761b9417b96f6728922396e5f6f9d08346396ccd4f6d80789fcfc9060600160405180910390a350505050505050505050565b60006004600062001895868662000ea0565b6001600160a01b0316815260208101919091526040016000205460ff16156200190f5760405162461bcd60e51b815260206004820152602560248201527f416c7265616479206465706c6f796564212055736520646966666572656e742060448201526473616c742160d81b6064820152608401620009cd565b60006200191c8562001a33565b905060008585604051602001620019359291906200310c565b604051602081830303815290604052805190602001209050808251602084016000f56001600160a01b0381166000908152600460209081526040808320805460ff19166001179055600690915290209093506200199386826200344d565b506001600160a01b038381166000818152600560209081526040808320805467ffffffffffffffff19166001600160401b038b16179055938a168083526007825284832080546001810182559084529282902090920180546001600160a01b031916841790559251918252917f408e677a4fb5b1bbb99ce4cceadc347f28a7ce8480b12a9a1fcb4e7cef3b527d910160405180910390a250509392505050565b606060006040518060200162001a49906200225a565b601f1982820381018352601f9091011660408181526001600160a01b038616602083015291925082910160408051601f198184030181529082905262001a93929160200162003519565b604051602081830303815290604052915050919050565b6003546040820151600091829182916001600160401b0390811691160362001b055762001afa84602001518560000151866060015187608001518860a001518960c001518a610100015162001e18565b909350915062001d2a565b600062001b1685604001516200137b565b9050600062001b83308760000151886020015189604001518a606001518b608001518c60a001518d60c001518e60e001518f610100015160405160200162001b679998979695949392919062002ecb565b60405160208183030381529060405260008960e00151620013aa565b905060008062001b9984896040015185620014e4565b915091508761012001511562001c1a578034101562001c1a5760405162461bcd60e51b815260206004820152603660248201527f457468657220616d6f756e7420746f6f206c6f772e2053656e64206d6f72652060448201527532ba3432b9103a379032bc32b1baba329031b0b6361760511b6064820152608401620009cd565b6000546040516396f4e9f960e01b8152600198506001600160a01b03909116906396f4e9f990849062001c54908890889060040162003166565b60206040518083038185885af115801562001c73573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062001c9a919062003247565b88516040808b01516080808d01516101008e015184516001600160401b038c8116825290941660208501526001600160a01b0391821684860152606084015260009183019190915260a0820187905260c08201869052915193985091169187917faf3488626caa53f1d25b5a3850e43280695530019d11e81740d16209391587da919081900360e00190a3505050505b9193909250565b600080546001600160a01b0316604051631491520b60e31b81526001600160401b03841660048201526001600160a01b03919091169063a48a905890602401602060405180830381865afa15801562001d8e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200075291906200355d565b62001dc0828262000c97565b62000a045762001dd08162002087565b62001ddd8360206200209a565b60405160200162001df09291906200357b565b60408051601f198184030181529082905262461bcd60e51b8252620009cd9160040162002ab0565b600080600062001e29898962000ea0565b6001600160a01b03811660009081526004602052604090205490915060ff1662001e615762001e5a89898c62001883565b5062001ee7565b6001600160a01b0381166000908152600560205260409020546001600160401b038b811691161462001ee75760405162461bcd60e51b815260206004820152602860248201527f43616e206f6e6c7920657865637574652066726f6d20636f6e74726f6c6c696e604482015267339031b430b4b71760c11b6064820152608401620009cd565b6000819050896001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001f35573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f5b9190620032ab565b6001600160a01b03161462001fa35760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420616e206f776e65722160981b6044820152606401620009cd565b604051637c5c4e6360e11b81526001600160a01b0382169063f8b89cc69062001fd7908b908b908b908b90600401620035f4565b60408051808303816000875af115801562001ff6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200201c91906200362e565b6040805183151581526001600160a01b038084166020830152918101899052929650909450808a1691848216918d16907f164339a296eae5d2a4502454bf4bfcd3a03e70fc5b9116b91eb4b055e22a5aa59060600160405180910390a4505097509795505050505050565b6060620007526001600160a01b03831660145b60606000620020ab83600262003261565b620020b890600262002e99565b6001600160401b03811115620020d257620020d2620022c7565b6040519080825280601f01601f191660200182016040528015620020fd576020820181803683370190505b509050600360fc1b816000815181106200211b576200211b62002e6d565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106200214d576200214d62002e6d565b60200101906001600160f81b031916908160001a90535060006200217384600262003261565b6200218090600162002e99565b90505b600181111562002202576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620021b857620021b862002e6d565b1a60f81b828281518110620021d157620021d162002e6d565b60200101906001600160f81b031916908160001a90535060049490941c93620021fa816200365f565b905062002183565b508315620022535760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620009cd565b9392505050565b610826806200367a83390190565b6001600160e01b03198116811462000b3257600080fd5b6000602082840312156200229257600080fd5b8135620022538162002268565b6001600160a01b038116811462000b3257600080fd5b8035620022c2816200229f565b919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620023025762002302620022c7565b60405290565b60405160a081016001600160401b0381118282101715620023025762002302620022c7565b604051601f8201601f191681016001600160401b0381118282101715620023585762002358620022c7565b604052919050565b60006001600160401b038211156200237c576200237c620022c7565b5060051b60200190565b6001600160401b038116811462000b3257600080fd5b8035620022c28162002386565b600082601f830112620023bb57600080fd5b81356020620023d4620023ce8362002360565b6200232d565b82815260059290921b84018101918181019086841115620023f457600080fd5b8286015b848110156200241c5780356200240e8162002386565b8352918301918301620023f8565b509695505050505050565b600082601f8301126200243957600080fd5b813560206200244c620023ce8362002360565b82815260059290921b840181019181810190868411156200246c57600080fd5b8286015b848110156200241c5780356001600160401b03811115620024915760008081fd5b620024a18986838b0101620023a9565b84525091830191830162002470565b60006001600160401b03821115620024cc57620024cc620022c7565b50601f01601f191660200190565b600082601f830112620024ec57600080fd5b8135620024fd620023ce82620024b0565b8181528460208386010111156200251357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126200254257600080fd5b8135602062002555620023ce8362002360565b82815260059290921b840181019181810190868411156200257557600080fd5b8286015b848110156200241c5780356001600160401b038111156200259a5760008081fd5b620025aa8986838b0101620024da565b84525091830191830162002579565b600082601f830112620025cb57600080fd5b81356020620025de620023ce8362002360565b82815260059290921b84018101918181019086841115620025fe57600080fd5b8286015b848110156200241c57803562002618816200229f565b835291830191830162002602565b600082601f8301126200263857600080fd5b813560206200264b620023ce8362002360565b82815260059290921b840181019181810190868411156200266b57600080fd5b8286015b848110156200241c57803583529183019183016200266f565b600082601f8301126200269a57600080fd5b81356020620026ad620023ce8362002360565b82815260059290921b84018101918181019086841115620026cd57600080fd5b8286015b848110156200241c5780356001600160401b03811115620026f25760008081fd5b620027028986838b0101620024da565b845250918301918301620026d1565b600080600080600080600080610100898b0312156200272f57600080fd5b6200273a89620022b5565b975060208901356001600160401b03808211156200275757600080fd5b620027658c838d0162002427565b985060408b01359150808211156200277c57600080fd5b6200278a8c838d0162002530565b975060608b0135915080821115620027a157600080fd5b620027af8c838d01620025b9565b965060808b0135915080821115620027c657600080fd5b620027d48c838d0162002626565b955060a08b0135915080821115620027eb57600080fd5b620027f98c838d0162002688565b945060c08b01359150808211156200281057600080fd5b6200281e8c838d0162002626565b935060e08b01359150808211156200283557600080fd5b50620028448b828c0162002626565b9150509295985092959890939650565b6000602082840312156200286757600080fd5b5035919050565b600080600080600080600080610100898b0312156200288c57600080fd5b6200289789620022b5565b975060208901356001600160401b0380821115620028b457600080fd5b620028c28c838d01620023a9565b985060408b0135915080821115620028d957600080fd5b620028e78c838d01620024da565b9750620028f760608c01620022b5565b965060808b0135955060a08b01359150808211156200291557600080fd5b50620029248b828c01620024da565b93505060c0890135915060e089013590509295985092959890939650565b600080604083850312156200295657600080fd5b8235915060208301356200296a816200229f565b809150509250929050565b600080604083850312156200298957600080fd5b823562002996816200229f565b946020939093013593505050565b600060208284031215620029b757600080fd5b813562002253816200229f565b600060208284031215620029d757600080fd5b81356001600160401b03811115620029ee57600080fd5b820160a081850312156200225357600080fd5b600081518084526020808501945080840160005b8381101562002a3c5781516001600160a01b03168752958201959082019060010162002a15565b509495945050505050565b60208152600062002253602083018462002a01565b60005b8381101562002a7957818101518382015260200162002a5f565b50506000910152565b6000815180845262002a9c81602086016020860162002a5c565b601f01601f19169290920160200192915050565b60208152600062002253602083018462002a82565b60006020828403121562002ad857600080fd5b81356001600160401b0381111562002aef57600080fd5b62002afd84828501620024da565b949350505050565b6000806000806080858703121562002b1c57600080fd5b843562002b29816200229f565b935060208501356001600160401b038082111562002b4657600080fd5b62002b5488838901620024da565b9450604087013591508082111562002b6b57600080fd5b5062002b7a87828801620024da565b949793965093946060013593505050565b6000806040838503121562002b9f57600080fd5b823562002bac816200229f565b915060208301356001600160401b0381111562002bc857600080fd5b62002bd685828601620024da565b9150509250929050565b600080600080600080600060e0888a03121562002bfc57600080fd5b87356001600160401b038082111562002c1457600080fd5b62002c228b838c01620023a9565b985060208a013591508082111562002c3957600080fd5b62002c478b838c01620024da565b975060408a0135915062002c5b826200229f565b909550606089013594506080890135908082111562002c7957600080fd5b5062002c888a828b01620024da565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600060e0888a03121562002cc157600080fd5b87356001600160401b038082111562002cd957600080fd5b62002ce78b838c0162002427565b985060208a013591508082111562002cfe57600080fd5b62002d0c8b838c0162002530565b975060408a013591508082111562002d2357600080fd5b62002d318b838c01620025b9565b965060608a013591508082111562002d4857600080fd5b62002d568b838c0162002626565b955060808a013591508082111562002d6d57600080fd5b62002d7b8b838c0162002688565b945060a08a013591508082111562002d9257600080fd5b62002da08b838c0162002626565b935060c08a013591508082111562002db757600080fd5b5062002dc68a828b0162002626565b91505092959891949750929550565b606080825284519082018190526000906020906080840190828801845b8281101562002e1257815115158452928401929084019060010162002df2565b5050508381038285015262002e28818762002a01565b8481036040860152855180825283870192509083019060005b8181101562002e5f5783518352928401929184019160010162002e41565b509098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111562000752576200075262002e83565b60006001820162002ec45762002ec462002e83565b5060010190565b6001600160a01b038a811682526001600160401b038a81166020840152891660408301526101206060830181905260009162002f0a8483018b62002a82565b91508089166080850152508660a084015282810360c084015262002f2f818762002a82565b60e084019590955250506101000152979650505050505050565b600082601f83011262002f5b57600080fd5b8135602062002f6e620023ce8362002360565b82815260069290921b8401810191818101908684111562002f8e57600080fd5b8286015b848110156200241c576040818903121562002fad5760008081fd5b62002fb7620022dd565b813562002fc4816200229f565b8152818501358582015283529183019160400162002f92565b600060a0823603121562002ff057600080fd5b62002ffa62002308565b823581526200300c602084016200239c565b602082015260408301356001600160401b03808211156200302c57600080fd5b6200303a36838701620024da565b604084015260608501359150808211156200305457600080fd5b6200306236838701620024da565b606084015260808501359150808211156200307c57600080fd5b506200308b3682860162002f49565b60808301525092915050565b600181811c90821680620030ac57607f821691505b602082108103620030cd57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b6bffffffffffffffffffffffff198360601b168152600082516200313881601485016020870162002a5c565b919091016014019392505050565b6000602082840312156200315957600080fd5b8151620022538162002268565b600060406001600160401b038516835260208181850152845160a0838601526200319460e086018262002a82565b905081860151603f1980878403016060880152620031b3838362002a82565b88860151888203830160808a01528051808352908601945060009350908501905b808410156200320857845180516001600160a01b0316835286015186830152938501936001939093019290860190620031d4565b5060608901516001600160a01b031660a08901526080890151888203830160c08a0152955062003239818762002a82565b9a9950505050505050505050565b6000602082840312156200325a57600080fd5b5051919050565b808202811582820484141762000752576200075262002e83565b6000826200329957634e487b7160e01b600052601260045260246000fd5b500490565b8051620022c2816200229f565b600060208284031215620032be57600080fd5b815162002253816200229f565b8051620022c28162002386565b600082601f830112620032ea57600080fd5b8151620032fb620023ce82620024b0565b8181528460208386010111156200331157600080fd5b62002afd82602083016020870162002a5c565b60008060008060008060008060006101208a8c0312156200334457600080fd5b895162003351816200229f565b60208b0151909950620033648162002386565b97506200337460408b01620032cb565b965060608a01516001600160401b03808211156200339157600080fd5b6200339f8d838e01620032d8565b9750620033af60808d016200329e565b965060a08c0151955060c08c0151915080821115620033cd57600080fd5b50620033dc8c828d01620032d8565b93505060e08a015191506101008a015190509295985092959850929598565b601f82111562000a3257600081815260208120601f850160051c81016020861015620034245750805b601f850160051c820191505b81811015620034455782815560010162003430565b505050505050565b81516001600160401b03811115620034695762003469620022c7565b62003481816200347a845462003097565b84620033fb565b602080601f831160018114620034b95760008415620034a05750858301515b600019600386901b1c1916600185901b17855562003445565b600085815260208120601f198616915b82811015620034ea57888601518255948401946001909101908401620034c9565b5085821015620035095787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600083516200352d81846020880162002a5c565b8351908301906200354381836020880162002a5c565b01949350505050565b80518015158114620022c257600080fd5b6000602082840312156200357057600080fd5b62002253826200354c565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351620035b581601785016020880162002a5c565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351620035e881602884016020880162002a5c565b01602801949350505050565b60018060a01b03851681528360208201526080604082015260006200361d608083018562002a82565b905082606083015295945050505050565b600080604083850312156200364257600080fd5b6200364d836200354c565b915060208301516200296a816200229f565b60008162003671576200367162002e83565b50600019019056fe608060405234801561001057600080fd5b5060405161082638038061082683398101604081905261002f916100a9565b61003833610059565b600180546001600160a01b0319163317905561005381610059565b506100d9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100bb57600080fd5b81516001600160a01b03811681146100d257600080fd5b9392505050565b61073e806100e86000396000f3fe60806040526004361061007f5760003560e01c80638da5cb5b1161004e5780638da5cb5b14610158578063b61d27f614610176578063f2fde38b146101b5578063f8b89cc6146101d557600080fd5b80631626ba7e1461008b5780632422224e146100c9578063361f107414610109578063715018a61461014157600080fd5b3661008657005b600080fd5b34801561009757600080fd5b506100ab6100a63660046105bb565b6101f5565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156100d557600080fd5b506100f96100e4366004610602565b60026020526000908152604090205460ff1681565b60405190151581526020016100c0565b34801561011557600080fd5b50600154610129906001600160a01b031681565b6040516001600160a01b0390911681526020016100c0565b34801561014d57600080fd5b5061015661021c565b005b34801561016457600080fd5b506000546001600160a01b0316610129565b34801561018257600080fd5b50610196610191366004610637565b610230565b6040805192151583526001600160a01b039091166020830152016100c0565b3480156101c157600080fd5b506101566101d036600461068e565b6102c2565b3480156101e157600080fd5b506101966101f03660046106a9565b61033b565b60008281526002602052604081205460ff16156102165750630b135d3f60e11b5b92915050565b6102246103aa565b61022e6000610404565b565b60015460009081906001600160a01b031633148061025857506000546001600160a01b031633145b6102995760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420616e206f776e65722160981b60448201526064015b60405180910390fd5b82516040516000919060208601838284838b8d6187965a03f19960009950975050505050505050565b6102ca6103aa565b6001600160a01b03811661032f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610290565b61033881610404565b50565b6000806001600160a01b03861661037657826000036103695760016103608686610454565b915091506103a1565b60016103608686866104b2565b8215610396576000838152600260205260409020805460ff191660011790555b610360868686610230565b94509492505050565b6000546001600160a01b0316331461022e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610290565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081516020830184f090506001600160a01b0381166102165760405162461bcd60e51b815260206004820152601960248201527810dbdd5b19081b9bdd0819195c1b1bde4818dbdb9d1c9858dd603a1b6044820152606401610290565b60008183518460200186f590506001600160a01b0381166105115760405162461bcd60e51b815260206004820152601960248201527810dbdd5b19081b9bdd0819195c1b1bde4818dbdb9d1c9858dd603a1b6044820152606401610290565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261053f57600080fd5b813567ffffffffffffffff8082111561055a5761055a610518565b604051601f8301601f19908116603f0116810190828211818310171561058257610582610518565b8160405283815286602085880101111561059b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156105ce57600080fd5b82359150602083013567ffffffffffffffff8111156105ec57600080fd5b6105f88582860161052e565b9150509250929050565b60006020828403121561061457600080fd5b5035919050565b80356001600160a01b038116811461063257600080fd5b919050565b60008060006060848603121561064c57600080fd5b6106558461061b565b925060208401359150604084013567ffffffffffffffff81111561067857600080fd5b6106848682870161052e565b9150509250925092565b6000602082840312156106a057600080fd5b6105118261061b565b600080600080608085870312156106bf57600080fd5b6106c88561061b565b935060208501359250604085013567ffffffffffffffff8111156106eb57600080fd5b6106f78782880161052e565b94979396509394606001359350505056fea2646970667358221220e2b31b94af507bab95c4b1ccb782f9f42cd3b276ae3cbb934710dc22d31b8b8764736f6c63430008130033a26469706673582212200322c853cf2005918976253b0b9e50d25fdcf53549046b221b62a4959d5bb9a164736f6c63430008130033

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

000000000000000000000000e561d5e02207fb5eb32cca20a699e0d8919a147600000000000000000000000000000000000000000000000045849994fc9c7b1500000000000000000000000000000000000000000000000045849994fc9c7b15000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac70170000000000000000000000000000000000000000000000000000000000000019

-----Decoded View---------------
Arg [0] : _sourceRouter (address): 0xE561d5E02207fb5eB32cca20a699E0d8919a1476
Arg [1] : _thisChainSelector (uint64): 5009297550715157269
Arg [2] : _relayerChainSelector (uint64): 5009297550715157269
Arg [3] : _roleManager (address): 0xCab92D81C9c60955794C09Da80e4bAE939AC7017
Arg [4] : _ccipManager (address): 0xCab92D81C9c60955794C09Da80e4bAE939AC7017
Arg [5] : _harvestManager (address): 0xCab92D81C9c60955794C09Da80e4bAE939AC7017
Arg [6] : _feeManager (address): 0xCab92D81C9c60955794C09Da80e4bAE939AC7017
Arg [7] : _feePercentage (uint256): 25

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000e561d5e02207fb5eb32cca20a699e0d8919a1476
Arg [1] : 00000000000000000000000000000000000000000000000045849994fc9c7b15
Arg [2] : 00000000000000000000000000000000000000000000000045849994fc9c7b15
Arg [3] : 000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017
Arg [4] : 000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017
Arg [5] : 000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017
Arg [6] : 000000000000000000000000cab92d81c9c60955794c09da80e4bae939ac7017
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000019


Deployed Bytecode Sourcemap

48259:19184:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67195:245;;;;;;;;;;-1:-1:-1;67195:245:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;67195:245:0;;;;;;;;48358:72;;;;;;;;;;;;48401:29;48358:72;;;;;738:25:1;;;726:2;711:18;48358:72:0;592:177:1;48710:31:0;;;;;;;;;;-1:-1:-1;48710:31:0;;;;-1:-1:-1;;;;;48710:31:0;;;;;;-1:-1:-1;;;;;936:31:1;;;918:50;;906:2;891:18;48710:31:0;774:200:1;54649:754:0;;;;;;;;;;-1:-1:-1;54649:754:0;;;;;:::i;:::-;;:::i;32998:131::-;;;;;;;;;;-1:-1:-1;32998:131:0;;;;;:::i;:::-;33072:7;33099:12;;;:6;:12;;;;;;;;:22;;;32998:131;55411:1273;;;;;;;;;;-1:-1:-1;55411:1273:0;;;;;:::i;:::-;;:::i;51143:195::-;;;;;;;;;;-1:-1:-1;51143:195:0;;;;;:::i;:::-;;:::i;:::-;;33439:147;;;;;;;;;;-1:-1:-1;33439:147:0;;;;;:::i;:::-;;:::i;34583:218::-;;;;;;;;;;-1:-1:-1;34583:218:0;;;;;:::i;:::-;;:::i;49108:47::-;;;;;;;;;;-1:-1:-1;49108:47:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;13343:32:1;;;13325:51;;13313:2;13298:18;49108:47:0;13179:203:1;48774:34:0;;;;;;;;;;-1:-1:-1;48774:34:0;;;;-1:-1:-1;;;48774:34:0;;-1:-1:-1;;;;;48774:34:0;;;48934:52;;;;;;;;;;-1:-1:-1;48934:52:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;48934:52:0;;;4117:132;;;;;;;;;;-1:-1:-1;4117:132:0;;;;;:::i;:::-;;:::i;48886:41::-;;;;;;;;;;-1:-1:-1;48886:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;54506:135;;;;;;;;;;-1:-1:-1;54506:135:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48524:74::-;;;;;;;;;;;;48568:30;48524:74;;50853:282;;;;;;;;;;-1:-1:-1;50853:282:0;;;;;:::i;:::-;;:::i;31471:147::-;;;;;;;;;;-1:-1:-1;31471:147:0;;;;;:::i;:::-;;:::i;48607:28::-;;;;;;;;;;;;;;;;30576:49;;;;;;;;;;-1:-1:-1;30576:49:0;30621:4;30576:49;;48437:80;;;;;;;;;;;;48484:33;48437:80;;4673:88;;;;;;;;;;-1:-1:-1;4715:7:0;4746:8;-1:-1:-1;;;;;4746:8:0;4673:88;;49035:40;;;;;;;;;;-1:-1:-1;49035:40:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50273:139::-;;;;;;;;;;-1:-1:-1;50273:139:0;;;;;:::i;:::-;;:::i;51814:196::-;;;;;;;;;;-1:-1:-1;51814:196:0;;;;;:::i;:::-;;:::i;33879:149::-;;;;;;;;;;-1:-1:-1;33879:149:0;;;;;:::i;:::-;;:::i;57066:494::-;;;;;;;;;;-1:-1:-1;57066:494:0;;;;;:::i;:::-;;:::i;56692:366::-;;;;;;;;;;-1:-1:-1;56692:366:0;;;;;:::i;:::-;;:::i;53064:1377::-;;;;;;:::i;:::-;;:::i;:::-;;;;18399:14:1;;18392:22;18374:41;;-1:-1:-1;;;;;18451:32:1;;;18446:2;18431:18;;18424:60;18500:18;;;18493:34;18362:2;18347:18;53064:1377:0;18178:355:1;52076:980:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;67195:245::-;67317:4;67341:43;67372:11;67341:30;:43::i;:::-;:91;;;;67388:44;67420:11;67388:31;:44::i;:::-;67334:98;67195:245;-1:-1:-1;;67195:245:0:o;54649:754::-;55000:16;;55029:367;55053:18;:25;55049:1;:29;55029:367;;;55112:272;55150:6;55175:18;55194:1;55175:21;;;;;;;;:::i;:::-;;;;;;;55215:4;55220:1;55215:7;;;;;;;;:::i;:::-;;;;;;;55241:11;55253:1;55241:14;;;;;;;;:::i;:::-;;;;;;;55274:5;55280:1;55274:8;;;;;;;;:::i;:::-;;;;;;;55301:4;55306:1;55301:7;;;;;;;;:::i;:::-;;;;;;;55327:8;55336:1;55327:11;;;;;;;;:::i;:::-;;;;;;;55357:9;55367:1;55357:12;;;;;;;;:::i;:::-;;;;;;;55112:19;:272::i;:::-;55100:284;;;;:::i;:::-;;-1:-1:-1;55080:3:0;;;;:::i;:::-;;;;55029:367;;;;54649:754;;;;;;;;;;:::o;55411:1273::-;55713:16;;55742:935;55766:18;:25;55762:1;:29;55742:935;;;55813:24;55840:18;55859:1;55840:21;;;;;;;;:::i;:::-;;;;;;;;;;;55901:17;;55840:21;;-1:-1:-1;;;;;;55880:38:0;;;55901:17;;55880:38;55876:790;;55982:24;56009:40;56031:17;56009:21;:40::i;:::-;55982:67;;56201:43;56247:268;56295:4;56334:6;56342:17;;;;;;;;;-1:-1:-1;;;;;56342:17:0;56361;56380:4;56386:11;56399:5;56406:4;56412:8;56422:9;56323:109;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56463:1;56488:8;56247:17;:268::i;:::-;56201:314;;56539:11;56554:62;56563:17;56582;56601:14;56554:8;:62::i;:::-;56536:80;-1:-1:-1;56635:15:0;;-1:-1:-1;56536:80:0;56635:15;;:::i;:::-;;;55920:746;;;55876:790;-1:-1:-1;55793:3:0;;;;:::i;:::-;;;;55742:935;;51143:195;51205:41;48484:33;51235:10;51205:7;:41::i;:::-;51197:86;;;;-1:-1:-1;;;51197:86:0;;23452:2:1;51197:86:0;;;23434:21:1;;;23471:18;;;23464:30;23530:34;23510:18;;;23503:62;23582:18;;51197:86:0;;;;;;;;;51294:36;;51302:10;;51294:36;;;;;51323:6;;51294:36;;;;51323:6;51302:10;51294:36;;;;;;;;;;;;;;;;;;;;;51143:195;:::o;33439:147::-;33072:7;33099:12;;;:6;:12;;;;;;;;:22;;31067:16;31078:4;31067:10;:16::i;:::-;33553:25:::1;33564:4;33570:7;33553:10;:25::i;:::-;33439:147:::0;;;:::o;34583:218::-;-1:-1:-1;;;;;34679:23:0;;10477:10;34679:23;34671:83;;;;-1:-1:-1;;;34671:83:0;;23813:2:1;34671:83:0;;;23795:21:1;23852:2;23832:18;;;23825:30;23891:34;23871:18;;;23864:62;-1:-1:-1;;;23942:18:1;;;23935:45;23997:19;;34671:83:0;23611:411:1;34671:83:0;34767:26;34779:4;34785:7;34767:11;:26::i;49108:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49108:47:0;;-1:-1:-1;49108:47:0;;-1:-1:-1;49108:47:0:o;4117:132::-;4921:8;;-1:-1:-1;;;;;4921:8:0;4899:10;:31;4895:69;;4939:25;;-1:-1:-1;;;4939:25:0;;4953:10;4939:25;;;13325:51:1;13298:18;;4939:25:0;13179:203:1;4895:69:0;4222:21:::1;;4235:7:::0;4222:21:::1;:::i;:::-;:12;:21::i;:::-;4117:132:::0;:::o;54506:135::-;-1:-1:-1;;;;;54617:16:0;;;;;;:9;:16;;;;;;;;;54610:23;;;;;;;;;;;;;;;;;54581:16;;54610:23;;;54617:16;54610:23;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54610:23:0;;;;;;;;;;;;;;;;;;;;;;;54506:135;;;:::o;50853:282::-;50924:37;48401:29;50950:10;50924:7;:37::i;:::-;50916:78;;;;-1:-1:-1;;;50916:78:0;;26287:2:1;50916:78:0;;;26269:21:1;26326:2;26306:18;;;26299:30;26365;26345:18;;;26338:58;26413:18;;50916:78:0;26085:352:1;50916:78:0;51031:3;51013:14;:21;;51005:81;;;;-1:-1:-1;;;51005:81:0;;26644:2:1;51005:81:0;;;26626:21:1;26683:2;26663:18;;;26656:30;26722:34;26702:18;;;26695:62;-1:-1:-1;;;26773:18:1;;;26766:45;26828:19;;51005:81:0;26442:411:1;51005:81:0;51097:13;:30;50853:282::o;31471:147::-;31557:4;31581:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;31581:29:0;;;;;;;;;;;;;;;31471:147::o;49035:40::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50273:139::-;50386:17;;50334:7;;50360:44;;50368:10;;50380:4;;-1:-1:-1;;;;;50386:17:0;50360:7;:44::i;51814:196::-;51891:38;48568:30;51918:10;51891:7;:38::i;:::-;51883:80;;;;-1:-1:-1;;;51883:80:0;;27445:2:1;51883:80:0;;;27427:21:1;27484:2;27464:18;;;27457:30;27523:31;27503:18;;;27496:59;27572:18;;51883:80:0;27243:353:1;51883:80:0;51974:8;:28;;-1:-1:-1;;;;;;51974:28:0;-1:-1:-1;;;;;51974:28:0;;;;;;;;;;51814:196::o;33879:149::-;33072:7;33099:12;;;:6;:12;;;;;;;;:22;;31067:16;31078:4;31067:10;:16::i;:::-;33994:26:::1;34006:4;34012:7;33994:11;:26::i;57066:494::-:0;57253:7;;-1:-1:-1;;;;;;57379:29:0;57396:5;57403:4;57379:16;:29::i;:::-;57427:11;57467:8;57457:19;;;;;;57313:178;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;57313:178:0;;;;;;57289:213;;57313:178;57289:213;;;;;57066:494;-1:-1:-1;;;;;;57066:494:0:o;56692:366::-;56783:7;56803:12;56884:4;56877:12;;56899:4;56933:5;56940:4;56916:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56906:40;;;;;;56958:19;56971:5;56958:12;:19::i;:::-;56948:30;;;;;;;56842:151;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;56842:151:0;;;;;;56818:186;;56842:151;56818:186;;;;;56692:366;-1:-1:-1;;;;56692:366:0:o;53064:1377::-;53332:12;;;-1:-1:-1;;;;;53416:25:0;;;;;;:44;;-1:-1:-1;53445:15:0;;;53416:44;53412:489;;;53626:113;;;-1:-1:-1;;;53626:113:0;;;;;28673:25:1;;;28714:18;;;28707:30;;;;-1:-1:-1;28753:18:1;;;28746:29;53635:10:0;;53626:37;;28792:18:1;;53626:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53626:127:0;;53743:10;53626:127;;;53600:289;;;;-1:-1:-1;;;53600:289:0;;29277:2:1;53600:289:0;;;29259:21:1;29316:2;29296:18;;;29289:30;-1:-1:-1;;;29335:18:1;;;29328:48;29393:18;;53600:289:0;29075:342:1;53600:289:0;53918:9;53913:521;53937:18;:25;53933:1;:29;53913:521;;;54052:355;;;;;;;;54088:10;54052:355;;54121:17;;-1:-1:-1;;;;;54121:17:0;54052:355;;;;54161:21;;54025:397;;54052:355;;;54161:18;;54180:1;;54161:21;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;54052:355:0;;;;;54205:4;54052:355;;;;54232:11;-1:-1:-1;;;;;54052:355:0;;;;;54266:5;54052:355;;;;54294:4;54052:355;;;;54321:8;54052:355;;;;54352:9;54052:355;;;;54384:4;54052:355;;;;;54025:8;:397::i;:::-;53984:438;;-1:-1:-1;53984:438:0;-1:-1:-1;53984:438:0;-1:-1:-1;53964:3:0;;;;:::i;:::-;;;;53913:521;;;;53064:1377;;;;;;;;;;;:::o;52076:980::-;52393:21;52416:33;52451:26;52511:18;:25;-1:-1:-1;;;;;52500:37:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52500:37:0;;52490:47;;52581:18;:25;-1:-1:-1;;;;;52567:40:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52567:40:0;;52548:59;;52644:18;:25;-1:-1:-1;;;;;52630:40:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52630:40:0;;52618:52;;52686:9;52681:368;52705:18;:25;52701:1;:29;52681:368;;;52802:235;52828:18;52847:1;52828:21;;;;;;;;:::i;:::-;;;;;;;52868:4;52873:1;52868:7;;;;;;;;:::i;:::-;;;;;;;52894:11;52906:1;52894:14;;;;;;;;:::i;:::-;;;;;;;52927:5;52933:1;52927:8;;;;;;;;:::i;:::-;;;;;;;52954:4;52959:1;52954:7;;;;;;;;:::i;:::-;;;;;;;52980:8;52989:1;52980:11;;;;;;;;:::i;:::-;;;;;;;53010:9;53020:1;53010:12;;;;;;;;:::i;:::-;;;;;;;52802:7;:235::i;:::-;52753:7;52761:1;52753:10;;;;;;;;:::i;:::-;;;;;;52765:16;52782:1;52765:19;;;;;;;;:::i;:::-;;;;;;52786:9;52796:1;52786:12;;;;;;;;:::i;:::-;;;;;;;;;;52752:285;;;;-1:-1:-1;;;;;52752:285:0;;;;;;;;;;52732:3;;;;:::i;:::-;;;;52681:368;;3857:211;3942:4;-1:-1:-1;;;;;;3962:56:0;;-1:-1:-1;;;3962:56:0;;:100;;-1:-1:-1;;;;;;;4022:40:0;;-1:-1:-1;;;4022:40:0;3955:107;3857:211;-1:-1:-1;;3857:211:0:o;31175:204::-;31260:4;-1:-1:-1;;;;;;31284:47:0;;-1:-1:-1;;;31284:47:0;;:87;;-1:-1:-1;;;;;;;;;;11491:40:0;;;31335:36;11382:157;66664:206;66744:15;66783:36;66801:17;66783;:36::i;:::-;:79;;66842:20;;-1:-1:-1;;;66842:20:0;;-1:-1:-1;;;;;66842:20:0;66783:79;;;-1:-1:-1;66822:17:0;66664:206::o;63339:1062::-;63519:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63519:28:0;63721:640;;;;;;;;-1:-1:-1;;;;;13343:32:1;;63768:21:0;;;;13325:51:1;;;;63768:21:0;;;;;;;;;;13298:18:1;;;63768:21:0;;63721:640;;63768:21;63721:640;;;;;;63901:30;;-1:-1:-1;63901:30:0;;;;;;;;-1:-1:-1;;63721:640:0;;;-1:-1:-1;63901:30:0;;;-1:-1:-1;;;;;;;;;;;;;;;;;63901:30:0;;;;;;;;;;;;;;;;63721:640;;;;64333:16;-1:-1:-1;;;;;63721:640:0;;;;;64002:203;64131:59;;;;;;;;64164:9;64131:59;;;;64183:5;64131:59;;;;;1717:56;;;39674:13:1;;1717:56:0;;;39656:32:1;39758:4;39746:17;;;39740:24;39733:32;39726:40;39704:20;;;;39697:70;;;;1717:56:0;;;;;;;;;;39629:18:1;;;;1717:56:0;;;;;;;;-1:-1:-1;;;;;1717:56:0;-1:-1:-1;;;1717:56:0;;;;1607:172;64002:203;63721:640;;63675:686;63339:1062;-1:-1:-1;;;;;;63339:1062:0:o;65966:508::-;66131:15;66148:16;66229:22;66276:17;-1:-1:-1;;;;;66255:38:0;:17;-1:-1:-1;;;;;66255:38:0;;66254:48;;66301:1;66254:48;;;66297:1;66254:48;66229:73;;;;66337:11;4715:7;4746:8;-1:-1:-1;;;;;4746:8:0;;4673:88;66337:11;-1:-1:-1;;;;;66323:33:0;;66357:17;66376:7;66323:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66313:71;;66452:14;66444:3;66428:13;;66418:7;:23;;;;:::i;:::-;:29;;;;:::i;:::-;66407:41;;:7;:41;:::i;:::-;66406:60;;;;:::i;:::-;66395:71;;66166:308;65966:508;;;;;;:::o;31922:105::-;31989:30;32000:4;10477:10;31989;:30::i;36180:238::-;36264:22;36272:4;36278:7;36264;:22::i;:::-;36259:152;;36303:12;;;;36335:4;36303:12;;;;;;;;-1:-1:-1;;;;;36303:29:0;;;;;;;;;;:36;;-1:-1:-1;;36303:36:0;;;;;;;36359:40;;10477:10;;36303:12;;36359:40;;36303:12;36359:40;36180:238;;:::o;36598:239::-;36682:22;36690:4;36696:7;36682;:22::i;:::-;36678:152;;;36753:5;36721:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;36721:29:0;;;;;;;;;;:37;;-1:-1:-1;;36721:37:0;;;36778:40;10477:10;;36721:12;;36778:40;;36753:5;36778:40;36598:239;;:::o;64452:1506::-;64665:4;-1:-1:-1;;;;;64609:61:0;64620:14;:21;;;64609:44;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;64609:61:0;;64587:172;;;;-1:-1:-1;;;64587:172:0;;32232:2:1;64587:172:0;;;32214:21:1;32271:2;32251:18;;;32244:30;32310:34;32290:18;;;32283:62;32381:31;32361:18;;;32354:59;32430:19;;64587:172:0;32030:425:1;64587:172:0;64787:14;64816:26;64857:24;64896:18;64929:19;64963:13;64991:17;65023:16;65054:17;65110:14;:19;;;65085:314;;;;;;;;;;;;:::i;:::-;64772:627;;;;;;;;;;;;;;;;;;65412:340;65435:306;;;;;;;;65467:6;-1:-1:-1;;;;;65435:306:0;;;;;65492:19;-1:-1:-1;;;;;65435:306:0;;;;;65530:17;-1:-1:-1;;;;;65435:306:0;;;;;65566:4;65435:306;;;;65589:11;-1:-1:-1;;;;;65435:306:0;;;;;65619:5;65435:306;;;;65643:4;65435:306;;;;65666:8;65435:306;;;;65693:9;65435:306;;;;65721:5;65435:306;;;;;65412:8;:340::i;:::-;-1:-1:-1;;;65834:34:0;;;;;65795:24;;65770:180;;;-1:-1:-1;;;;;34514:15:1;;;34496:34;;34566:15;;34546:18;;;34539:43;;;;34598:18;;34591:34;;;-1:-1:-1;;;;;65770:180:0;;;;;;34446:2:1;34431:18;65770:180:0;;;;;;;64576:1382;;;;;;;;;64452:1506;:::o;61675:785::-;61806:22;61850:8;:39;61859:29;61876:5;61883:4;61859:16;:29::i;:::-;-1:-1:-1;;;;;61850:39:0;;;;;;;;;;;;-1:-1:-1;61850:39:0;;;;61849:40;61841:90;;;;-1:-1:-1;;;61841:90:0;;34838:2:1;61841:90:0;;;34820:21:1;34877:2;34857:18;;;34850:30;34916:34;34896:18;;;34889:62;-1:-1:-1;;;34967:18:1;;;34960:35;35012:19;;61841:90:0;34636:401:1;61841:90:0;61952:21;61976:19;61989:5;61976:12;:19::i;:::-;61952:43;;62006:22;62058:5;62065:4;62041:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62031:40;;;;;;62006:65;;62171:14;62160:8;62154:15;62149:2;62139:8;62135:17;62132:1;62124:62;-1:-1:-1;;;;;62207:24:0;;;;;;:8;:24;;;;;;;;:31;;-1:-1:-1;;62207:31:0;62234:4;62207:31;;;62249:5;:21;;;;;62106:80;;-1:-1:-1;62249:28:0;62273:4;62249:21;:28;:::i;:::-;-1:-1:-1;;;;;;62288:33:0;;;;;;;:17;:33;;;;;;;;:55;;-1:-1:-1;;62288:55:0;-1:-1:-1;;;;;62288:55:0;;;;;62354:16;;;;;;:9;:16;;;;;:37;;-1:-1:-1;62354:37:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;62354:37:0;;;;;62417:35;;13325:51:1;;;62354:16:0;62417:35;;13298:18:1;62417:35:0;;;;;;;61830:630;;61675:785;;;;;:::o;62555:218::-;62614:12;62639:21;62663:39;;;;;;;;:::i;:::-;-1:-1:-1;;62663:39:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13343:32:1;;62663:39:0;62747:17;;13325:51:1;62663:39:0;;-1:-1:-1;62663:39:0;;13298:18:1;62747:17:0;;;-1:-1:-1;;62747:17:0;;;;;;;;;;62720:45;;;62747:17;62720:45;;:::i;:::-;;;;;;;;;;;;;62713:52;;;62555:218;;;:::o;57936:2495::-;58123:17;;58093:26;;;;58019:12;;;;;;-1:-1:-1;;;;;58123:17:0;;;58093:47;;;58089:2335;;58212:285;58247:8;:28;;;58294:8;:15;;;58328:8;:13;;;58360:8;:20;;;58399:8;:14;;;58432:8;:13;;;58464:8;:18;;;58212:16;:285::i;:::-;58182:315;;-1:-1:-1;58182:315:0;-1:-1:-1;58089:2335:0;;;58614:24;58641:49;58663:8;:26;;;58641:21;:49::i;:::-;58614:76;;58826:43;58872:548;58916:4;58973:8;:15;;;59011:8;:28;;;59062:8;:26;;;59111:8;:13;;;59147:8;:20;;;59190:8;:14;;;59227:8;:13;;;59263:8;:17;;;59303:8;:18;;;58940:400;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59367:1;59388:8;:17;;;58872;:548::i;:::-;58826:594;;59438:16;59456;59476:137;59503:17;59539:8;:26;;;59584:14;59476:8;:137::i;:::-;59437:176;;;;59681:8;:19;;;59677:148;;;59742:8;59729:9;:21;;59721:88;;;;-1:-1:-1;;;59721:88:0;;37945:2:1;59721:88:0;;;37927:21:1;37984:2;37964:18;;;37957:30;38023:34;38003:18;;;37996:62;-1:-1:-1;;;38074:18:1;;;38067:52;38136:19;;59721:88:0;37743:418:1;59721:88:0;4715:7;4746:8;59894:136;;-1:-1:-1;;;59894:136:0;;59863:4;;-1:-1:-1;;;;;;4746:8:0;;;;59894:35;;59937:8;;59894:136;;59965:17;;60001:14;;59894:136;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60114:15;;60192:26;;;;;60241:20;;;;;60284:18;;;;60052:360;;-1:-1:-1;;;;;38721:15:1;;;38703:34;;38773:15;;;38768:2;38753:18;;38746:43;-1:-1:-1;;;;;38863:15:1;;;38843:18;;;38836:43;38910:2;38895:18;;38888:34;-1:-1:-1;38938:19:1;;;38931:44;;;;38816:3;38991:19;;38984:35;;;39050:3;39035:19;;39028:35;;;60052:360:0;;59882:148;;-1:-1:-1;60052:360:0;;;59882:148;;60052:360;;;;;;38653:3:1;60052:360:0;;;58515:1909;;;;58089:2335;57936:2495;;;;;:::o;66482:170::-;66558:4;4746:8;;-1:-1:-1;;;;;4746:8:0;66582:62;;-1:-1:-1;;;66582:62:0;;-1:-1:-1;;;;;936:31:1;;66582:62:0;;;918:50:1;-1:-1:-1;;;;;66582:43:0;;;;;;;891:18:1;;66582:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32317:492::-;32406:22;32414:4;32420:7;32406;:22::i;:::-;32401:401;;32594:28;32614:7;32594:19;:28::i;:::-;32695:38;32723:4;32730:2;32695:19;:38::i;:::-;32499:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;32499:257:0;;;;;;;;;;-1:-1:-1;;;32445:345:0;;;;;;;:::i;60499:1108::-;60751:11;60764:24;60801:29;60833:30;60850:6;60858:4;60833:16;:30::i;:::-;-1:-1:-1;;;;;60879:31:0;;;;;;:8;:31;;;;;;60801:62;;-1:-1:-1;60879:31:0;;60874:305;;60927:42;60935:6;60943:4;60949:19;60927:7;:42::i;:::-;;60874:305;;;-1:-1:-1;;;;;61051:40:0;;;;;;:17;:40;;;;;;-1:-1:-1;;;;;61028:63:0;;;61051:40;;61028:63;61002:165;;;;-1:-1:-1;;;61002:165:0;;40797:2:1;61002:165:0;;;40779:21:1;40836:2;40816:18;;;40809:30;40875:34;40855:18;;;40848:62;-1:-1:-1;;;40926:18:1;;;40919:38;40974:19;;61002:165:0;40595:404:1;61002:165:0;61199:36;61260:21;61199:83;;61354:6;-1:-1:-1;;;;;61311:49:0;61320:21;-1:-1:-1;;;;;61311:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61311:49:0;;61303:75;;;;-1:-1:-1;;;61303:75:0;;41462:2:1;61303:75:0;;;41444:21:1;41501:2;41481:18;;;41474:30;-1:-1:-1;;;41520:18:1;;;41513:43;41573:18;;61303:75:0;41260:337:1;61303:75:0;61418:67;;-1:-1:-1;;;61418:67:0;;-1:-1:-1;;;;;61418:30:0;;;;;:67;;61449:11;;61462:5;;61469:4;;61475:9;;61418:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61511:88;;;18399:14:1;;18392:22;18374:41;;-1:-1:-1;;;;;18451:32:1;;;18446:2;18431:18;;18424:60;18500:18;;;18493:34;;;61389:96:0;;-1:-1:-1;61389:96:0;;-1:-1:-1;61511:88:0;;;;;;;;;;;;;18362:2:1;18347:18;61511:88:0;;;;;;;60790:817;;60499:1108;;;;;;;;;;:::o;28192:151::-;28250:13;28283:52;-1:-1:-1;;;;;28295:22:0;;26067:2;27588:447;27663:13;27689:19;27721:10;27725:6;27721:1;:10;:::i;:::-;:14;;27734:1;27721:14;:::i;:::-;-1:-1:-1;;;;;27711:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27711:25:0;;27689:47;;-1:-1:-1;;;27747:6:0;27754:1;27747:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;27747:15:0;;;;;;;;;-1:-1:-1;;;27773:6:0;27780:1;27773:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;27773:15:0;;;;;;;;-1:-1:-1;27804:9:0;27816:10;27820:6;27816:1;:10;:::i;:::-;:14;;27829:1;27816:14;:::i;:::-;27804:26;;27799:131;27836:1;27832;:5;27799:131;;;-1:-1:-1;;;27880:5:0;27888:3;27880:11;27871:21;;;;;;;:::i;:::-;;;;27859:6;27866:1;27859:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;27859:33:0;;;;;;;;-1:-1:-1;27917:1:0;27907:11;;;;;27839:3;;;:::i;:::-;;;27799:131;;;-1:-1:-1;27948:10:0;;27940:55;;;;-1:-1:-1;;;27940:55:0;;42744:2:1;27940:55:0;;;42726:21:1;;;42763:18;;;42756:30;42822:34;42802:18;;;42795:62;42874:18;;27940:55:0;42542:356:1;27940:55:0;28020:6;27588:447;-1:-1:-1;;;27588:447:0:o;-1:-1:-1:-;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;979:131::-;-1:-1:-1;;;;;1054:31:1;;1044:42;;1034:70;;1100:1;1097;1090:12;1115:134;1183:20;;1212:31;1183:20;1212:31;:::i;:::-;1115:134;;;:::o;1254:127::-;1315:10;1310:3;1306:20;1303:1;1296:31;1346:4;1343:1;1336:15;1370:4;1367:1;1360:15;1386:257;1458:4;1452:11;;;1490:17;;-1:-1:-1;;;;;1522:34:1;;1558:22;;;1519:62;1516:88;;;1584:18;;:::i;:::-;1620:4;1613:24;1386:257;:::o;1648:253::-;1720:2;1714:9;1762:4;1750:17;;-1:-1:-1;;;;;1782:34:1;;1818:22;;;1779:62;1776:88;;;1844:18;;:::i;1906:275::-;1977:2;1971:9;2042:2;2023:13;;-1:-1:-1;;2019:27:1;2007:40;;-1:-1:-1;;;;;2062:34:1;;2098:22;;;2059:62;2056:88;;;2124:18;;:::i;:::-;2160:2;2153:22;1906:275;;-1:-1:-1;1906:275:1:o;2186:192::-;2255:4;-1:-1:-1;;;;;2280:6:1;2277:30;2274:56;;;2310:18;;:::i;:::-;-1:-1:-1;2355:1:1;2351:14;2367:4;2347:25;;2186:192::o;2383:129::-;-1:-1:-1;;;;;2461:5:1;2457:30;2450:5;2447:41;2437:69;;2502:1;2499;2492:12;2517:132;2584:20;;2613:30;2584:20;2613:30;:::i;2654:744::-;2707:5;2760:3;2753:4;2745:6;2741:17;2737:27;2727:55;;2778:1;2775;2768:12;2727:55;2814:6;2801:20;2840:4;2864:69;2880:52;2929:2;2880:52;:::i;:::-;2864:69;:::i;:::-;2967:15;;;3053:1;3049:10;;;;3037:23;;3033:32;;;2998:12;;;;3077:15;;;3074:35;;;3105:1;3102;3095:12;3074:35;3141:2;3133:6;3129:15;3153:216;3169:6;3164:3;3161:15;3153:216;;;3249:3;3236:17;3266:30;3290:5;3266:30;:::i;:::-;3309:18;;3347:12;;;;3186;;3153:216;;;-1:-1:-1;3387:5:1;2654:744;-1:-1:-1;;;;;;2654:744:1:o;3403:917::-;3466:5;3519:3;3512:4;3504:6;3500:17;3496:27;3486:55;;3537:1;3534;3527:12;3486:55;3573:6;3560:20;3599:4;3623:69;3639:52;3688:2;3639:52;:::i;3623:69::-;3726:15;;;3812:1;3808:10;;;;3796:23;;3792:32;;;3757:12;;;;3836:15;;;3833:35;;;3864:1;3861;3854:12;3833:35;3900:2;3892:6;3888:15;3912:379;3928:6;3923:3;3920:15;3912:379;;;4014:3;4001:17;-1:-1:-1;;;;;4037:11:1;4034:35;4031:125;;;4110:1;4139:2;4135;4128:14;4031:125;4181:67;4244:3;4239:2;4225:11;4217:6;4213:24;4209:33;4181:67;:::i;:::-;4169:80;;-1:-1:-1;4269:12:1;;;;3945;;3912:379;;4325:187;4374:4;-1:-1:-1;;;;;4399:6:1;4396:30;4393:56;;;4429:18;;:::i;:::-;-1:-1:-1;4495:2:1;4474:15;-1:-1:-1;;4470:29:1;4501:4;4466:40;;4325:187::o;4517:464::-;4560:5;4613:3;4606:4;4598:6;4594:17;4590:27;4580:55;;4631:1;4628;4621:12;4580:55;4667:6;4654:20;4698:49;4714:32;4743:2;4714:32;:::i;4698:49::-;4772:2;4763:7;4756:19;4818:3;4811:4;4806:2;4798:6;4794:15;4790:26;4787:35;4784:55;;;4835:1;4832;4825:12;4784:55;4900:2;4893:4;4885:6;4881:17;4874:4;4865:7;4861:18;4848:55;4948:1;4923:16;;;4941:4;4919:27;4912:38;;;;4927:7;4517:464;-1:-1:-1;;;4517:464:1:o;4986:897::-;5039:5;5092:3;5085:4;5077:6;5073:17;5069:27;5059:55;;5110:1;5107;5100:12;5059:55;5146:6;5133:20;5172:4;5196:69;5212:52;5261:2;5212:52;:::i;5196:69::-;5299:15;;;5385:1;5381:10;;;;5369:23;;5365:32;;;5330:12;;;;5409:15;;;5406:35;;;5437:1;5434;5427:12;5406:35;5473:2;5465:6;5461:15;5485:369;5501:6;5496:3;5493:15;5485:369;;;5587:3;5574:17;-1:-1:-1;;;;;5610:11:1;5607:35;5604:125;;;5683:1;5712:2;5708;5701:14;5604:125;5754:57;5807:3;5802:2;5788:11;5780:6;5776:24;5772:33;5754:57;:::i;:::-;5742:70;;-1:-1:-1;5832:12:1;;;;5518;;5485:369;;5888:746;5942:5;5995:3;5988:4;5980:6;5976:17;5972:27;5962:55;;6013:1;6010;6003:12;5962:55;6049:6;6036:20;6075:4;6099:69;6115:52;6164:2;6115:52;:::i;6099:69::-;6202:15;;;6288:1;6284:10;;;;6272:23;;6268:32;;;6233:12;;;;6312:15;;;6309:35;;;6340:1;6337;6330:12;6309:35;6376:2;6368:6;6364:15;6388:217;6404:6;6399:3;6396:15;6388:217;;;6484:3;6471:17;6501:31;6526:5;6501:31;:::i;:::-;6545:18;;6583:12;;;;6421;;6388:217;;6639:671;6693:5;6746:3;6739:4;6731:6;6727:17;6723:27;6713:55;;6764:1;6761;6754:12;6713:55;6800:6;6787:20;6826:4;6850:69;6866:52;6915:2;6866:52;:::i;6850:69::-;6953:15;;;7039:1;7035:10;;;;7023:23;;7019:32;;;6984:12;;;;7063:15;;;7060:35;;;7091:1;7088;7081:12;7060:35;7127:2;7119:6;7115:15;7139:142;7155:6;7150:3;7147:15;7139:142;;;7221:17;;7209:30;;7259:12;;;;7172;;7139:142;;7315:896;7367:5;7420:3;7413:4;7405:6;7401:17;7397:27;7387:55;;7438:1;7435;7428:12;7387:55;7474:6;7461:20;7500:4;7524:69;7540:52;7589:2;7540:52;:::i;7524:69::-;7627:15;;;7713:1;7709:10;;;;7697:23;;7693:32;;;7658:12;;;;7737:15;;;7734:35;;;7765:1;7762;7755:12;7734:35;7801:2;7793:6;7789:15;7813:369;7829:6;7824:3;7821:15;7813:369;;;7915:3;7902:17;-1:-1:-1;;;;;7938:11:1;7935:35;7932:125;;;8011:1;8040:2;8036;8029:14;7932:125;8082:57;8135:3;8130:2;8116:11;8108:6;8104:24;8100:33;8082:57;:::i;:::-;8070:70;;-1:-1:-1;8160:12:1;;;;7846;;7813:369;;8892:1853;9232:6;9240;9248;9256;9264;9272;9280;9288;9341:3;9329:9;9320:7;9316:23;9312:33;9309:53;;;9358:1;9355;9348:12;9309:53;9381:29;9400:9;9381:29;:::i;:::-;9371:39;;9461:2;9450:9;9446:18;9433:32;-1:-1:-1;;;;;9525:2:1;9517:6;9514:14;9511:34;;;9541:1;9538;9531:12;9511:34;9564:70;9626:7;9617:6;9606:9;9602:22;9564:70;:::i;:::-;9554:80;;9687:2;9676:9;9672:18;9659:32;9643:48;;9716:2;9706:8;9703:16;9700:36;;;9732:1;9729;9722:12;9700:36;9755:62;9809:7;9798:8;9787:9;9783:24;9755:62;:::i;:::-;9745:72;;9870:2;9859:9;9855:18;9842:32;9826:48;;9899:2;9889:8;9886:16;9883:36;;;9915:1;9912;9905:12;9883:36;9938:63;9993:7;9982:8;9971:9;9967:24;9938:63;:::i;:::-;9928:73;;10054:3;10043:9;10039:19;10026:33;10010:49;;10084:2;10074:8;10071:16;10068:36;;;10100:1;10097;10090:12;10068:36;10123:63;10178:7;10167:8;10156:9;10152:24;10123:63;:::i;:::-;10113:73;;10239:3;10228:9;10224:19;10211:33;10195:49;;10269:2;10259:8;10256:16;10253:36;;;10285:1;10282;10275:12;10253:36;10308:61;10361:7;10350:8;10339:9;10335:24;10308:61;:::i;:::-;10298:71;;10422:3;10411:9;10407:19;10394:33;10378:49;;10452:2;10442:8;10439:16;10436:36;;;10468:1;10465;10458:12;10436:36;10491:63;10546:7;10535:8;10524:9;10520:24;10491:63;:::i;:::-;10481:73;;10607:3;10596:9;10592:19;10579:33;10563:49;;10637:2;10627:8;10624:16;10621:36;;;10653:1;10650;10643:12;10621:36;;10676:63;10731:7;10720:8;10709:9;10705:24;10676:63;:::i;:::-;10666:73;;;8892:1853;;;;;;;;;;;:::o;10932:180::-;10991:6;11044:2;11032:9;11023:7;11019:23;11015:32;11012:52;;;11060:1;11057;11050:12;11012:52;-1:-1:-1;11083:23:1;;10932:180;-1:-1:-1;10932:180:1:o;11117:1123::-;11282:6;11290;11298;11306;11314;11322;11330;11338;11391:3;11379:9;11370:7;11366:23;11362:33;11359:53;;;11408:1;11405;11398:12;11359:53;11431:29;11450:9;11431:29;:::i;:::-;11421:39;;11511:2;11500:9;11496:18;11483:32;-1:-1:-1;;;;;11575:2:1;11567:6;11564:14;11561:34;;;11591:1;11588;11581:12;11561:34;11614:60;11666:7;11657:6;11646:9;11642:22;11614:60;:::i;:::-;11604:70;;11727:2;11716:9;11712:18;11699:32;11683:48;;11756:2;11746:8;11743:16;11740:36;;;11772:1;11769;11762:12;11740:36;11795:52;11839:7;11828:8;11817:9;11813:24;11795:52;:::i;:::-;11785:62;;11866:38;11900:2;11889:9;11885:18;11866:38;:::i;:::-;11856:48;;11951:3;11940:9;11936:19;11923:33;11913:43;;12009:3;11998:9;11994:19;11981:33;11965:49;;12039:2;12029:8;12026:16;12023:36;;;12055:1;12052;12045:12;12023:36;;12078:52;12122:7;12111:8;12100:9;12096:24;12078:52;:::i;:::-;12068:62;;;12177:3;12166:9;12162:19;12149:33;12139:43;;12229:3;12218:9;12214:19;12201:33;12191:43;;11117:1123;;;;;;;;;;;:::o;12430:315::-;12498:6;12506;12559:2;12547:9;12538:7;12534:23;12530:32;12527:52;;;12575:1;12572;12565:12;12527:52;12611:9;12598:23;12588:33;;12671:2;12660:9;12656:18;12643:32;12684:31;12709:5;12684:31;:::i;:::-;12734:5;12724:15;;;12430:315;;;;;:::o;12750:::-;12818:6;12826;12879:2;12867:9;12858:7;12854:23;12850:32;12847:52;;;12895:1;12892;12885:12;12847:52;12934:9;12921:23;12953:31;12978:5;12953:31;:::i;:::-;13003:5;13055:2;13040:18;;;;13027:32;;-1:-1:-1;;;12750:315:1:o;13387:247::-;13446:6;13499:2;13487:9;13478:7;13474:23;13470:32;13467:52;;;13515:1;13512;13505:12;13467:52;13554:9;13541:23;13573:31;13598:5;13573:31;:::i;13639:392::-;13730:6;13783:2;13771:9;13762:7;13758:23;13754:32;13751:52;;;13799:1;13796;13789:12;13751:52;13839:9;13826:23;-1:-1:-1;;;;;13864:6:1;13861:30;13858:50;;;13904:1;13901;13894:12;13858:50;13927:22;;13983:3;13965:16;;;13961:26;13958:46;;;14000:1;13997;13990:12;14036:461;14089:3;14127:5;14121:12;14154:6;14149:3;14142:19;14180:4;14209:2;14204:3;14200:12;14193:19;;14246:2;14239:5;14235:14;14267:1;14277:195;14291:6;14288:1;14285:13;14277:195;;;14356:13;;-1:-1:-1;;;;;14352:39:1;14340:52;;14412:12;;;;14447:15;;;;14388:1;14306:9;14277:195;;;-1:-1:-1;14488:3:1;;14036:461;-1:-1:-1;;;;;14036:461:1:o;14502:261::-;14681:2;14670:9;14663:21;14644:4;14701:56;14753:2;14742:9;14738:18;14730:6;14701:56;:::i;14768:250::-;14853:1;14863:113;14877:6;14874:1;14871:13;14863:113;;;14953:11;;;14947:18;14934:11;;;14927:39;14899:2;14892:10;14863:113;;;-1:-1:-1;;15010:1:1;14992:16;;14985:27;14768:250::o;15023:271::-;15065:3;15103:5;15097:12;15130:6;15125:3;15118:19;15146:76;15215:6;15208:4;15203:3;15199:14;15192:4;15185:5;15181:16;15146:76;:::i;:::-;15276:2;15255:15;-1:-1:-1;;15251:29:1;15242:39;;;;15283:4;15238:50;;15023:271;-1:-1:-1;;15023:271:1:o;15299:220::-;15448:2;15437:9;15430:21;15411:4;15468:45;15509:2;15498:9;15494:18;15486:6;15468:45;:::i;15524:322::-;15593:6;15646:2;15634:9;15625:7;15621:23;15617:32;15614:52;;;15662:1;15659;15652:12;15614:52;15702:9;15689:23;-1:-1:-1;;;;;15727:6:1;15724:30;15721:50;;;15767:1;15764;15757:12;15721:50;15790;15832:7;15823:6;15812:9;15808:22;15790:50;:::i;:::-;15780:60;15524:322;-1:-1:-1;;;;15524:322:1:o;15851:746::-;15956:6;15964;15972;15980;16033:3;16021:9;16012:7;16008:23;16004:33;16001:53;;;16050:1;16047;16040:12;16001:53;16089:9;16076:23;16108:31;16133:5;16108:31;:::i;:::-;16158:5;-1:-1:-1;16214:2:1;16199:18;;16186:32;-1:-1:-1;;;;;16267:14:1;;;16264:34;;;16294:1;16291;16284:12;16264:34;16317:50;16359:7;16350:6;16339:9;16335:22;16317:50;:::i;:::-;16307:60;;16420:2;16409:9;16405:18;16392:32;16376:48;;16449:2;16439:8;16436:16;16433:36;;;16465:1;16462;16455:12;16433:36;;16488:52;16532:7;16521:8;16510:9;16506:24;16488:52;:::i;:::-;15851:746;;;;-1:-1:-1;16478:62:1;;16587:2;16572:18;16559:32;;-1:-1:-1;;;15851:746:1:o;16602:457::-;16680:6;16688;16741:2;16729:9;16720:7;16716:23;16712:32;16709:52;;;16757:1;16754;16747:12;16709:52;16796:9;16783:23;16815:31;16840:5;16815:31;:::i;:::-;16865:5;-1:-1:-1;16921:2:1;16906:18;;16893:32;-1:-1:-1;;;;;16937:30:1;;16934:50;;;16980:1;16977;16970:12;16934:50;17003;17045:7;17036:6;17025:9;17021:22;17003:50;:::i;:::-;16993:60;;;16602:457;;;;;:::o;17064:1109::-;17220:6;17228;17236;17244;17252;17260;17268;17321:3;17309:9;17300:7;17296:23;17292:33;17289:53;;;17338:1;17335;17328:12;17289:53;17378:9;17365:23;-1:-1:-1;;;;;17448:2:1;17440:6;17437:14;17434:34;;;17464:1;17461;17454:12;17434:34;17487:60;17539:7;17530:6;17519:9;17515:22;17487:60;:::i;:::-;17477:70;;17600:2;17589:9;17585:18;17572:32;17556:48;;17629:2;17619:8;17616:16;17613:36;;;17645:1;17642;17635:12;17613:36;17668:52;17712:7;17701:8;17690:9;17686:24;17668:52;:::i;:::-;17658:62;;17770:2;17759:9;17755:18;17742:32;17729:45;;17783:31;17808:5;17783:31;:::i;:::-;17833:5;;-1:-1:-1;17885:2:1;17870:18;;17857:32;;-1:-1:-1;17942:3:1;17927:19;;17914:33;;17959:16;;;17956:36;;;17988:1;17985;17978:12;17956:36;;18011:52;18055:7;18044:8;18033:9;18029:24;18011:52;:::i;:::-;18001:62;;;18110:3;18099:9;18095:19;18082:33;18072:43;;18162:3;18151:9;18147:19;18134:33;18124:43;;17064:1109;;;;;;;;;;:::o;18538:1778::-;18869:6;18877;18885;18893;18901;18909;18917;18970:3;18958:9;18949:7;18945:23;18941:33;18938:53;;;18987:1;18984;18977:12;18938:53;19027:9;19014:23;-1:-1:-1;;;;;19097:2:1;19089:6;19086:14;19083:34;;;19113:1;19110;19103:12;19083:34;19136:70;19198:7;19189:6;19178:9;19174:22;19136:70;:::i;:::-;19126:80;;19259:2;19248:9;19244:18;19231:32;19215:48;;19288:2;19278:8;19275:16;19272:36;;;19304:1;19301;19294:12;19272:36;19327:62;19381:7;19370:8;19359:9;19355:24;19327:62;:::i;:::-;19317:72;;19442:2;19431:9;19427:18;19414:32;19398:48;;19471:2;19461:8;19458:16;19455:36;;;19487:1;19484;19477:12;19455:36;19510:63;19565:7;19554:8;19543:9;19539:24;19510:63;:::i;:::-;19500:73;;19626:2;19615:9;19611:18;19598:32;19582:48;;19655:2;19645:8;19642:16;19639:36;;;19671:1;19668;19661:12;19639:36;19694:63;19749:7;19738:8;19727:9;19723:24;19694:63;:::i;:::-;19684:73;;19810:3;19799:9;19795:19;19782:33;19766:49;;19840:2;19830:8;19827:16;19824:36;;;19856:1;19853;19846:12;19824:36;19879:61;19932:7;19921:8;19910:9;19906:24;19879:61;:::i;:::-;19869:71;;19993:3;19982:9;19978:19;19965:33;19949:49;;20023:2;20013:8;20010:16;20007:36;;;20039:1;20036;20029:12;20007:36;20062:63;20117:7;20106:8;20095:9;20091:24;20062:63;:::i;:::-;20052:73;;20178:3;20167:9;20163:19;20150:33;20134:49;;20208:2;20198:8;20195:16;20192:36;;;20224:1;20221;20214:12;20192:36;;20247:63;20302:7;20291:8;20280:9;20276:24;20247:63;:::i;:::-;20237:73;;;18538:1778;;;;;;;;;;:::o;20321:1373::-;20661:2;20673:21;;;20743:13;;20646:18;;;20765:22;;;20613:4;;20841;;20818:3;20803:19;;;20868:15;;;20613:4;20911:185;20925:6;20922:1;20919:13;20911:185;;;21000:13;;20993:21;20986:29;20974:42;;21036:12;;;;21071:15;;;;20947:1;20940:9;20911:185;;;20915:3;;;21141:9;21136:3;21132:19;21127:2;21116:9;21112:18;21105:47;21175:41;21212:3;21204:6;21175:41;:::i;:::-;21252:22;;;21247:2;21232:18;;21225:50;21328:13;;21350:24;;;21432:15;;;;-1:-1:-1;21392:15:1;;;;21467:1;21477:189;21493:8;21488:3;21485:17;21477:189;;;21562:15;;21548:30;;21639:17;;;;21600:14;;;;21521:1;21512:11;21477:189;;;-1:-1:-1;21683:5:1;;20321:1373;-1:-1:-1;;;;;;;;20321:1373:1:o;21699:127::-;21760:10;21755:3;21751:20;21748:1;21741:31;21791:4;21788:1;21781:15;21815:4;21812:1;21805:15;21831:127;21892:10;21887:3;21883:20;21880:1;21873:31;21923:4;21920:1;21913:15;21947:4;21944:1;21937:15;21963:125;22028:9;;;22049:10;;;22046:36;;;22062:18;;:::i;22093:135::-;22132:3;22153:17;;;22150:43;;22173:18;;:::i;:::-;-1:-1:-1;22220:1:1;22209:13;;22093:135::o;22233:1012::-;-1:-1:-1;;;;;22680:15:1;;;22662:34;;-1:-1:-1;;;;;22769:15:1;;;22764:2;22749:18;;22742:43;22821:15;;22816:2;22801:18;;22794:43;22612:3;22868:2;22853:18;;22846:30;;;22583:4;;22899:45;22925:18;;;22917:6;22899:45;:::i;:::-;22885:59;;22993:2;22985:6;22981:15;22975:3;22964:9;22960:19;22953:44;;23034:6;23028:3;23017:9;23013:19;23006:35;23090:9;23082:6;23078:22;23072:3;23061:9;23057:19;23050:51;23118:33;23144:6;23136;23118:33;:::i;:::-;23182:3;23167:19;;23160:35;;;;-1:-1:-1;;23226:3:1;23211:19;23204:35;23110:41;22233:1012;-1:-1:-1;;;;;;;22233:1012:1:o;24027:1039::-;24095:5;24148:3;24141:4;24133:6;24129:17;24125:27;24115:55;;24166:1;24163;24156:12;24115:55;24202:6;24189:20;24228:4;24252:69;24268:52;24317:2;24268:52;:::i;24252:69::-;24355:15;;;24441:1;24437:10;;;;24425:23;;24421:32;;;24386:12;;;;24465:15;;;24462:35;;;24493:1;24490;24483:12;24462:35;24529:2;24521:6;24517:15;24541:496;24557:6;24552:3;24549:15;24541:496;;;24635:4;24629:3;24624;24620:13;24616:24;24613:114;;;24681:1;24710:2;24706;24699:14;24613:114;24753:22;;:::i;:::-;24816:3;24803:17;24833:33;24858:7;24833:33;:::i;:::-;24879:22;;24950:12;;;24937:26;24921:14;;;24914:50;24977:18;;25015:12;;;;24583:4;24574:14;24541:496;;25071:1009;25183:9;25242:4;25234:5;25218:14;25214:26;25210:37;25207:57;;;25260:1;25257;25250:12;25207:57;25288:22;;:::i;:::-;25348:5;25335:19;25326:7;25319:36;25389:33;25418:2;25411:5;25407:14;25389:33;:::i;:::-;25384:2;25375:7;25371:16;25364:59;25470:2;25463:5;25459:14;25446:28;-1:-1:-1;;;;;25534:2:1;25526:6;25523:14;25520:34;;;25550:1;25547;25540:12;25520:34;25588:53;25626:14;25617:6;25610:5;25606:18;25588:53;:::i;:::-;25583:2;25574:7;25570:16;25563:79;25691:2;25684:5;25680:14;25667:28;25651:44;;25720:2;25710:8;25707:16;25704:36;;;25736:1;25733;25726:12;25704:36;25774:55;25814:14;25803:8;25796:5;25792:20;25774:55;:::i;:::-;25769:2;25760:7;25756:16;25749:81;25879:3;25872:5;25868:15;25855:29;25839:45;;25909:2;25899:8;25896:16;25893:36;;;25925:1;25922;25915:12;25893:36;;25964:80;26029:14;26018:8;26011:5;26007:20;25964:80;:::i;:::-;25958:3;25945:17;;25938:107;-1:-1:-1;25949:7:1;25071:1009;-1:-1:-1;;25071:1009:1:o;26858:380::-;26937:1;26933:12;;;;26980;;;27001:61;;27055:4;27047:6;27043:17;27033:27;;27001:61;27108:2;27100:6;27097:14;27077:18;27074:38;27071:161;;27154:10;27149:3;27145:20;27142:1;27135:31;27189:4;27186:1;27179:15;27217:4;27214:1;27207:15;27071:161;;26858:380;;;:::o;27601:441::-;-1:-1:-1;;;;;;27824:26:1;;;;27812:39;;27888:2;27884:15;;;;-1:-1:-1;;27880:53:1;27876:1;27867:11;;27860:74;27959:2;27950:12;;27943:28;27996:2;27987:12;;27980:28;28033:2;28024:12;;27601:441::o;28047:410::-;28261:26;28257:31;28248:6;28244:2;28240:15;28236:53;28231:3;28224:66;28206:3;28319:6;28313:13;28335:75;28403:6;28398:2;28393:3;28389:12;28382:4;28374:6;28370:17;28335:75;:::i;:::-;28430:16;;;;28448:2;28426:25;;28047:410;-1:-1:-1;;;28047:410:1:o;28821:249::-;28890:6;28943:2;28931:9;28922:7;28918:23;28914:32;28911:52;;;28959:1;28956;28949:12;28911:52;28991:9;28985:16;29010:30;29034:5;29010:30;:::i;29422:1604::-;29600:4;29629:2;-1:-1:-1;;;;;29662:6:1;29658:31;29647:9;29640:50;29709:2;29747;29742;29731:9;29727:18;29720:30;29785:6;29779:13;29828:4;29823:2;29812:9;29808:18;29801:32;29856:52;29903:3;29892:9;29888:19;29874:12;29856:52;:::i;:::-;29842:66;;29957:2;29949:6;29945:15;29939:22;29984:2;29980:7;30051:2;30039:9;30031:6;30027:22;30023:31;30018:2;30007:9;30003:18;29996:59;30078:41;30112:6;30096:14;30078:41;:::i;:::-;30156:15;;;30150:22;30213;;;30209:31;;30203:3;30188:19;;30181:60;30290:21;;30320:22;;;30396:23;;;;-1:-1:-1;30437:1:1;;-1:-1:-1;30358:15:1;;;;30447:280;30461:6;30458:1;30455:13;30447:280;;;30520:13;;30562:9;;-1:-1:-1;;;;;30558:35:1;30546:48;;30634:11;;30628:18;30614:12;;;30607:40;30702:15;;;;30590:1;30476:9;;;;;30667:12;;;;30447:280;;;-1:-1:-1;30776:2:1;30764:15;;30758:22;-1:-1:-1;;;;;13136:31:1;30839:4;30824:20;;13124:44;30894:3;30882:16;;30876:23;30940:19;;;30936:28;;30930:3;30915:19;;30908:57;30876:23;-1:-1:-1;30982:38:1;30944:3;30876:23;30982:38;:::i;:::-;30974:46;29422:1604;-1:-1:-1;;;;;;;;;;29422:1604:1:o;31031:184::-;31101:6;31154:2;31142:9;31133:7;31129:23;31125:32;31122:52;;;31170:1;31167;31160:12;31122:52;-1:-1:-1;31193:16:1;;31031:184;-1:-1:-1;31031:184:1:o;31220:168::-;31293:9;;;31324;;31341:15;;;31335:22;;31321:37;31311:71;;31362:18;;:::i;31393:217::-;31433:1;31459;31449:132;;31503:10;31498:3;31494:20;31491:1;31484:31;31538:4;31535:1;31528:15;31566:4;31563:1;31556:15;31449:132;-1:-1:-1;31595:9:1;;31393:217::o;31615:146::-;31702:13;;31724:31;31702:13;31724:31;:::i;31766:259::-;31844:6;31897:2;31885:9;31876:7;31872:23;31868:32;31865:52;;;31913:1;31910;31903:12;31865:52;31945:9;31939:16;31964:31;31989:5;31964:31;:::i;32460:136::-;32538:13;;32560:30;32538:13;32560:30;:::i;32601:443::-;32655:5;32708:3;32701:4;32693:6;32689:17;32685:27;32675:55;;32726:1;32723;32716:12;32675:55;32755:6;32749:13;32786:49;32802:32;32831:2;32802:32;:::i;32786:49::-;32860:2;32851:7;32844:19;32906:3;32899:4;32894:2;32886:6;32882:15;32878:26;32875:35;32872:55;;;32923:1;32920;32913:12;32872:55;32936:77;33010:2;33003:4;32994:7;32990:18;32983:4;32975:6;32971:17;32936:77;:::i;33049:1202::-;33224:6;33232;33240;33248;33256;33264;33272;33280;33288;33341:3;33329:9;33320:7;33316:23;33312:33;33309:53;;;33358:1;33355;33348:12;33309:53;33390:9;33384:16;33409:31;33434:5;33409:31;:::i;:::-;33509:2;33494:18;;33488:25;33459:5;;-1:-1:-1;33522:32:1;33488:25;33522:32;:::i;:::-;33573:7;-1:-1:-1;33599:48:1;33643:2;33628:18;;33599:48;:::i;:::-;33589:58;;33691:2;33680:9;33676:18;33670:25;-1:-1:-1;;;;;33755:2:1;33747:6;33744:14;33741:34;;;33771:1;33768;33761:12;33741:34;33794:61;33847:7;33838:6;33827:9;33823:22;33794:61;:::i;:::-;33784:71;;33874:58;33927:3;33916:9;33912:19;33874:58;:::i;:::-;33864:68;;33972:3;33961:9;33957:19;33951:26;33941:36;;34023:3;34012:9;34008:19;34002:26;33986:42;;34053:2;34043:8;34040:16;34037:36;;;34069:1;34066;34059:12;34037:36;;34092:63;34147:7;34136:8;34125:9;34121:24;34092:63;:::i;:::-;34082:73;;;34195:3;34184:9;34180:19;34174:26;34164:36;;34240:3;34229:9;34225:19;34219:26;34209:36;;33049:1202;;;;;;;;;;;:::o;35168:545::-;35270:2;35265:3;35262:11;35259:448;;;35306:1;35331:5;35327:2;35320:17;35376:4;35372:2;35362:19;35446:2;35434:10;35430:19;35427:1;35423:27;35417:4;35413:38;35482:4;35470:10;35467:20;35464:47;;;-1:-1:-1;35505:4:1;35464:47;35560:2;35555:3;35551:12;35548:1;35544:20;35538:4;35534:31;35524:41;;35615:82;35633:2;35626:5;35623:13;35615:82;;;35678:17;;;35659:1;35648:13;35615:82;;;35619:3;;;35168:545;;;:::o;35889:1352::-;36015:3;36009:10;-1:-1:-1;;;;;36034:6:1;36031:30;36028:56;;;36064:18;;:::i;:::-;36093:97;36183:6;36143:38;36175:4;36169:11;36143:38;:::i;:::-;36137:4;36093:97;:::i;:::-;36245:4;;36309:2;36298:14;;36326:1;36321:663;;;;37028:1;37045:6;37042:89;;;-1:-1:-1;37097:19:1;;;37091:26;37042:89;-1:-1:-1;;35846:1:1;35842:11;;;35838:24;35834:29;35824:40;35870:1;35866:11;;;35821:57;37144:81;;36291:944;;36321:663;35115:1;35108:14;;;35152:4;35139:18;;-1:-1:-1;;36357:20:1;;;36475:236;36489:7;36486:1;36483:14;36475:236;;;36578:19;;;36572:26;36557:42;;36670:27;;;;36638:1;36626:14;;;;36505:19;;36475:236;;;36479:3;36739:6;36730:7;36727:19;36724:201;;;36800:19;;;36794:26;-1:-1:-1;;36883:1:1;36879:14;;;36895:3;36875:24;36871:37;36867:42;36852:58;36837:74;;36724:201;-1:-1:-1;;;;;36971:1:1;36955:14;;;36951:22;36938:36;;-1:-1:-1;35889:1352:1:o;37246:492::-;37421:3;37459:6;37453:13;37475:66;37534:6;37529:3;37522:4;37514:6;37510:17;37475:66;:::i;:::-;37604:13;;37563:16;;;;37626:70;37604:13;37563:16;37673:4;37661:17;;37626:70;:::i;:::-;37712:20;;37246:492;-1:-1:-1;;;;37246:492:1:o;39074:164::-;39150:13;;39199;;39192:21;39182:32;;39172:60;;39228:1;39225;39218:12;39243:202;39310:6;39363:2;39351:9;39342:7;39338:23;39334:32;39331:52;;;39379:1;39376;39369:12;39331:52;39402:37;39429:9;39402:37;:::i;39778:812::-;40189:25;40184:3;40177:38;40159:3;40244:6;40238:13;40260:75;40328:6;40323:2;40318:3;40314:12;40307:4;40299:6;40295:17;40260:75;:::i;:::-;-1:-1:-1;;;40394:2:1;40354:16;;;40386:11;;;40379:40;40444:13;;40466:76;40444:13;40528:2;40520:11;;40513:4;40501:17;;40466:76;:::i;:::-;40562:17;40581:2;40558:26;;39778:812;-1:-1:-1;;;;39778:812:1:o;41602:459::-;41862:1;41858;41853:3;41849:11;41845:19;41837:6;41833:32;41822:9;41815:51;41902:6;41897:2;41886:9;41882:18;41875:34;41945:3;41940:2;41929:9;41925:18;41918:31;41796:4;41966:46;42007:3;41996:9;41992:19;41984:6;41966:46;:::i;:::-;41958:54;;42048:6;42043:2;42032:9;42028:18;42021:34;41602:459;;;;;;;:::o;42066:330::-;42142:6;42150;42203:2;42191:9;42182:7;42178:23;42174:32;42171:52;;;42219:1;42216;42209:12;42171:52;42242:37;42269:9;42242:37;:::i;:::-;42232:47;;42322:2;42311:9;42307:18;42301:25;42335:31;42360:5;42335:31;:::i;42401:136::-;42440:3;42468:5;42458:39;;42477:18;;:::i;:::-;-1:-1:-1;;;42513:18:1;;42401:136::o

Swarm Source

ipfs://0322c853cf2005918976253b0b9e50d25fdcf53549046b221b62a4959d5bb9a1

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
0xef3c8e083De1AE85afecdAf5D6AbC15427f5AbcB
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.