S Price: $0.476539 (-3.50%)
    /

    Contract

    0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7

    Overview

    S Balance

    Sonic LogoSonic LogoSonic Logo5,406.018775142435229506 S

    S Value

    $2,576.18 (@ $0.48/S)

    Token Holdings

    Amount:Between 1-10k
    Reset Filter

    Transaction Hash
    Method
    Block
    Age
    From
    To
    Amount

    There are no matching entries

    > 10 Internal Transactions and 1 Token Transfer found.

    Latest 25 internal transactions (View All)

    Parent Transaction Hash Block Age From To Amount
    172924672025-03-31 17:54:192 mins ago1743443659
    0xC39161c7...Dc4802de7
    0.09495392 S
    172924192025-03-31 17:53:552 mins ago1743443635
    0xC39161c7...Dc4802de7
    0.10154925 S
    172919422025-03-31 17:50:335 mins ago1743443433
    0xC39161c7...Dc4802de7
    0.47286202 S
    172917072025-03-31 17:48:567 mins ago1743443336
    0xC39161c7...Dc4802de7
    0.51913226 S
    172915592025-03-31 17:47:598 mins ago1743443279
    0xC39161c7...Dc4802de7
    0.03802226 S
    172913322025-03-31 17:46:339 mins ago1743443193
    0xC39161c7...Dc4802de7
    0.11873287 S
    172911112025-03-31 17:45:0011 mins ago1743443100
    0xC39161c7...Dc4802de7
    0.98898273 S
    172904412025-03-31 17:40:5915 mins ago1743442859
    0xC39161c7...Dc4802de7
    1.57219757 S
    172898672025-03-31 17:37:0219 mins ago1743442622
    0xC39161c7...Dc4802de7
    0.12973876 S
    172889002025-03-31 17:30:4425 mins ago1743442244
    0xC39161c7...Dc4802de7
    0.09495392 S
    172880932025-03-31 17:25:0431 mins ago1743441904
    0xC39161c7...Dc4802de7
    0.03656579 S
    172859762025-03-31 17:11:1445 mins ago1743441074
    0xC39161c7...Dc4802de7
    0.0959107 S
    172858802025-03-31 17:10:3845 mins ago1743441038
    0xC39161c7...Dc4802de7
    0.88652503 S
    172847922025-03-31 17:03:1053 mins ago1743440590
    0xC39161c7...Dc4802de7
    0.16067554 S
    172832882025-03-31 16:52:351 hr ago1743439955
    0xC39161c7...Dc4802de7
    0.10791202 S
    172819172025-03-31 16:42:441 hr ago1743439364
    0xC39161c7...Dc4802de7
    0.14278898 S
    172814972025-03-31 16:39:541 hr ago1743439194
    0xC39161c7...Dc4802de7
    0.03682598 S
    172814712025-03-31 16:39:401 hr ago1743439180
    0xC39161c7...Dc4802de7
    3.65723012 S
    172813652025-03-31 16:38:541 hr ago1743439134
    0xC39161c7...Dc4802de7
    0.10600804 S
    172810502025-03-31 16:36:391 hr ago1743438999
    0xC39161c7...Dc4802de7
    0.1845459 S
    172809602025-03-31 16:36:001 hr ago1743438960
    0xC39161c7...Dc4802de7
    0.13498036 S
    172808582025-03-31 16:35:191 hr ago1743438919
    0xC39161c7...Dc4802de7
    1.74531796 S
    172807302025-03-31 16:34:241 hr ago1743438864
    0xC39161c7...Dc4802de7
    0.0954172 S
    172795202025-03-31 16:25:511 hr ago1743438351
    0xC39161c7...Dc4802de7
    0.09558958 S
    172794702025-03-31 16:25:301 hr ago1743438330
    0xC39161c7...Dc4802de7
    0.1243644 S
    View All Internal Transactions
    Loading...
    Loading

    Contract Source Code Verified (Exact Match)

    Contract Name:
    SendUln302

    Compiler Version
    v0.8.22+commit.4fc1097e

    Optimization Enabled:
    Yes with 20000 runs

    Other Settings:
    paris EvmVersion
    File 1 of 35 : SendUln302.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    import { Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol";
    import { SetConfigParam } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol";
    import { ExecutorConfig } from "../../SendLibBase.sol";
    import { SendLibBaseE2, WorkerOptions } from "../../SendLibBaseE2.sol";
    import { UlnConfig } from "../UlnBase.sol";
    import { SendUlnBase } from "../SendUlnBase.sol";
    /// @dev This is a gluing contract. It simply parses the requests and forward to the super.impl() accordingly.
    /// @dev In this case, it combines the logic of SendUlnBase and SendLibBaseE2
    contract SendUln302 is SendUlnBase, SendLibBaseE2 {
    uint32 internal constant CONFIG_TYPE_EXECUTOR = 1;
    uint32 internal constant CONFIG_TYPE_ULN = 2;
    error LZ_ULN_InvalidConfigType(uint32 configType);
    constructor(
    address _endpoint,
    uint256 _treasuryGasLimit,
    uint256 _treasuryGasForFeeCap
    ) SendLibBaseE2(_endpoint, _treasuryGasLimit, _treasuryGasForFeeCap) {}
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 2 of 35 : ILayerZeroEndpointV2.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    import { IMessageLibManager } from "./IMessageLibManager.sol";
    import { IMessagingComposer } from "./IMessagingComposer.sol";
    import { IMessagingChannel } from "./IMessagingChannel.sol";
    import { IMessagingContext } from "./IMessagingContext.sol";
    struct MessagingParams {
    uint32 dstEid;
    bytes32 receiver;
    bytes message;
    bytes options;
    bool payInLzToken;
    }
    struct MessagingReceipt {
    bytes32 guid;
    uint64 nonce;
    MessagingFee fee;
    }
    struct MessagingFee {
    uint256 nativeFee;
    uint256 lzTokenFee;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 3 of 35 : IMessageLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
    import { SetConfigParam } from "./IMessageLibManager.sol";
    enum MessageLibType {
    Send,
    Receive,
    SendAndReceive
    }
    interface IMessageLib is IERC165 {
    function setConfig(address _oapp, SetConfigParam[] calldata _config) external;
    function getConfig(uint32 _eid, address _oapp, uint32 _configType) external view returns (bytes memory config);
    function isSupportedEid(uint32 _eid) external view returns (bool);
    // message libs of same major version are compatible
    function version() external view returns (uint64 major, uint8 minor, uint8 endpointVersion);
    function messageLibType() external view returns (MessageLibType);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 4 of 35 : IMessageLibManager.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    struct SetConfigParam {
    uint32 eid;
    uint32 configType;
    bytes config;
    }
    interface IMessageLibManager {
    struct Timeout {
    address lib;
    uint256 expiry;
    }
    event LibraryRegistered(address newLib);
    event DefaultSendLibrarySet(uint32 eid, address newLib);
    event DefaultReceiveLibrarySet(uint32 eid, address newLib);
    event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);
    event SendLibrarySet(address sender, uint32 eid, address newLib);
    event ReceiveLibrarySet(address receiver, uint32 eid, address newLib);
    event ReceiveLibraryTimeoutSet(address receiver, uint32 eid, address oldLib, uint256 timeout);
    function registerLibrary(address _lib) external;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 5 of 35 : IMessagingChannel.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface IMessagingChannel {
    event InboundNonceSkipped(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce);
    event PacketNilified(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
    event PacketBurnt(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
    function eid() external view returns (uint32);
    // this is an emergency function if a message cannot be verified for some reasons
    // required to provide _nextNonce to avoid race condition
    function skip(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce) external;
    function nilify(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
    function burn(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
    function nextGuid(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (bytes32);
    function inboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);
    function outboundNonce(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (uint64);
    function inboundPayloadHash(
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 6 of 35 : IMessagingComposer.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface IMessagingComposer {
    event ComposeSent(address from, address to, bytes32 guid, uint16 index, bytes message);
    event ComposeDelivered(address from, address to, bytes32 guid, uint16 index);
    event LzComposeAlert(
    address indexed from,
    address indexed to,
    address indexed executor,
    bytes32 guid,
    uint16 index,
    uint256 gas,
    uint256 value,
    bytes message,
    bytes extraData,
    bytes reason
    );
    function composeQueue(
    address _from,
    address _to,
    bytes32 _guid,
    uint16 _index
    ) external view returns (bytes32 messageHash);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 7 of 35 : IMessagingContext.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface IMessagingContext {
    function isSendingMessage() external view returns (bool);
    function getSendContext() external view returns (uint32 dstEid, address sender);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 8 of 35 : ISendLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    import { MessagingFee } from "./ILayerZeroEndpointV2.sol";
    import { IMessageLib } from "./IMessageLib.sol";
    struct Packet {
    uint64 nonce;
    uint32 srcEid;
    address sender;
    uint32 dstEid;
    bytes32 receiver;
    bytes32 guid;
    bytes message;
    }
    interface ISendLib is IMessageLib {
    function send(
    Packet calldata _packet,
    bytes calldata _options,
    bool _payInLzToken
    ) external returns (MessagingFee memory, bytes memory encodedPacket);
    function quote(
    Packet calldata _packet,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 9 of 35 : AddressCast.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    library AddressCast {
    error AddressCast_InvalidSizeForAddress();
    error AddressCast_InvalidAddress();
    function toBytes32(bytes calldata _addressBytes) internal pure returns (bytes32 result) {
    if (_addressBytes.length > 32) revert AddressCast_InvalidAddress();
    result = bytes32(_addressBytes);
    unchecked {
    uint256 offset = 32 - _addressBytes.length;
    result = result >> (offset * 8);
    }
    }
    function toBytes32(address _address) internal pure returns (bytes32 result) {
    result = bytes32(uint256(uint160(_address)));
    }
    function toBytes(bytes32 _addressBytes32, uint256 _size) internal pure returns (bytes memory result) {
    if (_size == 0 || _size > 32) revert AddressCast_InvalidSizeForAddress();
    result = new bytes(_size);
    unchecked {
    uint256 offset = 256 - _size * 8;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 10 of 35 : CalldataBytesLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    library CalldataBytesLib {
    function toU8(bytes calldata _bytes, uint256 _start) internal pure returns (uint8) {
    return uint8(_bytes[_start]);
    }
    function toU16(bytes calldata _bytes, uint256 _start) internal pure returns (uint16) {
    unchecked {
    uint256 end = _start + 2;
    return uint16(bytes2(_bytes[_start:end]));
    }
    }
    function toU32(bytes calldata _bytes, uint256 _start) internal pure returns (uint32) {
    unchecked {
    uint256 end = _start + 4;
    return uint32(bytes4(_bytes[_start:end]));
    }
    }
    function toU64(bytes calldata _bytes, uint256 _start) internal pure returns (uint64) {
    unchecked {
    uint256 end = _start + 8;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 11 of 35 : Transfer.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
    import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
    library Transfer {
    using SafeERC20 for IERC20;
    address internal constant ADDRESS_ZERO = address(0);
    error Transfer_NativeFailed(address _to, uint256 _value);
    error Transfer_ToAddressIsZero();
    function native(address _to, uint256 _value) internal {
    if (_to == ADDRESS_ZERO) revert Transfer_ToAddressIsZero();
    (bool success, ) = _to.call{ value: _value }("");
    if (!success) revert Transfer_NativeFailed(_to, _value);
    }
    function token(address _token, address _to, uint256 _value) internal {
    if (_to == ADDRESS_ZERO) revert Transfer_ToAddressIsZero();
    IERC20(_token).safeTransfer(_to, _value);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 12 of 35 : BitMaps.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // modified from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/structs/BitMaps.sol
    pragma solidity ^0.8.20;
    type BitMap256 is uint256;
    using BitMaps for BitMap256 global;
    library BitMaps {
    /**
    * @dev Returns whether the bit at `index` is set.
    */
    function get(BitMap256 bitmap, uint8 index) internal pure returns (bool) {
    uint256 mask = 1 << index;
    return BitMap256.unwrap(bitmap) & mask != 0;
    }
    /**
    * @dev Sets the bit at `index`.
    */
    function set(BitMap256 bitmap, uint8 index) internal pure returns (BitMap256) {
    uint256 mask = 1 << index;
    return BitMap256.wrap(BitMap256.unwrap(bitmap) | mask);
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 13 of 35 : ExecutorOptions.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    import { CalldataBytesLib } from "../../libs/CalldataBytesLib.sol";
    library ExecutorOptions {
    using CalldataBytesLib for bytes;
    uint8 internal constant WORKER_ID = 1;
    uint8 internal constant OPTION_TYPE_LZRECEIVE = 1;
    uint8 internal constant OPTION_TYPE_NATIVE_DROP = 2;
    uint8 internal constant OPTION_TYPE_LZCOMPOSE = 3;
    uint8 internal constant OPTION_TYPE_ORDERED_EXECUTION = 4;
    error Executor_InvalidLzReceiveOption();
    error Executor_InvalidNativeDropOption();
    error Executor_InvalidLzComposeOption();
    /// @dev decode the next executor option from the options starting from the specified cursor
    /// @param _options [executor_id][executor_option][executor_id][executor_option]...
    /// executor_option = [option_size][option_type][option]
    /// option_size = len(option_type) + len(option)
    /// executor_id: uint8, option_size: uint16, option_type: uint8, option: bytes
    /// @param _cursor the cursor to start decoding from
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 14 of 35 : PacketV1Codec.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    import { Packet } from "../../interfaces/ISendLib.sol";
    import { AddressCast } from "../../libs/AddressCast.sol";
    library PacketV1Codec {
    using AddressCast for address;
    using AddressCast for bytes32;
    uint8 internal constant PACKET_VERSION = 1;
    // header (version + nonce + path)
    // version
    uint256 private constant PACKET_VERSION_OFFSET = 0;
    // nonce
    uint256 private constant NONCE_OFFSET = 1;
    // path
    uint256 private constant SRC_EID_OFFSET = 9;
    uint256 private constant SENDER_OFFSET = 13;
    uint256 private constant DST_EID_OFFSET = 45;
    uint256 private constant RECEIVER_OFFSET = 49;
    // payload (guid + message)
    uint256 private constant GUID_OFFSET = 81; // keccak256(nonce + path)
    uint256 private constant MESSAGE_OFFSET = 113;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 15 of 35 : Ownable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
    pragma solidity ^0.8.0;
    import "../utils/Context.sol";
    /**
    * @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.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 16 of 35 : IERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
    pragma solidity ^0.8.0;
    /**
    * @dev Interface of the ERC20 standard as defined in the EIP.
    */
    interface IERC20 {
    /**
    * @dev Emitted when `value` tokens are moved from one account (`from`) to
    * another (`to`).
    *
    * Note that `value` may be zero.
    */
    event Transfer(address indexed from, address indexed to, uint256 value);
    /**
    * @dev Emitted when the allowance of a `spender` for an `owner` is set by
    * a call to {approve}. `value` is the new allowance.
    */
    event Approval(address indexed owner, address indexed spender, uint256 value);
    /**
    * @dev Returns the amount of tokens in existence.
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 17 of 35 : IERC20Permit.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)
    pragma solidity ^0.8.0;
    /**
    * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
    * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
    *
    * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
    * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
    * need to send a transaction, and thus is not required to hold Ether at all.
    *
    * ==== Security Considerations
    *
    * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
    * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
    * considered as an intention to spend the allowance in any specific way. The second is that because permits have
    * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
    * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
    * generally recommended is:
    *
    * ```solidity
    * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
    * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
    * doThing(..., value);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 18 of 35 : SafeERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)
    pragma solidity ^0.8.0;
    import "../IERC20.sol";
    import "../extensions/IERC20Permit.sol";
    import "../../../utils/Address.sol";
    /**
    * @title SafeERC20
    * @dev Wrappers around ERC20 operations that throw on failure (when the token
    * contract returns false). Tokens that return no value (and instead revert or
    * throw on failure) are also supported, non-reverting calls are assumed to be
    * successful.
    * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
    * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
    */
    library SafeERC20 {
    using Address for address;
    /**
    * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
    * non-reverting calls are assumed to be successful.
    */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 19 of 35 : Address.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
    pragma solidity ^0.8.1;
    /**
    * @dev Collection of functions related to the address type
    */
    library Address {
    /**
    * @dev Returns true if `account` is a contract.
    *
    * [IMPORTANT]
    * ====
    * It is unsafe to assume that an address for which this function returns
    * false is an externally-owned account (EOA) and not a contract.
    *
    * Among others, `isContract` will return false for the following
    * types of addresses:
    *
    * - an externally-owned account
    * - a contract in construction
    * - an address where a contract will be created
    * - an address where a contract lived, but was destroyed
    *
    * Furthermore, `isContract` will also return true if the target contract within
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 20 of 35 : Context.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
    pragma solidity ^0.8.0;
    /**
    * @dev Provides information about the current execution context, including the
    * sender of the transaction and its data. While these are generally available
    * via msg.sender and msg.data, they should not be accessed in such a direct
    * manner, since when dealing with meta-transactions the account sending and
    * paying for execution may not be the actual sender (as far as an application
    * is concerned).
    *
    * This contract is only required for intermediate, library-like contracts.
    */
    abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
    return msg.sender;
    }
    function _msgData() internal view virtual returns (bytes calldata) {
    return msg.data;
    }
    function _contextSuffixLength() internal view virtual returns (uint256) {
    return 0;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 21 of 35 : ERC165.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
    pragma solidity ^0.8.0;
    import "./IERC165.sol";
    /**
    * @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) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 22 of 35 : IERC165.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
    pragma solidity ^0.8.0;
    /**
    * @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);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 23 of 35 : SafeCast.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)
    // This file was procedurally generated from scripts/generate/templates/SafeCast.js.
    pragma solidity ^0.8.0;
    /**
    * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
    * checks.
    *
    * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
    * easily result in undesired exploitation or bugs, since developers usually
    * assume that overflows raise errors. `SafeCast` restores this intuition by
    * reverting the transaction when such an operation overflows.
    *
    * Using this library instead of the unchecked operations eliminates an entire
    * class of bugs, so it's recommended to use it always.
    *
    * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
    * all math on `uint256` and `int256` and then downcasting.
    */
    library SafeCast {
    /**
    * @dev Returns the downcasted uint248 from uint256, reverting on
    * overflow (when the input is greater than largest uint248).
    *
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 24 of 35 : MessageLibBase.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    /// @dev simply a container of endpoint address and local eid
    abstract contract MessageLibBase {
    address internal immutable endpoint;
    uint32 internal immutable localEid;
    error LZ_MessageLib_OnlyEndpoint();
    modifier onlyEndpoint() {
    if (endpoint != msg.sender) revert LZ_MessageLib_OnlyEndpoint();
    _;
    }
    constructor(address _endpoint, uint32 _localEid) {
    endpoint = _endpoint;
    localEid = _localEid;
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 25 of 35 : SendLibBase.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
    import { Transfer } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/Transfer.sol";
    import { ILayerZeroExecutor } from "./interfaces/ILayerZeroExecutor.sol";
    import { ILayerZeroTreasury } from "./interfaces/ILayerZeroTreasury.sol";
    import { SafeCall } from "./libs/SafeCall.sol";
    import { MessageLibBase } from "./MessageLibBase.sol";
    struct WorkerOptions {
    uint8 workerId;
    bytes options;
    }
    struct SetDefaultExecutorConfigParam {
    uint32 eid;
    ExecutorConfig config;
    }
    struct ExecutorConfig {
    uint32 maxMessageSize;
    address executor;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 26 of 35 : SendLibBaseE2.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
    import { ERC165 } from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
    import { ILayerZeroEndpointV2, MessagingFee } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
    import { IMessageLib, MessageLibType } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLib.sol";
    import { ISendLib, Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol";
    import { Transfer } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/Transfer.sol";
    import { SendLibBase, WorkerOptions, ExecutorConfig } from "./SendLibBase.sol";
    /// @dev send-side message library base contract on endpoint v2.
    /// design: the high level logic is the same as SendLibBaseE1
    /// 1/ with added interfaces
    /// 2/ adapt the functions to the new types, like uint32 for eid, address for sender.
    abstract contract SendLibBaseE2 is SendLibBase, ERC165, ISendLib {
    event NativeFeeWithdrawn(address worker, address receiver, uint256 amount);
    event LzTokenFeeWithdrawn(address lzToken, address receiver, uint256 amount);
    error LZ_MessageLib_NotTreasury();
    error LZ_MessageLib_CannotWithdrawAltToken();
    constructor(
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 27 of 35 : ILayerZeroExecutor.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface ILayerZeroExecutor {
    // @notice query price and assign jobs at the same time
    // @param _dstEid - the destination endpoint identifier
    // @param _sender - the source sending contract address. executors may apply price discrimination to senders
    // @param _calldataSize - dynamic data size of message + caller params
    // @param _options - optional parameters for extra service plugins, e.g. sending dust tokens at the destination chain
    function assignJob(
    uint32 _dstEid,
    address _sender,
    uint256 _calldataSize,
    bytes calldata _options
    ) external returns (uint256 price);
    // @notice query the executor price for relaying the payload and its proof to the destination chain
    // @param _dstEid - the destination endpoint identifier
    // @param _sender - the source sending contract address. executors may apply price discrimination to senders
    // @param _calldataSize - dynamic data size of message + caller params
    // @param _options - optional parameters for extra service plugins, e.g. sending dust tokens at the destination chain
    function getFee(
    uint32 _dstEid,
    address _sender,
    uint256 _calldataSize,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 28 of 35 : ILayerZeroTreasury.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface ILayerZeroTreasury {
    function getFee(
    address _sender,
    uint32 _dstEid,
    uint256 _totalNativeFee,
    bool _payInLzToken
    ) external view returns (uint256 fee);
    function payFee(
    address _sender,
    uint32 _dstEid,
    uint256 _totalNativeFee,
    bool _payInLzToken
    ) external payable returns (uint256 fee);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 29 of 35 : SafeCall.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT OR Apache-2.0
    pragma solidity ^0.8.20;
    /// @dev copied from https://github.com/nomad-xyz/ExcessivelySafeCall/blob/main/src/ExcessivelySafeCall.sol.
    library SafeCall {
    /// @notice calls a contract with a specified gas limit and value and captures the return data
    /// @param _target The address to call
    /// @param _gas The amount of gas to forward to the remote contract
    /// @param _value The value in wei to send to the remote contract
    /// to memory.
    /// @param _maxCopy The maximum number of bytes of returndata to copy
    /// to memory.
    /// @param _calldata The data to send to the remote contract
    /// @return success and returndata, as `.call()`. Returndata is capped to
    /// `_maxCopy` bytes.
    function safeCall(
    address _target,
    uint256 _gas,
    uint256 _value,
    uint16 _maxCopy,
    bytes memory _calldata
    ) internal returns (bool, bytes memory) {
    // check that target has code
    uint size;
    assembly {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 30 of 35 : SendUlnBase.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    import { Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol";
    import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol";
    import { ILayerZeroDVN } from "./interfaces/ILayerZeroDVN.sol";
    import { DVNOptions } from "./libs/DVNOptions.sol";
    import { UlnOptions } from "./libs/UlnOptions.sol";
    import { WorkerOptions } from "../SendLibBase.sol";
    import { UlnConfig, UlnBase } from "./UlnBase.sol";
    /// @dev includes the utility functions for checking ULN states and logics
    abstract contract SendUlnBase is UlnBase {
    event DVNFeePaid(address[] requiredDVNs, address[] optionalDVNs, uint256[] fees);
    function _splitUlnOptions(bytes calldata _options) internal pure returns (bytes memory, WorkerOptions[] memory) {
    (bytes memory executorOpts, bytes memory dvnOpts) = UlnOptions.decode(_options);
    if (dvnOpts.length == 0) {
    return (executorOpts, new WorkerOptions[](0));
    }
    WorkerOptions[] memory workerOpts = new WorkerOptions[](1);
    workerOpts[0] = WorkerOptions(DVNOptions.WORKER_ID, dvnOpts);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 31 of 35 : UlnBase.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
    // the formal properties are documented in the setter functions
    struct UlnConfig {
    uint64 confirmations;
    // we store the length of required DVNs and optional DVNs instead of using DVN.length directly to save gas
    uint8 requiredDVNCount; // 0 indicate DEFAULT, NIL_DVN_COUNT indicate NONE (to override the value of default)
    uint8 optionalDVNCount; // 0 indicate DEFAULT, NIL_DVN_COUNT indicate NONE (to override the value of default)
    uint8 optionalDVNThreshold; // (0, optionalDVNCount]
    address[] requiredDVNs; // no duplicates. sorted an an ascending order. allowed overlap with optionalDVNs
    address[] optionalDVNs; // no duplicates. sorted an an ascending order. allowed overlap with requiredDVNs
    }
    struct SetDefaultUlnConfigParam {
    uint32 eid;
    UlnConfig config;
    }
    /// @dev includes the utility functions for checking ULN states and logics
    abstract contract UlnBase is Ownable {
    address private constant DEFAULT_CONFIG = address(0);
    // reserved values for
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 32 of 35 : ILayerZeroDVN.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface ILayerZeroDVN {
    struct AssignJobParam {
    uint32 dstEid;
    bytes packetHeader;
    bytes32 payloadHash;
    uint64 confirmations;
    address sender;
    }
    // @notice query price and assign jobs at the same time
    // @param _dstEid - the destination endpoint identifier
    // @param _packetHeader - version + nonce + path
    // @param _payloadHash - hash of guid + message
    // @param _confirmations - block confirmation delay before relaying blocks
    // @param _sender - the source sending contract address
    // @param _options - options
    function assignJob(AssignJobParam calldata _param, bytes calldata _options) external payable returns (uint256 fee);
    // @notice query the dvn fee for relaying block information to the destination chain
    // @param _dstEid the destination endpoint identifier
    // @param _confirmations - block confirmation delay before relaying blocks
    // @param _sender - the source sending contract address
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 33 of 35 : DVNOptions.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    import { BytesLib } from "solidity-bytes-utils/contracts/BytesLib.sol";
    import { BitMap256 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/BitMaps.sol";
    import { CalldataBytesLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/CalldataBytesLib.sol";
    library DVNOptions {
    using CalldataBytesLib for bytes;
    using BytesLib for bytes;
    uint8 internal constant WORKER_ID = 2;
    uint8 internal constant OPTION_TYPE_PRECRIME = 1;
    error DVN_InvalidDVNIdx();
    error DVN_InvalidDVNOptions(uint256 cursor);
    /// @dev group dvn options by its idx
    /// @param _options [dvn_id][dvn_option][dvn_id][dvn_option]...
    /// dvn_option = [option_size][dvn_idx][option_type][option]
    /// option_size = len(dvn_idx) + len(option_type) + len(option)
    /// dvn_id: uint8, dvn_idx: uint8, option_size: uint16, option_type: uint8, option: bytes
    /// @return dvnOptions the grouped options, still share the same format of _options
    /// @return dvnIndices the dvn indices
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 34 of 35 : UlnOptions.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol";
    import { ExecutorOptions } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/ExecutorOptions.sol";
    import { DVNOptions } from "./DVNOptions.sol";
    library UlnOptions {
    using SafeCast for uint256;
    uint16 internal constant TYPE_1 = 1; // legacy options type 1
    uint16 internal constant TYPE_2 = 2; // legacy options type 2
    uint16 internal constant TYPE_3 = 3;
    error LZ_ULN_InvalidWorkerOptions(uint256 cursor);
    error LZ_ULN_InvalidWorkerId(uint8 workerId);
    error LZ_ULN_InvalidLegacyType1Option();
    error LZ_ULN_InvalidLegacyType2Option();
    error LZ_ULN_UnsupportedOptionType(uint16 optionType);
    /// @dev decode the options into executorOptions and dvnOptions
    /// @param _options the options can be either legacy options (type 1 or 2) or type 3 options
    /// @return executorOptions the executor options, share the same format of type 3 options
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 35 of 35 : BytesLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: Unlicense
    /*
    * @title Solidity Bytes Arrays Utils
    * @author Gonçalo Sá <goncalo.sa@consensys.net>
    *
    * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
    * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
    */
    pragma solidity >=0.8.0 <0.9.0;
    library BytesLib {
    function concat(
    bytes memory _preBytes,
    bytes memory _postBytes
    )
    internal
    pure
    returns (bytes memory)
    {
    bytes memory tempBytes;
    assembly {
    // Get a location of some free memory and store it in tempBytes as
    // Solidity does for memory variables.
    tempBytes := mload(0x40)
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Settings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    {
    "evmVersion": "paris",
    "optimizer": {
    "enabled": true,
    "runs": 20000
    },
    "outputSelection": {
    "*": {
    "*": [
    "evm.bytecode",
    "evm.deployedBytecode",
    "devdoc",
    "userdoc",
    "metadata",
    "abi"
    ]
    }
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Contract Security Audit

    Contract ABI

    API
    [{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"uint256","name":"_treasuryGasLimit","type":"uint256"},{"internalType":"uint256","name":"_treasuryGasForFeeCap","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DVN_InvalidDVNIdx","type":"error"},{"inputs":[{"internalType":"uint256","name":"cursor","type":"uint256"}],"name":"DVN_InvalidDVNOptions","type":"error"},{"inputs":[],"name":"LZ_MessageLib_CannotWithdrawAltToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"LZ_MessageLib_InvalidAmount","type":"error"},{"inputs":[],"name":"LZ_MessageLib_InvalidExecutor","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"LZ_MessageLib_InvalidMessageSize","type":"error"},{"inputs":[],"name":"LZ_MessageLib_NotTreasury","type":"error"},{"inputs":[],"name":"LZ_MessageLib_OnlyEndpoint","type":"error"},{"inputs":[],"name":"LZ_MessageLib_TransferFailed","type":"error"},{"inputs":[],"name":"LZ_MessageLib_ZeroMessageSize","type":"error"},{"inputs":[],"name":"LZ_ULN_AtLeastOneDVN","type":"error"},{"inputs":[{"internalType":"uint32","name":"configType","type":"uint32"}],"name":"LZ_ULN_InvalidConfigType","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidConfirmations","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidLegacyType1Option","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidLegacyType2Option","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidOptionalDVNCount","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidOptionalDVNThreshold","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidRequiredDVNCount","type":"error"},{"inputs":[{"internalType":"uint8","name":"workerId","type":"uint8"}],"name":"LZ_ULN_InvalidWorkerId","type":"error"},{"inputs":[{"internalType":"uint256","name":"cursor","type":"uint256"}],"name":"LZ_ULN_InvalidWorkerOptions","type":"error"},{"inputs":[],"name":"LZ_ULN_Unsorted","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"LZ_ULN_UnsupportedEid","type":"error"},{"inputs":[{"internalType":"uint16","name":"optionType","type":"uint16"}],"name":"LZ_ULN_UnsupportedOptionType","type":"error"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer_NativeFailed","type":"error"},{"inputs":[],"name":"Transfer_ToAddressIsZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"optionalDVNs","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"fees","type":"uint256[]"}],"name":"DVNFeePaid","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"internalType":"struct ExecutorConfig","name":"config","type":"tuple"}],"indexed":false,"internalType":"struct SetDefaultExecutorConfigParam[]","name":"params","type":"tuple[]"}],"name":"DefaultExecutorConfigsSet","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"indexed":false,"internalType":"struct SetDefaultUlnConfigParam[]","name":"params","type":"tuple[]"}],"name":"DefaultUlnConfigsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oapp","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"indexed":false,"internalType":"struct ExecutorConfig","name":"config","type":"tuple"}],"name":"ExecutorConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"ExecutorFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lzToken","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LzTokenFeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"worker","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeFeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTreasuryNativeFeeCap","type":"uint256"}],"name":"TreasuryNativeFeeCapSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"TreasurySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oapp","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"indexed":false,"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"name":"UlnConfigSet","type":"event"},{"inputs":[{"internalType":"address","name":"oapp","type":"address"},{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"executorConfigs","outputs":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"worker","type":"address"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getAppUlnConfig","outputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_configType","type":"uint32"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getExecutorConfig","outputs":[{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"internalType":"struct ExecutorConfig","name":"rtnConfig","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getUlnConfig","outputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"rtnConfig","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"isSupportedEid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageLibType","outputs":[{"internalType":"enum MessageLibType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Packet","name":"_packet","type":"tuple"},{"internalType":"bytes","name":"_options","type":"bytes"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"quote","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Packet","name":"_packet","type":"tuple"},{"internalType":"bytes","name":"_options","type":"bytes"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"send","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint32","name":"configType","type":"uint32"},{"internalType":"bytes","name":"config","type":"bytes"}],"internalType":"struct SetConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"internalType":"struct ExecutorConfig","name":"config","type":"tuple"}],"internalType":"struct SetDefaultExecutorConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setDefaultExecutorConfigs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"internalType":"struct SetDefaultUlnConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setDefaultUlnConfigs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTreasuryNativeFeeCap","type":"uint256"}],"name":"setTreasuryNativeFeeCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint64","name":"major","type":"uint64"},{"internalType":"uint8","name":"minor","type":"uint8"},{"internalType":"uint8","name":"endpointVersion","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lzToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawLzTokenFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

    60e06040523480156200001157600080fd5b5060405162005bb938038062005bb9833981016040819052620000349162000129565b82828282836001600160a01b031663416ecebf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000077573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009d91906200016e565b6001600160a01b03821660805263ffffffff811660a0528383620000c133620000d9565b60c091909152600255506200019d9650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000606084860312156200013f57600080fd5b83516001600160a01b03811681146200015757600080fd5b602085015160409095015190969495509392505050565b6000602082840312156200018157600080fd5b815163ffffffff811681146200019657600080fd5b9392505050565b60805160a05160c0516159d3620001e66000396000818161203e01526128d8015260005050600081816107ea0152818161092f01528181610e7f015261176c01526159d36000f3fe6080604052600436106101845760003560e01c806361d027b3116100d6578063d15b0d491161007f578063f2fde38b11610059578063f2fde38b14610513578063faaebd2114610533578063fd9be5221461056e57600080fd5b8063d15b0d49146104a6578063d80e9bd9146104c6578063f0f44260146104f357600080fd5b80638da5cb5b116100b05780638da5cb5b1461042e5780639c33abf714610459578063c14c43491461048657600080fd5b806361d027b3146103a75780636750cd4c146103f9578063715018a61461041957600080fd5b806329460b0b1161013857806343ea4fa91161011257806343ea4fa9146102cb5780634d963200146102eb57806354fd4d501461037a57600080fd5b806329460b0b1461025057806339e3f938146102705780634389e58f1461029d57600080fd5b80631881d94d116101695780631881d94d146101f2578063200175f71461020e57806320efd7221461023057600080fd5b806301ffc9a714610190578063188183f4146101c557600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101b06101ab36600461453b565b61058e565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e03660046145cc565b610673565b6040516101bc9190614605565b3480156101fe57600080fd5b5060006040516101bc9190614638565b34801561021a57600080fd5b5061022e610229366004614679565b610780565b005b34801561023c57600080fd5b5061022e61024b3660046146ff565b61092d565b34801561025c57600080fd5b5061022e61026b366004614754565b610ae1565b34801561027c57600080fd5b5061029061028b3660046145cc565b610cc6565b6040516101bc919061485a565b3480156102a957600080fd5b506102bd6102b8366004614886565b610e67565b6040516101bc9291906149a4565b3480156102d757600080fd5b506102906102e63660046145cc565b610f61565b3480156102f757600080fd5b506103496103063660046145cc565b600460209081526000928352604080842090915290825290205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016101bc565b34801561038657600080fd5b506040805160038152600060208201526002918101919091526060016101bc565b3480156103b357600080fd5b506003546103d49073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561040557600080fd5b506101b06104143660046149c8565b61131b565b34801561042557600080fd5b5061022e611326565b34801561043a57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166103d4565b34801561046557600080fd5b506104796104743660046149e5565b61133a565b6040516101bc9190614a30565b34801561049257600080fd5b5061022e6104a1366004614a43565b611421565b3480156104b257600080fd5b5061022e6104c1366004614ab8565b611599565b3480156104d257600080fd5b506104e66104e1366004614886565b611627565b6040516101bc9190614ad1565b3480156104ff57600080fd5b5061022e61050e366004614ae8565b611697565b34801561051f57600080fd5b5061022e61052e366004614ae8565b6116ab565b34801561053f57600080fd5b5061056061054e366004614ae8565b60056020526000908152604090205481565b6040519081526020016101bc565b34801561057a57600080fd5b5061022e610589366004614b05565b61175f565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f97f0258400000000000000000000000000000000000000000000000000000000148061062157507fffffffff0000000000000000000000000000000000000000000000000000000082167fb6e9ace300000000000000000000000000000000000000000000000000000000145b8061066d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080518082019091526000808252602082015263ffffffff80831660008181527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8916845260048352818420948452939091528120805492939092169081900361070457825463ffffffff16610706565b805b63ffffffff1684528154640100000000900473ffffffffffffffffffffffffffffffffffffffff1680610758578354640100000000900473ffffffffffffffffffffffffffffffffffffffff1661075a565b805b73ffffffffffffffffffffffffffffffffffffffff166020860152509295945050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146107d1576040517f885762a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e1758bd86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610853573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108779190614b31565b73ffffffffffffffffffffffffffffffffffffffff16036108c4576040517fe695d04400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108cf838383611859565b6040805173ffffffffffffffffffffffffffffffffffffffff8086168252841660208201529081018290527fe081464b7278501267de69fa85b7b9560b0ae05d5fbfaab9b1986c70356e2efe906060015b60405180910390a1505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461099c576040517f467409c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610adb57368383838181106109ba576109ba614b4e565b90506020028101906109cc9190614b7d565b90506109e36109de60208301836149c8565b6118cc565b60016109f560408301602084016149c8565b63ffffffff1603610a3557610a30610a1060208301836149c8565b86610a1e6040850185614bbb565b810190610a2b9190614cea565b611913565b610ad2565b6002610a4760408301602084016149c8565b63ffffffff1603610a8257610a30610a6260208301836149c8565b86610a706040850185614bbb565b810190610a7d9190614ea3565b6119c0565b610a9260408201602083016149c8565b6040517fba97c1fa00000000000000000000000000000000000000000000000000000000815263ffffffff90911660048201526024015b60405180910390fd5b5060010161099f565b50505050565b610ae9611a09565b60005b81811015610c885736838383818110610b0757610b07614b4e565b9050602002810190610b199190614ed8565b905060ff610b2a6020830183614f0c565b610b3b906040810190602001614f40565b60ff1603610b75576040517f83aa17da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ff610b846020830183614f0c565b610b95906060810190604001614f40565b60ff1603610bcf576040517f4221136600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff610be56020830183614f0c565b610bf3906020810190614f5b565b67ffffffffffffffff1603610c34576040517f503667ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c52610c446020830183614f0c565b610c4d90614f76565b611a8a565b610c7f6000610c6460208401846149c8565b610c716020850185614f0c565b610c7a90614f76565b611adb565b50600101610aec565b507faaf3aaa0c11056e86ac56eb653e25b005ca1a7d4dcd21ba24647f7ab63f3b5608282604051610cba929190615034565b60405180910390a15050565b6040805160c0810182526000808252602082018190529181018290526060808201929092526080810182905260a081019190915273ffffffffffffffffffffffffffffffffffffffff8316600090815260016020818152604080842063ffffffff87168552825292839020835160c081018552815467ffffffffffffffff8116825260ff680100000000000000008204811683860152690100000000000000000082048116838801526a01000000000000000000009091041660608201529281018054855181850281018501909652808652939491936080860193830182828015610de757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610dbc575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610e5657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e2b575b505050505081525050905092915050565b604080518082019091526000808252602082015260607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610eec576040517f467409c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610efa888888611e6f565b9092509050600080610f2c610f1560608c0160408d01614ae8565b610f2560808d0160608e016149c8565b858a611f3c565b9092509050610f3b8284615203565b604080518082019091529081526020810191909152945091925050505b94509492505050565b6040805160c0810182526000808252602080830182905282840182905260608084018390526080840181905260a084015263ffffffff85168083527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49825284832073ffffffffffffffffffffffffffffffffffffffff88168452600183528584209184529152929020805491929167ffffffffffffffff168061101157825467ffffffffffffffff168452611030565b67ffffffffffffffff818116146110305767ffffffffffffffff811684525b815468010000000000000000900460ff166110e657825468010000000000000000900460ff16156110e157826001018054806020026020016040519081016040528092919081815260200182805480156110c057602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611095575b50505050506080850152825468010000000000000000900460ff1660208501525b611184565b815468010000000000000000900460ff90811614611184578160010180548060200260200160405190810160405280929190818152602001828054801561116357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611138575b50505050506080850152815468010000000000000000900460ff1660208501525b81546901000000000000000000900460ff166112535782546901000000000000000000900460ff161561124e578260020180548060200260200160405190810160405280929190818152602001828054801561121657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111eb575b505050505060a0850152825460ff69010000000000000000008204811660408701526a01000000000000000000009091041660608501525b611309565b81546901000000000000000000900460ff9081161461130957816002018054806020026020016040519081016040528092919081815260200182805480156112d157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116112a6575b505050505060a0850152815460ff69010000000000000000008204811660408701526a01000000000000000000009091041660608501525b61131284611a8a565b50505092915050565b600061066d826120ca565b61132e611a09565b6113386000612131565b565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff831601611399576113738385610673565b6040516020016113839190614605565b604051602081830303815290604052905061141a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe63ffffffff8316016113e0576113d08385610f61565b604051602001611383919061485a565b6040517fba97c1fa00000000000000000000000000000000000000000000000000000000815263ffffffff83166004820152602401610ac9565b9392505050565b611429611a09565b60005b81811015611567573683838381811061144757611447614b4e565b60609081029290920192506000916114659150830160408401614ae8565b73ffffffffffffffffffffffffffffffffffffffff16036114b2576040517f20e9d05a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c260408201602083016149c8565b63ffffffff16600003611501576040517f49cfac4300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808052600460209081528201907f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec9061153c83856149c8565b63ffffffff168152602081019190915260400160002061155c8282615216565b50505060010161142c565b507f2b001e1c6683bf79cc52891bd7215b204c787d18134fc7f3d21b4f32a49e47de8282604051610cba9291906152ae565b6115a1611a09565b6002548111156115eb576002546040517f34084fb8000000000000000000000000000000000000000000000000000000008152610ac9918391600401918252602082015260400190565b60028190556040518181527f491ff913b5444f4136b0d4075f020cfe3a5f60de926ec0b091612401a22b7842906020015b60405180910390a150565b60408051808201909152600080825260208201526000806116786116516060890160408a01614ae8565b61166160808a0160608b016149c8565b61166e60c08b018b614bbb565b9050878a8a6121a6565b604080518082019091529182526020820152925050505b949350505050565b61169f611a09565b6116a8816122ac565b50565b6116b3611a09565b73ffffffffffffffffffffffffffffffffffffffff8116611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ac9565b6116a881612131565b6117688161231f565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e1758bd86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f99190614b31565b9050611806818484612389565b6040805133815273ffffffffffffffffffffffffffffffffffffffff851660208201529081018390527f820b7fd51bf79c54350bab98400651b3314ff6e79b33528821871d94a666988390606001610920565b73ffffffffffffffffffffffffffffffffffffffff82166118a6576040517f6b7a931000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118c773ffffffffffffffffffffffffffffffffffffffff841683836123b9565b505050565b6118d5816120ca565b6116a8576040517ff0c10d0400000000000000000000000000000000000000000000000000000000815263ffffffff82166004820152602401610ac9565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260046020908152604080832063ffffffff8089168552908352928190208551815493870151909516640100000000027fffffffffffffffff0000000000000000000000000000000000000000000000009093169490931693909317179055517f779cb2dd9d2bb1be1737d05435d744facbfb84a2a4912e21379d39beddcdc805906109209084908690859061533b565b6119cb828483611adb565b6119d58284610f61565b507f82118522aa536ac0e96cc5c689407ae42b89d592aa133890a01f1509842f508182848360405161092093929190615397565b60005473ffffffffffffffffffffffffffffffffffffffff163314611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b602081015160ff16158015611aa45750606081015160ff16155b156116a8576040517fce2c375100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015160ff9081161480611af65750602081015160ff16155b15611b3d5760808101515115611b38576040517f83aa17da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bbc565b806020015160ff16816080015151141580611b7857506002611b61600160ff6153d2565b611b6b91906153eb565b60ff16816020015160ff16115b15611baf576040517f83aa17da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bbc8160800151612446565b604081015160ff9081161480611bd75750604081015160ff16155b15611c5d5760a08101515115611c19576040517f4221136600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015160ff1615611c58576040517f38682fa900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d34565b806040015160ff168160a0015151141580611c9857506002611c81600160ff6153d2565b611c8b91906153eb565b60ff16816040015160ff16115b15611ccf576040517f4221136600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015160ff161580611cf05750806040015160ff16816060015160ff16115b15611d27576040517f38682fa900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d348160a00151612446565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020818152604080842063ffffffff87168552825292839020845181548684015195870151606088015167ffffffffffffffff9093167fffffffffffffffffffffffffffffffffffffffffffffff000000000000000000909216919091176801000000000000000060ff97881602177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000918716919091027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16176a0100000000000000000000959091169490940293909317835560808401518051859493611e4b939085019201906144a5565b5060a08201518051611e679160028401916020909101906144a5565b505050505050565b60606000806000611e8086866124e0565b90925090506000611eaa611e9a60608a0160408b01614ae8565b6101e060808b0160608c016149c8565b90506000611ebb60c08a018a614bbb565b90509050611ed381836000015163ffffffff166124f9565b6020820151611f0390611eec60808c0160608d016149c8565b611efc60608d0160408e01614ae8565b8488612541565b611f0d9086615203565b9450600080611f1c8b8661267a565b9092509050611f2b8288615203565b909b909a5098505050505050505050565b600354600090819073ffffffffffffffffffffffffffffffffffffffff1615610f585760405173ffffffffffffffffffffffffffffffffffffffff8716602482015263ffffffff8616604482015260648101859052831515608482015260009060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd51c54860000000000000000000000000000000000000000000000000000000017905260035491925060009182916120669173ffffffffffffffffffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000009084908761269d565b915091506120768787848461274e565b909550935084156120be5760035473ffffffffffffffffffffffffffffffffffffffff16600090815260056020526040812080548792906120b8908490615203565b90915550505b50505094509492505050565b63ffffffff811660009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4960205260408120805468010000000000000000900460ff1615158061141a5750546a0100000000000000000000900460ff16151592915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000806121b686866124e0565b9150915060006121c78b8b846127c9565b905060006121d58c8c610673565b90506121eb8a826000015163ffffffff166124f9565b806020015173ffffffffffffffffffffffffffffffffffffffff1663709eb6648c8e8d886040518563ffffffff1660e01b815260040161222e9493929190615434565b602060405180830381865afa15801561224b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226f919061547f565b6122799083615203565b915060008061228a8e8e868e6127d6565b90925090506122998285615203565b9e909d509b505050505050505050505050565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f9060200161161c565b3360009081526005602052604090205480821115612373576040517f34084fb80000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610ac9565b3360009081526005602052604090209190039055565b73ffffffffffffffffffffffffffffffffffffffff83166123ae576118c7828261291a565b6118c7838383611859565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526118c7908490612a20565b6000805b82518110156118c757600083828151811061246757612467614b4e565b602002602001015190508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16116124d6576040517f447516e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b915060010161244a565b6060806124ed8484612b2f565b915091505b9250929050565b8082111561253d576040517fc667af3e0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610ac9565b5050565b6040517f717e8a4200000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff87169063717e8a429061259c908890889088908890600401615434565b6020604051808303816000875af11580156125bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125df919061547f565b905080156126225773ffffffffffffffffffffffffffffffffffffffff86166000908152600560205260408120805483929061261c908490615203565b90915550505b6040805173ffffffffffffffffffffffffffffffffffffffff88168152602081018390527f61ed099e74a97a1d7f8bb0952a88ca8b7b8ebd00c126ea04671f92a81213318a910160405180910390a195945050505050565b60006060612692600561268c86615526565b85612c1c565b909590945092505050565b60006060863b8083036126c457604080516000808252602082019092529250925050612744565b60008060008761ffff1667ffffffffffffffff8111156126e6576126e6614c20565b6040519080825280601f01601f191660200182016040528015612710576020820181803683370190505b509050600080885160208a018c8f8ff191503d925087831115612731578792505b828152826000602083013e909450925050505b9550959350505050565b60008083158061275f575082516020115b1561276f57506000905080610f58565b600083806020019051810190612785919061547f565b90508515612795578091506127bf565b600060025488116127a8576002546127aa565b875b90508082116127b957816127bb565b805b9350505b5094509492505050565b600061168f848484612d78565b600354600090819073ffffffffffffffffffffffffffffffffffffffff1615610f585760405173ffffffffffffffffffffffffffffffffffffffff8716602482015263ffffffff8616604482015260648101859052831515608482015260009060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd42442210000000000000000000000000000000000000000000000000000000017905260035491925060009182916128fe9173ffffffffffffffffffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000009086612df2565b9150915061290e8787848461274e565b94509450505050610f58565b73ffffffffffffffffffffffffffffffffffffffff8216612967576040517f6b7a931000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146129c1576040519150601f19603f3d011682016040523d82523d6000602084013e6129c6565b606091505b50509050806118c7576040517f465bc83400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101839052604401610ac9565b6000612a82826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e9f9092919063ffffffff16565b9050805160001480612aa3575080806020019051810190612aa391906155c4565b6118c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ac9565b606080600080612b3f8686612eae565b915091508051600003612b9757604080516000808252602082019092528391612b8b565b604080518082019091526000815260606020820152815260200190600190039081612b635790505b509350935050506124f2565b604080516001808252818301909252600091816020015b604080518082019091526000815260606020820152815260200190600190039081612bae5790505090506040518060400160405280600260ff1681526020018381525081600081518110612c0457612c04614b4e565b60209081029190910101529196919550909350505050565b600060606000612c2b856130ef565b90506000612c38866131d5565b805160208201206060880151604089015192935090916000612c5a8284610f61565b905060008951600014612c8b5789600081518110612c7a57612c7a614b4e565b602002602001015160200151612c9c565b604051806020016040528060008152505b90506060612cfc8d846040518060a001604052808963ffffffff1681526020018c81526020018a8152602001876000015167ffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff16815250856131f2565b604051919b509150612d1490899089906020016155e1565b60405160208183030381529060405298507f07ea52d82345d6e838192107d8fd7123d9c2ec8e916cd0aad13fd2b60db2464483608001518460a0015183604051612d6093929190615610565b60405180910390a15050505050505050935093915050565b600080612d858585610f61565b905060008351600014612db65783600081518110612da557612da5614b4e565b602002602001015160200151612dc7565b604051806020016040528060008152505b9050600080612dd5836134de565b91509150612de684888a8585613782565b98975050505050505050565b60006060853b808303612e1957604080516000808252602082019092529250925050610f58565b60008060008761ffff1667ffffffffffffffff811115612e3b57612e3b614c20565b6040519080825280601f01601f191660200182016040528015612e65576020820181803683370190505b509050600080885160208a018d8dfa91503d925087831115612e85578792505b828152826000602083013e90999098509650505050505050565b606061168f8484600085613940565b6060806002831015612eef576040517f6592671c00000000000000000000000000000000000000000000000000000000815260006004820152602401610ac9565b6000612efe600282868861566e565b612f0791615698565b60f01c905060027ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd82016130d8578060005b86831015613064576000612f5260018501858a8c61566e565b612f5b916156e0565b60f81c90506000819003612f9e576040517f6780cfaf00000000000000000000000000000000000000000000000000000000815260006004820152602401610ac9565b8160ff16600003612fb157809150612fee565b8160ff168160ff1614612fee57366000612fcd86868c8e61566e565b91509150612fde8989868585613a59565b9099509750859450919250829150505b600184019360009061300590600301868b8d61566e565b61300e91615698565b60f01c90506000819003613051576040517f6592671c00000000000000000000000000000000000000000000000000000000815260048101869052602401610ac9565b8060020161ffff16850194505050612f39565b8287146130a0576040517f6592671c00000000000000000000000000000000000000000000000000000000815260048101849052602401610ac9565b60028711156130d1573660006130b885858b8d61566e565b915091506130c98888858585613a59565b909850965050505b50506130e6565b6130e3828787613bce565b93505b50509250929050565b8051602080830151604080850151606080870151608088015193517f01000000000000000000000000000000000000000000000000000000000000009681019690965260c09690961b7fffffffffffffffff00000000000000000000000000000000000000000000000016602186015260e093841b7fffffffff00000000000000000000000000000000000000000000000000000000908116602987015273ffffffffffffffffffffffffffffffffffffffff909216602d8601529490921b909116604d83015260518201526071015b6040516020818303038152906040529050919050565b60608160a001518260c001516040516020016131bf929190615726565b60006060600080613202856134de565b9150915060008760400151886020015161321c919061574c565b90508060ff1667ffffffffffffffff81111561323a5761323a614c20565b604051908082528060200260200182016040528015613263578160200160208202803683370190505b50935060005b8160ff168160ff1610156134d1576000896020015160ff168260ff16106132be5760a08a015160208b015161329e90846153d2565b60ff16815181106132b1576132b1614b4e565b60200260200101516132e0565b89608001518260ff16815181106132d7576132d7614b4e565b60200260200101515b60408051602081019091526000808252919250905b855181101561334d578360ff1686828151811061331457613314614b4e565b602002602001015160ff16036133455786818151811061333657613336614b4e565b6020026020010151915061334d565b6001016132f5565b506040517f95d376d700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906395d376d7906133a2908d908590600401615765565b6020604051808303816000875af11580156133c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e5919061547f565b878460ff16815181106133fa576133fa614b4e565b6020026020010181815250506000878460ff168151811061341d5761341d614b4e565b602002602001015111156134c757868360ff168151811061344057613440614b4e565b60200260200101518c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134959190615203565b92505081905550868360ff16815181106134b1576134b1614b4e565b6020026020010151886134c49190615203565b97505b5050600101613269565b5050505094509492505050565b60608082516000036134ef57915091565b60006134fa84613e4d565b90508060ff166001036135ac5760408051600180825281830190925290816020015b606081526020019060019003908161351c579050509250838360008151811061354757613547614b4e565b60209081029190910101526040805160018082528183019092529081602001602082028036833701905050915061357f846003613f72565b8260008151811061359257613592614b4e565b602002602001019060ff16908160ff168152505050915091565b8060ff1667ffffffffffffffff8111156135c8576135c8614c20565b6040519080825280602002602001820160405280156135f1578160200160208202803683370190505b5091508060ff1667ffffffffffffffff81111561361057613610614c20565b60405190808252806020026020018201604052801561364357816020015b606081526020019060019003908161362e5790505b50925060008060ff5b86518310156136f75760019092019160006136678885613ff2565b600294909401939050600061367c8986613f72565b90508260ff1660ff03613691578092506136e8565b8260ff168160ff16146136e8577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8486030160006136d08b8784614072565b90506136de8a8a87846141ec565b5093909301929150815b5061ffff16929092019161364c565b8183036000613707898584614072565b9050613715888885846141ec565b60005b8660ff168160ff16101561377657878160ff168151811061373b5761373b614b4e565b6020908102919091010180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160ff169052600101613718565b50505050505050915091565b60008086604001518760200151613799919061574c565b905060005b8160ff168160ff161015613935576000886020015160ff168260ff16106137f35760a089015160208a01516137d390846153d2565b60ff16815181106137e6576137e6614b4e565b6020026020010151613815565b88608001518260ff168151811061380c5761380c614b4e565b60200260200101515b60408051602081019091526000808252919250905b8651811015613882578360ff1687828151811061384957613849614b4e565b602002602001015160ff160361387a5787818151811061386b5761386b614b4e565b60200260200101519150613882565b60010161382a565b5089516040517f30bb3aac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416916330bb3aac916138db918d918d9087906004016157e3565b602060405180830381865afa1580156138f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391c919061547f565b6139269086615203565b9450505080600101905061379e565b505095945050505050565b6060824710156139d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ac9565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516139fb919061582e565b60006040518083038185875af1925050503d8060008114613a38576040519150601f19603f3d011682016040523d82523d6000602084013e613a3d565b606091505b5091509150613a4e8783838761431b565b979650505050505050565b6060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff861601613af457865115613ab657868484604051602001613aa293929190615840565b604051602081830303815290604052613aed565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050505b9650613bc3565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60ff861601613b8c57855115613b4e57858484604051602001613b3a93929190615840565b604051602081830303815290604052613b85565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050505b9550613bc3565b6040517f6780cfaf00000000000000000000000000000000000000000000000000000000815260ff86166004820152602401610ac9565b509495939450505050565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61ffff851601613cf45760228214613c35576040517f0dc652a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613c56613c4860226002868861566e565b613c5191615868565b6143bb565b6040517f0100000000000000000000000000000000000000000000000000000000000000602082018190527e11000000000000000000000000000000000000000000000000000000000000602183015260238201527fffffffffffffffffffffffffffffffff00000000000000000000000000000000608083901b16602482015290915060340160405160208183030381529060405291505061141a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe61ffff851601613e1557604282111580613d2f5750606282115b15613d66576040517fc0927c5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613d79613c4860226002868861566e565b90506000613d8e613c4860426022878961566e565b905060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbe8501613dc2866042818a61566e565b613dcb91615868565b60405160086020938403029190911c9250613dfc916001916011918391889183916031916002918b918b91016158a4565b604051602081830303815290604052935050505061141a565b6040517f4170513000000000000000000000000000000000000000000000000000000000815261ffff85166004820152602401610ac9565b600080805b8351821015613f2e576001909101906000613e6d8584613ff2565b905060028301925060028161ffff161015613eb7576040517f04eb6e0c00000000000000000000000000000000000000000000000000000000815260048101849052602401610ac9565b6000613ec38685613f72565b90508060ff1660ff03613f02576040517fd3d3d9bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160ff82161b8316613f1f5760019485019460ff82161b831792505b5061ffff169190910190613e52565b83518214613f6b576040517f04eb6e0c00000000000000000000000000000000000000000000000000000000815260048101839052602401610ac9565b5050919050565b6000613f7f826001615203565b83511015613fe9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f746f55696e74385f6f75744f66426f756e6473000000000000000000000000006044820152606401610ac9565b50016001015190565b6000613fff826002615203565b83511015614069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7431365f6f75744f66426f756e64730000000000000000000000006044820152606401610ac9565b50016002015190565b60608161408081601f615203565b10156140e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ac9565b6140f28284615203565b8451101561415c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610ac9565b60608215801561417b57604051915060008252602082016040526141e3565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141b457805183526020928301920161419c565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b8160ff1660ff03614229576040517fd3d3d9bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061423683600161574c565b905060005b8451811015611e6757600085828151811061425857614258614b4e565b602002602001015190508060ff168360ff16036142cd5786828151811061428157614281614b4e565b60200260200101518460405160200161429b9291906155e1565b6040516020818303038152906040528783815181106142bc576142bc614b4e565b602002602001018190525050611e67565b8060ff1660000361431257828683815181106142eb576142eb614b4e565b602002602001019060ff16908160ff1681525050838783815181106142bc576142bc614b4e565b5060010161423b565b606083156143b15782516000036143aa5773ffffffffffffffffffffffffffffffffffffffff85163b6143aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ac9565b508161168f565b61168f8383614461565b60006fffffffffffffffffffffffffffffffff82111561445d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203160448201527f32382062697473000000000000000000000000000000000000000000000000006064820152608401610ac9565b5090565b8151156144715781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac99190614a30565b82805482825590600052602060002090810192821561451f579160200282015b8281111561451f57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906144c5565b5061445d9291505b8082111561445d5760008155600101614527565b60006020828403121561454d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461141a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146116a857600080fd5b80356145aa8161457d565b919050565b63ffffffff811681146116a857600080fd5b80356145aa816145af565b600080604083850312156145df57600080fd5b82356145ea8161457d565b915060208301356145fa816145af565b809150509250929050565b815163ffffffff16815260208083015173ffffffffffffffffffffffffffffffffffffffff16908201526040810161066d565b6020810160038310614673577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561468e57600080fd5b83356146998161457d565b925060208401356146a98161457d565b929592945050506040919091013590565b60008083601f8401126146cc57600080fd5b50813567ffffffffffffffff8111156146e457600080fd5b6020830191508360208260051b85010111156124f257600080fd5b60008060006040848603121561471457600080fd5b833561471f8161457d565b9250602084013567ffffffffffffffff81111561473b57600080fd5b614747868287016146ba565b9497909650939450505050565b6000806020838503121561476757600080fd5b823567ffffffffffffffff81111561477e57600080fd5b61478a858286016146ba565b90969095509350505050565b60008151808452602080850194506020840160005b838110156147dd57815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016147ab565b509495945050505050565b67ffffffffffffffff815116825260ff602082015116602083015260ff604082015116604083015260ff60608201511660608301526000608082015160c0608085015261483860c0850182614796565b905060a083015184820360a08601526148518282614796565b95945050505050565b60208152600061141a60208301846147e8565b80151581146116a857600080fd5b80356145aa8161486d565b6000806000806060858703121561489c57600080fd5b843567ffffffffffffffff808211156148b457600080fd5b9086019060e082890312156148c857600080fd5b909450602086013590808211156148de57600080fd5b818701915087601f8301126148f257600080fd5b81358181111561490157600080fd5b88602082850101111561491357600080fd5b60208301955080945050505061492b6040860161487b565b905092959194509250565b60005b83811015614951578181015183820152602001614939565b50506000910152565b60008151808452614972816020860160208601614936565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b825181526020808401519082015260606040820152600061168f606083018461495a565b6000602082840312156149da57600080fd5b813561141a816145af565b6000806000606084860312156149fa57600080fd5b8335614a05816145af565b92506020840135614a158161457d565b91506040840135614a25816145af565b809150509250925092565b60208152600061141a602083018461495a565b60008060208385031215614a5657600080fd5b823567ffffffffffffffff80821115614a6e57600080fd5b818501915085601f830112614a8257600080fd5b813581811115614a9157600080fd5b866020606083028501011115614aa657600080fd5b60209290920196919550909350505050565b600060208284031215614aca57600080fd5b5035919050565b81518152602080830151908201526040810161066d565b600060208284031215614afa57600080fd5b813561141a8161457d565b60008060408385031215614b1857600080fd5b8235614b238161457d565b946020939093013593505050565b600060208284031215614b4357600080fd5b815161141a8161457d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614bb157600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614bf057600080fd5b83018035915067ffffffffffffffff821115614c0b57600080fd5b6020019150368190038213156124f257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715614c7257614c72614c20565b60405290565b60405160e0810167ffffffffffffffff81118282101715614c7257614c72614c20565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614ce257614ce2614c20565b604052919050565b600060408284031215614cfc57600080fd5b6040516040810181811067ffffffffffffffff82111715614d1f57614d1f614c20565b6040528235614d2d816145af565b81526020830135614d3d8161457d565b60208201529392505050565b803567ffffffffffffffff811681146145aa57600080fd5b803560ff811681146145aa57600080fd5b600082601f830112614d8357600080fd5b8135602067ffffffffffffffff821115614d9f57614d9f614c20565b8160051b614dae828201614c9b565b9283528481018201928281019087851115614dc857600080fd5b83870192505b84831015613a4e578235614de18161457d565b82529183019190830190614dce565b600060c08284031215614e0257600080fd5b614e0a614c4f565b9050614e1582614d49565b8152614e2360208301614d61565b6020820152614e3460408301614d61565b6040820152614e4560608301614d61565b6060820152608082013567ffffffffffffffff80821115614e6557600080fd5b614e7185838601614d72565b608084015260a0840135915080821115614e8a57600080fd5b50614e9784828501614d72565b60a08301525092915050565b600060208284031215614eb557600080fd5b813567ffffffffffffffff811115614ecc57600080fd5b61168f84828501614df0565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112614bb157600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41833603018112614bb157600080fd5b600060208284031215614f5257600080fd5b61141a82614d61565b600060208284031215614f6d57600080fd5b61141a82614d49565b600061066d3683614df0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614fb757600080fd5b830160208101925035905067ffffffffffffffff811115614fd757600080fd5b8060051b36038213156124f257600080fd5b8183526000602080850194508260005b858110156147dd57813561500c8161457d565b73ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614ff9565b60208082528181018390526000906040808401600586901b8501820187855b888110156151c6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08089850301855282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18c36030181126150b557600080fd5b8b0180356150c2816145af565b63ffffffff16855280880135368290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff410181126150ff57600080fd5b8589018890520167ffffffffffffffff61511882614d49565b1687860152615128888201614d61565b606060ff8083168289015261513e8a8501614d61565b92506080818416818a0152615154838601614d61565b935060a09250818416838a015261516d81860186614f82565b60c08b81015294509150615188905061010089018483614fe9565b92505061519781840184614f82565b93509050838783030160e08801526151b0828483614fe9565b978a019796505050928701925050600101615053565b509098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561066d5761066d6151d4565b8135615221816145af565b63ffffffff811690508154817fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000821617835560208401356152618161457d565b77ffffffffffffffffffffffffffffffffffffffff000000008160201b16837fffffffffffffffff0000000000000000000000000000000000000000000000008416171784555050505050565b6020808252818101839052600090604080840186845b8781101561532e5781356152d7816145af565b63ffffffff908116845282860135906152ef826145af565b1683860152818401356153018161457d565b73ffffffffffffffffffffffffffffffffffffffff168385015260609283019291909101906001016152c4565b5090979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815263ffffffff831660208201526080810161168f6040830184805163ffffffff16825260209081015173ffffffffffffffffffffffffffffffffffffffff16910152565b73ffffffffffffffffffffffffffffffffffffffff8416815263ffffffff8316602082015260606040820152600061485160608301846147e8565b60ff828116828216039081111561066d5761066d6151d4565b600060ff831680615425577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b8060ff84160491505092915050565b63ffffffff8516815273ffffffffffffffffffffffffffffffffffffffff84166020820152826040820152608060608201526000615475608083018461495a565b9695505050505050565b60006020828403121561549157600080fd5b5051919050565b600082601f8301126154a957600080fd5b813567ffffffffffffffff8111156154c3576154c3614c20565b6154f460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614c9b565b81815284602083860101111561550957600080fd5b816020850160208301376000918101602001919091529392505050565b600060e0823603121561553857600080fd5b615540614c78565b61554983614d49565b8152615557602084016145c1565b60208201526155686040840161459f565b6040820152615579606084016145c1565b60608201526080830135608082015260a083013560a082015260c083013567ffffffffffffffff8111156155ac57600080fd5b6155b836828601615498565b60c08301525092915050565b6000602082840312156155d657600080fd5b815161141a8161486d565b600083516155f3818460208801614936565b835190830190615607818360208801614936565b01949350505050565b6060815260006156236060830186614796565b602083820360208501526156378287614796565b84810360408601528551808252602080880194509091019060005b818110156151c657845183529383019391830191600101615652565b6000808585111561567e57600080fd5b8386111561568b57600080fd5b5050820193919092039150565b7fffff00000000000000000000000000000000000000000000000000000000000081358181169160028510156156d85780818660020360031b1b83161692505b505092915050565b7fff0000000000000000000000000000000000000000000000000000000000000081358181169160018510156156d85760019490940360031b84901b1690921692915050565b8281526000825161573e816020850160208701614936565b919091016020019392505050565b60ff818116838216019081111561066d5761066d6151d4565b6040815263ffffffff83511660408201526000602084015160a0606084015261579160e084018261495a565b90506040850151608084015267ffffffffffffffff60608601511660a084015273ffffffffffffffffffffffffffffffffffffffff60808601511660c08401528281036020840152614851818561495a565b63ffffffff8516815267ffffffffffffffff8416602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000615475608083018461495a565b60008251614bb1818460208701614936565b60008451615852818460208901614936565b8201838582376000930192835250909392505050565b8035602083101561066d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b60007fff00000000000000000000000000000000000000000000000000000000000000808c60f81b1683527fffff000000000000000000000000000000000000000000000000000000000000808c60f01b166001850152818b60f81b1660038501527fffffffffffffffffffffffffffffffff000000000000000000000000000000008a60801b166004850152818960f81b166014850152808860f01b16601585015250808660f81b16601784015250615985601883018560801b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000169052565b5060288101919091526048019897505050505050505056fea2646970667358221220364ab0e9d990eb52427657c0d4fcddf16a239e345810578b222d8a6ea656add664736f6c634300081600330000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b0000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000de0b6b3a7640000

    Deployed Bytecode

    0x6080604052600436106101845760003560e01c806361d027b3116100d6578063d15b0d491161007f578063f2fde38b11610059578063f2fde38b14610513578063faaebd2114610533578063fd9be5221461056e57600080fd5b8063d15b0d49146104a6578063d80e9bd9146104c6578063f0f44260146104f357600080fd5b80638da5cb5b116100b05780638da5cb5b1461042e5780639c33abf714610459578063c14c43491461048657600080fd5b806361d027b3146103a75780636750cd4c146103f9578063715018a61461041957600080fd5b806329460b0b1161013857806343ea4fa91161011257806343ea4fa9146102cb5780634d963200146102eb57806354fd4d501461037a57600080fd5b806329460b0b1461025057806339e3f938146102705780634389e58f1461029d57600080fd5b80631881d94d116101695780631881d94d146101f2578063200175f71461020e57806320efd7221461023057600080fd5b806301ffc9a714610190578063188183f4146101c557600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101b06101ab36600461453b565b61058e565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e03660046145cc565b610673565b6040516101bc9190614605565b3480156101fe57600080fd5b5060006040516101bc9190614638565b34801561021a57600080fd5b5061022e610229366004614679565b610780565b005b34801561023c57600080fd5b5061022e61024b3660046146ff565b61092d565b34801561025c57600080fd5b5061022e61026b366004614754565b610ae1565b34801561027c57600080fd5b5061029061028b3660046145cc565b610cc6565b6040516101bc919061485a565b3480156102a957600080fd5b506102bd6102b8366004614886565b610e67565b6040516101bc9291906149a4565b3480156102d757600080fd5b506102906102e63660046145cc565b610f61565b3480156102f757600080fd5b506103496103063660046145cc565b600460209081526000928352604080842090915290825290205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016101bc565b34801561038657600080fd5b506040805160038152600060208201526002918101919091526060016101bc565b3480156103b357600080fd5b506003546103d49073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561040557600080fd5b506101b06104143660046149c8565b61131b565b34801561042557600080fd5b5061022e611326565b34801561043a57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166103d4565b34801561046557600080fd5b506104796104743660046149e5565b61133a565b6040516101bc9190614a30565b34801561049257600080fd5b5061022e6104a1366004614a43565b611421565b3480156104b257600080fd5b5061022e6104c1366004614ab8565b611599565b3480156104d257600080fd5b506104e66104e1366004614886565b611627565b6040516101bc9190614ad1565b3480156104ff57600080fd5b5061022e61050e366004614ae8565b611697565b34801561051f57600080fd5b5061022e61052e366004614ae8565b6116ab565b34801561053f57600080fd5b5061056061054e366004614ae8565b60056020526000908152604090205481565b6040519081526020016101bc565b34801561057a57600080fd5b5061022e610589366004614b05565b61175f565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f97f0258400000000000000000000000000000000000000000000000000000000148061062157507fffffffff0000000000000000000000000000000000000000000000000000000082167fb6e9ace300000000000000000000000000000000000000000000000000000000145b8061066d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080518082019091526000808252602082015263ffffffff80831660008181527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8916845260048352818420948452939091528120805492939092169081900361070457825463ffffffff16610706565b805b63ffffffff1684528154640100000000900473ffffffffffffffffffffffffffffffffffffffff1680610758578354640100000000900473ffffffffffffffffffffffffffffffffffffffff1661075a565b805b73ffffffffffffffffffffffffffffffffffffffff166020860152509295945050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146107d1576040517f885762a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff1663e1758bd86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610853573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108779190614b31565b73ffffffffffffffffffffffffffffffffffffffff16036108c4576040517fe695d04400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108cf838383611859565b6040805173ffffffffffffffffffffffffffffffffffffffff8086168252841660208201529081018290527fe081464b7278501267de69fa85b7b9560b0ae05d5fbfaab9b1986c70356e2efe906060015b60405180910390a1505050565b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff16331461099c576040517f467409c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610adb57368383838181106109ba576109ba614b4e565b90506020028101906109cc9190614b7d565b90506109e36109de60208301836149c8565b6118cc565b60016109f560408301602084016149c8565b63ffffffff1603610a3557610a30610a1060208301836149c8565b86610a1e6040850185614bbb565b810190610a2b9190614cea565b611913565b610ad2565b6002610a4760408301602084016149c8565b63ffffffff1603610a8257610a30610a6260208301836149c8565b86610a706040850185614bbb565b810190610a7d9190614ea3565b6119c0565b610a9260408201602083016149c8565b6040517fba97c1fa00000000000000000000000000000000000000000000000000000000815263ffffffff90911660048201526024015b60405180910390fd5b5060010161099f565b50505050565b610ae9611a09565b60005b81811015610c885736838383818110610b0757610b07614b4e565b9050602002810190610b199190614ed8565b905060ff610b2a6020830183614f0c565b610b3b906040810190602001614f40565b60ff1603610b75576040517f83aa17da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ff610b846020830183614f0c565b610b95906060810190604001614f40565b60ff1603610bcf576040517f4221136600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff610be56020830183614f0c565b610bf3906020810190614f5b565b67ffffffffffffffff1603610c34576040517f503667ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c52610c446020830183614f0c565b610c4d90614f76565b611a8a565b610c7f6000610c6460208401846149c8565b610c716020850185614f0c565b610c7a90614f76565b611adb565b50600101610aec565b507faaf3aaa0c11056e86ac56eb653e25b005ca1a7d4dcd21ba24647f7ab63f3b5608282604051610cba929190615034565b60405180910390a15050565b6040805160c0810182526000808252602082018190529181018290526060808201929092526080810182905260a081019190915273ffffffffffffffffffffffffffffffffffffffff8316600090815260016020818152604080842063ffffffff87168552825292839020835160c081018552815467ffffffffffffffff8116825260ff680100000000000000008204811683860152690100000000000000000082048116838801526a01000000000000000000009091041660608201529281018054855181850281018501909652808652939491936080860193830182828015610de757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610dbc575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610e5657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e2b575b505050505081525050905092915050565b604080518082019091526000808252602082015260607f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff163314610eec576040517f467409c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610efa888888611e6f565b9092509050600080610f2c610f1560608c0160408d01614ae8565b610f2560808d0160608e016149c8565b858a611f3c565b9092509050610f3b8284615203565b604080518082019091529081526020810191909152945091925050505b94509492505050565b6040805160c0810182526000808252602080830182905282840182905260608084018390526080840181905260a084015263ffffffff85168083527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49825284832073ffffffffffffffffffffffffffffffffffffffff88168452600183528584209184529152929020805491929167ffffffffffffffff168061101157825467ffffffffffffffff168452611030565b67ffffffffffffffff818116146110305767ffffffffffffffff811684525b815468010000000000000000900460ff166110e657825468010000000000000000900460ff16156110e157826001018054806020026020016040519081016040528092919081815260200182805480156110c057602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611095575b50505050506080850152825468010000000000000000900460ff1660208501525b611184565b815468010000000000000000900460ff90811614611184578160010180548060200260200160405190810160405280929190818152602001828054801561116357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611138575b50505050506080850152815468010000000000000000900460ff1660208501525b81546901000000000000000000900460ff166112535782546901000000000000000000900460ff161561124e578260020180548060200260200160405190810160405280929190818152602001828054801561121657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111eb575b505050505060a0850152825460ff69010000000000000000008204811660408701526a01000000000000000000009091041660608501525b611309565b81546901000000000000000000900460ff9081161461130957816002018054806020026020016040519081016040528092919081815260200182805480156112d157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116112a6575b505050505060a0850152815460ff69010000000000000000008204811660408701526a01000000000000000000009091041660608501525b61131284611a8a565b50505092915050565b600061066d826120ca565b61132e611a09565b6113386000612131565b565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff831601611399576113738385610673565b6040516020016113839190614605565b604051602081830303815290604052905061141a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe63ffffffff8316016113e0576113d08385610f61565b604051602001611383919061485a565b6040517fba97c1fa00000000000000000000000000000000000000000000000000000000815263ffffffff83166004820152602401610ac9565b9392505050565b611429611a09565b60005b81811015611567573683838381811061144757611447614b4e565b60609081029290920192506000916114659150830160408401614ae8565b73ffffffffffffffffffffffffffffffffffffffff16036114b2576040517f20e9d05a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c260408201602083016149c8565b63ffffffff16600003611501576040517f49cfac4300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808052600460209081528201907f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec9061153c83856149c8565b63ffffffff168152602081019190915260400160002061155c8282615216565b50505060010161142c565b507f2b001e1c6683bf79cc52891bd7215b204c787d18134fc7f3d21b4f32a49e47de8282604051610cba9291906152ae565b6115a1611a09565b6002548111156115eb576002546040517f34084fb8000000000000000000000000000000000000000000000000000000008152610ac9918391600401918252602082015260400190565b60028190556040518181527f491ff913b5444f4136b0d4075f020cfe3a5f60de926ec0b091612401a22b7842906020015b60405180910390a150565b60408051808201909152600080825260208201526000806116786116516060890160408a01614ae8565b61166160808a0160608b016149c8565b61166e60c08b018b614bbb565b9050878a8a6121a6565b604080518082019091529182526020820152925050505b949350505050565b61169f611a09565b6116a8816122ac565b50565b6116b3611a09565b73ffffffffffffffffffffffffffffffffffffffff8116611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ac9565b6116a881612131565b6117688161231f565b60007f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff1663e1758bd86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f99190614b31565b9050611806818484612389565b6040805133815273ffffffffffffffffffffffffffffffffffffffff851660208201529081018390527f820b7fd51bf79c54350bab98400651b3314ff6e79b33528821871d94a666988390606001610920565b73ffffffffffffffffffffffffffffffffffffffff82166118a6576040517f6b7a931000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118c773ffffffffffffffffffffffffffffffffffffffff841683836123b9565b505050565b6118d5816120ca565b6116a8576040517ff0c10d0400000000000000000000000000000000000000000000000000000000815263ffffffff82166004820152602401610ac9565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260046020908152604080832063ffffffff8089168552908352928190208551815493870151909516640100000000027fffffffffffffffff0000000000000000000000000000000000000000000000009093169490931693909317179055517f779cb2dd9d2bb1be1737d05435d744facbfb84a2a4912e21379d39beddcdc805906109209084908690859061533b565b6119cb828483611adb565b6119d58284610f61565b507f82118522aa536ac0e96cc5c689407ae42b89d592aa133890a01f1509842f508182848360405161092093929190615397565b60005473ffffffffffffffffffffffffffffffffffffffff163314611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b602081015160ff16158015611aa45750606081015160ff16155b156116a8576040517fce2c375100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015160ff9081161480611af65750602081015160ff16155b15611b3d5760808101515115611b38576040517f83aa17da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bbc565b806020015160ff16816080015151141580611b7857506002611b61600160ff6153d2565b611b6b91906153eb565b60ff16816020015160ff16115b15611baf576040517f83aa17da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bbc8160800151612446565b604081015160ff9081161480611bd75750604081015160ff16155b15611c5d5760a08101515115611c19576040517f4221136600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015160ff1615611c58576040517f38682fa900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d34565b806040015160ff168160a0015151141580611c9857506002611c81600160ff6153d2565b611c8b91906153eb565b60ff16816040015160ff16115b15611ccf576040517f4221136600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015160ff161580611cf05750806040015160ff16816060015160ff16115b15611d27576040517f38682fa900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d348160a00151612446565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020818152604080842063ffffffff87168552825292839020845181548684015195870151606088015167ffffffffffffffff9093167fffffffffffffffffffffffffffffffffffffffffffffff000000000000000000909216919091176801000000000000000060ff97881602177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000918716919091027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16176a0100000000000000000000959091169490940293909317835560808401518051859493611e4b939085019201906144a5565b5060a08201518051611e679160028401916020909101906144a5565b505050505050565b60606000806000611e8086866124e0565b90925090506000611eaa611e9a60608a0160408b01614ae8565b6101e060808b0160608c016149c8565b90506000611ebb60c08a018a614bbb565b90509050611ed381836000015163ffffffff166124f9565b6020820151611f0390611eec60808c0160608d016149c8565b611efc60608d0160408e01614ae8565b8488612541565b611f0d9086615203565b9450600080611f1c8b8661267a565b9092509050611f2b8288615203565b909b909a5098505050505050505050565b600354600090819073ffffffffffffffffffffffffffffffffffffffff1615610f585760405173ffffffffffffffffffffffffffffffffffffffff8716602482015263ffffffff8616604482015260648101859052831515608482015260009060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd51c54860000000000000000000000000000000000000000000000000000000017905260035491925060009182916120669173ffffffffffffffffffffffffffffffffffffffff16907f0000000000000000000000000000000000000000000000000000000000030d409084908761269d565b915091506120768787848461274e565b909550935084156120be5760035473ffffffffffffffffffffffffffffffffffffffff16600090815260056020526040812080548792906120b8908490615203565b90915550505b50505094509492505050565b63ffffffff811660009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4960205260408120805468010000000000000000900460ff1615158061141a5750546a0100000000000000000000900460ff16151592915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000806121b686866124e0565b9150915060006121c78b8b846127c9565b905060006121d58c8c610673565b90506121eb8a826000015163ffffffff166124f9565b806020015173ffffffffffffffffffffffffffffffffffffffff1663709eb6648c8e8d886040518563ffffffff1660e01b815260040161222e9493929190615434565b602060405180830381865afa15801561224b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226f919061547f565b6122799083615203565b915060008061228a8e8e868e6127d6565b90925090506122998285615203565b9e909d509b505050505050505050505050565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f9060200161161c565b3360009081526005602052604090205480821115612373576040517f34084fb80000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610ac9565b3360009081526005602052604090209190039055565b73ffffffffffffffffffffffffffffffffffffffff83166123ae576118c7828261291a565b6118c7838383611859565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526118c7908490612a20565b6000805b82518110156118c757600083828151811061246757612467614b4e565b602002602001015190508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16116124d6576040517f447516e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b915060010161244a565b6060806124ed8484612b2f565b915091505b9250929050565b8082111561253d576040517fc667af3e0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610ac9565b5050565b6040517f717e8a4200000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff87169063717e8a429061259c908890889088908890600401615434565b6020604051808303816000875af11580156125bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125df919061547f565b905080156126225773ffffffffffffffffffffffffffffffffffffffff86166000908152600560205260408120805483929061261c908490615203565b90915550505b6040805173ffffffffffffffffffffffffffffffffffffffff88168152602081018390527f61ed099e74a97a1d7f8bb0952a88ca8b7b8ebd00c126ea04671f92a81213318a910160405180910390a195945050505050565b60006060612692600561268c86615526565b85612c1c565b909590945092505050565b60006060863b8083036126c457604080516000808252602082019092529250925050612744565b60008060008761ffff1667ffffffffffffffff8111156126e6576126e6614c20565b6040519080825280601f01601f191660200182016040528015612710576020820181803683370190505b509050600080885160208a018c8f8ff191503d925087831115612731578792505b828152826000602083013e909450925050505b9550959350505050565b60008083158061275f575082516020115b1561276f57506000905080610f58565b600083806020019051810190612785919061547f565b90508515612795578091506127bf565b600060025488116127a8576002546127aa565b875b90508082116127b957816127bb565b805b9350505b5094509492505050565b600061168f848484612d78565b600354600090819073ffffffffffffffffffffffffffffffffffffffff1615610f585760405173ffffffffffffffffffffffffffffffffffffffff8716602482015263ffffffff8616604482015260648101859052831515608482015260009060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd42442210000000000000000000000000000000000000000000000000000000017905260035491925060009182916128fe9173ffffffffffffffffffffffffffffffffffffffff16907f0000000000000000000000000000000000000000000000000000000000030d409086612df2565b9150915061290e8787848461274e565b94509450505050610f58565b73ffffffffffffffffffffffffffffffffffffffff8216612967576040517f6b7a931000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146129c1576040519150601f19603f3d011682016040523d82523d6000602084013e6129c6565b606091505b50509050806118c7576040517f465bc83400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101839052604401610ac9565b6000612a82826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e9f9092919063ffffffff16565b9050805160001480612aa3575080806020019051810190612aa391906155c4565b6118c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ac9565b606080600080612b3f8686612eae565b915091508051600003612b9757604080516000808252602082019092528391612b8b565b604080518082019091526000815260606020820152815260200190600190039081612b635790505b509350935050506124f2565b604080516001808252818301909252600091816020015b604080518082019091526000815260606020820152815260200190600190039081612bae5790505090506040518060400160405280600260ff1681526020018381525081600081518110612c0457612c04614b4e565b60209081029190910101529196919550909350505050565b600060606000612c2b856130ef565b90506000612c38866131d5565b805160208201206060880151604089015192935090916000612c5a8284610f61565b905060008951600014612c8b5789600081518110612c7a57612c7a614b4e565b602002602001015160200151612c9c565b604051806020016040528060008152505b90506060612cfc8d846040518060a001604052808963ffffffff1681526020018c81526020018a8152602001876000015167ffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff16815250856131f2565b604051919b509150612d1490899089906020016155e1565b60405160208183030381529060405298507f07ea52d82345d6e838192107d8fd7123d9c2ec8e916cd0aad13fd2b60db2464483608001518460a0015183604051612d6093929190615610565b60405180910390a15050505050505050935093915050565b600080612d858585610f61565b905060008351600014612db65783600081518110612da557612da5614b4e565b602002602001015160200151612dc7565b604051806020016040528060008152505b9050600080612dd5836134de565b91509150612de684888a8585613782565b98975050505050505050565b60006060853b808303612e1957604080516000808252602082019092529250925050610f58565b60008060008761ffff1667ffffffffffffffff811115612e3b57612e3b614c20565b6040519080825280601f01601f191660200182016040528015612e65576020820181803683370190505b509050600080885160208a018d8dfa91503d925087831115612e85578792505b828152826000602083013e90999098509650505050505050565b606061168f8484600085613940565b6060806002831015612eef576040517f6592671c00000000000000000000000000000000000000000000000000000000815260006004820152602401610ac9565b6000612efe600282868861566e565b612f0791615698565b60f01c905060027ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd82016130d8578060005b86831015613064576000612f5260018501858a8c61566e565b612f5b916156e0565b60f81c90506000819003612f9e576040517f6780cfaf00000000000000000000000000000000000000000000000000000000815260006004820152602401610ac9565b8160ff16600003612fb157809150612fee565b8160ff168160ff1614612fee57366000612fcd86868c8e61566e565b91509150612fde8989868585613a59565b9099509750859450919250829150505b600184019360009061300590600301868b8d61566e565b61300e91615698565b60f01c90506000819003613051576040517f6592671c00000000000000000000000000000000000000000000000000000000815260048101869052602401610ac9565b8060020161ffff16850194505050612f39565b8287146130a0576040517f6592671c00000000000000000000000000000000000000000000000000000000815260048101849052602401610ac9565b60028711156130d1573660006130b885858b8d61566e565b915091506130c98888858585613a59565b909850965050505b50506130e6565b6130e3828787613bce565b93505b50509250929050565b8051602080830151604080850151606080870151608088015193517f01000000000000000000000000000000000000000000000000000000000000009681019690965260c09690961b7fffffffffffffffff00000000000000000000000000000000000000000000000016602186015260e093841b7fffffffff00000000000000000000000000000000000000000000000000000000908116602987015273ffffffffffffffffffffffffffffffffffffffff909216602d8601529490921b909116604d83015260518201526071015b6040516020818303038152906040529050919050565b60608160a001518260c001516040516020016131bf929190615726565b60006060600080613202856134de565b9150915060008760400151886020015161321c919061574c565b90508060ff1667ffffffffffffffff81111561323a5761323a614c20565b604051908082528060200260200182016040528015613263578160200160208202803683370190505b50935060005b8160ff168160ff1610156134d1576000896020015160ff168260ff16106132be5760a08a015160208b015161329e90846153d2565b60ff16815181106132b1576132b1614b4e565b60200260200101516132e0565b89608001518260ff16815181106132d7576132d7614b4e565b60200260200101515b60408051602081019091526000808252919250905b855181101561334d578360ff1686828151811061331457613314614b4e565b602002602001015160ff16036133455786818151811061333657613336614b4e565b6020026020010151915061334d565b6001016132f5565b506040517f95d376d700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906395d376d7906133a2908d908590600401615765565b6020604051808303816000875af11580156133c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e5919061547f565b878460ff16815181106133fa576133fa614b4e565b6020026020010181815250506000878460ff168151811061341d5761341d614b4e565b602002602001015111156134c757868360ff168151811061344057613440614b4e565b60200260200101518c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134959190615203565b92505081905550868360ff16815181106134b1576134b1614b4e565b6020026020010151886134c49190615203565b97505b5050600101613269565b5050505094509492505050565b60608082516000036134ef57915091565b60006134fa84613e4d565b90508060ff166001036135ac5760408051600180825281830190925290816020015b606081526020019060019003908161351c579050509250838360008151811061354757613547614b4e565b60209081029190910101526040805160018082528183019092529081602001602082028036833701905050915061357f846003613f72565b8260008151811061359257613592614b4e565b602002602001019060ff16908160ff168152505050915091565b8060ff1667ffffffffffffffff8111156135c8576135c8614c20565b6040519080825280602002602001820160405280156135f1578160200160208202803683370190505b5091508060ff1667ffffffffffffffff81111561361057613610614c20565b60405190808252806020026020018201604052801561364357816020015b606081526020019060019003908161362e5790505b50925060008060ff5b86518310156136f75760019092019160006136678885613ff2565b600294909401939050600061367c8986613f72565b90508260ff1660ff03613691578092506136e8565b8260ff168160ff16146136e8577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8486030160006136d08b8784614072565b90506136de8a8a87846141ec565b5093909301929150815b5061ffff16929092019161364c565b8183036000613707898584614072565b9050613715888885846141ec565b60005b8660ff168160ff16101561377657878160ff168151811061373b5761373b614b4e565b6020908102919091010180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160ff169052600101613718565b50505050505050915091565b60008086604001518760200151613799919061574c565b905060005b8160ff168160ff161015613935576000886020015160ff168260ff16106137f35760a089015160208a01516137d390846153d2565b60ff16815181106137e6576137e6614b4e565b6020026020010151613815565b88608001518260ff168151811061380c5761380c614b4e565b60200260200101515b60408051602081019091526000808252919250905b8651811015613882578360ff1687828151811061384957613849614b4e565b602002602001015160ff160361387a5787818151811061386b5761386b614b4e565b60200260200101519150613882565b60010161382a565b5089516040517f30bb3aac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416916330bb3aac916138db918d918d9087906004016157e3565b602060405180830381865afa1580156138f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391c919061547f565b6139269086615203565b9450505080600101905061379e565b505095945050505050565b6060824710156139d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ac9565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516139fb919061582e565b60006040518083038185875af1925050503d8060008114613a38576040519150601f19603f3d011682016040523d82523d6000602084013e613a3d565b606091505b5091509150613a4e8783838761431b565b979650505050505050565b6060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff861601613af457865115613ab657868484604051602001613aa293929190615840565b604051602081830303815290604052613aed565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050505b9650613bc3565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60ff861601613b8c57855115613b4e57858484604051602001613b3a93929190615840565b604051602081830303815290604052613b85565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050505b9550613bc3565b6040517f6780cfaf00000000000000000000000000000000000000000000000000000000815260ff86166004820152602401610ac9565b509495939450505050565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61ffff851601613cf45760228214613c35576040517f0dc652a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613c56613c4860226002868861566e565b613c5191615868565b6143bb565b6040517f0100000000000000000000000000000000000000000000000000000000000000602082018190527e11000000000000000000000000000000000000000000000000000000000000602183015260238201527fffffffffffffffffffffffffffffffff00000000000000000000000000000000608083901b16602482015290915060340160405160208183030381529060405291505061141a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe61ffff851601613e1557604282111580613d2f5750606282115b15613d66576040517fc0927c5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613d79613c4860226002868861566e565b90506000613d8e613c4860426022878961566e565b905060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbe8501613dc2866042818a61566e565b613dcb91615868565b60405160086020938403029190911c9250613dfc916001916011918391889183916031916002918b918b91016158a4565b604051602081830303815290604052935050505061141a565b6040517f4170513000000000000000000000000000000000000000000000000000000000815261ffff85166004820152602401610ac9565b600080805b8351821015613f2e576001909101906000613e6d8584613ff2565b905060028301925060028161ffff161015613eb7576040517f04eb6e0c00000000000000000000000000000000000000000000000000000000815260048101849052602401610ac9565b6000613ec38685613f72565b90508060ff1660ff03613f02576040517fd3d3d9bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160ff82161b8316613f1f5760019485019460ff82161b831792505b5061ffff169190910190613e52565b83518214613f6b576040517f04eb6e0c00000000000000000000000000000000000000000000000000000000815260048101839052602401610ac9565b5050919050565b6000613f7f826001615203565b83511015613fe9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f746f55696e74385f6f75744f66426f756e6473000000000000000000000000006044820152606401610ac9565b50016001015190565b6000613fff826002615203565b83511015614069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7431365f6f75744f66426f756e64730000000000000000000000006044820152606401610ac9565b50016002015190565b60608161408081601f615203565b10156140e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ac9565b6140f28284615203565b8451101561415c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610ac9565b60608215801561417b57604051915060008252602082016040526141e3565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141b457805183526020928301920161419c565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b8160ff1660ff03614229576040517fd3d3d9bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061423683600161574c565b905060005b8451811015611e6757600085828151811061425857614258614b4e565b602002602001015190508060ff168360ff16036142cd5786828151811061428157614281614b4e565b60200260200101518460405160200161429b9291906155e1565b6040516020818303038152906040528783815181106142bc576142bc614b4e565b602002602001018190525050611e67565b8060ff1660000361431257828683815181106142eb576142eb614b4e565b602002602001019060ff16908160ff1681525050838783815181106142bc576142bc614b4e565b5060010161423b565b606083156143b15782516000036143aa5773ffffffffffffffffffffffffffffffffffffffff85163b6143aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ac9565b508161168f565b61168f8383614461565b60006fffffffffffffffffffffffffffffffff82111561445d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203160448201527f32382062697473000000000000000000000000000000000000000000000000006064820152608401610ac9565b5090565b8151156144715781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac99190614a30565b82805482825590600052602060002090810192821561451f579160200282015b8281111561451f57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906144c5565b5061445d9291505b8082111561445d5760008155600101614527565b60006020828403121561454d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461141a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146116a857600080fd5b80356145aa8161457d565b919050565b63ffffffff811681146116a857600080fd5b80356145aa816145af565b600080604083850312156145df57600080fd5b82356145ea8161457d565b915060208301356145fa816145af565b809150509250929050565b815163ffffffff16815260208083015173ffffffffffffffffffffffffffffffffffffffff16908201526040810161066d565b6020810160038310614673577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561468e57600080fd5b83356146998161457d565b925060208401356146a98161457d565b929592945050506040919091013590565b60008083601f8401126146cc57600080fd5b50813567ffffffffffffffff8111156146e457600080fd5b6020830191508360208260051b85010111156124f257600080fd5b60008060006040848603121561471457600080fd5b833561471f8161457d565b9250602084013567ffffffffffffffff81111561473b57600080fd5b614747868287016146ba565b9497909650939450505050565b6000806020838503121561476757600080fd5b823567ffffffffffffffff81111561477e57600080fd5b61478a858286016146ba565b90969095509350505050565b60008151808452602080850194506020840160005b838110156147dd57815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016147ab565b509495945050505050565b67ffffffffffffffff815116825260ff602082015116602083015260ff604082015116604083015260ff60608201511660608301526000608082015160c0608085015261483860c0850182614796565b905060a083015184820360a08601526148518282614796565b95945050505050565b60208152600061141a60208301846147e8565b80151581146116a857600080fd5b80356145aa8161486d565b6000806000806060858703121561489c57600080fd5b843567ffffffffffffffff808211156148b457600080fd5b9086019060e082890312156148c857600080fd5b909450602086013590808211156148de57600080fd5b818701915087601f8301126148f257600080fd5b81358181111561490157600080fd5b88602082850101111561491357600080fd5b60208301955080945050505061492b6040860161487b565b905092959194509250565b60005b83811015614951578181015183820152602001614939565b50506000910152565b60008151808452614972816020860160208601614936565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b825181526020808401519082015260606040820152600061168f606083018461495a565b6000602082840312156149da57600080fd5b813561141a816145af565b6000806000606084860312156149fa57600080fd5b8335614a05816145af565b92506020840135614a158161457d565b91506040840135614a25816145af565b809150509250925092565b60208152600061141a602083018461495a565b60008060208385031215614a5657600080fd5b823567ffffffffffffffff80821115614a6e57600080fd5b818501915085601f830112614a8257600080fd5b813581811115614a9157600080fd5b866020606083028501011115614aa657600080fd5b60209290920196919550909350505050565b600060208284031215614aca57600080fd5b5035919050565b81518152602080830151908201526040810161066d565b600060208284031215614afa57600080fd5b813561141a8161457d565b60008060408385031215614b1857600080fd5b8235614b238161457d565b946020939093013593505050565b600060208284031215614b4357600080fd5b815161141a8161457d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614bb157600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614bf057600080fd5b83018035915067ffffffffffffffff821115614c0b57600080fd5b6020019150368190038213156124f257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715614c7257614c72614c20565b60405290565b60405160e0810167ffffffffffffffff81118282101715614c7257614c72614c20565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614ce257614ce2614c20565b604052919050565b600060408284031215614cfc57600080fd5b6040516040810181811067ffffffffffffffff82111715614d1f57614d1f614c20565b6040528235614d2d816145af565b81526020830135614d3d8161457d565b60208201529392505050565b803567ffffffffffffffff811681146145aa57600080fd5b803560ff811681146145aa57600080fd5b600082601f830112614d8357600080fd5b8135602067ffffffffffffffff821115614d9f57614d9f614c20565b8160051b614dae828201614c9b565b9283528481018201928281019087851115614dc857600080fd5b83870192505b84831015613a4e578235614de18161457d565b82529183019190830190614dce565b600060c08284031215614e0257600080fd5b614e0a614c4f565b9050614e1582614d49565b8152614e2360208301614d61565b6020820152614e3460408301614d61565b6040820152614e4560608301614d61565b6060820152608082013567ffffffffffffffff80821115614e6557600080fd5b614e7185838601614d72565b608084015260a0840135915080821115614e8a57600080fd5b50614e9784828501614d72565b60a08301525092915050565b600060208284031215614eb557600080fd5b813567ffffffffffffffff811115614ecc57600080fd5b61168f84828501614df0565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112614bb157600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41833603018112614bb157600080fd5b600060208284031215614f5257600080fd5b61141a82614d61565b600060208284031215614f6d57600080fd5b61141a82614d49565b600061066d3683614df0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614fb757600080fd5b830160208101925035905067ffffffffffffffff811115614fd757600080fd5b8060051b36038213156124f257600080fd5b8183526000602080850194508260005b858110156147dd57813561500c8161457d565b73ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614ff9565b60208082528181018390526000906040808401600586901b8501820187855b888110156151c6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08089850301855282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18c36030181126150b557600080fd5b8b0180356150c2816145af565b63ffffffff16855280880135368290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff410181126150ff57600080fd5b8589018890520167ffffffffffffffff61511882614d49565b1687860152615128888201614d61565b606060ff8083168289015261513e8a8501614d61565b92506080818416818a0152615154838601614d61565b935060a09250818416838a015261516d81860186614f82565b60c08b81015294509150615188905061010089018483614fe9565b92505061519781840184614f82565b93509050838783030160e08801526151b0828483614fe9565b978a019796505050928701925050600101615053565b509098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561066d5761066d6151d4565b8135615221816145af565b63ffffffff811690508154817fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000821617835560208401356152618161457d565b77ffffffffffffffffffffffffffffffffffffffff000000008160201b16837fffffffffffffffff0000000000000000000000000000000000000000000000008416171784555050505050565b6020808252818101839052600090604080840186845b8781101561532e5781356152d7816145af565b63ffffffff908116845282860135906152ef826145af565b1683860152818401356153018161457d565b73ffffffffffffffffffffffffffffffffffffffff168385015260609283019291909101906001016152c4565b5090979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815263ffffffff831660208201526080810161168f6040830184805163ffffffff16825260209081015173ffffffffffffffffffffffffffffffffffffffff16910152565b73ffffffffffffffffffffffffffffffffffffffff8416815263ffffffff8316602082015260606040820152600061485160608301846147e8565b60ff828116828216039081111561066d5761066d6151d4565b600060ff831680615425577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b8060ff84160491505092915050565b63ffffffff8516815273ffffffffffffffffffffffffffffffffffffffff84166020820152826040820152608060608201526000615475608083018461495a565b9695505050505050565b60006020828403121561549157600080fd5b5051919050565b600082601f8301126154a957600080fd5b813567ffffffffffffffff8111156154c3576154c3614c20565b6154f460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614c9b565b81815284602083860101111561550957600080fd5b816020850160208301376000918101602001919091529392505050565b600060e0823603121561553857600080fd5b615540614c78565b61554983614d49565b8152615557602084016145c1565b60208201526155686040840161459f565b6040820152615579606084016145c1565b60608201526080830135608082015260a083013560a082015260c083013567ffffffffffffffff8111156155ac57600080fd5b6155b836828601615498565b60c08301525092915050565b6000602082840312156155d657600080fd5b815161141a8161486d565b600083516155f3818460208801614936565b835190830190615607818360208801614936565b01949350505050565b6060815260006156236060830186614796565b602083820360208501526156378287614796565b84810360408601528551808252602080880194509091019060005b818110156151c657845183529383019391830191600101615652565b6000808585111561567e57600080fd5b8386111561568b57600080fd5b5050820193919092039150565b7fffff00000000000000000000000000000000000000000000000000000000000081358181169160028510156156d85780818660020360031b1b83161692505b505092915050565b7fff0000000000000000000000000000000000000000000000000000000000000081358181169160018510156156d85760019490940360031b84901b1690921692915050565b8281526000825161573e816020850160208701614936565b919091016020019392505050565b60ff818116838216019081111561066d5761066d6151d4565b6040815263ffffffff83511660408201526000602084015160a0606084015261579160e084018261495a565b90506040850151608084015267ffffffffffffffff60608601511660a084015273ffffffffffffffffffffffffffffffffffffffff60808601511660c08401528281036020840152614851818561495a565b63ffffffff8516815267ffffffffffffffff8416602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000615475608083018461495a565b60008251614bb1818460208701614936565b60008451615852818460208901614936565b8201838582376000930192835250909392505050565b8035602083101561066d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b60007fff00000000000000000000000000000000000000000000000000000000000000808c60f81b1683527fffff000000000000000000000000000000000000000000000000000000000000808c60f01b166001850152818b60f81b1660038501527fffffffffffffffffffffffffffffffff000000000000000000000000000000008a60801b166004850152818960f81b166014850152808860f01b16601585015250808660f81b16601784015250615985601883018560801b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000169052565b5060288101919091526048019897505050505050505056fea2646970667358221220364ab0e9d990eb52427657c0d4fcddf16a239e345810578b222d8a6ea656add664736f6c63430008160033

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

    0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b0000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000de0b6b3a7640000

    -----Decoded View---------------
    Arg [0] : _endpoint (address): 0x6F475642a6e85809B1c36Fa62763669b1b48DD5B
    Arg [1] : _treasuryGasLimit (uint256): 200000
    Arg [2] : _treasuryGasForFeeCap (uint256): 1000000000000000000

    -----Encoded View---------------
    3 Constructor Arguments found :
    Arg [0] : 0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b
    Arg [1] : 0000000000000000000000000000000000000000000000000000000000030d40
    Arg [2] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000


    Block Age Transaction Gas Used Reward
    view all blocks ##produced##

    Block Age Uncle Number Difficulty Gas Used Reward
    View All Uncles
    Loading...
    Loading
    Loading...
    Loading

    Validator Index Block Age Amount
    View All Withdrawals

    Transaction Hash Block Age Value Eth2 PubKey Valid
    View All Deposits
    Loading...
    Loading
    Loading...
    Loading
    [ Download: CSV Export  ]

    A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.