Token

Overview CRC1155

Total Supply:
0 N/A

Holders:
589 addresses
Balance
0 N/A
0x634a5dc4cda63ea8d0699d9387cdcfffc6408b84
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Bananas

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-06-20
*/

// File: contracts/IERC20Burnable.sol

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20Burnable {
    function burnFrom(address account, uint256 amount) external;
    function burn(uint256 amount) external;

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// 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/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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);
            }
        }
    }
}

// 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/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// 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/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @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, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: contracts/Bananas.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;






interface ICPBStaking {
    function getStakedTokens(address _staker, string memory _collectionName) external view returns(uint16[] memory);
}

contract Bananas is ERC1155, ReentrancyGuard {

    address public owner;
    address public cpbToken;

    ICPBStaking oldStakingContract;
    ICPBStaking newStakingContract;
    address cmbContract;
    address cgbContract;

    uint public constant totalOfCMBNeeded = 1;
    uint public constant totalOfCGBNeeded = 4;
    uint public evilStonePriceInCPB;
    uint64 public constant BLUE_BANANA_MAX_SUPPLY = 395;
    uint64 public constant GREEN_BANANA_MAX_SUPPLY = 395;
    uint64 public constant DIAMOND_BANANA_MAX_SUPPLY = 495;
    uint64 public constant EVIL_STONE_MAX_SUPPLY = 495;

    uint64 public constant GREEN_BANANA_FOR_TEAM = 30;
    uint64 public constant BLUE_BANANA_FOR_TEAM = 30;
    uint64 public constant DIAMOND_BANANA_FOR_TEAM = 5;

    bool public evilStoneActive;
    bool public paused;

    struct Banana {
        uint64 id;
        uint64 forTeam;
        uint64 maxSupply;
        uint64 count; 
    }

    mapping(bytes32 => Banana) public banana;
    mapping(uint => address[]) public addressesPerId;

    event DiamondMinted(address indexed _minter, uint _count);
    event EvileStoneMinted(address indexed _minter, uint _count);

    modifier onlyOwner {
        require(
            msg.sender == owner,
            "ERROR: CALLER IS NOT OWNER"
        );
        _;
    }

    modifier mintIsActive {
        require(
            evilStoneActive,
            "ERROR: EVIL STONE MINT IS NOT ACTIVE"
        );
        _;
    }

    modifier isNotPaused {
        require(
            paused,
            "ERROR: MERGING IS NOT ACTIVE"
        );
        _;
    }

    constructor(address _tokenContract, ICPBStaking _oldStakingContract, ICPBStaking _newStakingContract, address _cmbContract, address _cgbContract) ERC1155("https://cmb.mypinata.cloud/ipfs/QmaJZm2itQfRFuZYKvHo8KKCCz2rJFD3XkrmCJvh7Rje55/{id}.json") {
        owner = msg.sender;
        cpbToken = _tokenContract;
        oldStakingContract = _oldStakingContract;
        newStakingContract = _newStakingContract;
        cmbContract = _cmbContract;
        cgbContract = _cgbContract;
        setBananas("GREEN", 1, GREEN_BANANA_FOR_TEAM, GREEN_BANANA_MAX_SUPPLY, 0);
        setBananas("BLUE", 2, BLUE_BANANA_FOR_TEAM, BLUE_BANANA_MAX_SUPPLY, 0);
        setBananas("DIAMOND", 3, DIAMOND_BANANA_FOR_TEAM, DIAMOND_BANANA_MAX_SUPPLY, 0);
        setBananas("EVIL_STONE", 4, 0, EVIL_STONE_MAX_SUPPLY, 0);
    }

    function setBananas(bytes32 _name, uint64 _id, uint64 _forTeam, uint64 _maxSupply, uint64 _count) internal {
        banana[_name] = Banana({
            id: _id,
            forTeam: _forTeam,
            maxSupply: _maxSupply,
            count: _count
        });
    }

    function setTokenContract(address _contract) external onlyOwner {
        cpbToken = _contract;
    }

    function setAddressesPerID(address[] memory _addresses, uint _id) external onlyOwner {
        addressesPerId[_id] = _addresses;
    }

    function activeEvilStoneMint(uint _cpbPrice) external onlyOwner {
        require(
            _cpbPrice > 0,
            "ERROR: CPB PRICE MUST BE > 0"
        );
        evilStoneActive = !evilStoneActive;
        evilStonePriceInCPB = _cpbPrice;
    }

    function activeMerge() external onlyOwner {
        paused = !paused;
    }

    function mergeBananas() external nonReentrant isNotPaused {
        Banana memory greenBanana = banana["GREEN"];
        Banana memory blueBanana = banana["BLUE"];
        Banana storage diamondBanana = banana["DIAMOND"];
        require(
            balanceOf(msg.sender, greenBanana.id)!= 0,
            "ERROR: NEED 1 GREEN BANANA"
        );
        require(
            balanceOf(msg.sender, blueBanana.id)!= 0,
            "ERROR: NEED 1 BLUE BANANA"
        );
        diamondBanana.count;
        require(
            diamondBanana.count <= diamondBanana.maxSupply,
            "ERROR: DIAMOND SUPPLY SOLD OUT"
        );
        _burn(msg.sender, blueBanana.id, 1);
        _burn(msg.sender, greenBanana.id, 1);
        diamondBanana.count++;
        _mint(msg.sender, diamondBanana.id, 1, "");

        emit DiamondMinted(msg.sender, diamondBanana.count);
    }

    function mintEvilStone() external nonReentrant mintIsActive {
        Banana memory diamondBanana = banana["DIAMOND"];
        Banana storage evilStone = banana["EVIL_STONE"];
        require(
            balanceOf(msg.sender,diamondBanana.id) != 0,
            "ERROR: NO DIAMOND BANANA"
        );
        uint totalCMB = oldStakingContract.getStakedTokens(msg.sender, "CMB").length + newStakingContract.getStakedTokens(msg.sender, "CMB").length + IERC721(cmbContract).balanceOf(msg.sender);
        uint totalCGB = oldStakingContract.getStakedTokens(msg.sender, "CGB").length + newStakingContract.getStakedTokens(msg.sender, "CGB").length + IERC721(cgbContract).balanceOf(msg.sender);
        require(
            totalCMB >= totalOfCMBNeeded || totalCGB >= totalOfCGBNeeded,
            "ERROR: NEED MORE CMB/CGB"
        );
        require(
            IERC20Burnable(cpbToken).balanceOf(msg.sender) >= evilStonePriceInCPB,
            "ERROR: NOT ENOUGH $CPB"
        );
        require(
            evilStone.count < evilStone.maxSupply,
            "ERROR: EVIL STONE SOLD OUT"
        );
        evilStone.count++;
        IERC20Burnable(cpbToken).burnFrom(msg.sender, evilStonePriceInCPB);
        _burn(msg.sender, diamondBanana.id, 1);
        _mint(msg.sender, evilStone.id, 1, "");

        emit EvileStoneMinted(msg.sender, evilStone.count);
    }

    function teamMint(bytes32 _name) external onlyOwner {
        Banana storage currentBanana = banana[_name];
        _mint(msg.sender, currentBanana.id, currentBanana.forTeam, "");
        currentBanana.count += currentBanana.forTeam;
    }

    function mintToAddresses(bytes32 _name) external onlyOwner {
        Banana storage currentBanana = banana[_name];
        require(
            currentBanana.count <= currentBanana.maxSupply,
            "ERROR: BANANA SUPPLY SOLD OUT"
        );
        uint64 _id = currentBanana.id;
        uint length = addressesPerId[_id].length;
        address[] memory addresses = addressesPerId[_id];
        for (uint i = 0; i < length;) {
            currentBanana.count++;
            _mint(addresses[i], _id, 1, "");
            unchecked { ++i;}
        }
    }

    function uri(uint256 _tokenId) override public pure returns (string memory){
        return string(
            abi.encodePacked(
                "https://cmb.mypinata.cloud/QmaJZm2itQfRFuZYKvHo8KKCCz2rJFD3XkrmCJvh7Rje55/",
                Strings.toString(_tokenId),
                ".json"
            )
        );
    }

    function getBananasCount(bytes32 _name) public view returns (uint64) {
        return banana[_name].count;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"contract ICPBStaking","name":"_oldStakingContract","type":"address"},{"internalType":"contract ICPBStaking","name":"_newStakingContract","type":"address"},{"internalType":"address","name":"_cmbContract","type":"address"},{"internalType":"address","name":"_cgbContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_count","type":"uint256"}],"name":"DiamondMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_count","type":"uint256"}],"name":"EvileStoneMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"BLUE_BANANA_FOR_TEAM","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLUE_BANANA_MAX_SUPPLY","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DIAMOND_BANANA_FOR_TEAM","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DIAMOND_BANANA_MAX_SUPPLY","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EVIL_STONE_MAX_SUPPLY","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GREEN_BANANA_FOR_TEAM","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GREEN_BANANA_MAX_SUPPLY","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cpbPrice","type":"uint256"}],"name":"activeEvilStoneMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activeMerge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressesPerId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"banana","outputs":[{"internalType":"uint64","name":"id","type":"uint64"},{"internalType":"uint64","name":"forTeam","type":"uint64"},{"internalType":"uint64","name":"maxSupply","type":"uint64"},{"internalType":"uint64","name":"count","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cpbToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"evilStoneActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"evilStonePriceInCPB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_name","type":"bytes32"}],"name":"getBananasCount","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mergeBananas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintEvilStone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_name","type":"bytes32"}],"name":"mintToAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"setAddressesPerID","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":"address","name":"_contract","type":"address"}],"name":"setTokenContract","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":"bytes32","name":"_name","type":"bytes32"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalOfCGBNeeded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOfCMBNeeded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]

60806040523480156200001157600080fd5b506040516200334f3803806200334f8339810160408190526200003491620004a6565b604051806080016040528060588152602001620032f7605891396200005981620003e7565b506001600381905560048054336001600160a01b0319918216179091556005805482166001600160a01b03898116919091179091556006805483168883161790556007805483168783161790556008805483168683161790556009805490921690841617905560408051608081018252918252601e602080840191825261018b9284019283526000606085018181526423a922a2a760d91b909152600c90915292517f4c95114d7bc9b454d366c49d4934b8db956a0eb37c8bef13c26678c64e64fd1a80549251935194516001600160401b039283166001600160801b0319909416939093176801000000000000000094831694909402939093176001600160801b0316600160801b948216949094026001600160c01b031693909317600160c01b93909116929092029190911790556040805160808101825260028152601e602080830191825261018b93830193845260006060840181815263424c554560e01b909152600c90915291517f95aa93b88dd35e39c3818156526792fc4dd84ec736e64953b6f3a12293aaf6ce80549251945193516001600160401b03908116600160c01b026001600160c01b03958216600160801b02959095166001600160801b0396821668010000000000000000026001600160801b031990951693909116929092179290921793909316929092171790556040805160808101825260038152600560208083019182526101ef938301938452600060608401818152661112505353d39160ca1b909152600c90915291517f19b040b6925c74b7fd4cf5d13f959537ba1a2bade6e34215def9b7207d1ccb5480549251945193516001600160401b03908116600160c01b026001600160c01b03958216600160801b02959095166001600160801b0396821668010000000000000000026001600160801b031990951693909116929092179290921793909316929092171790556040805160808101825260048152600060208083018281526101ef94840194855260608401838152694556494c5f53544f4e4560b01b909352600c90915291517f7d3d7e380017e05e705a96f6af0c395de9215a9d51e45ea19e363534350d29c880549351945192516001600160401b039283166001600160801b0319909516949094176801000000000000000095831695909502949094176001600160801b0316600160801b928216929092026001600160c01b031691909117600160c01b919092160217905550505050506200057c565b8051620003fc90600290602084019062000400565b5050565b8280546200040e9062000526565b90600052602060002090601f0160209004810192826200043257600085556200047d565b82601f106200044d57805160ff19168380011785556200047d565b828001600101855582156200047d579182015b828111156200047d57825182559160200191906001019062000460565b506200048b9291506200048f565b5090565b5b808211156200048b576000815560010162000490565b600080600080600060a08688031215620004bf57600080fd5b8551620004cc8162000563565b6020870151909550620004df8162000563565b6040870151909450620004f28162000563565b6060870151909350620005058162000563565b6080870151909250620005188162000563565b809150509295509295909350565b600181811c908216806200053b57607f821691505b602082108114156200055d57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b03811681146200057957600080fd5b50565b612d6b806200058c6000396000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638da5cb5b1161011a578063cd6a1c4c116100ad578063eea88d121161007c578063eea88d121461047e578063f242432a14610491578063f46c7e9a146104a4578063f74503bc146104ac578063fa3b371b146104dc57600080fd5b8063cd6a1c4c14610414578063e985e9c51461041c578063ea0bda0b14610458578063ea6e68421461046b57600080fd5b8063bbcd5bbe116100e9578063bbcd5bbe146103d9578063bccf2527146103ec578063bef66e6f146103f4578063cc47a7651461040157600080fd5b80638da5cb5b146103b3578063a22cb465146103c6578063a7d34cca146103a3578063ae87c2c81461024857600080fd5b80634e1273f41161019257806373d205871161016157806373d20587146103785780637d0f9dde146103a3578063822de89f14610269578063857086ab146103ab57600080fd5b80634e1273f41461032a5780635c975abb1461034a5780636167ece11461035c578063626df87d1461036557600080fd5b80630d4f8353116101ce5780630d4f8353146102725780630e89341c1461027c57806311e009811461029c5780632eb2c2d61461031757600080fd5b8062fdd58e146101ff57806301ffc9a7146102255780630255e2b31461024857806308160cda14610269575b600080fd5b61021261020d366004612575565b6104e4565b6040519081526020015b60405180910390f35b610238610233366004612710565b61057b565b604051901515815260200161021c565b61025161018b81565b6040516001600160401b03909116815260200161021c565b6102516101ef81565b61027a6105cd565b005b61028f61028a3660046126f7565b610614565b60405161021c91906129bb565b6102e46102aa3660046126f7565b600c602052600090815260409020546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b604080516001600160401b039586168152938516602085015291841691830191909152909116606082015260800161021c565b61027a61032536600461242c565b610645565b61033d61033836600461259f565b6106dc565b60405161021c919061297a565b600b5461023890610100900460ff1681565b610212600a5481565b61027a6103733660046126f7565b610805565b61038b610386366004612763565b610896565b6040516001600160a01b03909116815260200161021c565b610251601e81565b610212600181565b60045461038b906001600160a01b031681565b61027a6103d4366004612539565b6108ce565b61027a6103e73660046123d7565b6108dd565b610212600481565b600b546102389060ff1681565b61027a61040f3660046126f7565b610929565b61027a610ad8565b61023861042a3660046123f9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b61027a6104663660046126f7565b611291565b61027a610479366004612602565b61134e565b60055461038b906001600160a01b031681565b61027a61049f3660046124d5565b61139c565b610251600581565b6102516104ba3660046126f7565b6000908152600c6020526040902054600160c01b90046001600160401b031690565b61027a611423565b60006001600160a01b0383166105555760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806105ac57506001600160e01b031982166303a24d0760e21b145b806105c757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6004546001600160a01b031633146105f75760405162461bcd60e51b815260040161054c90612a16565b600b805461ff001981166101009182900460ff1615909102179055565b606061061f826117f1565b60405160200161062f91906127ec565b6040516020818303038152906040529050919050565b6001600160a01b0385163314806106615750610661853361042a565b6106c85760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161054c565b6106d585858585856118f6565b5050505050565b606081518351146107415760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161054c565b600083516001600160401b0381111561075c5761075c612c61565b604051908082528060200260200182016040528015610785578160200160208202803683370190505b50905060005b84518110156107fd576107d08582815181106107a9576107a9612c4b565b60200260200101518583815181106107c3576107c3612c4b565b60200260200101516104e4565b8282815181106107e2576107e2612c4b565b60209081029190910101526107f681612bc9565b905061078b565b509392505050565b6004546001600160a01b0316331461082f5760405162461bcd60e51b815260040161054c90612a16565b6000811161087f5760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a20435042205052494345204d555354204245203e203000000000604482015260640161054c565b600b805460ff19811660ff90911615179055600a55565b600d60205281600052604060002081815481106108b257600080fd5b6000918252602090912001546001600160a01b03169150829050565b6108d9338383611acb565b5050565b6004546001600160a01b031633146109075760405162461bcd60e51b815260040161054c90612a16565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031633146109535760405162461bcd60e51b815260040161054c90612a16565b6000818152600c6020526040902080546001600160401b03600160801b82048116600160c01b9092041611156109cb5760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a2042414e414e4120535550504c5920534f4c44204f5554000000604482015260640161054c565b80546001600160401b03166000818152600d60209081526040808320805482518185028101850190935280835293928490830182828015610a3557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a17575b5050505050905060005b82811015610ad0578454600160c01b90046001600160401b0316856018610a6583612be4565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555050610ac8828281518110610a9f57610a9f612c4b565b6020026020010151856001600160401b0316600160405180602001604052806000815250611bac565b600101610a3f565b505050505050565b60026003541415610b2b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161054c565b6002600355600b5460ff16610b8e5760405162461bcd60e51b8152602060048201526024808201527f4552524f523a204556494c2053544f4e45204d494e54204953204e4f542041436044820152635449564560e01b606482015260840161054c565b604080516080810182527f19b040b6925c74b7fd4cf5d13f959537ba1a2bade6e34215def9b7207d1ccb54546001600160401b038082168352600160401b82048116602084810191909152600160801b8304821694840194909452600160c01b90910481166060830152694556494c5f53544f4e4560b01b600052600c909252805190917f7d3d7e380017e05e705a96f6af0c395de9215a9d51e45ea19e363534350d29c891610c40913391166104e4565b610c8c5760405162461bcd60e51b815260206004820152601860248201527f4552524f523a204e4f204449414d4f4e442042414e414e410000000000000000604482015260640161054c565b6008546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610cd057600080fd5b505afa158015610ce4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d08919061274a565b600754604051636078d0a360e11b81526001600160a01b039091169063c0f1a14690610d3890339060040161291c565b60006040518083038186803b158015610d5057600080fd5b505afa158015610d64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d8c9190810190612646565b51600654604051636078d0a360e11b81526001600160a01b039091169063c0f1a14690610dbd90339060040161291c565b60006040518083038186803b158015610dd557600080fd5b505afa158015610de9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e119190810190612646565b51610e1c9190612aff565b610e269190612aff565b6009546040516370a0823160e01b81523360048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015610e6f57600080fd5b505afa158015610e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea7919061274a565b600754604051636078d0a360e11b81526001600160a01b039091169063c0f1a14690610ed790339060040161294b565b60006040518083038186803b158015610eef57600080fd5b505afa158015610f03573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f2b9190810190612646565b51600654604051636078d0a360e11b81526001600160a01b039091169063c0f1a14690610f5c90339060040161294b565b60006040518083038186803b158015610f7457600080fd5b505afa158015610f88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fb09190810190612646565b51610fbb9190612aff565b610fc59190612aff565b9050600182101580610fd8575060048110155b6110245760405162461bcd60e51b815260206004820152601860248201527f4552524f523a204e454544204d4f524520434d422f4347420000000000000000604482015260640161054c565b600a546005546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561106a57600080fd5b505afa15801561107e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a2919061274a565b10156110e95760405162461bcd60e51b815260206004820152601660248201527522a92927a91d102727aa1022a727aaa3a4101221a82160511b604482015260640161054c565b82546001600160401b03600160801b82048116600160c01b90920416106111525760405162461bcd60e51b815260206004820152601a60248201527f4552524f523a204556494c2053544f4e4520534f4c44204f5554000000000000604482015260640161054c565b8254600160c01b90046001600160401b031683601861117083612be4565b82546001600160401b039182166101009390930a928302919092021990911617905550600554600a5460405163079cc67960e41b815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b1580156111e357600080fd5b505af11580156111f7573d6000803e3d6000fd5b505050506112143385600001516001600160401b03166001611cc0565b825460408051602081019091526000815261123f9133916001600160401b0390911690600190611bac565b8254604051600160c01b9091046001600160401b0316815233907fc977a186580c78d43dac40d6b203591c6314689906345e148b9c9785cdda19e69060200160405180910390a2505060016003555050565b6004546001600160a01b031633146112bb5760405162461bcd60e51b815260040161054c90612a16565b6000818152600c60209081526040808320805482519384019092529282526112fa9133916001600160401b0380821692600160401b9092041690611bac565b80546001600160401b03600160401b82048116918391601891611326918591600160c01b900416612b17565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505050565b6004546001600160a01b031633146113785760405162461bcd60e51b815260040161054c90612a16565b6000818152600d602090815260409091208351611397928501906121e6565b505050565b6001600160a01b0385163314806113b857506113b8853361042a565b6114165760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161054c565b6106d58585858585611e3c565b600260035414156114765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161054c565b6002600355600b54610100900460ff166114d25760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a204d455247494e47204953204e4f542041435449564500000000604482015260640161054c565b60408051608080820183527f4c95114d7bc9b454d366c49d4934b8db956a0eb37c8bef13c26678c64e64fd1a546001600160401b038082168452600160401b8083048216602086810191909152600160801b808504841687890152600160c01b948590048416606080890191909152885196870189527f95aa93b88dd35e39c3818156526792fc4dd84ec736e64953b6f3a12293aaf6ce548086168852938404851687840152908304841697860197909752929004811694830194909452661112505353d39160ca1b600052600c90528151919290917f19b040b6925c74b7fd4cf5d13f959537ba1a2bade6e34215def9b7207d1ccb54916115d6913391166104e4565b6116225760405162461bcd60e51b815260206004820152601a60248201527f4552524f523a204e454544203120475245454e2042414e414e41000000000000604482015260640161054c565b6116393383600001516001600160401b03166104e4565b6116855760405162461bcd60e51b815260206004820152601960248201527f4552524f523a204e454544203120424c55452042414e414e4100000000000000604482015260640161054c565b80546001600160401b03600160801b82048116600160c01b9092041611156116ef5760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a204449414d4f4e4420535550504c5920534f4c44204f55540000604482015260640161054c565b6117083383600001516001600160401b03166001611cc0565b6117213384600001516001600160401b03166001611cc0565b8054600160c01b90046001600160401b031681601861173f83612be4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550506117a0338260000160009054906101000a90046001600160401b03166001600160401b0316600160405180602001604052806000815250611bac565b8054604051600160c01b9091046001600160401b0316815233907f79582702ed8f2a3976d0efc2dc6776d2fd2c3ec65f64170198502333027823649060200160405180910390a25050600160035550565b6060816118155750506040805180820190915260018152600360fc1b602082015290565b8160005b811561183f578061182981612bc9565b91506118389050600a83612b42565b9150611819565b6000816001600160401b0381111561185957611859612c61565b6040519080825280601f01601f191660200182016040528015611883576020820181803683370190505b5090505b84156118ee57611898600183612b56565b91506118a5600a86612c0b565b6118b0906030612aff565b60f81b8183815181106118c5576118c5612c4b565b60200101906001600160f81b031916908160001a9053506118e7600a86612b42565b9450611887565b949350505050565b81518351146119585760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161054c565b6001600160a01b03841661197e5760405162461bcd60e51b815260040161054c90612a4d565b3360005b8451811015611a6557600085828151811061199f5761199f612c4b565b6020026020010151905060008583815181106119bd576119bd612c4b565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611a0d5760405162461bcd60e51b815260040161054c90612a92565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611a4a908490612aff565b9250508190555050505080611a5e90612bc9565b9050611982565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611ab592919061298d565b60405180910390a4610ad0818787878787611f66565b816001600160a01b0316836001600160a01b03161415611b3f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161054c565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611c0c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161054c565b336000611c18856120d1565b90506000611c25856120d1565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290611c57908490612aff565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611cb78360008989898961211c565b50505050505050565b6001600160a01b038316611d225760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b606482015260840161054c565b336000611d2e846120d1565b90506000611d3b846120d1565b60408051602080820183526000918290528882528181528282206001600160a01b038b1683529052205490915084811015611dc45760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b606482015260840161054c565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611cb7565b6001600160a01b038416611e625760405162461bcd60e51b815260040161054c90612a4d565b336000611e6e856120d1565b90506000611e7b856120d1565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015611ebe5760405162461bcd60e51b815260040161054c90612a92565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611efb908490612aff565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611f5b848a8a8a8a8a61211c565b505050505050505050565b6001600160a01b0384163b15610ad05760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611faa9089908990889088908890600401612879565b602060405180830381600087803b158015611fc457600080fd5b505af1925050508015611ff4575060408051601f3d908101601f19168201909252611ff19181019061272d565b60015b6120a157612000612c77565b806308c379a0141561203a5750612015612c93565b80612020575061203c565b8060405162461bcd60e51b815260040161054c91906129bb565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161054c565b6001600160e01b0319811663bc197c8160e01b14611cb75760405162461bcd60e51b815260040161054c906129ce565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061210b5761210b612c4b565b602090810291909101015292915050565b6001600160a01b0384163b15610ad05760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061216090899089908890889088906004016128d7565b602060405180830381600087803b15801561217a57600080fd5b505af19250505080156121aa575060408051601f3d908101601f191682019092526121a79181019061272d565b60015b6121b657612000612c77565b6001600160e01b0319811663f23a6e6160e01b14611cb75760405162461bcd60e51b815260040161054c906129ce565b82805482825590600052602060002090810192821561223b579160200282015b8281111561223b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612206565b5061224792915061224b565b5090565b5b80821115612247576000815560010161224c565b80356001600160a01b038116811461227757600080fd5b919050565b600082601f83011261228d57600080fd5b8135602061229a82612adc565b6040516122a78282612b9d565b8381528281019150858301600585901b870184018810156122c757600080fd5b60005b858110156122ed576122db82612260565b845292840192908401906001016122ca565b5090979650505050505050565b600082601f83011261230b57600080fd5b8135602061231882612adc565b6040516123258282612b9d565b8381528281019150858301600585901b8701840188101561234557600080fd5b60005b858110156122ed57813584529284019290840190600101612348565b600082601f83011261237557600080fd5b81356001600160401b0381111561238e5761238e612c61565b6040516123a5601f8301601f191660200182612b9d565b8181528460208386010111156123ba57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156123e957600080fd5b6123f282612260565b9392505050565b6000806040838503121561240c57600080fd5b61241583612260565b915061242360208401612260565b90509250929050565b600080600080600060a0868803121561244457600080fd5b61244d86612260565b945061245b60208701612260565b935060408601356001600160401b038082111561247757600080fd5b61248389838a016122fa565b9450606088013591508082111561249957600080fd5b6124a589838a016122fa565b935060808801359150808211156124bb57600080fd5b506124c888828901612364565b9150509295509295909350565b600080600080600060a086880312156124ed57600080fd5b6124f686612260565b945061250460208701612260565b9350604086013592506060860135915060808601356001600160401b0381111561252d57600080fd5b6124c888828901612364565b6000806040838503121561254c57600080fd5b61255583612260565b91506020830135801515811461256a57600080fd5b809150509250929050565b6000806040838503121561258857600080fd5b61259183612260565b946020939093013593505050565b600080604083850312156125b257600080fd5b82356001600160401b03808211156125c957600080fd5b6125d58683870161227c565b935060208501359150808211156125eb57600080fd5b506125f8858286016122fa565b9150509250929050565b6000806040838503121561261557600080fd5b82356001600160401b0381111561262b57600080fd5b6126378582860161227c565b95602094909401359450505050565b6000602080838503121561265957600080fd5b82516001600160401b0381111561266f57600080fd5b8301601f8101851361268057600080fd5b805161268b81612adc565b6040516126988282612b9d565b8281528481019150838501600584901b850186018910156126b857600080fd5b60009450845b848110156126e957815161ffff811681146126d7578687fd5b845292860192908601906001016126be565b509098975050505050505050565b60006020828403121561270957600080fd5b5035919050565b60006020828403121561272257600080fd5b81356123f281612d1c565b60006020828403121561273f57600080fd5b81516123f281612d1c565b60006020828403121561275c57600080fd5b5051919050565b6000806040838503121561277657600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156127b557815187529582019590820190600101612799565b509495945050505050565b600081518084526127d8816020860160208601612b6d565b601f01601f19169290920160200192915050565b7f68747470733a2f2f636d622e6d7970696e6174612e636c6f75642f516d614a5a81527f6d32697451665246755a594b76486f384b4b43437a32724a464433586b726d436020820152694a766837526a6535352f60b01b60408201526000825161285d81604a850160208701612b6d565b64173539b7b760d91b604a939091019283015250604f01919050565b6001600160a01b0386811682528516602082015260a0604082018190526000906128a590830186612785565b82810360608401526128b78186612785565b905082810360808401526128cb81856127c0565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612911908301846127c0565b979650505050505050565b6001600160a01b039190911681526040602082018190526003908201526221a6a160e91b606082015260800190565b6001600160a01b039190911681526040602082018190526003908201526221a3a160e91b606082015260800190565b6020815260006123f26020830184612785565b6040815260006129a06040830185612785565b82810360208401526129b28185612785565b95945050505050565b6020815260006123f260208301846127c0565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252601a908201527f4552524f523a2043414c4c4552204953204e4f54204f574e4552000000000000604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60006001600160401b03821115612af557612af5612c61565b5060051b60200190565b60008219821115612b1257612b12612c1f565b500190565b60006001600160401b03808316818516808303821115612b3957612b39612c1f565b01949350505050565b600082612b5157612b51612c35565b500490565b600082821015612b6857612b68612c1f565b500390565b60005b83811015612b88578181015183820152602001612b70565b83811115612b97576000848401525b50505050565b601f8201601f191681016001600160401b0381118282101715612bc257612bc2612c61565b6040525050565b6000600019821415612bdd57612bdd612c1f565b5060010190565b60006001600160401b0380831681811415612c0157612c01612c1f565b6001019392505050565b600082612c1a57612c1a612c35565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612c905760046000803e5060005160e01c5b90565b600060443d1015612ca15790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612cd057505050505090565b8285019150815181811115612ce85750505050505090565b843d8701016020828501011115612d025750505050505090565b612d1160208286010187612b9d565b509095945050505050565b6001600160e01b031981168114612d3257600080fd5b5056fea26469706673582212208368881364f4db34a7e5034bf9df920fa26bd9d479b13d67d939c63c590dc94764736f6c6343000807003368747470733a2f2f636d622e6d7970696e6174612e636c6f75642f697066732f516d614a5a6d32697451665246755a594b76486f384b4b43437a32724a464433586b726d434a766837526a6535352f7b69647d2e6a736f6e000000000000000000000000f40ced6869b9e35dff4ec04cc11c2c50619742fa0000000000000000000000003390fb0ad64a9f98f343afde813f2561b3facbe50000000000000000000000008a8a874ebed85c8a1eae8b8f9f7ac32b9502bade000000000000000000000000939b90c529f0e3a2c187e1b190ca966a95881fde000000000000000000000000c843f18d5605654391e7edbea250f6838c3e8936

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638da5cb5b1161011a578063cd6a1c4c116100ad578063eea88d121161007c578063eea88d121461047e578063f242432a14610491578063f46c7e9a146104a4578063f74503bc146104ac578063fa3b371b146104dc57600080fd5b8063cd6a1c4c14610414578063e985e9c51461041c578063ea0bda0b14610458578063ea6e68421461046b57600080fd5b8063bbcd5bbe116100e9578063bbcd5bbe146103d9578063bccf2527146103ec578063bef66e6f146103f4578063cc47a7651461040157600080fd5b80638da5cb5b146103b3578063a22cb465146103c6578063a7d34cca146103a3578063ae87c2c81461024857600080fd5b80634e1273f41161019257806373d205871161016157806373d20587146103785780637d0f9dde146103a3578063822de89f14610269578063857086ab146103ab57600080fd5b80634e1273f41461032a5780635c975abb1461034a5780636167ece11461035c578063626df87d1461036557600080fd5b80630d4f8353116101ce5780630d4f8353146102725780630e89341c1461027c57806311e009811461029c5780632eb2c2d61461031757600080fd5b8062fdd58e146101ff57806301ffc9a7146102255780630255e2b31461024857806308160cda14610269575b600080fd5b61021261020d366004612575565b6104e4565b6040519081526020015b60405180910390f35b610238610233366004612710565b61057b565b604051901515815260200161021c565b61025161018b81565b6040516001600160401b03909116815260200161021c565b6102516101ef81565b61027a6105cd565b005b61028f61028a3660046126f7565b610614565b60405161021c91906129bb565b6102e46102aa3660046126f7565b600c602052600090815260409020546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b604080516001600160401b039586168152938516602085015291841691830191909152909116606082015260800161021c565b61027a61032536600461242c565b610645565b61033d61033836600461259f565b6106dc565b60405161021c919061297a565b600b5461023890610100900460ff1681565b610212600a5481565b61027a6103733660046126f7565b610805565b61038b610386366004612763565b610896565b6040516001600160a01b03909116815260200161021c565b610251601e81565b610212600181565b60045461038b906001600160a01b031681565b61027a6103d4366004612539565b6108ce565b61027a6103e73660046123d7565b6108dd565b610212600481565b600b546102389060ff1681565b61027a61040f3660046126f7565b610929565b61027a610ad8565b61023861042a3660046123f9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b61027a6104663660046126f7565b611291565b61027a610479366004612602565b61134e565b60055461038b906001600160a01b031681565b61027a61049f3660046124d5565b61139c565b610251600581565b6102516104ba3660046126f7565b6000908152600c6020526040902054600160c01b90046001600160401b031690565b61027a611423565b60006001600160a01b0383166105555760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806105ac57506001600160e01b031982166303a24d0760e21b145b806105c757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6004546001600160a01b031633146105f75760405162461bcd60e51b815260040161054c90612a16565b600b805461ff001981166101009182900460ff1615909102179055565b606061061f826117f1565b60405160200161062f91906127ec565b6040516020818303038152906040529050919050565b6001600160a01b0385163314806106615750610661853361042a565b6106c85760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161054c565b6106d585858585856118f6565b5050505050565b606081518351146107415760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161054c565b600083516001600160401b0381111561075c5761075c612c61565b604051908082528060200260200182016040528015610785578160200160208202803683370190505b50905060005b84518110156107fd576107d08582815181106107a9576107a9612c4b565b60200260200101518583815181106107c3576107c3612c4b565b60200260200101516104e4565b8282815181106107e2576107e2612c4b565b60209081029190910101526107f681612bc9565b905061078b565b509392505050565b6004546001600160a01b0316331461082f5760405162461bcd60e51b815260040161054c90612a16565b6000811161087f5760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a20435042205052494345204d555354204245203e203000000000604482015260640161054c565b600b805460ff19811660ff90911615179055600a55565b600d60205281600052604060002081815481106108b257600080fd5b6000918252602090912001546001600160a01b03169150829050565b6108d9338383611acb565b5050565b6004546001600160a01b031633146109075760405162461bcd60e51b815260040161054c90612a16565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031633146109535760405162461bcd60e51b815260040161054c90612a16565b6000818152600c6020526040902080546001600160401b03600160801b82048116600160c01b9092041611156109cb5760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a2042414e414e4120535550504c5920534f4c44204f5554000000604482015260640161054c565b80546001600160401b03166000818152600d60209081526040808320805482518185028101850190935280835293928490830182828015610a3557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a17575b5050505050905060005b82811015610ad0578454600160c01b90046001600160401b0316856018610a6583612be4565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555050610ac8828281518110610a9f57610a9f612c4b565b6020026020010151856001600160401b0316600160405180602001604052806000815250611bac565b600101610a3f565b505050505050565b60026003541415610b2b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161054c565b6002600355600b5460ff16610b8e5760405162461bcd60e51b8152602060048201526024808201527f4552524f523a204556494c2053544f4e45204d494e54204953204e4f542041436044820152635449564560e01b606482015260840161054c565b604080516080810182527f19b040b6925c74b7fd4cf5d13f959537ba1a2bade6e34215def9b7207d1ccb54546001600160401b038082168352600160401b82048116602084810191909152600160801b8304821694840194909452600160c01b90910481166060830152694556494c5f53544f4e4560b01b600052600c909252805190917f7d3d7e380017e05e705a96f6af0c395de9215a9d51e45ea19e363534350d29c891610c40913391166104e4565b610c8c5760405162461bcd60e51b815260206004820152601860248201527f4552524f523a204e4f204449414d4f4e442042414e414e410000000000000000604482015260640161054c565b6008546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610cd057600080fd5b505afa158015610ce4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d08919061274a565b600754604051636078d0a360e11b81526001600160a01b039091169063c0f1a14690610d3890339060040161291c565b60006040518083038186803b158015610d5057600080fd5b505afa158015610d64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d8c9190810190612646565b51600654604051636078d0a360e11b81526001600160a01b039091169063c0f1a14690610dbd90339060040161291c565b60006040518083038186803b158015610dd557600080fd5b505afa158015610de9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e119190810190612646565b51610e1c9190612aff565b610e269190612aff565b6009546040516370a0823160e01b81523360048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015610e6f57600080fd5b505afa158015610e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea7919061274a565b600754604051636078d0a360e11b81526001600160a01b039091169063c0f1a14690610ed790339060040161294b565b60006040518083038186803b158015610eef57600080fd5b505afa158015610f03573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f2b9190810190612646565b51600654604051636078d0a360e11b81526001600160a01b039091169063c0f1a14690610f5c90339060040161294b565b60006040518083038186803b158015610f7457600080fd5b505afa158015610f88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fb09190810190612646565b51610fbb9190612aff565b610fc59190612aff565b9050600182101580610fd8575060048110155b6110245760405162461bcd60e51b815260206004820152601860248201527f4552524f523a204e454544204d4f524520434d422f4347420000000000000000604482015260640161054c565b600a546005546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561106a57600080fd5b505afa15801561107e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a2919061274a565b10156110e95760405162461bcd60e51b815260206004820152601660248201527522a92927a91d102727aa1022a727aaa3a4101221a82160511b604482015260640161054c565b82546001600160401b03600160801b82048116600160c01b90920416106111525760405162461bcd60e51b815260206004820152601a60248201527f4552524f523a204556494c2053544f4e4520534f4c44204f5554000000000000604482015260640161054c565b8254600160c01b90046001600160401b031683601861117083612be4565b82546001600160401b039182166101009390930a928302919092021990911617905550600554600a5460405163079cc67960e41b815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b1580156111e357600080fd5b505af11580156111f7573d6000803e3d6000fd5b505050506112143385600001516001600160401b03166001611cc0565b825460408051602081019091526000815261123f9133916001600160401b0390911690600190611bac565b8254604051600160c01b9091046001600160401b0316815233907fc977a186580c78d43dac40d6b203591c6314689906345e148b9c9785cdda19e69060200160405180910390a2505060016003555050565b6004546001600160a01b031633146112bb5760405162461bcd60e51b815260040161054c90612a16565b6000818152600c60209081526040808320805482519384019092529282526112fa9133916001600160401b0380821692600160401b9092041690611bac565b80546001600160401b03600160401b82048116918391601891611326918591600160c01b900416612b17565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505050565b6004546001600160a01b031633146113785760405162461bcd60e51b815260040161054c90612a16565b6000818152600d602090815260409091208351611397928501906121e6565b505050565b6001600160a01b0385163314806113b857506113b8853361042a565b6114165760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161054c565b6106d58585858585611e3c565b600260035414156114765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161054c565b6002600355600b54610100900460ff166114d25760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a204d455247494e47204953204e4f542041435449564500000000604482015260640161054c565b60408051608080820183527f4c95114d7bc9b454d366c49d4934b8db956a0eb37c8bef13c26678c64e64fd1a546001600160401b038082168452600160401b8083048216602086810191909152600160801b808504841687890152600160c01b948590048416606080890191909152885196870189527f95aa93b88dd35e39c3818156526792fc4dd84ec736e64953b6f3a12293aaf6ce548086168852938404851687840152908304841697860197909752929004811694830194909452661112505353d39160ca1b600052600c90528151919290917f19b040b6925c74b7fd4cf5d13f959537ba1a2bade6e34215def9b7207d1ccb54916115d6913391166104e4565b6116225760405162461bcd60e51b815260206004820152601a60248201527f4552524f523a204e454544203120475245454e2042414e414e41000000000000604482015260640161054c565b6116393383600001516001600160401b03166104e4565b6116855760405162461bcd60e51b815260206004820152601960248201527f4552524f523a204e454544203120424c55452042414e414e4100000000000000604482015260640161054c565b80546001600160401b03600160801b82048116600160c01b9092041611156116ef5760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a204449414d4f4e4420535550504c5920534f4c44204f55540000604482015260640161054c565b6117083383600001516001600160401b03166001611cc0565b6117213384600001516001600160401b03166001611cc0565b8054600160c01b90046001600160401b031681601861173f83612be4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550506117a0338260000160009054906101000a90046001600160401b03166001600160401b0316600160405180602001604052806000815250611bac565b8054604051600160c01b9091046001600160401b0316815233907f79582702ed8f2a3976d0efc2dc6776d2fd2c3ec65f64170198502333027823649060200160405180910390a25050600160035550565b6060816118155750506040805180820190915260018152600360fc1b602082015290565b8160005b811561183f578061182981612bc9565b91506118389050600a83612b42565b9150611819565b6000816001600160401b0381111561185957611859612c61565b6040519080825280601f01601f191660200182016040528015611883576020820181803683370190505b5090505b84156118ee57611898600183612b56565b91506118a5600a86612c0b565b6118b0906030612aff565b60f81b8183815181106118c5576118c5612c4b565b60200101906001600160f81b031916908160001a9053506118e7600a86612b42565b9450611887565b949350505050565b81518351146119585760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161054c565b6001600160a01b03841661197e5760405162461bcd60e51b815260040161054c90612a4d565b3360005b8451811015611a6557600085828151811061199f5761199f612c4b565b6020026020010151905060008583815181106119bd576119bd612c4b565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611a0d5760405162461bcd60e51b815260040161054c90612a92565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611a4a908490612aff565b9250508190555050505080611a5e90612bc9565b9050611982565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611ab592919061298d565b60405180910390a4610ad0818787878787611f66565b816001600160a01b0316836001600160a01b03161415611b3f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161054c565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611c0c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161054c565b336000611c18856120d1565b90506000611c25856120d1565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290611c57908490612aff565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611cb78360008989898961211c565b50505050505050565b6001600160a01b038316611d225760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b606482015260840161054c565b336000611d2e846120d1565b90506000611d3b846120d1565b60408051602080820183526000918290528882528181528282206001600160a01b038b1683529052205490915084811015611dc45760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b606482015260840161054c565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611cb7565b6001600160a01b038416611e625760405162461bcd60e51b815260040161054c90612a4d565b336000611e6e856120d1565b90506000611e7b856120d1565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015611ebe5760405162461bcd60e51b815260040161054c90612a92565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611efb908490612aff565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611f5b848a8a8a8a8a61211c565b505050505050505050565b6001600160a01b0384163b15610ad05760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611faa9089908990889088908890600401612879565b602060405180830381600087803b158015611fc457600080fd5b505af1925050508015611ff4575060408051601f3d908101601f19168201909252611ff19181019061272d565b60015b6120a157612000612c77565b806308c379a0141561203a5750612015612c93565b80612020575061203c565b8060405162461bcd60e51b815260040161054c91906129bb565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161054c565b6001600160e01b0319811663bc197c8160e01b14611cb75760405162461bcd60e51b815260040161054c906129ce565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061210b5761210b612c4b565b602090810291909101015292915050565b6001600160a01b0384163b15610ad05760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061216090899089908890889088906004016128d7565b602060405180830381600087803b15801561217a57600080fd5b505af19250505080156121aa575060408051601f3d908101601f191682019092526121a79181019061272d565b60015b6121b657612000612c77565b6001600160e01b0319811663f23a6e6160e01b14611cb75760405162461bcd60e51b815260040161054c906129ce565b82805482825590600052602060002090810192821561223b579160200282015b8281111561223b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612206565b5061224792915061224b565b5090565b5b80821115612247576000815560010161224c565b80356001600160a01b038116811461227757600080fd5b919050565b600082601f83011261228d57600080fd5b8135602061229a82612adc565b6040516122a78282612b9d565b8381528281019150858301600585901b870184018810156122c757600080fd5b60005b858110156122ed576122db82612260565b845292840192908401906001016122ca565b5090979650505050505050565b600082601f83011261230b57600080fd5b8135602061231882612adc565b6040516123258282612b9d565b8381528281019150858301600585901b8701840188101561234557600080fd5b60005b858110156122ed57813584529284019290840190600101612348565b600082601f83011261237557600080fd5b81356001600160401b0381111561238e5761238e612c61565b6040516123a5601f8301601f191660200182612b9d565b8181528460208386010111156123ba57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156123e957600080fd5b6123f282612260565b9392505050565b6000806040838503121561240c57600080fd5b61241583612260565b915061242360208401612260565b90509250929050565b600080600080600060a0868803121561244457600080fd5b61244d86612260565b945061245b60208701612260565b935060408601356001600160401b038082111561247757600080fd5b61248389838a016122fa565b9450606088013591508082111561249957600080fd5b6124a589838a016122fa565b935060808801359150808211156124bb57600080fd5b506124c888828901612364565b9150509295509295909350565b600080600080600060a086880312156124ed57600080fd5b6124f686612260565b945061250460208701612260565b9350604086013592506060860135915060808601356001600160401b0381111561252d57600080fd5b6124c888828901612364565b6000806040838503121561254c57600080fd5b61255583612260565b91506020830135801515811461256a57600080fd5b809150509250929050565b6000806040838503121561258857600080fd5b61259183612260565b946020939093013593505050565b600080604083850312156125b257600080fd5b82356001600160401b03808211156125c957600080fd5b6125d58683870161227c565b935060208501359150808211156125eb57600080fd5b506125f8858286016122fa565b9150509250929050565b6000806040838503121561261557600080fd5b82356001600160401b0381111561262b57600080fd5b6126378582860161227c565b95602094909401359450505050565b6000602080838503121561265957600080fd5b82516001600160401b0381111561266f57600080fd5b8301601f8101851361268057600080fd5b805161268b81612adc565b6040516126988282612b9d565b8281528481019150838501600584901b850186018910156126b857600080fd5b60009450845b848110156126e957815161ffff811681146126d7578687fd5b845292860192908601906001016126be565b509098975050505050505050565b60006020828403121561270957600080fd5b5035919050565b60006020828403121561272257600080fd5b81356123f281612d1c565b60006020828403121561273f57600080fd5b81516123f281612d1c565b60006020828403121561275c57600080fd5b5051919050565b6000806040838503121561277657600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156127b557815187529582019590820190600101612799565b509495945050505050565b600081518084526127d8816020860160208601612b6d565b601f01601f19169290920160200192915050565b7f68747470733a2f2f636d622e6d7970696e6174612e636c6f75642f516d614a5a81527f6d32697451665246755a594b76486f384b4b43437a32724a464433586b726d436020820152694a766837526a6535352f60b01b60408201526000825161285d81604a850160208701612b6d565b64173539b7b760d91b604a939091019283015250604f01919050565b6001600160a01b0386811682528516602082015260a0604082018190526000906128a590830186612785565b82810360608401526128b78186612785565b905082810360808401526128cb81856127c0565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612911908301846127c0565b979650505050505050565b6001600160a01b039190911681526040602082018190526003908201526221a6a160e91b606082015260800190565b6001600160a01b039190911681526040602082018190526003908201526221a3a160e91b606082015260800190565b6020815260006123f26020830184612785565b6040815260006129a06040830185612785565b82810360208401526129b28185612785565b95945050505050565b6020815260006123f260208301846127c0565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252601a908201527f4552524f523a2043414c4c4552204953204e4f54204f574e4552000000000000604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60006001600160401b03821115612af557612af5612c61565b5060051b60200190565b60008219821115612b1257612b12612c1f565b500190565b60006001600160401b03808316818516808303821115612b3957612b39612c1f565b01949350505050565b600082612b5157612b51612c35565b500490565b600082821015612b6857612b68612c1f565b500390565b60005b83811015612b88578181015183820152602001612b70565b83811115612b97576000848401525b50505050565b601f8201601f191681016001600160401b0381118282101715612bc257612bc2612c61565b6040525050565b6000600019821415612bdd57612bdd612c1f565b5060010190565b60006001600160401b0380831681811415612c0157612c01612c1f565b6001019392505050565b600082612c1a57612c1a612c35565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612c905760046000803e5060005160e01c5b90565b600060443d1015612ca15790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612cd057505050505090565b8285019150815181811115612ce85750505050505090565b843d8701016020828501011115612d025750505050505090565b612d1160208286010187612b9d565b509095945050505050565b6001600160e01b031981168114612d3257600080fd5b5056fea26469706673582212208368881364f4db34a7e5034bf9df920fa26bd9d479b13d67d939c63c590dc94764736f6c63430008070033

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

000000000000000000000000f40ced6869b9e35dff4ec04cc11c2c50619742fa0000000000000000000000003390fb0ad64a9f98f343afde813f2561b3facbe50000000000000000000000008a8a874ebed85c8a1eae8b8f9f7ac32b9502bade000000000000000000000000939b90c529f0e3a2c187e1b190ca966a95881fde000000000000000000000000c843f18d5605654391e7edbea250f6838c3e8936

-----Decoded View---------------
Arg [0] : _tokenContract (address): 0xf40ced6869b9e35dff4ec04cc11c2c50619742fa
Arg [1] : _oldStakingContract (address): 0x3390fb0ad64a9f98f343afde813f2561b3facbe5
Arg [2] : _newStakingContract (address): 0x8a8a874ebed85c8a1eae8b8f9f7ac32b9502bade
Arg [3] : _cmbContract (address): 0x939b90c529f0e3a2c187e1b190ca966a95881fde
Arg [4] : _cgbContract (address): 0xc843f18d5605654391e7edbea250f6838c3e8936

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000f40ced6869b9e35dff4ec04cc11c2c50619742fa
Arg [1] : 0000000000000000000000003390fb0ad64a9f98f343afde813f2561b3facbe5
Arg [2] : 0000000000000000000000008a8a874ebed85c8a1eae8b8f9f7ac32b9502bade
Arg [3] : 000000000000000000000000939b90c529f0e3a2c187e1b190ca966a95881fde
Arg [4] : 000000000000000000000000c843f18d5605654391e7edbea250f6838c3e8936


Deployed ByteCode Sourcemap

49187:6972:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33556:231;;;;;;:::i;:::-;;:::i;:::-;;;23749:25:1;;;23737:2;23722:18;33556:231:0;;;;;;;;32579:310;;;;;;:::i;:::-;;:::i;:::-;;;13352:14:1;;13345:22;13327:41;;13315:2;13300:18;32579:310:0;13187:187:1;49620:52:0;;49669:3;49620:52;;;;;-1:-1:-1;;;;;24201:31:1;;;24183:50;;24171:2;24156:18;49620:52:0;24038:201:1;49740:50:0;;49787:3;49740:50;;52488:77;;;:::i;:::-;;55704:330;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50156:40::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;50156:40:0;;;;-1:-1:-1;;;50156:40:0;;;;;-1:-1:-1;;;50156:40:0;;;;;-1:-1:-1;;;50156:40:0;;;;;;;;;-1:-1:-1;;;;;24727:15:1;;;24709:34;;24779:15;;;24774:2;24759:18;;24752:43;24831:15;;;24811:18;;;24804:43;;;;24883:15;;;24878:2;24863:18;;24856:43;24659:3;24644:19;50156:40:0;24449:456:1;35495:442:0;;;;;;:::i;:::-;;:::i;33953:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50003:18::-;;;;;;;;;;;;49524:31;;;;;;52219:261;;;;;;:::i;:::-;;:::i;50203:48::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9874:32:1;;;9856:51;;9844:2;9829:18;50203:48:0;9710:203:1;49799:49:0;;49846:2;49799:49;;49428:41;;49468:1;49428:41;;49241:20;;;;;-1:-1:-1;;;;;49241:20:0;;;34550:155;;;;;;:::i;:::-;;:::i;51964:103::-;;;;;;:::i;:::-;;:::i;49476:41::-;;49516:1;49476:41;;49969:27;;;;;;;;;55123:573;;;;;;:::i;:::-;;:::i;53475:1389::-;;;:::i;34777:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;34900:27:0;;;34876:4;34900:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;34777:168;54872:243;;;;;;:::i;:::-;;:::i;52075:136::-;;;;;;:::i;:::-;;:::i;49268:23::-;;;;;-1:-1:-1;;;;;49268:23:0;;;35017:401;;;;;;:::i;:::-;;:::i;49910:50::-;;49959:1;49910:50;;56042:114;;;;;;:::i;:::-;56103:6;56129:13;;;:6;:13;;;;;:19;-1:-1:-1;;;56129:19:0;;-1:-1:-1;;;;;56129:19:0;;56042:114;52573:894;;;:::i;33556:231::-;33642:7;-1:-1:-1;;;;;33670:21:0;;33662:77;;;;-1:-1:-1;;;33662:77:0;;14635:2:1;33662:77:0;;;14617:21:1;14674:2;14654:18;;;14647:30;14713:34;14693:18;;;14686:62;-1:-1:-1;;;14764:18:1;;;14757:41;14815:19;;33662:77:0;;;;;;;;;-1:-1:-1;33757:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;33757:22:0;;;;;;;;;;;;33556:231::o;32579:310::-;32681:4;-1:-1:-1;;;;;;32718:41:0;;-1:-1:-1;;;32718:41:0;;:110;;-1:-1:-1;;;;;;;32776:52:0;;-1:-1:-1;;;32776:52:0;32718:110;:163;;;-1:-1:-1;;;;;;;;;;23981:40:0;;;32845:36;32698:183;32579:310;-1:-1:-1;;32579:310:0:o;52488:77::-;50459:5;;-1:-1:-1;;;;;50459:5:0;50445:10;:19;50423:95;;;;-1:-1:-1;;;50423:95:0;;;;;;;:::i;:::-;52551:6:::1;::::0;;-1:-1:-1;;52541:16:0;::::1;52551:6;::::0;;;::::1;;;52550:7;52541:16:::0;;::::1;;::::0;;52488:77::o;55704:330::-;55765:13;55948:26;55965:8;55948:16;:26::i;:::-;55818:197;;;;;;;;:::i;:::-;;;;;;;;;;;;;55790:236;;55704:330;;;:::o;35495:442::-;-1:-1:-1;;;;;35728:20:0;;8576:10;35728:20;;:60;;-1:-1:-1;35752:36:0;35769:4;8576:10;34777:168;:::i;35752:36::-;35706:160;;;;-1:-1:-1;;;35706:160:0;;17329:2:1;35706:160:0;;;17311:21:1;17368:2;17348:18;;;17341:30;17407:34;17387:18;;;17380:62;-1:-1:-1;;;17458:18:1;;;17451:48;17516:19;;35706:160:0;17127:414:1;35706:160:0;35877:52;35900:4;35906:2;35910:3;35915:7;35924:4;35877:22;:52::i;:::-;35495:442;;;;;:::o;33953:524::-;34109:16;34170:3;:10;34151:8;:15;:29;34143:83;;;;-1:-1:-1;;;34143:83:0;;21866:2:1;34143:83:0;;;21848:21:1;21905:2;21885:18;;;21878:30;21944:34;21924:18;;;21917:62;-1:-1:-1;;;21995:18:1;;;21988:39;22044:19;;34143:83:0;21664:405:1;34143:83:0;34239:30;34286:8;:15;-1:-1:-1;;;;;34272:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34272:30:0;;34239:63;;34320:9;34315:122;34339:8;:15;34335:1;:19;34315:122;;;34395:30;34405:8;34414:1;34405:11;;;;;;;;:::i;:::-;;;;;;;34418:3;34422:1;34418:6;;;;;;;;:::i;:::-;;;;;;;34395:9;:30::i;:::-;34376:13;34390:1;34376:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;34356:3;;;:::i;:::-;;;34315:122;;;-1:-1:-1;34456:13:0;33953:524;-1:-1:-1;;;33953:524:0:o;52219:261::-;50459:5;;-1:-1:-1;;;;;50459:5:0;50445:10;:19;50423:95;;;;-1:-1:-1;;;50423:95:0;;;;;;;:::i;:::-;52328:1:::1;52316:9;:13;52294:91;;;::::0;-1:-1:-1;;;52294:91:0;;21099:2:1;52294:91:0::1;::::0;::::1;21081:21:1::0;21138:2;21118:18;;;21111:30;21177;21157:18;;;21150:58;21225:18;;52294:91:0::1;20897:352:1::0;52294:91:0::1;52415:15;::::0;;-1:-1:-1;;52396:34:0;::::1;52415:15;::::0;;::::1;52414:16;52396:34;::::0;;52441:19:::1;:31:::0;52219:261::o;50203:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50203:48:0;;-1:-1:-1;50203:48:0;;-1:-1:-1;50203:48:0:o;34550:155::-;34645:52;8576:10;34678:8;34688;34645:18;:52::i;:::-;34550:155;;:::o;51964:103::-;50459:5;;-1:-1:-1;;;;;50459:5:0;50445:10;:19;50423:95;;;;-1:-1:-1;;;50423:95:0;;;;;;;:::i;:::-;52039:8:::1;:20:::0;;-1:-1:-1;;;;;;52039:20:0::1;-1:-1:-1::0;;;;;52039:20:0;;;::::1;::::0;;;::::1;::::0;;51964:103::o;55123:573::-;50459:5;;-1:-1:-1;;;;;50459:5:0;50445:10;:19;50423:95;;;;-1:-1:-1;;;50423:95:0;;;;;;;:::i;:::-;55193:28:::1;55224:13:::0;;;:6:::1;:13;::::0;;;;55293:23;;-1:-1:-1;;;;;;;;55293:23:0;::::1;::::0;::::1;-1:-1:-1::0;;;55270:19:0;;::::1;;:46;;55248:125;;;::::0;-1:-1:-1;;;55248:125:0;;23447:2:1;55248:125:0::1;::::0;::::1;23429:21:1::0;23486:2;23466:18;;;23459:30;23525:31;23505:18;;;23498:59;23574:18;;55248:125:0::1;23245:353:1::0;55248:125:0::1;55397:16:::0;;-1:-1:-1;;;;;55397:16:0::1;55384:10;55438:19:::0;;;:14:::1;:19;::::0;;;;;;;:26;;55475:48;;;;::::1;::::0;;;;;;;;;;55438:26;55384:10;55438:26;;55475:48;::::1;55438:19:::0;:26;55475:48;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;55475:48:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;55539:6;55534:155;55555:6;55551:1;:10;55534:155;;;55579:21:::0;;-1:-1:-1;;;55579:21:0;::::1;-1:-1:-1::0;;;;;55579:21:0::1;::::0;:19:::1;:21;::::0;::::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;55579:21:0::1;;;;;-1:-1:-1::0;;;;;55579:21:0::1;;;;;;;55615:31;55621:9;55631:1;55621:12;;;;;;;;:::i;:::-;;;;;;;55635:3;-1:-1:-1::0;;;;;55615:31:0::1;55640:1;55615:31;;;;;;;;;;;::::0;:5:::1;:31::i;:::-;55673:3;;55534:155;;;;55182:514;;;;55123:573:::0;:::o;53475:1389::-;4746:1;5344:7;;:19;;5336:63;;;;-1:-1:-1;;;5336:63:0;;23087:2:1;5336:63:0;;;23069:21:1;23126:2;23106:18;;;23099:30;23165:33;23145:18;;;23138:61;23216:18;;5336:63:0;22885:355:1;5336:63:0;4746:1;5477:7;:18;50601:15:::1;::::0;::::1;;50579:101;;;::::0;-1:-1:-1;;;50579:101:0;;20339:2:1;50579:101:0::1;::::0;::::1;20321:21:1::0;20378:2;20358:18;;;20351:30;20417:34;20397:18;;;20390:62;-1:-1:-1;;;20468:18:1;;;20461:34;20512:19;;50579:101:0::1;20137:400:1::0;50579:101:0::1;53576:17:::0;53546:47;;::::2;::::0;::::2;::::0;;53576:17;53546:47;-1:-1:-1;;;;;53546:47:0;;::::2;::::0;;-1:-1:-1;;;53546:47:0;::::2;::::0;::::2;53576:17;53546:47:::0;;::::2;::::0;;;;-1:-1:-1;;;53546:47:0;::::2;::::0;::::2;::::0;;;;;;;-1:-1:-1;;;53546:47:0;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;53546:27:0::2;53631:20:::0;53576:6:::2;53631:20:::0;;;53705:16;;53546:47;;53631:20;;53684:38:::2;::::0;53694:10:::2;::::0;53684:38:::2;:9;:38::i;:::-;53662:117;;;::::0;-1:-1:-1;;;53662:117:0;;18812:2:1;53662:117:0::2;::::0;::::2;18794:21:1::0;18851:2;18831:18;;;18824:30;18890:26;18870:18;;;18863:54;18934:18;;53662:117:0::2;18610:348:1::0;53662:117:0::2;53940:11;::::0;53932:42:::2;::::0;-1:-1:-1;;;53932:42:0;;53963:10:::2;53932:42;::::0;::::2;9856:51:1::0;53790:13:0::2;::::0;-1:-1:-1;;;;;53940:11:0::2;::::0;53932:30:::2;::::0;9829:18:1;;53932:42:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53869:18;::::0;:53:::2;::::0;-1:-1:-1;;;53869:53:0;;-1:-1:-1;;;;;53869:18:0;;::::2;::::0;:34:::2;::::0;:53:::2;::::0;53904:10:::2;::::0;53869:53:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;53869:53:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;:60:::0;53806:18:::2;::::0;:53:::2;::::0;-1:-1:-1;;;53806:53:0;;-1:-1:-1;;;;;53806:18:0;;::::2;::::0;:34:::2;::::0;:53:::2;::::0;53841:10:::2;::::0;53806:53:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;53806:53:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;:60;:123;;;;:::i;:::-;:168;;;;:::i;:::-;54135:11;::::0;54127:42:::2;::::0;-1:-1:-1;;;54127:42:0;;54158:10:::2;54127:42;::::0;::::2;9856:51:1::0;53790:184:0;;-1:-1:-1;53985:13:0::2;::::0;-1:-1:-1;;;;;54135:11:0;;::::2;::::0;54127:30:::2;::::0;9829:18:1;;54127:42:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54064:18;::::0;:53:::2;::::0;-1:-1:-1;;;54064:53:0;;-1:-1:-1;;;;;54064:18:0;;::::2;::::0;:34:::2;::::0;:53:::2;::::0;54099:10:::2;::::0;54064:53:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;54064:53:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;:60:::0;54001:18:::2;::::0;:53:::2;::::0;-1:-1:-1;;;54001:53:0;;-1:-1:-1;;;;;54001:18:0;;::::2;::::0;:34:::2;::::0;:53:::2;::::0;54036:10:::2;::::0;54001:53:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;54001:53:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;:60;:123;;;;:::i;:::-;:168;;;;:::i;:::-;53985:184;;49468:1;54202:8;:28;;:60;;;;49516:1;54234:8;:28;;54202:60;54180:134;;;::::0;-1:-1:-1;;;54180:134:0;;18102:2:1;54180:134:0::2;::::0;::::2;18084:21:1::0;18141:2;18121:18;;;18114:30;18180:26;18160:18;;;18153:54;18224:18;;54180:134:0::2;17900:348:1::0;54180:134:0::2;54397:19;::::0;54362:8:::2;::::0;54347:46:::2;::::0;-1:-1:-1;;;54347:46:0;;54382:10:::2;54347:46;::::0;::::2;9856:51:1::0;-1:-1:-1;;;;;54362:8:0;;::::2;::::0;54347:34:::2;::::0;9829:18:1;;54347:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:69;;54325:141;;;::::0;-1:-1:-1;;;54325:141:0;;16217:2:1;54325:141:0::2;::::0;::::2;16199:21:1::0;16256:2;16236:18;;;16229:30;-1:-1:-1;;;16275:18:1;;;16268:52;16337:18;;54325:141:0::2;16015:346:1::0;54325:141:0::2;54517:19:::0;;-1:-1:-1;;;;;;;;54517:19:0;::::2;::::0;::::2;-1:-1:-1::0;;;54499:15:0;;::::2;;:37;54477:113;;;::::0;-1:-1:-1;;;54477:113:0;;20744:2:1;54477:113:0::2;::::0;::::2;20726:21:1::0;20783:2;20763:18;;;20756:30;20822:28;20802:18;;;20795:56;20868:18;;54477:113:0::2;20542:350:1::0;54477:113:0::2;54601:17:::0;;-1:-1:-1;;;54601:17:0;::::2;-1:-1:-1::0;;;;;54601:17:0::2;::::0;:15:::2;:17;::::0;::::2;:::i;:::-;::::0;;-1:-1:-1;;;;;54601:17:0;;::::2;;::::0;;;::::2;::::0;;::::2;::::0;;;::::2;;::::0;;::::2;;::::0;;-1:-1:-1;54644:8:0::2;::::0;54675:19:::2;::::0;54629:66:::2;::::0;-1:-1:-1;;;54629:66:0;;54663:10:::2;54629:66;::::0;::::2;12346:51:1::0;12413:18;;;12406:34;;;;-1:-1:-1;;;;;54644:8:0;;::::2;::::0;54629:33:::2;::::0;12319:18:1;;54629:66:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;54706:38;54712:10;54724:13;:16;;;-1:-1:-1::0;;;;;54706:38:0::2;54742:1;54706:5;:38::i;:::-;54773:12:::0;;54755:38:::2;::::0;;::::2;::::0;::::2;::::0;;;54773:12:::2;54755:38:::0;;::::2;::::0;54761:10:::2;::::0;-1:-1:-1;;;;;54773:12:0;;::::2;::::0;;;54755:5:::2;:38::i;:::-;54840:15:::0;;54811:45:::2;::::0;-1:-1:-1;;;54840:15:0;;::::2;-1:-1:-1::0;;;;;54840:15:0::2;24183:50:1::0;;54828:10:0::2;::::0;54811:45:::2;::::0;24171:2:1;24156:18;54811:45:0::2;;;;;;;-1:-1:-1::0;;4702:1:0;5656:7;:22;-1:-1:-1;;53475:1389:0:o;54872:243::-;50459:5;;-1:-1:-1;;;;;50459:5:0;50445:10;:19;50423:95;;;;-1:-1:-1;;;50423:95:0;;;;;;;:::i;:::-;54935:28:::1;54966:13:::0;;;:6:::1;:13;::::0;;;;;;;55008:16;;54990:62;;;;::::1;::::0;;;;;;::::1;::::0;54996:10:::1;::::0;-1:-1:-1;;;;;55008:16:0;;::::1;::::0;-1:-1:-1;;;55026:21:0;;::::1;;::::0;54990:5:::1;:62::i;:::-;55086:21:::0;;-1:-1:-1;;;;;;;;55086:21:0;::::1;::::0;::::1;::::0;:13;;55063:19:::1;::::0;:44:::1;::::0;55086:21;;-1:-1:-1;;;55063:44:0;::::1;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;55063:44:0::1;;;;;-1:-1:-1::0;;;;;55063:44:0::1;;;;;;54924:191;54872:243:::0;:::o;52075:136::-;50459:5;;-1:-1:-1;;;;;50459:5:0;50445:10;:19;50423:95;;;;-1:-1:-1;;;50423:95:0;;;;;;;:::i;:::-;52171:19:::1;::::0;;;:14:::1;:19;::::0;;;;;;;:32;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;52075:136:::0;;:::o;35017:401::-;-1:-1:-1;;;;;35225:20:0;;8576:10;35225:20;;:60;;-1:-1:-1;35249:36:0;35266:4;8576:10;34777:168;:::i;35249:36::-;35203:151;;;;-1:-1:-1;;;35203:151:0;;15807:2:1;35203:151:0;;;15789:21:1;15846:2;15826:18;;;15819:30;15885:34;15865:18;;;15858:62;-1:-1:-1;;;15936:18:1;;;15929:39;15985:19;;35203:151:0;15605:405:1;35203:151:0;35365:45;35383:4;35389:2;35393;35397:6;35405:4;35365:17;:45::i;52573:894::-;4746:1;5344:7;;:19;;5336:63;;;;-1:-1:-1;;;5336:63:0;;23087:2:1;5336:63:0;;;23069:21:1;23126:2;23106:18;;;23099:30;23165:33;23145:18;;;23138:61;23216:18;;5336:63:0;22885:355:1;5336:63:0;4746:1;5477:7;:18;50762:6:::1;::::0;::::1;::::0;::::1;;;50740:84;;;::::0;-1:-1:-1;;;50740:84:0;;18455:2:1;50740:84:0::1;::::0;::::1;18437:21:1::0;18494:2;18474:18;;;18467:30;18533;18513:18;;;18506:58;18581:18;;50740:84:0::1;18253:352:1::0;50740:84:0::1;52670:15:::0;52642:43;;::::2;::::0;;::::2;::::0;;52670:15;52642:43;-1:-1:-1;;;;;52642:43:0;;::::2;::::0;;-1:-1:-1;;;52642:43:0;;::::2;::::0;::::2;52670:15;52642:43:::0;;::::2;::::0;;;;-1:-1:-1;;;52642:43:0;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;52642:43:0;;;::::2;::::0;::::2;::::0;;;;;;;;52696:41;;;;::::2;::::0;;52723:14;52696:41;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;;;;;;::::2;::::0;::::2;::::0;;;;;;;-1:-1:-1;;;52642:25:0::2;52779:17:::0;52670:6:::2;52779:17:::0;;52851:14;;52642:43;;52696:41;;52779:17;;52829:37:::2;::::0;52839:10:::2;::::0;52829:37:::2;:9;:37::i;:::-;52807:117;;;::::0;-1:-1:-1;;;52807:117:0;;15452:2:1;52807:117:0::2;::::0;::::2;15434:21:1::0;15491:2;15471:18;;;15464:30;15530:28;15510:18;;;15503:56;15576:18;;52807:117:0::2;15250:350:1::0;52807:117:0::2;52957:36;52967:10;52979;:13;;;-1:-1:-1::0;;;;;52957:36:0::2;:9;:36::i;:::-;52935:115;;;::::0;-1:-1:-1;;;52935:115:0;;17748:2:1;52935:115:0::2;::::0;::::2;17730:21:1::0;17787:2;17767:18;;;17760:30;17826:27;17806:18;;;17799:55;17871:18;;52935:115:0::2;17546:349:1::0;52935:115:0::2;53061:19:::0;;-1:-1:-1;;;;;;;;53136:23:0;::::2;::::0;::::2;-1:-1:-1::0;;;53113:19:0;;::::2;;:46;;53091:126;;;::::0;-1:-1:-1;;;53091:126:0;;19980:2:1;53091:126:0::2;::::0;::::2;19962:21:1::0;20019:2;19999:18;;;19992:30;20058:32;20038:18;;;20031:60;20108:18;;53091:126:0::2;19778:354:1::0;53091:126:0::2;53228:35;53234:10;53246;:13;;;-1:-1:-1::0;;;;;53228:35:0::2;53261:1;53228:5;:35::i;:::-;53274:36;53280:10;53292:11;:14;;;-1:-1:-1::0;;;;;53274:36:0::2;53308:1;53274:5;:36::i;:::-;53321:21:::0;;-1:-1:-1;;;53321:21:0;::::2;-1:-1:-1::0;;;;;53321:21:0::2;::::0;:19:::2;:21;::::0;::::2;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;53321:21:0::2;;;;;-1:-1:-1::0;;;;;53321:21:0::2;;;;;;;53353:42;53359:10;53371:13;:16;;;;;;;;;;-1:-1:-1::0;;;;;53371:16:0::2;-1:-1:-1::0;;;;;53353:42:0::2;53389:1;53353:42;;;;;;;;;;;::::0;:5:::2;:42::i;:::-;53439:19:::0;;53413:46:::2;::::0;-1:-1:-1;;;53439:19:0;;::::2;-1:-1:-1::0;;;;;53439:19:0::2;24183:50:1::0;;53427:10:0::2;::::0;53413:46:::2;::::0;24171:2:1;24156:18;53413:46:0::2;;;;;;;-1:-1:-1::0;;4702:1:0;5656:7;:22;-1:-1:-1;52573:894:0:o;6058:723::-;6114:13;6335:10;6331:53;;-1:-1:-1;;6362:10:0;;;;;;;;;;;;-1:-1:-1;;;6362:10:0;;;;;6058:723::o;6331:53::-;6409:5;6394:12;6450:78;6457:9;;6450:78;;6483:8;;;;:::i;:::-;;-1:-1:-1;6506:10:0;;-1:-1:-1;6514:2:0;6506:10;;:::i;:::-;;;6450:78;;;6538:19;6570:6;-1:-1:-1;;;;;6560:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6560:17:0;;6538:39;;6588:154;6595:10;;6588:154;;6622:11;6632:1;6622:11;;:::i;:::-;;-1:-1:-1;6691:10:0;6699:2;6691:5;:10;:::i;:::-;6678:24;;:2;:24;:::i;:::-;6665:39;;6648:6;6655;6648:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6648:56:0;;;;;;;;-1:-1:-1;6719:11:0;6728:2;6719:11;;:::i;:::-;;;6588:154;;;6766:6;6058:723;-1:-1:-1;;;;6058:723:0:o;37733:1146::-;37960:7;:14;37946:3;:10;:28;37938:81;;;;-1:-1:-1;;;37938:81:0;;22276:2:1;37938:81:0;;;22258:21:1;22315:2;22295:18;;;22288:30;22354:34;22334:18;;;22327:62;-1:-1:-1;;;22405:18:1;;;22398:38;22453:19;;37938:81:0;22074:404:1;37938:81:0;-1:-1:-1;;;;;38038:16:0;;38030:66;;;;-1:-1:-1;;;38030:66:0;;;;;;;:::i;:::-;8576:10;38109:16;38226:421;38250:3;:10;38246:1;:14;38226:421;;;38282:10;38295:3;38299:1;38295:6;;;;;;;;:::i;:::-;;;;;;;38282:19;;38316:14;38333:7;38341:1;38333:10;;;;;;;;:::i;:::-;;;;;;;;;;;;38360:19;38382:13;;;;;;;;;;-1:-1:-1;;;;;38382:19:0;;;;;;;;;;;;38333:10;;-1:-1:-1;38424:21:0;;;;38416:76;;;;-1:-1:-1;;;38416:76:0;;;;;;;:::i;:::-;38536:9;:13;;;;;;;;;;;-1:-1:-1;;;;;38536:19:0;;;;;;;;;;38558:20;;;38536:42;;38608:17;;;;;;;:27;;38558:20;;38536:9;38608:27;;38558:20;;38608:27;:::i;:::-;;;;;;;;38267:380;;;38262:3;;;;:::i;:::-;;;38226:421;;;;38694:2;-1:-1:-1;;;;;38664:47:0;38688:4;-1:-1:-1;;;;;38664:47:0;38678:8;-1:-1:-1;;;;;38664:47:0;;38698:3;38703:7;38664:47;;;;;;;:::i;:::-;;;;;;;;38796:75;38832:8;38842:4;38848:2;38852:3;38857:7;38866:4;38796:35;:75::i;44467:331::-;44622:8;-1:-1:-1;;;;;44613:17:0;:5;-1:-1:-1;;;;;44613:17:0;;;44605:71;;;;-1:-1:-1;;;44605:71:0;;21456:2:1;44605:71:0;;;21438:21:1;21495:2;21475:18;;;21468:30;21534:34;21514:18;;;21507:62;-1:-1:-1;;;21585:18:1;;;21578:39;21634:19;;44605:71:0;21254:405:1;44605:71:0;-1:-1:-1;;;;;44687:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;44687:46:0;;;;;;;;;;44749:41;;13327::1;;;44749::0;;13300:18:1;44749:41:0;;;;;;;44467:331;;;:::o;40197:729::-;-1:-1:-1;;;;;40350:16:0;;40342:62;;;;-1:-1:-1;;;40342:62:0;;22685:2:1;40342:62:0;;;22667:21:1;22724:2;22704:18;;;22697:30;22763:34;22743:18;;;22736:62;-1:-1:-1;;;22814:18:1;;;22807:31;22855:19;;40342:62:0;22483:397:1;40342:62:0;8576:10;40417:16;40482:21;40500:2;40482:17;:21::i;:::-;40459:44;;40514:24;40541:25;40559:6;40541:17;:25::i;:::-;40514:52;;40658:9;:13;;;;;;;;;;;-1:-1:-1;;;;;40658:17:0;;;;;;;;;:27;;40679:6;;40658:9;:27;;40679:6;;40658:27;:::i;:::-;;;;-1:-1:-1;;40701:52:0;;;23959:25:1;;;24015:2;24000:18;;23993:34;;;-1:-1:-1;;;;;40701:52:0;;;;40734:1;;40701:52;;;;;;23932:18:1;40701:52:0;;;;;;;40844:74;40875:8;40893:1;40897:2;40901;40905:6;40913:4;40844:30;:74::i;:::-;40331:595;;;40197:729;;;;:::o;42345:808::-;-1:-1:-1;;;;;42472:18:0;;42464:66;;;;-1:-1:-1;;;42464:66:0;;19165:2:1;42464:66:0;;;19147:21:1;19204:2;19184:18;;;19177:30;19243:34;19223:18;;;19216:62;-1:-1:-1;;;19294:18:1;;;19287:33;19337:19;;42464:66:0;18963:399:1;42464:66:0;8576:10;42543:16;42608:21;42626:2;42608:17;:21::i;:::-;42585:44;;42640:24;42667:25;42685:6;42667:17;:25::i;:::-;42705:66;;;;;;;;;-1:-1:-1;42705:66:0;;;;42806:13;;;;;;;;;-1:-1:-1;;;;;42806:19:0;;;;;;;;42640:52;;-1:-1:-1;42844:21:0;;;;42836:70;;;;-1:-1:-1;;;42836:70:0;;15047:2:1;42836:70:0;;;15029:21:1;15086:2;15066:18;;;15059:30;15125:34;15105:18;;;15098:62;-1:-1:-1;;;15176:18:1;;;15169:34;15220:19;;42836:70:0;14845:400:1;42836:70:0;42942:9;:13;;;;;;;;;;;-1:-1:-1;;;;;42942:19:0;;;;;;;;;;;;42964:20;;;42942:42;;43013:54;;23959:25:1;;;24000:18;;;23993:34;;;42942:19:0;;43013:54;;;;;;23932:18:1;43013:54:0;;;;;;;43080:65;;;;;;;;;43124:1;43080:65;;;55123:573;36401:974;-1:-1:-1;;;;;36589:16:0;;36581:66;;;;-1:-1:-1;;;36581:66:0;;;;;;;:::i;:::-;8576:10;36660:16;36725:21;36743:2;36725:17;:21::i;:::-;36702:44;;36757:24;36784:25;36802:6;36784:17;:25::i;:::-;36757:52;;36895:19;36917:13;;;;;;;;;;;-1:-1:-1;;;;;36917:19:0;;;;;;;;;;36955:21;;;;36947:76;;;;-1:-1:-1;;;36947:76:0;;;;;;;:::i;:::-;37059:9;:13;;;;;;;;;;;-1:-1:-1;;;;;37059:19:0;;;;;;;;;;37081:20;;;37059:42;;37123:17;;;;;;;:27;;37081:20;;37059:9;37123:27;;37081:20;;37123:27;:::i;:::-;;;;-1:-1:-1;;37168:46:0;;;23959:25:1;;;24015:2;24000:18;;23993:34;;;-1:-1:-1;;;;;37168:46:0;;;;;;;;;;;;;;23932:18:1;37168:46:0;;;;;;;37299:68;37330:8;37340:4;37346:2;37350;37354:6;37362:4;37299:30;:68::i;:::-;36570:805;;;;36401:974;;;;;:::o;47910:813::-;-1:-1:-1;;;;;48150:13:0;;10238:19;:23;48146:570;;48186:79;;-1:-1:-1;;;48186:79:0;;-1:-1:-1;;;;;48186:43:0;;;;;:79;;48230:8;;48240:4;;48246:3;;48251:7;;48260:4;;48186:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48186:79:0;;;;;;;;-1:-1:-1;;48186:79:0;;;;;;;;;;;;:::i;:::-;;;48182:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;48578:6;48571:14;;-1:-1:-1;;;48571:14:0;;;;;;;;:::i;48182:523::-;;;48627:62;;-1:-1:-1;;;48627:62:0;;13805:2:1;48627:62:0;;;13787:21:1;13844:2;13824:18;;;13817:30;13883:34;13863:18;;;13856:62;-1:-1:-1;;;13934:18:1;;;13927:50;13994:19;;48627:62:0;13603:416:1;48182:523:0;-1:-1:-1;;;;;;48347:60:0;;-1:-1:-1;;;48347:60:0;48343:159;;48432:50;;-1:-1:-1;;;48432:50:0;;;;;;;:::i;48731:198::-;48851:16;;;48865:1;48851:16;;;;;;;;;48797;;48826:22;;48851:16;;;;;;;;;;;;-1:-1:-1;48851:16:0;48826:41;;48889:7;48878:5;48884:1;48878:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;48916:5;48731:198;-1:-1:-1;;48731:198:0:o;47158:744::-;-1:-1:-1;;;;;47373:13:0;;10238:19;:23;47369:526;;47409:72;;-1:-1:-1;;;47409:72:0;;-1:-1:-1;;;;;47409:38:0;;;;;:72;;47448:8;;47458:4;;47464:2;;47468:6;;47476:4;;47409:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47409:72:0;;;;;;;;-1:-1:-1;;47409:72:0;;;;;;;;;;;;:::i;:::-;;;47405:479;;;;:::i;:::-;-1:-1:-1;;;;;;47531:55:0;;-1:-1:-1;;;47531:55:0;47527:154;;47611:50;;-1:-1:-1;;;47611:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:741::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;402:43;442:2;402:43;:::i;:::-;474:2;468:9;486:31;514:2;506:6;486:31;:::i;:::-;552:18;;;586:15;;;;-1:-1:-1;621:15:1;;;671:1;667:10;;;655:23;;651:32;;648:41;-1:-1:-1;645:61:1;;;702:1;699;692:12;645:61;724:1;734:169;748:2;745:1;742:9;734:169;;;805:23;824:3;805:23;:::i;:::-;793:36;;849:12;;;;881;;;;766:1;759:9;734:169;;;-1:-1:-1;921:6:1;;192:741;-1:-1:-1;;;;;;;192:741:1:o;938:735::-;992:5;1045:3;1038:4;1030:6;1026:17;1022:27;1012:55;;1063:1;1060;1053:12;1012:55;1099:6;1086:20;1125:4;1148:43;1188:2;1148:43;:::i;:::-;1220:2;1214:9;1232:31;1260:2;1252:6;1232:31;:::i;:::-;1298:18;;;1332:15;;;;-1:-1:-1;1367:15:1;;;1417:1;1413:10;;;1401:23;;1397:32;;1394:41;-1:-1:-1;1391:61:1;;;1448:1;1445;1438:12;1391:61;1470:1;1480:163;1494:2;1491:1;1488:9;1480:163;;;1551:17;;1539:30;;1589:12;;;;1621;;;;1512:1;1505:9;1480:163;;1678:555;1720:5;1773:3;1766:4;1758:6;1754:17;1750:27;1740:55;;1791:1;1788;1781:12;1740:55;1827:6;1814:20;-1:-1:-1;;;;;1849:2:1;1846:26;1843:52;;;1875:18;;:::i;:::-;1924:2;1918:9;1936:67;1991:2;1972:13;;-1:-1:-1;;1968:27:1;1997:4;1964:38;1918:9;1936:67;:::i;:::-;2027:2;2019:6;2012:18;2073:3;2066:4;2061:2;2053:6;2049:15;2045:26;2042:35;2039:55;;;2090:1;2087;2080:12;2039:55;2154:2;2147:4;2139:6;2135:17;2128:4;2120:6;2116:17;2103:54;2201:1;2177:15;;;2194:4;2173:26;2166:37;;;;2181:6;1678:555;-1:-1:-1;;;1678:555:1:o;2238:186::-;2297:6;2350:2;2338:9;2329:7;2325:23;2321:32;2318:52;;;2366:1;2363;2356:12;2318:52;2389:29;2408:9;2389:29;:::i;:::-;2379:39;2238:186;-1:-1:-1;;;2238:186:1:o;2429:260::-;2497:6;2505;2558:2;2546:9;2537:7;2533:23;2529:32;2526:52;;;2574:1;2571;2564:12;2526:52;2597:29;2616:9;2597:29;:::i;:::-;2587:39;;2645:38;2679:2;2668:9;2664:18;2645:38;:::i;:::-;2635:48;;2429:260;;;;;:::o;2694:943::-;2848:6;2856;2864;2872;2880;2933:3;2921:9;2912:7;2908:23;2904:33;2901:53;;;2950:1;2947;2940:12;2901:53;2973:29;2992:9;2973:29;:::i;:::-;2963:39;;3021:38;3055:2;3044:9;3040:18;3021:38;:::i;:::-;3011:48;;3110:2;3099:9;3095:18;3082:32;-1:-1:-1;;;;;3174:2:1;3166:6;3163:14;3160:34;;;3190:1;3187;3180:12;3160:34;3213:61;3266:7;3257:6;3246:9;3242:22;3213:61;:::i;:::-;3203:71;;3327:2;3316:9;3312:18;3299:32;3283:48;;3356:2;3346:8;3343:16;3340:36;;;3372:1;3369;3362:12;3340:36;3395:63;3450:7;3439:8;3428:9;3424:24;3395:63;:::i;:::-;3385:73;;3511:3;3500:9;3496:19;3483:33;3467:49;;3541:2;3531:8;3528:16;3525:36;;;3557:1;3554;3547:12;3525:36;;3580:51;3623:7;3612:8;3601:9;3597:24;3580:51;:::i;:::-;3570:61;;;2694:943;;;;;;;;:::o;3642:606::-;3746:6;3754;3762;3770;3778;3831:3;3819:9;3810:7;3806:23;3802:33;3799:53;;;3848:1;3845;3838:12;3799:53;3871:29;3890:9;3871:29;:::i;:::-;3861:39;;3919:38;3953:2;3942:9;3938:18;3919:38;:::i;:::-;3909:48;;4004:2;3993:9;3989:18;3976:32;3966:42;;4055:2;4044:9;4040:18;4027:32;4017:42;;4110:3;4099:9;4095:19;4082:33;-1:-1:-1;;;;;4130:6:1;4127:30;4124:50;;;4170:1;4167;4160:12;4124:50;4193:49;4234:7;4225:6;4214:9;4210:22;4193:49;:::i;4253:347::-;4318:6;4326;4379:2;4367:9;4358:7;4354:23;4350:32;4347:52;;;4395:1;4392;4385:12;4347:52;4418:29;4437:9;4418:29;:::i;:::-;4408:39;;4497:2;4486:9;4482:18;4469:32;4544:5;4537:13;4530:21;4523:5;4520:32;4510:60;;4566:1;4563;4556:12;4510:60;4589:5;4579:15;;;4253:347;;;;;:::o;4605:254::-;4673:6;4681;4734:2;4722:9;4713:7;4709:23;4705:32;4702:52;;;4750:1;4747;4740:12;4702:52;4773:29;4792:9;4773:29;:::i;:::-;4763:39;4849:2;4834:18;;;;4821:32;;-1:-1:-1;;;4605:254:1:o;4864:595::-;4982:6;4990;5043:2;5031:9;5022:7;5018:23;5014:32;5011:52;;;5059:1;5056;5049:12;5011:52;5099:9;5086:23;-1:-1:-1;;;;;5169:2:1;5161:6;5158:14;5155:34;;;5185:1;5182;5175:12;5155:34;5208:61;5261:7;5252:6;5241:9;5237:22;5208:61;:::i;:::-;5198:71;;5322:2;5311:9;5307:18;5294:32;5278:48;;5351:2;5341:8;5338:16;5335:36;;;5367:1;5364;5357:12;5335:36;;5390:63;5445:7;5434:8;5423:9;5419:24;5390:63;:::i;:::-;5380:73;;;4864:595;;;;;:::o;5464:416::-;5557:6;5565;5618:2;5606:9;5597:7;5593:23;5589:32;5586:52;;;5634:1;5631;5624:12;5586:52;5674:9;5661:23;-1:-1:-1;;;;;5699:6:1;5696:30;5693:50;;;5739:1;5736;5729:12;5693:50;5762:61;5815:7;5806:6;5795:9;5791:22;5762:61;:::i;:::-;5752:71;5870:2;5855:18;;;;5842:32;;-1:-1:-1;;;;5464:416:1:o;5885:1081::-;5979:6;6010:2;6053;6041:9;6032:7;6028:23;6024:32;6021:52;;;6069:1;6066;6059:12;6021:52;6102:9;6096:16;-1:-1:-1;;;;;6127:6:1;6124:30;6121:50;;;6167:1;6164;6157:12;6121:50;6190:22;;6243:4;6235:13;;6231:27;-1:-1:-1;6221:55:1;;6272:1;6269;6262:12;6221:55;6301:2;6295:9;6323:43;6363:2;6323:43;:::i;:::-;6395:2;6389:9;6407:31;6435:2;6427:6;6407:31;:::i;:::-;6473:18;;;6507:15;;;;-1:-1:-1;6542:11:1;;;6584:1;6580:10;;;6572:19;;6568:28;;6565:41;-1:-1:-1;6562:61:1;;;6619:1;6616;6609:12;6562:61;6641:1;6632:10;;6662:1;6672:263;6688:2;6683:3;6680:11;6672:263;;;6756:3;6750:10;6804:6;6797:5;6793:18;6786:5;6783:29;6773:57;;6826:1;6823;6816:12;6773:57;6843:18;;6881:12;;;;6913;;;;6710:1;6701:11;6672:263;;;-1:-1:-1;6954:6:1;;5885:1081;-1:-1:-1;;;;;;;;5885:1081:1:o;6971:180::-;7030:6;7083:2;7071:9;7062:7;7058:23;7054:32;7051:52;;;7099:1;7096;7089:12;7051:52;-1:-1:-1;7122:23:1;;6971:180;-1:-1:-1;6971:180:1:o;7156:245::-;7214:6;7267:2;7255:9;7246:7;7242:23;7238:32;7235:52;;;7283:1;7280;7273:12;7235:52;7322:9;7309:23;7341:30;7365:5;7341:30;:::i;7406:249::-;7475:6;7528:2;7516:9;7507:7;7503:23;7499:32;7496:52;;;7544:1;7541;7534:12;7496:52;7576:9;7570:16;7595:30;7619:5;7595:30;:::i;7845:184::-;7915:6;7968:2;7956:9;7947:7;7943:23;7939:32;7936:52;;;7984:1;7981;7974:12;7936:52;-1:-1:-1;8007:16:1;;7845:184;-1:-1:-1;7845:184:1:o;8034:248::-;8102:6;8110;8163:2;8151:9;8142:7;8138:23;8134:32;8131:52;;;8179:1;8176;8169:12;8131:52;-1:-1:-1;;8202:23:1;;;8272:2;8257:18;;;8244:32;;-1:-1:-1;8034:248:1:o;8287:435::-;8340:3;8378:5;8372:12;8405:6;8400:3;8393:19;8431:4;8460:2;8455:3;8451:12;8444:19;;8497:2;8490:5;8486:14;8518:1;8528:169;8542:6;8539:1;8536:13;8528:169;;;8603:13;;8591:26;;8637:12;;;;8672:15;;;;8564:1;8557:9;8528:169;;;-1:-1:-1;8713:3:1;;8287:435;-1:-1:-1;;;;;8287:435:1:o;8727:257::-;8768:3;8806:5;8800:12;8833:6;8828:3;8821:19;8849:63;8905:6;8898:4;8893:3;8889:14;8882:4;8875:5;8871:16;8849:63;:::i;:::-;8966:2;8945:15;-1:-1:-1;;8941:29:1;8932:39;;;;8973:4;8928:50;;8727:257;-1:-1:-1;;8727:257:1:o;8989:716::-;9352:34;9347:3;9340:47;9417:34;9412:2;9407:3;9403:12;9396:56;-1:-1:-1;;;9477:2:1;9472:3;9468:12;9461:34;9322:3;9524:6;9518:13;9540:60;9593:6;9588:2;9583:3;9579:12;9574:2;9566:6;9562:15;9540:60;:::i;:::-;-1:-1:-1;;;9659:2:1;9619:16;;;;9651:11;;;9644:28;-1:-1:-1;9696:2:1;9688:11;;8989:716;-1:-1:-1;8989:716:1:o;9918:826::-;-1:-1:-1;;;;;10315:15:1;;;10297:34;;10367:15;;10362:2;10347:18;;10340:43;10277:3;10414:2;10399:18;;10392:31;;;10240:4;;10446:57;;10483:19;;10475:6;10446:57;:::i;:::-;10551:9;10543:6;10539:22;10534:2;10523:9;10519:18;10512:50;10585:44;10622:6;10614;10585:44;:::i;:::-;10571:58;;10678:9;10670:6;10666:22;10660:3;10649:9;10645:19;10638:51;10706:32;10731:6;10723;10706:32;:::i;:::-;10698:40;9918:826;-1:-1:-1;;;;;;;;9918:826:1:o;10749:560::-;-1:-1:-1;;;;;11046:15:1;;;11028:34;;11098:15;;11093:2;11078:18;;11071:43;11145:2;11130:18;;11123:34;;;11188:2;11173:18;;11166:34;;;11008:3;11231;11216:19;;11209:32;;;10971:4;;11258:45;;11283:19;;11275:6;11258:45;:::i;:::-;11250:53;10749:560;-1:-1:-1;;;;;;;10749:560:1:o;11314:424::-;-1:-1:-1;;;;;11544:32:1;;;;11526:51;;11613:2;11608;11593:18;;11586:30;;;11652:1;11632:18;;;11625:29;-1:-1:-1;;;11685:2:1;11670:18;;11663:33;11728:3;11713:19;;11314:424::o;11743:::-;-1:-1:-1;;;;;11973:32:1;;;;11955:51;;12042:2;12037;12022:18;;12015:30;;;12081:1;12061:18;;;12054:29;-1:-1:-1;;;12114:2:1;12099:18;;12092:33;12157:3;12142:19;;11743:424::o;12451:261::-;12630:2;12619:9;12612:21;12593:4;12650:56;12702:2;12691:9;12687:18;12679:6;12650:56;:::i;12717:465::-;12974:2;12963:9;12956:21;12937:4;13000:56;13052:2;13041:9;13037:18;13029:6;13000:56;:::i;:::-;13104:9;13096:6;13092:22;13087:2;13076:9;13072:18;13065:50;13132:44;13169:6;13161;13132:44;:::i;:::-;13124:52;12717:465;-1:-1:-1;;;;;12717:465:1:o;13379:219::-;13528:2;13517:9;13510:21;13491:4;13548:44;13588:2;13577:9;13573:18;13565:6;13548:44;:::i;14024:404::-;14226:2;14208:21;;;14265:2;14245:18;;;14238:30;14304:34;14299:2;14284:18;;14277:62;-1:-1:-1;;;14370:2:1;14355:18;;14348:38;14418:3;14403:19;;14024:404::o;16366:350::-;16568:2;16550:21;;;16607:2;16587:18;;;16580:30;16646:28;16641:2;16626:18;;16619:56;16707:2;16692:18;;16366:350::o;16721:401::-;16923:2;16905:21;;;16962:2;16942:18;;;16935:30;17001:34;16996:2;16981:18;;16974:62;-1:-1:-1;;;17067:2:1;17052:18;;17045:35;17112:3;17097:19;;16721:401::o;19367:406::-;19569:2;19551:21;;;19608:2;19588:18;;;19581:30;19647:34;19642:2;19627:18;;19620:62;-1:-1:-1;;;19713:2:1;19698:18;;19691:40;19763:3;19748:19;;19367:406::o;24910:183::-;24970:4;-1:-1:-1;;;;;24995:6:1;24992:30;24989:56;;;25025:18;;:::i;:::-;-1:-1:-1;25070:1:1;25066:14;25082:4;25062:25;;24910:183::o;25098:128::-;25138:3;25169:1;25165:6;25162:1;25159:13;25156:39;;;25175:18;;:::i;:::-;-1:-1:-1;25211:9:1;;25098:128::o;25231:236::-;25270:3;-1:-1:-1;;;;;25343:2:1;25340:1;25336:10;25373:2;25370:1;25366:10;25404:3;25400:2;25396:12;25391:3;25388:21;25385:47;;;25412:18;;:::i;:::-;25448:13;;25231:236;-1:-1:-1;;;;25231:236:1:o;25472:120::-;25512:1;25538;25528:35;;25543:18;;:::i;:::-;-1:-1:-1;25577:9:1;;25472:120::o;25597:125::-;25637:4;25665:1;25662;25659:8;25656:34;;;25670:18;;:::i;:::-;-1:-1:-1;25707:9:1;;25597:125::o;25727:258::-;25799:1;25809:113;25823:6;25820:1;25817:13;25809:113;;;25899:11;;;25893:18;25880:11;;;25873:39;25845:2;25838:10;25809:113;;;25940:6;25937:1;25934:13;25931:48;;;25975:1;25966:6;25961:3;25957:16;25950:27;25931:48;;25727:258;;;:::o;25990:249::-;26100:2;26081:13;;-1:-1:-1;;26077:27:1;26065:40;;-1:-1:-1;;;;;26120:34:1;;26156:22;;;26117:62;26114:88;;;26182:18;;:::i;:::-;26218:2;26211:22;-1:-1:-1;;25990:249:1:o;26244:135::-;26283:3;-1:-1:-1;;26304:17:1;;26301:43;;;26324:18;;:::i;:::-;-1:-1:-1;26371:1:1;26360:13;;26244:135::o;26384:209::-;26422:3;-1:-1:-1;;;;;26503:2:1;26496:5;26492:14;26530:2;26521:7;26518:15;26515:41;;;26536:18;;:::i;:::-;26585:1;26572:15;;26384:209;-1:-1:-1;;;26384:209:1:o;26598:112::-;26630:1;26656;26646:35;;26661:18;;:::i;:::-;-1:-1:-1;26695:9:1;;26598:112::o;26715:127::-;26776:10;26771:3;26767:20;26764:1;26757:31;26807:4;26804:1;26797:15;26831:4;26828:1;26821:15;26847:127;26908:10;26903:3;26899:20;26896:1;26889:31;26939:4;26936:1;26929:15;26963:4;26960:1;26953:15;26979:127;27040:10;27035:3;27031:20;27028:1;27021:31;27071:4;27068:1;27061:15;27095:4;27092:1;27085:15;27111:127;27172:10;27167:3;27163:20;27160:1;27153:31;27203:4;27200:1;27193:15;27227:4;27224:1;27217:15;27243:179;27278:3;27320:1;27302:16;27299:23;27296:120;;;27366:1;27363;27360;27345:23;-1:-1:-1;27403:1:1;27397:8;27392:3;27388:18;27296:120;27243:179;:::o;27427:671::-;27466:3;27508:4;27490:16;27487:26;27484:39;;;27427:671;:::o;27484:39::-;27550:2;27544:9;-1:-1:-1;;27615:16:1;27611:25;;27608:1;27544:9;27587:50;27666:4;27660:11;27690:16;-1:-1:-1;;;;;27796:2:1;27789:4;27781:6;27777:17;27774:25;27769:2;27761:6;27758:14;27755:45;27752:58;;;27803:5;;;;;27427:671;:::o;27752:58::-;27840:6;27834:4;27830:17;27819:28;;27876:3;27870:10;27903:2;27895:6;27892:14;27889:27;;;27909:5;;;;;;27427:671;:::o;27889:27::-;27993:2;27974:16;27968:4;27964:27;27960:36;27953:4;27944:6;27939:3;27935:16;27931:27;27928:69;27925:82;;;28000:5;;;;;;27427:671;:::o;27925:82::-;28016:57;28067:4;28058:6;28050;28046:19;28042:30;28036:4;28016:57;:::i;:::-;-1:-1:-1;28089:3:1;;27427:671;-1:-1:-1;;;;;27427:671:1:o;28103:131::-;-1:-1:-1;;;;;;28177:32:1;;28167:43;;28157:71;;28224:1;28221;28214:12;28157:71;28103:131;:::o

Swarm Source

ipfs://8368881364f4db34a7e5034bf9df920fa26bd9d479b13d67d939c63c590dc947
Loading