Contract 0xc555f3fd66b1b0c758046e91368d767bbd1b90c2 2

Contract Overview

Balance:
0 ETH
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x381801d3803b09fbd86fda57c9a7bc377cf2e617fbd7c7d8f56f25ef4b959f3bTraverse Chains112728562022-04-16 21:15:1080 days 2 hrs ago0xc52972ff9edaf3ffc79aaf1137a6a989670e004e IN  0xc555f3fd66b1b0c758046e91368d767bbd1b90c20.05 ETH0.00000625984 ETH
0x368e42241d55c79a14b1d0ae41e36be36a4948a056b85a7b10679afb0514ee44Traverse Chains112727072022-04-16 21:02:5580 days 3 hrs ago0xc52972ff9edaf3ffc79aaf1137a6a989670e004e IN  0xc555f3fd66b1b0c758046e91368d767bbd1b90c20.05 ETH0.000006205746 ETH
0xc550ba2d8db4a79043bf53e68ff19bc404bdfc422591f6527c73eb29169823cbKustomize112726662022-04-16 20:59:5480 days 3 hrs ago0xc52972ff9edaf3ffc79aaf1137a6a989670e004e IN  0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH0.00001601228 ETH
0xa8810677b43fa76f009a599017a9487331f9677e596c842217f5b3ab416a5514Set Trusted Remo...112723742022-04-16 20:35:5480 days 3 hrs ago0xc52972ff9edaf3ffc79aaf1137a6a989670e004e IN  0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH0.000006562465 ETH
0xb4efdf00bb09a0e40ed272f64faac680e41ebc00af202fe3036f9e11cc2024acSet Trusted Remo...112723692022-04-16 20:35:5480 days 3 hrs ago0xc52972ff9edaf3ffc79aaf1137a6a989670e004e IN  0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH0.00000659494 ETH
0x4ab136623fad2c5acd41c73eb54a79a91c5e4be223ba5239cca5a4ffc5782ccfSet Trusted Remo...112723642022-04-16 20:34:5480 days 3 hrs ago0xc52972ff9edaf3ffc79aaf1137a6a989670e004e IN  0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH0.00000659494 ETH
0x989ff42a2cb7d28fecafb66670c220b25ac5ec927dcb35ac825a88e5a3fbd5d4Set Trusted Remo...112723552022-04-16 20:34:5480 days 3 hrs ago0xc52972ff9edaf3ffc79aaf1137a6a989670e004e IN  0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH0.000006578597 ETH
0x7175d4b88b74db2e1373331375d3b5146cca39b372afa1beb794e14105fde354Set Trusted Remo...112723462022-04-16 20:33:5480 days 3 hrs ago0xc52972ff9edaf3ffc79aaf1137a6a989670e004e IN  0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH0.00000659494 ETH
0x03b855d52c42d44ea747f5d7a192d3c65c1f44b72d9e9f7666dfc41222afa4b4Kustomize112716612022-04-16 19:40:0380 days 4 hrs ago0xc52972ff9edaf3ffc79aaf1137a6a989670e004e IN  0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH0.000015895961 ETH
0x4028ac0c9a4389b9aa881e4cdd4164b679f97480cdff4962c68ee873dc34937eMint112716322022-04-16 19:36:4880 days 4 hrs ago0xc52972ff9edaf3ffc79aaf1137a6a989670e004e IN  0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH0.000006871491 ETH
0x3af6a510cfbf18363196068d41c651d9e1efff4662552d32cf583c791947cc990x60806040112715982022-04-16 19:34:4780 days 4 hrs ago0xc52972ff9edaf3ffc79aaf1137a6a989670e004e IN  Create: TEST0 ETH0.000770333157 ETH
[ Download CSV Export 
Latest 8 internal transactions
Parent Txn Hash Block From To Value
0x381801d3803b09fbd86fda57c9a7bc377cf2e617fbd7c7d8f56f25ef4b959f3b112728562022-04-16 21:15:1080 days 2 hrs ago 0xc555f3fd66b1b0c758046e91368d767bbd1b90c2 0x4d747149a57923beb89f22e6b7b97f7d8c087a000.05 ETH
0x381801d3803b09fbd86fda57c9a7bc377cf2e617fbd7c7d8f56f25ef4b959f3b112728562022-04-16 21:15:1080 days 2 hrs ago 0xc555f3fd66b1b0c758046e91368d767bbd1b90c2 0x4d747149a57923beb89f22e6b7b97f7d8c087a000 ETH
0xcff531b7920889e31fdf603aa57aef439b434ccbb92788af81243d63582fdc65112728262022-04-16 21:13:1080 days 2 hrs ago 0xc555f3fd66b1b0c758046e91368d767bbd1b90c2 0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH
0xcff531b7920889e31fdf603aa57aef439b434ccbb92788af81243d63582fdc65112728262022-04-16 21:13:1080 days 2 hrs ago 0x4d747149a57923beb89f22e6b7b97f7d8c087a00 0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH
0x368e42241d55c79a14b1d0ae41e36be36a4948a056b85a7b10679afb0514ee44112727072022-04-16 21:02:5580 days 3 hrs ago 0xc555f3fd66b1b0c758046e91368d767bbd1b90c2 0x4d747149a57923beb89f22e6b7b97f7d8c087a000.05 ETH
0x368e42241d55c79a14b1d0ae41e36be36a4948a056b85a7b10679afb0514ee44112727072022-04-16 21:02:5580 days 3 hrs ago 0xc555f3fd66b1b0c758046e91368d767bbd1b90c2 0x4d747149a57923beb89f22e6b7b97f7d8c087a000 ETH
0x649e9cbfd55701f450e8cfd9efa47cda0df31e2a56665020769b127b67589b98112726482022-04-16 20:57:5480 days 3 hrs ago 0xc555f3fd66b1b0c758046e91368d767bbd1b90c2 0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH
0x649e9cbfd55701f450e8cfd9efa47cda0df31e2a56665020769b127b67589b98112726482022-04-16 20:57:5480 days 3 hrs ago 0x4d747149a57923beb89f22e6b7b97f7d8c087a00 0xc555f3fd66b1b0c758046e91368d767bbd1b90c20 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TEST

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2022-04-16
*/

pragma solidity >=0.8.0;

/// @title DynamicBuffer
/// @author David Huber (@cxkoda) and Simon Fremaux (@dievardump). See also
///         https://raw.githubusercontent.com/dievardump/solidity-dynamic-buffer
/// @notice This library is used to allocate a big amount of container memory
//          which will be subsequently filled without needing to reallocate
///         memory.
/// @dev First, allocate memory.
///      Then use `buffer.appendUnchecked(theBytes)` or `appendSafe()` if
///      bounds checking is required.
library DynamicBuffer {
    /// @notice Allocates container space for the DynamicBuffer
    /// @param capacity The intended max amount of bytes in the buffer
    /// @return buffer The memory location of the buffer
    /// @dev Allocates `capacity + 0x60` bytes of space
    ///      The buffer array starts at the first container data position,
    ///      (i.e. `buffer = container + 0x20`)
    function allocate(uint256 capacity) internal pure returns (bytes memory buffer) {
        assembly {
            // Get next-free memory address
            let container := mload(0x40)

            // Allocate memory by setting a new next-free address
            {
                // Add 2 x 32 bytes in size for the two length fields
                // Add 32 bytes safety space for 32B chunked copy
                let size := add(capacity, 0x60)
                let newNextFree := add(container, size)
                mstore(0x40, newNextFree)
            }

            // Set the correct container length
            {
                let length := add(capacity, 0x40)
                mstore(container, length)
            }

            // The buffer starts at idx 1 in the container (0 is length)
            buffer := add(container, 0x20)

            // Init content with length 0
            mstore(buffer, 0)
        }

        return buffer;
    }

    /// @notice Appends data to buffer, and update buffer length
    /// @param buffer the buffer to append the data to
    /// @param data the data to append
    /// @dev Does not perform out-of-bound checks (container capacity)
    ///      for efficiency.
    function appendUnchecked(bytes memory buffer, bytes memory data) internal pure {
        assembly {
            let length := mload(data)
            for {
                data := add(data, 0x20)
                let dataEnd := add(data, length)
                let copyTo := add(buffer, add(mload(buffer), 0x20))
            } lt(data, dataEnd) {
                data := add(data, 0x20)
                copyTo := add(copyTo, 0x20)
            } {
                // Copy 32B chunks from data to buffer.
                // This may read over data array boundaries and copy invalid
                // bytes, which doesn't matter in the end since we will
                // later set the correct buffer length, and have allocated an
                // additional word to avoid buffer overflow.
                mstore(copyTo, mload(data))
            }

            // Update buffer length
            mstore(buffer, add(mload(buffer), length))
        }
    }

    /// @notice Appends data to buffer, and update buffer length
    /// @param buffer the buffer to append the data to
    /// @param data the data to append
    /// @dev Performs out-of-bound checks and calls `appendUnchecked`.
    function appendSafe(bytes memory buffer, bytes memory data) internal pure {
        uint256 capacity;
        uint256 length;
        assembly {
            capacity := sub(mload(sub(buffer, 0x20)), 0x40)
            length := mload(buffer)
        }

        require(length + data.length <= capacity, "DynamicBuffer: Appending out of bounds.");
        appendUnchecked(buffer, data);
    }
}

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

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/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 receiver 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/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/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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

// 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 v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}



pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// 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: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) internal virtual {}
}

// File: contracts/NonblockingReceiver.sol


pragma solidity ^0.8.6;




abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver {

    ILayerZeroEndpoint internal endpoint;

    struct FailedMessages {
        uint payloadLength;
        bytes32 payloadHash;
    }

    mapping(uint16 => mapping(bytes => mapping(uint => FailedMessages))) public failedMessages;
    mapping(uint16 => bytes) public trustedRemoteLookup;

    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload);

    function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) external override {
        require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security
        require(_srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]),
            "NonblockingReceiver: invalid source sending contract");

        // try-catch all errors/exceptions
        // having failed messages does not block messages passing
        try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
            // do nothing
        } catch {
            // error / exception
            failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages(_payload.length, keccak256(_payload));
            emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
        }
    }

    function onLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public {
        // only internal transaction
        require(msg.sender == address(this), "NonblockingReceiver: caller must be Bridge.");

        // handle incoming message
        _LzReceive( _srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function
    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) virtual internal;

    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam) internal {
        endpoint.send{value: msg.value}(_dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam);
    }

    function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload) external payable {
        // assert there is message to retry
        FailedMessages storage failedMsg = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message");
        require(_payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload");
        // clear the stored message
        failedMsg.payloadLength = 0;
        failedMsg.payloadHash = bytes32(0);
        // execute the message. revert if it fails again
        this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner {
        trustedRemoteLookup[_chainId] = _trustedRemote;
    }
}

// File: contracts/GhostlyGhosts.sol



pragma solidity ^0.8.7;

interface IFeatures1 {
  function readMisc(uint256 _id) external view returns (string memory);
}

contract TEST is Ownable, ERC721, NonblockingReceiver {

    using DynamicBuffer for bytes;
bytes32 public _merkleRoot;

// IFeatures1 features1;

    address public _owner;
    string private baseURI;
    uint256 nextTokenId = 400;
    // uint256 MAX_MINT_ETHEREUM = 3084;
    uint256 MAX_MINT_ARB = 500;

    // bytes public checkTHIS;
    // mapping (address => bool) public whitelistClaimed;

    struct Features {
      uint256 data1;
      uint256 data2;
      uint256[4] colors;
      uint256[4] colorSelectors;
    }

    //   uint256[] public finalityKustoms; //CHECK THIS
mapping (uint256 => bool) public finality;
    mapping (string => bool) public taken;

    mapping (uint256 => uint256) public svgBackgroundColorSelector;


    mapping (uint256 => string) public svgBackgroundColor2;
            mapping (uint256 => string) public svgData;
    mapping(uint256 => Features) public features;


    uint gasForDestinationLzReceive = 350000;

    constructor() ERC721("mkay", "mk") {
        _owner = msg.sender;
        endpoint = ILayerZeroEndpoint(0x4D747149A57923Beb89f22E6B7B97f7D8c087A00);
        baseURI = "www";

    svgBackgroundColor2[0] = '#2dd055"/>';
      svgBackgroundColor2[1] = '#09a137"/>';
      svgBackgroundColor2[2] = '#065535"/>';
      svgBackgroundColor2[3] = '#88b04b"/>';
      svgBackgroundColor2[4] = '#00ffff"/>';
      svgBackgroundColor2[5] = '#5acef3"/>';
      svgBackgroundColor2[6] = '#0050ff"/>';
      svgBackgroundColor2[7] = '#4559cc"/>';
      svgBackgroundColor2[8] = '#34568b"/>';
      svgBackgroundColor2[9] = '#8a2be2"/>';
        }

// function setFeaturesAddress(address addr) external onlyOwner{
//       features1= IFeatures1(addr);
//     }


// function setPresaleMerkleRoot(bytes32 root) external onlyOwner {
//       _merkleRoot = root;
//     }
    // mint function
    // you can choose to mint 1 or 2
    // mint is free, but payments are accepted
    // function mint(uint8 numTokens) external payable {
    //     require(numTokens < 3, "GG: Max 2 NFTs per transaction");
    //     require(nextTokenId + numTokens <= MAX_MINT_ETHEREUM, "GG: Mint exceeds supply");
    //     _safeMint(msg.sender, ++nextTokenId);
    //     if (numTokens == 2) {
    //         _safeMint(msg.sender, ++nextTokenId);
    //     }
    // }

    function mint(uint8 numTokens) external payable {
        require(numTokens < 3, "GG: Max 2 NFTs per transaction");
        require(nextTokenId + numTokens <= MAX_MINT_ARB, "GG: Mint exceeds supply");
        _safeMint(msg.sender, ++nextTokenId);
        if (numTokens == 2) {
            _safeMint(msg.sender, ++nextTokenId);
        }
    }

    // function checkTHISset(uint256 _amount) public{
    //     checkTHIS = abi.encodePacked(msg.sender, _amount);
    // }

    // function checkTHISpresent() public view returns (bytes memory){
    //     return checkTHIS;
    // }

    function setFinality(uint256 _itemID) public {
      require(msg.sender == ownerOf(_itemID), "YOU ARE NOT THE OWNER!");
        require(finality[_itemID] == false, "THIS IS ALREADY FINAL!");

      Features memory feature = features[_itemID];
        bytes memory output = abi.encodePacked(feature.data1, feature.data2, feature.colors[0], feature.colors[1], feature.colors[2], feature.colors[3]);

      require(taken[string(output)] == false, "THIS IS ALREADY TAKEN!");
        finality[_itemID] = true;
      taken[string(output)] = true;

    //   finalityCheck[_itemID] = string(output);

    }

    // function whitelistClaim(uint256 _amount, bytes32[] calldata _merkleProof) external payable {
    //   require(!whitelistClaimed[msg.sender], "ADDRESS HAS ALREADY CLAIMED!");
    //   require(nextTokenId + _amount < MAX_MINT_ETHEREUM, "MAX SUPPLY!");
    // //   require(_amount * price <= msg.value, "INCORRECT AMOUNT SENT!");
    //   bytes32 leaf = keccak256(abi.encodePacked(msg.sender, _amount));

    //   require(MerkleProof.verify(_merkleProof, _merkleRoot, leaf),  "INVALID PROOF!");
    //   whitelistClaimed[msg.sender] = true;
    //   for (uint256 i = ++nextTokenId; i < _amount+1; i++) {
    //     _safeMint(msg.sender, i);
    //   }
    // }

    // This function transfers the nft from your address on the
    // source chain to the same address on the destination chain
    function traverseChains(uint16 _chainId, uint tokenId) public payable {
        require(msg.sender == ownerOf(tokenId), "You must own the token to traverse");
        require(trustedRemoteLookup[_chainId].length > 0, "This chain is currently unavailable for travel");
        require(finality[tokenId] == false, "ONLY NON-FINALITY CAN TRAVERSE!");


        // burn NFT, eliminating it from circulation on src chain
        _burn(tokenId);

        // abi.encode() the payload with the values to send
        bytes memory payload = abi.encode(msg.sender, tokenId);

        // encode adapterParams to specify more gas for the destination
        uint16 version = 1;
        bytes memory adapterParams = abi.encodePacked(version, gasForDestinationLzReceive);

        // get the fees we need to pay to LayerZero + Relayer to cover message delivery
        // you will be refunded for extra gas paid
        (uint messageFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams);

        require(msg.value >= messageFee, "GG: msg.value not enough to cover messageFee. Send gas for message fees");

        endpoint.send{value: msg.value}(
            _chainId,                           // destination chainId
            trustedRemoteLookup[_chainId],      // destination address of nft contract
            payload,                            // abi.encoded()'ed bytes
            payable(msg.sender),                // refund address
            address(0x0),                       // 'zroPaymentAddress' unused for this
            adapterParams                       // txParameters
        );
    }

    // function setBaseURI(string memory URI) external onlyOwner {
    //     baseURI = URI;
    // }

    function donate() external payable {
        // thank you
    }

    // This allows the devs to receive kind donations
    function withdraw(uint amt) external onlyOwner {
        (bool sent, ) = payable(_owner).call{value: amt}("");
        require(sent, "GG: Failed to withdraw Ether");
    }

    function kustomize(uint256 _data1, uint256 _data2, uint256[4] memory _colors, uint256[4] memory _colorSelectors, uint256 _itemID) public {
      require(msg.sender == ownerOf(_itemID), "YOU ARE NOT THE OWNER!");
        require(finality[_itemID] == false, "ONLY NON-FINALITY CAN TRAVERSE!");

      Features storage feature = features[_itemID];
      feature.data1 = _data1;
      feature.data2 = _data2;
    //   feature.data3 = _data3;
    //   feature.data4 = _data4;

      feature.colors = _colors;
      feature.colorSelectors = _colorSelectors;
    }

function kustomizeBackground(uint256 _data1, uint256 _itemID) public {
      require(msg.sender == ownerOf(_itemID), "YOU ARE NOT THE OWNER!");
        require(finality[_itemID] == false, "ONLY NON-FINALITY CAN TRAVERSE!");

      svgBackgroundColorSelector[_itemID] = _data1;
    }


 function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
      require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
// string memory firstfirst = CREATE(_tokenId);
// string memory tokenIdString = toString(_tokenId);
    Features memory feature = features[_tokenId];

      bytes memory artData = abi.encodePacked(feature.data1, feature.data2);//abi.encodePacked(art.data1, art.data2);
      bytes memory colorData = abi.encodePacked(feature.colors[0], feature.colors[1]);//,feature.colors[5],feature.colors[6] );//abi.encodePacked(art.data1, art.data2);
      bytes memory colorData2 = abi.encodePacked(feature.colors[2], feature.colors[3]);
      // colorData = abi.encodePacked(colorData, feature.colors[7], feature.colors[8], feature.colors[9], feature.colors[10], feature.colors[11]);//abi.encodePacked(art.data1, art.data2);
      // colorData = abi.encodePacked(colorData, feature.colors[12], feature.colors[13], feature.colors[14], feature.colors[15], feature.colors[16]);//abi.encodePacked(art.data1, art.data2);

      // string memory _last = string(abi.encodePacked(finality[_tokenId] == false ? '<path d="M7330 445 l0 -55 -55 0 -55 0 0 -55 0 -55 55 0 55 0 0 -110 0 -110 55 0 55 0 0 110 0 110 55 0 55 0 0 55 0 55 -55 0 -55 0 0 55 0 55 -55 0 -55 0 0 -55z M7720 445 l0 -55 -55 0 -55 0 0 -55 0 -55 55 0 55 0 0 -110 0 -110 55 0 55 0 0 110 0 110 55 0 55 0 0 55 0 55 -55 0 -55 0 0 55 0 55 -55 0 -55 0 0 -55z" fill="' : '<path d="M7340 435 l0 -55 -55 0 -55 0 0 -45 0 -45 55 0 55 0 0 -110 0 -110 45 0 45 0 0 110 0 110 55 0 55 0 0 45 0 45 -55 0 -55 0 0 55 0 55 -45 0 -45 0 0 -55z m80 -10 l0 -55 55 0 55 0 0 -35 0 -35 -55 0 -55 0 0 -110 0 -110 -35 0 -35 0 0 110 0 110 -55 0 -55 0 0 35 0 35 55 0 55 0 0 55 0 55 35 0 35 0 0 -55z M7360 415 l0 -55 -55 0 c-52 0 -55 -1 -55 -25 0 -24 3 -25 55 -25 l55 0 0 -110 0 -110 25 0 25 0 0 110 0 110 55 0 c52 0 55 1 55 25 0 24 -3 25 -55 25 l-55 0 0 55 c0 52 -1 55 -25 55 -24 0 -25 -3 -25 -55z m40 -10 l0 -55 55 0 c42 0 55 -3 55 -15 0 -12 -13 -15 -55 -15 l-55 0 0 -110 c0 -91 -3 -110 -15 -110 -12 0 -15 19 -15 110 l0 110 -55 0 c-42 0 -55 3 -55 15 0 12 13 15 55 15 l55 0 0 55 c0 42 3 55 15 55 12 0 15 -13 15 -55z M7382 398 l-2 -57 -57 -4 -58 -3 57 -2 57 -2 4 -112 3 -113 2 112 2 112 58 4 57 3 -57 2 -57 2 -4 58 -3 57 -2 -57z M7730 435 l0 -55 -55 0 -55 0 0 -45 0 -45 55 0 55 0 0 -110 0 -110 45 0 45 0 0 110 0 110 55 0 55 0 0 45 0 45 -55 0 -55 0 0 55 0 55 -45 0 -45 0 0 -55z m80 -10 l0 -55 55 0 55 0 0 -35 0 -35 -55 0 -55 0 0 -110 0 -110 -35 0 -35 0 0 110 0 110 -55 0 -55 0 0 35 0 35 55 0 55 0 0 55 0 55 35 0 35 0 0 -55z M7750 415 l0 -55 -55 0 c-52 0 -55 -1 -55 -25 0 -24 3 -25 55 -25 l55 0 0 -110 0 -110 25 0 25 0 0 110 0 110 55 0 c52 0 55 1 55 25 0 24 -3 25 -55 25 l-55 0 0 55 c0 52 -1 55 -25 55 -24 0 -25 -3 -25 -55z m40 -10 l0 -55 55 0 c42 0 55 -3 55 -15 0 -12 -13 -15 -55 -15 l-55 0 0 -110 c0 -91 -3 -110 -15 -110 -12 0 -15 19 -15 110 l0 110 -55 0 c-42 0 -55 3 -55 15 0 12 13 15 55 15 l55 0 0 55 c0 42 3 55 15 55 12 0 15 -13 15 -55z M7772 398 l-2 -57 -57 -4 -58 -3 57 -2 57 -2 4 -112 3 -113 2 112 2 112 58 4 57 3 -57 2 -57 2 -4 58 -3 57 -2 -57z" fill="', keccak256(bytes(getSlice(0, 4, bytes(featy[_tokenId])))) == keccak256(bytes("00")) ? '#09a137"/>' : '#945610"/>'));
      // string memory imageURI = string(abi.encodePacked("data:image/svg+xml;base64, ", Base64.encode(bytes(string(abi.encodePacked('<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1200.000000pt" height="1200.000000pt" viewBox="0 0 1200.000000 1200.000000" preserveAspectRatio="xMidYMid meet"><g transform="translate(0.000000,1200.000000) scale(0.100000,-0.100000)">', CREATE(_tokenId), finality[_tokenId] == false ? '<path d="M11330 445 l0 -55 -55 0 -55 0 0 -55 0 -55 55 0 55 0 0 -110 0 -110 55 0 55 0 0 110 0 110 55 0 55 0 0 55 0 55 -55 0 -55 0 0 55 0 55 -55 0 -55 0 0 -55z M11720 445 l0 -55 -55 0 -55 0 0 -55 0 -55 55 0 55 0 0 -110 0 -110 55 0 55 0 0 110 0 110 55 0 55 0 0 55 0 55 -55 0 -55 0 0 55 0 55 -55 0 -55 0 0 -55z" fill="' : '<path d="M11330 445 l0 -55 -55 0 -55 0 0 -55 0 -55 55 0 55 0 0 -110 0 -110 55 0 55 0 0 110 0 110 55 0 55 0 0 55 0 55 -55 0 -55 0 0 55 0 55 -55 0 -55 0 0 -55z m90 -20 l0 -55 55 0 55 0 0 -35 0 -35 -55 0 -55 0 0 -110 0 -110 -35 0 -35 0 0 110 0 110 -55 0 -55 0 0 35 0 35 55 0 55 0 0 55 0 55 35 0 35 0 0 -55z M11370 405 l0 -55 -55 0 c-42 0 -55 -3 -55 -15 0 -12 13 -15 55 -15 l55 0 0 -110 c0 -91 3 -110 15 -110 12 0 15 19 15 110 l0 110 55 0 c42 0 55 3 55 15 0 12 -13 15 -55 15 l-55 0 0 55 c0 42 -3 55 -15 55 -12 0 -15 -13 -15 -55z M11720 445 l0 -55 -55 0 -55 0 0 -55 0 -55 55 0 55 0 0 -110 0 -110 55 0 55 0 0 110 0 110 55 0 55 0 0 55 0 55 -55 0 -55 0 0 55 0 55 -55 0 -55 0 0 -55z m90 -20 l0 -55 55 0 55 0 0 -35 0 -35 -55 0 -55 0 0 -110 0 -110 -35 0 -35 0 0 110 0 110 -55 0 -55 0 0 35 0 35 55 0 55 0 0 55 0 55 35 0 35 0 0 -55z M11760 405 l0 -55 -55 0 c-42 0 -55 -3 -55 -15 0 -12 13 -15 55 -15 l55 0 0 -110 c0 -91 3 -110 15 -110 12 0 15 19 15 110 l0 110 55 0 c42 0 55 3 55 15 0 12 -13 15 -55 15 l-55 0 0 55 c0 42 -3 55 -15 55 -12 0 -15 -13 -15 -55z" fill="', keccak256(bytes(getSlice(0, 2, bytes(featy[_tokenId])))) == keccak256(bytes("00")) ? '#09a137"/>' : '#945610"/>', '</g></svg>'))))));
      string memory imageURI = string(abi.encodePacked("data:image/svg+xml;base64, ", Base64.encode(bytes(string(abi.encodePacked(' <svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1600.000000pt" height="800.000000pt" viewBox="0 0 1600.000000 800.000000" preserveAspectRatio="xMidYMid meet" xmlns:xlink="http://www.w3.org/1999/xlink">  <defs> <polygon points="24.8,22 37.3,29.2 37.3,43.7 24.8,50.9 12.3,43.7 12.3,29.2" id="hex" transform="scale(1.8,1.8)" /> </defs><g transform="translate(0.000000,800.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none"> <path d="M0 4000 l0 -4000 8000 0 8000 0 0 4000 0 4000 -8000 0 -8000 0 0 -4000z" fill="', svgBackgroundColor2[svgBackgroundColorSelector[_tokenId]], '</g>', CREATE(artData, colorData, colorData2, feature.colorSelectors), finality[_tokenId] == false ? '<g transform="translate(0.000000,800.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none"> <path d="M15270 640 l0 -50 -55 0 -55 0 0 -49 0 -50 53 -3 52 -3 3 -102 3 -103 49 0 50 0 0 105 0 105 50 0 50 0 0 50 0 50 -50 0 -50 0 0 50 0 50 -50 0 -50 0 0 -50z M15620 640 l0 -50 -50 0 -50 0 0 -50 0 -50 50 0 50 0 0 -105 0 -105 50 0 49 0 3 103 3 102 53 3 52 3 0 50 0 49 -55 0 -55 0 0 50 0 50 -50 0 -50 0 0 -50z"/> </g> </svg>' : '<g transform="translate(0.000000,800.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none"> <path d="M15240 655 l0 -55 -55 0 -55 0 0 -55 0 -55 55 0 55 0 0 -110 0 -110 55 0 55 0 0 110 0 110 55 0 55 0 0 55 0 55 -55 0 -55 0 0 55 0 55 -55 0 -55 0 0 -55z m100 -10 l0 -55 55 0 55 0 0 -45 0 -45 -55 0 -55 0 0 -110 0 -110 -45 0 -45 0 0 110 0 110 -55 0 -55 0 0 45 0 45 55 0 55 0 0 55 0 55 45 0 45 0 0 -55z M15260 635 l0 -55 -55 0 -55 0 0 -35 0 -35 55 0 55 0 0 -110 0 -110 35 0 35 0 0 110 0 110 55 0 55 0 0 35 0 35 -55 0 -55 0 0 55 0 55 -35 0 -35 0 0 -55z m60 -10 l0 -55 55 0 c52 0 55 -1 55 -25 0 -24 -3 -25 -55 -25 l-55 0 0 -110 0 -110 -25 0 -25 0 0 110 0 110 -55 0 c-52 0 -55 1 -55 25 0 24 3 25 55 25 l55 0 0 55 c0 52 1 55 25 55 24 0 25 -3 25 -55z M15280 615 l0 -55 -55 0 c-42 0 -55 -3 -55 -15 0 -12 13 -15 55 -15 l55 0 0 -110 c0 -91 3 -110 15 -110 12 0 15 19 15 110 l0 110 55 0 c42 0 55 3 55 15 0 12 -13 15 -55 15 l-55 0 0 55 c0 42 -3 55 -15 55 -12 0 -15 -13 -15 -55z m78 -67 l57 -2 -57 -3 -58 -4 -2 -112 -2 -112 -3 113 -4 112 -57 2 -57 2 58 3 57 4 2 57 2 57 3 -57 4 -58 57 -2z M15630 655 l0 -55 -55 0 -55 0 0 -55 0 -55 55 0 55 0 0 -110 0 -110 55 0 55 0 0 110 0 110 55 0 55 0 0 55 0 55 -55 0 -55 0 0 55 0 55 -55 0 -55 0 0 -55z m100 -10 l0 -55 55 0 55 0 0 -45 0 -45 -55 0 -55 0 0 -110 0 -110 -45 0 -45 0 0 110 0 110 -55 0 -55 0 0 45 0 45 55 0 55 0 0 55 0 55 45 0 45 0 0 -55z M15650 635 l0 -55 -55 0 -55 0 0 -35 0 -35 55 0 55 0 0 -110 0 -110 35 0 35 0 0 110 0 110 55 0 55 0 0 35 0 35 -55 0 -55 0 0 55 0 55 -35 0 -35 0 0 -55z m60 -10 l0 -55 55 0 c52 0 55 -1 55 -25 0 -24 -3 -25 -55 -25 l-55 0 0 -110 0 -110 -25 0 -25 0 0 110 0 110 -55 0 c-52 0 -55 1 -55 25 0 24 3 25 55 25 l55 0 0 55 c0 52 1 55 25 55 24 0 25 -3 25 -55z M15670 615 l0 -55 -55 0 c-42 0 -55 -3 -55 -15 0 -12 13 -15 55 -15 l55 0 0 -110 c0 -91 3 -110 15 -110 12 0 15 19 15 110 l0 110 55 0 c42 0 55 3 55 15 0 12 -13 15 -55 15 l-55 0 0 55 c0 42 -3 55 -15 55 -12 0 -15 -13 -15 -55z m78 -67 l57 -2 -57 -3 -58 -4 -2 -112 -2 -112 -3 113 -4 112 -57 2 -57 2 58 3 57 4 2 57 2 57 3 -57 4 -58 57 -2z"/> </g> </svg>'))))));

      string memory finality_ = finality[_tokenId] == false ? 'false' : 'true';


      return string(
        abi.encodePacked(
          "data:application/json;base64,",
          Base64.encode(
            bytes(
              abi.encodePacked(
                '{"name":"',
                "cancan-", toString(_tokenId),
                '", "attributes":[{"trait_type" : "Finality", "value" : "', finality_ ,'"}], "image":"',imageURI,'"}'
              )
            )
          )
        )
      );
    }

function CREATE(bytes memory artData, bytes memory colorData, bytes memory colorData2, uint256[4] memory colors) internal view returns (string memory) {
      // string memory tempWord = '<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1200.000000pt" height="1200.000000pt" viewBox="0 0 1200.000000 1200.000000" preserveAspectRatio="xMidYMid meet"><g transform="translate(0.000000,1200.000000) scale(0.100000,-0.100000)">';
      bytes memory rects = DynamicBuffer.allocate(2**16);
      // string memory tempWord = "";
         for (uint i = 0; i < 512; i+=8) {
 uint8 workingByte = uint8(artData[i/8]);
 uint8 colorByte = uint8(colorData[i/8]);
 uint8 colorByte2 = uint8(colorData2[i/8]);

  uint256 y = uint256(i / 32);
    uint256 x = uint256(i % 32);
//  uint8 workingByte = uint8(artData[i]);
//  uint8 colorByte = uint8(colorData[i]);
//  uint8 colorByte2 = uint8(colorData2[i]);
for (uint256 ii=0; ii < 8; ii++) {

  if ((workingByte >> (7 - ii)) & 1 == 1) {
          rects.appendSafe(abi.encodePacked('<use xlink:href="#hex" x="',y%2==1 ? toString((x*46) + (ii*46) + 31) : toString((x*46) + (ii*46) + 23 + 31) ,'" y="',
              toString((y*40)+34),'" fill="',svgBackgroundColor2[colors[0]]));//'" fill="', svgBackgroundColor2[colorByte]));
  } else {
        if ((colorByte >> (7 - ii)) & 1 == 1) {
          rects.appendSafe(abi.encodePacked('<use xlink:href="#hex" x="',y%2==1 ? toString((x*46) + (ii*46) + 31) : toString((x*46) + (ii*46) + 23 + 31),'" y="',
              toString((y*40)+34),'" fill="',svgBackgroundColor2[colors[1]]));//'" fill="', svgBackgroundColor2[colorByte]));
        } else {
            if ((colorByte2 >> (7 - ii)) & 1 == 1) {
          rects.appendSafe(abi.encodePacked('<use xlink:href="#hex" x="',y%2==1 ? toString((x*46) + (ii*46) + 31) : toString((x*46) + (ii*46) + 23 + 31),'" y="',
              toString((y*40)+34),'" fill="',svgBackgroundColor2[colors[2]]));//'" fill="', svgBackgroundColor2[colorByte]));
        } else {
            rects.appendSafe(abi.encodePacked('<use xlink:href="#hex" x="',y%2==1 ? toString((x*46) + (ii*46) + 31) : toString((x*46) + (ii*46) + 23 + 31),'" y="',
              toString((y*40)+34),'" fill="',svgBackgroundColor2[colors[3]]));//'" fill="', svgBackgroundColor2[colorByte]));
        }
        }
  }


}
         }
      return string(rects);
    }


// function CREATE(bytes memory artData, bytes memory colorData, bytes memory colorData2, uint256 color1, uint256 color2, uint256 color3) internal view returns (string memory) {
//     // string memory tempWord = '<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1200.000000pt" height="1200.000000pt" viewBox="0 0 1200.000000 1200.000000" preserveAspectRatio="xMidYMid meet"><g transform="translate(0.000000,1200.000000) scale(0.100000,-0.100000)">';
//     bytes memory rects = DynamicBuffer.allocate(2**16);

//     uint xx = 427 + 56;
//     uint yy = 474 - 28;

//     uint y_original;

//     uint x;
//     uint y;

//     for (uint ii = 0; ii < 7; ii+=1) {
//         xx -= 56;
//         yy += 28;

//         y_original = yy + 72;
//         x = xx - 56;
//         y = yy - 28;

//         for (uint i = 0; i < 56; i+=8) {
//             x = xx-56;
// y_original = y_original-72;
// y = y_original-28;

//             uint8 workingByte = uint8(artData[i]);
//             uint8 colorByte = uint8(colorData[i]);
//             // uint8 colorByte2 = uint8(colorData2[i]);
//             for (uint256 iii; iii < 8; iii++) {
//                 x+=56;
//                 y+=28;
//                 if ((workingByte >> (7 - iii)) & 1 == 1) {
//                                             rects.appendSafe(abi.encodePacked('<use xlink:href="#cube" x="',toString(x), '" y="', toString(y),'" fill="',svgBackgroundColor2[1]));//'" fill="', svgBackgroundColor2[colorByte]));

//                     // if ((colorByte >> (7 - iii)) & 1 == 1) {
//                     //     rects.appendSafe(abi.encodePacked('<use xlink:href="#cube" x="',toString(x), '" y="', toString(y),'" fill="',svgBackgroundColor2[1]));//'" fill="', svgBackgroundColor2[colorByte]));
//                     // } else { //if ((colorByte >> (7 - ii)) & 1 == 0)
//                     //         rects.appendSafe(abi.encodePacked('<use xlink:href="#cube" x="',toString(x), '" y="', toString(y),'" fill="',svgBackgroundColor2[2]));//'" fill="', svgBackgroundColor2[colorByte]));
//                     //     }
//                     }
//                 }
//             }
//         }

//       return string(rects);
//     }



    // just in case this fixed variable limits us from future integrations
    function setGasForDestinationLzReceive(uint newVal) external onlyOwner {
        gasForDestinationLzReceive = newVal;
    }

    function toString(uint256 value) internal pure returns (string memory) {
      if (value == 0) {
        return "0";
      }
      uint256 temp = value;
      uint256 digits;
      while (temp != 0) {
        digits++;
        temp /= 10;
      }
      bytes memory buffer = new bytes(digits);
      while (value != 0) {
        digits -= 1;
        buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
        value /= 10;
      }
      return string(buffer);
    }

    // ------------------
    // Internal Functions
    // ------------------

    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) override internal {
        // decode
        (address toAddr, uint tokenId) = abi.decode(_payload, (address, uint));

        // mint the tokens back into existence on destination chain
        _safeMint(toAddr, tokenId);
    }

    function _baseURI() override internal view returns (string memory) {
        return baseURI;
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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"}],"name":"MessageFailed","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":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"features","outputs":[{"internalType":"uint256","name":"data1","type":"uint256"},{"internalType":"uint256","name":"data2","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"finality","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_data1","type":"uint256"},{"internalType":"uint256","name":"_data2","type":"uint256"},{"internalType":"uint256[4]","name":"_colors","type":"uint256[4]"},{"internalType":"uint256[4]","name":"_colorSelectors","type":"uint256[4]"},{"internalType":"uint256","name":"_itemID","type":"uint256"}],"name":"kustomize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_data1","type":"uint256"},{"internalType":"uint256","name":"_itemID","type":"uint256"}],"name":"kustomizeBackground","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":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numTokens","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"onLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_itemID","type":"uint256"}],"name":"setFinality","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"svgBackgroundColor2","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"svgBackgroundColorSelector","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"svgData","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"taken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610190600d556101f4600e55620557306015553480156200002457600080fd5b50604051806040016040528060048152602001636d6b617960e01b815250604051806040016040528060028152602001616d6b60f01b8152506200007762000071620004ad60201b60201c565b620004b1565b81516200008c90600190602085019062000501565b508051620000a290600290602084019062000501565b5050600b80546001600160a01b0319908116331790915560078054909116734d747149a57923beb89f22e6b7b97f7d8c087a00179055506040805180820190915260038082526277777760e81b60209092019182526200010591600c9162000501565b5060408051808201909152600a81526911993232181a9a91179f60b11b60208083019182526000805260129052905162000161917f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b9162000501565b5060408051808201909152600a81526911981cb098999b91179f60b11b60208083019182526001600052601290529051620001be917f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a39162000501565b5060408051808201909152600a81526911981b1a9a999a91179f60b11b602080830191825260026000526012905290516200021b917f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b29162000501565b5060408051808201909152600a815269119c1c31181a3111179f60b11b6020808301918252600360005260129052905162000278917f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976a9162000501565b5060408051808201909152600a8152691198183333333311179f60b11b60208083019182526004600052601290529051620002d5917fb4fcd034df3d20faa1c133b66d862ce92732727d40916b48ffb4020cb00fe0539162000501565b5060408051808201909152600a815269119ab0b1b2b31991179f60b11b6020808301918252600560005260129052905162000332917f45429b9195d4ec5c0cf6c69e9c21a4ca0ea773b702c2de5735f85d2631f267469162000501565b5060408051808201909152600a8152691198181a98333311179f60b11b602080830191825260066000526012905290516200038f917f1223f9031f9dca49a7844c397098ce9a4e80513444d0a8bb59820dff564808e49162000501565b5060408051808201909152600a815269119a1a9a9cb1b191179f60b11b60208083019182526007600052601290529051620003ec917f724fd36bd271795fe7866d4cc83b61084ef704502b00c2e0b28047123b3c1acc9162000501565b5060408051808201909152600a81526911999a1a9b1c3111179f60b11b6020808301918252600860005260129052905162000449917f855d8d6df66418fea944661cfca175a2245b01f09908f1f662c4fa2b3cbf92999162000501565b5060408051808201909152600a815269119c309931329911179f60b11b60208083019182526009600052601290529051620004a6917fb9bfc87ab6d50430c17fad3d76aa4e9fce5cb9f8a8035e5ad64505fa1e31bdb99162000501565b50620005e4565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200050f90620005a7565b90600052602060002090601f0160209004810192826200053357600085556200057e565b82601f106200054e57805160ff19168380011785556200057e565b828001600101855582156200057e579182015b828111156200057e57825182559160200191906001019062000561565b506200058c92915062000590565b5090565b5b808211156200058c576000815560010162000591565b600181811c90821680620005bc57607f821691505b60208210811415620005de57634e487b7160e01b600052602260045260246000fd5b50919050565b61468d80620005f46000396000f3fe6080604052600436106102245760003560e01c80638da5cb5b11610123578063bf5cb29a116100ab578063e985e9c51161006f578063e985e9c5146106d6578063ea099f461461071f578063eb8d72b71461073f578063ed88c68e14610249578063f2fde38b1461075f57600080fd5b8063bf5cb29a14610650578063bf5de29914610670578063c87b56dd14610690578063cf89fa03146106b0578063d1deba1f146106c357600080fd5b806395d89b41116100f257806395d89b41146105bb578063a22cb465146105d0578063ae8c17a4146105f0578063b2bdfa7b14610610578063b88d4fde1461063057600080fd5b80638da5cb5b146104de5780638ede6f9f146104fc5780638ee7491214610545578063943fb8721461059b57600080fd5b80633779bfde116101b15780636ecd2306116101755780636ecd23061461044657806370a0823114610459578063715018a6146104795780637533d7881461048e57806377ce5f69146104ae57600080fd5b80633779bfde1461037e57806342842e0e146103b957806342fc0d1e146103d95780636352211e14610406578063661176611461042657600080fd5b8063095ea7b3116101f8578063095ea7b3146102da5780631c37a822146102fa57806323b872dd1461031a5780632e1a7d4d1461033a5780632fc37ab21461035a57600080fd5b80621d35671461022957806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2575b600080fd5b34801561023557600080fd5b5061024961024436600461306e565b61077f565b005b34801561025757600080fd5b5061026b610266366004612e9e565b610979565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956109cb565b60405161027791906137b2565b3480156102ae57600080fd5b506102c26102bd366004613102565b610a5d565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102496102f5366004612e72565b610af2565b34801561030657600080fd5b5061024961031536600461306e565b610c08565b34801561032657600080fd5b50610249610335366004612d93565b610c77565b34801561034657600080fd5b50610249610355366004613102565b610ca8565b34801561036657600080fd5b50610370600a5481565b604051908152602001610277565b34801561038a57600080fd5b5061026b610399366004612ed8565b805160208183018101805160108252928201919093012091525460ff1681565b3480156103c557600080fd5b506102496103d4366004612d93565b610d79565b3480156103e557600080fd5b506103706103f4366004613102565b60116020526000908152604090205481565b34801561041257600080fd5b506102c2610421366004613102565b610d94565b34801561043257600080fd5b50610295610441366004613102565b610e0b565b6102496104543660046131b3565b610ea5565b34801561046557600080fd5b50610370610474366004612d0f565b610f99565b34801561048557600080fd5b50610249611020565b34801561049a57600080fd5b506102956104a9366004612f20565b611056565b3480156104ba57600080fd5b5061026b6104c9366004613102565b600f6020526000908152604090205460ff1681565b3480156104ea57600080fd5b506000546001600160a01b03166102c2565b34801561050857600080fd5b50610530610517366004613102565b6014602052600090815260409020805460019091015482565b60408051928352602083019190915201610277565b34801561055157600080fd5b50610530610560366004612f8d565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b3480156105a757600080fd5b506102496105b6366004613102565b61106f565b3480156105c757600080fd5b5061029561109e565b3480156105dc57600080fd5b506102496105eb366004612e3f565b6110ad565b3480156105fc57600080fd5b5061024961060b366004613161565b6110b8565b34801561061c57600080fd5b50600b546102c2906001600160a01b031681565b34801561063c57600080fd5b5061024961064b366004612dd4565b611160565b34801561065c57600080fd5b5061029561066b366004613102565b611192565b34801561067c57600080fd5b5061024961068b366004613102565b6111ab565b34801561069c57600080fd5b506102956106ab366004613102565b611417565b6102496106be3660046130e6565b611736565b6102496106d1366004612fe3565b611a46565b3480156106e257600080fd5b5061026b6106f1366004612d5a565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561072b57600080fd5b5061024961073a36600461311b565b611bd3565b34801561074b57600080fd5b5061024961075a366004612f3b565b611c4c565b34801561076b57600080fd5b5061024961077a366004612d0f565b611c94565b6007546001600160a01b0316331461079657600080fd5b61ffff8416600090815260096020526040902080546107b490613b70565b905083511480156107f3575061ffff84166000908152600960205260409081902090516107e191906132b9565b60405180910390208380519060200120145b6108615760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a8229061088a9087908790879087906004016139b9565b600060405180830381600087803b1580156108a457600080fd5b505af19250505080156108b5575060015b610973576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff168152602001908152602001600020846040516108ff919061329d565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d9061096a9086908690869086906139b9565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b14806109aa57506001600160e01b03198216635b5e139f60e01b145b806109c557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546109da90613b70565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0690613b70565b8015610a535780601f10610a2857610100808354040283529160200191610a53565b820191906000526020600020905b815481529060010190602001808311610a3657829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610ad65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610858565b506000908152600560205260409020546001600160a01b031690565b6000610afd82610d94565b9050806001600160a01b0316836001600160a01b03161415610b6b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610858565b336001600160a01b0382161480610b875750610b8781336106f1565b610bf95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610858565b610c038383611d2c565b505050565b333014610c6b5760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b6064820152608401610858565b61097384848484611d9a565b610c813382611dc7565b610c9d5760405162461bcd60e51b815260040161085890613883565b610c03838383611ebe565b6000546001600160a01b03163314610cd25760405162461bcd60e51b81526004016108589061384e565b600b546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610d1f576040519150601f19603f3d011682016040523d82523d6000602084013e610d24565b606091505b5050905080610d755760405162461bcd60e51b815260206004820152601c60248201527f47473a204661696c656420746f207769746864726177204574686572000000006044820152606401610858565b5050565b610c0383838360405180602001604052806000815250611160565b6000818152600360205260408120546001600160a01b0316806109c55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610858565b60126020526000908152604090208054610e2490613b70565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5090613b70565b8015610e9d5780601f10610e7257610100808354040283529160200191610e9d565b820191906000526020600020905b815481529060010190602001808311610e8057829003601f168201915b505050505081565b60038160ff1610610ef85760405162461bcd60e51b815260206004820152601e60248201527f47473a204d61782032204e46547320706572207472616e73616374696f6e00006044820152606401610858565b600e548160ff16600d54610f0c9190613ae2565b1115610f5a5760405162461bcd60e51b815260206004820152601760248201527f47473a204d696e74206578636565647320737570706c790000000000000000006044820152606401610858565b610f7733600d60008154610f6d90613bab565b918290555061205e565b8060ff1660021415610f9657610f9633600d60008154610f6d90613bab565b50565b60006001600160a01b0382166110045760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610858565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b0316331461104a5760405162461bcd60e51b81526004016108589061384e565b6110546000612078565b565b60096020526000908152604090208054610e2490613b70565b6000546001600160a01b031633146110995760405162461bcd60e51b81526004016108589061384e565b601555565b6060600280546109da90613b70565b610d753383836120c8565b6110c181610d94565b6001600160a01b0316336001600160a01b0316146110f15760405162461bcd60e51b8152600401610858906138d4565b6000818152600f602052604090205460ff16156111205760405162461bcd60e51b815260040161085890613817565b60008181526014602052604090208581556001810185905561114760028201856004612ac1565b5061115760068201846004612ac1565b50505050505050565b61116a3383611dc7565b6111865760405162461bcd60e51b815260040161085890613883565b61097384848484612197565b60136020526000908152604090208054610e2490613b70565b6111b481610d94565b6001600160a01b0316336001600160a01b0316146111e45760405162461bcd60e51b8152600401610858906138d4565b6000818152600f602052604090205460ff161561123c5760405162461bcd60e51b81526020600482015260166024820152755448495320495320414c52454144592046494e414c2160501b6044820152606401610858565b60008181526014602090815260408083208151608080820184528254825260018301549482019490945282519384018084529093919284019190600284019060049082845b81548152602001906001019080831161128157505050918352505060408051608081019182905260209092019190600684019060049082845b8154815260200190600101908083116112ba57505050505081525050905060008160000151826020015183604001516000600481106112fb576112fb613c06565b60209081029190910151604086810151808401518183015160609283015184519687019890985292850195909552830191909152608082019290925260a081019190915260c081019190915260e001604051602081830303815290604052905060108160405161136b919061329d565b9081526040519081900360200190205460ff16156113c45760405162461bcd60e51b81526020600482015260166024820152755448495320495320414c52454144592054414b454e2160501b6044820152606401610858565b6000838152600f602052604090819020805460ff1916600190811790915590516010906113f290849061329d565b908152604051908190036020019020805491151560ff19909216919091179055505050565b6000818152600360205260409020546060906001600160a01b03166114965760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610858565b60008281526014602090815260408083208151608080820184528254825260018301549482019490945282519384018084529093919284019190600284019060049082845b8154815260200190600101908083116114db57505050918352505060408051608081019182905260209092019190600684019060049082845b815481526020019060010190808311611514575050505050815250509050600081600001518260200151604051602001611558929190918252602082015260400190565b60408051601f198184030181528282528482018051805160209182015182870191909152858501528351808603850181526060808701865292518086015190840151608088019190915260a0808801919091528551808803909101815260c0909601855260008a8152601183528581205481526012909252938120918701519295509293929161166d91906115f2908790879087906121ca565b60008a8152600f602052604090205460ff161561162a576040518061084001604052806108118152602001613e476108119139611647565b604051806101e001604052806101a98152602001613c5e6101a991395b604051602001611659939291906133ed565b6040516020818303038152906040526124ef565b60405160200161167d91906133a8565b60408051601f198184030181529181526000898152600f602052908120549192509060ff16156116c957604051806040016040528060048152602001637472756560e01b8152506116e8565b6040518060400160405280600581526020016466616c736560d81b8152505b905061170a6116f689612654565b8284604051602001611659939291906132c5565b60405160200161171a919061373a565b6040516020818303038152906040529650505050505050919050565b61173f81610d94565b6001600160a01b0316336001600160a01b0316146117aa5760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b6064820152608401610858565b61ffff8216600090815260096020526040812080546117c890613b70565b90501161182e5760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b6064820152608401610858565b6000818152600f602052604090205460ff161561185d5760405162461bcd60e51b815260040161085890613817565b61186681612751565b60408051336020820152808201839052815180820383018152606082018352601554600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb10906118e9908990309089908790899060a601613904565b604080518083038186803b15801561190057600080fd5b505afa158015611914573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611938919061313d565b509050803410156119c15760405162461bcd60e51b815260206004820152604760248201527f47473a206d73672e76616c7565206e6f7420656e6f75676820746f20636f766560448201527f72206d6573736167654665652e2053656e642067617320666f72206d657373616064820152666765206665657360c81b608482015260a401610858565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611a0c928c928b913391908b90600401613a02565b6000604051808303818588803b158015611a2557600080fd5b505af1158015611a39573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600860205260408082209051611a6790879061329d565b90815260408051602092819003830190206001600160401b0387166000908152925290206001810154909150611aee5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b6064820152608401610858565b805482148015611b18575080600101548383604051611b0e92919061328d565b6040518091039020145b611b645760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610858565b60008082556001820155604051630e1bd41160e11b81523090631c37a82290611b999089908990899089908990600401613958565b600060405180830381600087803b158015611bb357600080fd5b505af1158015611bc7573d6000803e3d6000fd5b50505050505050505050565b611bdc81610d94565b6001600160a01b0316336001600160a01b031614611c0c5760405162461bcd60e51b8152600401610858906138d4565b6000818152600f602052604090205460ff1615611c3b5760405162461bcd60e51b815260040161085890613817565b600090815260116020526040902055565b6000546001600160a01b03163314611c765760405162461bcd60e51b81526004016108589061384e565b61ffff83166000908152600960205260409020610973908383612aff565b6000546001600160a01b03163314611cbe5760405162461bcd60e51b81526004016108589061384e565b6001600160a01b038116611d235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610858565b610f9681612078565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d6182610d94565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008082806020019051810190611db19190612d2c565b91509150611dbf828261205e565b505050505050565b6000818152600360205260408120546001600160a01b0316611e405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610858565b6000611e4b83610d94565b9050806001600160a01b0316846001600160a01b03161480611e865750836001600160a01b0316611e7b84610a5d565b6001600160a01b0316145b80611eb657506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ed182610d94565b6001600160a01b031614611f395760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610858565b6001600160a01b038216611f9b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610858565b611fa6600082611d2c565b6001600160a01b0383166000908152600460205260408120805460019290611fcf908490613b2d565b90915550506001600160a01b0382166000908152600460205260408120805460019290611ffd908490613ae2565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d758282604051806020016040528060008152506127ec565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b0316141561212a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610858565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6121a2848484611ebe565b6121ae8484848461281f565b6109735760405162461bcd60e51b8152600401610858906137c5565b60408051620100608101909152620100408152600060209091018181526060915b6102008110156124e557600087612203600884613afa565b8151811061221357612213613c06565b016020015160f81c905060008761222b600885613afa565b8151811061223b5761223b613c06565b016020015160f81c9050600087612253600886613afa565b8151811061226357612263613c06565b0160209081015160f81c915060009061227c9086613afa565b9050600061228b602087613bc6565b905060005b60088110156124cb576122a4816007613b2d565b600160ff881690911c811614156123915761238c6122c3600285613bc6565b60011461230d576123086122d883602e613b0e565b6122e385602e613b0e565b6122ed9190613ae2565b6122f8906017613ae2565b61230390601f613ae2565b612654565b612330565b61233061231b83602e613b0e565b61232685602e613b0e565b6122f89190613ae2565b61234961233e866028613b0e565b612303906022613ae2565b601260008e815b60200201518152602001908152602001600020604051602001612375939291906136b0565b60408051601f198184030181529190528990612929565b6124b9565b61239c816007613b2d565b600160ff871690911c811614156123fd5761238c6123bb600285613bc6565b6001146123d5576123d06122d883602e613b0e565b6123e3565b6123e361231b83602e613b0e565b6123f161233e866028613b0e565b601260008e6001612350565b612408816007613b2d565b600160ff861690911c811614156124695761238c612427600285613bc6565b6001146124415761243c6122d883602e613b0e565b61244f565b61244f61231b83602e613b0e565b61245d61233e866028613b0e565b601260008e6002612350565b6124b9612477600285613bc6565b6001146124915761248c6122d883602e613b0e565b61249f565b61249f61231b83602e613b0e565b6124ad61233e866028613b0e565b601260008e6003612350565b806124c381613bab565b915050612290565b5050505050506008816124de9190613ae2565b90506121eb565b5095945050505050565b606081516000141561250f57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613e07604091399050600060038451600261253e9190613ae2565b6125489190613afa565b612553906004613b0e565b90506000612562826020613ae2565b6001600160401b0381111561257957612579613c1c565b6040519080825280601f01601f1916602001820160405280156125a3576020820181803683370190505b509050818152600183018586518101602084015b8183101561260f576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253506001016125b7565b600389510660018114612629576002811461263a57612646565b613d3d60f01b600119830152612646565b603d60f81b6000198301525b509398975050505050505050565b6060816126785750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126a2578061268c81613bab565b915061269b9050600a83613afa565b915061267c565b6000816001600160401b038111156126bc576126bc613c1c565b6040519080825280601f01601f1916602001820160405280156126e6576020820181803683370190505b5090505b8415611eb6576126fb600183613b2d565b9150612708600a86613bc6565b612713906030613ae2565b60f81b81838151811061272857612728613c06565b60200101906001600160f81b031916908160001a90535061274a600a86613afa565b94506126ea565b600061275c82610d94565b9050612769600083611d2c565b6001600160a01b0381166000908152600460205260408120805460019290612792908490613b2d565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6127f683836129ae565b612803600084848461281f565b610c035760405162461bcd60e51b8152600401610858906137c5565b60006001600160a01b0384163b1561292157604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061286390339089908890889060040161377f565b602060405180830381600087803b15801561287d57600080fd5b505af19250505080156128ad575060408051601f3d908101601f191682019092526128aa91810190612ebb565b60015b612907573d8080156128db576040519150601f19603f3d011682016040523d82523d6000602084013e6128e0565b606091505b5080516128ff5760405162461bcd60e51b8152600401610858906137c5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611eb6565b506001611eb6565b601f1982015182518251603f199092019182906129469083613ae2565b11156129a45760405162461bcd60e51b815260206004820152602760248201527f44796e616d69634275666665723a20417070656e64696e67206f7574206f66206044820152663137bab732399760c91b6064820152608401610858565b6109738484612a8b565b6001600160a01b038216612a045760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610858565b6001600160a01b0382166000908152600460205260408120805460019290612a2d908490613ae2565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8051602082019150808201602084510184015b81841015612ab6578351815260209384019301612a9e565b505082510190915250565b8260048101928215612aef579160200282015b82811115612aef578251825591602001919060010190612ad4565b50612afb929150612b73565b5090565b828054612b0b90613b70565b90600052602060002090601f016020900481019282612b2d5760008555612aef565b82601f10612b465782800160ff19823516178555612aef565b82800160010185558215612aef579182015b82811115612aef578235825591602001919060010190612b58565b5b80821115612afb5760008155600101612b74565b60006001600160401b0380841115612ba257612ba2613c1c565b604051601f8501601f19908116603f01168101908282118183101715612bca57612bca613c1c565b81604052809350858152868686011115612be357600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112612c0e57600080fd5b604051608081018181106001600160401b0382111715612c3057612c30613c1c565b604052808360808101861015612c4557600080fd5b60005b6004811015612c67578135835260209283019290910190600101612c48565b509195945050505050565b60008083601f840112612c8457600080fd5b5081356001600160401b03811115612c9b57600080fd5b602083019150836020828501011115612cb357600080fd5b9250929050565b600082601f830112612ccb57600080fd5b612cda83833560208501612b88565b9392505050565b803561ffff81168114612cf357600080fd5b919050565b80356001600160401b0381168114612cf357600080fd5b600060208284031215612d2157600080fd5b8135612cda81613c32565b60008060408385031215612d3f57600080fd5b8251612d4a81613c32565b6020939093015192949293505050565b60008060408385031215612d6d57600080fd5b8235612d7881613c32565b91506020830135612d8881613c32565b809150509250929050565b600080600060608486031215612da857600080fd5b8335612db381613c32565b92506020840135612dc381613c32565b929592945050506040919091013590565b60008060008060808587031215612dea57600080fd5b8435612df581613c32565b93506020850135612e0581613c32565b92506040850135915060608501356001600160401b03811115612e2757600080fd5b612e3387828801612cba565b91505092959194509250565b60008060408385031215612e5257600080fd5b8235612e5d81613c32565b915060208301358015158114612d8857600080fd5b60008060408385031215612e8557600080fd5b8235612e9081613c32565b946020939093013593505050565b600060208284031215612eb057600080fd5b8135612cda81613c47565b600060208284031215612ecd57600080fd5b8151612cda81613c47565b600060208284031215612eea57600080fd5b81356001600160401b03811115612f0057600080fd5b8201601f81018413612f1157600080fd5b611eb684823560208401612b88565b600060208284031215612f3257600080fd5b612cda82612ce1565b600080600060408486031215612f5057600080fd5b612f5984612ce1565b925060208401356001600160401b03811115612f7457600080fd5b612f8086828701612c72565b9497909650939450505050565b600080600060608486031215612fa257600080fd5b612fab84612ce1565b925060208401356001600160401b03811115612fc657600080fd5b612fd286828701612cba565b925050604084013590509250925092565b600080600080600060808688031215612ffb57600080fd5b61300486612ce1565b945060208601356001600160401b038082111561302057600080fd5b61302c89838a01612cba565b955061303a60408901612cf8565b9450606088013591508082111561305057600080fd5b5061305d88828901612c72565b969995985093965092949392505050565b6000806000806080858703121561308457600080fd5b61308d85612ce1565b935060208501356001600160401b03808211156130a957600080fd5b6130b588838901612cba565b94506130c360408801612cf8565b935060608701359150808211156130d957600080fd5b50612e3387828801612cba565b600080604083850312156130f957600080fd5b612e9083612ce1565b60006020828403121561311457600080fd5b5035919050565b6000806040838503121561312e57600080fd5b50508035926020909101359150565b6000806040838503121561315057600080fd5b505080516020909101519092909150565b6000806000806000610160868803121561317a57600080fd5b85359450602086013593506131928760408801612bfd565b92506131a18760c08801612bfd565b94979396509194610140013592915050565b6000602082840312156131c557600080fd5b813560ff81168114612cda57600080fd5b600081518084526131ee816020860160208601613b44565b601f01601f19169290920160200192915050565b60008151613214818560208601613b44565b9290920192915050565b6000815461322b81613b70565b60018281168015613243576001811461325457613283565b60ff19841687528287019450613283565b8560005260208060002060005b8581101561327a5781548a820152908401908201613261565b50505082870194505b5050505092915050565b8183823760009101908152919050565b600082516132af818460208701613b44565b9190910192915050565b6000612cda828461321e565b683d913730b6b2911d1160b91b81526663616e63616e2d60c81b600982015283516000906132fa816010850160208901613b44565b7f222c202261747472696275746573223a5b7b2274726169745f7479706522203a6010918401918201527f202246696e616c697479222c202276616c756522203a202200000000000000006030820152845161335d816048840160208901613b44565b6d113eae96101134b6b0b3b2911d1160911b60489290910191820152835161338c816056840160208801613b44565b61227d60f01b6056929091019182015260580195945050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c2000000000008152600082516133e081601b850160208701613b44565b91909101601b0192915050565b7f203c7376672076657273696f6e3d22312e302220786d6c6e733d22687474703a81527f2f2f7777772e77332e6f72672f323030302f737667222077696474683d22313660208201527f30302e303030303030707422206865696768743d223830302e3030303030307060408201527f74222076696577426f783d2230203020313630302e303030303030203830302e60608201527f30303030303022207072657365727665417370656374526174696f3d22784d6960808201527f64594d6964206d6565742220786d6c6e733a786c696e6b3d22687474703a2f2f60a08201527f7777772e77332e6f72672f313939392f786c696e6b223e20203c646566733e2060c08201527f3c706f6c79676f6e20706f696e74733d2232342e382c32322033372e332c323960e08201527f2e322033372e332c34332e372032342e382c35302e392031322e332c34332e376101008201527f2031322e332c32392e32222069643d2268657822207472616e73666f726d3d226101208201527f7363616c6528312e382c312e382922202f3e203c2f646566733e3c67207472616101408201527f6e73666f726d3d227472616e736c61746528302e3030303030302c3830302e306101608201527f303030303029207363616c6528302e3130303030302c2d302e313030303030296101808201527f222066696c6c3d222330303030303022207374726f6b653d226e6f6e65223e206101a08201527f3c7061746820643d224d302034303030206c30202d34303030203830303020306101c08201527f203830303020302030203430303020302034303030202d383030302030202d386101e0820152751818181018101810169a1818183d11103334b6361e9160511b61020082015260006136a76136a161369b61368b61021686018961321e565b631e17b39f60e11b815260040190565b86613202565b84613202565b95945050505050565b7f3c75736520786c696e6b3a687265663d22236865782220783d220000000000008152600084516136e881601a850160208901613b44565b6411103c9e9160d91b601a91840191820152845161370d81601f840160208901613b44565b6711103334b6361e9160c11b601f9290910191820152613730602782018561321e565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161377281601d850160208701613b44565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613730908301846131d6565b602081526000612cda60208301846131d6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601f908201527f4f4e4c59204e4f4e2d46494e414c4954592043414e2054524156455253452100604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b602080825260169082015275594f5520415245204e4f5420544845204f574e45522160501b604082015260600190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090613932908301866131d6565b8415156060840152828103608084015261394c81856131d6565b98975050505050505050565b61ffff8616815260806020820152600061397560808301876131d6565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006139d660808301866131d6565b6001600160401b038516604084015282810360608401526139f781856131d6565b979650505050505050565b61ffff871681526000602060c08184015260008854613a2081613b70565b8060c087015260e0600180841660008114613a425760018114613a5757613a85565b60ff1985168984015261010089019550613a85565b8d6000528660002060005b85811015613a7d5781548b8201860152908301908801613a62565b8a0184019650505b50505050508381036040850152613a9c81896131d6565b915050613ab460608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152613ad581856131d6565b9998505050505050505050565b60008219821115613af557613af5613bda565b500190565b600082613b0957613b09613bf0565b500490565b6000816000190483118215151615613b2857613b28613bda565b500290565b600082821015613b3f57613b3f613bda565b500390565b60005b83811015613b5f578181015183820152602001613b47565b838111156109735750506000910152565b600181811c90821680613b8457607f821691505b60208210811415613ba557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613bbf57613bbf613bda565b5060010190565b600082613bd557613bd5613bf0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f9657600080fd5b6001600160e01b031981168114610f9657600080fdfe3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c3830302e30303030303029207363616c6528302e3130303030302c2d302e31303030303029222066696c6c3d222330303030303022207374726f6b653d226e6f6e65223e203c7061746820643d224d313532373020363430206c30202d3530202d35352030202d353520302030202d34392030202d3530203533202d33203532202d332033202d3130322033202d313033203439203020353020302030203130352030203130352035302030203530203020302035302030203530202d35302030202d3530203020302035302030203530202d35302030202d353020302030202d35307a204d313536323020363430206c30202d3530202d35302030202d353020302030202d35302030202d3530203530203020353020302030202d3130352030202d313035203530203020343920302033203130332033203130322035332033203532203320302035302030203439202d35352030202d3535203020302035302030203530202d35302030202d353020302030202d35307a222f3e203c2f673e203c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c3830302e30303030303029207363616c6528302e3130303030302c2d302e31303030303029222066696c6c3d222330303030303022207374726f6b653d226e6f6e65223e203c7061746820643d224d313532343020363535206c30202d3535202d35352030202d353520302030202d35352030202d3535203535203020353520302030202d3131302030202d313130203535203020353520302030203131302030203131302035352030203535203020302035352030203535202d35352030202d3535203020302035352030203535202d35352030202d353520302030202d35357a206d313030202d3130206c30202d3535203535203020353520302030202d34352030202d3435202d35352030202d353520302030202d3131302030202d313130202d34352030202d34352030203020313130203020313130202d35352030202d35352030203020343520302034352035352030203535203020302035352030203535203435203020343520302030202d35357a204d313532363020363335206c30202d3535202d35352030202d353520302030202d33352030202d3335203535203020353520302030202d3131302030202d313130203335203020333520302030203131302030203131302035352030203535203020302033352030203335202d35352030202d3535203020302035352030203535202d33352030202d333520302030202d35357a206d3630202d3130206c30202d35352035352030206335322030203535202d31203535202d32352030202d3234202d33202d3235202d3535202d3235206c2d353520302030202d3131302030202d313130202d32352030202d32352030203020313130203020313130202d3535203020632d35322030202d35352031202d353520323520302032342033203235203535203235206c35352030203020353520633020353220312035352032352035352032342030203235202d33203235202d35357a204d313532383020363135206c30202d3535202d3535203020632d34322030202d3535202d33202d3535202d31352030202d3132203133202d3135203535202d3135206c353520302030202d313130206330202d39312033202d313130203135202d313130203132203020313520313920313520313130206c3020313130203535203020633432203020353520332035352031352030203132202d3133203135202d3535203135206c2d353520302030203535206330203432202d33203535202d3135203535202d31322030202d3135202d3133202d3135202d35357a206d3738202d3637206c3537202d32202d3537202d33202d3538202d34202d32202d313132202d32202d313132202d3320313133202d3420313132202d35372032202d3537203220353820332035372034203220353720322035372033202d35372034202d3538203537202d327a204d313536333020363535206c30202d3535202d35352030202d353520302030202d35352030202d3535203535203020353520302030202d3131302030202d313130203535203020353520302030203131302030203131302035352030203535203020302035352030203535202d35352030202d3535203020302035352030203535202d35352030202d353520302030202d35357a206d313030202d3130206c30202d3535203535203020353520302030202d34352030202d3435202d35352030202d353520302030202d3131302030202d313130202d34352030202d34352030203020313130203020313130202d35352030202d35352030203020343520302034352035352030203535203020302035352030203535203435203020343520302030202d35357a204d313536353020363335206c30202d3535202d35352030202d353520302030202d33352030202d3335203535203020353520302030202d3131302030202d313130203335203020333520302030203131302030203131302035352030203535203020302033352030203335202d35352030202d3535203020302035352030203535202d33352030202d333520302030202d35357a206d3630202d3130206c30202d35352035352030206335322030203535202d31203535202d32352030202d3234202d33202d3235202d3535202d3235206c2d353520302030202d3131302030202d313130202d32352030202d32352030203020313130203020313130202d3535203020632d35322030202d35352031202d353520323520302032342033203235203535203235206c35352030203020353520633020353220312035352032352035352032342030203235202d33203235202d35357a204d313536373020363135206c30202d3535202d3535203020632d34322030202d3535202d33202d3535202d31352030202d3132203133202d3135203535202d3135206c353520302030202d313130206330202d39312033202d313130203135202d313130203132203020313520313920313520313130206c3020313130203535203020633432203020353520332035352031352030203132202d3133203135202d3535203135206c2d353520302030203535206330203432202d33203535202d3135203535202d31322030202d3135202d3133202d3135202d35357a206d3738202d3637206c3537202d32202d3537202d33202d3538202d34202d32202d313132202d32202d313132202d3320313133202d3420313132202d35372032202d3537203220353820332035372034203220353720322035372033202d35372034202d3538203537202d327a222f3e203c2f673e203c2f7376673ea26469706673582212201d1a68c7f9bfbee8a4fdbce1190eddcb387766cc4925af31ad566837ef4cc02c64736f6c63430008070033

Deployed ByteCode Sourcemap

58081:22335:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55189:948;;;;;;;;;;-1:-1:-1;55189:948:0;;;;;:::i;:::-;;:::i;:::-;;42262:305;;;;;;;;;;-1:-1:-1;42262:305:0;;;;;:::i;:::-;;:::i;:::-;;;21024:14:1;;21017:22;20999:41;;20987:2;20972:18;42262:305:0;;;;;;;;43207:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44766:221::-;;;;;;;;;;-1:-1:-1;44766:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;20032:32:1;;;20014:51;;20002:2;19987:18;44766:221:0;19868:203:1;44289:411:0;;;;;;;;;;-1:-1:-1;44289:411:0;;;;;:::i;:::-;;:::i;56145:356::-;;;;;;;;;;-1:-1:-1;56145:356:0;;;;;:::i;:::-;;:::i;45516:339::-;;;;;;;;;;-1:-1:-1;45516:339:0;;;;;:::i;:::-;;:::i;64388:174::-;;;;;;;;;;-1:-1:-1;64388:174:0;;;;;:::i;:::-;;:::i;58176:26::-;;;;;;;;;;;;;;;;;;;21197:25:1;;;21185:2;21170:18;58176:26:0;21051:177:1;58735:37:0;;;;;;;;;;-1:-1:-1;58735:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45926:185;;;;;;;;;;-1:-1:-1;45926:185:0;;;;;:::i;:::-;;:::i;58781:62::-;;;;;;;;;;-1:-1:-1;58781:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;42901:239;;;;;;;;;;-1:-1:-1;42901:239:0;;;;;:::i;:::-;;:::i;58854:54::-;;;;;;;;;;-1:-1:-1;58854:54:0;;;;;:::i;:::-;;:::i;60453:349::-;;;;;;:::i;:::-;;:::i;42631:208::-;;;;;;;;;;-1:-1:-1;42631:208:0;;;;;:::i;:::-;;:::i;21224:103::-;;;;;;;;;;;;;:::i;55031:51::-;;;;;;;;;;-1:-1:-1;55031:51:0;;;;;:::i;:::-;;:::i;58687:41::-;;;;;;;;;;-1:-1:-1;58687:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;20573:87;;;;;;;;;;-1:-1:-1;20619:7:0;20646:6;-1:-1:-1;;;;;20646:6:0;20573:87;;58972:44;;;;;;;;;;-1:-1:-1;58972:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;37371:25:1;;;37427:2;37412:18;;37405:34;;;;37344:18;58972:44:0;37197:248:1;54934:90:0;;;;;;;;;;-1:-1:-1;54934:90:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79255:125;;;;;;;;;;-1:-1:-1;79255:125:0;;;;;:::i;:::-;;:::i;43376:104::-;;;;;;;;;;;;;:::i;45059:155::-;;;;;;;;;;-1:-1:-1;45059:155:0;;;;;:::i;:::-;;:::i;64570:569::-;;;;;;;;;;-1:-1:-1;64570:569:0;;;;;:::i;:::-;;:::i;58239:21::-;;;;;;;;;;-1:-1:-1;58239:21:0;;;;-1:-1:-1;;;;;58239:21:0;;;46182:328;;;;;;;;;;-1:-1:-1;46182:328:0;;;;;:::i;:::-;;:::i;58923:42::-;;;;;;;;;;-1:-1:-1;58923:42:0;;;;;:::i;:::-;;:::i;61054:611::-;;;;;;;;;;-1:-1:-1;61054:611:0;;;;;:::i;:::-;;:::i;65437:9079::-;;;;;;;;;;-1:-1:-1;65437:9079:0;;;;;:::i;:::-;;:::i;62483:1662::-;;;;;;:::i;:::-;;:::i;56977:758::-;;;;;;:::i;:::-;;:::i;45285:164::-;;;;;;;;;;-1:-1:-1;45285:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;45406:25:0;;;45382:4;45406:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45285:164;65143:287;;;;;;;;;;-1:-1:-1;65143:287:0;;;;;:::i;:::-;;:::i;57743:158::-;;;;;;;;;;-1:-1:-1;57743:158:0;;;;;:::i;:::-;;:::i;21482:201::-;;;;;;;;;;-1:-1:-1;21482:201:0;;;;;:::i;:::-;;:::i;55189:948::-;55351:8;;-1:-1:-1;;;;;55351:8:0;55329:10;:31;55321:40;;;;;;55472:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;55450:11;:18;:61;:134;;;;-1:-1:-1;55551:32:0;;;;;;;:19;:32;;;;;;;55541:43;;;;55551:32;55541:43;:::i;:::-;;;;;;;;55525:11;55515:22;;;;;;:69;55450:134;55442:212;;;;-1:-1:-1;;;55442:212:0;;30176:2:1;55442:212:0;;;30158:21:1;30215:2;30195:18;;;30188:30;30254:34;30234:18;;;30227:62;-1:-1:-1;;;30305:18:1;;;30298:50;30365:19;;55442:212:0;;;;;;;;;55782:60;;-1:-1:-1;;;55782:60:0;;:4;;:16;;:60;;55799:11;;55812;;55825:6;;55833:8;;55782:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55778:352;;55989:52;;;;;;;;56004:8;:15;55989:52;;;;56031:8;56021:19;;;;;;55989:52;;;55938:14;:27;55953:11;55938:27;;;;;;;;;;;;;;;55966:11;55938:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55938:48:0;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;56061:57;;;;56075:11;;56088;;55979:6;;56109:8;;56061:57;:::i;:::-;;;;;;;;55778:352;55189:948;;;;:::o;42262:305::-;42364:4;-1:-1:-1;;;;;;42401:40:0;;-1:-1:-1;;;42401:40:0;;:105;;-1:-1:-1;;;;;;;42458:48:0;;-1:-1:-1;;;42458:48:0;42401:105;:158;;;-1:-1:-1;;;;;;;;;;35140:40:0;;;42523:36;42381:178;42262:305;-1:-1:-1;;42262:305:0:o;43207:100::-;43261:13;43294:5;43287:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43207:100;:::o;44766:221::-;44842:7;48109:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48109:16:0;44862:73;;;;-1:-1:-1;;;44862:73:0;;29402:2:1;44862:73:0;;;29384:21:1;29441:2;29421:18;;;29414:30;29480:34;29460:18;;;29453:62;-1:-1:-1;;;29531:18:1;;;29524:42;29583:19;;44862:73:0;29200:408:1;44862:73:0;-1:-1:-1;44955:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;44955:24:0;;44766:221::o;44289:411::-;44370:13;44386:23;44401:7;44386:14;:23::i;:::-;44370:39;;44434:5;-1:-1:-1;;;;;44428:11:0;:2;-1:-1:-1;;;;;44428:11:0;;;44420:57;;;;-1:-1:-1;;;44420:57:0;;31423:2:1;44420:57:0;;;31405:21:1;31462:2;31442:18;;;31435:30;31501:34;31481:18;;;31474:62;-1:-1:-1;;;31552:18:1;;;31545:31;31593:19;;44420:57:0;31221:397:1;44420:57:0;19377:10;-1:-1:-1;;;;;44512:21:0;;;;:62;;-1:-1:-1;44537:37:0;44554:5;19377:10;45285:164;:::i;44537:37::-;44490:168;;;;-1:-1:-1;;;44490:168:0;;26313:2:1;44490:168:0;;;26295:21:1;26352:2;26332:18;;;26325:30;26391:34;26371:18;;;26364:62;26462:26;26442:18;;;26435:54;26506:19;;44490:168:0;26111:420:1;44490:168:0;44671:21;44680:2;44684:7;44671:8;:21::i;:::-;44359:341;44289:411;;:::o;56145:356::-;56314:10;56336:4;56314:27;56306:83;;;;-1:-1:-1;;;56306:83:0;;27919:2:1;56306:83:0;;;27901:21:1;27958:2;27938:18;;;27931:30;27997:34;27977:18;;;27970:62;-1:-1:-1;;;28048:18:1;;;28041:41;28099:19;;56306:83:0;27717:407:1;56306:83:0;56438:55;56450:11;56463;56476:6;56484:8;56438:10;:55::i;45516:339::-;45711:41;19377:10;45744:7;45711:18;:41::i;:::-;45703:103;;;;-1:-1:-1;;;45703:103:0;;;;;;;:::i;:::-;45819:28;45829:4;45835:2;45839:7;45819:9;:28::i;64388:174::-;20619:7;20646:6;-1:-1:-1;;;;;20646:6:0;19377:10;20793:23;20785:68;;;;-1:-1:-1;;;20785:68:0;;;;;;;:::i;:::-;64470:6:::1;::::0;64462:36:::1;::::0;64447:9:::1;::::0;-1:-1:-1;;;;;64470:6:0::1;::::0;64490:3;;64447:9;64462:36;64447:9;64462:36;64490:3;64470:6;64462:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64446:52;;;64517:4;64509:45;;;::::0;-1:-1:-1;;;64509:45:0;;32650:2:1;64509:45:0::1;::::0;::::1;32632:21:1::0;32689:2;32669:18;;;32662:30;32728;32708:18;;;32701:58;32776:18;;64509:45:0::1;32448:352:1::0;64509:45:0::1;64435:127;64388:174:::0;:::o;45926:185::-;46064:39;46081:4;46087:2;46091:7;46064:39;;;;;;;;;;;;:16;:39::i;42901:239::-;42973:7;43009:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43009:16:0;43044:19;43036:73;;;;-1:-1:-1;;;43036:73:0;;27149:2:1;43036:73:0;;;27131:21:1;27188:2;27168:18;;;27161:30;27227:34;27207:18;;;27200:62;-1:-1:-1;;;27278:18:1;;;27271:39;27327:19;;43036:73:0;26947:405:1;58854:54:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60453:349::-;60532:1;60520:9;:13;;;60512:56;;;;-1:-1:-1;;;60512:56:0;;28331:2:1;60512:56:0;;;28313:21:1;28370:2;28350:18;;;28343:30;28409:32;28389:18;;;28382:60;28459:18;;60512:56:0;28129:354:1;60512:56:0;60614:12;;60601:9;60587:23;;:11;;:23;;;;:::i;:::-;:39;;60579:75;;;;-1:-1:-1;;;60579:75:0;;33007:2:1;60579:75:0;;;32989:21:1;33046:2;33026:18;;;33019:30;33085:25;33065:18;;;33058:53;33128:18;;60579:75:0;32805:347:1;60579:75:0;60665:36;60675:10;60689:11;;60687:13;;;;;:::i;:::-;;;;;-1:-1:-1;60665:9:0;:36::i;:::-;60716:9;:14;;60729:1;60716:14;60712:83;;;60747:36;60757:10;60771:11;;60769:13;;;;;:::i;60747:36::-;60453:349;:::o;42631:208::-;42703:7;-1:-1:-1;;;;;42731:19:0;;42723:74;;;;-1:-1:-1;;;42723:74:0;;26738:2:1;42723:74:0;;;26720:21:1;26777:2;26757:18;;;26750:30;26816:34;26796:18;;;26789:62;-1:-1:-1;;;26867:18:1;;;26860:40;26917:19;;42723:74:0;26536:406:1;42723:74:0;-1:-1:-1;;;;;;42815:16:0;;;;;:9;:16;;;;;;;42631:208::o;21224:103::-;20619:7;20646:6;-1:-1:-1;;;;;20646:6:0;19377:10;20793:23;20785:68;;;;-1:-1:-1;;;20785:68:0;;;;;;;:::i;:::-;21289:30:::1;21316:1;21289:18;:30::i;:::-;21224:103::o:0;55031:51::-;;;;;;;;;;;;;;;;:::i;79255:125::-;20619:7;20646:6;-1:-1:-1;;;;;20646:6:0;19377:10;20793:23;20785:68;;;;-1:-1:-1;;;20785:68:0;;;;;;;:::i;:::-;79337:26:::1;:35:::0;79255:125::o;43376:104::-;43432:13;43465:7;43458:14;;;;;:::i;45059:155::-;45154:52;19377:10;45187:8;45197;45154:18;:52::i;64570:569::-;64738:16;64746:7;64738;:16::i;:::-;-1:-1:-1;;;;;64724:30:0;:10;-1:-1:-1;;;;;64724:30:0;;64716:65;;;;-1:-1:-1;;;64716:65:0;;;;;;;:::i;:::-;64800:17;;;;:8;:17;;;;;;;;:26;64792:70;;;;-1:-1:-1;;;64792:70:0;;;;;;;:::i;:::-;64873:24;64900:17;;;:8;:17;;;;;64926:22;;;64957:13;;;:22;;;65058:24;:14;;;65075:7;65058:24;;:::i;:::-;-1:-1:-1;65091:40:0;:22;;;65116:15;65091:40;;:::i;:::-;;64707:432;64570:569;;;;;:::o;46182:328::-;46357:41;19377:10;46390:7;46357:18;:41::i;:::-;46349:103;;;;-1:-1:-1;;;46349:103:0;;;;;;;:::i;:::-;46463:39;46477:4;46483:2;46487:7;46496:5;46463:13;:39::i;58923:42::-;;;;;;;;;;;;;;;;:::i;61054:611::-;61130:16;61138:7;61130;:16::i;:::-;-1:-1:-1;;;;;61116:30:0;:10;-1:-1:-1;;;;;61116:30:0;;61108:65;;;;-1:-1:-1;;;61108:65:0;;;;;;;:::i;:::-;61192:17;;;;:8;:17;;;;;;;;:26;61184:61;;;;-1:-1:-1;;;61184:61:0;;23209:2:1;61184:61:0;;;23191:21:1;23248:2;23228:18;;;23221:30;-1:-1:-1;;;23267:18:1;;;23260:52;23329:18;;61184:61:0;23007:346:1;61184:61:0;61256:23;61282:17;;;:8;:17;;;;;;;;61256:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61282:17;;61256:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61256:43:0;;;-1:-1:-1;;61256:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61310:19;61349:7;:13;;;61364:7;:13;;;61379:7;:14;;;61394:1;61379:17;;;;;;;:::i;:::-;;;;;;;;;;61398:14;;;;;:17;;;;61417;;;;61436;;;;;61332:122;;;;;19622:19:1;;;;19657:12;;;19650:28;;;;19694:12;;19687:28;;;;19731:12;;;19724:28;;;;19768:13;;;19761:29;;;;19806:13;;;19799:29;;;;19844:13;;61332:122:0;;;;;;;;;;;;61310:144;;61473:5;61486:6;61473:21;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:30;61465:65;;;;-1:-1:-1;;;61465:65:0;;29051:2:1;61465:65:0;;;29033:21:1;29090:2;29070:18;;;29063:30;-1:-1:-1;;;29109:18:1;;;29102:52;29171:18;;61465:65:0;28849:346:1;61465:65:0;61541:17;;;;:8;:17;;;;;;;:24;;-1:-1:-1;;61541:24:0;61561:4;61541:24;;;;;;61574:21;;:5;;:21;;61587:6;;61574:21;:::i;:::-;;;;;;;;;;;;;;:28;;;;;-1:-1:-1;;61574:28:0;;;;;;;;;-1:-1:-1;;;61054:611:0:o;65437:9079::-;48085:4;48109:16;;;:7;:16;;;;;;65511:13;;-1:-1:-1;;;;;48109:16:0;65535:77;;;;-1:-1:-1;;;65535:77:0;;31007:2:1;65535:77:0;;;30989:21:1;31046:2;31026:18;;;31019:30;31085:34;31065:18;;;31058:62;-1:-1:-1;;;31136:18:1;;;31129:45;31191:19;;65535:77:0;30805:411:1;65535:77:0;65722:23;65748:18;;;:8;:18;;;;;;;;65722:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65748:18;;65722:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65722:44:0;;;-1:-1:-1;;65722:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65777:20;65817:7;:13;;;65832:7;:13;;;65800:46;;;;;;;;19258:19:1;;;19302:2;19293:12;;19286:28;19339:2;19330:12;;19101:247;65800:46:0;;;;-1:-1:-1;;65800:46:0;;;;;;;;;65938:14;;;;;:17;;;65957;;;;65921:54;;;19258:19:1;;;;19293:12;;;19286:28;65921:54:0;;;;;;;;;19330:12:1;;;;65921:54:0;;66109:14;;:17;;;;66128;;;;66092:54;;;19258:19:1;;;;19293:12;;;;19286:28;;;;66092:54:0;;;;;;;;;;19330:12:1;;;;66092:54:0;;-1:-1:-1;71342:36:0;;;:26;:36;;;;;;71322:57;;:19;:57;;;;;;71428:22;;;;65800:46;;-1:-1:-1;65921:54:0;;66092;-1:-1:-1;70740:3244:0;;71322:57;71389:62;;65800:46;;65921:54;;66092;;71389:6;:62::i;:::-;71453:18;;;;:8;:18;;;;;;;;:27;:2527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70767:3214;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70740:13;:3244::i;:::-;70692:3293;;;;;;;;:::i;:::-;;;;-1:-1:-1;;70692:3293:0;;;;;;;;;73997:23;74023:18;;;:8;70692:3293;74023:18;;;;;70692:3293;;-1:-1:-1;73997:23:0;74023:18;;:27;:46;;;;;;;;;;;;;;;-1:-1:-1;;;74023:46:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;74023:46:0;;;;73997:72;;74179:309;74305:18;74314:8;74305;:18::i;:::-;74402:9;74430:8;74229:231;;;;;;;;;;:::i;74179:309::-;74106:393;;;;;;;;:::i;:::-;;;;;;;;;;;;;74082:426;;;;;;;;65437:9079;;;:::o;62483:1662::-;62586:16;62594:7;62586;:16::i;:::-;-1:-1:-1;;;;;62572:30:0;:10;-1:-1:-1;;;;;62572:30:0;;62564:77;;;;-1:-1:-1;;;62564:77:0;;25497:2:1;62564:77:0;;;25479:21:1;25536:2;25516:18;;;25509:30;25575:34;25555:18;;;25548:62;-1:-1:-1;;;25626:18:1;;;25619:32;25668:19;;62564:77:0;25295:398:1;62564:77:0;62660:29;;;62699:1;62660:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;62652:99;;;;-1:-1:-1;;;62652:99:0;;24319:2:1;62652:99:0;;;24301:21:1;24358:2;24338:18;;;24331:30;24397:34;24377:18;;;24370:62;-1:-1:-1;;;24448:18:1;;;24441:44;24502:19;;62652:99:0;24117:410:1;62652:99:0;62770:17;;;;:8;:17;;;;;;;;:26;62762:70;;;;-1:-1:-1;;;62762:70:0;;;;;;;:::i;:::-;62914:14;62920:7;62914:5;:14::i;:::-;63025:31;;;63036:10;63025:31;;;20754:51:1;20821:18;;;20814:34;;;63025:31:0;;;;;;;;;20727:18:1;;;63025:31:0;;63226:26;;-1:-1:-1;;;63200:53:0;;;18975:51:1;19042:11;;;;19035:27;;;;63200:53:0;;;;;;;;;;19078:12:1;;;63200:53:0;;;;63429:8;;-1:-1:-1;;;63429:77:0;;;63025:31;;63159:1;;-1:-1:-1;;;;;;;63429:8:0;;:21;;:77;;63451:8;;63469:4;;63025:31;;-1:-1:-1;;63200:53:0;;63429:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63407:99;;;63540:10;63527:9;:23;;63519:107;;;;-1:-1:-1;;;63519:107:0;;21903:2:1;63519:107:0;;;21885:21:1;21942:2;21922:18;;;21915:30;21981:34;21961:18;;;21954:62;22052:34;22032:18;;;22025:62;-1:-1:-1;;;22103:19:1;;;22096:38;22151:19;;63519:107:0;21701:475:1;63519:107:0;63639:8;;63757:29;;;63639:8;63757:29;;;:19;:29;;;;;;63639:498;;-1:-1:-1;;;63639:498:0;;-1:-1:-1;;;;;63639:8:0;;;;:13;;63660:9;;63639:498;;63685:8;;63845:7;;63928:10;;63639:8;64075:13;;63639:498;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62553:1592;;;;62483:1662;;:::o;56977:758::-;57193:27;;;57158:32;57193:27;;;:14;:27;;;;;;:40;;;;57221:11;;57193:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57193:48:0;;;;;;;;;;57260:21;;;;57193:48;;-1:-1:-1;57252:86:0;;;;-1:-1:-1;;;57252:86:0;;32243:2:1;57252:86:0;;;32225:21:1;32282:2;32262:18;;;32255:30;32321:34;32301:18;;;32294:62;-1:-1:-1;;;32372:18:1;;;32365:36;32418:19;;57252:86:0;32041:402:1;57252:86:0;57376:23;;57357:42;;:90;;;;;57426:9;:21;;;57413:8;;57403:19;;;;;;;:::i;:::-;;;;;;;;:44;57357:90;57349:129;;;;-1:-1:-1;;;57349:129:0;;25142:2:1;57349:129:0;;;25124:21:1;25181:2;25161:18;;;25154:30;25220:28;25200:18;;;25193:56;25266:18;;57349:129:0;24940:350:1;57349:129:0;57552:1;57526:27;;;57564:21;;;:34;57667:60;;-1:-1:-1;;;57667:60:0;;:4;;:16;;:60;;57684:11;;57697;;57710:6;;57718:8;;;;57667:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57102:633;56977:758;;;;;:::o;65143:287::-;65243:16;65251:7;65243;:16::i;:::-;-1:-1:-1;;;;;65229:30:0;:10;-1:-1:-1;;;;;65229:30:0;;65221:65;;;;-1:-1:-1;;;65221:65:0;;;;;;;:::i;:::-;65305:17;;;;:8;:17;;;;;;;;:26;65297:70;;;;-1:-1:-1;;;65297:70:0;;;;;;;:::i;:::-;65378:35;;;;:26;:35;;;;;:44;65143:287::o;57743:158::-;20619:7;20646:6;-1:-1:-1;;;;;20646:6:0;19377:10;20793:23;20785:68;;;;-1:-1:-1;;;20785:68:0;;;;;;;:::i;:::-;57847:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;57879:14;;57847:46:::1;:::i;21482:201::-:0;20619:7;20646:6;-1:-1:-1;;;;;20646:6:0;19377:10;20793:23;20785:68;;;;-1:-1:-1;;;20785:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21571:22:0;::::1;21563:73;;;::::0;-1:-1:-1;;;21563:73:0;;22802:2:1;21563:73:0::1;::::0;::::1;22784:21:1::0;22841:2;22821:18;;;22814:30;22880:34;22860:18;;;22853:62;-1:-1:-1;;;22931:18:1;;;22924:36;22977:19;;21563:73:0::1;22600:402:1::0;21563:73:0::1;21647:28;21666:8;21647:18;:28::i;51933:174::-:0;52008:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;52008:29:0;-1:-1:-1;;;;;52008:29:0;;;;;;;;:24;;52062:23;52008:24;52062:14;:23::i;:::-;-1:-1:-1;;;;;52053:46:0;;;;;;;;;;;51933:174;;:::o;79967:338::-;80120:14;80136:12;80163:8;80152:37;;;;;;;;;;;;:::i;:::-;80119:70;;;;80271:26;80281:6;80289:7;80271:9;:26::i;:::-;80089:216;;79967:338;;;;:::o;48314:348::-;48407:4;48109:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48109:16:0;48424:73;;;;-1:-1:-1;;;48424:73:0;;25900:2:1;48424:73:0;;;25882:21:1;25939:2;25919:18;;;25912:30;25978:34;25958:18;;;25951:62;-1:-1:-1;;;26029:18:1;;;26022:42;26081:19;;48424:73:0;25698:408:1;48424:73:0;48508:13;48524:23;48539:7;48524:14;:23::i;:::-;48508:39;;48577:5;-1:-1:-1;;;;;48566:16:0;:7;-1:-1:-1;;;;;48566:16:0;;:51;;;;48610:7;-1:-1:-1;;;;;48586:31:0;:20;48598:7;48586:11;:20::i;:::-;-1:-1:-1;;;;;48586:31:0;;48566:51;:87;;;-1:-1:-1;;;;;;45406:25:0;;;45382:4;45406:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;48621:32;48558:96;48314:348;-1:-1:-1;;;;48314:348:0:o;51237:578::-;51396:4;-1:-1:-1;;;;;51369:31:0;:23;51384:7;51369:14;:23::i;:::-;-1:-1:-1;;;;;51369:31:0;;51361:85;;;;-1:-1:-1;;;51361:85:0;;30597:2:1;51361:85:0;;;30579:21:1;30636:2;30616:18;;;30609:30;30675:34;30655:18;;;30648:62;-1:-1:-1;;;30726:18:1;;;30719:39;30775:19;;51361:85:0;30395:405:1;51361:85:0;-1:-1:-1;;;;;51465:16:0;;51457:65;;;;-1:-1:-1;;;51457:65:0;;23560:2:1;51457:65:0;;;23542:21:1;23599:2;23579:18;;;23572:30;23638:34;23618:18;;;23611:62;-1:-1:-1;;;23689:18:1;;;23682:34;23733:19;;51457:65:0;23358:400:1;51457:65:0;51639:29;51656:1;51660:7;51639:8;:29::i;:::-;-1:-1:-1;;;;;51681:15:0;;;;;;:9;:15;;;;;:20;;51700:1;;51681:15;:20;;51700:1;;51681:20;:::i;:::-;;;;-1:-1:-1;;;;;;;51712:13:0;;;;;;:9;:13;;;;;:18;;51729:1;;51712:13;:18;;51729:1;;51712:18;:::i;:::-;;;;-1:-1:-1;;51741:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;51741:21:0;-1:-1:-1;;;;;51741:21:0;;;;;;;;;51780:27;;51741:16;;51780:27;;;;;;;51237:578;;;:::o;49004:110::-;49080:26;49090:2;49094:7;49080:26;;;;;;;;;;;;:9;:26::i;21843:191::-;21917:16;21936:6;;-1:-1:-1;;;;;21953:17:0;;;-1:-1:-1;;;;;;21953:17:0;;;;;;21986:40;;21936:6;;;;;;;21986:40;;21917:16;21986:40;21906:128;21843:191;:::o;52249:315::-;52404:8;-1:-1:-1;;;;;52395:17:0;:5;-1:-1:-1;;;;;52395:17:0;;;52387:55;;;;-1:-1:-1;;;52387:55:0;;23965:2:1;52387:55:0;;;23947:21:1;24004:2;23984:18;;;23977:30;24043:27;24023:18;;;24016:55;24088:18;;52387:55:0;23763:349:1;52387:55:0;-1:-1:-1;;;;;52453:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;52453:46:0;;;;;;;;;;52515:41;;20999::1;;;52515::0;;20972:18:1;52515:41:0;;;;;;;52249:315;;;:::o;47392:::-;47549:28;47559:4;47565:2;47569:7;47549:9;:28::i;:::-;47596:48;47619:4;47625:2;47629:7;47638:5;47596:22;:48::i;:::-;47588:111;;;;-1:-1:-1;;;47588:111:0;;;;;;;:::i;74520:2391::-;1127:4;1121:11;;1440:20;;;1478:25;;;1616:19;1653:25;;-1:-1:-1;1808:4:0;1793:20;;;1872:17;;;74656:13;;75066:1809;75087:3;75083:1;:7;75066:1809;;;75102:17;75128:7;75136:3;75138:1;75136;:3;:::i;:::-;75128:12;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;75145:15:0;75169:9;75179:3;75181:1;75179;:3;:::i;:::-;75169:14;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;75188:16:0;75213:10;75224:3;75226:1;75224;:3;:::i;:::-;75213:15;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;75236:9:0;;75256:6;;:1;:6;:::i;:::-;75236:27;-1:-1:-1;75270:9:0;75290:6;75294:2;75290:1;:6;:::i;:::-;75270:27;;75439:10;75434:1429;75458:1;75453:2;:6;75434:1429;;;75495:6;75499:2;75495:1;:6;:::i;:::-;75506:1;75479:23;;;;;;75478:29;;:34;75474:1382;;;75527:231;75590:3;75592:1;75590;:3;:::i;:::-;75595:1;75590:6;:79;;75633:36;75652:5;:2;75655;75652:5;:::i;:::-;75643:4;:1;75645:2;75643:4;:::i;:::-;75642:16;;;;:::i;:::-;:21;;75661:2;75642:21;:::i;:::-;:26;;75666:2;75642:26;:::i;:::-;75633:8;:36::i;:::-;75590:79;;;75599:31;75618:5;:2;75621;75618:5;:::i;:::-;75609:4;:1;75611:2;75609:4;:::i;:::-;75608:16;;;;:::i;75599:31::-;75695:19;75705:4;:1;75707:2;75705:4;:::i;:::-;75704:9;;75711:2;75704:9;:::i;75695:19::-;75726;:30;75746:6;75726:30;75746:9;;;;;75726:30;;;;;;;;;;;75544:213;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;75544:213:0;;;;;;;;;75527:5;;:16;:231::i;:::-;75474:1382;;;75847:6;75851:2;75847:1;:6;:::i;:::-;75858:1;75833:21;;;;;;75832:27;;:32;75828:1023;;;75879:230;75942:3;75944:1;75942;:3;:::i;:::-;75947:1;75942:6;:79;;75985:36;76004:5;:2;76007;76004:5;:::i;75985:36::-;75942:79;;;75951:31;75970:5;:2;75973;75970:5;:::i;75951:31::-;76046:19;76056:4;:1;76058:2;76056:4;:::i;76046:19::-;76077;:30;76097:6;76104:1;76097:9;;75828:1023;76209:6;76213:2;76209:1;:6;:::i;:::-;76220:1;76194:22;;;;;;76193:28;;:33;76189:651;;;76241:230;76304:3;76306:1;76304;:3;:::i;:::-;76309:1;76304:6;:79;;76347:36;76366:5;:2;76369;76366:5;:::i;76347:36::-;76304:79;;;76313:31;76332:5;:2;76335;76332:5;:::i;76313:31::-;76408:19;76418:4;:1;76420:2;76418:4;:::i;76408:19::-;76439;:30;76459:6;76466:1;76459:9;;76189:651;76551:230;76614:3;76616:1;76614;:3;:::i;:::-;76619:1;76614:6;:79;;76657:36;76676:5;:2;76679;76676:5;:::i;76657:36::-;76614:79;;;76623:31;76642:5;:2;76645;76642:5;:::i;76623:31::-;76718:19;76728:4;:1;76730:2;76728:4;:::i;76718:19::-;76749;:30;76769:6;76776:1;76769:9;;76551:230;75461:4;;;;:::i;:::-;;;;75434:1429;;;;75098:1777;;;;;75095:1;75092:4;;;;;:::i;:::-;;;75066:1809;;;-1:-1:-1;76897:5:0;74520:2391;-1:-1:-1;;;;;74520:2391:0:o;4588:1912::-;4646:13;4676:4;:11;4691:1;4676:16;4672:31;;;-1:-1:-1;;4694:9:0;;;;;;;;;-1:-1:-1;4694:9:0;;;4588:1912::o;4672:31::-;4755:19;4777:12;;;;;;;;;;;;;;;;;4755:34;;4841:18;4887:1;4868:4;:11;4882:1;4868:15;;;;:::i;:::-;4867:21;;;;:::i;:::-;4862:27;;:1;:27;:::i;:::-;4841:48;-1:-1:-1;4972:20:0;5006:15;4841:48;5019:2;5006:15;:::i;:::-;-1:-1:-1;;;;;4995:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4995:27:0;;4972:50;;5119:10;5111:6;5104:26;5214:1;5207:5;5203:13;5273:4;5324;5318:11;5309:7;5305:25;5420:2;5412:6;5408:15;5493:754;5512:6;5503:7;5500:19;5493:754;;;5612:1;5603:7;5599:15;5588:26;;5651:7;5645:14;5777:4;5769:5;5765:2;5761:14;5757:25;5747:8;5743:40;5737:47;5726:9;5718:67;5831:1;5820:9;5816:17;5803:30;;5910:4;5902:5;5898:2;5894:14;5890:25;5880:8;5876:40;5870:47;5859:9;5851:67;5964:1;5953:9;5949:17;5936:30;;6043:4;6035:5;6032:1;6027:14;6023:25;6013:8;6009:40;6003:47;5992:9;5984:67;6097:1;6086:9;6082:17;6069:30;;6176:4;6168:5;6156:25;6146:8;6142:40;6136:47;6125:9;6117:67;-1:-1:-1;6230:1:0;6215:17;5493:754;;;6320:1;6313:4;6307:11;6303:19;6341:1;6336:54;;;;6409:1;6404:52;;;;6296:160;;6336:54;-1:-1:-1;;;;;6352:17:0;;6345:43;6336:54;;6404:52;-1:-1:-1;;;;;6420:17:0;;6413:41;6296:160;-1:-1:-1;6486:6:0;;4588:1912;-1:-1:-1;;;;;;;;4588:1912:0:o;79388:488::-;79444:13;79472:10;79468:47;;-1:-1:-1;;79495:10:0;;;;;;;;;;;;-1:-1:-1;;;79495:10:0;;;;;79388:488::o;79468:47::-;79538:5;79523:12;79575:68;79582:9;;79575:68;;79604:8;;;;:::i;:::-;;-1:-1:-1;79623:10:0;;-1:-1:-1;79631:2:0;79623:10;;:::i;:::-;;;79575:68;;;79651:19;79683:6;-1:-1:-1;;;;;79673:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79673:17:0;;79651:39;;79699:140;79706:10;;79699:140;;79729:11;79739:1;79729:11;;:::i;:::-;;-1:-1:-1;79794:10:0;79802:2;79794:5;:10;:::i;:::-;79781:24;;:2;:24;:::i;:::-;79768:39;;79751:6;79758;79751:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;79751:56:0;;;;;;;;-1:-1:-1;79818:11:0;79827:2;79818:11;;:::i;:::-;;;79699:140;;50540:360;50600:13;50616:23;50631:7;50616:14;:23::i;:::-;50600:39;;50741:29;50758:1;50762:7;50741:8;:29::i;:::-;-1:-1:-1;;;;;50783:16:0;;;;;;:9;:16;;;;;:21;;50803:1;;50783:16;:21;;50803:1;;50783:21;:::i;:::-;;;;-1:-1:-1;;50822:16:0;;;;:7;:16;;;;;;50815:23;;-1:-1:-1;;;;;;50815:23:0;;;50856:36;50830:7;;50822:16;-1:-1:-1;;;;;50856:36:0;;;;;50822:16;;50856:36;50589:311;50540:360;:::o;49341:321::-;49471:18;49477:2;49481:7;49471:5;:18::i;:::-;49522:54;49553:1;49557:2;49561:7;49570:5;49522:22;:54::i;:::-;49500:154;;;;-1:-1:-1;;;49500:154:0;;;;;;;:::i;53129:799::-;53284:4;-1:-1:-1;;;;;53305:13:0;;23184:20;23232:8;53301:620;;53341:72;;-1:-1:-1;;;53341:72:0;;-1:-1:-1;;;;;53341:36:0;;;;;:72;;19377:10;;53392:4;;53398:7;;53407:5;;53341:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53341:72:0;;;;;;;;-1:-1:-1;;53341:72:0;;;;;;;;;;;;:::i;:::-;;;53337:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53583:13:0;;53579:272;;53626:60;;-1:-1:-1;;;53626:60:0;;;;;;;:::i;53579:272::-;53801:6;53795:13;53786:6;53782:2;53778:15;53771:38;53337:529;-1:-1:-1;;;;;;53464:51:0;-1:-1:-1;;;53464:51:0;;-1:-1:-1;53457:58:0;;53301:620;-1:-1:-1;53905:4:0;53898:11;;3425:400;-1:-1:-1;;3608:17:0;;3602:24;3657:13;;3710:11;;-1:-1:-1;;3598:35:0;;;;;;3701:20;;3657:13;3701:20;:::i;:::-;:32;;3693:84;;;;-1:-1:-1;;;3693:84:0;;24734:2:1;3693:84:0;;;24716:21:1;24773:2;24753:18;;;24746:30;24812:34;24792:18;;;24785:62;-1:-1:-1;;;24863:18:1;;;24856:37;24910:19;;3693:84:0;24532:403:1;3693:84:0;3788:29;3804:6;3812:4;3788:15;:29::i;49998:313::-;-1:-1:-1;;;;;50078:16:0;;50070:61;;;;-1:-1:-1;;;50070:61:0;;28690:2:1;50070:61:0;;;28672:21:1;;;28709:18;;;28702:30;28768:34;28748:18;;;28741:62;28820:18;;50070:61:0;28488:356:1;50070:61:0;-1:-1:-1;;;;;50202:13:0;;;;;;:9;:13;;;;;:18;;50219:1;;50202:13;:18;;50219:1;;50202:18;:::i;:::-;;;;-1:-1:-1;;50231:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;50231:21:0;-1:-1:-1;;;;;50231:21:0;;;;;;;;50270:33;;50231:16;;;50270:33;;50231:16;;50270:33;49998:313;;:::o;2205:978::-;2339:4;2333:11;2399:4;2393;2389:15;2381:23;;2447:6;2441:4;2437:17;2517:4;2508:6;2502:13;2498:24;2490:6;2486:37;2358:712;2548:7;2542:4;2539:17;2358:712;;;3043:11;;3028:27;;2594:4;2584:15;;;;2627:17;2358:712;;;-1:-1:-1;;3142:13:0;;3138:26;3123:42;;;-1:-1:-1;2205:978:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:684::-;700:5;753:3;746:4;738:6;734:17;730:27;720:55;;771:1;768;761:12;720:55;804:2;798:9;846:3;838:6;834:16;916:6;904:10;901:22;-1:-1:-1;;;;;868:10:1;865:34;862:62;859:88;;;927:18;;:::i;:::-;963:2;956:22;998:6;1024;1057:3;1045:16;;1042:25;-1:-1:-1;1039:45:1;;;1080:1;1077;1070:12;1039:45;1102:1;1112:192;1126:4;1123:1;1120:11;1112:192;;;1185:17;;1173:30;;1226:4;1250:12;;;;1282;;;;1146:1;1139:9;1112:192;;;-1:-1:-1;1322:6:1;;650:684;-1:-1:-1;;;;;650:684:1:o;1339:347::-;1390:8;1400:6;1454:3;1447:4;1439:6;1435:17;1431:27;1421:55;;1472:1;1469;1462:12;1421:55;-1:-1:-1;1495:20:1;;-1:-1:-1;;;;;1527:30:1;;1524:50;;;1570:1;1567;1560:12;1524:50;1607:4;1599:6;1595:17;1583:29;;1659:3;1652:4;1643:6;1635;1631:19;1627:30;1624:39;1621:59;;;1676:1;1673;1666:12;1621:59;1339:347;;;;;:::o;1691:220::-;1733:5;1786:3;1779:4;1771:6;1767:17;1763:27;1753:55;;1804:1;1801;1794:12;1753:55;1826:79;1901:3;1892:6;1879:20;1872:4;1864:6;1860:17;1826:79;:::i;:::-;1817:88;1691:220;-1:-1:-1;;;1691:220:1:o;1916:159::-;1983:20;;2043:6;2032:18;;2022:29;;2012:57;;2065:1;2062;2055:12;2012:57;1916:159;;;:::o;2080:171::-;2147:20;;-1:-1:-1;;;;;2196:30:1;;2186:41;;2176:69;;2241:1;2238;2231:12;2256:247;2315:6;2368:2;2356:9;2347:7;2343:23;2339:32;2336:52;;;2384:1;2381;2374:12;2336:52;2423:9;2410:23;2442:31;2467:5;2442:31;:::i;2508:320::-;2595:6;2603;2656:2;2644:9;2635:7;2631:23;2627:32;2624:52;;;2672:1;2669;2662:12;2624:52;2704:9;2698:16;2723:31;2748:5;2723:31;:::i;:::-;2818:2;2803:18;;;;2797:25;2773:5;;2797:25;;-1:-1:-1;;;2508:320:1:o;2833:388::-;2901:6;2909;2962:2;2950:9;2941:7;2937:23;2933:32;2930:52;;;2978:1;2975;2968:12;2930:52;3017:9;3004:23;3036:31;3061:5;3036:31;:::i;:::-;3086:5;-1:-1:-1;3143:2:1;3128:18;;3115:32;3156:33;3115:32;3156:33;:::i;:::-;3208:7;3198:17;;;2833:388;;;;;:::o;3226:456::-;3303:6;3311;3319;3372:2;3360:9;3351:7;3347:23;3343:32;3340:52;;;3388:1;3385;3378:12;3340:52;3427:9;3414:23;3446:31;3471:5;3446:31;:::i;:::-;3496:5;-1:-1:-1;3553:2:1;3538:18;;3525:32;3566:33;3525:32;3566:33;:::i;:::-;3226:456;;3618:7;;-1:-1:-1;;;3672:2:1;3657:18;;;;3644:32;;3226:456::o;3687:665::-;3782:6;3790;3798;3806;3859:3;3847:9;3838:7;3834:23;3830:33;3827:53;;;3876:1;3873;3866:12;3827:53;3915:9;3902:23;3934:31;3959:5;3934:31;:::i;:::-;3984:5;-1:-1:-1;4041:2:1;4026:18;;4013:32;4054:33;4013:32;4054:33;:::i;:::-;4106:7;-1:-1:-1;4160:2:1;4145:18;;4132:32;;-1:-1:-1;4215:2:1;4200:18;;4187:32;-1:-1:-1;;;;;4231:30:1;;4228:50;;;4274:1;4271;4264:12;4228:50;4297:49;4338:7;4329:6;4318:9;4314:22;4297:49;:::i;:::-;4287:59;;;3687:665;;;;;;;:::o;4357:416::-;4422:6;4430;4483:2;4471:9;4462:7;4458:23;4454:32;4451:52;;;4499:1;4496;4489:12;4451:52;4538:9;4525:23;4557:31;4582:5;4557:31;:::i;:::-;4607:5;-1:-1:-1;4664:2:1;4649:18;;4636:32;4706:15;;4699:23;4687:36;;4677:64;;4737:1;4734;4727:12;4778:315;4846:6;4854;4907:2;4895:9;4886:7;4882:23;4878:32;4875:52;;;4923:1;4920;4913:12;4875:52;4962:9;4949:23;4981:31;5006:5;4981:31;:::i;:::-;5031:5;5083:2;5068:18;;;;5055:32;;-1:-1:-1;;;4778:315:1:o;5098:245::-;5156:6;5209:2;5197:9;5188:7;5184:23;5180:32;5177:52;;;5225:1;5222;5215:12;5177:52;5264:9;5251:23;5283:30;5307:5;5283:30;:::i;5348:249::-;5417:6;5470:2;5458:9;5449:7;5445:23;5441:32;5438:52;;;5486:1;5483;5476:12;5438:52;5518:9;5512:16;5537:30;5561:5;5537:30;:::i;5602:450::-;5671:6;5724:2;5712:9;5703:7;5699:23;5695:32;5692:52;;;5740:1;5737;5730:12;5692:52;5780:9;5767:23;-1:-1:-1;;;;;5805:6:1;5802:30;5799:50;;;5845:1;5842;5835:12;5799:50;5868:22;;5921:4;5913:13;;5909:27;-1:-1:-1;5899:55:1;;5950:1;5947;5940:12;5899:55;5973:73;6038:7;6033:2;6020:16;6015:2;6011;6007:11;5973:73;:::i;6057:184::-;6115:6;6168:2;6156:9;6147:7;6143:23;6139:32;6136:52;;;6184:1;6181;6174:12;6136:52;6207:28;6225:9;6207:28;:::i;6246:481::-;6324:6;6332;6340;6393:2;6381:9;6372:7;6368:23;6364:32;6361:52;;;6409:1;6406;6399:12;6361:52;6432:28;6450:9;6432:28;:::i;:::-;6422:38;;6511:2;6500:9;6496:18;6483:32;-1:-1:-1;;;;;6530:6:1;6527:30;6524:50;;;6570:1;6567;6560:12;6524:50;6609:58;6659:7;6650:6;6639:9;6635:22;6609:58;:::i;:::-;6246:481;;6686:8;;-1:-1:-1;6583:84:1;;-1:-1:-1;;;;6246:481:1:o;6732:460::-;6817:6;6825;6833;6886:2;6874:9;6865:7;6861:23;6857:32;6854:52;;;6902:1;6899;6892:12;6854:52;6925:28;6943:9;6925:28;:::i;:::-;6915:38;;7004:2;6993:9;6989:18;6976:32;-1:-1:-1;;;;;7023:6:1;7020:30;7017:50;;;7063:1;7060;7053:12;7017:50;7086:49;7127:7;7118:6;7107:9;7103:22;7086:49;:::i;:::-;7076:59;;;7182:2;7171:9;7167:18;7154:32;7144:42;;6732:460;;;;;:::o;7197:773::-;7301:6;7309;7317;7325;7333;7386:3;7374:9;7365:7;7361:23;7357:33;7354:53;;;7403:1;7400;7393:12;7354:53;7426:28;7444:9;7426:28;:::i;:::-;7416:38;;7505:2;7494:9;7490:18;7477:32;-1:-1:-1;;;;;7569:2:1;7561:6;7558:14;7555:34;;;7585:1;7582;7575:12;7555:34;7608:49;7649:7;7640:6;7629:9;7625:22;7608:49;:::i;:::-;7598:59;;7676:37;7709:2;7698:9;7694:18;7676:37;:::i;:::-;7666:47;;7766:2;7755:9;7751:18;7738:32;7722:48;;7795:2;7785:8;7782:16;7779:36;;;7811:1;7808;7801:12;7779:36;;7850:60;7902:7;7891:8;7880:9;7876:24;7850:60;:::i;:::-;7197:773;;;;-1:-1:-1;7197:773:1;;-1:-1:-1;7929:8:1;;7824:86;7197:773;-1:-1:-1;;;7197:773:1:o;7975:684::-;8077:6;8085;8093;8101;8154:3;8142:9;8133:7;8129:23;8125:33;8122:53;;;8171:1;8168;8161:12;8122:53;8194:28;8212:9;8194:28;:::i;:::-;8184:38;;8273:2;8262:9;8258:18;8245:32;-1:-1:-1;;;;;8337:2:1;8329:6;8326:14;8323:34;;;8353:1;8350;8343:12;8323:34;8376:49;8417:7;8408:6;8397:9;8393:22;8376:49;:::i;:::-;8366:59;;8444:37;8477:2;8466:9;8462:18;8444:37;:::i;:::-;8434:47;;8534:2;8523:9;8519:18;8506:32;8490:48;;8563:2;8553:8;8550:16;8547:36;;;8579:1;8576;8569:12;8547:36;;8602:51;8645:7;8634:8;8623:9;8619:24;8602:51;:::i;8664:252::-;8731:6;8739;8792:2;8780:9;8771:7;8767:23;8763:32;8760:52;;;8808:1;8805;8798:12;8760:52;8831:28;8849:9;8831:28;:::i;8921:180::-;8980:6;9033:2;9021:9;9012:7;9008:23;9004:32;9001:52;;;9049:1;9046;9039:12;9001:52;-1:-1:-1;9072:23:1;;8921:180;-1:-1:-1;8921:180:1:o;9106:248::-;9174:6;9182;9235:2;9223:9;9214:7;9210:23;9206:32;9203:52;;;9251:1;9248;9241:12;9203:52;-1:-1:-1;;9274:23:1;;;9344:2;9329:18;;;9316:32;;-1:-1:-1;9106:248:1:o;9359:245::-;9438:6;9446;9499:2;9487:9;9478:7;9474:23;9470:32;9467:52;;;9515:1;9512;9505:12;9467:52;-1:-1:-1;;9538:16:1;;9594:2;9579:18;;;9573:25;9538:16;;9573:25;;-1:-1:-1;9359:245:1:o;9609:543::-;9750:6;9758;9766;9774;9782;9835:3;9823:9;9814:7;9810:23;9806:33;9803:53;;;9852:1;9849;9842:12;9803:53;9888:9;9875:23;9865:33;;9945:2;9934:9;9930:18;9917:32;9907:42;;9968:53;10013:7;10008:2;9997:9;9993:18;9968:53;:::i;:::-;9958:63;;10040:54;10086:7;10080:3;10069:9;10065:19;10040:54;:::i;:::-;9609:543;;;;-1:-1:-1;9609:543:1;;10141:3;10126:19;10113:33;;9609:543;-1:-1:-1;;9609:543:1:o;10157:269::-;10214:6;10267:2;10255:9;10246:7;10242:23;10238:32;10235:52;;;10283:1;10280;10273:12;10235:52;10322:9;10309:23;10372:4;10365:5;10361:16;10354:5;10351:27;10341:55;;10392:1;10389;10382:12;10548:268;10600:3;10638:5;10632:12;10665:6;10660:3;10653:19;10681:63;10737:6;10730:4;10725:3;10721:14;10714:4;10707:5;10703:16;10681:63;:::i;:::-;10798:2;10777:15;-1:-1:-1;;10773:29:1;10764:39;;;;10805:4;10760:50;;10548:268;-1:-1:-1;;10548:268:1:o;10821:184::-;10862:3;10900:5;10894:12;10915:52;10960:6;10955:3;10948:4;10941:5;10937:16;10915:52;:::i;:::-;10983:16;;;;;10821:184;-1:-1:-1;;10821:184:1:o;11010:692::-;11059:3;11100:5;11094:12;11129:36;11155:9;11129:36;:::i;:::-;11184:1;11201:18;;;11228:104;;;;11346:1;11341:355;;;;11194:502;;11228:104;-1:-1:-1;;11261:24:1;;11249:37;;11306:16;;;;-1:-1:-1;11228:104:1;;11341:355;11372:5;11369:1;11362:16;11401:4;11446:2;11443:1;11433:16;11471:1;11485:165;11499:6;11496:1;11493:13;11485:165;;;11577:14;;11564:11;;;11557:35;11620:16;;;;11514:10;;11485:165;;;11489:3;;;11679:6;11674:3;11670:16;11663:23;;11194:502;;;;;11010:692;;;;:::o;11829:271::-;12012:6;12004;11999:3;11986:33;11968:3;12038:16;;12063:13;;;12038:16;11829:271;-1:-1:-1;11829:271:1:o;12105:274::-;12234:3;12272:6;12266:13;12288:53;12334:6;12329:3;12322:4;12314:6;12310:17;12288:53;:::i;:::-;12357:16;;;;;12105:274;-1:-1:-1;;12105:274:1:o;12384:194::-;12510:3;12535:37;12568:3;12560:6;12535:37;:::i;12864:1605::-;-1:-1:-1;;;13614:43:1;;-1:-1:-1;;;13682:1:1;13673:11;;13666:30;13719:13;;-1:-1:-1;;13741:62:1;13719:13;13791:2;13782:12;;13775:4;13763:17;;13741:62;:::i;:::-;13867:66;13862:2;13822:16;;;13854:11;;;13847:87;13963:66;13958:2;13950:11;;13943:87;14055:13;;14077:63;14055:13;14126:2;14118:11;;14111:4;14099:17;;14077:63;:::i;:::-;-1:-1:-1;;;14200:2:1;14159:17;;;;14192:11;;;14185:61;14271:13;;14293:63;14271:13;14342:2;14334:11;;14327:4;14315:17;;14293:63;:::i;:::-;-1:-1:-1;;;14416:2:1;14375:17;;;;14408:11;;;14401:35;14460:2;14452:11;;12864:1605;-1:-1:-1;;;;;12864:1605:1:o;14474:446::-;14736:29;14731:3;14724:42;14706:3;14795:6;14789:13;14811:62;14866:6;14861:2;14856:3;14852:12;14845:4;14837:6;14833:17;14811:62;:::i;:::-;14893:16;;;;14911:2;14889:25;;14474:446;-1:-1:-1;;14474:446:1:o;14925:2133::-;15381:66;15369:79;;15478:66;15473:2;15464:12;;15457:88;15575:66;15570:2;15561:12;;15554:88;15672:66;15667:2;15658:12;;15651:88;15770:66;15764:3;15755:13;;15748:89;15868:66;15862:3;15853:13;;15846:89;15966:66;15960:3;15951:13;;15944:89;16064:66;16058:3;16049:13;;16042:89;16162:34;16156:3;16147:13;;16140:57;16228:66;16222:3;16213:13;;16206:89;16326:66;16320:3;16311:13;;16304:89;16424:66;16418:3;16409:13;;16402:89;16522:34;16516:3;16507:13;;16500:57;16588:66;16582:3;16573:13;;16566:89;16686:66;16680:3;16671:13;;16664:89;16784:34;16778:3;16769:13;;16762:57;-1:-1:-1;;;16844:3:1;16835:13;;16828:78;-1:-1:-1;16922:130:1;16947:104;16972:78;17002:47;17044:3;17035:13;;17027:6;17002:47;:::i;:::-;-1:-1:-1;;;11772:19:1;;11816:1;11807:11;;11707:117;16972:78;16964:6;16947:104;:::i;:::-;16939:6;16922:130;:::i;:::-;16915:137;14925:2133;-1:-1:-1;;;;;14925:2133:1:o;17063:1089::-;17620:66;17615:3;17608:79;17590:3;17716:6;17710:13;17732:62;17787:6;17782:2;17777:3;17773:12;17766:4;17758:6;17754:17;17732:62;:::i;:::-;-1:-1:-1;;;17853:2:1;17813:16;;;17845:11;;;17838:43;17906:13;;17928:63;17906:13;17977:2;17969:11;;17962:4;17950:17;;17928:63;:::i;:::-;-1:-1:-1;;;18051:2:1;18010:17;;;;18043:11;;;18036:49;18101:45;18142:2;18134:11;;18126:6;18101:45;:::i;:::-;18094:52;17063:1089;-1:-1:-1;;;;;;17063:1089:1:o;18157:448::-;18419:31;18414:3;18407:44;18389:3;18480:6;18474:13;18496:62;18551:6;18546:2;18541:3;18537:12;18530:4;18522:6;18518:17;18496:62;:::i;:::-;18578:16;;;;18596:2;18574:25;;18157:448;-1:-1:-1;;18157:448:1:o;20076:499::-;-1:-1:-1;;;;;20345:15:1;;;20327:34;;20397:15;;20392:2;20377:18;;20370:43;20444:2;20429:18;;20422:34;;;20492:3;20487:2;20472:18;;20465:31;;;20270:4;;20513:56;;20549:19;;20541:6;20513:56;:::i;21233:228::-;21380:2;21369:9;21362:21;21343:4;21400:55;21451:2;21440:9;21436:18;21428:6;21400:55;:::i;22181:414::-;22383:2;22365:21;;;22422:2;22402:18;;;22395:30;22461:34;22456:2;22441:18;;22434:62;-1:-1:-1;;;22527:2:1;22512:18;;22505:48;22585:3;22570:19;;22181:414::o;27357:355::-;27559:2;27541:21;;;27598:2;27578:18;;;27571:30;27637:33;27632:2;27617:18;;27610:61;27703:2;27688:18;;27357:355::o;29613:356::-;29815:2;29797:21;;;29834:18;;;29827:30;29893:34;29888:2;29873:18;;29866:62;29960:2;29945:18;;29613:356::o;31623:413::-;31825:2;31807:21;;;31864:2;31844:18;;;31837:30;31903:34;31898:2;31883:18;;31876:62;-1:-1:-1;;;31969:2:1;31954:18;;31947:47;32026:3;32011:19;;31623:413::o;33157:346::-;33359:2;33341:21;;;33398:2;33378:18;;;33371:30;-1:-1:-1;;;33432:2:1;33417:18;;33410:52;33494:2;33479:18;;33157:346::o;33508:662::-;33789:6;33777:19;;33759:38;;-1:-1:-1;;;;;33833:32:1;;33828:2;33813:18;;33806:60;33853:3;33897:2;33882:18;;33875:31;;;-1:-1:-1;;33929:56:1;;33965:19;;33957:6;33929:56;:::i;:::-;34035:6;34028:14;34021:22;34016:2;34005:9;34001:18;33994:50;34093:9;34085:6;34081:22;34075:3;34064:9;34060:19;34053:51;34121:43;34157:6;34149;34121:43;:::i;:::-;34113:51;33508:662;-1:-1:-1;;;;;;;;33508:662:1:o;34175:728::-;34442:6;34434;34430:19;34419:9;34412:38;34486:3;34481:2;34470:9;34466:18;34459:31;34393:4;34513:56;34564:3;34553:9;34549:19;34541:6;34513:56;:::i;:::-;-1:-1:-1;;;;;34609:6:1;34605:31;34600:2;34589:9;34585:18;34578:59;34685:9;34677:6;34673:22;34668:2;34657:9;34653:18;34646:50;34720:6;34712;34705:22;34774:6;34766;34761:2;34753:6;34749:15;34736:45;34827:1;34822:2;34813:6;34805;34801:19;34797:28;34790:39;34894:2;34887;34883:7;34878:2;34870:6;34866:15;34862:29;34854:6;34850:42;34846:51;34838:59;;;34175:728;;;;;;;;:::o;34908:577::-;35165:6;35157;35153:19;35142:9;35135:38;35209:3;35204:2;35193:9;35189:18;35182:31;35116:4;35236:56;35287:3;35276:9;35272:19;35264:6;35236:56;:::i;:::-;-1:-1:-1;;;;;35332:6:1;35328:31;35323:2;35312:9;35308:18;35301:59;35408:9;35400:6;35396:22;35391:2;35380:9;35376:18;35369:50;35436:43;35472:6;35464;35436:43;:::i;:::-;35428:51;34908:577;-1:-1:-1;;;;;;;34908:577:1:o;35490:1520::-;35836:6;35828;35824:19;35813:9;35806:38;35787:4;35863:2;35901:3;35896:2;35885:9;35881:18;35874:31;35925:1;35958:6;35952:13;35988:36;36014:9;35988:36;:::i;:::-;36061:6;36055:3;36044:9;36040:19;36033:35;36087:3;36109:1;36141:2;36130:9;36126:18;36158:1;36153:122;;;;36289:1;36284:354;;;;36119:519;;36153:122;-1:-1:-1;;36201:24:1;;36181:18;;;36174:52;36261:3;36246:19;;;-1:-1:-1;36153:122:1;;36284:354;36315:6;36312:1;36305:17;36363:2;36360:1;36350:16;36388:1;36402:180;36416:6;36413:1;36410:13;36402:180;;;36509:14;;36485:17;;;36481:26;;36474:50;36552:16;;;;36431:10;;36402:180;;;36606:17;;36602:26;;;-1:-1:-1;;36119:519:1;;;;;;36683:9;36678:3;36674:19;36669:2;36658:9;36654:18;36647:47;36717:40;36753:3;36745:6;36717:40;:::i;:::-;36703:54;;;36766;36816:2;36805:9;36801:18;36793:6;-1:-1:-1;;;;;10505:31:1;10493:44;;10431:112;36766:54;-1:-1:-1;;;;;10505:31:1;;36879:3;36864:19;;10493:44;36933:9;36925:6;36921:22;36915:3;36904:9;36900:19;36893:51;36961:43;36997:6;36989;36961:43;:::i;:::-;36953:51;35490:1520;-1:-1:-1;;;;;;;;;35490:1520:1:o;37703:128::-;37743:3;37774:1;37770:6;37767:1;37764:13;37761:39;;;37780:18;;:::i;:::-;-1:-1:-1;37816:9:1;;37703:128::o;37836:120::-;37876:1;37902;37892:35;;37907:18;;:::i;:::-;-1:-1:-1;37941:9:1;;37836:120::o;37961:168::-;38001:7;38067:1;38063;38059:6;38055:14;38052:1;38049:21;38044:1;38037:9;38030:17;38026:45;38023:71;;;38074:18;;:::i;:::-;-1:-1:-1;38114:9:1;;37961:168::o;38134:125::-;38174:4;38202:1;38199;38196:8;38193:34;;;38207:18;;:::i;:::-;-1:-1:-1;38244:9:1;;38134:125::o;38264:258::-;38336:1;38346:113;38360:6;38357:1;38354:13;38346:113;;;38436:11;;;38430:18;38417:11;;;38410:39;38382:2;38375:10;38346:113;;;38477:6;38474:1;38471:13;38468:48;;;-1:-1:-1;;38512:1:1;38494:16;;38487:27;38264:258::o;38527:380::-;38606:1;38602:12;;;;38649;;;38670:61;;38724:4;38716:6;38712:17;38702:27;;38670:61;38777:2;38769:6;38766:14;38746:18;38743:38;38740:161;;;38823:10;38818:3;38814:20;38811:1;38804:31;38858:4;38855:1;38848:15;38886:4;38883:1;38876:15;38740:161;;38527:380;;;:::o;38912:135::-;38951:3;-1:-1:-1;;38972:17:1;;38969:43;;;38992:18;;:::i;:::-;-1:-1:-1;39039:1:1;39028:13;;38912:135::o;39052:112::-;39084:1;39110;39100:35;;39115:18;;:::i;:::-;-1:-1:-1;39149:9:1;;39052:112::o;39169:127::-;39230:10;39225:3;39221:20;39218:1;39211:31;39261:4;39258:1;39251:15;39285:4;39282:1;39275:15;39301:127;39362:10;39357:3;39353:20;39350:1;39343:31;39393:4;39390:1;39383:15;39417:4;39414:1;39407:15;39433:127;39494:10;39489:3;39485:20;39482:1;39475:31;39525:4;39522:1;39515:15;39549:4;39546:1;39539:15;39565:127;39626:10;39621:3;39617:20;39614:1;39607:31;39657:4;39654:1;39647:15;39681:4;39678:1;39671:15;39697:131;-1:-1:-1;;;;;39772:31:1;;39762:42;;39752:70;;39818:1;39815;39808:12;39833:131;-1:-1:-1;;;;;;39907:32:1;;39897:43;;39887:71;;39954:1;39951;39944:12

Metadata Hash

1d1a68c7f9bfbee8a4fdbce1190eddcb387766cc4925af31ad566837ef4cc02c
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading