ETH Price: $2,501.36 (-3.36%)

Token

Eidon (EIDON)
 

Overview

Max Total Supply

21,000,000 EIDON

Holders

147

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
diddychangedmylife.eth
Balance
78,750 EIDON

Value
$0.00
0x0001de82c696b6b18f0a401de0463ebb3c631111
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EIDON

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-07-30
*/

/*

Web: https://eidon.io

X: https://x.com/EidonAI_

Telegram: https://t.me/EidonAI

*/



pragma solidity >=0.5.0;

interface EidonReceiverV2 {
    /**
     * @dev Called by the OFT contract when tokens are received from source chain.
     * @param _srcChainId The chain id of the source chain.
     * @param _srcAddress The address of the OFT token contract on the source chain.
     * @param _nonce The nonce of the transaction on the source chain.
     * @param _from The address of the account who calls the sendAndCall() on the source chain.
     * @param _amount The amount of tokens to transfer.
     * @param _payload Additional data with no specified format.
     */
    function onOFTReceived(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes32 _from, uint _amount, bytes calldata _payload) external;
}

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


// 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);
}

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: contracts/LayerZero/token/oft/v2/interfaces/ICommonOFT.sol



pragma solidity >=0.5.0;


/**
 * @dev Interface of the Eidon core standard
 */
interface ICommonOFT is IERC165 {

    struct LzCallParams {
        address payable refundAddress;
        address zroPaymentAddress;
        bytes adapterParams;
    }

    /**
     * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`)
     * _dstChainId - L0 defined chain id to send tokens too
     * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain
     * _amount - amount of the tokens to transfer
     * _useZro - indicates to use zro to pay L0 fees
     * _adapterParam - flexible bytes array to indicate messaging adapter services in L0
     */
    function estimateSendFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);

    function estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);

    /**
     * @dev returns the circulating amount of tokens on current chain
     */
    function circulatingSupply() external view returns (uint);

    /**
     * @dev returns the address of the ERC20 token
     */
    function token() external view returns (address);
}

// File: contracts/LayerZero/token/oft/v2/interfaces/EidonV2.sol



pragma solidity >=0.5.0;


/**
 * @dev Interface of the Eidon core standard
 */
interface EidonV2 is ICommonOFT {

    /**
     * @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from`
     * `_from` the owner of token
     * `_dstChainId` the destination chain identifier
     * `_toAddress` can be any size depending on the `dstChainId`.
     * `_amount` the quantity of tokens in wei
     * `_refundAddress` the address LayerZero refunds if too much message fee is sent
     * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token)
     * `_adapterParams` is a flexible bytes array to indicate messaging adapter services
     */
    function sendFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, LzCallParams calldata _callParams) external payable;

    function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) external payable;
}

// File: contracts/LayerZero/libraries/ExcessivelySafeCall.sol


pragma solidity >=0.7.6;

library ExcessivelySafeCall {
    uint constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;

    /// @notice Use when you _really_ really _really_ don't trust the called
    /// contract. This prevents the called contract from causing reversion of
    /// the caller in as many ways as we can.
    /// @dev The main difference between this and a solidity low-level call is
    /// that we limit the number of bytes that the callee can cause to be
    /// copied to caller memory. This prevents stupid things like malicious
    /// contracts returning 10,000,000 bytes causing a local OOG when copying
    /// to memory.
    /// @param _target The address to call
    /// @param _gas The amount of gas to forward to the remote contract
    /// @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 excessivelySafeCall(
        address _target,
        uint _gas,
        uint16 _maxCopy,
        bytes memory _calldata
    ) internal returns (bool, bytes memory) {
        // set up for assembly call
        uint _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        // dispatch message to recipient
        // by assembly calling "handle" function
        // we call via assembly to avoid memcopying a very large returndata
        // returned by a malicious contract
        assembly {
            _success := call(
                _gas, // gas
                _target, // recipient
                0, // ether value
                add(_calldata, 0x20), // inloc
                mload(_calldata), // inlen
                0, // outloc
                0 // outlen
            )
            // limit our copy to 256 bytes
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) {
                _toCopy := _maxCopy
            }
            // Store the length of the copied bytes
            mstore(_returnData, _toCopy)
            // copy the bytes from returndata[0:_toCopy]
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }

    /// @notice Use when you _really_ really _really_ don't trust the called
    /// contract. This prevents the called contract from causing reversion of
    /// the caller in as many ways as we can.
    /// @dev The main difference between this and a solidity low-level call is
    /// that we limit the number of bytes that the callee can cause to be
    /// copied to caller memory. This prevents stupid things like malicious
    /// contracts returning 10,000,000 bytes causing a local OOG when copying
    /// to memory.
    /// @param _target The address to call
    /// @param _gas The amount of gas to forward to the remote contract
    /// @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 excessivelySafeStaticCall(
        address _target,
        uint _gas,
        uint16 _maxCopy,
        bytes memory _calldata
    ) internal view returns (bool, bytes memory) {
        // set up for assembly call
        uint _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        // dispatch message to recipient
        // by assembly calling "handle" function
        // we call via assembly to avoid memcopying a very large returndata
        // returned by a malicious contract
        assembly {
            _success := staticcall(
                _gas, // gas
                _target, // recipient
                add(_calldata, 0x20), // inloc
                mload(_calldata), // inlen
                0, // outloc
                0 // outlen
            )
            // limit our copy to 256 bytes
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) {
                _toCopy := _maxCopy
            }
            // Store the length of the copied bytes
            mstore(_returnData, _toCopy)
            // copy the bytes from returndata[0:_toCopy]
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }

    /**
     * @notice Swaps function selectors in encoded contract calls
     * @dev Allows reuse of encoded calldata for functions with identical
     * argument types but different names. It simply swaps out the first 4 bytes
     * for the new selector. This function modifies memory in place, and should
     * only be used with caution.
     * @param _newSelector The new 4-byte selector
     * @param _buf The encoded contract args
     */
    function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure {
        require(_buf.length >= 4);
        uint _mask = LOW_28_MASK;
        assembly {
            // load the first word of
            let _word := mload(add(_buf, 0x20))
            // mask out the top 4 bytes
            // /x
            _word := and(_word, _mask)
            _word := or(_newSelector, _word)
            mstore(add(_buf, 0x20), _word)
        }
    }
}

// File: contracts/LayerZero/libraries/BytesLib.sol


/*
 * @title Solidity Bytes Arrays Utils
 * @author Gonçalo Sá <[email protected]>
 *
 * @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)

            // Store the length of the first bytes array at the beginning of
            // the memory for tempBytes.
            let length := mload(_preBytes)
            mstore(tempBytes, length)

            // Maintain a memory counter for the current write location in the
            // temp bytes array by adding the 32 bytes for the array length to
            // the starting location.
            let mc := add(tempBytes, 0x20)
            // Stop copying when the memory counter reaches the length of the
            // first bytes array.
            let end := add(mc, length)

            for {
                // Initialize a copy counter to the start of the _preBytes data,
                // 32 bytes into its memory.
                let cc := add(_preBytes, 0x20)
            } lt(mc, end) {
                // Increase both counters by 32 bytes each iteration.
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                // Write the _preBytes data into the tempBytes memory 32 bytes
                // at a time.
                mstore(mc, mload(cc))
            }

            // Add the length of _postBytes to the current length of tempBytes
            // and store it as the new length in the first 32 bytes of the
            // tempBytes memory.
            length := mload(_postBytes)
            mstore(tempBytes, add(length, mload(tempBytes)))

            // Move the memory counter back from a multiple of 0x20 to the
            // actual end of the _preBytes data.
            mc := end
            // Stop copying when the memory counter reaches the new combined
            // length of the arrays.
            end := add(mc, length)

            for {
                let cc := add(_postBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            // Update the free-memory pointer by padding our last write location
            // to 32 bytes: add 31 bytes to the end of tempBytes to move to the
            // next 32 byte block, then round down to the nearest multiple of
            // 32. If the sum of the length of the two arrays is zero then add
            // one before rounding down to leave a blank 32 bytes (the length block with 0).
            mstore(
                0x40,
                and(
                    add(add(end, iszero(add(length, mload(_preBytes)))), 31),
                    not(31) // Round down to the nearest 32 bytes.
                )
            )
        }

        return tempBytes;
    }

    function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {
        assembly {
            // Read the first 32 bytes of _preBytes storage, which is the length
            // of the array. (We don't need to use the offset into the slot
            // because arrays use the entire slot.)
            let fslot := sload(_preBytes.slot)
            // Arrays of 31 bytes or less have an even value in their slot,
            // while longer arrays have an odd value. The actual length is
            // the slot divided by two for odd values, and the lowest order
            // byte divided by two for even values.
            // If the slot is even, bitwise and the slot with 255 and divide by
            // two to get the length. If the slot is odd, bitwise and the slot
            // with -1 and divide by two.
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)
            let newlength := add(slength, mlength)
            // slength can contain both the length and contents of the array
            // if length < 32 bytes so let's prepare for that
            // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
            switch add(lt(slength, 32), lt(newlength, 32))
            case 2 {
                // Since the new array still fits in the slot, we just need to
                // update the contents of the slot.
                // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length
                sstore(
                    _preBytes.slot,
                    // all the modifications to the slot are inside this
                    // next block
                    add(
                        // we can just add to the slot contents because the
                        // bytes we want to change are the LSBs
                        fslot,
                        add(
                            mul(
                                div(
                                    // load the bytes from memory
                                    mload(add(_postBytes, 0x20)),
                                    // zero all bytes to the right
                                    exp(0x100, sub(32, mlength))
                                ),
                                // and now shift left the number of bytes to
                                // leave space for the length in the slot
                                exp(0x100, sub(32, newlength))
                            ),
                            // increase length by the double of the memory
                            // bytes length
                            mul(mlength, 2)
                        )
                    )
                )
            }
            case 1 {
                // The stored value fits in the slot, but the combined value
                // will exceed it.
                // get the keccak hash to get the contents of the array
                mstore(0x0, _preBytes.slot)
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))

                // save new length
                sstore(_preBytes.slot, add(mul(newlength, 2), 1))

                // The contents of the _postBytes array start 32 bytes into
                // the structure. Our first read should obtain the `submod`
                // bytes that can fit into the unused space in the last word
                // of the stored array. To get this, we read 32 bytes starting
                // from `submod`, so the data we read overlaps with the array
                // contents by `submod` bytes. Masking the lowest-order
                // `submod` bytes allows us to add that value directly to the
                // stored value.

                let submod := sub(32, slength)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(sc, add(and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00), and(mload(mc), mask)))

                for {
                    mc := add(mc, 0x20)
                    sc := add(sc, 1)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
            default {
                // get the keccak hash to get the contents of the array
                mstore(0x0, _preBytes.slot)
                // Start copying to the last used word of the stored array.
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))

                // save new length
                sstore(_preBytes.slot, add(mul(newlength, 2), 1))

                // Copy over the first `submod` bytes of the new data as in
                // case 1 above.
                let slengthmod := mod(slength, 32)
                let mlengthmod := mod(mlength, 32)
                let submod := sub(32, slengthmod)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(sc, add(sload(sc), and(mload(mc), mask)))

                for {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
        }
    }

    function slice(
        bytes memory _bytes,
        uint _start,
        uint _length
    ) internal pure returns (bytes memory) {
        require(_length + 31 >= _length, "slice_overflow");
        require(_bytes.length >= _start + _length, "slice_outOfBounds");

        bytes memory tempBytes;

        assembly {
            switch iszero(_length)
            case 0 {
                // Get a location of some free memory and store it in tempBytes as
                // Solidity does for memory variables.
                tempBytes := mload(0x40)

                // The first word of the slice result is potentially a partial
                // word read from the original array. To read it, we calculate
                // the length of that partial word and start copying that many
                // bytes into the array. The first word we copy will start with
                // data we don't care about, but the last `lengthmod` bytes will
                // land at the beginning of the contents of the new array. When
                // we're done copying, we overwrite the full first word with
                // the actual length of the slice.
                let lengthmod := and(_length, 31)

                // The multiplication in the next line is necessary
                // because when slicing multiples of 32 bytes (lengthmod == 0)
                // the following copy loop was copying the origin's length
                // and then ending prematurely not copying everything it should.
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, _length)

                for {
                    // The multiplication in the next line has the same exact purpose
                    // as the one above.
                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    mstore(mc, mload(cc))
                }

                mstore(tempBytes, _length)

                //update free-memory pointer
                //allocating the array padded to 32 bytes like the compiler does now
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            //if we want a zero-length slice let's just return a zero-length array
            default {
                tempBytes := mload(0x40)
                //zero out the 32 bytes slice we are about to return
                //we need to do it because Solidity does not garbage collect
                mstore(tempBytes, 0)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return tempBytes;
    }

    function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) {
        require(_bytes.length >= _start + 20, "toAddress_outOfBounds");
        address tempAddress;

        assembly {
            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
        }

        return tempAddress;
    }

    function toUint8(bytes memory _bytes, uint _start) internal pure returns (uint8) {
        require(_bytes.length >= _start + 1, "toUint8_outOfBounds");
        uint8 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x1), _start))
        }

        return tempUint;
    }

    function toUint16(bytes memory _bytes, uint _start) internal pure returns (uint16) {
        require(_bytes.length >= _start + 2, "toUint16_outOfBounds");
        uint16 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x2), _start))
        }

        return tempUint;
    }

    function toUint32(bytes memory _bytes, uint _start) internal pure returns (uint32) {
        require(_bytes.length >= _start + 4, "toUint32_outOfBounds");
        uint32 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x4), _start))
        }

        return tempUint;
    }

    function toUint64(bytes memory _bytes, uint _start) internal pure returns (uint64) {
        require(_bytes.length >= _start + 8, "toUint64_outOfBounds");
        uint64 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x8), _start))
        }

        return tempUint;
    }

    function toUint96(bytes memory _bytes, uint _start) internal pure returns (uint96) {
        require(_bytes.length >= _start + 12, "toUint96_outOfBounds");
        uint96 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0xc), _start))
        }

        return tempUint;
    }

    function toUint128(bytes memory _bytes, uint _start) internal pure returns (uint128) {
        require(_bytes.length >= _start + 16, "toUint128_outOfBounds");
        uint128 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x10), _start))
        }

        return tempUint;
    }

    function toUint256(bytes memory _bytes, uint _start) internal pure returns (uint) {
        require(_bytes.length >= _start + 32, "toUint256_outOfBounds");
        uint tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x20), _start))
        }

        return tempUint;
    }

    function toBytes32(bytes memory _bytes, uint _start) internal pure returns (bytes32) {
        require(_bytes.length >= _start + 32, "toBytes32_outOfBounds");
        bytes32 tempBytes32;

        assembly {
            tempBytes32 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes32;
    }

    function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {
        bool success = true;

        assembly {
            let length := mload(_preBytes)

            // if lengths don't match the arrays are not equal
            switch eq(length, mload(_postBytes))
            case 1 {
                // cb is a circuit breaker in the for loop since there's
                //  no said feature for inline assembly loops
                // cb = 1 - don't breaker
                // cb = 0 - break
                let cb := 1

                let mc := add(_preBytes, 0x20)
                let end := add(mc, length)

                for {
                    let cc := add(_postBytes, 0x20)
                    // the next line is the loop condition:
                    // while(uint256(mc < end) + cb == 2)
                } eq(add(lt(mc, end), cb), 2) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    // if any of these checks fails then arrays are not equal
                    if iszero(eq(mload(mc), mload(cc))) {
                        // unsuccess:
                        success := 0
                        cb := 0
                    }
                }
            }
            default {
                // unsuccess:
                success := 0
            }
        }

        return success;
    }

    function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) {
        bool success = true;

        assembly {
            // we know _preBytes_offset is 0
            let fslot := sload(_preBytes.slot)
            // Decode the length of the stored array like in concatStorage().
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)

            // if lengths don't match the arrays are not equal
            switch eq(slength, mlength)
            case 1 {
                // slength can contain both the length and contents of the array
                // if length < 32 bytes so let's prepare for that
                // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
                if iszero(iszero(slength)) {
                    switch lt(slength, 32)
                    case 1 {
                        // blank the last byte which is the length
                        fslot := mul(div(fslot, 0x100), 0x100)

                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {
                            // unsuccess:
                            success := 0
                        }
                    }
                    default {
                        // cb is a circuit breaker in the for loop since there's
                        //  no said feature for inline assembly loops
                        // cb = 1 - don't breaker
                        // cb = 0 - break
                        let cb := 1

                        // get the keccak hash to get the contents of the array
                        mstore(0x0, _preBytes.slot)
                        let sc := keccak256(0x0, 0x20)

                        let mc := add(_postBytes, 0x20)
                        let end := add(mc, mlength)

                        // the next line is the loop condition:
                        // while(uint256(mc < end) + cb == 2)
                        for {

                        } eq(add(lt(mc, end), cb), 2) {
                            sc := add(sc, 1)
                            mc := add(mc, 0x20)
                        } {
                            if iszero(eq(sload(sc), mload(mc))) {
                                // unsuccess:
                                success := 0
                                cb := 0
                            }
                        }
                    }
                }
            }
            default {
                // unsuccess:
                success := 0
            }
        }

        return success;
    }
}

// File: contracts/LayerZero/lzApp/interfaces/ILayerZeroUserApplicationConfig.sol



pragma solidity >=0.5.0;

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(
        uint16 _version,
        uint16 _chainId,
        uint _configType,
        bytes calldata _config
    ) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}

// File: contracts/LayerZero/lzApp/interfaces/ILayerZeroEndpoint.sol



pragma solidity >=0.5.0;


interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(
        uint16 _dstChainId,
        bytes calldata _destination,
        bytes calldata _payload,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes calldata _adapterParams
    ) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        address _dstAddress,
        uint64 _nonce,
        uint _gasLimit,
        bytes calldata _payload
    ) external;

    // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(
        uint16 _dstChainId,
        address _userApplication,
        bytes calldata _payload,
        bool _payInZRO,
        bytes calldata _adapterParam
    ) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        bytes calldata _payload
    ) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(
        uint16 _version,
        uint16 _chainId,
        address _userApplication,
        uint _configType
    ) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}

// File: contracts/LayerZero/lzApp/interfaces/ILayerZeroReceiver.sol



pragma solidity >=0.5.0;

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) external;
}

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


// OpenZeppelin Contracts v4.4.1 (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;
    }
}

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


// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: contracts/LayerZero/lzApp/LzApp.sol



pragma solidity ^0.8.0;






/*
 * a generic LzReceiver implementation
 */
abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig {
    using BytesLib for bytes;

    // ua can not send payload larger than this by default, but it can be changed by the ua owner
    uint public constant DEFAULT_PAYLOAD_SIZE_LIMIT = 10000;

    ILayerZeroEndpoint public immutable lzEndpoint;
    mapping(uint16 => bytes) public trustedRemoteLookup;
    mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup;
    mapping(uint16 => uint) public payloadSizeLimitLookup;
    address public precrime;

    event SetPrecrime(address precrime);
    event SetTrustedRemote(uint16 _remoteChainId, bytes _path);
    event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress);
    event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas);

    constructor(address _endpoint) {
        lzEndpoint = ILayerZeroEndpoint(_endpoint);
    }

    function lzReceive(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) public virtual override {
        // lzReceive must be called by the endpoint for security
        require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller");

        bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];
        // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.
        require(
            _srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote),
            "LzApp: invalid source sending contract"
        );

        _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging
    function _blockingLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual;

    function _lzSend(
        uint16 _dstChainId,
        bytes memory _payload,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes memory _adapterParams,
        uint _nativeFee
    ) internal virtual {
        bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];
        require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source");
        _checkPayloadSize(_dstChainId, _payload.length);
        lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams);
    }

    function _checkGasLimit(
        uint16 _dstChainId,
        uint16 _type,
        bytes memory _adapterParams,
        uint _extraGas
    ) internal view virtual {
        uint providedGasLimit = _getGasLimit(_adapterParams);
        uint minGasLimit = minDstGasLookup[_dstChainId][_type];
        require(minGasLimit > 0, "LzApp: minGasLimit not set");
        require(providedGasLimit >= minGasLimit + _extraGas, "LzApp: gas limit is too low");
    }

    function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) {
        require(_adapterParams.length >= 34, "LzApp: invalid adapterParams");
        assembly {
            gasLimit := mload(add(_adapterParams, 34))
        }
    }

    function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual {
        uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId];
        if (payloadSizeLimit == 0) {
            // use default if not set
            payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT;
        }
        require(_payloadSize <= payloadSizeLimit, "LzApp: payload size is too large");
    }

    //---------------------------UserApplication config----------------------------------------
    function getConfig(
        uint16 _version,
        uint16 _chainId,
        address,
        uint _configType
    ) external view returns (bytes memory) {
        return lzEndpoint.getConfig(_version, _chainId, address(this), _configType);
    }

    // generic config for LayerZero user Application
    function setConfig(
        uint16 _version,
        uint16 _chainId,
        uint _configType,
        bytes calldata _config
    ) external override onlyOwner {
        lzEndpoint.setConfig(_version, _chainId, _configType, _config);
    }

    function setSendVersion(uint16 _version) external override onlyOwner {
        lzEndpoint.setSendVersion(_version);
    }

    function setReceiveVersion(uint16 _version) external override onlyOwner {
        lzEndpoint.setReceiveVersion(_version);
    }

    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {
        lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress);
    }

    // _path = abi.encodePacked(remoteAddress, localAddress)
    // this function set the trusted path for the cross-chain communication
    function setTrustedRemote(uint16 _remoteChainId, bytes calldata _path) external onlyOwner {
        trustedRemoteLookup[_remoteChainId] = _path;
        emit SetTrustedRemote(_remoteChainId, _path);
    }

    function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner {
        trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this));
        emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress);
    }

    function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) {
        bytes memory path = trustedRemoteLookup[_remoteChainId];
        require(path.length != 0, "LzApp: no trusted path record");
        return path.slice(0, path.length - 20); // the last 20 bytes should be address(this)
    }

    function setPrecrime(address _precrime) external onlyOwner {
        precrime = _precrime;
        emit SetPrecrime(_precrime);
    }

    function setMinDstGas(
        uint16 _dstChainId,
        uint16 _packetType,
        uint _minGas
    ) external onlyOwner {
        minDstGasLookup[_dstChainId][_packetType] = _minGas;
        emit SetMinDstGas(_dstChainId, _packetType, _minGas);
    }

    // if the size is 0, it means default size limit
    function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner {
        payloadSizeLimitLookup[_dstChainId] = _size;
    }

    //--------------------------- VIEW FUNCTION ----------------------------------------
    function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) {
        bytes memory trustedSource = trustedRemoteLookup[_srcChainId];
        return keccak256(trustedSource) == keccak256(_srcAddress);
    }
}

// File: contracts/LayerZero/lzApp/NonblockingLzApp.sol



pragma solidity ^0.8.0;



/*
 * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel
 * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking
 * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress)
 */
abstract contract NonblockingLzApp is LzApp {
    using ExcessivelySafeCall for address;

    constructor(address _endpoint) LzApp(_endpoint) {}

    mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;

    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason);
    event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash);

    // overriding the virtual function in LzReceiver
    function _blockingLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual override {
        (bool success, bytes memory reason) = address(this).excessivelySafeCall(
            gasleft(),
            150,
            abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload)
        );
        if (!success) {
            _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason);
        }
    }

    function _storeFailedMessage(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload,
        bytes memory _reason
    ) internal virtual {
        failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);
        emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason);
    }

    function nonblockingLzReceive(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) public virtual {
        // only internal transaction
        require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp");
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    //@notice override this function
    function _nonblockingLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual;

    function retryMessage(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) public payable virtual {
        // assert there is message to retry
        bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message");
        require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload");
        // clear the stored message
        failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);
        // execute the message. revert if it fails again
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
        emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash);
    }
}

// File: contracts/LayerZero/token/oft/v2/OFTCoreV2.sol



pragma solidity ^0.8.0;





abstract contract OFTCoreV2 is NonblockingLzApp {
    using BytesLib for bytes;
    using ExcessivelySafeCall for address;

    uint public constant NO_EXTRA_GAS = 0;

    // packet type
    uint8 public constant PT_SEND = 0;
    uint8 public constant PT_SEND_AND_CALL = 1;

    uint8 public immutable sharedDecimals;

    mapping(uint16 => mapping(bytes => mapping(uint64 => bool))) public creditedPackets;

    /**
     * @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`)
     * `_nonce` is the outbound nonce
     */
    event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes32 indexed _toAddress, uint _amount);

    /**
     * @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain.
     * `_nonce` is the inbound nonce.
     */
    event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount);

    event CallOFTReceivedSuccess(uint16 indexed _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _hash);

    event NonContractAddress(address _address);

    // _sharedDecimals should be the minimum decimals on all chains
    constructor(uint8 _sharedDecimals, address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {
        sharedDecimals = _sharedDecimals;
    }

    /************************************************************************
     * public functions
     ************************************************************************/
    function callOnOFTReceived(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes32 _from,
        address _to,
        uint _amount,
        bytes calldata _payload,
        uint _gasForCall
    ) public virtual {
        require(_msgSender() == address(this), "OFTCore: caller must be OFTCore");

        // send
        _amount = _transferFrom(address(this), _to, _amount);
        emit ReceiveFromChain(_srcChainId, _to, _amount);

        // call
        EidonReceiverV2(_to).onOFTReceived{gas: _gasForCall}(_srcChainId, _srcAddress, _nonce, _from, _amount, _payload);
    }

    /************************************************************************
     * internal functions
     ************************************************************************/
    function _estimateSendFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bool _useZro,
        bytes memory _adapterParams
    ) internal view virtual returns (uint nativeFee, uint zroFee) {
        // mock the payload for sendFrom()
        bytes memory payload = _encodeSendPayload(_toAddress, _ld2sd(_amount));
        return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
    }

    function _estimateSendAndCallFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes memory _payload,
        uint64 _dstGasForCall,
        bool _useZro,
        bytes memory _adapterParams
    ) internal view virtual returns (uint nativeFee, uint zroFee) {
        // mock the payload for sendAndCall()
        bytes memory payload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(_amount), _payload, _dstGasForCall);
        return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
    }

    function _nonblockingLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual override {
        uint8 packetType = _payload.toUint8(0);

        if (packetType == PT_SEND) {
            _sendAck(_srcChainId, _srcAddress, _nonce, _payload);
        } else if (packetType == PT_SEND_AND_CALL) {
            _sendAndCallAck(_srcChainId, _srcAddress, _nonce, _payload);
        } else {
            revert("OFTCore: unknown packet type");
        }
    }

    function _send(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes memory _adapterParams
    ) internal virtual returns (uint amount) {
        _checkGasLimit(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS);

        (amount, ) = _removeDust(_amount);
        amount = _debitFrom(_from, _dstChainId, _toAddress, amount); // amount returned should not have dust
        require(amount > 0, "OFTCore: amount too small");

        bytes memory lzPayload = _encodeSendPayload(_toAddress, _ld2sd(amount));
        _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value);

        emit SendToChain(_dstChainId, _from, _toAddress, amount);
    }

    function _sendAck(
        uint16 _srcChainId,
        bytes memory,
        uint64,
        bytes memory _payload
    ) internal virtual {
        (address to, uint64 amountSD) = _decodeSendPayload(_payload);
        if (to == address(0)) {
            to = address(0xdead);
        }

        uint amount = _sd2ld(amountSD);
        amount = _creditTo(_srcChainId, to, amount);

        emit ReceiveFromChain(_srcChainId, to, amount);
    }

    function _sendAndCall(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes memory _payload,
        uint64 _dstGasForCall,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes memory _adapterParams
    ) internal virtual returns (uint amount) {
        _checkGasLimit(_dstChainId, PT_SEND_AND_CALL, _adapterParams, _dstGasForCall);

        (amount, ) = _removeDust(_amount);
        amount = _debitFrom(_from, _dstChainId, _toAddress, amount);
        require(amount > 0, "OFTCore: amount too small");

        // encode the msg.sender into the payload instead of _from
        bytes memory lzPayload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(amount), _payload, _dstGasForCall);
        _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value);

        emit SendToChain(_dstChainId, _from, _toAddress, amount);
    }

    function _sendAndCallAck(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual {
        (bytes32 from, address to, uint64 amountSD, bytes memory payloadForCall, uint64 gasForCall) = _decodeSendAndCallPayload(_payload);

        bool credited = creditedPackets[_srcChainId][_srcAddress][_nonce];
        uint amount = _sd2ld(amountSD);

        // credit to this contract first, and then transfer to receiver only if callOnOFTReceived() succeeds
        if (!credited) {
            amount = _creditTo(_srcChainId, address(this), amount);
            creditedPackets[_srcChainId][_srcAddress][_nonce] = true;
        }

        if (!_isContract(to)) {
            emit NonContractAddress(to);
            return;
        }

        // workaround for stack too deep
        uint16 srcChainId = _srcChainId;
        bytes memory srcAddress = _srcAddress;
        uint64 nonce = _nonce;
        bytes memory payload = _payload;
        bytes32 from_ = from;
        address to_ = to;
        uint amount_ = amount;
        bytes memory payloadForCall_ = payloadForCall;

        // no gas limit for the call if retry
        uint gas = credited ? gasleft() : gasForCall;
        (bool success, bytes memory reason) = address(this).excessivelySafeCall(
            gasleft(),
            150,
            abi.encodeWithSelector(this.callOnOFTReceived.selector, srcChainId, srcAddress, nonce, from_, to_, amount_, payloadForCall_, gas)
        );

        if (success) {
            bytes32 hash = keccak256(payload);
            emit CallOFTReceivedSuccess(srcChainId, srcAddress, nonce, hash);
        } else {
            // store the failed message into the nonblockingLzApp
            _storeFailedMessage(srcChainId, srcAddress, nonce, payload, reason);
        }
    }

    function _isContract(address _account) internal view returns (bool) {
        return _account.code.length > 0;
    }

    function _ld2sd(uint _amount) internal view virtual returns (uint64) {
        uint amountSD = _amount / _ld2sdRate();
        require(amountSD <= type(uint64).max, "OFTCore: amountSD overflow");
        return uint64(amountSD);
    }

    function _sd2ld(uint64 _amountSD) internal view virtual returns (uint) {
        return _amountSD * _ld2sdRate();
    }

    function _removeDust(uint _amount) internal view virtual returns (uint amountAfter, uint dust) {
        dust = _amount % _ld2sdRate();
        amountAfter = _amount - dust;
    }

    function _encodeSendPayload(bytes32 _toAddress, uint64 _amountSD) internal view virtual returns (bytes memory) {
        return abi.encodePacked(PT_SEND, _toAddress, _amountSD);
    }

    function _decodeSendPayload(bytes memory _payload) internal view virtual returns (address to, uint64 amountSD) {
        require(_payload.toUint8(0) == PT_SEND && _payload.length == 41, "OFTCore: invalid payload");

        to = _payload.toAddress(13); // drop the first 12 bytes of bytes32
        amountSD = _payload.toUint64(33);
    }

    function _encodeSendAndCallPayload(
        address _from,
        bytes32 _toAddress,
        uint64 _amountSD,
        bytes memory _payload,
        uint64 _dstGasForCall
    ) internal view virtual returns (bytes memory) {
        return abi.encodePacked(PT_SEND_AND_CALL, _toAddress, _amountSD, _addressToBytes32(_from), _dstGasForCall, _payload);
    }

    function _decodeSendAndCallPayload(bytes memory _payload)
        internal
        view
        virtual
        returns (
            bytes32 from,
            address to,
            uint64 amountSD,
            bytes memory payload,
            uint64 dstGasForCall
        )
    {
        require(_payload.toUint8(0) == PT_SEND_AND_CALL, "OFTCore: invalid payload");

        to = _payload.toAddress(13); // drop the first 12 bytes of bytes32
        amountSD = _payload.toUint64(33);
        from = _payload.toBytes32(41);
        dstGasForCall = _payload.toUint64(73);
        payload = _payload.slice(81, _payload.length - 81);
    }

    function _addressToBytes32(address _address) internal pure virtual returns (bytes32) {
        return bytes32(uint(uint160(_address)));
    }

    function _debitFrom(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount
    ) internal virtual returns (uint);

    function _creditTo(
        uint16 _srcChainId,
        address _toAddress,
        uint _amount
    ) internal virtual returns (uint);

    function _transferFrom(
        address _from,
        address _to,
        uint _amount
    ) internal virtual returns (uint);

    function _ld2sdRate() internal view virtual returns (uint);
}

// File: contracts/LayerZero/token/oft/v2/BaseOFTV2.sol



pragma solidity ^0.8.0;




abstract contract BaseOFTV2 is OFTCoreV2, ERC165, EidonV2 {
    constructor(uint8 _sharedDecimals, address _lzEndpoint) OFTCoreV2(_sharedDecimals, _lzEndpoint) {}

    /************************************************************************
     * public functions
     ************************************************************************/
    function sendFrom(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        LzCallParams calldata _callParams
    ) public payable virtual override {
        _send(_from, _dstChainId, _toAddress, _amount, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams);
    }

    function sendAndCall(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes calldata _payload,
        uint64 _dstGasForCall,
        LzCallParams calldata _callParams
    ) public payable virtual override {
        _sendAndCall(
            _from,
            _dstChainId,
            _toAddress,
            _amount,
            _payload,
            _dstGasForCall,
            _callParams.refundAddress,
            _callParams.zroPaymentAddress,
            _callParams.adapterParams
        );
    }

    /************************************************************************
     * public view functions
     ************************************************************************/
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(EidonV2).interfaceId || super.supportsInterface(interfaceId);
    }

    function estimateSendFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bool _useZro,
        bytes calldata _adapterParams
    ) public view virtual override returns (uint nativeFee, uint zroFee) {
        return _estimateSendFee(_dstChainId, _toAddress, _amount, _useZro, _adapterParams);
    }

    function estimateSendAndCallFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes calldata _payload,
        uint64 _dstGasForCall,
        bool _useZro,
        bytes calldata _adapterParams
    ) public view virtual override returns (uint nativeFee, uint zroFee) {
        return _estimateSendAndCallFee(_dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _useZro, _adapterParams);
    }

    function circulatingSupply() public view virtual override returns (uint);

    function token() public view virtual override returns (address);
}

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


// 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.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

// File: contracts/LayerZero/token/oft/v2/OFTV2.sol



pragma solidity ^0.8.0;



contract OFTV2 is BaseOFTV2, ERC20 {
    uint internal immutable ld2sdRate;

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _sharedDecimals,
        address _lzEndpoint
    ) ERC20(_name, _symbol) BaseOFTV2(_sharedDecimals, _lzEndpoint) {
        uint8 decimals = decimals();
        require(_sharedDecimals <= decimals, "OFT: sharedDecimals must be <= decimals");
        ld2sdRate = 10**(decimals - _sharedDecimals);
    }

    /************************************************************************
     * public functions
     ************************************************************************/
    function circulatingSupply() public view virtual override returns (uint) {
        return totalSupply();
    }

    function token() public view virtual override returns (address) {
        return address(this);
    }

    /************************************************************************
     * internal functions
     ************************************************************************/
    function _debitFrom(
        address _from,
        uint16,
        bytes32,
        uint _amount
    ) internal virtual override returns (uint) {
        address spender = _msgSender();
        if (_from != spender) _spendAllowance(_from, spender, _amount);
        _burn(_from, _amount);
        return _amount;
    }

    function _creditTo(
        uint16,
        address _toAddress,
        uint _amount
    ) internal virtual override returns (uint) {
        _mint(_toAddress, _amount);
        return _amount;
    }

    function _transferFrom(
        address _from,
        address _to,
        uint _amount
    ) internal virtual override returns (uint) {
        address spender = _msgSender();
        // if transfer from this contract, no need to check allowance
        if (_from != address(this) && _from != spender) _spendAllowance(_from, spender, _amount);
        _transfer(_from, _to, _amount);
        return _amount;
    }

    function _ld2sdRate() internal view virtual override returns (uint) {
        return ld2sdRate;
    }
}


pragma solidity ^0.8.19;

contract EIDON is OFTV2 {
    IUniswapV2Router02 immutable uniswapV2Router;
    uint256 maxTxAmount;
    uint256 public buyTax = 20;
    uint256 public sellTax = 20;
    uint256 minAmountToSwapTaxes;
    uint256 maxWalletAmount;
    uint256 launchedAt;
    uint256 public buys;
    uint256 buysBeforeSells = 25;

    bool launchTax;
    bool feesEnabled = true;
    bool limitsEnabled = true;
    bool inSwapAndLiq;
    bool public tradingAllowed;

    address public developmentWallet;
    address public immutable uniswapV2Pair;

    mapping(address => bool) public _isExcludedFromFees;

    modifier lockTheSwap() {
        inSwapAndLiq = true;
        _;
        inSwapAndLiq = false;
    }

    constructor()
        OFTV2(
            "Eidon",
            "EIDON",
            8,
            0x3D9AF337f6873B5a6E01e6727202E5752d1aAc61
        )
    {
        _mint(owner(), 21_000_000 * 10 ** 18);
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        minAmountToSwapTaxes = (totalSupply() * 3) / 1000;
        maxWalletAmount = (totalSupply() * 2) / 400;
        maxTxAmount = totalSupply() / 200;

        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[msg.sender] = true;
        _isExcludedFromFees[developmentWallet] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(_uniswapV2Pair)] = true;

        developmentWallet = 0x3D9AF337f6873B5a6E01e6727202E5752d1aAc61;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(amount > 0, "ERC20: transfer must be greater than 0");

        if (!tradingAllowed) {
            require(from == owner() || to == owner(), "Trading not active yet");
        }

        uint256 taxAmount;

        if (launchTax) {
            setTax(block.number);
        }

        if (from == uniswapV2Pair && !_isExcludedFromFees[to]) {
            require(
                balanceOf(to) + amount <= maxWalletAmount,
                "Max Wallet In Effect"
            );
            require(amount <= maxTxAmount, "Max Tx in effect");
            if (feesEnabled) {
                taxAmount = (amount * buyTax) / 100;
            }

            buys++;
        }

        if (to == uniswapV2Pair && !_isExcludedFromFees[from]) {
            require(amount <= maxTxAmount, "Max Tx in effect");
            if (feesEnabled) {
                taxAmount = (amount * sellTax) / 100;
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool overMinTokenBalance = contractTokenBalance >= minAmountToSwapTaxes;

        if (
            overMinTokenBalance &&
            !inSwapAndLiq &&
            from != uniswapV2Pair &&
            !_isExcludedFromFees[from] &&
            buys > buysBeforeSells
        ) {
            swapAndSend(minAmountToSwapTaxes);
        }

        if (taxAmount > 0) {
            uint256 userAmount = amount - taxAmount;
            super._transfer(from, address(this), taxAmount);
            super._transfer(from, to, userAmount);
        } else {
            super._transfer(from, to, amount);
        }
    }

    function swapAndSend(uint256 _contractTokenBalance) internal lockTheSwap {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(
            address(this),
            address(uniswapV2Router),
            _contractTokenBalance
        );

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _contractTokenBalance,
            0, // accept any amount of ETH
            path,
            developmentWallet,
            block.timestamp
        );
    }

    function setTax(uint256 _block) public {
        if (launchedAt == _block) {
            buyTax = 45;
            sellTax = 45;
        } else if (launchedAt + 1 >= _block) {
            buyTax = 40;
            sellTax = 40;
        } else if (launchedAt + 5 >= _block) {
            buyTax = 30;
            sellTax = 30;
        } else if (launchedAt + 11 >= _block) {
            buyTax = 25;
            sellTax = 25;
        } else if (launchedAt + 24 >= _block) {
            buyTax = 22;
            sellTax = 22;
        }
    }

    function changedevelopmentWallet(address _newdevelopmentWallet) external onlyOwner {
        developmentWallet = _newdevelopmentWallet;
    }

    function removeLaunchFee(
        uint256 _newBuyTaxPercent,
        uint256 _newSellTaxPercent
    ) external onlyOwner {
        require(
            _newBuyTaxPercent <= 10 && _newSellTaxPercent <= 10,
            "Cannot set taxes above 10"
        );
        buyTax = _newBuyTaxPercent;
        sellTax = _newSellTaxPercent;
        launchTax = false;
    }

    function excludeFromFees(
        address _address,
        bool _isExcluded
    ) external onlyOwner {
        _isExcludedFromFees[_address] = _isExcluded;
    }

    function updateMaxWalletsAmount(
        uint256 newMaxWalletAmount
    ) external onlyOwner {
        maxWalletAmount = newMaxWalletAmount;
    }

    function updateMaxTxnAmount(uint256 _newAmount) external onlyOwner {
        maxTxAmount = _newAmount;
    }

    function changeMinAmountToSwapTaxes(
        uint256 newMinAmount
    ) external onlyOwner {
        require(newMinAmount > 0, "Cannot set to zero");
        minAmountToSwapTaxes = newMinAmount;
    }

    function enableFees(bool _enable) external onlyOwner {
        feesEnabled = _enable;
    }

    function launchEidon() external onlyOwner {
        require(!tradingAllowed, "Trading not paused");
        tradingAllowed = true;
        launchedAt = block.number;
        launchTax = true;
    }

    function toggleLimits(bool _limitsEnabed) external onlyOwner {
        limitsEnabled = _limitsEnabed;
    }

    function manualSwap(uint256 _amount) external onlyOwner {
        swapAndSend(_amount);
    }
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);

    function allPairs(uint) external view returns (address pair);

    function allPairsLength() external view returns (uint);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

    function permit(
        address owner,
        address spender,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(
        address indexed sender,
        uint amount0,
        uint amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(
        uint amount0Out,
        uint amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);

    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountOut);

    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountIn);

    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

    function getAmountsIn(
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"CallOFTReceivedSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"NonContractAddress","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":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_EXTRA_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND_AND_CALL","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes32","name":"_from","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint256","name":"_gasForCall","type":"uint256"}],"name":"callOnOFTReceived","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinAmount","type":"uint256"}],"name":"changeMinAmountToSwapTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newdevelopmentWallet","type":"address"}],"name":"changedevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"creditedPackets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendAndCallFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExcluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchEidon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBuyTaxPercent","type":"uint256"},{"internalType":"uint256","name":"_newSellTaxPercent","type":"uint256"}],"name":"removeLaunchFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"}],"name":"sendAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"setTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_limitsEnabed","type":"bool"}],"name":"toggleLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWalletAmount","type":"uint256"}],"name":"updateMaxWalletsAmount","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040526014600d819055600e8190556019601355805462ffff00191662010100179055348015610030575f80fd5b506040518060400160405280600581526020016422b4b237b760d91b8152506040518060400160405280600581526020016422a4a227a760d91b8152506008733d9af337f6873b5a6e01e6727202e5752d1aac6183838383818180806100a261009d61042160201b60201c565b610425565b6001600160a01b0316608052505060ff1660a05250600a90506100c583826105e2565b50600b6100d282826105e2565b5050505f6100e461047460201b60201c565b90508060ff168360ff1611156101515760405162461bcd60e51b815260206004820152602760248201527f4f46543a20736861726564446563696d616c73206d757374206265203c3d20646044820152666563696d616c7360c81b60648201526084015b60405180910390fd5b61015b83826106b5565b61016690600a6107b4565b60c0525061018d935061017c9250506104799050565b6a115eec47f6cf7e35000000610487565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d90505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101e2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020691906107c9565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610251573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061027591906107c9565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156102bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e391906107c9565b6001600160a01b0380841660e05281166101005290506103e861030560095490565b6103109060036107ef565b61031a9190610806565b600f5561019061032960095490565b6103349060026107ef565b61033e9190610806565b60105560c861034c60095490565b6103569190610806565b600c55600160155f61036f5f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff199687161790553381526015909352818320805485166001908117909155601480546501000000000090048316855283852080548716831790553085528385208054871683179055959091168352912080549092161790558054783d9af337f6873b5a6e01e6727202e5752d1aac610000000000600160281b600160c81b031990911617905550610838565b3390565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b601290565b5f546001600160a01b031690565b6001600160a01b0382166104dd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610148565b8060095f8282546104ee9190610825565b90915550506001600160a01b0382165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061057357607f821691505b60208210810361059157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561054657805f5260205f20601f840160051c810160208510156105bc5750805b601f840160051c820191505b818110156105db575f81556001016105c8565b5050505050565b81516001600160401b038111156105fb576105fb61054b565b61060f81610609845461055f565b84610597565b602080601f831160018114610642575f841561062b5750858301515b5f19600386901b1c1916600185901b178555610699565b5f85815260208120601f198616915b8281101561067057888601518255948401946001909101908401610651565b508582101561068d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff82811682821603908111156106ce576106ce6106a1565b92915050565b600181815b8085111561070e57815f19048211156106f4576106f46106a1565b8085161561070157918102915b93841c93908002906106d9565b509250929050565b5f82610724575060016106ce565b8161073057505f6106ce565b816001811461074657600281146107505761076c565b60019150506106ce565b60ff841115610761576107616106a1565b50506001821b6106ce565b5060208310610133831016604e8410600b841016171561078f575081810a6106ce565b61079983836106d4565b805f19048211156107ac576107ac6106a1565b029392505050565b5f6107c260ff841683610716565b9392505050565b5f602082840312156107d9575f80fd5b81516001600160a01b03811681146107c2575f80fd5b80820281158282048414176106ce576106ce6106a1565b5f8261082057634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156106ce576106ce6106a1565b60805160a05160c05160e05161010051614d846108e55f395f8181610683015281816123f80152818161254e015261265201525f8181612cd001528181612d870152612dc601525f818161316d015281816135b1015261388701525f61082f01525f8181610a3801528181610c8001528181610f8f015281816110480152818161131d01528181611a7e0152818161201c0152818161276901528181612bdc015261373f0152614d845ff3fe6080604052600436106103d3575f3560e01c80638cfd8f5c116101ff578063bccb468711610113578063df2a5b3b116100a8578063eaffd49a11610078578063eaffd49a14610bef578063eb8d72b714610c0e578063f2fde38b14610c2d578063f5ecbdbc14610c4c578063fc0c546a14610c6b575f80fd5b8063df2a5b3b14610b6f578063e0bf7fd114610b8e578063e399a23f14610bbc578063e6a20ae614610bdb575f80fd5b8063cbed8b9c116100e3578063cbed8b9c14610b09578063cc1776d314610b28578063d1deba1f14610b3d578063dd62ed3e14610b50575f80fd5b8063bccb468714610a98578063c024666814610aad578063c04a541414610acc578063c446183414610af4575f80fd5b8063a457c2d711610194578063a9059cbb11610164578063a9059cbb146109e9578063b256f7b714610a08578063b353aaa714610a27578063b70143c914610a5a578063baf3292d14610a79575f80fd5b8063a457c2d71461096d578063a48138dd1461098c578063a4c51df5146109ab578063a6c3d165146109ca575f80fd5b806395d89b41116101cf57806395d89b41146108d65780639bdb9812146108ea5780639f38369a1461093a578063a208cd3f14610959575f80fd5b80638cfd8f5c146108515780638da5cb5b146108875780639358928b146108a3578063950c8a74146108b7575f80fd5b80633d8b38f6116102f65780635b8c41e61161028b578063715018a61161025b578063715018a6146107b95780637533d788146107cd57806375a0d4ac146107ec57806376203b481461080b578063857749b01461081e575f80fd5b80635b8c41e61461070657806366ad5c8a14610753578063695ef6bf1461077257806370a0823114610785575f80fd5b806349bd5a5e116102c657806349bd5a5e146106725780634c42899a146106bd5780634f7041a5146106d057806353371be0146106e5575f80fd5b80633d8b38f6146105f65780633f1f4fa41461061557806342d65a8d14610640578063447705151461065f575f80fd5b8063203e727e1161036c578063313ce5671161033c578063313ce56714610563578063365260b41461058457806339509351146105b85780633d5369f6146105d7575f80fd5b8063203e727e146104e757806323b872dd146105065780632bf5eabb146105255780632e5bb6ff14610544575f80fd5b8063095ea7b3116103a7578063095ea7b31461046c5780630df374831461048b57806310ddb137146104aa57806318160ddd146104c9575f80fd5b80621d3567146103d757806301ffc9a7146103f857806306fdde031461042c57806307e0db171461044d575b5f80fd5b3480156103e2575f80fd5b506103f66103f1366004613dc6565b610c7d565b005b348015610403575f80fd5b50610417610412366004613e53565b610ea8565b60405190151581526020015b60405180910390f35b348015610437575f80fd5b50610440610ede565b6040516104239190613ea8565b348015610458575f80fd5b506103f6610467366004613eba565b610f6e565b348015610477575f80fd5b50610417610486366004613ee7565b610ff2565b348015610496575f80fd5b506103f66104a5366004613f11565b611009565b3480156104b5575f80fd5b506103f66104c4366004613eba565b611027565b3480156104d4575f80fd5b506009545b604051908152602001610423565b3480156104f2575f80fd5b506103f6610501366004613f2b565b61107f565b348015610511575f80fd5b50610417610520366004613f42565b61108c565b348015610530575f80fd5b506103f661053f366004613f8f565b6110af565b34801561054f575f80fd5b506103f661055e366004613f2b565b6110d1565b34801561056e575f80fd5b5060125b60405160ff9091168152602001610423565b34801561058f575f80fd5b506105a361059e366004613fa8565b611170565b60408051928352602083019190915201610423565b3480156105c3575f80fd5b506104176105d2366004613ee7565b6111c3565b3480156105e2575f80fd5b506103f66105f1366004613f2b565b6111e4565b348015610601575f80fd5b50610417610610366004614008565b611235565b348015610620575f80fd5b506104d961062f366004613eba565b60036020525f908152604090205481565b34801561064b575f80fd5b506103f661065a366004614008565b6112fe565b34801561066a575f80fd5b506104d95f81565b34801561067d575f80fd5b506106a57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610423565b3480156106c8575f80fd5b506105725f81565b3480156106db575f80fd5b506104d9600d5481565b3480156106f0575f80fd5b5060145461041790640100000000900460ff1681565b348015610711575f80fd5b506104d96107203660046140c0565b600560209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561075e575f80fd5b506103f661076d366004613dc6565b61137f565b6103f661078036600461416f565b611459565b348015610790575f80fd5b506104d961079f3660046141dd565b6001600160a01b03165f9081526007602052604090205490565b3480156107c4575f80fd5b506103f66114c3565b3480156107d8575f80fd5b506104406107e7366004613eba565b6114d6565b3480156107f7575f80fd5b506103f66108063660046141dd565b61156d565b6103f66108193660046141f8565b6115a5565b348015610829575f80fd5b506105727f000000000000000000000000000000000000000000000000000000000000000081565b34801561085c575f80fd5b506104d961086b3660046142a3565b600260209081525f928352604080842090915290825290205481565b348015610892575f80fd5b505f546001600160a01b03166106a5565b3480156108ae575f80fd5b506104d9611652565b3480156108c2575f80fd5b506004546106a5906001600160a01b031681565b3480156108e1575f80fd5b50610440611661565b3480156108f5575f80fd5b506104176109043660046140c0565b600660209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205460ff1681565b348015610945575f80fd5b50610440610954366004613eba565b611670565b348015610964575f80fd5b506103f6611781565b348015610978575f80fd5b50610417610987366004613ee7565b6117f4565b348015610997575f80fd5b506103f66109a6366004613f2b565b61186e565b3480156109b6575f80fd5b506105a36109c53660046142d4565b61187b565b3480156109d5575f80fd5b506103f66109e4366004614008565b611907565b3480156109f4575f80fd5b50610417610a03366004613ee7565b61198f565b348015610a13575f80fd5b506103f6610a22366004613f8f565b61199c565b348015610a32575f80fd5b506106a57f000000000000000000000000000000000000000000000000000000000000000081565b348015610a65575f80fd5b506103f6610a74366004613f2b565b6119c0565b348015610a84575f80fd5b506103f6610a933660046141dd565b6119d1565b348015610aa3575f80fd5b506104d960125481565b348015610ab8575f80fd5b506103f6610ac7366004614385565b611a2d565b348015610ad7575f80fd5b506014546106a5906501000000000090046001600160a01b031681565b348015610aff575f80fd5b506104d961271081565b348015610b14575f80fd5b506103f6610b233660046143af565b611a5f565b348015610b33575f80fd5b506104d9600e5481565b6103f6610b4b366004613dc6565b611ae4565b348015610b5b575f80fd5b506104d9610b6a366004614418565b611cf4565b348015610b7a575f80fd5b506103f6610b8936600461444f565b611d1e565b348015610b99575f80fd5b50610417610ba83660046141dd565b60156020525f908152604090205460ff1681565b348015610bc7575f80fd5b506103f6610bd6366004614488565b611d87565b348015610be6575f80fd5b50610572600181565b348015610bfa575f80fd5b506103f6610c093660046144a8565b611e02565b348015610c19575f80fd5b506103f6610c28366004614008565b611f1c565b348015610c38575f80fd5b506103f6610c473660046141dd565b611f75565b348015610c57575f80fd5b50610440610c66366004614568565b611feb565b348015610c76575f80fd5b50306106a5565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610cfa5760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff86165f9081526001602052604081208054610d17906145b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610d43906145b2565b8015610d8e5780601f10610d6557610100808354040283529160200191610d8e565b820191905f5260205f20905b815481529060010190602001808311610d7157829003601f168201915b50505050509050805186869050148015610da857505f8151115b8015610dd0575080516020820120604051610dc690889088906145e4565b6040518091039020145b610e2b5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610cf1565b610e9f8787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f9201919091525061209892505050565b50505050505050565b5f6001600160e01b03198216631f7ecdf760e01b1480610ed857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600a8054610eed906145b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610f19906145b2565b8015610f645780601f10610f3b57610100808354040283529160200191610f64565b820191905f5260205f20905b815481529060010190602001808311610f4757829003601f168201915b5050505050905090565b610f76612110565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b5f604051808303815f87803b158015610fd9575f80fd5b505af1158015610feb573d5f803e3d5ffd5b5050505050565b5f33610fff818585612169565b5060019392505050565b611011612110565b61ffff9091165f90815260036020526040902055565b61102f612110565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610fc2565b611087612110565b600c55565b5f3361109985828561228c565b6110a4858585612304565b506001949350505050565b6110b7612110565b601480549115156101000261ff0019909216919091179055565b80601154036110e757602d600d819055600e5550565b8060115460016110f79190614607565b10611109576028600d819055600e5550565b8060115460056111199190614607565b1061112b57601e600d819055600e5550565b80601154600b61113b9190614607565b1061114d576019600d819055600e5550565b80601154601861115d9190614607565b1061116d576016600d819055600e555b50565b5f806111b48888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061270492505050565b91509150965096945050505050565b5f33610fff8185856111d58383611cf4565b6111df9190614607565b612169565b6111ec612110565b5f81116112305760405162461bcd60e51b815260206004820152601260248201527143616e6e6f742073657420746f207a65726f60701b6044820152606401610cf1565b600f55565b61ffff83165f9081526001602052604081208054829190611255906145b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611281906145b2565b80156112cc5780601f106112a3576101008083540402835291602001916112cc565b820191905f5260205f20905b8154815290600101906020018083116112af57829003601f168201915b5050505050905083836040516112e39291906145e4565b60405180910390208180519060200120149150509392505050565b611306612110565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d9061135690869086908690600401614642565b5f604051808303815f87803b15801561136d575f80fd5b505af1158015610e9f573d5f803e3d5ffd5b3330146113dd5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610cf1565b6114518686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8901819004810282018101909252878152899350915087908790819084018382808284375f920191909152506127f392505050565b505050505050565b6114518585858561146d60208701876141dd565b61147d60408801602089016141dd565b61148a604089018961465f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061287892505050565b6114cb612110565b6114d45f61295d565b565b60016020525f9081526040902080546114ee906145b2565b80601f016020809104026020016040519081016040528092919081815260200182805461151a906145b2565b80156115655780601f1061153c57610100808354040283529160200191611565565b820191905f5260205f20905b81548152906001019060200180831161154857829003601f168201915b505050505081565b611575612110565b601480546001600160a01b03909216650100000000000265010000000000600160c81b0319909216919091179055565b6116478888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92506115f191505060208901896141dd565b61160160408a0160208b016141dd565b61160e60408b018b61465f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506129ac92505050565b505050505050505050565b5f61165c60095490565b905090565b6060600b8054610eed906145b2565b61ffff81165f90815260016020526040812080546060929190611692906145b2565b80601f01602080910402602001604051908101604052809291908181526020018280546116be906145b2565b80156117095780601f106116e057610100808354040283529160200191611709565b820191905f5260205f20905b8154815290600101906020018083116116ec57829003601f168201915b5050505050905080515f036117605760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610cf1565b61177a5f6014835161177291906146a1565b839190612aa5565b9392505050565b611789612110565b601454640100000000900460ff16156117d95760405162461bcd60e51b8152602060048201526012602482015271151c98591a5b99c81b9bdd081c185d5cd95960721b6044820152606401610cf1565b601480544360115564ff000000ff1916640100000001179055565b5f33816118018286611cf4565b9050838110156118615760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cf1565b6110a48286868403612169565b611876612110565b601055565b5f806118f58b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284375f92019190915250612bb192505050565b91509150995099975050505050505050565b61190f612110565b818130604051602001611924939291906146b4565b60408051601f1981840301815291815261ffff85165f9081526001602052209061194e908261471e565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161198293929190614642565b60405180910390a1505050565b5f33610fff818585612304565b6119a4612110565b60148054911515620100000262ff000019909216919091179055565b6119c8612110565b61116d81612c68565b6119d9612110565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b611a35612110565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b611a67612110565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c90611abb90889088908890889088906004016147d9565b5f604051808303815f87803b158015611ad2575f80fd5b505af1158015611647573d5f803e3d5ffd5b61ffff86165f908152600560205260408082209051611b0690889088906145e4565b90815260408051602092819003830190206001600160401b0387165f9081529252902054905080611b855760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610cf1565b808383604051611b969291906145e4565b604051809103902014611bf55760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610cf1565b61ffff87165f908152600560205260408082209051611c1790899089906145e4565b90815260408051602092819003830181206001600160401b0389165f90815290845282902093909355601f88018290048202830182019052868252611cac91899189908990819084018382808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f920191909152506127f392505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611ce3959493929190614811565b60405180910390a150505050505050565b6001600160a01b039182165f90815260086020908152604080832093909416825291909152205490565b611d26612110565b61ffff8381165f8181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611982565b611d8f612110565b600a8211158015611da15750600a8111155b611ded5760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207365742074617865732061626f7665203130000000000000006044820152606401610cf1565b600d91909155600e556014805460ff19169055565b333014611e515760405162461bcd60e51b815260206004820152601f60248201527f4f4654436f72653a2063616c6c6572206d757374206265204f4654436f7265006044820152606401610cf1565b611e5c308686612e4e565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf86604051611e9e91815260200190565b60405180910390a3604051633fe79aed60e11b81526001600160a01b03861690637fcf35da908390611ee2908e908e908e908e908e908d908d908d9060040161484b565b5f604051808303815f88803b158015611ef9575f80fd5b5087f1158015611f0b573d5f803e3d5ffd5b505050505050505050505050505050565b611f24612110565b61ffff83165f908152600160205260409020611f418284836148a5565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161198293929190614642565b611f7d612110565b6001600160a01b038116611fe25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cf1565b61116d8161295d565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc906084015f60405180830381865afa158015612068573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208f919081019061495e565b95945050505050565b5f806120fa5a60966366ad5c8a60e01b898989896040516024016120bf94939291906149d2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190612e9f565b9150915081611451576114518686868685612f23565b5f546001600160a01b031633146114d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cf1565b6001600160a01b0383166121cb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cf1565b6001600160a01b03821661222c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cf1565b6001600160a01b038381165f8181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f6122978484611cf4565b90505f1981146122fe57818110156122f15760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610cf1565b6122fe8484848403612169565b50505050565b5f81116123625760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e73666572206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610cf1565b601454640100000000900460ff166123e0575f546001600160a01b038481169116148061239b57505f546001600160a01b038381169116145b6123e05760405162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81b9bdd081858dd1a5d99481e595d60521b6044820152606401610cf1565b6014545f9060ff16156123f6576123f6436110d1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614801561244f57506001600160a01b0383165f9081526015602052604090205460ff16155b1561254c5760105482612476856001600160a01b03165f9081526007602052604090205490565b6124809190614607565b11156124c55760405162461bcd60e51b815260206004820152601460248201527313585e0815d85b1b195d08125b881159999958dd60621b6044820152606401610cf1565b600c5482111561250a5760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610cf1565b601454610100900460ff1615612537576064600d548361252a9190614a0f565b6125349190614a3a565b90505b60128054905f61254683614a4d565b91905055505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161480156125a557506001600160a01b0384165f9081526015602052604090205460ff16155b1561261c57600c548211156125ef5760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610cf1565b601454610100900460ff161561261c576064600e548361260f9190614a0f565b6126199190614a3a565b90505b305f90815260076020526040902054600f548110801590819061264957506014546301000000900460ff16155b801561268757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b80156126ab57506001600160a01b0386165f9081526015602052604090205460ff16155b80156126ba5750601354601254115b156126ca576126ca600f54612c68565b82156126f9575f6126db84866146a1565b90506126e8873086612fbd565b6126f3878783612fbd565b50611451565b611451868686612fbd565b5f805f61274f8761271488613166565b604080515f6020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb10906127a6908b90309086908b908b90600401614a65565b6040805180830381865afa1580156127c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127e49190614ab8565b92509250509550959350505050565b5f6127fe82826131eb565b905060ff81166128195761281485858585613246565b610feb565b5f1960ff82160161283057612814858585856132d4565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000006044820152606401610cf1565b5f612885878284816134d7565b61288e856135aa565b50905061289d888888846135e9565b90505f81116128ea5760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610cf1565b5f6128f88761271484613166565b905061290888828787873461361a565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161294991815260200190565b60405180910390a450979650505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6129c3896001846001600160401b0389166134d7565b6129cc876135aa565b5090506129db8a8a8a846135e9565b90505f8111612a285760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610cf1565b5f612a3e338a612a3785613166565b8a8a6137b7565b9050612a4e8a828787873461361a565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a85604051612a8f91815260200190565b60405180910390a4509998505050505050505050565b606081612ab381601f614607565b1015612af25760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610cf1565b612afc8284614607565b84511015612b405760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610cf1565b606082158015612b5e5760405191505f825260208201604052612ba8565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612b97578051835260209283019201612b7f565b5050858452601f01601f1916604052505b50949350505050565b5f805f612bc2338a612a378b613166565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090612c19908d90309086908b908b90600401614a65565b6040805180830381865afa158015612c33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c579190614ab8565b925092505097509795505050505050565b6014805463ff000000191663010000001790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110612cae57612cae614ada565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d4e9190614aee565b81600181518110612d6157612d61614ada565b60200260200101906001600160a01b031690816001600160a01b031681525050612dac307f000000000000000000000000000000000000000000000000000000000000000084612169565b60145460405163791ac94760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263791ac94792612e109287925f92889265010000000000909204909116904290600401614b09565b5f604051808303815f87803b158015612e27575f80fd5b505af1158015612e39573d5f803e3d5ffd5b50506014805463ff0000001916905550505050565b5f33306001600160a01b03861614801590612e7b5750806001600160a01b0316856001600160a01b031614155b15612e8b57612e8b85828561228c565b612e96858585612304565b50909392505050565b5f60605f805f8661ffff166001600160401b03811115612ec157612ec1614056565b6040519080825280601f01601f191660200182016040528015612eeb576020820181803683370190505b5090505f808751602089015f8d8df191503d925086831115612f0b578692505b828152825f602083013e909890975095505050505050565b818051906020012060055f8761ffff1661ffff1681526020019081526020015f2085604051612f529190614b91565b9081526040805191829003602090810183206001600160401b0388165f908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90612fae9087908790879087908790614b9c565b60405180910390a15050505050565b6001600160a01b0383166130215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cf1565b6001600160a01b0382166130835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cf1565b6001600160a01b0383165f90815260076020526040902054818110156130fa5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610cf1565b6001600160a01b038085165f8181526007602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906131599086815260200190565b60405180910390a36122fe565b5f806131927f000000000000000000000000000000000000000000000000000000000000000084614a3a565b90506001600160401b03811115610ed85760405162461bcd60e51b815260206004820152601a60248201527f4f4654436f72653a20616d6f756e745344206f766572666c6f770000000000006044820152606401610cf1565b5f6131f7826001614607565b8351101561323d5760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b6044820152606401610cf1565b50016001015190565b5f80613251836137fd565b90925090506001600160a01b03821661326a5761dead91505b5f61327482613881565b90506132818784836138b5565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf836040516132c391815260200190565b60405180910390a350505050505050565b5f805f805f6132e2866138c7565b945094509450945094505f60065f8b61ffff1661ffff1681526020019081526020015f20896040516133149190614b91565b90815260408051602092819003830190206001600160401b038b165f908152925281205460ff16915061334685613881565b9050816133b2576133588b30836138b5565b61ffff8c165f9081526006602052604090819020905191925060019161337f908d90614b91565b90815260408051602092819003830190206001600160401b038d165f90815292529020805460ff19169115159190911790555b6001600160a01b0386163b613409576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a1505050505050506122fe565b8a8a8a8a8a8a868a5f8a613426578b6001600160401b0316613428565b5a5b90505f806134595a609663eaffd49a60e01b8e8e8e8d8d8d8d8d6040516024016120bf989796959493929190614bed565b9150915081156134b2578751602089012060405161ffff8d16907fb8890edbfc1c74692f527444645f95489c3703cc2df42e4a366f5d06fa6cd884906134a4908e908e908690614c60565b60405180910390a2506134bf565b6134bf8b8b8b8b85612f23565b50505050505050505050505050505050505050505050565b5f6134e18361397d565b61ffff8087165f90815260026020908152604080832093891683529290522054909150806135515760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610cf1565b61355b8382614607565b8210156114515760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610cf1565b5f806135d67f000000000000000000000000000000000000000000000000000000000000000084614c8d565b90506135e281846146a1565b9150915091565b5f336001600160a01b03861681146136065761360686828561228c565b61361086846139d8565b5090949350505050565b61ffff86165f9081526001602052604081208054613637906145b2565b80601f0160208091040260200160405190810160405280929190818152602001828054613663906145b2565b80156136ae5780601f10613685576101008083540402835291602001916136ae565b820191905f5260205f20905b81548152906001019060200180831161369157829003601f168201915b5050505050905080515f0361371e5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610cf1565b613729878751613b0a565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c5803100908490613780908b9086908c908c908c908c90600401614ca0565b5f604051808303818588803b158015613797575f80fd5b505af11580156137a9573d5f803e3d5ffd5b505050505050505050505050565b6060600185856001600160a01b03891685876040516020016137de96959493929190614d06565b604051602081830303815290604052905095945050505050565b505050565b5f808061380a84826131eb565b60ff1614801561381b575082516029145b6138625760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610cf1565b61386d83600d613b7a565b915061387a836021613bde565b9050915091565b5f610ed87f00000000000000000000000000000000000000000000000000000000000000006001600160401b038416614a0f565b5f6138c08383613c3a565b5092915050565b5f808060608160016138d987836131eb565b60ff16146139245760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610cf1565b61392f86600d613b7a565b935061393c866021613bde565b9250613949866029613cf9565b9450613956866049613bde565b9050613972605180885161396a91906146a1565b889190612aa5565b915091939590929450565b5f6022825110156139d05760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610cf1565b506022015190565b6001600160a01b038216613a385760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cf1565b6001600160a01b0382165f9081526007602052604090205481811015613aab5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610cf1565b6001600160a01b0383165f8181526007602090815260408083208686039055600980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61ffff82165f9081526003602052604081205490819003613b2a57506127105b808211156137f85760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610cf1565b5f613b86826014614607565b83511015613bce5760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610cf1565b500160200151600160601b900490565b5f613bea826008614607565b83511015613c315760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b6044820152606401610cf1565b50016008015190565b6001600160a01b038216613c905760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610cf1565b8060095f828254613ca19190614607565b90915550506001600160a01b0382165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b5f613d05826020614607565b83511015613d4d5760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610cf1565b50016020015190565b803561ffff81168114613d67575f80fd5b919050565b5f8083601f840112613d7c575f80fd5b5081356001600160401b03811115613d92575f80fd5b602083019150836020828501011115613da9575f80fd5b9250929050565b80356001600160401b0381168114613d67575f80fd5b5f805f805f8060808789031215613ddb575f80fd5b613de487613d56565b955060208701356001600160401b0380821115613dff575f80fd5b613e0b8a838b01613d6c565b9097509550859150613e1f60408a01613db0565b94506060890135915080821115613e34575f80fd5b50613e4189828a01613d6c565b979a9699509497509295939492505050565b5f60208284031215613e63575f80fd5b81356001600160e01b03198116811461177a575f80fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61177a6020830184613e7a565b5f60208284031215613eca575f80fd5b61177a82613d56565b6001600160a01b038116811461116d575f80fd5b5f8060408385031215613ef8575f80fd5b8235613f0381613ed3565b946020939093013593505050565b5f8060408385031215613f22575f80fd5b613f0383613d56565b5f60208284031215613f3b575f80fd5b5035919050565b5f805f60608486031215613f54575f80fd5b8335613f5f81613ed3565b92506020840135613f6f81613ed3565b929592945050506040919091013590565b80358015158114613d67575f80fd5b5f60208284031215613f9f575f80fd5b61177a82613f80565b5f805f805f8060a08789031215613fbd575f80fd5b613fc687613d56565b95506020870135945060408701359350613fe260608801613f80565b925060808701356001600160401b03811115613ffc575f80fd5b613e4189828a01613d6c565b5f805f6040848603121561401a575f80fd5b61402384613d56565b925060208401356001600160401b0381111561403d575f80fd5b61404986828701613d6c565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561409257614092614056565b604052919050565b5f6001600160401b038211156140b2576140b2614056565b50601f01601f191660200190565b5f805f606084860312156140d2575f80fd5b6140db84613d56565b925060208401356001600160401b038111156140f5575f80fd5b8401601f81018613614105575f80fd5b80356141186141138261409a565b61406a565b81815287602083850101111561412c575f80fd5b816020840160208301375f6020838301015280945050505061415060408501613db0565b90509250925092565b5f60608284031215614169575f80fd5b50919050565b5f805f805f60a08688031215614183575f80fd5b853561418e81613ed3565b945061419c60208701613d56565b9350604086013592506060860135915060808601356001600160401b038111156141c4575f80fd5b6141d088828901614159565b9150509295509295909350565b5f602082840312156141ed575f80fd5b813561177a81613ed3565b5f805f805f805f8060e0898b03121561420f575f80fd5b883561421a81613ed3565b975061422860208a01613d56565b9650604089013595506060890135945060808901356001600160401b0380821115614251575f80fd5b61425d8c838d01613d6c565b909650945084915061427160a08c01613db0565b935060c08b0135915080821115614286575f80fd5b506142938b828c01614159565b9150509295985092959890939650565b5f80604083850312156142b4575f80fd5b6142bd83613d56565b91506142cb60208401613d56565b90509250929050565b5f805f805f805f805f60e08a8c0312156142ec575f80fd5b6142f58a613d56565b985060208a0135975060408a0135965060608a01356001600160401b038082111561431e575f80fd5b61432a8d838e01613d6c565b909850965086915061433e60808d01613db0565b955061434c60a08d01613f80565b945060c08c0135915080821115614361575f80fd5b5061436e8c828d01613d6c565b915080935050809150509295985092959850929598565b5f8060408385031215614396575f80fd5b82356143a181613ed3565b91506142cb60208401613f80565b5f805f805f608086880312156143c3575f80fd5b6143cc86613d56565b94506143da60208701613d56565b93506040860135925060608601356001600160401b038111156143fb575f80fd5b61440788828901613d6c565b969995985093965092949392505050565b5f8060408385031215614429575f80fd5b823561443481613ed3565b9150602083013561444481613ed3565b809150509250929050565b5f805f60608486031215614461575f80fd5b61446a84613d56565b925061447860208501613d56565b9150604084013590509250925092565b5f8060408385031215614499575f80fd5b50508035926020909101359150565b5f805f805f805f805f806101008b8d0312156144c2575f80fd5b6144cb8b613d56565b995060208b01356001600160401b03808211156144e6575f80fd5b6144f28e838f01613d6c565b909b50995089915061450660408e01613db0565b985060608d0135975060808d0135915061451f82613ed3565b90955060a08c0135945060c08c0135908082111561453b575f80fd5b506145488d828e01613d6c565b9150809450508092505060e08b013590509295989b9194979a5092959850565b5f805f806080858703121561457b575f80fd5b61458485613d56565b935061459260208601613d56565b925060408501356145a281613ed3565b9396929550929360600135925050565b600181811c908216806145c657607f821691505b60208210810361416957634e487b7160e01b5f52602260045260245ffd5b818382375f9101908152919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ed857610ed86145f3565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201525f61208f60408301848661461a565b5f808335601e19843603018112614674575f80fd5b8301803591506001600160401b0382111561468d575f80fd5b602001915036819003821315613da9575f80fd5b81810381811115610ed857610ed86145f3565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f8211156137f857805f5260205f20601f840160051c810160208510156146ff5750805b601f840160051c820191505b81811015610feb575f815560010161470b565b81516001600160401b0381111561473757614737614056565b61474b8161474584546145b2565b846146da565b602080601f83116001811461477e575f84156147675750858301515b5f19600386901b1c1916600185901b178555611451565b5f85815260208120601f198616915b828110156147ac5788860151825594840194600190910190840161478d565b50858210156147c957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61ffff80881683528087166020840152508460408301526080606083015261480660808301848661461a565b979650505050505050565b61ffff86168152608060208201525f61482e60808301868861461a565b6001600160401b0394909416604083015250606001529392505050565b61ffff8916815260c060208201525f61486860c08301898b61461a565b6001600160401b038816604084015286606084015285608084015282810360a084015261489681858761461a565b9b9a5050505050505050505050565b6001600160401b038311156148bc576148bc614056565b6148d0836148ca83546145b2565b836146da565b5f601f841160018114614901575f85156148ea5750838201355b5f19600387901b1c1916600186901b178355610feb565b5f83815260208120601f198716915b828110156149305786850135825560209485019460019092019101614910565b508682101561494c575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6020828403121561496e575f80fd5b81516001600160401b03811115614983575f80fd5b8201601f81018413614993575f80fd5b80516149a16141138261409a565b8181528560208385010111156149b5575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b61ffff85168152608060208201525f6149ee6080830186613e7a565b6001600160401b038516604084015282810360608401526148068185613e7a565b8082028115828204841417610ed857610ed86145f3565b634e487b7160e01b5f52601260045260245ffd5b5f82614a4857614a48614a26565b500490565b5f60018201614a5e57614a5e6145f3565b5060010190565b61ffff861681526001600160a01b038516602082015260a0604082018190525f90614a9290830186613e7a565b84151560608401528281036080840152614aac8185613e7a565b98975050505050505050565b5f8060408385031215614ac9575f80fd5b505080516020909101519092909150565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215614afe575f80fd5b815161177a81613ed3565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614b595784516001600160a01b031683529383019391830191600101614b34565b50506001600160a01b03969096166060850152505050608001529392505050565b5f81518060208401855e5f93019283525090919050565b5f61177a8284614b7a565b61ffff8616815260a060208201525f614bb860a0830187613e7a565b6001600160401b03861660408401528281036060840152614bd98186613e7a565b90508281036080840152614aac8185613e7a565b5f61010061ffff8b168352806020840152614c0a8184018b613e7a565b6001600160401b038a166040850152606084018990526001600160a01b038816608085015260a0840187905283810360c08501529050614c4a8186613e7a565b9150508260e08301529998505050505050505050565b606081525f614c726060830186613e7a565b6001600160401b039490941660208301525060400152919050565b5f82614c9b57614c9b614a26565b500690565b61ffff8716815260c060208201525f614cbc60c0830188613e7a565b8281036040840152614cce8188613e7a565b6001600160a01b0387811660608601528616608085015283810360a08501529050614cf98185613e7a565b9998505050505050505050565b60ff60f81b8760f81b1681528560018201525f6001600160401b0360c01b808760c01b166021840152856029840152808560c01b16604984015250614aac6051830184614b7a56fea264697066735822122065e4e714942312a50e7b055ecc9955cf5da190d7e36a8a8e11e93260b7fec3f064736f6c63430008190033

Deployed Bytecode

0x6080604052600436106103d3575f3560e01c80638cfd8f5c116101ff578063bccb468711610113578063df2a5b3b116100a8578063eaffd49a11610078578063eaffd49a14610bef578063eb8d72b714610c0e578063f2fde38b14610c2d578063f5ecbdbc14610c4c578063fc0c546a14610c6b575f80fd5b8063df2a5b3b14610b6f578063e0bf7fd114610b8e578063e399a23f14610bbc578063e6a20ae614610bdb575f80fd5b8063cbed8b9c116100e3578063cbed8b9c14610b09578063cc1776d314610b28578063d1deba1f14610b3d578063dd62ed3e14610b50575f80fd5b8063bccb468714610a98578063c024666814610aad578063c04a541414610acc578063c446183414610af4575f80fd5b8063a457c2d711610194578063a9059cbb11610164578063a9059cbb146109e9578063b256f7b714610a08578063b353aaa714610a27578063b70143c914610a5a578063baf3292d14610a79575f80fd5b8063a457c2d71461096d578063a48138dd1461098c578063a4c51df5146109ab578063a6c3d165146109ca575f80fd5b806395d89b41116101cf57806395d89b41146108d65780639bdb9812146108ea5780639f38369a1461093a578063a208cd3f14610959575f80fd5b80638cfd8f5c146108515780638da5cb5b146108875780639358928b146108a3578063950c8a74146108b7575f80fd5b80633d8b38f6116102f65780635b8c41e61161028b578063715018a61161025b578063715018a6146107b95780637533d788146107cd57806375a0d4ac146107ec57806376203b481461080b578063857749b01461081e575f80fd5b80635b8c41e61461070657806366ad5c8a14610753578063695ef6bf1461077257806370a0823114610785575f80fd5b806349bd5a5e116102c657806349bd5a5e146106725780634c42899a146106bd5780634f7041a5146106d057806353371be0146106e5575f80fd5b80633d8b38f6146105f65780633f1f4fa41461061557806342d65a8d14610640578063447705151461065f575f80fd5b8063203e727e1161036c578063313ce5671161033c578063313ce56714610563578063365260b41461058457806339509351146105b85780633d5369f6146105d7575f80fd5b8063203e727e146104e757806323b872dd146105065780632bf5eabb146105255780632e5bb6ff14610544575f80fd5b8063095ea7b3116103a7578063095ea7b31461046c5780630df374831461048b57806310ddb137146104aa57806318160ddd146104c9575f80fd5b80621d3567146103d757806301ffc9a7146103f857806306fdde031461042c57806307e0db171461044d575b5f80fd5b3480156103e2575f80fd5b506103f66103f1366004613dc6565b610c7d565b005b348015610403575f80fd5b50610417610412366004613e53565b610ea8565b60405190151581526020015b60405180910390f35b348015610437575f80fd5b50610440610ede565b6040516104239190613ea8565b348015610458575f80fd5b506103f6610467366004613eba565b610f6e565b348015610477575f80fd5b50610417610486366004613ee7565b610ff2565b348015610496575f80fd5b506103f66104a5366004613f11565b611009565b3480156104b5575f80fd5b506103f66104c4366004613eba565b611027565b3480156104d4575f80fd5b506009545b604051908152602001610423565b3480156104f2575f80fd5b506103f6610501366004613f2b565b61107f565b348015610511575f80fd5b50610417610520366004613f42565b61108c565b348015610530575f80fd5b506103f661053f366004613f8f565b6110af565b34801561054f575f80fd5b506103f661055e366004613f2b565b6110d1565b34801561056e575f80fd5b5060125b60405160ff9091168152602001610423565b34801561058f575f80fd5b506105a361059e366004613fa8565b611170565b60408051928352602083019190915201610423565b3480156105c3575f80fd5b506104176105d2366004613ee7565b6111c3565b3480156105e2575f80fd5b506103f66105f1366004613f2b565b6111e4565b348015610601575f80fd5b50610417610610366004614008565b611235565b348015610620575f80fd5b506104d961062f366004613eba565b60036020525f908152604090205481565b34801561064b575f80fd5b506103f661065a366004614008565b6112fe565b34801561066a575f80fd5b506104d95f81565b34801561067d575f80fd5b506106a57f0000000000000000000000006754c773ea2bea5c16d9ecbb1afb481c3d50deb681565b6040516001600160a01b039091168152602001610423565b3480156106c8575f80fd5b506105725f81565b3480156106db575f80fd5b506104d9600d5481565b3480156106f0575f80fd5b5060145461041790640100000000900460ff1681565b348015610711575f80fd5b506104d96107203660046140c0565b600560209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561075e575f80fd5b506103f661076d366004613dc6565b61137f565b6103f661078036600461416f565b611459565b348015610790575f80fd5b506104d961079f3660046141dd565b6001600160a01b03165f9081526007602052604090205490565b3480156107c4575f80fd5b506103f66114c3565b3480156107d8575f80fd5b506104406107e7366004613eba565b6114d6565b3480156107f7575f80fd5b506103f66108063660046141dd565b61156d565b6103f66108193660046141f8565b6115a5565b348015610829575f80fd5b506105727f000000000000000000000000000000000000000000000000000000000000000881565b34801561085c575f80fd5b506104d961086b3660046142a3565b600260209081525f928352604080842090915290825290205481565b348015610892575f80fd5b505f546001600160a01b03166106a5565b3480156108ae575f80fd5b506104d9611652565b3480156108c2575f80fd5b506004546106a5906001600160a01b031681565b3480156108e1575f80fd5b50610440611661565b3480156108f5575f80fd5b506104176109043660046140c0565b600660209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205460ff1681565b348015610945575f80fd5b50610440610954366004613eba565b611670565b348015610964575f80fd5b506103f6611781565b348015610978575f80fd5b50610417610987366004613ee7565b6117f4565b348015610997575f80fd5b506103f66109a6366004613f2b565b61186e565b3480156109b6575f80fd5b506105a36109c53660046142d4565b61187b565b3480156109d5575f80fd5b506103f66109e4366004614008565b611907565b3480156109f4575f80fd5b50610417610a03366004613ee7565b61198f565b348015610a13575f80fd5b506103f6610a22366004613f8f565b61199c565b348015610a32575f80fd5b506106a57f0000000000000000000000003d9af337f6873b5a6e01e6727202e5752d1aac6181565b348015610a65575f80fd5b506103f6610a74366004613f2b565b6119c0565b348015610a84575f80fd5b506103f6610a933660046141dd565b6119d1565b348015610aa3575f80fd5b506104d960125481565b348015610ab8575f80fd5b506103f6610ac7366004614385565b611a2d565b348015610ad7575f80fd5b506014546106a5906501000000000090046001600160a01b031681565b348015610aff575f80fd5b506104d961271081565b348015610b14575f80fd5b506103f6610b233660046143af565b611a5f565b348015610b33575f80fd5b506104d9600e5481565b6103f6610b4b366004613dc6565b611ae4565b348015610b5b575f80fd5b506104d9610b6a366004614418565b611cf4565b348015610b7a575f80fd5b506103f6610b8936600461444f565b611d1e565b348015610b99575f80fd5b50610417610ba83660046141dd565b60156020525f908152604090205460ff1681565b348015610bc7575f80fd5b506103f6610bd6366004614488565b611d87565b348015610be6575f80fd5b50610572600181565b348015610bfa575f80fd5b506103f6610c093660046144a8565b611e02565b348015610c19575f80fd5b506103f6610c28366004614008565b611f1c565b348015610c38575f80fd5b506103f6610c473660046141dd565b611f75565b348015610c57575f80fd5b50610440610c66366004614568565b611feb565b348015610c76575f80fd5b50306106a5565b337f0000000000000000000000003d9af337f6873b5a6e01e6727202e5752d1aac616001600160a01b031614610cfa5760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff86165f9081526001602052604081208054610d17906145b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610d43906145b2565b8015610d8e5780601f10610d6557610100808354040283529160200191610d8e565b820191905f5260205f20905b815481529060010190602001808311610d7157829003601f168201915b50505050509050805186869050148015610da857505f8151115b8015610dd0575080516020820120604051610dc690889088906145e4565b6040518091039020145b610e2b5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610cf1565b610e9f8787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f9201919091525061209892505050565b50505050505050565b5f6001600160e01b03198216631f7ecdf760e01b1480610ed857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600a8054610eed906145b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610f19906145b2565b8015610f645780601f10610f3b57610100808354040283529160200191610f64565b820191905f5260205f20905b815481529060010190602001808311610f4757829003601f168201915b5050505050905090565b610f76612110565b6040516307e0db1760e01b815261ffff821660048201527f0000000000000000000000003d9af337f6873b5a6e01e6727202e5752d1aac616001600160a01b0316906307e0db17906024015b5f604051808303815f87803b158015610fd9575f80fd5b505af1158015610feb573d5f803e3d5ffd5b5050505050565b5f33610fff818585612169565b5060019392505050565b611011612110565b61ffff9091165f90815260036020526040902055565b61102f612110565b6040516310ddb13760e01b815261ffff821660048201527f0000000000000000000000003d9af337f6873b5a6e01e6727202e5752d1aac616001600160a01b0316906310ddb13790602401610fc2565b611087612110565b600c55565b5f3361109985828561228c565b6110a4858585612304565b506001949350505050565b6110b7612110565b601480549115156101000261ff0019909216919091179055565b80601154036110e757602d600d819055600e5550565b8060115460016110f79190614607565b10611109576028600d819055600e5550565b8060115460056111199190614607565b1061112b57601e600d819055600e5550565b80601154600b61113b9190614607565b1061114d576019600d819055600e5550565b80601154601861115d9190614607565b1061116d576016600d819055600e555b50565b5f806111b48888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061270492505050565b91509150965096945050505050565b5f33610fff8185856111d58383611cf4565b6111df9190614607565b612169565b6111ec612110565b5f81116112305760405162461bcd60e51b815260206004820152601260248201527143616e6e6f742073657420746f207a65726f60701b6044820152606401610cf1565b600f55565b61ffff83165f9081526001602052604081208054829190611255906145b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611281906145b2565b80156112cc5780601f106112a3576101008083540402835291602001916112cc565b820191905f5260205f20905b8154815290600101906020018083116112af57829003601f168201915b5050505050905083836040516112e39291906145e4565b60405180910390208180519060200120149150509392505050565b611306612110565b6040516342d65a8d60e01b81526001600160a01b037f0000000000000000000000003d9af337f6873b5a6e01e6727202e5752d1aac6116906342d65a8d9061135690869086908690600401614642565b5f604051808303815f87803b15801561136d575f80fd5b505af1158015610e9f573d5f803e3d5ffd5b3330146113dd5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610cf1565b6114518686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8901819004810282018101909252878152899350915087908790819084018382808284375f920191909152506127f392505050565b505050505050565b6114518585858561146d60208701876141dd565b61147d60408801602089016141dd565b61148a604089018961465f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061287892505050565b6114cb612110565b6114d45f61295d565b565b60016020525f9081526040902080546114ee906145b2565b80601f016020809104026020016040519081016040528092919081815260200182805461151a906145b2565b80156115655780601f1061153c57610100808354040283529160200191611565565b820191905f5260205f20905b81548152906001019060200180831161154857829003601f168201915b505050505081565b611575612110565b601480546001600160a01b03909216650100000000000265010000000000600160c81b0319909216919091179055565b6116478888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92506115f191505060208901896141dd565b61160160408a0160208b016141dd565b61160e60408b018b61465f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506129ac92505050565b505050505050505050565b5f61165c60095490565b905090565b6060600b8054610eed906145b2565b61ffff81165f90815260016020526040812080546060929190611692906145b2565b80601f01602080910402602001604051908101604052809291908181526020018280546116be906145b2565b80156117095780601f106116e057610100808354040283529160200191611709565b820191905f5260205f20905b8154815290600101906020018083116116ec57829003601f168201915b5050505050905080515f036117605760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610cf1565b61177a5f6014835161177291906146a1565b839190612aa5565b9392505050565b611789612110565b601454640100000000900460ff16156117d95760405162461bcd60e51b8152602060048201526012602482015271151c98591a5b99c81b9bdd081c185d5cd95960721b6044820152606401610cf1565b601480544360115564ff000000ff1916640100000001179055565b5f33816118018286611cf4565b9050838110156118615760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cf1565b6110a48286868403612169565b611876612110565b601055565b5f806118f58b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284375f92019190915250612bb192505050565b91509150995099975050505050505050565b61190f612110565b818130604051602001611924939291906146b4565b60408051601f1981840301815291815261ffff85165f9081526001602052209061194e908261471e565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161198293929190614642565b60405180910390a1505050565b5f33610fff818585612304565b6119a4612110565b60148054911515620100000262ff000019909216919091179055565b6119c8612110565b61116d81612c68565b6119d9612110565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b611a35612110565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b611a67612110565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000003d9af337f6873b5a6e01e6727202e5752d1aac61169063cbed8b9c90611abb90889088908890889088906004016147d9565b5f604051808303815f87803b158015611ad2575f80fd5b505af1158015611647573d5f803e3d5ffd5b61ffff86165f908152600560205260408082209051611b0690889088906145e4565b90815260408051602092819003830190206001600160401b0387165f9081529252902054905080611b855760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610cf1565b808383604051611b969291906145e4565b604051809103902014611bf55760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610cf1565b61ffff87165f908152600560205260408082209051611c1790899089906145e4565b90815260408051602092819003830181206001600160401b0389165f90815290845282902093909355601f88018290048202830182019052868252611cac91899189908990819084018382808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f920191909152506127f392505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611ce3959493929190614811565b60405180910390a150505050505050565b6001600160a01b039182165f90815260086020908152604080832093909416825291909152205490565b611d26612110565b61ffff8381165f8181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611982565b611d8f612110565b600a8211158015611da15750600a8111155b611ded5760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207365742074617865732061626f7665203130000000000000006044820152606401610cf1565b600d91909155600e556014805460ff19169055565b333014611e515760405162461bcd60e51b815260206004820152601f60248201527f4f4654436f72653a2063616c6c6572206d757374206265204f4654436f7265006044820152606401610cf1565b611e5c308686612e4e565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf86604051611e9e91815260200190565b60405180910390a3604051633fe79aed60e11b81526001600160a01b03861690637fcf35da908390611ee2908e908e908e908e908e908d908d908d9060040161484b565b5f604051808303815f88803b158015611ef9575f80fd5b5087f1158015611f0b573d5f803e3d5ffd5b505050505050505050505050505050565b611f24612110565b61ffff83165f908152600160205260409020611f418284836148a5565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161198293929190614642565b611f7d612110565b6001600160a01b038116611fe25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cf1565b61116d8161295d565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f0000000000000000000000003d9af337f6873b5a6e01e6727202e5752d1aac616001600160a01b03169063f5ecbdbc906084015f60405180830381865afa158015612068573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208f919081019061495e565b95945050505050565b5f806120fa5a60966366ad5c8a60e01b898989896040516024016120bf94939291906149d2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190612e9f565b9150915081611451576114518686868685612f23565b5f546001600160a01b031633146114d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cf1565b6001600160a01b0383166121cb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cf1565b6001600160a01b03821661222c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cf1565b6001600160a01b038381165f8181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f6122978484611cf4565b90505f1981146122fe57818110156122f15760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610cf1565b6122fe8484848403612169565b50505050565b5f81116123625760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e73666572206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610cf1565b601454640100000000900460ff166123e0575f546001600160a01b038481169116148061239b57505f546001600160a01b038381169116145b6123e05760405162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81b9bdd081858dd1a5d99481e595d60521b6044820152606401610cf1565b6014545f9060ff16156123f6576123f6436110d1565b7f0000000000000000000000006754c773ea2bea5c16d9ecbb1afb481c3d50deb66001600160a01b0316846001600160a01b031614801561244f57506001600160a01b0383165f9081526015602052604090205460ff16155b1561254c5760105482612476856001600160a01b03165f9081526007602052604090205490565b6124809190614607565b11156124c55760405162461bcd60e51b815260206004820152601460248201527313585e0815d85b1b195d08125b881159999958dd60621b6044820152606401610cf1565b600c5482111561250a5760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610cf1565b601454610100900460ff1615612537576064600d548361252a9190614a0f565b6125349190614a3a565b90505b60128054905f61254683614a4d565b91905055505b7f0000000000000000000000006754c773ea2bea5c16d9ecbb1afb481c3d50deb66001600160a01b0316836001600160a01b03161480156125a557506001600160a01b0384165f9081526015602052604090205460ff16155b1561261c57600c548211156125ef5760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610cf1565b601454610100900460ff161561261c576064600e548361260f9190614a0f565b6126199190614a3a565b90505b305f90815260076020526040902054600f548110801590819061264957506014546301000000900460ff16155b801561268757507f0000000000000000000000006754c773ea2bea5c16d9ecbb1afb481c3d50deb66001600160a01b0316866001600160a01b031614155b80156126ab57506001600160a01b0386165f9081526015602052604090205460ff16155b80156126ba5750601354601254115b156126ca576126ca600f54612c68565b82156126f9575f6126db84866146a1565b90506126e8873086612fbd565b6126f3878783612fbd565b50611451565b611451868686612fbd565b5f805f61274f8761271488613166565b604080515f6020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b60405163040a7bb160e41b81529091506001600160a01b037f0000000000000000000000003d9af337f6873b5a6e01e6727202e5752d1aac6116906340a7bb10906127a6908b90309086908b908b90600401614a65565b6040805180830381865afa1580156127c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127e49190614ab8565b92509250509550959350505050565b5f6127fe82826131eb565b905060ff81166128195761281485858585613246565b610feb565b5f1960ff82160161283057612814858585856132d4565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000006044820152606401610cf1565b5f612885878284816134d7565b61288e856135aa565b50905061289d888888846135e9565b90505f81116128ea5760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610cf1565b5f6128f88761271484613166565b905061290888828787873461361a565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161294991815260200190565b60405180910390a450979650505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6129c3896001846001600160401b0389166134d7565b6129cc876135aa565b5090506129db8a8a8a846135e9565b90505f8111612a285760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610cf1565b5f612a3e338a612a3785613166565b8a8a6137b7565b9050612a4e8a828787873461361a565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a85604051612a8f91815260200190565b60405180910390a4509998505050505050505050565b606081612ab381601f614607565b1015612af25760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610cf1565b612afc8284614607565b84511015612b405760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610cf1565b606082158015612b5e5760405191505f825260208201604052612ba8565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612b97578051835260209283019201612b7f565b5050858452601f01601f1916604052505b50949350505050565b5f805f612bc2338a612a378b613166565b60405163040a7bb160e41b81529091506001600160a01b037f0000000000000000000000003d9af337f6873b5a6e01e6727202e5752d1aac6116906340a7bb1090612c19908d90309086908b908b90600401614a65565b6040805180830381865afa158015612c33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c579190614ab8565b925092505097509795505050505050565b6014805463ff000000191663010000001790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110612cae57612cae614ada565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d4e9190614aee565b81600181518110612d6157612d61614ada565b60200260200101906001600160a01b031690816001600160a01b031681525050612dac307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612169565b60145460405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81169263791ac94792612e109287925f92889265010000000000909204909116904290600401614b09565b5f604051808303815f87803b158015612e27575f80fd5b505af1158015612e39573d5f803e3d5ffd5b50506014805463ff0000001916905550505050565b5f33306001600160a01b03861614801590612e7b5750806001600160a01b0316856001600160a01b031614155b15612e8b57612e8b85828561228c565b612e96858585612304565b50909392505050565b5f60605f805f8661ffff166001600160401b03811115612ec157612ec1614056565b6040519080825280601f01601f191660200182016040528015612eeb576020820181803683370190505b5090505f808751602089015f8d8df191503d925086831115612f0b578692505b828152825f602083013e909890975095505050505050565b818051906020012060055f8761ffff1661ffff1681526020019081526020015f2085604051612f529190614b91565b9081526040805191829003602090810183206001600160401b0388165f908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90612fae9087908790879087908790614b9c565b60405180910390a15050505050565b6001600160a01b0383166130215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cf1565b6001600160a01b0382166130835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cf1565b6001600160a01b0383165f90815260076020526040902054818110156130fa5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610cf1565b6001600160a01b038085165f8181526007602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906131599086815260200190565b60405180910390a36122fe565b5f806131927f00000000000000000000000000000000000000000000000000000002540be40084614a3a565b90506001600160401b03811115610ed85760405162461bcd60e51b815260206004820152601a60248201527f4f4654436f72653a20616d6f756e745344206f766572666c6f770000000000006044820152606401610cf1565b5f6131f7826001614607565b8351101561323d5760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b6044820152606401610cf1565b50016001015190565b5f80613251836137fd565b90925090506001600160a01b03821661326a5761dead91505b5f61327482613881565b90506132818784836138b5565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf836040516132c391815260200190565b60405180910390a350505050505050565b5f805f805f6132e2866138c7565b945094509450945094505f60065f8b61ffff1661ffff1681526020019081526020015f20896040516133149190614b91565b90815260408051602092819003830190206001600160401b038b165f908152925281205460ff16915061334685613881565b9050816133b2576133588b30836138b5565b61ffff8c165f9081526006602052604090819020905191925060019161337f908d90614b91565b90815260408051602092819003830190206001600160401b038d165f90815292529020805460ff19169115159190911790555b6001600160a01b0386163b613409576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a1505050505050506122fe565b8a8a8a8a8a8a868a5f8a613426578b6001600160401b0316613428565b5a5b90505f806134595a609663eaffd49a60e01b8e8e8e8d8d8d8d8d6040516024016120bf989796959493929190614bed565b9150915081156134b2578751602089012060405161ffff8d16907fb8890edbfc1c74692f527444645f95489c3703cc2df42e4a366f5d06fa6cd884906134a4908e908e908690614c60565b60405180910390a2506134bf565b6134bf8b8b8b8b85612f23565b50505050505050505050505050505050505050505050565b5f6134e18361397d565b61ffff8087165f90815260026020908152604080832093891683529290522054909150806135515760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610cf1565b61355b8382614607565b8210156114515760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610cf1565b5f806135d67f00000000000000000000000000000000000000000000000000000002540be40084614c8d565b90506135e281846146a1565b9150915091565b5f336001600160a01b03861681146136065761360686828561228c565b61361086846139d8565b5090949350505050565b61ffff86165f9081526001602052604081208054613637906145b2565b80601f0160208091040260200160405190810160405280929190818152602001828054613663906145b2565b80156136ae5780601f10613685576101008083540402835291602001916136ae565b820191905f5260205f20905b81548152906001019060200180831161369157829003601f168201915b5050505050905080515f0361371e5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610cf1565b613729878751613b0a565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000003d9af337f6873b5a6e01e6727202e5752d1aac61169063c5803100908490613780908b9086908c908c908c908c90600401614ca0565b5f604051808303818588803b158015613797575f80fd5b505af11580156137a9573d5f803e3d5ffd5b505050505050505050505050565b6060600185856001600160a01b03891685876040516020016137de96959493929190614d06565b604051602081830303815290604052905095945050505050565b505050565b5f808061380a84826131eb565b60ff1614801561381b575082516029145b6138625760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610cf1565b61386d83600d613b7a565b915061387a836021613bde565b9050915091565b5f610ed87f00000000000000000000000000000000000000000000000000000002540be4006001600160401b038416614a0f565b5f6138c08383613c3a565b5092915050565b5f808060608160016138d987836131eb565b60ff16146139245760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610cf1565b61392f86600d613b7a565b935061393c866021613bde565b9250613949866029613cf9565b9450613956866049613bde565b9050613972605180885161396a91906146a1565b889190612aa5565b915091939590929450565b5f6022825110156139d05760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610cf1565b506022015190565b6001600160a01b038216613a385760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cf1565b6001600160a01b0382165f9081526007602052604090205481811015613aab5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610cf1565b6001600160a01b0383165f8181526007602090815260408083208686039055600980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61ffff82165f9081526003602052604081205490819003613b2a57506127105b808211156137f85760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610cf1565b5f613b86826014614607565b83511015613bce5760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610cf1565b500160200151600160601b900490565b5f613bea826008614607565b83511015613c315760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b6044820152606401610cf1565b50016008015190565b6001600160a01b038216613c905760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610cf1565b8060095f828254613ca19190614607565b90915550506001600160a01b0382165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b5f613d05826020614607565b83511015613d4d5760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610cf1565b50016020015190565b803561ffff81168114613d67575f80fd5b919050565b5f8083601f840112613d7c575f80fd5b5081356001600160401b03811115613d92575f80fd5b602083019150836020828501011115613da9575f80fd5b9250929050565b80356001600160401b0381168114613d67575f80fd5b5f805f805f8060808789031215613ddb575f80fd5b613de487613d56565b955060208701356001600160401b0380821115613dff575f80fd5b613e0b8a838b01613d6c565b9097509550859150613e1f60408a01613db0565b94506060890135915080821115613e34575f80fd5b50613e4189828a01613d6c565b979a9699509497509295939492505050565b5f60208284031215613e63575f80fd5b81356001600160e01b03198116811461177a575f80fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61177a6020830184613e7a565b5f60208284031215613eca575f80fd5b61177a82613d56565b6001600160a01b038116811461116d575f80fd5b5f8060408385031215613ef8575f80fd5b8235613f0381613ed3565b946020939093013593505050565b5f8060408385031215613f22575f80fd5b613f0383613d56565b5f60208284031215613f3b575f80fd5b5035919050565b5f805f60608486031215613f54575f80fd5b8335613f5f81613ed3565b92506020840135613f6f81613ed3565b929592945050506040919091013590565b80358015158114613d67575f80fd5b5f60208284031215613f9f575f80fd5b61177a82613f80565b5f805f805f8060a08789031215613fbd575f80fd5b613fc687613d56565b95506020870135945060408701359350613fe260608801613f80565b925060808701356001600160401b03811115613ffc575f80fd5b613e4189828a01613d6c565b5f805f6040848603121561401a575f80fd5b61402384613d56565b925060208401356001600160401b0381111561403d575f80fd5b61404986828701613d6c565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561409257614092614056565b604052919050565b5f6001600160401b038211156140b2576140b2614056565b50601f01601f191660200190565b5f805f606084860312156140d2575f80fd5b6140db84613d56565b925060208401356001600160401b038111156140f5575f80fd5b8401601f81018613614105575f80fd5b80356141186141138261409a565b61406a565b81815287602083850101111561412c575f80fd5b816020840160208301375f6020838301015280945050505061415060408501613db0565b90509250925092565b5f60608284031215614169575f80fd5b50919050565b5f805f805f60a08688031215614183575f80fd5b853561418e81613ed3565b945061419c60208701613d56565b9350604086013592506060860135915060808601356001600160401b038111156141c4575f80fd5b6141d088828901614159565b9150509295509295909350565b5f602082840312156141ed575f80fd5b813561177a81613ed3565b5f805f805f805f8060e0898b03121561420f575f80fd5b883561421a81613ed3565b975061422860208a01613d56565b9650604089013595506060890135945060808901356001600160401b0380821115614251575f80fd5b61425d8c838d01613d6c565b909650945084915061427160a08c01613db0565b935060c08b0135915080821115614286575f80fd5b506142938b828c01614159565b9150509295985092959890939650565b5f80604083850312156142b4575f80fd5b6142bd83613d56565b91506142cb60208401613d56565b90509250929050565b5f805f805f805f805f60e08a8c0312156142ec575f80fd5b6142f58a613d56565b985060208a0135975060408a0135965060608a01356001600160401b038082111561431e575f80fd5b61432a8d838e01613d6c565b909850965086915061433e60808d01613db0565b955061434c60a08d01613f80565b945060c08c0135915080821115614361575f80fd5b5061436e8c828d01613d6c565b915080935050809150509295985092959850929598565b5f8060408385031215614396575f80fd5b82356143a181613ed3565b91506142cb60208401613f80565b5f805f805f608086880312156143c3575f80fd5b6143cc86613d56565b94506143da60208701613d56565b93506040860135925060608601356001600160401b038111156143fb575f80fd5b61440788828901613d6c565b969995985093965092949392505050565b5f8060408385031215614429575f80fd5b823561443481613ed3565b9150602083013561444481613ed3565b809150509250929050565b5f805f60608486031215614461575f80fd5b61446a84613d56565b925061447860208501613d56565b9150604084013590509250925092565b5f8060408385031215614499575f80fd5b50508035926020909101359150565b5f805f805f805f805f806101008b8d0312156144c2575f80fd5b6144cb8b613d56565b995060208b01356001600160401b03808211156144e6575f80fd5b6144f28e838f01613d6c565b909b50995089915061450660408e01613db0565b985060608d0135975060808d0135915061451f82613ed3565b90955060a08c0135945060c08c0135908082111561453b575f80fd5b506145488d828e01613d6c565b9150809450508092505060e08b013590509295989b9194979a5092959850565b5f805f806080858703121561457b575f80fd5b61458485613d56565b935061459260208601613d56565b925060408501356145a281613ed3565b9396929550929360600135925050565b600181811c908216806145c657607f821691505b60208210810361416957634e487b7160e01b5f52602260045260245ffd5b818382375f9101908152919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ed857610ed86145f3565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201525f61208f60408301848661461a565b5f808335601e19843603018112614674575f80fd5b8301803591506001600160401b0382111561468d575f80fd5b602001915036819003821315613da9575f80fd5b81810381811115610ed857610ed86145f3565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f8211156137f857805f5260205f20601f840160051c810160208510156146ff5750805b601f840160051c820191505b81811015610feb575f815560010161470b565b81516001600160401b0381111561473757614737614056565b61474b8161474584546145b2565b846146da565b602080601f83116001811461477e575f84156147675750858301515b5f19600386901b1c1916600185901b178555611451565b5f85815260208120601f198616915b828110156147ac5788860151825594840194600190910190840161478d565b50858210156147c957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61ffff80881683528087166020840152508460408301526080606083015261480660808301848661461a565b979650505050505050565b61ffff86168152608060208201525f61482e60808301868861461a565b6001600160401b0394909416604083015250606001529392505050565b61ffff8916815260c060208201525f61486860c08301898b61461a565b6001600160401b038816604084015286606084015285608084015282810360a084015261489681858761461a565b9b9a5050505050505050505050565b6001600160401b038311156148bc576148bc614056565b6148d0836148ca83546145b2565b836146da565b5f601f841160018114614901575f85156148ea5750838201355b5f19600387901b1c1916600186901b178355610feb565b5f83815260208120601f198716915b828110156149305786850135825560209485019460019092019101614910565b508682101561494c575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6020828403121561496e575f80fd5b81516001600160401b03811115614983575f80fd5b8201601f81018413614993575f80fd5b80516149a16141138261409a565b8181528560208385010111156149b5575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b61ffff85168152608060208201525f6149ee6080830186613e7a565b6001600160401b038516604084015282810360608401526148068185613e7a565b8082028115828204841417610ed857610ed86145f3565b634e487b7160e01b5f52601260045260245ffd5b5f82614a4857614a48614a26565b500490565b5f60018201614a5e57614a5e6145f3565b5060010190565b61ffff861681526001600160a01b038516602082015260a0604082018190525f90614a9290830186613e7a565b84151560608401528281036080840152614aac8185613e7a565b98975050505050505050565b5f8060408385031215614ac9575f80fd5b505080516020909101519092909150565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215614afe575f80fd5b815161177a81613ed3565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614b595784516001600160a01b031683529383019391830191600101614b34565b50506001600160a01b03969096166060850152505050608001529392505050565b5f81518060208401855e5f93019283525090919050565b5f61177a8284614b7a565b61ffff8616815260a060208201525f614bb860a0830187613e7a565b6001600160401b03861660408401528281036060840152614bd98186613e7a565b90508281036080840152614aac8185613e7a565b5f61010061ffff8b168352806020840152614c0a8184018b613e7a565b6001600160401b038a166040850152606084018990526001600160a01b038816608085015260a0840187905283810360c08501529050614c4a8186613e7a565b9150508260e08301529998505050505050505050565b606081525f614c726060830186613e7a565b6001600160401b039490941660208301525060400152919050565b5f82614c9b57614c9b614a26565b500690565b61ffff8716815260c060208201525f614cbc60c0830188613e7a565b8281036040840152614cce8188613e7a565b6001600160a01b0387811660608601528616608085015283810360a08501529050614cf98185613e7a565b9998505050505050505050565b60ff60f81b8760f81b1681528560018201525f6001600160401b0360c01b808760c01b166021840152856029840152808560c01b16604984015250614aac6051830184614b7a56fea264697066735822122065e4e714942312a50e7b055ecc9955cf5da190d7e36a8a8e11e93260b7fec3f064736f6c63430008190033

Deployed Bytecode Sourcemap

85894:6582:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43414:842;;;;;;;;;;-1:-1:-1;43414:842:0;;;;;:::i;:::-;;:::i;:::-;;65686:214;;;;;;;;;;-1:-1:-1;65686:214:0;;;;;:::i;:::-;;:::i;:::-;;;2029:14:1;;2022:22;2004:41;;1992:2;1977:18;65686:214:0;;;;;;;;72598:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47038:123::-;;;;;;;;;;-1:-1:-1;47038:123:0;;;;;:::i;:::-;;:::i;74958:201::-;;;;;;;;;;-1:-1:-1;74958:201:0;;;;;:::i;:::-;;:::i;48941:142::-;;;;;;;;;;-1:-1:-1;48941:142:0;;;;;:::i;:::-;;:::i;47169:129::-;;;;;;;;;;-1:-1:-1;47169:129:0;;;;;:::i;:::-;;:::i;73727:108::-;;;;;;;;;;-1:-1:-1;73815:12:0;;73727:108;;;3623:25:1;;;3611:2;3596:18;73727:108:0;3477:177:1;91619:110:0;;;;;;;;;;-1:-1:-1;91619:110:0;;;;;:::i;:::-;;:::i;75739:261::-;;;;;;;;;;-1:-1:-1;75739:261:0;;;;;:::i;:::-;;:::i;91950:93::-;;;;;;;;;;-1:-1:-1;91950:93:0;;;;;:::i;:::-;;:::i;90192:554::-;;;;;;;;;;-1:-1:-1;90192:554:0;;;;;:::i;:::-;;:::i;73569:93::-;;;;;;;;;;-1:-1:-1;73652:2:0;73569:93;;;4827:4:1;4815:17;;;4797:36;;4785:2;4770:18;73569:93:0;4655:184:1;65908:344:0;;;;;;;;;;-1:-1:-1;65908:344:0;;;;;:::i;:::-;;:::i;:::-;;;;5710:25:1;;;5766:2;5751:18;;5744:34;;;;5683:18;65908:344:0;5536:248:1;76409:238:0;;;;;;;;;;-1:-1:-1;76409:238:0;;;;;:::i;:::-;;:::i;91737:205::-;;;;;;;;;;-1:-1:-1;91737:205:0;;;;;:::i;:::-;;:::i;49181:250::-;;;;;;;;;;-1:-1:-1;49181:250:0;;;;;:::i;:::-;;:::i;42956:53::-;;;;;;;;;;-1:-1:-1;42956:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;47306:178;;;;;;;;;;-1:-1:-1;47306:178:0;;;;;:::i;:::-;;:::i;53024:37::-;;;;;;;;;;;;53060:1;53024:37;;86403:38;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6439:32:1;;;6421:51;;6409:2;6394:18;86403:38:0;6275:203:1;53090:33:0;;;;;;;;;;;;53122:1;53090:33;;86002:26;;;;;;;;;;;;;;;;86329;;;;;;;;;;-1:-1:-1;86329:26:0;;;;;;;;;;;50036:85;;;;;;;;;;-1:-1:-1;50036:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51359:389;;;;;;;;;;-1:-1:-1;51359:389:0;;;;;:::i;:::-;;:::i;64539:356::-;;;;;;:::i;:::-;;:::i;73898:127::-;;;;;;;;;;-1:-1:-1;73898:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;73999:18:0;73972:7;73999:18;;;:9;:18;;;;;;;73898:127;41527:103;;;;;;;;;;;;;:::i;42826:51::-;;;;;;;;;;-1:-1:-1;42826:51:0;;;;;:::i;:::-;;:::i;90754:143::-;;;;;;;;;;-1:-1:-1;90754:143:0;;;;;:::i;:::-;;:::i;64903:586::-;;;;;;:::i;:::-;;:::i;53181:37::-;;;;;;;;;;;;;;;42884:65;;;;;;;;;;-1:-1:-1;42884:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;40886:87;;;;;;;;;;-1:-1:-1;40932:7:0;40959:6;-1:-1:-1;;;;;40959:6:0;40886:87;;84353:112;;;;;;;;;;;;;:::i;43016:23::-;;;;;;;;;;-1:-1:-1;43016:23:0;;;;-1:-1:-1;;;;;43016:23:0;;;72817:104;;;;;;;;;;;;;:::i;53227:83::-;;;;;;;;;;-1:-1:-1;53227:83:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48135:330;;;;;;;;;;-1:-1:-1;48135:330:0;;;;;:::i;:::-;;:::i;92051:202::-;;;;;;;;;;;;;:::i;77150:436::-;;;;;;;;;;-1:-1:-1;77150:436:0;;;;;:::i;:::-;;:::i;91461:150::-;;;;;;;;;;-1:-1:-1;91461:150:0;;;;;:::i;:::-;;:::i;66260:450::-;;;;;;;;;;-1:-1:-1;66260:450:0;;;;;:::i;:::-;;:::i;47846:281::-;;;;;;;;;;-1:-1:-1;47846:281:0;;;;;:::i;:::-;;:::i;74231:193::-;;;;;;;;;;-1:-1:-1;74231:193:0;;;;;:::i;:::-;;:::i;92261:109::-;;;;;;;;;;-1:-1:-1;92261:109:0;;;;;:::i;:::-;;:::i;42773:46::-;;;;;;;;;;;;;;;92378:95;;;;;;;;;;-1:-1:-1;92378:95:0;;;;;:::i;:::-;;:::i;48473:136::-;;;;;;;;;;-1:-1:-1;48473:136:0;;;;;:::i;:::-;;:::i;86159:19::-;;;;;;;;;;;;;;;;91286:167;;;;;;;;;;-1:-1:-1;91286:167:0;;;;;:::i;:::-;;:::i;86364:32::-;;;;;;;;;;-1:-1:-1;86364:32:0;;;;;;;-1:-1:-1;;;;;86364:32:0;;;42709:55;;;;;;;;;;;;42759:5;42709:55;;46783:247;;;;;;;;;;-1:-1:-1;46783:247:0;;;;;:::i;:::-;;:::i;86035:27::-;;;;;;;;;;;;;;;;51977:810;;;;;;:::i;:::-;;:::i;74487:151::-;;;;;;;;;;-1:-1:-1;74487:151:0;;;;;:::i;:::-;;:::i;48617:262::-;;;;;;;;;;-1:-1:-1;48617:262:0;;;;;:::i;:::-;;:::i;86450:51::-;;;;;;;;;;-1:-1:-1;86450:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;90905:373;;;;;;;;;;-1:-1:-1;90905:373:0;;;;;:::i;:::-;;:::i;53130:42::-;;;;;;;;;;;;53171:1;53130:42;;54431:644;;;;;;;;;;-1:-1:-1;54431:644:0;;;;;:::i;:::-;;:::i;47631:207::-;;;;;;;;;;-1:-1:-1;47631:207:0;;;;;:::i;:::-;;:::i;41785:201::-;;;;;;;;;;-1:-1:-1;41785:201:0;;;;;:::i;:::-;;:::i;46467:254::-;;;;;;;;;;-1:-1:-1;46467:254:0;;;;;:::i;:::-;;:::i;84473:103::-;;;;;;;;;;-1:-1:-1;84563:4:0;84473:103;;43414:842;39517:10;43697;-1:-1:-1;;;;;43673:35:0;;43665:78;;;;-1:-1:-1;;;43665:78:0;;15906:2:1;43665:78:0;;;15888:21:1;15945:2;15925:18;;;15918:30;15984:32;15964:18;;;15957:60;16034:18;;43665:78:0;;;;;;;;;43785:32;;;43756:26;43785:32;;;:19;:32;;;;;43756:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44005:13;:20;43983:11;;:18;;:42;:70;;;;;44052:1;44029:13;:20;:24;43983:70;:124;;;;-1:-1:-1;44083:24:0;;;;;;44057:22;;;;44067:11;;;;44057:22;:::i;:::-;;;;;;;;:50;43983:124;43961:212;;;;-1:-1:-1;;;43961:212:0;;16926:2:1;43961:212:0;;;16908:21:1;16965:2;16945:18;;;16938:30;17004:34;16984:18;;;16977:62;-1:-1:-1;;;17055:18:1;;;17048:36;17101:19;;43961:212:0;16724:402:1;43961:212:0;44186:62;44205:11;44218;;44186:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44186:62:0;;;;;;;;;;;;;;;;;;;;;;44231:6;;-1:-1:-1;44186:62:0;-1:-1:-1;44239:8:0;;;;;;44186:62;;44239:8;;;;44186:62;;;;;;;;;-1:-1:-1;44186:18:0;;-1:-1:-1;;;44186:62:0:i;:::-;43588:668;43414:842;;;;;;:::o;65686:214::-;65788:4;-1:-1:-1;;;;;;65812:40:0;;-1:-1:-1;;;65812:40:0;;:80;;-1:-1:-1;;;;;;;;;;2753:40:0;;;65856:36;65805:87;65686:214;-1:-1:-1;;65686:214:0:o;72598:100::-;72652:13;72685:5;72678:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72598:100;:::o;47038:123::-;40772:13;:11;:13::i;:::-;47118:35:::1;::::0;-1:-1:-1;;;47118:35:0;;17305:6:1;17293:19;;47118:35:0::1;::::0;::::1;17275:38:1::0;47118:10:0::1;-1:-1:-1::0;;;;;47118:25:0::1;::::0;::::1;::::0;17248:18:1;;47118:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47038:123:::0;:::o;74958:201::-;75041:4;39517:10;75097:32;39517:10;75113:7;75122:6;75097:8;:32::i;:::-;-1:-1:-1;75147:4:0;;74958:201;-1:-1:-1;;;74958:201:0:o;48941:142::-;40772:13;:11;:13::i;:::-;49032:35:::1;::::0;;::::1;;::::0;;;:22:::1;:35;::::0;;;;:43;48941:142::o;47169:129::-;40772:13;:11;:13::i;:::-;47252:38:::1;::::0;-1:-1:-1;;;47252:38:0;;17305:6:1;17293:19;;47252:38:0::1;::::0;::::1;17275::1::0;47252:10:0::1;-1:-1:-1::0;;;;;47252:28:0::1;::::0;::::1;::::0;17248:18:1;;47252:38:0::1;17131:188:1::0;91619:110:0;40772:13;:11;:13::i;:::-;91697:11:::1;:24:::0;91619:110::o;75739:261::-;75836:4;39517:10;75894:38;75910:4;39517:10;75925:6;75894:15;:38::i;:::-;75943:27;75953:4;75959:2;75963:6;75943:9;:27::i;:::-;-1:-1:-1;75988:4:0;;75739:261;-1:-1:-1;;;;75739:261:0:o;91950:93::-;40772:13;:11;:13::i;:::-;92014:11:::1;:21:::0;;;::::1;;;;-1:-1:-1::0;;92014:21:0;;::::1;::::0;;;::::1;::::0;;91950:93::o;90192:554::-;90260:6;90246:10;;:20;90242:497;;90292:2;90283:6;:11;;;90309:7;:12;90192:554;:::o;90242:497::-;90361:6;90343:10;;90356:1;90343:14;;;;:::i;:::-;:24;90339:400;;90393:2;90384:6;:11;;;90410:7;:12;90192:554;:::o;90339:400::-;90462:6;90444:10;;90457:1;90444:14;;;;:::i;:::-;:24;90440:299;;90494:2;90485:6;:11;;;90511:7;:12;90192:554;:::o;90440:299::-;90564:6;90545:10;;90558:2;90545:15;;;;:::i;:::-;:25;90541:198;;90596:2;90587:6;:11;;;90613:7;:12;90192:554;:::o;90541:198::-;90666:6;90647:10;;90660:2;90647:15;;;;:::i;:::-;:25;90643:96;;90698:2;90689:6;:11;;;90715:7;:12;90643:96;90192:554;:::o;65908:344::-;66122:14;66138:11;66169:75;66186:11;66199:10;66211:7;66220;66229:14;;66169:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66169:16:0;;-1:-1:-1;;;66169:75:0:i;:::-;66162:82;;;;65908:344;;;;;;;;;:::o;76409:238::-;76497:4;39517:10;76553:64;39517:10;76569:7;76606:10;76578:25;39517:10;76569:7;76578:9;:25::i;:::-;:38;;;;:::i;:::-;76553:8;:64::i;91737:205::-;40772:13;:11;:13::i;:::-;91864:1:::1;91849:12;:16;91841:47;;;::::0;-1:-1:-1;;;91841:47:0;;17788:2:1;91841:47:0::1;::::0;::::1;17770:21:1::0;17827:2;17807:18;;;17800:30;-1:-1:-1;;;17846:18:1;;;17839:48;17904:18;;91841:47:0::1;17586:342:1::0;91841:47:0::1;91899:20;:35:::0;91737:205::o;49181:250::-;49323:32;;;49277:4;49323:32;;;:19;:32;;;;;49294:61;;49277:4;;49323:32;49294:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49411:11;;49401:22;;;;;;;:::i;:::-;;;;;;;;49383:13;49373:24;;;;;;:50;49366:57;;;49181:250;;;;;:::o;47306:178::-;40772:13;:11;:13::i;:::-;47421:55:::1;::::0;-1:-1:-1;;;47421:55:0;;-1:-1:-1;;;;;47421:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;47451:11;;47464;;;;47421:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;51359:389:::0;39517:10;51616:4;51592:29;51584:80;;;;-1:-1:-1;;;51584:80:0;;18737:2:1;51584:80:0;;;18719:21:1;18776:2;18756:18;;;18749:30;18815:34;18795:18;;;18788:62;-1:-1:-1;;;18866:18:1;;;18859:36;18912:19;;51584:80:0;18535:402:1;51584:80:0;51675:65;51697:11;51710;;51675:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51675:65:0;;;;;;;;;;;;;;;;;;;;;;51723:6;;-1:-1:-1;51675:65:0;-1:-1:-1;51731:8:0;;;;;;51675:65;;51731:8;;;;51675:65;;;;;;;;;-1:-1:-1;51675:21:0;;-1:-1:-1;;;51675:65:0:i;:::-;51359:389;;;;;;:::o;64539:356::-;64756:131;64762:5;64769:11;64782:10;64794:7;64803:25;;;;:11;:25;:::i;:::-;64830:29;;;;;;;;:::i;:::-;64861:25;;;;:11;:25;:::i;:::-;64756:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64756:5:0;;-1:-1:-1;;;64756:131:0:i;41527:103::-;40772:13;:11;:13::i;:::-;41592:30:::1;41619:1;41592:18;:30::i;:::-;41527:103::o:0;42826:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;90754:143::-;40772:13;:11;:13::i;:::-;90848:17:::1;:41:::0;;-1:-1:-1;;;;;90848:41:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;90848:41:0;;::::1;::::0;;;::::1;::::0;;90754:143::o;64903:586::-;65189:292;65216:5;65236:11;65262:10;65287:7;65309:8;;65189:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65332:14:0;;-1:-1:-1;65361:25:0;;-1:-1:-1;;65361:25:0;;;:11;:25;:::i;:::-;65401:29;;;;;;;;:::i;:::-;65445:25;;;;:11;:25;:::i;:::-;65189:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65189:12:0;;-1:-1:-1;;;65189:292:0:i;:::-;;64903:586;;;;;;;;:::o;84353:112::-;84420:4;84444:13;73815:12;;;73727:108;84444:13;84437:20;;84353:112;:::o;72817:104::-;72873:13;72906:7;72899:14;;;;;:::i;48135:330::-;48259:35;;;48239:17;48259:35;;;:19;:35;;;;;48239:55;;48214:12;;48239:17;48259:35;48239:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48313:4;:11;48328:1;48313:16;48305:58;;;;-1:-1:-1;;;48305:58:0;;19930:2:1;48305:58:0;;;19912:21:1;19969:2;19949:18;;;19942:30;20008:31;19988:18;;;19981:59;20057:18;;48305:58:0;19728:353:1;48305:58:0;48381:31;48392:1;48409:2;48395:4;:11;:16;;;;:::i;:::-;48381:4;;:31;:10;:31::i;:::-;48374:38;48135:330;-1:-1:-1;;;48135:330:0:o;92051:202::-;40772:13;:11;:13::i;:::-;92113:14:::1;::::0;;;::::1;;;92112:15;92104:46;;;::::0;-1:-1:-1;;;92104:46:0;;20421:2:1;92104:46:0::1;::::0;::::1;20403:21:1::0;20460:2;20440:18;;;20433:30;-1:-1:-1;;;20479:18:1;;;20472:48;20537:18;;92104:46:0::1;20219:342:1::0;92104:46:0::1;92161:14;:21:::0;;92206:12:::1;92193:10;:25:::0;-1:-1:-1;;92229:16:0;;;;;92051:202::o;77150:436::-;77243:4;39517:10;77243:4;77326:25;39517:10;77343:7;77326:9;:25::i;:::-;77299:52;;77390:15;77370:16;:35;;77362:85;;;;-1:-1:-1;;;77362:85:0;;20768:2:1;77362:85:0;;;20750:21:1;20807:2;20787:18;;;20780:30;20846:34;20826:18;;;20819:62;-1:-1:-1;;;20897:18:1;;;20890:35;20942:19;;77362:85:0;20566:401:1;77362:85:0;77483:60;77492:5;77499:7;77527:15;77508:16;:34;77483:8;:60::i;91461:150::-;40772:13;:11;:13::i;:::-;91567:15:::1;:36:::0;91461:150::o;66260:450::-;66547:14;66563:11;66594:108;66618:11;66631:10;66643:7;66652:8;;66594:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66594:108:0;;;;;;;;;;;;;;;;;;;;;;66662:14;;-1:-1:-1;66678:7:0;;-1:-1:-1;66594:108:0;66687:14;;;;;;66594:108;;66687:14;;;;66594:108;;;;;;;;;-1:-1:-1;66594:23:0;;-1:-1:-1;;;66594:108:0:i;:::-;66587:115;;;;66260:450;;;;;;;;;;;;:::o;47846:281::-;40772:13;:11;:13::i;:::-;48018:14:::1;;48042:4;48001:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;48001:47:0;;::::1;::::0;;;;;;47963:35:::1;::::0;::::1;;::::0;;;:19:::1;48001:47;47963:35:::0;;;:85:::1;::::0;:35;:85:::1;:::i;:::-;;48064:55;48088:14;48104;;48064:55;;;;;;;;:::i;:::-;;;;;;;;47846:281:::0;;;:::o;74231:193::-;74310:4;39517:10;74366:28;39517:10;74383:2;74387:6;74366:9;:28::i;92261:109::-;40772:13;:11;:13::i;:::-;92333::::1;:29:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;92333:29:0;;::::1;::::0;;;::::1;::::0;;92261:109::o;92378:95::-;40772:13;:11;:13::i;:::-;92445:20:::1;92457:7;92445:11;:20::i;48473:136::-:0;40772:13;:11;:13::i;:::-;48543:8:::1;:20:::0;;-1:-1:-1;;;;;;48543:20:0::1;-1:-1:-1::0;;;;;48543:20:0;::::1;::::0;;::::1;::::0;;;48579:22:::1;::::0;6421:51:1;;;48579:22:0::1;::::0;6409:2:1;6394:18;48579:22:0::1;;;;;;;48473:136:::0;:::o;91286:167::-;40772:13;:11;:13::i;:::-;-1:-1:-1;;;;;91402:29:0;;;::::1;;::::0;;;:19:::1;:29;::::0;;;;:43;;-1:-1:-1;;91402:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;91286:167::o;46783:247::-;40772:13;:11;:13::i;:::-;46960:62:::1;::::0;-1:-1:-1;;;46960:62:0;;-1:-1:-1;;;;;46960:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;46981:8;;46991;;47001:11;;47014:7;;;;46960:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;51977:810:::0;52231:27;;;52209:19;52231:27;;;:14;:27;;;;;;:40;;;;52259:11;;;;52231:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52231:48:0;;;;;;;;;;;;-1:-1:-1;52231:48:0;52290:73;;;;-1:-1:-1;;;52290:73:0;;24206:2:1;52290:73:0;;;24188:21:1;24245:2;24225:18;;;24218:30;24284:34;24264:18;;;24257:62;-1:-1:-1;;;24335:18:1;;;24328:33;24378:19;;52290:73:0;24004:399:1;52290:73:0;52405:11;52392:8;;52382:19;;;;;;;:::i;:::-;;;;;;;;:34;52374:80;;;;-1:-1:-1;;;52374:80:0;;24610:2:1;52374:80:0;;;24592:21:1;24649:2;24629:18;;;24622:30;24688:34;24668:18;;;24661:62;-1:-1:-1;;;24739:18:1;;;24732:31;24780:19;;52374:80:0;24408:397:1;52374:80:0;52502:27;;;52561:1;52502:27;;;:14;:27;;;;;;:40;;;;52530:11;;;;52502:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52502:48:0;;;;;;;;;;;;:61;;;;52632:65;;;;;;;;;;;;;;;;;;;52654:11;;52667;;52632:65;;;;;;52667:11;52632:65;;52667:11;52632:65;;;;;;;;;-1:-1:-1;;52632:65:0;;;;;;;;;;;;;;;;;;;;;;52680:6;;-1:-1:-1;52632:65:0;-1:-1:-1;52688:8:0;;;;;;52632:65;;52688:8;;;;52632:65;;;;;;;;;-1:-1:-1;52632:21:0;;-1:-1:-1;;;52632:65:0:i;:::-;52713:66;52733:11;52746;;52759:6;52767:11;52713:66;;;;;;;;;;:::i;:::-;;;;;;;;52153:634;51977:810;;;;;;:::o;74487:151::-;-1:-1:-1;;;;;74603:18:0;;;74576:7;74603:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;74487:151::o;48617:262::-;40772:13;:11;:13::i;:::-;48757:28:::1;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;48824:47;;25531:34:1;;;25581:18;;25574:43;;;;25633:18;;;25626:34;;;48824:47:0::1;::::0;25494:2:1;25479:18;48824:47:0::1;25308:358:1::0;90905:373:0;40772:13;:11;:13::i;:::-;91083:2:::1;91062:17;:23;;:51;;;;;91111:2;91089:18;:24;;91062:51;91040:126;;;::::0;-1:-1:-1;;;91040:126:0;;25873:2:1;91040:126:0::1;::::0;::::1;25855:21:1::0;25912:2;25892:18;;;25885:30;25951:27;25931:18;;;25924:55;25996:18;;91040:126:0::1;25671:349:1::0;91040:126:0::1;91177:6;:26:::0;;;;91214:7:::1;:28:::0;91253:9:::1;:17:::0;;-1:-1:-1;;91253:17:0::1;::::0;;90905:373::o;54431:644::-;39517:10;54743:4;54719:29;54711:73;;;;-1:-1:-1;;;54711:73:0;;26227:2:1;54711:73:0;;;26209:21:1;26266:2;26246:18;;;26239:30;26305:33;26285:18;;;26278:61;26356:18;;54711:73:0;26025:355:1;54711:73:0;54824:42;54846:4;54853:3;54858:7;54824:13;:42::i;:::-;54814:52;;54912:3;-1:-1:-1;;;;;54882:43:0;54899:11;54882:43;;;54917:7;54882:43;;;;3623:25:1;;3611:2;3596:18;;3477:177;54882:43:0;;;;;;;;54955:112;;-1:-1:-1;;;54955:112:0;;-1:-1:-1;;;;;54955:34:0;;;;;54995:11;;54955:112;;55008:11;;55021;;;;55034:6;;55042:5;;55049:7;;55058:8;;;;54955:112;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54431:644;;;;;;;;;;:::o;47631:207::-;40772:13;:11;:13::i;:::-;47732:35:::1;::::0;::::1;;::::0;;;:19:::1;:35;::::0;;;;:43:::1;47770:5:::0;;47732:35;:43:::1;:::i;:::-;;47791:39;47808:14;47824:5;;47791:39;;;;;;;;:::i;41785:201::-:0;40772:13;:11;:13::i;:::-;-1:-1:-1;;;;;41874:22:0;::::1;41866:73;;;::::0;-1:-1:-1;;;41866:73:0;;28544:2:1;41866:73:0::1;::::0;::::1;28526:21:1::0;28583:2;28563:18;;;28556:30;28622:34;28602:18;;;28595:62;-1:-1:-1;;;28673:18:1;;;28666:36;28719:19;;41866:73:0::1;28342:402:1::0;41866:73:0::1;41950:28;41969:8;41950:18;:28::i;46467:254::-:0;46645:68;;-1:-1:-1;;;46645:68:0;;28986:6:1;29019:15;;;46645:68:0;;;29001:34:1;29071:15;;29051:18;;;29044:43;46694:4:0;29103:18:1;;;29096:60;29172:18;;;29165:34;;;46613:12:0;;46645:10;-1:-1:-1;;;;;46645:20:0;;;;28948:19:1;;46645:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46645:68:0;;;;;;;;;;;;:::i;:::-;46638:75;46467:254;-1:-1:-1;;;;;46467:254:0:o;50405:563::-;50598:12;50612:19;50635:203;50683:9;50707:3;50748:34;;;50784:11;50797;50810:6;50818:8;50725:102;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;50725:102:0;;;;;;;;;;;;;;-1:-1:-1;;;;;50725:102:0;-1:-1:-1;;;;;;50725:102:0;;;;;;;;;;50643:4;;50635:203;;:33;:203::i;:::-;50597:241;;;;50854:7;50849:112;;50878:71;50898:11;50911;50924:6;50932:8;50942:6;50878:19;:71::i;41051:132::-;40932:7;40959:6;-1:-1:-1;;;;;40959:6:0;39517:10;41115:23;41107:68;;;;-1:-1:-1;;;41107:68:0;;30640:2:1;41107:68:0;;;30622:21:1;;;30659:18;;;30652:30;30718:34;30698:18;;;30691:62;30770:18;;41107:68:0;30438:356:1;81143:346:0;-1:-1:-1;;;;;81245:19:0;;81237:68;;;;-1:-1:-1;;;81237:68:0;;31001:2:1;81237:68:0;;;30983:21:1;31040:2;31020:18;;;31013:30;31079:34;31059:18;;;31052:62;-1:-1:-1;;;31130:18:1;;;31123:34;31174:19;;81237:68:0;30799:400:1;81237:68:0;-1:-1:-1;;;;;81324:21:0;;81316:68;;;;-1:-1:-1;;;81316:68:0;;31406:2:1;81316:68:0;;;31388:21:1;31445:2;31425:18;;;31418:30;31484:34;31464:18;;;31457:62;-1:-1:-1;;;31535:18:1;;;31528:32;31577:19;;81316:68:0;31204:398:1;81316:68:0;-1:-1:-1;;;;;81397:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;81449:32;;3623:25:1;;;81449:32:0;;3596:18:1;81449:32:0;;;;;;;81143:346;;;:::o;81780:419::-;81881:24;81908:25;81918:5;81925:7;81908:9;:25::i;:::-;81881:52;;-1:-1:-1;;81948:16:0;:37;81944:248;;82030:6;82010:16;:26;;82002:68;;;;-1:-1:-1;;;82002:68:0;;31809:2:1;82002:68:0;;;31791:21:1;31848:2;31828:18;;;31821:30;31887:31;31867:18;;;31860:59;31936:18;;82002:68:0;31607:353:1;82002:68:0;82114:51;82123:5;82130:7;82158:6;82139:16;:25;82114:8;:51::i;:::-;81870:329;81780:419;;;:::o;87719:1776::-;87860:1;87851:6;:10;87843:61;;;;-1:-1:-1;;;87843:61:0;;32167:2:1;87843:61:0;;;32149:21:1;32206:2;32186:18;;;32179:30;32245:34;32225:18;;;32218:62;-1:-1:-1;;;32296:18:1;;;32289:36;32342:19;;87843:61:0;31965:402:1;87843:61:0;87922:14;;;;;;;87917:115;;40932:7;40959:6;-1:-1:-1;;;;;87961:15:0;;;40959:6;;87961:15;;:32;;-1:-1:-1;40932:7:0;40959:6;-1:-1:-1;;;;;87980:13:0;;;40959:6;;87980:13;87961:32;87953:67;;;;-1:-1:-1;;;87953:67:0;;32574:2:1;87953:67:0;;;32556:21:1;32613:2;32593:18;;;32586:30;-1:-1:-1;;;32632:18:1;;;32625:52;32694:18;;87953:67:0;32372:346:1;87953:67:0;88078:9;;88044:17;;88078:9;;88074:62;;;88104:20;88111:12;88104:6;:20::i;:::-;88160:13;-1:-1:-1;;;;;88152:21:0;:4;-1:-1:-1;;;;;88152:21:0;;:49;;;;-1:-1:-1;;;;;;88178:23:0;;;;;;:19;:23;;;;;;;;88177:24;88152:49;88148:394;;;88270:15;;88260:6;88244:13;88254:2;-1:-1:-1;;;;;73999:18:0;73972:7;73999:18;;;:9;:18;;;;;;;73898:127;88244:13;:22;;;;:::i;:::-;:41;;88218:123;;;;-1:-1:-1;;;88218:123:0;;32925:2:1;88218:123:0;;;32907:21:1;32964:2;32944:18;;;32937:30;-1:-1:-1;;;32983:18:1;;;32976:50;33043:18;;88218:123:0;32723:344:1;88218:123:0;88374:11;;88364:6;:21;;88356:50;;;;-1:-1:-1;;;88356:50:0;;33274:2:1;88356:50:0;;;33256:21:1;33313:2;33293:18;;;33286:30;-1:-1:-1;;;33332:18:1;;;33325:46;33388:18;;88356:50:0;33072:340:1;88356:50:0;88425:11;;;;;;;88421:87;;;88489:3;88479:6;;88470;:15;;;;:::i;:::-;88469:23;;;;:::i;:::-;88457:35;;88421:87;88524:4;:6;;;:4;:6;;;:::i;:::-;;;;;;88148:394;88564:13;-1:-1:-1;;;;;88558:19:0;:2;-1:-1:-1;;;;;88558:19:0;;:49;;;;-1:-1:-1;;;;;;88582:25:0;;;;;;:19;:25;;;;;;;;88581:26;88558:49;88554:234;;;88642:11;;88632:6;:21;;88624:50;;;;-1:-1:-1;;;88624:50:0;;33274:2:1;88624:50:0;;;33256:21:1;33313:2;33293:18;;;33286:30;-1:-1:-1;;;33332:18:1;;;33325:46;33388:18;;88624:50:0;33072:340:1;88624:50:0;88693:11;;;;;;;88689:88;;;88758:3;88747:7;;88738:6;:16;;;;:::i;:::-;88737:24;;;;:::i;:::-;88725:36;;88689:88;88849:4;88800:28;73999:18;;;:9;:18;;;;;;88919:20;;88895:44;;;;;;;88970:49;;-1:-1:-1;89007:12:0;;;;;;;89006:13;88970:49;:87;;;;;89044:13;-1:-1:-1;;;;;89036:21:0;:4;-1:-1:-1;;;;;89036:21:0;;;88970:87;:130;;;;-1:-1:-1;;;;;;89075:25:0;;;;;;:19;:25;;;;;;;;89074:26;88970:130;:169;;;;;89124:15;;89117:4;;:22;88970:169;88952:259;;;89166:33;89178:20;;89166:11;:33::i;:::-;89227:13;;89223:265;;89257:18;89278;89287:9;89278:6;:18;:::i;:::-;89257:39;;89311:47;89327:4;89341;89348:9;89311:15;:47::i;:::-;89373:37;89389:4;89395:2;89399:10;89373:15;:37::i;:::-;89242:180;89223:265;;;89443:33;89459:4;89465:2;89469:6;89443:15;:33::i;55269:471::-;55475:14;55491:11;55559:20;55582:47;55601:10;55613:15;55620:7;55613:6;:15::i;:::-;61958:48;;;53122:1;61958:48;;;40542:49:1;40607:11;;;40600:27;;;;40683:3;40661:16;;;;-1:-1:-1;;;;;;40657:51:1;40643:12;;;40636:73;61958:48:0;;;;;;;;;40725:12:1;;;;61958:48:0;;;61829:185;55582:47;55647:85;;-1:-1:-1;;;55647:85:0;;55559:70;;-1:-1:-1;;;;;;55647:10:0;:23;;;;:85;;55671:11;;55692:4;;55559:70;;55708:7;;55717:14;;55647:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55640:92;;;;;55269:471;;;;;;;;:::o;56346:558::-;56541:16;56560:19;:8;56541:16;56560;:19::i;:::-;56541:38;-1:-1:-1;56596:21:0;;;56592:305;;56634:52;56643:11;56656;56669:6;56677:8;56634;:52::i;:::-;56592:305;;;-1:-1:-1;;56708:30:0;;;;56704:193;;56755:59;56771:11;56784;56797:6;56805:8;56755:15;:59::i;56704:193::-;56847:38;;-1:-1:-1;;;56847:38:0;;35086:2:1;56847:38:0;;;35068:21:1;35125:2;35105:18;;;35098:30;35164;35144:18;;;35137:58;35212:18;;56847:38:0;34884:352:1;56912:840:0;57181:11;57205:66;57220:11;57181;57242:14;57181:11;57205:14;:66::i;:::-;57297:20;57309:7;57297:11;:20::i;:::-;-1:-1:-1;57284:33:0;-1:-1:-1;57337:50:0;57348:5;57355:11;57368:10;57284:33;57337:10;:50::i;:::-;57328:59;;57455:1;57446:6;:10;57438:48;;;;-1:-1:-1;;;57438:48:0;;35443:2:1;57438:48:0;;;35425:21:1;35482:2;35462:18;;;35455:30;-1:-1:-1;;;35501:18:1;;;35494:55;35566:18;;57438:48:0;35241:349:1;57438:48:0;57499:22;57524:46;57543:10;57555:14;57562:6;57555;:14::i;57524:46::-;57499:71;;57581:94;57589:11;57602:9;57613:14;57629:18;57649:14;57665:9;57581:7;:94::i;:::-;57725:10;57718:5;-1:-1:-1;;;;;57693:51:0;57705:11;57693:51;;;57737:6;57693:51;;;;3623:25:1;;3611:2;3596:18;;3477:177;57693:51:0;;;;;;;;57194:558;56912:840;;;;;;;;;:::o;42146:191::-;42220:16;42239:6;;-1:-1:-1;;;;;42256:17:0;;;-1:-1:-1;;;;;;42256:17:0;;;;;;42289:40;;42239:6;;;;;;;42289:40;;42220:16;42289:40;42209:128;42146:191;:::o;58225:995::-;58565:11;58589:77;58604:11;53171:1;58635:14;-1:-1:-1;;;;;58589:77:0;;:14;:77::i;:::-;58692:20;58704:7;58692:11;:20::i;:::-;-1:-1:-1;58679:33:0;-1:-1:-1;58732:50:0;58743:5;58750:11;58763:10;58679:33;58732:10;:50::i;:::-;58723:59;;58810:1;58801:6;:10;58793:48;;;;-1:-1:-1;;;58793:48:0;;35443:2:1;58793:48:0;;;35425:21:1;35482:2;35462:18;;;35455:30;-1:-1:-1;;;35501:18:1;;;35494:55;35566:18;;58793:48:0;35241:349:1;58793:48:0;58922:22;58947:91;58973:10;58985;58997:14;59004:6;58997;:14::i;:::-;59013:8;59023:14;58947:25;:91::i;:::-;58922:116;;59049:94;59057:11;59070:9;59081:14;59097:18;59117:14;59133:9;59049:7;:94::i;:::-;59193:10;59186:5;-1:-1:-1;;;;;59161:51:0;59173:11;59161:51;;;59205:6;59161:51;;;;3623:25:1;;3611:2;3596:18;;3477:177;59161:51:0;;;;;;;;58578:642;58225:995;;;;;;;;;;;:::o;20551:2833::-;20671:12;20720:7;20704:12;20720:7;20714:2;20704:12;:::i;:::-;:23;;20696:50;;;;-1:-1:-1;;;20696:50:0;;35797:2:1;20696:50:0;;;35779:21:1;35836:2;35816:18;;;35809:30;-1:-1:-1;;;35855:18:1;;;35848:44;35909:18;;20696:50:0;35595:338:1;20696:50:0;20782:16;20791:7;20782:6;:16;:::i;:::-;20765:6;:13;:33;;20757:63;;;;-1:-1:-1;;;20757:63:0;;36140:2:1;20757:63:0;;;36122:21:1;36179:2;36159:18;;;36152:30;-1:-1:-1;;;36198:18:1;;;36191:47;36255:18;;20757:63:0;35938:341:1;20757:63:0;20833:22;20899:15;;20928:2005;;;;23077:4;23071:11;23058:24;;23266:1;23255:9;23248:20;23316:4;23305:9;23301:20;23295:4;23288:34;20892:2445;;20928:2005;21113:4;21107:11;21094:24;;21782:2;21773:7;21769:16;22170:9;22163:17;22157:4;22153:28;22141:9;22130;22126:25;22122:60;22219:7;22215:2;22211:16;22476:6;22462:9;22455:17;22449:4;22445:28;22433:9;22425:6;22421:22;22417:57;22413:70;22247:434;22510:3;22506:2;22503:11;22247:434;;;22652:9;;22641:21;;22552:4;22544:13;;;;22585;22247:434;;;-1:-1:-1;;22701:26:0;;;22913:2;22896:11;-1:-1:-1;;22892:25:0;22886:4;22879:39;-1:-1:-1;20892:2445:0;-1:-1:-1;23367:9:0;20551:2833;-1:-1:-1;;;;20551:2833:0:o;55748:590::-;56025:14;56041:11;56112:20;56135:92;56161:10;56173;56185:15;56192:7;56185:6;:15::i;56135:92::-;56245:85;;-1:-1:-1;;;56245:85:0;;56112:115;;-1:-1:-1;;;;;;56245:10:0;:23;;;;:85;;56269:11;;56290:4;;56112:115;;56306:7;;56315:14;;56245:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56238:92;;;;;55748:590;;;;;;;;;;:::o;89503:681::-;86544:12;:19;;-1:-1:-1;;86544:19:0;;;;;89671:16:::1;::::0;;89685:1:::1;89671:16:::0;;;;;::::1;::::0;;-1:-1:-1;;89671:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;89671:16:0::1;89647:40;;89716:4;89698;89703:1;89698:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;89698:23:0::1;;;-1:-1:-1::0;;;;;89698:23:0::1;;;::::0;::::1;89742:15;-1:-1:-1::0;;;;;89742:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;89732:4;89737:1;89732:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;89732:32:0::1;;;-1:-1:-1::0;;;;;89732:32:0::1;;;::::0;::::1;89777:122;89808:4;89836:15;89867:21;89777:8;:122::i;:::-;90118:17;::::0;89938:238:::1;::::0;-1:-1:-1;;;89938:238:0;;-1:-1:-1;;;;;89938:15:0::1;:66:::0;::::1;::::0;::::1;::::0;:238:::1;::::0;90019:21;;90055:1:::1;::::0;90099:4;;90118:17;;;::::1;::::0;;::::1;::::0;90150:15:::1;::::0;89938:238:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;86586:12:0;:20;;-1:-1:-1;;86586:20:0;;;-1:-1:-1;;;;89503:681:0:o;85321:425::-;85455:4;39517:10;85605:4;-1:-1:-1;;;;;85588:22:0;;;;;;:42;;;85623:7;-1:-1:-1;;;;;85614:16:0;:5;-1:-1:-1;;;;;85614:16:0;;;85588:42;85584:88;;;85632:40;85648:5;85655:7;85664;85632:15;:40::i;:::-;85683:30;85693:5;85700:3;85705:7;85683:9;:30::i;:::-;-1:-1:-1;85731:7:0;;85321:425;-1:-1:-1;;;85321:425:0:o;6600:1309::-;6759:4;6765:12;6827;6850:13;6874:24;6911:8;6901:19;;-1:-1:-1;;;;;6901:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6901:19:0;;6874:46;;7430:1;7400;7362:9;7356:16;7323:4;7312:9;7308:20;7273:1;7234:7;7204:4;7181:275;7169:287;;7525:16;7514:27;;7570:8;7561:7;7558:21;7555:78;;;7610:8;7599:19;;7555:78;7720:7;7707:11;7700:28;7842:7;7839:1;7832:4;7819:11;7815:22;7800:50;7879:8;;;;-1:-1:-1;6600:1309:0;-1:-1:-1;;;;;;6600:1309:0:o;50976:375::-;51252:8;51242:19;;;;;;51191:14;:27;51206:11;51191:27;;;;;;;;;;;;;;;51219:11;51191:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51191:48:0;;;;;;;;;:70;;;;51277:66;;;;51291:11;;51304;;51232:6;;51325:8;;51335:7;;51277:66;:::i;:::-;;;;;;;;50976:375;;;;;:::o;78056:806::-;-1:-1:-1;;;;;78153:18:0;;78145:68;;;;-1:-1:-1;;;78145:68:0;;38993:2:1;78145:68:0;;;38975:21:1;39032:2;39012:18;;;39005:30;39071:34;39051:18;;;39044:62;-1:-1:-1;;;39122:18:1;;;39115:35;39167:19;;78145:68:0;38791:401:1;78145:68:0;-1:-1:-1;;;;;78232:16:0;;78224:64;;;;-1:-1:-1;;;78224:64:0;;39399:2:1;78224:64:0;;;39381:21:1;39438:2;39418:18;;;39411:30;39477:34;39457:18;;;39450:62;-1:-1:-1;;;39528:18:1;;;39521:33;39571:19;;78224:64:0;39197:399:1;78224:64:0;-1:-1:-1;;;;;78374:15:0;;78352:19;78374:15;;;:9;:15;;;;;;78408:21;;;;78400:72;;;;-1:-1:-1;;;78400:72:0;;39803:2:1;78400:72:0;;;39785:21:1;39842:2;39822:18;;;39815:30;39881:34;39861:18;;;39854:62;-1:-1:-1;;;39932:18:1;;;39925:36;39978:19;;78400:72:0;39601:402:1;78400:72:0;-1:-1:-1;;;;;78508:15:0;;;;;;;:9;:15;;;;;;78526:20;;;78508:38;;78726:13;;;;;;;;;;:23;;;;;;78778:26;;;;;;78540:6;3623:25:1;;3611:2;3596:18;;3477:177;78778:26:0;;;;;;;;78817:37;82799:91;61264:238;61325:6;;61360:22;85840:9;61360:7;:22;:::i;:::-;61344:38;-1:-1:-1;;;;;;61401:28:0;;;61393:67;;;;-1:-1:-1;;;61393:67:0;;40210:2:1;61393:67:0;;;40192:21:1;40249:2;40229:18;;;40222:30;40288:28;40268:18;;;40261:56;40334:18;;61393:67:0;40008:350:1;23760:307:0;23834:5;23877:10;:6;23886:1;23877:10;:::i;:::-;23860:6;:13;:27;;23852:59;;;;-1:-1:-1;;;23852:59:0;;40950:2:1;23852:59:0;;;40932:21:1;40989:2;40969:18;;;40962:30;-1:-1:-1;;;41008:18:1;;;41001:49;41067:18;;23852:59:0;40748:343:1;23852:59:0;-1:-1:-1;23991:29:0;24007:3;23991:29;23985:36;;23760:307::o;57760:457::-;57915:10;57927:15;57946:28;57965:8;57946:18;:28::i;:::-;57914:60;;-1:-1:-1;57914:60:0;-1:-1:-1;;;;;;57989:16:0;;57985:69;;58035:6;58022:20;;57985:69;58066:11;58080:16;58087:8;58080:6;:16::i;:::-;58066:30;;58116:34;58126:11;58139:2;58143:6;58116:9;:34::i;:::-;58107:43;;58198:2;-1:-1:-1;;;;;58168:41:0;58185:11;58168:41;;;58202:6;58168:41;;;;3623:25:1;;3611:2;3596:18;;3477:177;58168:41:0;;;;;;;;57903:314;;;57760:457;;;;:::o;59228:1902::-;59409:12;59423:10;59435:15;59452:27;59481:17;59502:35;59528:8;59502:25;:35::i;:::-;59408:129;;;;;;;;;;59550:13;59566:15;:28;59582:11;59566:28;;;;;;;;;;;;;;;59595:11;59566:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59566:49:0;;;;;;;;;;;;;;-1:-1:-1;59640:16:0;59647:8;59640:6;:16::i;:::-;59626:30;;59784:8;59779:167;;59818:45;59828:11;59849:4;59856:6;59818:9;:45::i;:::-;59878:28;;;;;;;:15;:28;;;;;;;:41;;59809:54;;-1:-1:-1;59930:4:0;;59878:41;;59907:11;;59878:41;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59878:49:0;;;;;;;;;;:56;;-1:-1:-1;;59878:56:0;;;;;;;;;;59779:167;-1:-1:-1;;;;;61224:20:0;;;59958:97;;60000:22;;-1:-1:-1;;;;;6439:32:1;;6421:51;;60000:22:0;;6409:2:1;6394:18;60000:22:0;;;;;;;60037:7;;;;;;;;;59958:97;60129:11;60177;60214:6;60254:8;60289:4;60318:2;60346:6;60394:14;60109:17;60479:8;:33;;60502:10;-1:-1:-1;;;;;60479:33:0;;;;60490:9;60479:33;60468:44;;60524:12;60538:19;60561:230;60609:9;60633:3;60674:31;;;60707:10;60719;60731:5;60738;60745:3;60750:7;60759:15;60776:3;60651:129;;;;;;;;;;;;;;;:::i;60561:230::-;60523:268;;;;60808:7;60804:319;;;60847:18;;;;;;60885:59;;;;;;;;;;60920:10;;60932:5;;60847:18;;60885:59;:::i;:::-;;;;;;;;60817:139;60804:319;;;61044:67;61064:10;61076;61088:5;61095:7;61104:6;61044:19;:67::i;:::-;59397:1733;;;;;;;;;;;;;;;;;;59228:1902;;;;:::o;45210:463::-;45389:21;45413:28;45426:14;45413:12;:28::i;:::-;45471;;;;45452:16;45471:28;;;:15;:28;;;;;;;;:35;;;;;;;;;;45389:52;;-1:-1:-1;45525:15:0;45517:54;;;;-1:-1:-1;;;45517:54:0;;42582:2:1;45517:54:0;;;42564:21:1;42621:2;42601:18;;;42594:30;42660:28;42640:18;;;42633:56;42706:18;;45517:54:0;42380:350:1;45517:54:0;45610:23;45624:9;45610:11;:23;:::i;:::-;45590:16;:43;;45582:83;;;;-1:-1:-1;;;45582:83:0;;42937:2:1;45582:83:0;;;42919:21:1;42976:2;42956:18;;;42949:30;43015:29;42995:18;;;42988:57;43062:18;;45582:83:0;42735:351:1;61639:182:0;61705:16;;61752:22;85840:9;61752:7;:22;:::i;:::-;61745:29;-1:-1:-1;61799:14:0;61745:29;61799:7;:14;:::i;:::-;61785:28;;61639:182;;;:::o;84770:329::-;84914:4;39517:10;-1:-1:-1;;;;;84976:16:0;;;;84972:62;;84994:40;85010:5;85017:7;85026;84994:15;:40::i;:::-;85045:21;85051:5;85058:7;85045:5;:21::i;:::-;-1:-1:-1;85084:7:0;;84770:329;-1:-1:-1;;;;84770:329:0:o;44588:614::-;44872:32;;;44843:26;44872:32;;;:19;:32;;;;;44843:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44923:13;:20;44947:1;44923:25;44915:86;;;;-1:-1:-1;;;44915:86:0;;43410:2:1;44915:86:0;;;43392:21:1;43449:2;43429:18;;;43422:30;43488:34;43468:18;;;43461:62;-1:-1:-1;;;43539:18:1;;;43532:46;43595:19;;44915:86:0;43208:412:1;44915:86:0;45012:47;45030:11;45043:8;:15;45012:17;:47::i;:::-;45070:124;;-1:-1:-1;;;45070:124:0;;-1:-1:-1;;;;;45070:10:0;:15;;;;45093:10;;45070:124;;45105:11;;45118:13;;45133:8;;45143:14;;45159:18;;45179:14;;45070:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44832:370;44588:614;;;;;;:::o;62373:366::-;62590:12;53171:1;62657:10;62669:9;-1:-1:-1;;;;;63524:23:0;;62706:14;62722:8;62622:109;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62615:116;;62373:366;;;;;;;:::o;82799:91::-;;;;:::o;62022:343::-;62104:10;;;62152:19;:8;62104:10;62152:16;:19::i;:::-;:30;;;:55;;;;;62186:8;:15;62205:2;62186:21;62152:55;62144:92;;;;-1:-1:-1;;;62144:92:0;;45297:2:1;62144:92:0;;;45279:21:1;45336:2;45316:18;;;45309:30;-1:-1:-1;;;45355:18:1;;;45348:54;45419:18;;62144:92:0;45095:348:1;62144:92:0;62254:22;:8;62273:2;62254:18;:22::i;:::-;62249:27;-1:-1:-1;62336:21:0;:8;62354:2;62336:17;:21::i;:::-;62325:32;;62022:343;;;:::o;61510:121::-;61575:4;61599:24;85840:9;-1:-1:-1;;;;;61599:24:0;;;:::i;85107:206::-;85237:4;85254:26;85260:10;85272:7;85254:5;:26::i;:::-;-1:-1:-1;85298:7:0;85107:206;-1:-1:-1;;85107:206:0:o;62747:658::-;62886:12;;;62968:20;62886:12;53171:1;63059:19;:8;62886:12;63059:16;:19::i;:::-;:39;;;63051:76;;;;-1:-1:-1;;;63051:76:0;;45297:2:1;63051:76:0;;;45279:21:1;45336:2;45316:18;;;45309:30;-1:-1:-1;;;45355:18:1;;;45348:54;45419:18;;63051:76:0;45095:348:1;63051:76:0;63145:22;:8;63164:2;63145:18;:22::i;:::-;63140:27;-1:-1:-1;63227:21:0;:8;63245:2;63227:17;:21::i;:::-;63216:32;-1:-1:-1;63266:22:0;:8;63285:2;63266:18;:22::i;:::-;63259:29;-1:-1:-1;63315:21:0;:8;63333:2;63315:17;:21::i;:::-;63299:37;;63357:40;63372:2;63394;63376:8;:15;:20;;;;:::i;:::-;63357:8;;:40;:14;:40::i;:::-;63347:50;;62747:658;;;;;;;:::o;45681:271::-;45763:13;45822:2;45797:14;:21;:27;;45789:68;;;;-1:-1:-1;;;45789:68:0;;45650:2:1;45789:68:0;;;45632:21:1;45689:2;45669:18;;;45662:30;45728;45708:18;;;45701:58;45776:18;;45789:68:0;45448:352:1;45789:68:0;-1:-1:-1;45930:2:0;45910:23;45904:30;;45681:271::o;80030:675::-;-1:-1:-1;;;;;80114:21:0;;80106:67;;;;-1:-1:-1;;;80106:67:0;;46007:2:1;80106:67:0;;;45989:21:1;46046:2;46026:18;;;46019:30;46085:34;46065:18;;;46058:62;-1:-1:-1;;;46136:18:1;;;46129:31;46177:19;;80106:67:0;45805:397:1;80106:67:0;-1:-1:-1;;;;;80273:18:0;;80248:22;80273:18;;;:9;:18;;;;;;80310:24;;;;80302:71;;;;-1:-1:-1;;;80302:71:0;;46409:2:1;80302:71:0;;;46391:21:1;46448:2;46428:18;;;46421:30;46487:34;46467:18;;;46460:62;-1:-1:-1;;;46538:18:1;;;46531:32;46580:19;;80302:71:0;46207:398:1;80302:71:0;-1:-1:-1;;;;;80409:18:0;;;;;;:9;:18;;;;;;;;80430:23;;;80409:44;;80548:12;:22;;;;;;;80599:37;3623:25:1;;;80409:18:0;;;80599:37;;3596:18:1;80599:37:0;;;;;;;82799:91;;;:::o;45960:402::-;46083:35;;;46059:21;46083:35;;;:22;:35;;;;;;;46133:21;;;46129:138;;-1:-1:-1;42759:5:0;46129:138;46301:16;46285:12;:32;;46277:77;;;;-1:-1:-1;;;46277:77:0;;46812:2:1;46277:77:0;;;46794:21:1;;;46831:18;;;46824:30;46890:34;46870:18;;;46863:62;46942:18;;46277:77:0;46610:356:1;23392:360:0;23468:7;23513:11;:6;23522:2;23513:11;:::i;:::-;23496:6;:13;:28;;23488:62;;;;-1:-1:-1;;;23488:62:0;;47173:2:1;23488:62:0;;;47155:21:1;47212:2;47192:18;;;47185:30;-1:-1:-1;;;47231:18:1;;;47224:51;47292:18;;23488:62:0;46971:345:1;23488:62:0;-1:-1:-1;23642:30:0;23658:4;23642:30;23636:37;-1:-1:-1;;;23632:71:0;;;23392:360::o;24713:311::-;24788:6;24832:10;:6;24841:1;24832:10;:::i;:::-;24815:6;:13;:27;;24807:60;;;;-1:-1:-1;;;24807:60:0;;47523:2:1;24807:60:0;;;47505:21:1;47562:2;47542:18;;;47535:30;-1:-1:-1;;;47581:18:1;;;47574:50;47641:18;;24807:60:0;47321:344:1;24807:60:0;-1:-1:-1;24948:29:0;24964:3;24948:29;24942:36;;24713:311::o;79149:548::-;-1:-1:-1;;;;;79233:21:0;;79225:65;;;;-1:-1:-1;;;79225:65:0;;47872:2:1;79225:65:0;;;47854:21:1;47911:2;47891:18;;;47884:30;47950:33;47930:18;;;47923:61;48001:18;;79225:65:0;47670:355:1;79225:65:0;79381:6;79365:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;79536:18:0;;;;;;:9;:18;;;;;;;;:28;;;;;;79591:37;3623:25:1;;;79591:37:0;;3596:18:1;79591:37:0;;;;;;;79149:548;;:::o;25996:326::-;26072:7;26117:11;:6;26126:2;26117:11;:::i;:::-;26100:6;:13;:28;;26092:62;;;;-1:-1:-1;;;26092:62:0;;48232:2:1;26092:62:0;;;48214:21:1;48271:2;48251:18;;;48244:30;-1:-1:-1;;;48290:18:1;;;48283:51;48351:18;;26092:62:0;48030:345:1;26092:62:0;-1:-1:-1;26242:30:0;26258:4;26242:30;26236:37;;25996:326::o;14:159:1:-;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:347::-;229:8;239:6;293:3;286:4;278:6;274:17;270:27;260:55;;311:1;308;301:12;260:55;-1:-1:-1;334:20:1;;-1:-1:-1;;;;;366:30:1;;363:50;;;409:1;406;399:12;363:50;446:4;438:6;434:17;422:29;;498:3;491:4;482:6;474;470:19;466:30;463:39;460:59;;;515:1;512;505:12;460:59;178:347;;;;;:::o;530:171::-;597:20;;-1:-1:-1;;;;;646:30:1;;636:41;;626:69;;691:1;688;681:12;706:862;812:6;820;828;836;844;852;905:3;893:9;884:7;880:23;876:33;873:53;;;922:1;919;912:12;873:53;945:28;963:9;945:28;:::i;:::-;935:38;;1024:2;1013:9;1009:18;996:32;-1:-1:-1;;;;;1088:2:1;1080:6;1077:14;1074:34;;;1104:1;1101;1094:12;1074:34;1143:58;1193:7;1184:6;1173:9;1169:22;1143:58;:::i;:::-;1220:8;;-1:-1:-1;1117:84:1;-1:-1:-1;1117:84:1;;-1:-1:-1;1274:37:1;1307:2;1292:18;;1274:37;:::i;:::-;1264:47;;1364:2;1353:9;1349:18;1336:32;1320:48;;1393:2;1383:8;1380:16;1377:36;;;1409:1;1406;1399:12;1377:36;;1448:60;1500:7;1489:8;1478:9;1474:24;1448:60;:::i;:::-;706:862;;;;-1:-1:-1;706:862:1;;-1:-1:-1;706:862:1;;1527:8;;706:862;-1:-1:-1;;;706:862:1:o;1573:286::-;1631:6;1684:2;1672:9;1663:7;1659:23;1655:32;1652:52;;;1700:1;1697;1690:12;1652:52;1726:23;;-1:-1:-1;;;;;;1778:32:1;;1768:43;;1758:71;;1825:1;1822;1815:12;2056:289;2098:3;2136:5;2130:12;2163:6;2158:3;2151:19;2219:6;2212:4;2205:5;2201:16;2194:4;2189:3;2185:14;2179:47;2271:1;2264:4;2255:6;2250:3;2246:16;2242:27;2235:38;2334:4;2327:2;2323:7;2318:2;2310:6;2306:15;2302:29;2297:3;2293:39;2289:50;2282:57;;;2056:289;;;;:::o;2350:220::-;2499:2;2488:9;2481:21;2462:4;2519:45;2560:2;2549:9;2545:18;2537:6;2519:45;:::i;2575:184::-;2633:6;2686:2;2674:9;2665:7;2661:23;2657:32;2654:52;;;2702:1;2699;2692:12;2654:52;2725:28;2743:9;2725:28;:::i;2764:131::-;-1:-1:-1;;;;;2839:31:1;;2829:42;;2819:70;;2885:1;2882;2875:12;2900:315;2968:6;2976;3029:2;3017:9;3008:7;3004:23;3000:32;2997:52;;;3045:1;3042;3035:12;2997:52;3084:9;3071:23;3103:31;3128:5;3103:31;:::i;:::-;3153:5;3205:2;3190:18;;;;3177:32;;-1:-1:-1;;;2900:315:1:o;3220:252::-;3287:6;3295;3348:2;3336:9;3327:7;3323:23;3319:32;3316:52;;;3364:1;3361;3354:12;3316:52;3387:28;3405:9;3387:28;:::i;3659:180::-;3718:6;3771:2;3759:9;3750:7;3746:23;3742:32;3739:52;;;3787:1;3784;3777:12;3739:52;-1:-1:-1;3810:23:1;;3659:180;-1:-1:-1;3659:180:1:o;3844:456::-;3921:6;3929;3937;3990:2;3978:9;3969:7;3965:23;3961:32;3958:52;;;4006:1;4003;3996:12;3958:52;4045:9;4032:23;4064:31;4089:5;4064:31;:::i;:::-;4114:5;-1:-1:-1;4171:2:1;4156:18;;4143:32;4184:33;4143:32;4184:33;:::i;:::-;3844:456;;4236:7;;-1:-1:-1;;;4290:2:1;4275:18;;;;4262:32;;3844:456::o;4305:160::-;4370:20;;4426:13;;4419:21;4409:32;;4399:60;;4455:1;4452;4445:12;4470:180;4526:6;4579:2;4567:9;4558:7;4554:23;4550:32;4547:52;;;4595:1;4592;4585:12;4547:52;4618:26;4634:9;4618:26;:::i;4844:687::-;4946:6;4954;4962;4970;4978;4986;5039:3;5027:9;5018:7;5014:23;5010:33;5007:53;;;5056:1;5053;5046:12;5007:53;5079:28;5097:9;5079:28;:::i;:::-;5069:38;;5154:2;5143:9;5139:18;5126:32;5116:42;;5205:2;5194:9;5190:18;5177:32;5167:42;;5228:35;5259:2;5248:9;5244:18;5228:35;:::i;:::-;5218:45;;5314:3;5303:9;5299:19;5286:33;-1:-1:-1;;;;;5334:6:1;5331:30;5328:50;;;5374:1;5371;5364:12;5328:50;5413:58;5463:7;5454:6;5443:9;5439:22;5413:58;:::i;5789:481::-;5867:6;5875;5883;5936:2;5924:9;5915:7;5911:23;5907:32;5904:52;;;5952:1;5949;5942:12;5904:52;5975:28;5993:9;5975:28;:::i;:::-;5965:38;;6054:2;6043:9;6039:18;6026:32;-1:-1:-1;;;;;6073:6:1;6070:30;6067:50;;;6113:1;6110;6103:12;6067:50;6152:58;6202:7;6193:6;6182:9;6178:22;6152:58;:::i;:::-;5789:481;;6229:8;;-1:-1:-1;6126:84:1;;-1:-1:-1;;;;5789:481:1:o;6483:127::-;6544:10;6539:3;6535:20;6532:1;6525:31;6575:4;6572:1;6565:15;6599:4;6596:1;6589:15;6615:275;6686:2;6680:9;6751:2;6732:13;;-1:-1:-1;;6728:27:1;6716:40;;-1:-1:-1;;;;;6771:34:1;;6807:22;;;6768:62;6765:88;;;6833:18;;:::i;:::-;6869:2;6862:22;6615:275;;-1:-1:-1;6615:275:1:o;6895:186::-;6943:4;-1:-1:-1;;;;;6968:6:1;6965:30;6962:56;;;6998:18;;:::i;:::-;-1:-1:-1;7064:2:1;7043:15;-1:-1:-1;;7039:29:1;7070:4;7035:40;;6895:186::o;7086:815::-;7170:6;7178;7186;7239:2;7227:9;7218:7;7214:23;7210:32;7207:52;;;7255:1;7252;7245:12;7207:52;7278:28;7296:9;7278:28;:::i;:::-;7268:38;;7357:2;7346:9;7342:18;7329:32;-1:-1:-1;;;;;7376:6:1;7373:30;7370:50;;;7416:1;7413;7406:12;7370:50;7439:22;;7492:4;7484:13;;7480:27;-1:-1:-1;7470:55:1;;7521:1;7518;7511:12;7470:55;7557:2;7544:16;7582:48;7598:31;7626:2;7598:31;:::i;:::-;7582:48;:::i;:::-;7653:2;7646:5;7639:17;7693:7;7688:2;7683;7679;7675:11;7671:20;7668:33;7665:53;;;7714:1;7711;7704:12;7665:53;7769:2;7764;7760;7756:11;7751:2;7744:5;7740:14;7727:45;7813:1;7808:2;7803;7796:5;7792:14;7788:23;7781:34;7834:5;7824:15;;;;;7858:37;7891:2;7880:9;7876:18;7858:37;:::i;:::-;7848:47;;7086:815;;;;;:::o;8088:160::-;8153:5;8198:2;8189:6;8184:3;8180:16;8176:25;8173:45;;;8214:1;8211;8204:12;8173:45;-1:-1:-1;8236:6:1;8088:160;-1:-1:-1;8088:160:1:o;8253:709::-;8377:6;8385;8393;8401;8409;8462:3;8450:9;8441:7;8437:23;8433:33;8430:53;;;8479:1;8476;8469:12;8430:53;8518:9;8505:23;8537:31;8562:5;8537:31;:::i;:::-;8587:5;-1:-1:-1;8611:37:1;8644:2;8629:18;;8611:37;:::i;:::-;8601:47;;8695:2;8684:9;8680:18;8667:32;8657:42;;8746:2;8735:9;8731:18;8718:32;8708:42;;8801:3;8790:9;8786:19;8773:33;-1:-1:-1;;;;;8821:6:1;8818:30;8815:50;;;8861:1;8858;8851:12;8815:50;8884:72;8948:7;8939:6;8928:9;8924:22;8884:72;:::i;:::-;8874:82;;;8253:709;;;;;;;;:::o;8967:247::-;9026:6;9079:2;9067:9;9058:7;9054:23;9050:32;9047:52;;;9095:1;9092;9085:12;9047:52;9134:9;9121:23;9153:31;9178:5;9153:31;:::i;9442:1091::-;9594:6;9602;9610;9618;9626;9634;9642;9650;9703:3;9691:9;9682:7;9678:23;9674:33;9671:53;;;9720:1;9717;9710:12;9671:53;9759:9;9746:23;9778:31;9803:5;9778:31;:::i;:::-;9828:5;-1:-1:-1;9852:37:1;9885:2;9870:18;;9852:37;:::i;:::-;9842:47;;9936:2;9925:9;9921:18;9908:32;9898:42;;9987:2;9976:9;9972:18;9959:32;9949:42;;10042:3;10031:9;10027:19;10014:33;-1:-1:-1;;;;;10107:2:1;10099:6;10096:14;10093:34;;;10123:1;10120;10113:12;10093:34;10162:58;10212:7;10203:6;10192:9;10188:22;10162:58;:::i;:::-;10239:8;;-1:-1:-1;10136:84:1;-1:-1:-1;10136:84:1;;-1:-1:-1;10293:38:1;10326:3;10311:19;;10293:38;:::i;:::-;10283:48;;10384:3;10373:9;10369:19;10356:33;10340:49;;10414:2;10404:8;10401:16;10398:36;;;10430:1;10427;10420:12;10398:36;;10453:74;10519:7;10508:8;10497:9;10493:24;10453:74;:::i;:::-;10443:84;;;9442:1091;;;;;;;;;;;:::o;10538:256::-;10604:6;10612;10665:2;10653:9;10644:7;10640:23;10636:32;10633:52;;;10681:1;10678;10671:12;10633:52;10704:28;10722:9;10704:28;:::i;:::-;10694:38;;10751:37;10784:2;10773:9;10769:18;10751:37;:::i;:::-;10741:47;;10538:256;;;;;:::o;10799:1069::-;10929:6;10937;10945;10953;10961;10969;10977;10985;10993;11046:3;11034:9;11025:7;11021:23;11017:33;11014:53;;;11063:1;11060;11053:12;11014:53;11086:28;11104:9;11086:28;:::i;:::-;11076:38;;11161:2;11150:9;11146:18;11133:32;11123:42;;11212:2;11201:9;11197:18;11184:32;11174:42;;11267:2;11256:9;11252:18;11239:32;-1:-1:-1;;;;;11331:2:1;11323:6;11320:14;11317:34;;;11347:1;11344;11337:12;11317:34;11386:58;11436:7;11427:6;11416:9;11412:22;11386:58;:::i;:::-;11463:8;;-1:-1:-1;11360:84:1;-1:-1:-1;11360:84:1;;-1:-1:-1;11517:38:1;11550:3;11535:19;;11517:38;:::i;:::-;11507:48;;11574:36;11605:3;11594:9;11590:19;11574:36;:::i;:::-;11564:46;;11663:3;11652:9;11648:19;11635:33;11619:49;;11693:2;11683:8;11680:16;11677:36;;;11709:1;11706;11699:12;11677:36;;11748:60;11800:7;11789:8;11778:9;11774:24;11748:60;:::i;:::-;11722:86;;11827:8;11817:18;;;11854:8;11844:18;;;10799:1069;;;;;;;;;;;:::o;12107:315::-;12172:6;12180;12233:2;12221:9;12212:7;12208:23;12204:32;12201:52;;;12249:1;12246;12239:12;12201:52;12288:9;12275:23;12307:31;12332:5;12307:31;:::i;:::-;12357:5;-1:-1:-1;12381:35:1;12412:2;12397:18;;12381:35;:::i;12427:622::-;12522:6;12530;12538;12546;12554;12607:3;12595:9;12586:7;12582:23;12578:33;12575:53;;;12624:1;12621;12614:12;12575:53;12647:28;12665:9;12647:28;:::i;:::-;12637:38;;12694:37;12727:2;12716:9;12712:18;12694:37;:::i;:::-;12684:47;;12778:2;12767:9;12763:18;12750:32;12740:42;;12833:2;12822:9;12818:18;12805:32;-1:-1:-1;;;;;12852:6:1;12849:30;12846:50;;;12892:1;12889;12882:12;12846:50;12931:58;12981:7;12972:6;12961:9;12957:22;12931:58;:::i;:::-;12427:622;;;;-1:-1:-1;12427:622:1;;-1:-1:-1;13008:8:1;;12905:84;12427:622;-1:-1:-1;;;12427:622:1:o;13054:388::-;13122:6;13130;13183:2;13171:9;13162:7;13158:23;13154:32;13151:52;;;13199:1;13196;13189:12;13151:52;13238:9;13225:23;13257:31;13282:5;13257:31;:::i;:::-;13307:5;-1:-1:-1;13364:2:1;13349:18;;13336:32;13377:33;13336:32;13377:33;:::i;:::-;13429:7;13419:17;;;13054:388;;;;;:::o;13447:324::-;13522:6;13530;13538;13591:2;13579:9;13570:7;13566:23;13562:32;13559:52;;;13607:1;13604;13597:12;13559:52;13630:28;13648:9;13630:28;:::i;:::-;13620:38;;13677:37;13710:2;13699:9;13695:18;13677:37;:::i;:::-;13667:47;;13761:2;13750:9;13746:18;13733:32;13723:42;;13447:324;;;;;:::o;13776:248::-;13844:6;13852;13905:2;13893:9;13884:7;13880:23;13876:32;13873:52;;;13921:1;13918;13911:12;13873:52;-1:-1:-1;;13944:23:1;;;14014:2;13999:18;;;13986:32;;-1:-1:-1;13776:248:1:o;14029:1205::-;14171:6;14179;14187;14195;14203;14211;14219;14227;14235;14243;14296:3;14284:9;14275:7;14271:23;14267:33;14264:53;;;14313:1;14310;14303:12;14264:53;14336:28;14354:9;14336:28;:::i;:::-;14326:38;;14415:2;14404:9;14400:18;14387:32;-1:-1:-1;;;;;14479:2:1;14471:6;14468:14;14465:34;;;14495:1;14492;14485:12;14465:34;14534:58;14584:7;14575:6;14564:9;14560:22;14534:58;:::i;:::-;14611:8;;-1:-1:-1;14508:84:1;-1:-1:-1;14508:84:1;;-1:-1:-1;14665:37:1;14698:2;14683:18;;14665:37;:::i;:::-;14655:47;;14749:2;14738:9;14734:18;14721:32;14711:42;;14803:3;14792:9;14788:19;14775:33;14762:46;;14817:31;14842:5;14817:31;:::i;:::-;14867:5;;-1:-1:-1;14919:3:1;14904:19;;14891:33;;-1:-1:-1;14977:3:1;14962:19;;14949:33;;14994:16;;;14991:36;;;15023:1;15020;15013:12;14991:36;;15062:60;15114:7;15103:8;15092:9;15088:24;15062:60;:::i;:::-;15036:86;;15141:8;15131:18;;;15168:8;15158:18;;;15223:3;15212:9;15208:19;15195:33;15185:43;;14029:1205;;;;;;;;;;;;;:::o;15239:460::-;15323:6;15331;15339;15347;15400:3;15388:9;15379:7;15375:23;15371:33;15368:53;;;15417:1;15414;15407:12;15368:53;15440:28;15458:9;15440:28;:::i;:::-;15430:38;;15487:37;15520:2;15509:9;15505:18;15487:37;:::i;:::-;15477:47;;15574:2;15563:9;15559:18;15546:32;15587:31;15612:5;15587:31;:::i;:::-;15239:460;;;;-1:-1:-1;15637:5:1;;15689:2;15674:18;15661:32;;-1:-1:-1;;15239:460:1:o;16063:380::-;16142:1;16138:12;;;;16185;;;16206:61;;16260:4;16252:6;16248:17;16238:27;;16206:61;16313:2;16305:6;16302:14;16282:18;16279:38;16276:161;;16359:10;16354:3;16350:20;16347:1;16340:31;16394:4;16391:1;16384:15;16422:4;16419:1;16412:15;16448:271;16631:6;16623;16618:3;16605:33;16587:3;16657:16;;16682:13;;;16657:16;16448:271;-1:-1:-1;16448:271:1:o;17324:127::-;17385:10;17380:3;17376:20;17373:1;17366:31;17416:4;17413:1;17406:15;17440:4;17437:1;17430:15;17456:125;17521:9;;;17542:10;;;17539:36;;;17555:18;;:::i;17933:266::-;18021:6;18016:3;18009:19;18073:6;18066:5;18059:4;18054:3;18050:14;18037:43;-1:-1:-1;18125:1:1;18100:16;;;18118:4;18096:27;;;18089:38;;;;18181:2;18160:15;;;-1:-1:-1;;18156:29:1;18147:39;;;18143:50;;17933:266::o;18204:326::-;18399:6;18391;18387:19;18376:9;18369:38;18443:2;18438;18427:9;18423:18;18416:30;18350:4;18463:61;18520:2;18509:9;18505:18;18497:6;18489;18463:61;:::i;19202:521::-;19279:4;19285:6;19345:11;19332:25;19439:2;19435:7;19424:8;19408:14;19404:29;19400:43;19380:18;19376:68;19366:96;;19458:1;19455;19448:12;19366:96;19485:33;;19537:20;;;-1:-1:-1;;;;;;19569:30:1;;19566:50;;;19612:1;19609;19602:12;19566:50;19645:4;19633:17;;-1:-1:-1;19676:14:1;19672:27;;;19662:38;;19659:58;;;19713:1;19710;19703:12;20086:128;20153:9;;;20174:11;;;20171:37;;;20188:18;;:::i;20972:360::-;21183:6;21175;21170:3;21157:33;21253:2;21249:15;;;;-1:-1:-1;;21245:53:1;21209:16;;21234:65;;;21323:2;21315:11;;20972:360;-1:-1:-1;20972:360:1:o;21462:517::-;21563:2;21558:3;21555:11;21552:421;;;21599:5;21596:1;21589:16;21643:4;21640:1;21630:18;21713:2;21701:10;21697:19;21694:1;21690:27;21684:4;21680:38;21749:4;21737:10;21734:20;21731:47;;;-1:-1:-1;21772:4:1;21731:47;21827:2;21822:3;21818:12;21815:1;21811:20;21805:4;21801:31;21791:41;;21882:81;21900:2;21893:5;21890:13;21882:81;;;21959:1;21945:16;;21926:1;21915:13;21882:81;;22155:1341;22279:3;22273:10;-1:-1:-1;;;;;22298:6:1;22295:30;22292:56;;;22328:18;;:::i;:::-;22357:96;22446:6;22406:38;22438:4;22432:11;22406:38;:::i;:::-;22400:4;22357:96;:::i;:::-;22508:4;;22565:2;22554:14;;22582:1;22577:662;;;;23283:1;23300:6;23297:89;;;-1:-1:-1;23352:19:1;;;23346:26;23297:89;-1:-1:-1;;22112:1:1;22108:11;;;22104:24;22100:29;22090:40;22136:1;22132:11;;;22087:57;23399:81;;22547:943;;22577:662;21409:1;21402:14;;;21446:4;21433:18;;-1:-1:-1;;22613:20:1;;;22730:236;22744:7;22741:1;22738:14;22730:236;;;22833:19;;;22827:26;22812:42;;22925:27;;;;22893:1;22881:14;;;;22760:19;;22730:236;;;22734:3;22994:6;22985:7;22982:19;22979:201;;;23055:19;;;23049:26;-1:-1:-1;;23138:1:1;23134:14;;;23150:3;23130:24;23126:37;23122:42;23107:58;23092:74;;22979:201;-1:-1:-1;;;;;23226:1:1;23210:14;;;23206:22;23193:36;;-1:-1:-1;22155:1341:1:o;23501:498::-;23701:4;23730:6;23775:2;23767:6;23763:15;23752:9;23745:34;23827:2;23819:6;23815:15;23810:2;23799:9;23795:18;23788:43;;23867:6;23862:2;23851:9;23847:18;23840:34;23910:3;23905:2;23894:9;23890:18;23883:31;23931:62;23988:3;23977:9;23973:19;23965:6;23957;23931:62;:::i;:::-;23923:70;23501:498;-1:-1:-1;;;;;;;23501:498:1:o;24810:493::-;25059:6;25051;25047:19;25036:9;25029:38;25103:3;25098:2;25087:9;25083:18;25076:31;25010:4;25124:62;25181:3;25170:9;25166:19;25158:6;25150;25124:62;:::i;:::-;-1:-1:-1;;;;;25222:31:1;;;;25217:2;25202:18;;25195:59;-1:-1:-1;25285:2:1;25270:18;25263:34;25116:70;24810:493;-1:-1:-1;;;24810:493:1:o;26385:753::-;26718:6;26710;26706:19;26695:9;26688:38;26762:3;26757:2;26746:9;26742:18;26735:31;26669:4;26789:62;26846:3;26835:9;26831:19;26823:6;26815;26789:62;:::i;:::-;-1:-1:-1;;;;;26891:6:1;26887:31;26882:2;26871:9;26867:18;26860:59;26955:6;26950:2;26939:9;26935:18;26928:34;26999:6;26993:3;26982:9;26978:19;26971:35;27055:9;27047:6;27043:22;27037:3;27026:9;27022:19;27015:51;27083:49;27125:6;27117;27109;27083:49;:::i;:::-;27075:57;26385:753;-1:-1:-1;;;;;;;;;;;26385:753:1:o;27143:1194::-;-1:-1:-1;;;;;27260:3:1;27257:27;27254:53;;;27287:18;;:::i;:::-;27316:93;27405:3;27365:38;27397:4;27391:11;27365:38;:::i;:::-;27359:4;27316:93;:::i;:::-;27435:1;27460:2;27455:3;27452:11;27477:1;27472:607;;;;28123:1;28140:3;28137:93;;;-1:-1:-1;28196:19:1;;;28183:33;28137:93;-1:-1:-1;;22112:1:1;22108:11;;;22104:24;22100:29;22090:40;22136:1;22132:11;;;22087:57;28243:78;;27445:886;;27472:607;21409:1;21402:14;;;21446:4;21433:18;;-1:-1:-1;;27508:17:1;;;27622:229;27636:7;27633:1;27630:14;27622:229;;;27725:19;;;27712:33;27697:49;;27832:4;27817:20;;;;27785:1;27773:14;;;;27652:12;27622:229;;;27626:3;27879;27870:7;27867:16;27864:159;;;28003:1;27999:6;27993:3;27987;27984:1;27980:11;27976:21;27972:34;27968:39;27955:9;27950:3;27946:19;27933:33;27929:79;27921:6;27914:95;27864:159;;;28066:1;28060:3;28057:1;28053:11;28049:19;28043:4;28036:33;27445:886;;27143:1194;;;:::o;29210:661::-;29289:6;29342:2;29330:9;29321:7;29317:23;29313:32;29310:52;;;29358:1;29355;29348:12;29310:52;29391:9;29385:16;-1:-1:-1;;;;;29416:6:1;29413:30;29410:50;;;29456:1;29453;29446:12;29410:50;29479:22;;29532:4;29524:13;;29520:27;-1:-1:-1;29510:55:1;;29561:1;29558;29551:12;29510:55;29590:2;29584:9;29615:48;29631:31;29659:2;29631:31;:::i;29615:48::-;29686:2;29679:5;29672:17;29726:7;29721:2;29716;29712;29708:11;29704:20;29701:33;29698:53;;;29747:1;29744;29737:12;29698:53;29795:2;29790;29786;29782:11;29777:2;29770:5;29766:14;29760:38;29839:1;29818:14;;;29834:2;29814:23;29807:34;;;;29822:5;29210:661;-1:-1:-1;;;;29210:661:1:o;29876:557::-;30133:6;30125;30121:19;30110:9;30103:38;30177:3;30172:2;30161:9;30157:18;30150:31;30084:4;30204:46;30245:3;30234:9;30230:19;30222:6;30204:46;:::i;:::-;-1:-1:-1;;;;;30290:6:1;30286:31;30281:2;30270:9;30266:18;30259:59;30366:9;30358:6;30354:22;30349:2;30338:9;30334:18;30327:50;30394:33;30420:6;30412;30394:33;:::i;33417:168::-;33490:9;;;33521;;33538:15;;;33532:22;;33518:37;33508:71;;33559:18;;:::i;33590:127::-;33651:10;33646:3;33642:20;33639:1;33632:31;33682:4;33679:1;33672:15;33706:4;33703:1;33696:15;33722:120;33762:1;33788;33778:35;;33793:18;;:::i;:::-;-1:-1:-1;33827:9:1;;33722:120::o;33847:135::-;33886:3;33907:17;;;33904:43;;33927:18;;:::i;:::-;-1:-1:-1;33974:1:1;33963:13;;33847:135::o;33987:642::-;34268:6;34256:19;;34238:38;;-1:-1:-1;;;;;34312:32:1;;34307:2;34292:18;;34285:60;34332:3;34376:2;34361:18;;34354:31;;;-1:-1:-1;;34408:46:1;;34434:19;;34426:6;34408:46;:::i;:::-;34504:6;34497:14;34490:22;34485:2;34474:9;34470:18;34463:50;34562:9;34554:6;34550:22;34544:3;34533:9;34529:19;34522:51;34590:33;34616:6;34608;34590:33;:::i;:::-;34582:41;33987:642;-1:-1:-1;;;;;;;;33987:642:1:o;34634:245::-;34713:6;34721;34774:2;34762:9;34753:7;34749:23;34745:32;34742:52;;;34790:1;34787;34780:12;34742:52;-1:-1:-1;;34813:16:1;;34869:2;34854:18;;;34848:25;34813:16;;34848:25;;-1:-1:-1;34634:245:1:o;36284:127::-;36345:10;36340:3;36336:20;36333:1;36326:31;36376:4;36373:1;36366:15;36400:4;36397:1;36390:15;36416:251;36486:6;36539:2;36527:9;36518:7;36514:23;36510:32;36507:52;;;36555:1;36552;36545:12;36507:52;36587:9;36581:16;36606:31;36631:5;36606:31;:::i;36672:980::-;36934:4;36982:3;36971:9;36967:19;37013:6;37002:9;36995:25;37039:2;37077:6;37072:2;37061:9;37057:18;37050:34;37120:3;37115:2;37104:9;37100:18;37093:31;37144:6;37179;37173:13;37210:6;37202;37195:22;37248:3;37237:9;37233:19;37226:26;;37287:2;37279:6;37275:15;37261:29;;37308:1;37318:195;37332:6;37329:1;37326:13;37318:195;;;37397:13;;-1:-1:-1;;;;;37393:39:1;37381:52;;37488:15;;;;37453:12;;;;37429:1;37347:9;37318:195;;;-1:-1:-1;;;;;;;37569:32:1;;;;37564:2;37549:18;;37542:60;-1:-1:-1;;;37633:3:1;37618:19;37611:35;37530:3;36672:980;-1:-1:-1;;;36672:980:1:o;37657:211::-;37698:3;37736:5;37730:12;37780:6;37773:4;37766:5;37762:16;37757:3;37751:36;37842:1;37806:16;;37831:13;;;-1:-1:-1;37806:16:1;;37657:211;-1:-1:-1;37657:211:1:o;37873:189::-;38002:3;38027:29;38052:3;38044:6;38027:29;:::i;38067:719::-;38370:6;38362;38358:19;38347:9;38340:38;38414:3;38409:2;38398:9;38394:18;38387:31;38321:4;38441:46;38482:3;38471:9;38467:19;38459:6;38441:46;:::i;:::-;-1:-1:-1;;;;;38527:6:1;38523:31;38518:2;38507:9;38503:18;38496:59;38603:9;38595:6;38591:22;38586:2;38575:9;38571:18;38564:50;38637:33;38663:6;38655;38637:33;:::i;:::-;38623:47;;38719:9;38711:6;38707:22;38701:3;38690:9;38686:19;38679:51;38747:33;38773:6;38765;38747:33;:::i;41096:891::-;41416:4;41445:3;41487:6;41479;41475:19;41464:9;41457:38;41531:2;41526;41515:9;41511:18;41504:30;41557:45;41598:2;41587:9;41583:18;41575:6;41557:45;:::i;:::-;-1:-1:-1;;;;;41638:31:1;;41633:2;41618:18;;41611:59;41701:2;41686:18;;41679:34;;;-1:-1:-1;;;;;41750:32:1;;41744:3;41729:19;;41722:61;41770:3;41799:19;;41792:35;;;41864:22;;;41858:3;41843:19;;41836:51;41543:59;-1:-1:-1;41904:33:1;41543:59;41922:6;41904:33;:::i;:::-;41896:41;;;41974:6;41968:3;41957:9;41953:19;41946:35;41096:891;;;;;;;;;;;:::o;41992:383::-;42193:2;42182:9;42175:21;42156:4;42213:45;42254:2;42243:9;42239:18;42231:6;42213:45;:::i;:::-;-1:-1:-1;;;;;42294:31:1;;;;42289:2;42274:18;;42267:59;-1:-1:-1;42357:2:1;42342:18;42335:34;42205:53;41992:383;-1:-1:-1;41992:383:1:o;43091:112::-;43123:1;43149;43139:35;;43154:18;;:::i;:::-;-1:-1:-1;43188:9:1;;43091:112::o;43625:840::-;43974:6;43966;43962:19;43951:9;43944:38;44018:3;44013:2;44002:9;43998:18;43991:31;43925:4;44045:46;44086:3;44075:9;44071:19;44063:6;44045:46;:::i;:::-;44139:9;44131:6;44127:22;44122:2;44111:9;44107:18;44100:50;44173:33;44199:6;44191;44173:33;:::i;:::-;-1:-1:-1;;;;;44280:15:1;;;44275:2;44260:18;;44253:43;44333:15;;44327:3;44312:19;;44305:44;44386:22;;;44233:3;44365:19;;44358:51;44159:47;-1:-1:-1;44426:33:1;44159:47;44444:6;44426:33;:::i;:::-;44418:41;43625:840;-1:-1:-1;;;;;;;;;43625:840:1:o;44470:620::-;44792:3;44787;44783:13;44774:6;44769:3;44765:16;44761:36;44756:3;44749:49;44827:6;44823:1;44818:3;44814:11;44807:27;44731:3;-1:-1:-1;;;;;44857:3:1;44853:28;44933:2;44924:6;44919:3;44915:16;44911:25;44906:2;44901:3;44897:12;44890:47;44967:6;44962:2;44957:3;44953:12;44946:28;45026:2;45017:6;45012:3;45008:16;45004:25;44999:2;44994:3;44990:12;44983:47;;45046:38;45080:2;45075:3;45071:12;45063:6;45046:38;:::i

Swarm Source

ipfs://65e4e714942312a50e7b055ecc9955cf5da190d7e36a8a8e11e93260b7fec3f0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.