ETH Price: $2,444.23 (-1.03%)

Token

Smart Bananas (BANANA)
 

Overview

Max Total Supply

69 BANANA

Holders

41

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
twogunns.eth
Balance
2 BANANA
0x5ea7ed79fa91c48e95dcb8bc660634f3485b17b4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SmartBananas

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-21
*/

// File @openzeppelin/contracts/utils/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/access/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


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


pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


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


pragma solidity ^0.8.0;


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

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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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




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


pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


pragma solidity ^0.8.0;


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

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

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



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


pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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



// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

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

pragma solidity ^0.8.0;




/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);

    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    function grantRole(bytes32 role, address account) external;

    function revokeRole(bytes32 role, address account) external;

    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

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

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

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

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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


pragma solidity ^0.8.0;



/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable {
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {_setupRole} to track enumerable memberships
     */
    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
}

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


pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol


pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


pragma solidity ^0.8.0;



/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

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

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

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


pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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


pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File: @openzeppelin/contracts/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/Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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/token/ERC721/IERC721Receiver.sol


pragma solidity ^0.8.0;

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




// File: bananas.sol

/**
 * @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - token ID and URI autogeneration
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */

contract SmartBananas is Context, AccessControlEnumerable, ERC721Enumerable, ERC721URIStorage, Ownable{
  using Counters for Counters.Counter;
  Counters.Counter public _tokenIdTracker;

  string private _baseTokenURI;
  uint private _price;
  uint private _max;
  address private _admin;
  uint8 private _maxTxn;
  bool private mintable = false;
  bool private presale = false;

  mapping (uint256 => address) public creator;
  mapping (address => uint256) public whitelistAmtLeft;

  /**
    * @dev Grants `DEFAULT_ADMIN_ROLE` to the
    * account that deploys the contract.
    *
    * Token URIs will be autogenerated based on `baseURI` and their token IDs.
    * See {ERC721-tokenURI}.
    */
  constructor(string memory name, string memory symbol, string memory baseTokenURI, uint mintPrice, uint maxSupply, address admin, uint8 maxTxn) ERC721(name, symbol) {
      //name: Smart Bananas
      //symbol: BANANA
      _baseTokenURI = baseTokenURI;
      //https://bananameta.herokuapp.com/api/bananaMeta?index=
      _price = mintPrice;
      //55000000000000000
      _max = maxSupply;
      //2000
      _admin = admin;
      //0xaDDeB5Dbdc1c62c2a2a8E04fDdd42E3C3F19587b
	  _maxTxn = maxTxn;
      //4

      //_setupRole(DEFAULT_ADMIN_ROLE, admin);
  }

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

  function setBaseURI(string memory baseURI) external onlyOwner {
    //require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "SmartBananas: must have admin role to change base URI");
    _baseTokenURI = baseURI;
  }

  function setTokenURI(uint256 tokenId, string memory _tokenURI) external onlyOwner {
    //require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "SmartBananas: must have admin role to change token URI");
    _setTokenURI(tokenId, _tokenURI);
  }

  function setPrice(uint mintPrice) external onlyOwner {
    //require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "SmartBananas: must have admin role to change price");
    _price = mintPrice;
  }

  function price() public view returns (uint) {
    return _price;
  }
  
  function setMax(uint newMax) external onlyOwner {
    _max = newMax;
  }

  function max() public view returns (uint) {
    return _max;
  }

  function setAdmin(address newAdmin) external onlyOwner {
      _admin = newAdmin;
  }

  function mintBananaTo(uint8 _quantity, address receiver) public payable {
	require(mintable, "SmartBananas: minting is currently disabled");
	require(_quantity <= _maxTxn, "SmartBananas: you are trying to mint too many SmartBananas at once");
	require(_tokenIdTracker.current() + _quantity <= _max, "SmartBananas: all SmartBananas have been minted");
    require(msg.value >= _price * _quantity, "SmartBananas: must send correct price");
	
    
	for(uint i=0; i < _quantity; i++){
		_mint(receiver, _tokenIdTracker.current());
		creator[_tokenIdTracker.current()] = receiver;
		_tokenIdTracker.increment();
	}
	payable(_admin).transfer(msg.value);
  }

  function presaleMint(uint8 _quantity, address receiver) public payable {
	require(presale, "SmartBananas: presale has not started yet");
    require(whitelistAmtLeft[receiver] >= _quantity, 'SmartBananas: you are trying to mint too many SmartBananas for your presale allocation');
	require(_quantity <= _maxTxn, "SmartBananas: you are trying to mint too many SmartBananas at once");
	require(_tokenIdTracker.current() + _quantity <= 549, "SmartBananas: all SmartBananas have been minted");
    require(msg.value >= _price * _quantity, "SmartBananas: must send correct price");
	
    whitelistAmtLeft[receiver] -= _quantity;

	for(uint i=0; i < _quantity; i++){
		_mint(receiver, _tokenIdTracker.current());
		creator[_tokenIdTracker.current()] = receiver;
		_tokenIdTracker.increment();
	}
	payable(_admin).transfer(msg.value);
  }

  function teamMint(uint256 _quantity, address receiver) public onlyOwner {
	for(uint i=0; i < _quantity; i++){
		_mint(receiver, _tokenIdTracker.current());
		creator[_tokenIdTracker.current()] = msg.sender;
		_tokenIdTracker.increment();
	}
  }
  
  function whitelistAddresses (address[] memory users) public onlyOwner {
      for (uint i = 0; i < users.length; i++) {
          whitelistAmtLeft[users[i]] = 3;
      }
  }

  function mintingStatus(bool _mintOpen, bool _presaleOpen) public onlyOwner {
	mintable = _mintOpen;
    presale = _presaleOpen;
  }
  
  function minting() public view returns (bool) {
	return mintable;
  }

  function earlyMinting() public view returns (bool) {
	return presale;
  }
  
  function bananaCreator(uint256 tokenId) public view returns(address){
    return creator[tokenId];
  }

  function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721URIStorage) {
    return ERC721URIStorage._burn(tokenId);
  }

  function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
    return ERC721URIStorage.tokenURI(tokenId);
  }
  
  function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable) {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  /**
    * @dev See {IERC165-supportsInterface}.
    */
  function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC721, ERC721Enumerable) returns (bool) {
    return super.supportsInterface(interfaceId);
  }

  function withdrawEth() public onlyOwner {
    uint256 total = address(this).balance;
    require(payable(_admin).send(total));
  }
  
  receive() payable external {}

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI","type":"string"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint8","name":"maxTxn","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenIdTracker","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bananaCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantity","type":"uint8"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mintBananaTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintOpen","type":"bool"},{"internalType":"bool","name":"_presaleOpen","type":"bool"}],"name":"mintingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantity","type":"uint8"},{"internalType":"address","name":"receiver","type":"address"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"whitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAmtLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526012805461ffff60a81b191690553480156200001f57600080fd5b50604051620039bd380380620039bd8339810160408190526200004291620002b0565b8651879087906200005b90600290602085019062000148565b5080516200007190600390602084019062000148565b5050506200008e62000088620000f260201b60201c565b620000f6565b8451620000a390600f90602088019062000148565b50601093909355601191909155601280546001600160a01b0319166001600160a01b039092169190911760ff60a01b1916600160a01b60ff9093169290920291909117905550620003d8915050565b3390565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001569062000385565b90600052602060002090601f0160209004810192826200017a5760008555620001c5565b82601f106200019557805160ff1916838001178555620001c5565b82800160010185558215620001c5579182015b82811115620001c5578251825591602001919060010190620001a8565b50620001d3929150620001d7565b5090565b5b80821115620001d35760008155600101620001d8565b600082601f830112620001ff578081fd5b81516001600160401b03808211156200021c576200021c620003c2565b6040516020601f8401601f1916820181018381118382101715620002445762000244620003c2565b60405283825285840181018710156200025b578485fd5b8492505b838310156200027e57858301810151828401820152918201916200025f565b838311156200028f57848185840101525b5095945050505050565b805160ff81168114620002ab57600080fd5b919050565b600080600080600080600060e0888a031215620002cb578283fd5b87516001600160401b0380821115620002e2578485fd5b620002f08b838c01620001ee565b985060208a015191508082111562000306578485fd5b620003148b838c01620001ee565b975060408a01519150808211156200032a578485fd5b50620003398a828b01620001ee565b60608a015160808b015160a08c0151929850909650945090506001600160a01b038116811462000367578283fd5b91506200037760c0890162000299565b905092959891949750929550565b6002810460018216806200039a57607f821691505b60208210811415620003bc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6135d580620003e86000396000f3fe6080604052600436106102815760003560e01c8063784e7bea1161014f578063a07de775116100c1578063bfa457bc1161007a578063bfa457bc1461072e578063c87b56dd1461074e578063ca15c8731461076e578063d547741f1461078e578063e985e9c5146107ae578063f2fde38b146107ce57610288565b8063a07de7751461068f578063a0ef91df146106a4578063a217fddf146106b9578063a22cb465146106ce578063ac1f5ccd146106ee578063b88d4fde1461070e57610288565b80639010d07c116101135780639010d07c146105f057806391b7f5ed1461061057806391d148541461063057806395d89b411461065057806398bcede914610665578063a035b1fe1461067a57610288565b8063784e7bea146105735780637bd9e02f146105865780637c916fac146105a65780637dc2268c146105c65780638da5cb5b146105db57610288565b80632f2ff15d116101f357806355f804b3116101ac57806355f804b3146104c95780636352211e146104e95780636ac5db1914610509578063704b6c021461051e57806370a082311461053e578063715018a61461055e57610288565b80632f2ff15d146104095780632f745c591461042957806336568abe1461044957806342842e0e146104695780634f6ccce714610489578063510b5158146104a957610288565b8063162094c411610245578063162094c41461034757806318160ddd146103675780631fe9eabc1461038957806323b872dd146103a9578063248a9ca3146103c95780632bf04304146103e957610288565b806301ffc9a71461028d57806306fdde03146102c3578063081812fc146102e5578063095ea7b3146103125780630f7ad5781461033457610288565b3661028857005b600080fd5b34801561029957600080fd5b506102ad6102a83660046129c8565b6107ee565b6040516102ba9190612bbb565b60405180910390f35b3480156102cf57600080fd5b506102d8610801565b6040516102ba9190612bcf565b3480156102f157600080fd5b5061030561030036600461296d565b610893565b6040516102ba9190612b6a565b34801561031e57600080fd5b5061033261032d36600461287b565b6108df565b005b610332610342366004612a78565b610977565b34801561035357600080fd5b50610332610362366004612a33565b610b5d565b34801561037357600080fd5b5061037c610baa565b6040516102ba9190612bc6565b34801561039557600080fd5b506103326103a436600461296d565b610bb0565b3480156103b557600080fd5b506103326103c436600461279e565b610bf4565b3480156103d557600080fd5b5061037c6103e436600461296d565b610c2c565b3480156103f557600080fd5b506103326104043660046128a4565b610c41565b34801561041557600080fd5b50610332610424366004612985565b610cf1565b34801561043557600080fd5b5061037c61044436600461287b565b610d13565b34801561045557600080fd5b50610332610464366004612985565b610d68565b34801561047557600080fd5b5061033261048436600461279e565b610d8a565b34801561049557600080fd5b5061037c6104a436600461296d565b610da5565b3480156104b557600080fd5b506103056104c436600461296d565b610e00565b3480156104d557600080fd5b506103326104e4366004612a00565b610e1b565b3480156104f557600080fd5b5061030561050436600461296d565b610e6d565b34801561051557600080fd5b5061037c610ea2565b34801561052a57600080fd5b50610332610539366004612752565b610ea8565b34801561054a57600080fd5b5061037c610559366004612752565b610f09565b34801561056a57600080fd5b50610332610f4d565b610332610581366004612a78565b610f98565b34801561059257600080fd5b506103326105a1366004612952565b6110d3565b3480156105b257600080fd5b5061037c6105c1366004612752565b611144565b3480156105d257600080fd5b506102ad611156565b3480156105e757600080fd5b50610305611166565b3480156105fc57600080fd5b5061030561060b3660046129a7565b611175565b34801561061c57600080fd5b5061033261062b36600461296d565b611194565b34801561063c57600080fd5b506102ad61064b366004612985565b6111d8565b34801561065c57600080fd5b506102d8611201565b34801561067157600080fd5b5061037c611210565b34801561068657600080fd5b5061037c611216565b34801561069b57600080fd5b506102ad61121c565b3480156106b057600080fd5b5061033261122c565b3480156106c557600080fd5b5061037c6112a0565b3480156106da57600080fd5b506103326106e9366004612852565b6112a5565b3480156106fa57600080fd5b5061030561070936600461296d565b611373565b34801561071a57600080fd5b506103326107293660046127d9565b61138e565b34801561073a57600080fd5b50610332610749366004612985565b6113cd565b34801561075a57600080fd5b506102d861076936600461296d565b611482565b34801561077a57600080fd5b5061037c61078936600461296d565b61148d565b34801561079a57600080fd5b506103326107a9366004612985565b6114a4565b3480156107ba57600080fd5b506102ad6107c936600461276c565b6114ae565b3480156107da57600080fd5b506103326107e9366004612752565b6114dc565b60006107f98261154a565b90505b919050565b606060028054610810906134dd565b80601f016020809104026020016040519081016040528092919081815260200182805461083c906134dd565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b5050505050905090565b600061089e8261156f565b6108c35760405162461bcd60e51b81526004016108ba9061314c565b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108ea82610e6d565b9050806001600160a01b0316836001600160a01b0316141561091e5760405162461bcd60e51b81526004016108ba906132e1565b806001600160a01b031661093061158c565b6001600160a01b0316148061094c575061094c816107c961158c565b6109685760405162461bcd60e51b81526004016108ba90612ef4565b6109728383611590565b505050565b601254600160b01b900460ff166109a05760405162461bcd60e51b81526004016108ba9061307d565b6001600160a01b03811660009081526014602052604090205460ff831611156109db5760405162461bcd60e51b81526004016108ba90613265565b60125460ff600160a01b90910481169083161115610a0b5760405162461bcd60e51b81526004016108ba90612c17565b6102258260ff16610a1c600e6115fe565b610a269190613438565b1115610a445760405162461bcd60e51b81526004016108ba90612ea5565b8160ff16601054610a559190613464565b341015610a745760405162461bcd60e51b81526004016108ba90612d99565b6001600160a01b0381166000908152601460205260408120805460ff85169290610a9f908490613483565b90915550600090505b8260ff16811015610b2357610ac682610ac1600e6115fe565b611602565b8160136000610ad5600e6115fe565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610b11600e6116e1565b80610b1b81613518565b915050610aa8565b506012546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610972573d6000803e3d6000fd5b610b6561158c565b6001600160a01b0316610b76611166565b6001600160a01b031614610b9c5760405162461bcd60e51b81526004016108ba90613198565b610ba682826116ea565b5050565b600a5490565b610bb861158c565b6001600160a01b0316610bc9611166565b6001600160a01b031614610bef5760405162461bcd60e51b81526004016108ba90613198565b601155565b610c05610bff61158c565b8261172e565b610c215760405162461bcd60e51b81526004016108ba90613322565b6109728383836117b3565b60009081526020819052604090206001015490565b610c4961158c565b6001600160a01b0316610c5a611166565b6001600160a01b031614610c805760405162461bcd60e51b81526004016108ba90613198565b60005b8151811015610ba657600360146000848481518110610cb257634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508080610ce990613518565b915050610c83565b610cfb82826118e0565b60008281526001602052604090206109729082611904565b6000610d1e83610f09565b8210610d3c5760405162461bcd60e51b81526004016108ba90612c7f565b506001600160a01b03821660009081526008602090815260408083208484529091529020545b92915050565b610d728282611919565b6000828152600160205260409020610972908261195b565b6109728383836040518060200160405280600081525061138e565b6000610daf610baa565b8210610dcd5760405162461bcd60e51b81526004016108ba90613373565b600a8281548110610dee57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6013602052600090815260409020546001600160a01b031681565b610e2361158c565b6001600160a01b0316610e34611166565b6001600160a01b031614610e5a5760405162461bcd60e51b81526004016108ba90613198565b8051610ba690600f90602084019061261b565b6000818152600460205260408120546001600160a01b0316806107f95760405162461bcd60e51b81526004016108ba90612f9b565b60115490565b610eb061158c565b6001600160a01b0316610ec1611166565b6001600160a01b031614610ee75760405162461bcd60e51b81526004016108ba90613198565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216610f315760405162461bcd60e51b81526004016108ba90612f51565b506001600160a01b031660009081526005602052604090205490565b610f5561158c565b6001600160a01b0316610f66611166565b6001600160a01b031614610f8c5760405162461bcd60e51b81526004016108ba90613198565b610f966000611970565b565b601254600160a81b900460ff16610fc15760405162461bcd60e51b81526004016108ba90613032565b60125460ff600160a01b90910481169083161115610ff15760405162461bcd60e51b81526004016108ba90612c17565b6011548260ff16611002600e6115fe565b61100c9190613438565b111561102a5760405162461bcd60e51b81526004016108ba90612ea5565b8160ff1660105461103b9190613464565b34101561105a5760405162461bcd60e51b81526004016108ba90612d99565b60005b8260ff16811015610b235761107682610ac1600e6115fe565b8160136000611085600e6115fe565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506110c1600e6116e1565b806110cb81613518565b91505061105d565b6110db61158c565b6001600160a01b03166110ec611166565b6001600160a01b0316146111125760405162461bcd60e51b81526004016108ba90613198565b60128054911515600160b01b0260ff60b01b19931515600160a81b0260ff60a81b199093169290921792909216179055565b60146020526000908152604090205481565b601254600160a81b900460ff1690565b600d546001600160a01b031690565b600082815260016020526040812061118d90836119c2565b9392505050565b61119c61158c565b6001600160a01b03166111ad611166565b6001600160a01b0316146111d35760405162461bcd60e51b81526004016108ba90613198565b601055565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b606060038054610810906134dd565b600e5481565b60105490565b601254600160b01b900460ff1690565b61123461158c565b6001600160a01b0316611245611166565b6001600160a01b03161461126b5760405162461bcd60e51b81526004016108ba90613198565b60125460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505061129d57600080fd5b50565b600081565b6112ad61158c565b6001600160a01b0316826001600160a01b031614156112de5760405162461bcd60e51b81526004016108ba90612e22565b80600760006112eb61158c565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561132f61158c565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113679190612bbb565b60405180910390a35050565b6000908152601360205260409020546001600160a01b031690565b61139f61139961158c565b8361172e565b6113bb5760405162461bcd60e51b81526004016108ba90613322565b6113c7848484846119ce565b50505050565b6113d561158c565b6001600160a01b03166113e6611166565b6001600160a01b03161461140c5760405162461bcd60e51b81526004016108ba90613198565b60005b828110156109725761142582610ac1600e6115fe565b3360136000611434600e6115fe565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611470600e6116e1565b8061147a81613518565b91505061140f565b60606107f982611a01565b60008181526001602052604081206107f990611b1a565b610d728282611b25565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6114e461158c565b6001600160a01b03166114f5611166565b6001600160a01b03161461151b5760405162461bcd60e51b81526004016108ba90613198565b6001600160a01b0381166115415760405162461bcd60e51b81526004016108ba90612d1c565b61129d81611970565b60006001600160e01b0319821663780e9d6360e01b14806107f957506107f982611b44565b6000908152600460205260409020546001600160a01b0316151590565b3390565b600081815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115c582610e6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5490565b6001600160a01b0382166116285760405162461bcd60e51b81526004016108ba906130c6565b6116318161156f565b1561164e5760405162461bcd60e51b81526004016108ba90612d62565b61165a60008383611b84565b6001600160a01b0382166000908152600560205260408120805460019290611683908490613438565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80546001019055565b6116f38261156f565b61170f5760405162461bcd60e51b81526004016108ba90612fe4565b6000828152600c6020908152604090912082516109729284019061261b565b60006117398261156f565b6117555760405162461bcd60e51b81526004016108ba90612e59565b600061176083610e6d565b9050806001600160a01b0316846001600160a01b0316148061179b5750836001600160a01b031661179084610893565b6001600160a01b0316145b806117ab57506117ab81856114ae565b949350505050565b826001600160a01b03166117c682610e6d565b6001600160a01b0316146117ec5760405162461bcd60e51b81526004016108ba906131cd565b6001600160a01b0382166118125760405162461bcd60e51b81526004016108ba90612dde565b61181d838383611b84565b611828600082611590565b6001600160a01b0383166000908152600560205260408120805460019290611851908490613483565b90915550506001600160a01b038216600090815260056020526040812080546001929061187f908490613438565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6118e982610c2c565b6118fa816118f561158c565b611b8f565b6109728383611bf3565b600061118d836001600160a01b038416611c78565b61192161158c565b6001600160a01b0316816001600160a01b0316146119515760405162461bcd60e51b81526004016108ba906133bf565b610ba68282611cc2565b600061118d836001600160a01b038416611d45565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061118d8383611e62565b6119d98484846117b3565b6119e584848484611e9a565b6113c75760405162461bcd60e51b81526004016108ba90612cca565b6060611a0c8261156f565b611a285760405162461bcd60e51b81526004016108ba906130fb565b6000828152600c602052604081208054611a41906134dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6d906134dd565b8015611aba5780601f10611a8f57610100808354040283529160200191611aba565b820191906000526020600020905b815481529060010190602001808311611a9d57829003601f168201915b505050505090506000611acb611fb5565b9050805160001415611adf575090506107fc565b815115611b11578082604051602001611af9929190612ac6565b604051602081830303815290604052925050506107fc565b6117ab84611fc4565b60006107f9826115fe565b611b2e82610c2c565b611b3a816118f561158c565b6109728383611cc2565b60006001600160e01b031982166380ac58cd60e01b1480611b7557506001600160e01b03198216635b5e139f60e01b145b806107f957506107f982612046565b61097283838361206b565b611b9982826111d8565b610ba657611bb1816001600160a01b031660146120f4565b611bbc8360206120f4565b604051602001611bcd929190612af5565b60408051601f198184030181529082905262461bcd60e51b82526108ba91600401612bcf565b611bfd82826111d8565b610ba6576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611c3461158c565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611c8483836122a6565b611cba57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d62565b506000610d62565b611ccc82826111d8565b15610ba6576000828152602081815260408083206001600160a01b03851684529091529020805460ff19169055611d0161158c565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60008181526001830160205260408120548015611e58576000611d69600183613483565b8554909150600090611d7d90600190613483565b9050818114611dfe576000866000018281548110611dab57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611ddc57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611e1d57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610d62565b6000915050610d62565b6000826000018281548110611e8757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000611eae846001600160a01b03166122be565b15611faa57836001600160a01b031663150b7a02611eca61158c565b8786866040518563ffffffff1660e01b8152600401611eec9493929190612b7e565b602060405180830381600087803b158015611f0657600080fd5b505af1925050508015611f36575060408051601f3d908101601f19168201909252611f33918101906129e4565b60015b611f90573d808015611f64576040519150601f19603f3d011682016040523d82523d6000602084013e611f69565b606091505b508051611f885760405162461bcd60e51b81526004016108ba90612cca565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506117ab565b506001949350505050565b6060600f8054610810906134dd565b6060611fcf8261156f565b611feb5760405162461bcd60e51b81526004016108ba90613216565b6000611ff5611fb5565b90506000815111612015576040518060200160405280600081525061118d565b8061201f846122c4565b604051602001612030929190612ac6565b6040516020818303038152906040529392505050565b60006001600160e01b03198216635a05180f60e01b14806107f957506107f9826123df565b612076838383610972565b6001600160a01b0383166120925761208d81612404565b6120b5565b816001600160a01b0316836001600160a01b0316146120b5576120b58382612448565b6001600160a01b0382166120d1576120cc816124e5565b610972565b826001600160a01b0316826001600160a01b0316146109725761097282826125be565b60606000612103836002613464565b61210e906002613438565b67ffffffffffffffff81111561213457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561215e576020820181803683370190505b509050600360fc1b8160008151811061218757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106121c457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006121e8846002613464565b6121f3906001613438565b90505b6001811115612287576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061223557634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061225957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93612280816134c6565b90506121f6565b50831561118d5760405162461bcd60e51b81526004016108ba90612be2565b60009081526001919091016020526040902054151590565b3b151590565b6060816122e957506040805180820190915260018152600360fc1b60208201526107fc565b8160005b811561231357806122fd81613518565b915061230c9050600a83613450565b91506122ed565b60008167ffffffffffffffff81111561233c57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612366576020820181803683370190505b5090505b84156117ab5761237b600183613483565b9150612388600a86613533565b612393906030613438565b60f81b8183815181106123b657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506123d8600a86613450565b945061236a565b60006001600160e01b03198216637965db0b60e01b14806107f957506107f982612602565b600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b6000600161245584610f09565b61245f9190613483565b6000838152600960205260409020549091508082146124b2576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906124f790600190613483565b6000838152600b6020526040812054600a805493945090928490811061252d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600a838154811061255c57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a8054806125a257634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006125c983610f09565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6001600160e01b031981166301ffc9a760e01b14919050565b828054612627906134dd565b90600052602060002090601f016020900481019282612649576000855561268f565b82601f1061266257805160ff191683800117855561268f565b8280016001018555821561268f579182015b8281111561268f578251825591602001919060010190612674565b5061269b92915061269f565b5090565b5b8082111561269b57600081556001016126a0565b600067ffffffffffffffff8311156126ce576126ce613573565b6126e1601f8401601f191660200161340e565b90508281528383830111156126f557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146107fc57600080fd5b803580151581146107fc57600080fd5b600082601f830112612743578081fd5b61118d838335602085016126b4565b600060208284031215612763578081fd5b61118d8261270c565b6000806040838503121561277e578081fd5b6127878361270c565b91506127956020840161270c565b90509250929050565b6000806000606084860312156127b2578081fd5b6127bb8461270c565b92506127c96020850161270c565b9150604084013590509250925092565b600080600080608085870312156127ee578081fd5b6127f78561270c565b93506128056020860161270c565b925060408501359150606085013567ffffffffffffffff811115612827578182fd5b8501601f81018713612837578182fd5b612846878235602084016126b4565b91505092959194509250565b60008060408385031215612864578182fd5b61286d8361270c565b915061279560208401612723565b6000806040838503121561288d578182fd5b6128968361270c565b946020939093013593505050565b600060208083850312156128b6578182fd5b823567ffffffffffffffff808211156128cd578384fd5b818501915085601f8301126128e0578384fd5b8135818111156128f2576128f2613573565b838102915061290284830161340e565b8181528481019084860184860187018a101561291c578788fd5b8795505b83861015612945576129318161270c565b835260019590950194918601918601612920565b5098975050505050505050565b60008060408385031215612964578182fd5b61286d83612723565b60006020828403121561297e578081fd5b5035919050565b60008060408385031215612997578182fd5b823591506127956020840161270c565b600080604083850312156129b9578081fd5b50508035926020909101359150565b6000602082840312156129d9578081fd5b813561118d81613589565b6000602082840312156129f5578081fd5b815161118d81613589565b600060208284031215612a11578081fd5b813567ffffffffffffffff811115612a27578182fd5b6117ab84828501612733565b60008060408385031215612a45578182fd5b82359150602083013567ffffffffffffffff811115612a62578182fd5b612a6e85828601612733565b9150509250929050565b60008060408385031215612a8a578182fd5b823560ff81168114612787578283fd5b60008151808452612ab281602086016020860161349a565b601f01601f19169290920160200192915050565b60008351612ad881846020880161349a565b835190830190612aec81836020880161349a565b01949350505050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351612b2d81601785016020880161349a565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612b5e81602884016020880161349a565b01602801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bb190830184612a9a565b9695505050505050565b901515815260200190565b90815260200190565b60006020825261118d6020830184612a9a565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526042908201527f536d61727442616e616e61733a20796f752061726520747279696e6720746f2060408201527f6d696e7420746f6f206d616e7920536d61727442616e616e6173206174206f6e606082015261636560f01b608082015260a00190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526025908201527f536d61727442616e616e61733a206d7573742073656e6420636f727265637420604082015264707269636560d81b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602f908201527f536d61727442616e616e61733a20616c6c20536d61727442616e616e6173206860408201526e185d99481899595b881b5a5b9d1959608a1b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252602b908201527f536d61727442616e616e61733a206d696e74696e672069732063757272656e7460408201526a1b1e48191a5cd8589b195960aa1b606082015260800190565b60208082526029908201527f536d61727442616e616e61733a2070726573616c6520686173206e6f74207374604082015268185c9d1959081e595d60ba1b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526056908201527f536d61727442616e616e61733a20796f752061726520747279696e6720746f2060408201527f6d696e7420746f6f206d616e7920536d61727442616e616e617320666f72207960608201527537bab910383932b9b0b6329030b63637b1b0ba34b7b760511b608082015260a00190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b60405181810167ffffffffffffffff8111828210171561343057613430613573565b604052919050565b6000821982111561344b5761344b613547565b500190565b60008261345f5761345f61355d565b500490565b600081600019048311821515161561347e5761347e613547565b500290565b60008282101561349557613495613547565b500390565b60005b838110156134b557818101518382015260200161349d565b838111156113c75750506000910152565b6000816134d5576134d5613547565b506000190190565b6002810460018216806134f157607f821691505b6020821081141561351257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561352c5761352c613547565b5060010190565b6000826135425761354261355d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461129d57600080fdfea2646970667358221220e5499d0d0ec0caf5f5b8fcd6f19e06ad8283d8f8ddbf5f399db35663cb25fc9764736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000c3663566a5800000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000addeb5dbdc1c62c2a2a8e04fddd42e3c3f19587b0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000d536d6172742042616e616e617300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642414e414e410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003668747470733a2f2f62616e616e616d6574612e6865726f6b756170702e636f6d2f6170692f62616e616e614d6574613f696e6465783d00000000000000000000

Deployed Bytecode

0x6080604052600436106102815760003560e01c8063784e7bea1161014f578063a07de775116100c1578063bfa457bc1161007a578063bfa457bc1461072e578063c87b56dd1461074e578063ca15c8731461076e578063d547741f1461078e578063e985e9c5146107ae578063f2fde38b146107ce57610288565b8063a07de7751461068f578063a0ef91df146106a4578063a217fddf146106b9578063a22cb465146106ce578063ac1f5ccd146106ee578063b88d4fde1461070e57610288565b80639010d07c116101135780639010d07c146105f057806391b7f5ed1461061057806391d148541461063057806395d89b411461065057806398bcede914610665578063a035b1fe1461067a57610288565b8063784e7bea146105735780637bd9e02f146105865780637c916fac146105a65780637dc2268c146105c65780638da5cb5b146105db57610288565b80632f2ff15d116101f357806355f804b3116101ac57806355f804b3146104c95780636352211e146104e95780636ac5db1914610509578063704b6c021461051e57806370a082311461053e578063715018a61461055e57610288565b80632f2ff15d146104095780632f745c591461042957806336568abe1461044957806342842e0e146104695780634f6ccce714610489578063510b5158146104a957610288565b8063162094c411610245578063162094c41461034757806318160ddd146103675780631fe9eabc1461038957806323b872dd146103a9578063248a9ca3146103c95780632bf04304146103e957610288565b806301ffc9a71461028d57806306fdde03146102c3578063081812fc146102e5578063095ea7b3146103125780630f7ad5781461033457610288565b3661028857005b600080fd5b34801561029957600080fd5b506102ad6102a83660046129c8565b6107ee565b6040516102ba9190612bbb565b60405180910390f35b3480156102cf57600080fd5b506102d8610801565b6040516102ba9190612bcf565b3480156102f157600080fd5b5061030561030036600461296d565b610893565b6040516102ba9190612b6a565b34801561031e57600080fd5b5061033261032d36600461287b565b6108df565b005b610332610342366004612a78565b610977565b34801561035357600080fd5b50610332610362366004612a33565b610b5d565b34801561037357600080fd5b5061037c610baa565b6040516102ba9190612bc6565b34801561039557600080fd5b506103326103a436600461296d565b610bb0565b3480156103b557600080fd5b506103326103c436600461279e565b610bf4565b3480156103d557600080fd5b5061037c6103e436600461296d565b610c2c565b3480156103f557600080fd5b506103326104043660046128a4565b610c41565b34801561041557600080fd5b50610332610424366004612985565b610cf1565b34801561043557600080fd5b5061037c61044436600461287b565b610d13565b34801561045557600080fd5b50610332610464366004612985565b610d68565b34801561047557600080fd5b5061033261048436600461279e565b610d8a565b34801561049557600080fd5b5061037c6104a436600461296d565b610da5565b3480156104b557600080fd5b506103056104c436600461296d565b610e00565b3480156104d557600080fd5b506103326104e4366004612a00565b610e1b565b3480156104f557600080fd5b5061030561050436600461296d565b610e6d565b34801561051557600080fd5b5061037c610ea2565b34801561052a57600080fd5b50610332610539366004612752565b610ea8565b34801561054a57600080fd5b5061037c610559366004612752565b610f09565b34801561056a57600080fd5b50610332610f4d565b610332610581366004612a78565b610f98565b34801561059257600080fd5b506103326105a1366004612952565b6110d3565b3480156105b257600080fd5b5061037c6105c1366004612752565b611144565b3480156105d257600080fd5b506102ad611156565b3480156105e757600080fd5b50610305611166565b3480156105fc57600080fd5b5061030561060b3660046129a7565b611175565b34801561061c57600080fd5b5061033261062b36600461296d565b611194565b34801561063c57600080fd5b506102ad61064b366004612985565b6111d8565b34801561065c57600080fd5b506102d8611201565b34801561067157600080fd5b5061037c611210565b34801561068657600080fd5b5061037c611216565b34801561069b57600080fd5b506102ad61121c565b3480156106b057600080fd5b5061033261122c565b3480156106c557600080fd5b5061037c6112a0565b3480156106da57600080fd5b506103326106e9366004612852565b6112a5565b3480156106fa57600080fd5b5061030561070936600461296d565b611373565b34801561071a57600080fd5b506103326107293660046127d9565b61138e565b34801561073a57600080fd5b50610332610749366004612985565b6113cd565b34801561075a57600080fd5b506102d861076936600461296d565b611482565b34801561077a57600080fd5b5061037c61078936600461296d565b61148d565b34801561079a57600080fd5b506103326107a9366004612985565b6114a4565b3480156107ba57600080fd5b506102ad6107c936600461276c565b6114ae565b3480156107da57600080fd5b506103326107e9366004612752565b6114dc565b60006107f98261154a565b90505b919050565b606060028054610810906134dd565b80601f016020809104026020016040519081016040528092919081815260200182805461083c906134dd565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b5050505050905090565b600061089e8261156f565b6108c35760405162461bcd60e51b81526004016108ba9061314c565b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108ea82610e6d565b9050806001600160a01b0316836001600160a01b0316141561091e5760405162461bcd60e51b81526004016108ba906132e1565b806001600160a01b031661093061158c565b6001600160a01b0316148061094c575061094c816107c961158c565b6109685760405162461bcd60e51b81526004016108ba90612ef4565b6109728383611590565b505050565b601254600160b01b900460ff166109a05760405162461bcd60e51b81526004016108ba9061307d565b6001600160a01b03811660009081526014602052604090205460ff831611156109db5760405162461bcd60e51b81526004016108ba90613265565b60125460ff600160a01b90910481169083161115610a0b5760405162461bcd60e51b81526004016108ba90612c17565b6102258260ff16610a1c600e6115fe565b610a269190613438565b1115610a445760405162461bcd60e51b81526004016108ba90612ea5565b8160ff16601054610a559190613464565b341015610a745760405162461bcd60e51b81526004016108ba90612d99565b6001600160a01b0381166000908152601460205260408120805460ff85169290610a9f908490613483565b90915550600090505b8260ff16811015610b2357610ac682610ac1600e6115fe565b611602565b8160136000610ad5600e6115fe565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610b11600e6116e1565b80610b1b81613518565b915050610aa8565b506012546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610972573d6000803e3d6000fd5b610b6561158c565b6001600160a01b0316610b76611166565b6001600160a01b031614610b9c5760405162461bcd60e51b81526004016108ba90613198565b610ba682826116ea565b5050565b600a5490565b610bb861158c565b6001600160a01b0316610bc9611166565b6001600160a01b031614610bef5760405162461bcd60e51b81526004016108ba90613198565b601155565b610c05610bff61158c565b8261172e565b610c215760405162461bcd60e51b81526004016108ba90613322565b6109728383836117b3565b60009081526020819052604090206001015490565b610c4961158c565b6001600160a01b0316610c5a611166565b6001600160a01b031614610c805760405162461bcd60e51b81526004016108ba90613198565b60005b8151811015610ba657600360146000848481518110610cb257634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508080610ce990613518565b915050610c83565b610cfb82826118e0565b60008281526001602052604090206109729082611904565b6000610d1e83610f09565b8210610d3c5760405162461bcd60e51b81526004016108ba90612c7f565b506001600160a01b03821660009081526008602090815260408083208484529091529020545b92915050565b610d728282611919565b6000828152600160205260409020610972908261195b565b6109728383836040518060200160405280600081525061138e565b6000610daf610baa565b8210610dcd5760405162461bcd60e51b81526004016108ba90613373565b600a8281548110610dee57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6013602052600090815260409020546001600160a01b031681565b610e2361158c565b6001600160a01b0316610e34611166565b6001600160a01b031614610e5a5760405162461bcd60e51b81526004016108ba90613198565b8051610ba690600f90602084019061261b565b6000818152600460205260408120546001600160a01b0316806107f95760405162461bcd60e51b81526004016108ba90612f9b565b60115490565b610eb061158c565b6001600160a01b0316610ec1611166565b6001600160a01b031614610ee75760405162461bcd60e51b81526004016108ba90613198565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216610f315760405162461bcd60e51b81526004016108ba90612f51565b506001600160a01b031660009081526005602052604090205490565b610f5561158c565b6001600160a01b0316610f66611166565b6001600160a01b031614610f8c5760405162461bcd60e51b81526004016108ba90613198565b610f966000611970565b565b601254600160a81b900460ff16610fc15760405162461bcd60e51b81526004016108ba90613032565b60125460ff600160a01b90910481169083161115610ff15760405162461bcd60e51b81526004016108ba90612c17565b6011548260ff16611002600e6115fe565b61100c9190613438565b111561102a5760405162461bcd60e51b81526004016108ba90612ea5565b8160ff1660105461103b9190613464565b34101561105a5760405162461bcd60e51b81526004016108ba90612d99565b60005b8260ff16811015610b235761107682610ac1600e6115fe565b8160136000611085600e6115fe565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506110c1600e6116e1565b806110cb81613518565b91505061105d565b6110db61158c565b6001600160a01b03166110ec611166565b6001600160a01b0316146111125760405162461bcd60e51b81526004016108ba90613198565b60128054911515600160b01b0260ff60b01b19931515600160a81b0260ff60a81b199093169290921792909216179055565b60146020526000908152604090205481565b601254600160a81b900460ff1690565b600d546001600160a01b031690565b600082815260016020526040812061118d90836119c2565b9392505050565b61119c61158c565b6001600160a01b03166111ad611166565b6001600160a01b0316146111d35760405162461bcd60e51b81526004016108ba90613198565b601055565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b606060038054610810906134dd565b600e5481565b60105490565b601254600160b01b900460ff1690565b61123461158c565b6001600160a01b0316611245611166565b6001600160a01b03161461126b5760405162461bcd60e51b81526004016108ba90613198565b60125460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505061129d57600080fd5b50565b600081565b6112ad61158c565b6001600160a01b0316826001600160a01b031614156112de5760405162461bcd60e51b81526004016108ba90612e22565b80600760006112eb61158c565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561132f61158c565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113679190612bbb565b60405180910390a35050565b6000908152601360205260409020546001600160a01b031690565b61139f61139961158c565b8361172e565b6113bb5760405162461bcd60e51b81526004016108ba90613322565b6113c7848484846119ce565b50505050565b6113d561158c565b6001600160a01b03166113e6611166565b6001600160a01b03161461140c5760405162461bcd60e51b81526004016108ba90613198565b60005b828110156109725761142582610ac1600e6115fe565b3360136000611434600e6115fe565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611470600e6116e1565b8061147a81613518565b91505061140f565b60606107f982611a01565b60008181526001602052604081206107f990611b1a565b610d728282611b25565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6114e461158c565b6001600160a01b03166114f5611166565b6001600160a01b03161461151b5760405162461bcd60e51b81526004016108ba90613198565b6001600160a01b0381166115415760405162461bcd60e51b81526004016108ba90612d1c565b61129d81611970565b60006001600160e01b0319821663780e9d6360e01b14806107f957506107f982611b44565b6000908152600460205260409020546001600160a01b0316151590565b3390565b600081815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115c582610e6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5490565b6001600160a01b0382166116285760405162461bcd60e51b81526004016108ba906130c6565b6116318161156f565b1561164e5760405162461bcd60e51b81526004016108ba90612d62565b61165a60008383611b84565b6001600160a01b0382166000908152600560205260408120805460019290611683908490613438565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80546001019055565b6116f38261156f565b61170f5760405162461bcd60e51b81526004016108ba90612fe4565b6000828152600c6020908152604090912082516109729284019061261b565b60006117398261156f565b6117555760405162461bcd60e51b81526004016108ba90612e59565b600061176083610e6d565b9050806001600160a01b0316846001600160a01b0316148061179b5750836001600160a01b031661179084610893565b6001600160a01b0316145b806117ab57506117ab81856114ae565b949350505050565b826001600160a01b03166117c682610e6d565b6001600160a01b0316146117ec5760405162461bcd60e51b81526004016108ba906131cd565b6001600160a01b0382166118125760405162461bcd60e51b81526004016108ba90612dde565b61181d838383611b84565b611828600082611590565b6001600160a01b0383166000908152600560205260408120805460019290611851908490613483565b90915550506001600160a01b038216600090815260056020526040812080546001929061187f908490613438565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6118e982610c2c565b6118fa816118f561158c565b611b8f565b6109728383611bf3565b600061118d836001600160a01b038416611c78565b61192161158c565b6001600160a01b0316816001600160a01b0316146119515760405162461bcd60e51b81526004016108ba906133bf565b610ba68282611cc2565b600061118d836001600160a01b038416611d45565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061118d8383611e62565b6119d98484846117b3565b6119e584848484611e9a565b6113c75760405162461bcd60e51b81526004016108ba90612cca565b6060611a0c8261156f565b611a285760405162461bcd60e51b81526004016108ba906130fb565b6000828152600c602052604081208054611a41906134dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6d906134dd565b8015611aba5780601f10611a8f57610100808354040283529160200191611aba565b820191906000526020600020905b815481529060010190602001808311611a9d57829003601f168201915b505050505090506000611acb611fb5565b9050805160001415611adf575090506107fc565b815115611b11578082604051602001611af9929190612ac6565b604051602081830303815290604052925050506107fc565b6117ab84611fc4565b60006107f9826115fe565b611b2e82610c2c565b611b3a816118f561158c565b6109728383611cc2565b60006001600160e01b031982166380ac58cd60e01b1480611b7557506001600160e01b03198216635b5e139f60e01b145b806107f957506107f982612046565b61097283838361206b565b611b9982826111d8565b610ba657611bb1816001600160a01b031660146120f4565b611bbc8360206120f4565b604051602001611bcd929190612af5565b60408051601f198184030181529082905262461bcd60e51b82526108ba91600401612bcf565b611bfd82826111d8565b610ba6576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611c3461158c565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611c8483836122a6565b611cba57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d62565b506000610d62565b611ccc82826111d8565b15610ba6576000828152602081815260408083206001600160a01b03851684529091529020805460ff19169055611d0161158c565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60008181526001830160205260408120548015611e58576000611d69600183613483565b8554909150600090611d7d90600190613483565b9050818114611dfe576000866000018281548110611dab57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611ddc57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611e1d57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610d62565b6000915050610d62565b6000826000018281548110611e8757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000611eae846001600160a01b03166122be565b15611faa57836001600160a01b031663150b7a02611eca61158c565b8786866040518563ffffffff1660e01b8152600401611eec9493929190612b7e565b602060405180830381600087803b158015611f0657600080fd5b505af1925050508015611f36575060408051601f3d908101601f19168201909252611f33918101906129e4565b60015b611f90573d808015611f64576040519150601f19603f3d011682016040523d82523d6000602084013e611f69565b606091505b508051611f885760405162461bcd60e51b81526004016108ba90612cca565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506117ab565b506001949350505050565b6060600f8054610810906134dd565b6060611fcf8261156f565b611feb5760405162461bcd60e51b81526004016108ba90613216565b6000611ff5611fb5565b90506000815111612015576040518060200160405280600081525061118d565b8061201f846122c4565b604051602001612030929190612ac6565b6040516020818303038152906040529392505050565b60006001600160e01b03198216635a05180f60e01b14806107f957506107f9826123df565b612076838383610972565b6001600160a01b0383166120925761208d81612404565b6120b5565b816001600160a01b0316836001600160a01b0316146120b5576120b58382612448565b6001600160a01b0382166120d1576120cc816124e5565b610972565b826001600160a01b0316826001600160a01b0316146109725761097282826125be565b60606000612103836002613464565b61210e906002613438565b67ffffffffffffffff81111561213457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561215e576020820181803683370190505b509050600360fc1b8160008151811061218757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106121c457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006121e8846002613464565b6121f3906001613438565b90505b6001811115612287576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061223557634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061225957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93612280816134c6565b90506121f6565b50831561118d5760405162461bcd60e51b81526004016108ba90612be2565b60009081526001919091016020526040902054151590565b3b151590565b6060816122e957506040805180820190915260018152600360fc1b60208201526107fc565b8160005b811561231357806122fd81613518565b915061230c9050600a83613450565b91506122ed565b60008167ffffffffffffffff81111561233c57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612366576020820181803683370190505b5090505b84156117ab5761237b600183613483565b9150612388600a86613533565b612393906030613438565b60f81b8183815181106123b657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506123d8600a86613450565b945061236a565b60006001600160e01b03198216637965db0b60e01b14806107f957506107f982612602565b600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b6000600161245584610f09565b61245f9190613483565b6000838152600960205260409020549091508082146124b2576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906124f790600190613483565b6000838152600b6020526040812054600a805493945090928490811061252d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600a838154811061255c57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a8054806125a257634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006125c983610f09565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6001600160e01b031981166301ffc9a760e01b14919050565b828054612627906134dd565b90600052602060002090601f016020900481019282612649576000855561268f565b82601f1061266257805160ff191683800117855561268f565b8280016001018555821561268f579182015b8281111561268f578251825591602001919060010190612674565b5061269b92915061269f565b5090565b5b8082111561269b57600081556001016126a0565b600067ffffffffffffffff8311156126ce576126ce613573565b6126e1601f8401601f191660200161340e565b90508281528383830111156126f557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146107fc57600080fd5b803580151581146107fc57600080fd5b600082601f830112612743578081fd5b61118d838335602085016126b4565b600060208284031215612763578081fd5b61118d8261270c565b6000806040838503121561277e578081fd5b6127878361270c565b91506127956020840161270c565b90509250929050565b6000806000606084860312156127b2578081fd5b6127bb8461270c565b92506127c96020850161270c565b9150604084013590509250925092565b600080600080608085870312156127ee578081fd5b6127f78561270c565b93506128056020860161270c565b925060408501359150606085013567ffffffffffffffff811115612827578182fd5b8501601f81018713612837578182fd5b612846878235602084016126b4565b91505092959194509250565b60008060408385031215612864578182fd5b61286d8361270c565b915061279560208401612723565b6000806040838503121561288d578182fd5b6128968361270c565b946020939093013593505050565b600060208083850312156128b6578182fd5b823567ffffffffffffffff808211156128cd578384fd5b818501915085601f8301126128e0578384fd5b8135818111156128f2576128f2613573565b838102915061290284830161340e565b8181528481019084860184860187018a101561291c578788fd5b8795505b83861015612945576129318161270c565b835260019590950194918601918601612920565b5098975050505050505050565b60008060408385031215612964578182fd5b61286d83612723565b60006020828403121561297e578081fd5b5035919050565b60008060408385031215612997578182fd5b823591506127956020840161270c565b600080604083850312156129b9578081fd5b50508035926020909101359150565b6000602082840312156129d9578081fd5b813561118d81613589565b6000602082840312156129f5578081fd5b815161118d81613589565b600060208284031215612a11578081fd5b813567ffffffffffffffff811115612a27578182fd5b6117ab84828501612733565b60008060408385031215612a45578182fd5b82359150602083013567ffffffffffffffff811115612a62578182fd5b612a6e85828601612733565b9150509250929050565b60008060408385031215612a8a578182fd5b823560ff81168114612787578283fd5b60008151808452612ab281602086016020860161349a565b601f01601f19169290920160200192915050565b60008351612ad881846020880161349a565b835190830190612aec81836020880161349a565b01949350505050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351612b2d81601785016020880161349a565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612b5e81602884016020880161349a565b01602801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bb190830184612a9a565b9695505050505050565b901515815260200190565b90815260200190565b60006020825261118d6020830184612a9a565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526042908201527f536d61727442616e616e61733a20796f752061726520747279696e6720746f2060408201527f6d696e7420746f6f206d616e7920536d61727442616e616e6173206174206f6e606082015261636560f01b608082015260a00190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526025908201527f536d61727442616e616e61733a206d7573742073656e6420636f727265637420604082015264707269636560d81b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602f908201527f536d61727442616e616e61733a20616c6c20536d61727442616e616e6173206860408201526e185d99481899595b881b5a5b9d1959608a1b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252602b908201527f536d61727442616e616e61733a206d696e74696e672069732063757272656e7460408201526a1b1e48191a5cd8589b195960aa1b606082015260800190565b60208082526029908201527f536d61727442616e616e61733a2070726573616c6520686173206e6f74207374604082015268185c9d1959081e595d60ba1b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526056908201527f536d61727442616e616e61733a20796f752061726520747279696e6720746f2060408201527f6d696e7420746f6f206d616e7920536d61727442616e616e617320666f72207960608201527537bab910383932b9b0b6329030b63637b1b0ba34b7b760511b608082015260a00190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b60405181810167ffffffffffffffff8111828210171561343057613430613573565b604052919050565b6000821982111561344b5761344b613547565b500190565b60008261345f5761345f61355d565b500490565b600081600019048311821515161561347e5761347e613547565b500290565b60008282101561349557613495613547565b500390565b60005b838110156134b557818101518382015260200161349d565b838111156113c75750506000910152565b6000816134d5576134d5613547565b506000190190565b6002810460018216806134f157607f821691505b6020821081141561351257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561352c5761352c613547565b5060010190565b6000826135425761354261355d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461129d57600080fdfea2646970667358221220e5499d0d0ec0caf5f5b8fcd6f19e06ad8283d8f8ddbf5f399db35663cb25fc9764736f6c63430008000033

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

00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000c3663566a5800000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000addeb5dbdc1c62c2a2a8e04fddd42e3c3f19587b0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000d536d6172742042616e616e617300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642414e414e410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003668747470733a2f2f62616e616e616d6574612e6865726f6b756170702e636f6d2f6170692f62616e616e614d6574613f696e6465783d00000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Smart Bananas
Arg [1] : symbol (string): BANANA
Arg [2] : baseTokenURI (string): https://bananameta.herokuapp.com/api/bananaMeta?index=
Arg [3] : mintPrice (uint256): 55000000000000000
Arg [4] : maxSupply (uint256): 2000
Arg [5] : admin (address): 0xaDDeB5Dbdc1c62c2a2a8E04fDdd42E3C3F19587b
Arg [6] : maxTxn (uint8): 4

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 00000000000000000000000000000000000000000000000000c3663566a58000
Arg [4] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [5] : 000000000000000000000000addeb5dbdc1c62c2a2a8e04fddd42e3c3f19587b
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [8] : 536d6172742042616e616e617300000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [10] : 42414e414e410000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [12] : 68747470733a2f2f62616e616e616d6574612e6865726f6b756170702e636f6d
Arg [13] : 2f6170692f62616e616e614d6574613f696e6465783d00000000000000000000


Deployed Bytecode Sourcemap

72063:5727:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77411:198;;;;;;;;;;-1:-1:-1;77411:198:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14192:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;15751:221::-;;;;;;;;;;-1:-1:-1;15751:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15274:411::-;;;;;;;;;;-1:-1:-1;15274:411:0;;;;;:::i;:::-;;:::i;:::-;;75148:846;;;;;;:::i;:::-;;:::i;73702:244::-;;;;;;;;;;-1:-1:-1;73702:244:0;;;;;:::i;:::-;;:::i;55049:113::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;74233:74::-;;;;;;;;;;-1:-1:-1;74233:74:0;;;;;:::i;:::-;;:::i;16641:339::-;;;;;;;;;;-1:-1:-1;16641:339:0;;;;;:::i;:::-;;:::i;40442:123::-;;;;;;;;;;-1:-1:-1;40442:123:0;;;;;:::i;:::-;;:::i;76258:177::-;;;;;;;;;;-1:-1:-1;76258:177:0;;;;;:::i;:::-;;:::i;45762:165::-;;;;;;;;;;-1:-1:-1;45762:165:0;;;;;:::i;:::-;;:::i;54717:256::-;;;;;;;;;;-1:-1:-1;54717:256:0;;;;;:::i;:::-;;:::i;46285:174::-;;;;;;;;;;-1:-1:-1;46285:174:0;;;;;:::i;:::-;;:::i;17051:185::-;;;;;;;;;;-1:-1:-1;17051:185:0;;;;;:::i;:::-;;:::i;55239:233::-;;;;;;;;;;-1:-1:-1;55239:233:0;;;;;:::i;:::-;;:::i;72457:43::-;;;;;;;;;;-1:-1:-1;72457:43:0;;;;;:::i;:::-;;:::i;73482:214::-;;;;;;;;;;-1:-1:-1;73482:214:0;;;;;:::i;:::-;;:::i;13886:239::-;;;;;;;;;;-1:-1:-1;13886:239:0;;;;;:::i;:::-;;:::i;74313:66::-;;;;;;;;;;;;;:::i;74385:87::-;;;;;;;;;;-1:-1:-1;74385:87:0;;;;;:::i;:::-;;:::i;13616:208::-;;;;;;;;;;-1:-1:-1;13616:208:0;;;;;:::i;:::-;;:::i;2529:94::-;;;;;;;;;;;;;:::i;74478:664::-;;;;;;:::i;:::-;;:::i;76441:134::-;;;;;;;;;;-1:-1:-1;76441:134:0;;;;;:::i;:::-;;:::i;72505:52::-;;;;;;;;;;-1:-1:-1;72505:52:0;;;;;:::i;:::-;;:::i;76583:71::-;;;;;;;;;;;;;:::i;1878:87::-;;;;;;;;;;;;;:::i;45217:145::-;;;;;;;;;;-1:-1:-1;45217:145:0;;;;;:::i;:::-;;:::i;73952:197::-;;;;;;;;;;-1:-1:-1;73952:197:0;;;;;:::i;:::-;;:::i;39327:139::-;;;;;;;;;;-1:-1:-1;39327:139:0;;;;;:::i;:::-;;:::i;14361:104::-;;;;;;;;;;;;;:::i;72210:39::-;;;;;;;;;;;;;:::i;74155:70::-;;;;;;;;;;;;;:::i;76660:75::-;;;;;;;;;;;;;:::i;77615:133::-;;;;;;;;;;;;;:::i;37305:49::-;;;;;;;;;;;;;:::i;16044:295::-;;;;;;;;;;-1:-1:-1;16044:295:0;;;;;:::i;:::-;;:::i;76743:104::-;;;;;;;;;;-1:-1:-1;76743:104:0;;;;;:::i;:::-;;:::i;17307:328::-;;;;;;;;;;-1:-1:-1;17307:328:0;;;;;:::i;:::-;;:::i;76000:250::-;;;;;;;;;;-1:-1:-1;76000:250:0;;;;;:::i;:::-;;:::i;76994:160::-;;;;;;;;;;-1:-1:-1;76994:160:0;;;;;:::i;:::-;;:::i;45536:134::-;;;;;;;;;;-1:-1:-1;45536:134:0;;;;;:::i;:::-;;:::i;46020:170::-;;;;;;;;;;-1:-1:-1;46020:170:0;;;;;:::i;:::-;;:::i;16410:164::-;;;;;;;;;;-1:-1:-1;16410:164:0;;;;;:::i;:::-;;:::i;2778:192::-;;;;;;;;;;-1:-1:-1;2778:192:0;;;;;:::i;:::-;;:::i;77411:198::-;77547:4;77567:36;77591:11;77567:23;:36::i;:::-;77560:43;;77411:198;;;;:::o;14192:100::-;14246:13;14279:5;14272:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14192:100;:::o;15751:221::-;15827:7;15855:16;15863:7;15855;:16::i;:::-;15847:73;;;;-1:-1:-1;;;15847:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;15940:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;15940:24:0;;15751:221::o;15274:411::-;15355:13;15371:23;15386:7;15371:14;:23::i;:::-;15355:39;;15419:5;-1:-1:-1;;;;;15413:11:0;:2;-1:-1:-1;;;;;15413:11:0;;;15405:57;;;;-1:-1:-1;;;15405:57:0;;;;;;;:::i;:::-;15513:5;-1:-1:-1;;;;;15497:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;15497:21:0;;:62;;;;15522:37;15539:5;15546:12;:10;:12::i;15522:37::-;15475:168;;;;-1:-1:-1;;;15475:168:0;;;;;;;:::i;:::-;15656:21;15665:2;15669:7;15656:8;:21::i;:::-;15274:411;;;:::o;75148:846::-;75231:7;;-1:-1:-1;;;75231:7:0;;;;75223:61;;;;-1:-1:-1;;;75223:61:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;75299:26:0;;;;;;:16;:26;;;;;;:39;;;-1:-1:-1;75299:39:0;75291:138;;;;-1:-1:-1;;;75291:138:0;;;;;;;:::i;:::-;75454:7;;;-1:-1:-1;;;75454:7:0;;;;;75441:20;;;;;75433:99;;;;-1:-1:-1;;;75433:99:0;;;;;;;:::i;:::-;75585:3;75572:9;75544:37;;:25;:15;:23;:25::i;:::-;:37;;;;:::i;:::-;:44;;75536:104;;;;-1:-1:-1;;;75536:104:0;;;;;;;:::i;:::-;75677:9;75668:18;;:6;;:18;;;;:::i;:::-;75655:9;:31;;75647:81;;;;-1:-1:-1;;;75647:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;75738:26:0;;;;;;:16;:26;;;;;:39;;;;;;:26;:39;;;;;:::i;:::-;;;;-1:-1:-1;75787:6:0;;-1:-1:-1;75783:167:0;75801:9;75797:13;;:1;:13;75783:167;;;75821:42;75827:8;75837:25;:15;:23;:25::i;:::-;75821:5;:42::i;:::-;75905:8;75868:7;:34;75876:25;:15;:23;:25::i;:::-;75868:34;;;;;;;;;;;;:45;;;;;-1:-1:-1;;;;;75868:45:0;;;;;-1:-1:-1;;;;;75868:45:0;;;;;;75918:27;:15;:25;:27::i;:::-;75812:3;;;;:::i;:::-;;;;75783:167;;;-1:-1:-1;75961:6:0;;75953:35;;-1:-1:-1;;;;;75961:6:0;;;;75978:9;75953:35;;;;;75961:6;75953:35;75961:6;75953:35;75978:9;75961:6;75953:35;;;;;;;;;;;;;;;;;;;73702:244;2109:12;:10;:12::i;:::-;-1:-1:-1;;;;;2098:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2098:23:0;;2090:68;;;;-1:-1:-1;;;2090:68:0;;;;;;;:::i;:::-;73908:32:::1;73921:7;73930:9;73908:12;:32::i;:::-;73702:244:::0;;:::o;55049:113::-;55137:10;:17;55049:113;:::o;74233:74::-;2109:12;:10;:12::i;:::-;-1:-1:-1;;;;;2098:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2098:23:0;;2090:68;;;;-1:-1:-1;;;2090:68:0;;;;;;;:::i;:::-;74288:4:::1;:13:::0;74233:74::o;16641:339::-;16836:41;16855:12;:10;:12::i;:::-;16869:7;16836:18;:41::i;:::-;16828:103;;;;-1:-1:-1;;;16828:103:0;;;;;;;:::i;:::-;16944:28;16954:4;16960:2;16964:7;16944:9;:28::i;40442:123::-;40508:7;40535:12;;;;;;;;;;:22;;;;40442:123::o;76258:177::-;2109:12;:10;:12::i;:::-;-1:-1:-1;;;;;2098:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2098:23:0;;2090:68;;;;-1:-1:-1;;;2090:68:0;;;;;;;:::i;:::-;76342:6:::1;76337:93;76358:5;:12;76354:1;:16;76337:93;;;76419:1;76390:16;:26;76407:5;76413:1;76407:8;;;;;;-1:-1:-1::0;;;76407:8:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;76390:26:0::1;-1:-1:-1::0;;;;;76390:26:0::1;;;;;;;;;;;;:30;;;;76372:3;;;;;:::i;:::-;;;;76337:93;;45762:165:::0;45847:30;45863:4;45869:7;45847:15;:30::i;:::-;45888:18;;;;:12;:18;;;;;:31;;45911:7;45888:22;:31::i;54717:256::-;54814:7;54850:23;54867:5;54850:16;:23::i;:::-;54842:5;:31;54834:87;;;;-1:-1:-1;;;54834:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;54939:19:0;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;54717:256;;;;;:::o;46285:174::-;46373:33;46392:4;46398:7;46373:18;:33::i;:::-;46417:18;;;;:12;:18;;;;;:34;;46443:7;46417:25;:34::i;17051:185::-;17189:39;17206:4;17212:2;17216:7;17189:39;;;;;;;;;;;;:16;:39::i;55239:233::-;55314:7;55350:30;:28;:30::i;:::-;55342:5;:38;55334:95;;;;-1:-1:-1;;;55334:95:0;;;;;;;:::i;:::-;55447:10;55458:5;55447:17;;;;;;-1:-1:-1;;;55447:17:0;;;;;;;;;;;;;;;;;55440:24;;55239:233;;;:::o;72457:43::-;;;;;;;;;;;;-1:-1:-1;;;;;72457:43:0;;:::o;73482:214::-;2109:12;:10;:12::i;:::-;-1:-1:-1;;;;;2098:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2098:23:0;;2090:68;;;;-1:-1:-1;;;2090:68:0;;;;;;;:::i;:::-;73667:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;13886:239::-:0;13958:7;13994:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13994:16:0;14029:19;14021:73;;;;-1:-1:-1;;;14021:73:0;;;;;;;:::i;74313:66::-;74369:4;;74313:66;:::o;74385:87::-;2109:12;:10;:12::i;:::-;-1:-1:-1;;;;;2098:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2098:23:0;;2090:68;;;;-1:-1:-1;;;2090:68:0;;;;;;;:::i;:::-;74449:6:::1;:17:::0;;-1:-1:-1;;;;;;74449:17:0::1;-1:-1:-1::0;;;;;74449:17:0;;;::::1;::::0;;;::::1;::::0;;74385:87::o;13616:208::-;13688:7;-1:-1:-1;;;;;13716:19:0;;13708:74;;;;-1:-1:-1;;;13708:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;13800:16:0;;;;;:9;:16;;;;;;;13616:208::o;2529:94::-;2109:12;:10;:12::i;:::-;-1:-1:-1;;;;;2098:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2098:23:0;;2090:68;;;;-1:-1:-1;;;2090:68:0;;;;;;;:::i;:::-;2594:21:::1;2612:1;2594:9;:21::i;:::-;2529:94::o:0;74478:664::-;74562:8;;-1:-1:-1;;;74562:8:0;;;;74554:64;;;;-1:-1:-1;;;74554:64:0;;;;;;;:::i;:::-;74643:7;;;-1:-1:-1;;;74643:7:0;;;;;74630:20;;;;;74622:99;;;;-1:-1:-1;;;74622:99:0;;;;;;;:::i;:::-;74774:4;;74761:9;74733:37;;:25;:15;:23;:25::i;:::-;:37;;;;:::i;:::-;:45;;74725:105;;;;-1:-1:-1;;;74725:105:0;;;;;;;:::i;:::-;74867:9;74858:18;;:6;;:18;;;;:::i;:::-;74845:9;:31;;74837:81;;;;-1:-1:-1;;;74837:81:0;;;;;;;:::i;:::-;74935:6;74931:167;74949:9;74945:13;;:1;:13;74931:167;;;74969:42;74975:8;74985:25;:15;:23;:25::i;74969:42::-;75053:8;75016:7;:34;75024:25;:15;:23;:25::i;:::-;75016:34;;;;;;;;;;;;:45;;;;;-1:-1:-1;;;;;75016:45:0;;;;;-1:-1:-1;;;;;75016:45:0;;;;;;75066:27;:15;:25;:27::i;:::-;74960:3;;;;:::i;:::-;;;;74931:167;;76441:134;2109:12;:10;:12::i;:::-;-1:-1:-1;;;;;2098:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2098:23:0;;2090:68;;;;-1:-1:-1;;;2090:68:0;;;;;;;:::i;:::-;76520:8:::1;:20:::0;;76547:22;::::1;;-1:-1:-1::0;;;76547:22:0::1;-1:-1:-1::0;;;;76520:20:0;::::1;;-1:-1:-1::0;;;76520:20:0::1;-1:-1:-1::0;;;;76520:20:0;;::::1;::::0;;;::::1;76547:22:::0;;;::::1;;::::0;;76441:134::o;72505:52::-;;;;;;;;;;;;;:::o;76583:71::-;76640:8;;-1:-1:-1;;;76640:8:0;;;;;76583:71::o;1878:87::-;1951:6;;-1:-1:-1;;;;;1951:6:0;1878:87;:::o;45217:145::-;45299:7;45326:18;;;:12;:18;;;;;:28;;45348:5;45326:21;:28::i;:::-;45319:35;45217:145;-1:-1:-1;;;45217:145:0:o;73952:197::-;2109:12;:10;:12::i;:::-;-1:-1:-1;;;;;2098:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2098:23:0;;2090:68;;;;-1:-1:-1;;;2090:68:0;;;;;;;:::i;:::-;74125:6:::1;:18:::0;73952:197::o;39327:139::-;39405:4;39429:12;;;;;;;;;;;-1:-1:-1;;;;;39429:29:0;;;;;;;;;;;;;;;39327:139::o;14361:104::-;14417:13;14450:7;14443:14;;;;;:::i;72210:39::-;;;;:::o;74155:70::-;74213:6;;74155:70;:::o;76660:75::-;76722:7;;-1:-1:-1;;;76722:7:0;;;;;76660:75::o;77615:133::-;2109:12;:10;:12::i;:::-;-1:-1:-1;;;;;2098:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2098:23:0;;2090:68;;;;-1:-1:-1;;;2090:68:0;;;;;;;:::i;:::-;77722:6:::1;::::0;77714:27:::1;::::0;77678:21:::1;::::0;-1:-1:-1;;;;;77722:6:0::1;::::0;77714:27;::::1;;;::::0;77678:21;;77662:13:::1;77714:27:::0;77662:13;77714:27;77678:21;77722:6;77714:27;::::1;;;;;;77706:36;;;::::0;::::1;;2169:1;77615:133::o:0;37305:49::-;37350:4;37305:49;:::o;16044:295::-;16159:12;:10;:12::i;:::-;-1:-1:-1;;;;;16147:24:0;:8;-1:-1:-1;;;;;16147:24:0;;;16139:62;;;;-1:-1:-1;;;16139:62:0;;;;;;;:::i;:::-;16259:8;16214:18;:32;16233:12;:10;:12::i;:::-;-1:-1:-1;;;;;16214:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;16214:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;16214:53:0;;;;;;;;;;;16298:12;:10;:12::i;:::-;-1:-1:-1;;;;;16283:48:0;;16322:8;16283:48;;;;;;:::i;:::-;;;;;;;;16044:295;;:::o;76743:104::-;76803:7;76825:16;;;:7;:16;;;;;;-1:-1:-1;;;;;76825:16:0;;76743:104::o;17307:328::-;17482:41;17501:12;:10;:12::i;:::-;17515:7;17482:18;:41::i;:::-;17474:103;;;;-1:-1:-1;;;17474:103:0;;;;;;;:::i;:::-;17588:39;17602:4;17608:2;17612:7;17621:5;17588:13;:39::i;:::-;17307:328;;;;:::o;76000:250::-;2109:12;:10;:12::i;:::-;-1:-1:-1;;;;;2098:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2098:23:0;;2090:68;;;;-1:-1:-1;;;2090:68:0;;;;;;;:::i;:::-;76080:6:::1;76076:169;76094:9;76090:1;:13;76076:169;;;76114:42;76120:8;76130:25;:15;:23;:25::i;76114:42::-;76198:10;76161:7;:34;76169:25;:15;:23;:25::i;:::-;76161:34;;;;;;;;;;;;:47;;;;;-1:-1:-1::0;;;;;76161:47:0::1;;;;;-1:-1:-1::0;;;;;76161:47:0::1;;;;;;76213:27;:15;:25;:27::i;:::-;76105:3:::0;::::1;::::0;::::1;:::i;:::-;;;;76076:169;;76994:160:::0;77085:13;77114:34;77140:7;77114:25;:34::i;45536:134::-;45608:7;45635:18;;;:12;:18;;;;;:27;;:25;:27::i;46020:170::-;46106:31;46123:4;46129:7;46106:16;:31::i;16410:164::-;-1:-1:-1;;;;;16531:25:0;;;16507:4;16531:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;16410:164::o;2778:192::-;2109:12;:10;:12::i;:::-;-1:-1:-1;;;;;2098:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2098:23:0;;2090:68;;;;-1:-1:-1;;;2090:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2867:22:0;::::1;2859:73;;;;-1:-1:-1::0;;;2859:73:0::1;;;;;;;:::i;:::-;2943:19;2953:8;2943:9;:19::i;54409:224::-:0;54511:4;-1:-1:-1;;;;;;54535:50:0;;-1:-1:-1;;;54535:50:0;;:90;;;54589:36;54613:11;54589:23;:36::i;19145:127::-;19210:4;19234:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19234:16:0;:30;;;19145:127::o;662:98::-;742:10;662:98;:::o;23127:174::-;23202:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;23202:29:0;-1:-1:-1;;;;;23202:29:0;;;;;;;;:24;;23256:23;23202:24;23256:14;:23::i;:::-;-1:-1:-1;;;;;23247:46:0;;;;;;;;;;;23127:174;;:::o;10589:114::-;10681:14;;10589:114::o;21123:382::-;-1:-1:-1;;;;;21203:16:0;;21195:61;;;;-1:-1:-1;;;21195:61:0;;;;;;;:::i;:::-;21276:16;21284:7;21276;:16::i;:::-;21275:17;21267:58;;;;-1:-1:-1;;;21267:58:0;;;;;;;:::i;:::-;21338:45;21367:1;21371:2;21375:7;21338:20;:45::i;:::-;-1:-1:-1;;;;;21396:13:0;;;;;;:9;:13;;;;;:18;;21413:1;;21396:13;:18;;21413:1;;21396:18;:::i;:::-;;;;-1:-1:-1;;21425:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;21425:21:0;-1:-1:-1;;;;;21425:21:0;;;;;;;;21464:33;;21425:16;;;21464:33;;21425:16;;21464:33;21123:382;;:::o;10711:127::-;10800:19;;10818:1;10800:19;;;10711:127::o;47991:217::-;48091:16;48099:7;48091;:16::i;:::-;48083:75;;;;-1:-1:-1;;;48083:75:0;;;;;;;:::i;:::-;48169:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;19439:348::-;19532:4;19557:16;19565:7;19557;:16::i;:::-;19549:73;;;;-1:-1:-1;;;19549:73:0;;;;;;;:::i;:::-;19633:13;19649:23;19664:7;19649:14;:23::i;:::-;19633:39;;19702:5;-1:-1:-1;;;;;19691:16:0;:7;-1:-1:-1;;;;;19691:16:0;;:51;;;;19735:7;-1:-1:-1;;;;;19711:31:0;:20;19723:7;19711:11;:20::i;:::-;-1:-1:-1;;;;;19711:31:0;;19691:51;:87;;;;19746:32;19763:5;19770:7;19746:16;:32::i;:::-;19683:96;19439:348;-1:-1:-1;;;;19439:348:0:o;22431:578::-;22590:4;-1:-1:-1;;;;;22563:31:0;:23;22578:7;22563:14;:23::i;:::-;-1:-1:-1;;;;;22563:31:0;;22555:85;;;;-1:-1:-1;;;22555:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22659:16:0;;22651:65;;;;-1:-1:-1;;;22651:65:0;;;;;;;:::i;:::-;22729:39;22750:4;22756:2;22760:7;22729:20;:39::i;:::-;22833:29;22850:1;22854:7;22833:8;:29::i;:::-;-1:-1:-1;;;;;22875:15:0;;;;;;:9;:15;;;;;:20;;22894:1;;22875:15;:20;;22894:1;;22875:20;:::i;:::-;;;;-1:-1:-1;;;;;;;22906:13:0;;;;;;:9;:13;;;;;:18;;22923:1;;22906:13;:18;;22923:1;;22906:18;:::i;:::-;;;;-1:-1:-1;;22935:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;22935:21:0;-1:-1:-1;;;;;22935:21:0;;;;;;;;;22974:27;;22935:16;;22974:27;;;;;;;22431:578;;;:::o;40827:147::-;40910:18;40923:4;40910:12;:18::i;:::-;38909:30;38920:4;38926:12;:10;:12::i;:::-;38909:10;:30::i;:::-;40941:25:::1;40952:4;40958:7;40941:10;:25::i;31843:152::-:0;31913:4;31937:50;31942:3;-1:-1:-1;;;;;31962:23:0;;31937:4;:50::i;41875:218::-;41982:12;:10;:12::i;:::-;-1:-1:-1;;;;;41971:23:0;:7;-1:-1:-1;;;;;41971:23:0;;41963:83;;;;-1:-1:-1;;;41963:83:0;;;;;;;:::i;:::-;42059:26;42071:4;42077:7;42059:11;:26::i;32171:158::-;32244:4;32268:53;32276:3;-1:-1:-1;;;;;32296:23:0;;32268:7;:53::i;2978:173::-;3053:6;;;-1:-1:-1;;;;;3070:17:0;;;-1:-1:-1;;;;;;3070:17:0;;;;;;;3103:40;;3053:6;;;3070:17;3053:6;;3103:40;;3034:16;;3103:40;2978:173;;:::o;33139:158::-;33213:7;33264:22;33268:3;33280:5;33264:3;:22::i;18517:315::-;18674:28;18684:4;18690:2;18694:7;18674:9;:28::i;:::-;18721:48;18744:4;18750:2;18754:7;18763:5;18721:22;:48::i;:::-;18713:111;;;;-1:-1:-1;;;18713:111:0;;;;;;;:::i;47156:679::-;47229:13;47263:16;47271:7;47263;:16::i;:::-;47255:78;;;;-1:-1:-1;;;47255:78:0;;;;;;;:::i;:::-;47346:23;47372:19;;;:10;:19;;;;;47346:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47402:18;47423:10;:8;:10::i;:::-;47402:31;;47515:4;47509:18;47531:1;47509:23;47505:72;;;-1:-1:-1;47556:9:0;-1:-1:-1;47549:16:0;;47505:72;47681:23;;:27;47677:108;;47756:4;47762:9;47739:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47725:48;;;;;;47677:108;47804:23;47819:7;47804:14;:23::i;32668:117::-;32731:7;32758:19;32766:3;32758:7;:19::i;41219:149::-;41303:18;41316:4;41303:12;:18::i;:::-;38909:30;38920:4;38926:12;:10;:12::i;38909:30::-;41334:26:::1;41346:4;41352:7;41334:11;:26::i;13247:305::-:0;13349:4;-1:-1:-1;;;;;;13386:40:0;;-1:-1:-1;;;13386:40:0;;:105;;-1:-1:-1;;;;;;;13443:48:0;;-1:-1:-1;;;13443:48:0;13386:105;:158;;;;13508:36;13532:11;13508:23;:36::i;77162:183::-;77294:45;77321:4;77327:2;77331:7;77294:26;:45::i;39756:497::-;39837:22;39845:4;39851:7;39837;:22::i;:::-;39832:414;;40025:41;40053:7;-1:-1:-1;;;;;40025:41:0;40063:2;40025:19;:41::i;:::-;40139:38;40167:4;40174:2;40139:19;:38::i;:::-;39930:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;39930:270:0;;;;;;;;;;-1:-1:-1;;;39876:358:0;;;;;;;:::i;43123:229::-;43198:22;43206:4;43212:7;43198;:22::i;:::-;43193:152;;43237:6;:12;;;;;;;;;;;-1:-1:-1;;;;;43237:29:0;;;;;;;;;:36;;-1:-1:-1;;43237:36:0;43269:4;43237:36;;;43320:12;:10;:12::i;:::-;-1:-1:-1;;;;;43293:40:0;43311:7;-1:-1:-1;;;;;43293:40:0;43305:4;43293:40;;;;;;;;;;43123:229;;:::o;27095:414::-;27158:4;27180:21;27190:3;27195:5;27180:9;:21::i;:::-;27175:327;;-1:-1:-1;27218:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;27401:18;;27379:19;;;:12;;;:19;;;;;;:40;;;;27434:11;;27175:327;-1:-1:-1;27485:5:0;27478:12;;43360:230;43435:22;43443:4;43449:7;43435;:22::i;:::-;43431:152;;;43506:5;43474:12;;;;;;;;;;;-1:-1:-1;;;;;43474:29:0;;;;;;;;;:37;;-1:-1:-1;;43474:37:0;;;43558:12;:10;:12::i;:::-;-1:-1:-1;;;;;43531:40:0;43549:7;-1:-1:-1;;;;;43531:40:0;43543:4;43531:40;;;;;;;;;;43360:230;;:::o;27685:1420::-;27751:4;27890:19;;;:12;;;:19;;;;;;27926:15;;27922:1176;;28301:21;28325:14;28338:1;28325:10;:14;:::i;:::-;28374:18;;28301:38;;-1:-1:-1;28354:17:0;;28374:22;;28395:1;;28374:22;:::i;:::-;28354:42;;28430:13;28417:9;:26;28413:405;;28464:17;28484:3;:11;;28496:9;28484:22;;;;;;-1:-1:-1;;;28484:22:0;;;;;;;;;;;;;;;;;28464:42;;28638:9;28609:3;:11;;28621:13;28609:26;;;;;;-1:-1:-1;;;28609:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;28723:23;;;:12;;;:23;;;;;:36;;;28413:405;28899:17;;:3;;:17;;;-1:-1:-1;;;28899:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;28994:3;:12;;:19;29007:5;28994:19;;;;;;;;;;;28987:26;;;29037:4;29030:11;;;;;;;27922:1176;29081:5;29074:12;;;;;29869:120;29936:7;29963:3;:11;;29975:5;29963:18;;;;;;-1:-1:-1;;;29963:18:0;;;;;;;;;;;;;;;;;29956:25;;29869:120;;;;:::o;23866:803::-;24021:4;24042:15;:2;-1:-1:-1;;;;;24042:13:0;;:15::i;:::-;24038:624;;;24094:2;-1:-1:-1;;;;;24078:36:0;;24115:12;:10;:12::i;:::-;24129:4;24135:7;24144:5;24078:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24078:72:0;;;;;;;;-1:-1:-1;;24078:72:0;;;;;;;;;;;;:::i;:::-;;;24074:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24324:13:0;;24320:272;;24367:60;;-1:-1:-1;;;24367:60:0;;;;;;;:::i;24320:272::-;24542:6;24536:13;24527:6;24523:2;24519:15;24512:38;24074:533;-1:-1:-1;;;;;;24201:55:0;-1:-1:-1;;;24201:55:0;;-1:-1:-1;24194:62:0;;24038:624;-1:-1:-1;24646:4:0;23866:803;;;;;;:::o;73366:110::-;73426:13;73457;73450:20;;;;;:::i;14536:334::-;14609:13;14643:16;14651:7;14643;:16::i;:::-;14635:76;;;;-1:-1:-1;;;14635:76:0;;;;;;;:::i;:::-;14724:21;14748:10;:8;:10::i;:::-;14724:34;;14800:1;14782:7;14776:21;:25;:86;;;;;;;;;;;;;;;;;14828:7;14837:18;:7;:16;:18::i;:::-;14811:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14769:93;14536:334;-1:-1:-1;;;14536:334:0:o;44404:214::-;44489:4;-1:-1:-1;;;;;;44513:57:0;;-1:-1:-1;;;44513:57:0;;:97;;;44574:36;44598:11;44574:23;:36::i;56085:589::-;56229:45;56256:4;56262:2;56266:7;56229:26;:45::i;:::-;-1:-1:-1;;;;;56291:18:0;;56287:187;;56326:40;56358:7;56326:31;:40::i;:::-;56287:187;;;56396:2;-1:-1:-1;;;;;56388:10:0;:4;-1:-1:-1;;;;;56388:10:0;;56384:90;;56415:47;56448:4;56454:7;56415:32;:47::i;:::-;-1:-1:-1;;;;;56488:16:0;;56484:183;;56521:45;56558:7;56521:36;:45::i;:::-;56484:183;;;56594:4;-1:-1:-1;;;;;56588:10:0;:2;-1:-1:-1;;;;;56588:10:0;;56584:83;;56615:40;56643:2;56647:7;56615:27;:40::i;62169:451::-;62244:13;62270:19;62302:10;62306:6;62302:1;:10;:::i;:::-;:14;;62315:1;62302:14;:::i;:::-;62292:25;;;;;;-1:-1:-1;;;62292:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62292:25:0;;62270:47;;-1:-1:-1;;;62328:6:0;62335:1;62328:9;;;;;;-1:-1:-1;;;62328:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;62328:15:0;;;;;;;;;-1:-1:-1;;;62354:6:0;62361:1;62354:9;;;;;;-1:-1:-1;;;62354:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;62354:15:0;;;;;;;;-1:-1:-1;62385:9:0;62397:10;62401:6;62397:1;:10;:::i;:::-;:14;;62410:1;62397:14;:::i;:::-;62385:26;;62380:135;62417:1;62413;:5;62380:135;;;-1:-1:-1;;;62465:5:0;62473:3;62465:11;62452:25;;;;;-1:-1:-1;;;62452:25:0;;;;;;;;;;;;62440:6;62447:1;62440:9;;;;;;-1:-1:-1;;;62440:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;62440:37:0;;;;;;;;-1:-1:-1;62502:1:0;62492:11;;;;;62420:3;;;:::i;:::-;;;62380:135;;;-1:-1:-1;62533:10:0;;62525:55;;;;-1:-1:-1;;;62525:55:0;;;;;;;:::i;29191:129::-;29264:4;29288:19;;;:12;;;;;:19;;;;;;:24;;;29191:129::o;63395:387::-;63718:20;63766:8;;;63395:387::o;60868:723::-;60924:13;61145:10;61141:53;;-1:-1:-1;61172:10:0;;;;;;;;;;;;-1:-1:-1;;;61172:10:0;;;;;;61141:53;61219:5;61204:12;61260:78;61267:9;;61260:78;;61293:8;;;;:::i;:::-;;-1:-1:-1;61316:10:0;;-1:-1:-1;61324:2:0;61316:10;;:::i;:::-;;;61260:78;;;61348:19;61380:6;61370:17;;;;;;-1:-1:-1;;;61370:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61370:17:0;;61348:39;;61398:154;61405:10;;61398:154;;61432:11;61442:1;61432:11;;:::i;:::-;;-1:-1:-1;61501:10:0;61509:2;61501:5;:10;:::i;:::-;61488:24;;:2;:24;:::i;:::-;61475:39;;61458:6;61465;61458:14;;;;;;-1:-1:-1;;;61458:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;61458:56:0;;;;;;;;-1:-1:-1;61529:11:0;61538:2;61529:11;;:::i;:::-;;;61398:154;;39031:204;39116:4;-1:-1:-1;;;;;;39140:47:0;;-1:-1:-1;;;39140:47:0;;:87;;;39191:36;39215:11;39191:23;:36::i;57397:164::-;57501:10;:17;;57474:24;;;;:15;:24;;;;;:44;;;57529:24;;;;;;;;;;;;57397:164::o;58188:988::-;58454:22;58504:1;58479:22;58496:4;58479:16;:22::i;:::-;:26;;;;:::i;:::-;58516:18;58537:26;;;:17;:26;;;;;;58454:51;;-1:-1:-1;58670:28:0;;;58666:328;;-1:-1:-1;;;;;58737:18:0;;58715:19;58737:18;;;:12;:18;;;;;;;;:34;;;;;;;;;58788:30;;;;;;:44;;;58905:30;;:17;:30;;;;;:43;;;58666:328;-1:-1:-1;59090:26:0;;;;:17;:26;;;;;;;;59083:33;;;-1:-1:-1;;;;;59134:18:0;;;;;:12;:18;;;;;:34;;;;;;;59127:41;58188:988::o;59471:1079::-;59749:10;:17;59724:22;;59749:21;;59769:1;;59749:21;:::i;:::-;59781:18;59802:24;;;:15;:24;;;;;;60175:10;:26;;59724:46;;-1:-1:-1;59802:24:0;;59724:46;;60175:26;;;;-1:-1:-1;;;60175:26:0;;;;;;;;;;;;;;;;;60153:48;;60239:11;60214:10;60225;60214:22;;;;;;-1:-1:-1;;;60214:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;60319:28;;;:15;:28;;;;;;;:41;;;60491:24;;;;;60484:31;60526:10;:16;;;;;-1:-1:-1;;;60526:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;59471:1079;;;;:::o;56975:221::-;57060:14;57077:20;57094:2;57077:16;:20::i;:::-;-1:-1:-1;;;;;57108:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;57153:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;56975:221:0:o;4805:157::-;-1:-1:-1;;;;;;4914:40:0;;-1:-1:-1;;;4914:40:0;4805:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:409:1;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:1;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:1;;537:42;;527:2;;593:1;590;583:12;608:162;675:20;;731:13;;724:21;714:32;;704:2;;760:1;757;750:12;775:233;;873:3;866:4;858:6;854:17;850:27;840:2;;895:5;888;881:20;840:2;921:81;998:3;989:6;976:20;969:4;961:6;957:17;921:81;:::i;1013:198::-;;1125:2;1113:9;1104:7;1100:23;1096:32;1093:2;;;1146:6;1138;1131:22;1093:2;1174:31;1195:9;1174:31;:::i;1216:274::-;;;1345:2;1333:9;1324:7;1320:23;1316:32;1313:2;;;1366:6;1358;1351:22;1313:2;1394:31;1415:9;1394:31;:::i;:::-;1384:41;;1444:40;1480:2;1469:9;1465:18;1444:40;:::i;:::-;1434:50;;1303:187;;;;;:::o;1495:342::-;;;;1641:2;1629:9;1620:7;1616:23;1612:32;1609:2;;;1662:6;1654;1647:22;1609:2;1690:31;1711:9;1690:31;:::i;:::-;1680:41;;1740:40;1776:2;1765:9;1761:18;1740:40;:::i;:::-;1730:50;;1827:2;1816:9;1812:18;1799:32;1789:42;;1599:238;;;;;:::o;1842:702::-;;;;;2014:3;2002:9;1993:7;1989:23;1985:33;1982:2;;;2036:6;2028;2021:22;1982:2;2064:31;2085:9;2064:31;:::i;:::-;2054:41;;2114:40;2150:2;2139:9;2135:18;2114:40;:::i;:::-;2104:50;;2201:2;2190:9;2186:18;2173:32;2163:42;;2256:2;2245:9;2241:18;2228:32;2283:18;2275:6;2272:30;2269:2;;;2320:6;2312;2305:22;2269:2;2348:22;;2401:4;2393:13;;2389:27;-1:-1:-1;2379:2:1;;2435:6;2427;2420:22;2379:2;2463:75;2530:7;2525:2;2512:16;2507:2;2503;2499:11;2463:75;:::i;:::-;2453:85;;;1972:572;;;;;;;:::o;2549:268::-;;;2675:2;2663:9;2654:7;2650:23;2646:32;2643:2;;;2696:6;2688;2681:22;2643:2;2724:31;2745:9;2724:31;:::i;:::-;2714:41;;2774:37;2807:2;2796:9;2792:18;2774:37;:::i;2822:266::-;;;2951:2;2939:9;2930:7;2926:23;2922:32;2919:2;;;2972:6;2964;2957:22;2919:2;3000:31;3021:9;3000:31;:::i;:::-;2990:41;3078:2;3063:18;;;;3050:32;;-1:-1:-1;;;2909:179:1:o;3093:1010::-;;3208:2;3251;3239:9;3230:7;3226:23;3222:32;3219:2;;;3272:6;3264;3257:22;3219:2;3317:9;3304:23;3346:18;3387:2;3379:6;3376:14;3373:2;;;3408:6;3400;3393:22;3373:2;3451:6;3440:9;3436:22;3426:32;;3496:7;3489:4;3485:2;3481:13;3477:27;3467:2;;3523:6;3515;3508:22;3467:2;3564;3551:16;3586:2;3582;3579:10;3576:2;;;3592:18;;:::i;:::-;3639:2;3635;3631:11;3621:21;;3662:27;3685:2;3681;3677:11;3662:27;:::i;:::-;3723:15;;;3754:12;;;;3786:11;;;3816;;;3812:20;;3809:33;-1:-1:-1;3806:2:1;;;3860:6;3852;3845:22;3806:2;3887:6;3878:15;;3902:171;3916:2;3913:1;3910:9;3902:171;;;3973:25;3994:3;3973:25;:::i;:::-;3961:38;;3934:1;3927:9;;;;;4019:12;;;;4051;;3902:171;;;-1:-1:-1;4092:5:1;3188:915;-1:-1:-1;;;;;;;;3188:915:1:o;4108:262::-;;;4231:2;4219:9;4210:7;4206:23;4202:32;4199:2;;;4252:6;4244;4237:22;4199:2;4280:28;4298:9;4280:28;:::i;4375:190::-;;4487:2;4475:9;4466:7;4462:23;4458:32;4455:2;;;4508:6;4500;4493:22;4455:2;-1:-1:-1;4536:23:1;;4445:120;-1:-1:-1;4445:120:1:o;4570:266::-;;;4699:2;4687:9;4678:7;4674:23;4670:32;4667:2;;;4720:6;4712;4705:22;4667:2;4761:9;4748:23;4738:33;;4790:40;4826:2;4815:9;4811:18;4790:40;:::i;4841:258::-;;;4970:2;4958:9;4949:7;4945:23;4941:32;4938:2;;;4991:6;4983;4976:22;4938:2;-1:-1:-1;;5019:23:1;;;5089:2;5074:18;;;5061:32;;-1:-1:-1;4928:171:1:o;5104:257::-;;5215:2;5203:9;5194:7;5190:23;5186:32;5183:2;;;5236:6;5228;5221:22;5183:2;5280:9;5267:23;5299:32;5325:5;5299:32;:::i;5366:261::-;;5488:2;5476:9;5467:7;5463:23;5459:32;5456:2;;;5509:6;5501;5494:22;5456:2;5546:9;5540:16;5565:32;5591:5;5565:32;:::i;5632:344::-;;5754:2;5742:9;5733:7;5729:23;5725:32;5722:2;;;5775:6;5767;5760:22;5722:2;5820:9;5807:23;5853:18;5845:6;5842:30;5839:2;;;5890:6;5882;5875:22;5839:2;5918:52;5962:7;5953:6;5942:9;5938:22;5918:52;:::i;6447:412::-;;;6586:2;6574:9;6565:7;6561:23;6557:32;6554:2;;;6607:6;6599;6592:22;6554:2;6648:9;6635:23;6625:33;;6709:2;6698:9;6694:18;6681:32;6736:18;6728:6;6725:30;6722:2;;;6773:6;6765;6758:22;6722:2;6801:52;6845:7;6836:6;6825:9;6821:22;6801:52;:::i;:::-;6791:62;;;6544:315;;;;;:::o;6864:365::-;;;6991:2;6979:9;6970:7;6966:23;6962:32;6959:2;;;7012:6;7004;6997:22;6959:2;7056:9;7043:23;7106:4;7099:5;7095:16;7088:5;7085:27;7075:2;;7131:6;7123;7116:22;7234:259;;7315:5;7309:12;7342:6;7337:3;7330:19;7358:63;7414:6;7407:4;7402:3;7398:14;7391:4;7384:5;7380:16;7358:63;:::i;:::-;7475:2;7454:15;-1:-1:-1;;7450:29:1;7441:39;;;;7482:4;7437:50;;7285:208;-1:-1:-1;;7285:208:1:o;7498:470::-;;7715:6;7709:13;7731:53;7777:6;7772:3;7765:4;7757:6;7753:17;7731:53;:::i;:::-;7847:13;;7806:16;;;;7869:57;7847:13;7806:16;7903:4;7891:17;;7869:57;:::i;:::-;7942:20;;7685:283;-1:-1:-1;;;;7685:283:1:o;7973:786::-;;8384:25;8379:3;8372:38;8439:6;8433:13;8455:62;8510:6;8505:2;8500:3;8496:12;8489:4;8481:6;8477:17;8455:62;:::i;:::-;-1:-1:-1;;;8576:2:1;8536:16;;;8568:11;;;8561:40;8626:13;;8648:63;8626:13;8697:2;8689:11;;8682:4;8670:17;;8648:63;:::i;:::-;8731:17;8750:2;8727:26;;8362:397;-1:-1:-1;;;;8362:397:1:o;8764:203::-;-1:-1:-1;;;;;8928:32:1;;;;8910:51;;8898:2;8883:18;;8865:102::o;8972:490::-;-1:-1:-1;;;;;9241:15:1;;;9223:34;;9293:15;;9288:2;9273:18;;9266:43;9340:2;9325:18;;9318:34;;;9388:3;9383:2;9368:18;;9361:31;;;8972:490;;9409:47;;9436:19;;9428:6;9409:47;:::i;:::-;9401:55;9175:287;-1:-1:-1;;;;;;9175:287:1:o;9467:187::-;9632:14;;9625:22;9607:41;;9595:2;9580:18;;9562:92::o;9659:177::-;9805:25;;;9793:2;9778:18;;9760:76::o;9841:221::-;;9990:2;9979:9;9972:21;10010:46;10052:2;10041:9;10037:18;10029:6;10010:46;:::i;10067:356::-;10269:2;10251:21;;;10288:18;;;10281:30;10347:34;10342:2;10327:18;;10320:62;10414:2;10399:18;;10241:182::o;10428:470::-;10630:2;10612:21;;;10669:2;10649:18;;;10642:30;10708:34;10703:2;10688:18;;10681:62;10779:34;10774:2;10759:18;;10752:62;-1:-1:-1;;;10845:3:1;10830:19;;10823:33;10888:3;10873:19;;10602:296::o;10903:407::-;11105:2;11087:21;;;11144:2;11124:18;;;11117:30;11183:34;11178:2;11163:18;;11156:62;-1:-1:-1;;;11249:2:1;11234:18;;11227:41;11300:3;11285:19;;11077:233::o;11315:414::-;11517:2;11499:21;;;11556:2;11536:18;;;11529:30;11595:34;11590:2;11575:18;;11568:62;-1:-1:-1;;;11661:2:1;11646:18;;11639:48;11719:3;11704:19;;11489:240::o;11734:402::-;11936:2;11918:21;;;11975:2;11955:18;;;11948:30;12014:34;12009:2;11994:18;;11987:62;-1:-1:-1;;;12080:2:1;12065:18;;12058:36;12126:3;12111:19;;11908:228::o;12141:352::-;12343:2;12325:21;;;12382:2;12362:18;;;12355:30;12421;12416:2;12401:18;;12394:58;12484:2;12469:18;;12315:178::o;12498:401::-;12700:2;12682:21;;;12739:2;12719:18;;;12712:30;12778:34;12773:2;12758:18;;12751:62;-1:-1:-1;;;12844:2:1;12829:18;;12822:35;12889:3;12874:19;;12672:227::o;12904:400::-;13106:2;13088:21;;;13145:2;13125:18;;;13118:30;13184:34;13179:2;13164:18;;13157:62;-1:-1:-1;;;13250:2:1;13235:18;;13228:34;13294:3;13279:19;;13078:226::o;13309:349::-;13511:2;13493:21;;;13550:2;13530:18;;;13523:30;13589:27;13584:2;13569:18;;13562:55;13649:2;13634:18;;13483:175::o;13663:408::-;13865:2;13847:21;;;13904:2;13884:18;;;13877:30;13943:34;13938:2;13923:18;;13916:62;-1:-1:-1;;;14009:2:1;13994:18;;13987:42;14061:3;14046:19;;13837:234::o;14076:411::-;14278:2;14260:21;;;14317:2;14297:18;;;14290:30;14356:34;14351:2;14336:18;;14329:62;-1:-1:-1;;;14422:2:1;14407:18;;14400:45;14477:3;14462:19;;14250:237::o;14492:420::-;14694:2;14676:21;;;14733:2;14713:18;;;14706:30;14772:34;14767:2;14752:18;;14745:62;14843:26;14838:2;14823:18;;14816:54;14902:3;14887:19;;14666:246::o;14917:406::-;15119:2;15101:21;;;15158:2;15138:18;;;15131:30;15197:34;15192:2;15177:18;;15170:62;-1:-1:-1;;;15263:2:1;15248:18;;15241:40;15313:3;15298:19;;15091:232::o;15328:405::-;15530:2;15512:21;;;15569:2;15549:18;;;15542:30;15608:34;15603:2;15588:18;;15581:62;-1:-1:-1;;;15674:2:1;15659:18;;15652:39;15723:3;15708:19;;15502:231::o;15738:410::-;15940:2;15922:21;;;15979:2;15959:18;;;15952:30;16018:34;16013:2;15998:18;;15991:62;-1:-1:-1;;;16084:2:1;16069:18;;16062:44;16138:3;16123:19;;15912:236::o;16153:407::-;16355:2;16337:21;;;16394:2;16374:18;;;16367:30;16433:34;16428:2;16413:18;;16406:62;-1:-1:-1;;;16499:2:1;16484:18;;16477:41;16550:3;16535:19;;16327:233::o;16565:405::-;16767:2;16749:21;;;16806:2;16786:18;;;16779:30;16845:34;16840:2;16825:18;;16818:62;-1:-1:-1;;;16911:2:1;16896:18;;16889:39;16960:3;16945:19;;16739:231::o;16975:356::-;17177:2;17159:21;;;17196:18;;;17189:30;17255:34;17250:2;17235:18;;17228:62;17322:2;17307:18;;17149:182::o;17336:413::-;17538:2;17520:21;;;17577:2;17557:18;;;17550:30;17616:34;17611:2;17596:18;;17589:62;-1:-1:-1;;;17682:2:1;17667:18;;17660:47;17739:3;17724:19;;17510:239::o;17754:408::-;17956:2;17938:21;;;17995:2;17975:18;;;17968:30;18034:34;18029:2;18014:18;;18007:62;-1:-1:-1;;;18100:2:1;18085:18;;18078:42;18152:3;18137:19;;17928:234::o;18167:356::-;18369:2;18351:21;;;18388:18;;;18381:30;18447:34;18442:2;18427:18;;18420:62;18514:2;18499:18;;18341:182::o;18528:405::-;18730:2;18712:21;;;18769:2;18749:18;;;18742:30;18808:34;18803:2;18788:18;;18781:62;-1:-1:-1;;;18874:2:1;18859:18;;18852:39;18923:3;18908:19;;18702:231::o;18938:411::-;19140:2;19122:21;;;19179:2;19159:18;;;19152:30;19218:34;19213:2;19198:18;;19191:62;-1:-1:-1;;;19284:2:1;19269:18;;19262:45;19339:3;19324:19;;19112:237::o;19354:490::-;19556:2;19538:21;;;19595:2;19575:18;;;19568:30;19634:34;19629:2;19614:18;;19607:62;19705:34;19700:2;19685:18;;19678:62;-1:-1:-1;;;19771:3:1;19756:19;;19749:53;19834:3;19819:19;;19528:316::o;19849:397::-;20051:2;20033:21;;;20090:2;20070:18;;;20063:30;20129:34;20124:2;20109:18;;20102:62;-1:-1:-1;;;20195:2:1;20180:18;;20173:31;20236:3;20221:19;;20023:223::o;20251:413::-;20453:2;20435:21;;;20492:2;20472:18;;;20465:30;20531:34;20526:2;20511:18;;20504:62;-1:-1:-1;;;20597:2:1;20582:18;;20575:47;20654:3;20639:19;;20425:239::o;20669:408::-;20871:2;20853:21;;;20910:2;20890:18;;;20883:30;20949:34;20944:2;20929:18;;20922:62;-1:-1:-1;;;21015:2:1;21000:18;;20993:42;21067:3;21052:19;;20843:234::o;21082:411::-;21284:2;21266:21;;;21323:2;21303:18;;;21296:30;21362:34;21357:2;21342:18;;21335:62;-1:-1:-1;;;21428:2:1;21413:18;;21406:45;21483:3;21468:19;;21256:237::o;21680:251::-;21750:2;21744:9;21780:17;;;21827:18;21812:34;;21848:22;;;21809:62;21806:2;;;21874:18;;:::i;:::-;21910:2;21903:22;21724:207;;-1:-1:-1;21724:207:1:o;21936:128::-;;22007:1;22003:6;22000:1;21997:13;21994:2;;;22013:18;;:::i;:::-;-1:-1:-1;22049:9:1;;21984:80::o;22069:120::-;;22135:1;22125:2;;22140:18;;:::i;:::-;-1:-1:-1;22174:9:1;;22115:74::o;22194:168::-;;22300:1;22296;22292:6;22288:14;22285:1;22282:21;22277:1;22270:9;22263:17;22259:45;22256:2;;;22307:18;;:::i;:::-;-1:-1:-1;22347:9:1;;22246:116::o;22367:125::-;;22435:1;22432;22429:8;22426:2;;;22440:18;;:::i;:::-;-1:-1:-1;22477:9:1;;22416:76::o;22497:258::-;22569:1;22579:113;22593:6;22590:1;22587:13;22579:113;;;22669:11;;;22663:18;22650:11;;;22643:39;22615:2;22608:10;22579:113;;;22710:6;22707:1;22704:13;22701:2;;;-1:-1:-1;;22745:1:1;22727:16;;22720:27;22550:205::o;22760:136::-;;22827:5;22817:2;;22836:18;;:::i;:::-;-1:-1:-1;;;22872:18:1;;22807:89::o;22901:380::-;22986:1;22976:12;;23033:1;23023:12;;;23044:2;;23098:4;23090:6;23086:17;23076:27;;23044:2;23151;23143:6;23140:14;23120:18;23117:38;23114:2;;;23197:10;23192:3;23188:20;23185:1;23178:31;23232:4;23229:1;23222:15;23260:4;23257:1;23250:15;23114:2;;22956:325;;;:::o;23286:135::-;;-1:-1:-1;;23346:17:1;;23343:2;;;23366:18;;:::i;:::-;-1:-1:-1;23413:1:1;23402:13;;23333:88::o;23426:112::-;;23484:1;23474:2;;23489:18;;:::i;:::-;-1:-1:-1;23523:9:1;;23464:74::o;23543:127::-;23604:10;23599:3;23595:20;23592:1;23585:31;23635:4;23632:1;23625:15;23659:4;23656:1;23649:15;23675:127;23736:10;23731:3;23727:20;23724:1;23717:31;23767:4;23764:1;23757:15;23791:4;23788:1;23781:15;23807:127;23868:10;23863:3;23859:20;23856:1;23849:31;23899:4;23896:1;23889:15;23923:4;23920:1;23913:15;23939:133;-1:-1:-1;;;;;;24015:32:1;;24005:43;;23995:2;;24062:1;24059;24052:12

Swarm Source

ipfs://e5499d0d0ec0caf5f5b8fcd6f19e06ad8283d8f8ddbf5f399db35663cb25fc97
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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