ETH Price: $3,473.04 (+1.58%)
Gas: 10 Gwei

Token

Collectors Club Founders Key (CCFK)
 

Overview

Max Total Supply

1,224 CCFK

Holders

214

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 CCFK
0xbb0173c0e8d5919e0a6a4066a1c506b16748e2d1
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:
CCFoundersKeys

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-16
*/

// SPDX-License-Identifier: MIT

// File: contracts/MerkleProof.sol


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

pragma solidity ^0.8.0;

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

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: contracts/IWhitelistable.sol



/**
* Author: Lambdalf the White
* Edit  : Squeebo
*/

pragma solidity 0.8.10;


abstract contract IWhitelistable {
	// Errors
	error IWhitelistable_NOT_SET();
	error IWhitelistable_CONSUMED();
	error IWhitelistable_FORBIDDEN();
	error IWhitelistable_NO_ALLOWANCE();

	bytes32 private _root;
	mapping( address => uint256 ) private _consumed;

	modifier isWhitelisted( address account_, bytes32[] memory proof_, uint256 passMax_, uint256 qty_ ) {
		if ( qty_ > passMax_ ) {
			revert IWhitelistable_FORBIDDEN();
		}

		uint256 _allowed_ = _checkWhitelistAllowance( account_, proof_, passMax_ );

		if ( _allowed_ < qty_ ) {
			revert IWhitelistable_FORBIDDEN();
		}

		_;
	}

	/**
	* @dev Sets the pass to protect the whitelist.
	*/
	function _setWhitelist( bytes32 root_ ) internal virtual {
		_root = root_;
	}

	/**
	* @dev Returns the amount that `account_` is allowed to access from the whitelist.
	* 
	* Requirements:
	* 
	* - `_root` must be set.
	* 
	* See {IWhitelistable-_consumeWhitelist}.
	*/
	function _checkWhitelistAllowance( address account_, bytes32[] memory proof_, uint256 passMax_ ) internal view returns ( uint256 ) {
		if ( _root == 0 ) {
			revert IWhitelistable_NOT_SET();
		}

		if ( _consumed[ account_ ] >= passMax_ ) {
			revert IWhitelistable_CONSUMED();
		}

		if ( ! _computeProof( account_, proof_ ) ) {
			revert IWhitelistable_FORBIDDEN();
		}

		uint256 _res_;
		unchecked {
			_res_ = passMax_ - _consumed[ account_ ];
		}

		return _res_;
	}

	function _computeProof( address account_, bytes32[] memory proof_ ) private view returns ( bool ) {
		bytes32 leaf = keccak256(abi.encodePacked(account_));
		return MerkleProof.processProof( proof_, leaf ) == _root;
	}

	/**
	* @dev Consumes `amount_` pass passes from `account_`.
	* 
	* Note: Before calling this function, eligibility should be checked through {IWhitelistable-checkWhitelistAllowance}.
	*/
	function _consumeWhitelist( address account_, uint256 qty_ ) internal {
		unchecked {
			_consumed[ account_ ] += qty_;
		}
	}
}

// File: contracts/ITradable.sol



/**
* Author: Lambdalf the White
*/

pragma solidity 0.8.10;

contract OwnableDelegateProxy {}

contract ProxyRegistry {
	mapping( address => OwnableDelegateProxy ) public proxies;
}

abstract contract ITradable {
	// OpenSea proxy registry address
	address[] internal _proxyRegistries;

	function _setProxyRegistry( address proxyRegistryAddress_ ) internal {
		_proxyRegistries.push( proxyRegistryAddress_ );
	}

	/**
	* @dev Checks if `operator_` is the registered proxy for `tokenOwner_`.
	* 
	* Note: Use this function to allow whitelisting of registered proxy.
	*/
	function _isRegisteredProxy( address tokenOwner_, address operator_ ) internal view returns ( bool ) {
		for ( uint256 i; i < _proxyRegistries.length; i++ ) {
			ProxyRegistry _proxyRegistry_ = ProxyRegistry( _proxyRegistries[ i ] );
			if ( address( _proxyRegistry_.proxies( tokenOwner_ ) ) == operator_ ) {
				return true;
			}
		}
		return false;
	}
}
// File: contracts/IPausable.sol



/**
* Author: Lambdalf the White
*/

pragma solidity 0.8.10;

abstract contract IPausable {
	// Errors
	error IPausable_SALE_NOT_CLOSED();
	error IPausable_SALE_NOT_OPEN();
	error IPausable_PRESALE_NOT_OPEN();

	// Enum to represent the sale state, defaults to ``CLOSED``.
	enum SaleState { CLOSED, PRESALE, SALE }

	// The current state of the contract
	SaleState public saleState;

	/**
	* @dev Emitted when the sale state changes
	*/
	event SaleStateChanged( SaleState indexed previousState, SaleState indexed newState );

	/**
	* @dev Sale state can have one of 3 values, ``CLOSED``, ``PRESALE``, or ``SALE``.
	*/
	function _setSaleState( SaleState newState_ ) internal virtual {
		SaleState _previousState_ = saleState;
		saleState = newState_;
		emit SaleStateChanged( _previousState_, newState_ );
	}

	/**
	* @dev Throws if sale state is not ``CLOSED``.
	*/
	modifier saleClosed {
		if ( saleState != SaleState.CLOSED ) {
			revert IPausable_SALE_NOT_CLOSED();
		}
		_;
	}

	/**
	* @dev Throws if sale state is not ``SALE``.
	*/
	modifier saleOpen {
		if ( saleState != SaleState.SALE ) {
			revert IPausable_SALE_NOT_OPEN();
		}
		_;
	}

	/**
	* @dev Throws if sale state is not ``PRESALE``.
	*/
	modifier presaleOpen {
		if ( saleState != SaleState.PRESALE ) {
			revert IPausable_PRESALE_NOT_OPEN();
		}
		_;
	}
}

// File: contracts/IOwnable.sol



/**
* Author: Lambdalf the White
*/

pragma solidity 0.8.10;

/**
* @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 IOwnable {
	// Errors
	error IOwnable_NOT_OWNER();

	// The owner of the contract
	address private _owner;

	/**
	* @dev Emitted when contract ownership changes.
	*/
	event OwnershipTransferred( address indexed previousOwner, address indexed newOwner );

	/**
	* @dev Initializes the contract setting the deployer as the initial owner.
	*/
	function _initIOwnable( address owner_ ) internal {
		_owner = owner_;
	}

	/**
	* @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() {
		if ( owner() != msg.sender ) {
			revert IOwnable_NOT_OWNER();
		}
		_;
	}

	/**
	* @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 {
		address _oldOwner_ = _owner;
		_owner = newOwner_;
		emit OwnershipTransferred( _oldOwner_, newOwner_ );
	}
}

// File: contracts/IERC2981.sol


pragma solidity 0.8.10;

interface IERC2981 {
  /**
  * @dev ERC165 bytes to add to interface array - set in parent contract
  * implementing this standard
  *
  * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
  * bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
  * _registerInterface(_INTERFACE_ID_ERC2981);
  *
  * @notice Called with the sale price to determine how much royalty
  *           is owed and to whom.
  * @param _tokenId - the NFT asset queried for royalty information
  * @param _salePrice - the sale price of the NFT asset specified by _tokenId
  * @return receiver - address of who should be sent the royalty payment
  * @return royaltyAmount - the royalty payment amount for _salePrice
  */
  function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount);
}

// File: contracts/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: contracts/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: contracts/IERC165.sol


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

pragma solidity 0.8.10;

/**
 * @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: contracts/ERC2981Base.sol



/**
* Author: Lambdalf the White
*/

pragma solidity 0.8.10;



abstract contract ERC2981Base is IERC165, IERC2981 {
	// Errors
	error IERC2981_INVALID_ROYALTIES();

	// Royalty rate is stored out of 10,000 instead of a percentage to allow for
	// up to two digits below the unit such as 2.5% or 1.25%.
	uint private constant ROYALTY_BASE = 10000;

	// Represents the percentage of royalties on each sale on secondary markets.
	// Set to 0 to have no royalties.
	uint256 private _royaltyRate;

	// Address of the recipient of the royalties.
	address private _royaltyRecipient;

	function _initERC2981Base( address royaltyRecipient_, uint256 royaltyRate_ ) internal {
		_setRoyaltyInfo( royaltyRecipient_, royaltyRate_ );
	}

	/**
	* @dev See {IERC2981-royaltyInfo}.
	* 
	* Note: This function should be overriden to revert on a query for non existent token.
	*/
	function royaltyInfo( uint256, uint256 salePrice_ ) public view virtual override returns ( address, uint256 ) {
		if ( salePrice_ == 0 || _royaltyRate == 0 ) {
			return ( _royaltyRecipient, 0 );
		}
		uint256 _royaltyAmount_ = _royaltyRate * salePrice_ / ROYALTY_BASE;
		return ( _royaltyRecipient, _royaltyAmount_ );
	}

	/**
	* @dev Sets the royalty rate to `royaltyRate_` and the royalty recipient to `royaltyRecipient_`.
	* 
	* Requirements: 
	* 
	* - `royaltyRate_` cannot be higher than `ROYALTY_BASE`;
	*/
	function _setRoyaltyInfo( address royaltyRecipient_, uint256 royaltyRate_ ) internal virtual {
		if ( royaltyRate_ > ROYALTY_BASE ) {
			revert IERC2981_INVALID_ROYALTIES();
		}
		_royaltyRate      = royaltyRate_;
		_royaltyRecipient = royaltyRecipient_;
	}

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

// File: contracts/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/ERC721Batch.sol



/**
* Author: Lambdalf the White
*/

pragma solidity 0.8.10;




/**
* @dev Required interface of an ERC721 compliant contract.
*/
abstract contract ERC721Batch is Context, IERC721Metadata {
	// Errors
	error IERC721_APPROVE_OWNER();
	error IERC721_APPROVE_CALLER();
	error IERC721_CALLER_NOT_APPROVED();
	error IERC721_NONEXISTANT_TOKEN();
	error IERC721_NON_ERC721_RECEIVER();
	error IERC721_NULL_ADDRESS_BALANCE();
	error IERC721_NULL_ADDRESS_TRANSFER();

	// Token name
	string private _name;

	// Token symbol
	string private _symbol;

	// Token Base URI
	string private _baseURI;

	// Token IDs
	uint256 private _numTokens;

	// List of owner addresses
	mapping( uint256 => address ) private _owners;

	// 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 Ensures the token exist. 
	* A token exists if it has been minted and is not owned by the null address.
	* 
	* @param tokenId_ uint256 ID of the token to verify
	*/
	modifier exists( uint256 tokenId_ ) {
		if ( ! _exists( tokenId_ ) ) {
			revert IERC721_NONEXISTANT_TOKEN();
		}
		_;
	}

	// **************************************
	// *****          INTERNAL          *****
	// **************************************
		/**
		* @dev Internal function returning the number of tokens in `tokenOwner_`'s account.
		*/
		function _balanceOf( address tokenOwner_ ) internal view virtual returns ( uint256 ) {
			if ( tokenOwner_ == address( 0 ) ) {
				return 0;
			}

			uint256 _supplyMinted_ = _supplyMinted();
			uint256 _count_ = 0;
			address _currentTokenOwner_;
			for ( uint256 i; i < _supplyMinted_; i++ ) {
				if ( _owners[ i ] != address( 0 ) ) {
					_currentTokenOwner_ = _owners[ i ];
				}
				if ( tokenOwner_ == _currentTokenOwner_ ) {
					_count_++;
				}
			}
			return _count_;
		}

		/**
		* @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_ ) internal virtual 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.
			// 
			// IMPORTANT
			// It is unsafe to assume that an address not flagged by this method
			// is an externally-owned account (EOA) and not a contract.
			//
			// Among others, the following types of addresses will not be flagged:
			//
			//  - 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
			uint256 _size_;
			assembly {
				_size_ := extcodesize( to_ )
			}

			// If address is a contract, check that it is aware of how to handle ERC721 tokens
			if ( _size_ > 0 ) {
				try IERC721Receiver( to_ ).onERC721Received( _msgSender(), from_, tokenId_, data_ ) returns ( bytes4 retval ) {
					return retval == IERC721Receiver.onERC721Received.selector;
				}
				catch ( bytes memory reason ) {
					if ( reason.length == 0 ) {
						revert IERC721_NON_ERC721_RECEIVER();
					}
					else {
						assembly {
							revert( add( 32, reason ), mload( reason ) )
						}
					}
				}
			}
			else {
				return true;
			}
		}

		/**
		* @dev Internal function returning whether a token exists. 
		* A token exists if it has been minted and is not owned by the null address.
		* 
		* @param tokenId_ uint256 ID of the token to verify
		* 
		* @return bool whether the token exists
		*/
		function _exists( uint256 tokenId_ ) internal view virtual returns ( bool ) {
			return tokenId_ < _numTokens;
		}

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

		/**
		* @dev Internal function returning whether `operator_` is allowed 
		* to manage tokens on behalf of `tokenOwner_`.
		* 
		* @param tokenOwner_ address that owns tokens
		* @param operator_ address that tries to manage tokens
		* 
		* @return bool whether `operator_` is allowed to handle the token
		*/
		function _isApprovedForAll( address tokenOwner_, address operator_ ) internal view virtual returns ( bool ) {
			return _operatorApprovals[ tokenOwner_ ][ operator_ ];
		}

		/**
		* @dev Internal function returning whether `operator_` is allowed to handle `tokenId_`
		* 
		* Note: To avoid multiple checks for the same data, it is assumed that existence of `tokeId_` 
		* has been verified prior via {_exists}
		* If it hasn't been verified, this function might panic
		* 
		* @param operator_ address that tries to handle the token
		* @param tokenId_ uint256 ID of the token to be handled
		* 
		* @return bool whether `operator_` is allowed to handle the token
		*/
		function _isApprovedOrOwner( address tokenOwner_, address operator_, uint256 tokenId_ ) internal view virtual returns ( bool ) {
			bool _isApproved_ = operator_ == tokenOwner_ ||
													operator_ == _tokenApprovals[ tokenId_ ] ||
													_isApprovedForAll( tokenOwner_, operator_ );
			return _isApproved_;
		}

		/**
		* @dev Mints `qty_` tokens and transfers them to `to_`.
		* 
		* This internal function can be used to perform token minting.
		* 
		* Emits a {ConsecutiveTransfer} event.
		*/
		function _mint( address to_, uint256 qty_ ) internal virtual {
			uint256 _firstToken_ = _numTokens;
			uint256 _lastToken_ = _firstToken_ + qty_ - 1;

			_owners[ _firstToken_ ] = to_;
			if ( _lastToken_ > _firstToken_ ) {
				_owners[ _lastToken_ ] = to_;
			}
			for ( uint256 i; i < qty_; i ++ ) {
				emit Transfer( address( 0 ), to_, _firstToken_ + i );
			}
			_numTokens = _lastToken_ + 1;
		}

		/**
		* @dev Internal function returning the owner of the `tokenId_` token.
		* 
		* @param tokenId_ uint256 ID of the token to verify
		* 
		* @return address the address of the token owner
		*/
		function _ownerOf( uint256 tokenId_ ) internal view virtual returns ( address ) {
			uint256 _tokenId_ = tokenId_;
			address _tokenOwner_ = _owners[ _tokenId_ ];
			while ( _tokenOwner_ == address( 0 ) ) {
				_tokenId_ --;
				_tokenOwner_ = _owners[ _tokenId_ ];
			}

			return _tokenOwner_;
		}

		/**
		* @dev Internal function used to set the base URI of the collection.
		*/
		function _setBaseURI( string memory baseURI_ ) internal virtual {
			_baseURI = baseURI_;
		}

		/**
		* @dev Internal function returning the total number of tokens minted
		* 
		* @return uint256 the number of tokens that have been minted so far
		*/
		function _supplyMinted() internal view virtual returns ( uint256 ) {
			return _numTokens;
		}

		/**
		* @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 Transfers `tokenId_` from `from_` to `to_`.
		*
		* This internal function can be used to implement alternative mechanisms to perform 
		* token transfer, such as signature-based, or token burning.
		* 
		* Emits a {Transfer} event.
		*/
		function _transfer( address from_, address to_, uint256 tokenId_ ) internal virtual {
			_tokenApprovals[ tokenId_ ] = address( 0 );
			uint256 _previousId_ = tokenId_ > 0 ? tokenId_ - 1 : 0;
			uint256 _nextId_     = tokenId_ + 1;
			bool _previousShouldUpdate_ = _previousId_ < tokenId_ &&
																		_exists( _previousId_ ) &&
																		_owners[ _previousId_ ] == address( 0 );
			bool _nextShouldUpdate_ = _exists( _nextId_ ) &&
																_owners[ _nextId_ ] == address( 0 );

			if ( _previousShouldUpdate_ ) {
				_owners[ _previousId_ ] = from_;
			}

			if ( _nextShouldUpdate_ ) {
				_owners[ _nextId_ ] = from_;
			}

			_owners[ tokenId_ ] = to_;

			emit Transfer( from_, to_, tokenId_ );
		}

	// **************************************
	// *****           PUBLIC           *****
	// **************************************
		/**
		* @dev See {IERC721-approve}.
		*/
		function approve( address to_, uint256 tokenId_ ) external virtual exists( tokenId_ ) {
			address _operator_ = _msgSender();
			address _tokenOwner_ = _ownerOf( tokenId_ );
			bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ );

			if ( ! _isApproved_ ) {
				revert IERC721_CALLER_NOT_APPROVED();
			}

			if ( to_ == _tokenOwner_ ) {
				revert IERC721_APPROVE_OWNER();
			}

			_tokenApprovals[ tokenId_ ] = to_;
			emit Approval( _tokenOwner_, to_, tokenId_ );
		}

		/**
		* @dev See {IERC721-safeTransferFrom}.
		* 
		* Note: We can ignore `from_` as we can compare everything to the actual token owner, 
		* but we cannot remove this parameter to stay in conformity with IERC721
		*/
		function safeTransferFrom( address, address to_, uint256 tokenId_ ) external virtual exists( tokenId_ ) {
			address _operator_ = _msgSender();
			address _tokenOwner_ = _ownerOf( tokenId_ );
			bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ );

			if ( ! _isApproved_ ) {
				revert IERC721_CALLER_NOT_APPROVED();
			}

			if ( to_ == address( 0 ) ) {
				revert IERC721_NULL_ADDRESS_TRANSFER();
			}

			_transfer( _tokenOwner_, to_, tokenId_ );

			if ( ! _checkOnERC721Received( _tokenOwner_, to_, tokenId_, "" ) ) {
				revert IERC721_NON_ERC721_RECEIVER();
			}
		}

		/**
		* @dev See {IERC721-safeTransferFrom}.
		* 
		* Note: We can ignore `from_` as we can compare everything to the actual token owner, 
		* but we cannot remove this parameter to stay in conformity with IERC721
		*/
		function safeTransferFrom( address, address to_, uint256 tokenId_, bytes calldata data_ ) external virtual exists( tokenId_ ) {
			address _operator_ = _msgSender();
			address _tokenOwner_ = _ownerOf( tokenId_ );
			bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ );

			if ( ! _isApproved_ ) {
				revert IERC721_CALLER_NOT_APPROVED();
			}

			if ( to_ == address( 0 ) ) {
				revert IERC721_NULL_ADDRESS_TRANSFER();
			}

			_transfer( _tokenOwner_, to_, tokenId_ );

			if ( ! _checkOnERC721Received( _tokenOwner_, to_, tokenId_, data_ ) ) {
				revert IERC721_NON_ERC721_RECEIVER();
			}
		}

		/**
		* @dev See {IERC721-setApprovalForAll}.
		*/
		function setApprovalForAll( address operator_, bool approved_ ) public virtual override {
			address _account_ = _msgSender();
			if ( operator_ == _account_ ) {
				revert IERC721_APPROVE_CALLER();
			}

			_operatorApprovals[ _account_ ][ operator_ ] = approved_;
			emit ApprovalForAll( _account_, operator_, approved_ );
		}

		/**
		* @dev See {IERC721-transferFrom}.
		* 
		* Note: We can ignore `from_` as we can compare everything to the actual token owner, 
		* but we cannot remove this parameter to stay in conformity with IERC721
		*/
		function transferFrom( address, address to_, uint256 tokenId_ ) external virtual exists( tokenId_ ) {
			address _operator_ = _msgSender();
			address _tokenOwner_ = _ownerOf( tokenId_ );
			bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ );

			if ( ! _isApproved_ ) {
				revert IERC721_CALLER_NOT_APPROVED();
			}

			if ( to_ == address( 0 ) ) {
				revert IERC721_NULL_ADDRESS_TRANSFER();
			}

			_transfer( _tokenOwner_, to_, tokenId_ );
		}

	// **************************************
	// *****            VIEW            *****
	// **************************************
		/**
		* @dev Returns the number of tokens in `tokenOwner_`'s account.
		*/
		function balanceOf( address tokenOwner_ ) external view virtual returns ( uint256 ) {
			return _balanceOf( tokenOwner_ );
		}

		/**
		* @dev Returns the account approved for `tokenId_` token.
		*
		* Requirements:
		*
		* - `tokenId_` must exist.
		*/
		function getApproved( uint256 tokenId_ ) external view virtual exists( tokenId_ ) returns ( address ) {
			return _tokenApprovals[ tokenId_ ];
		}

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

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

		/**
		* @dev Returns the owner of the `tokenId_` token.
		*
		* Requirements:
		*
		* - `tokenId_` must exist.
		*/
		function ownerOf( uint256 tokenId_ ) external view virtual exists( tokenId_ ) returns ( address ) {
			return _ownerOf( tokenId_ );
		}

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

		/**
		* @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 exists( tokenId_ ) returns ( string memory ) {
			return bytes( _baseURI ).length > 0 ? string( abi.encodePacked( _baseURI, _toString( tokenId_ ) ) ) : _toString( tokenId_ );
		}
}

// File: contracts/ERC721BatchStakable.sol



/**
* Author: Lambdalf the White
*/

pragma solidity 0.8.10;



/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension and the Enumerable extension.
* 
* Note: This implementation is only compatible with a sequential order of tokens minted.
* If you need to mint tokens in a random order, you will need to override the following functions:
* Note also that this implementations is fairly inefficient and as such, 
* those functions should be avoided inside non-view functions.
*/
abstract contract ERC721BatchStakable is ERC721Batch, IERC721Receiver {
	// Mapping of tokenId to stakeholder address
	mapping( uint256 => address ) internal _stakedOwners;

	// **************************************
	// *****          INTERNAL          *****
	// **************************************
		/**
		* @dev Internal function returning the number of tokens staked by `tokenOwner_`.
		*/
		function _balanceOfStaked( address tokenOwner_ ) internal view virtual returns ( uint256 ) {
			if ( tokenOwner_ == address( 0 ) ) {
				return 0;
			}

			uint256 _supplyMinted_ = _supplyMinted();
			uint256 _count_ = 0;
			for ( uint256 i; i < _supplyMinted_; i++ ) {
				if ( _stakedOwners[ i ] == tokenOwner_ ) {
					_count_++;
				}
			}
			return _count_;
		}

		/**
		* @dev Internal function that mints `qtyMinted_` tokens and stakes `qtyStaked_` of them to the count of `tokenOwner_`.
		*/
		function _mintAndStake( address tokenOwner_, uint256 qtyMinted_, uint256 qtyStaked_ ) internal {
			uint256 _qtyNotStaked_;
			uint256 _qtyStaked_ = qtyStaked_;
			if ( qtyStaked_ > qtyMinted_ ) {
				_qtyStaked_ = qtyMinted_;
			}
			else if ( qtyStaked_ < qtyMinted_ ) {
				_qtyNotStaked_ = qtyMinted_ - qtyStaked_;
			}
			if ( _qtyStaked_ > 0 ) {
				_mintInContract( tokenOwner_, _qtyStaked_ );
			}
			if ( _qtyNotStaked_ > 0 ) {
				_mint( tokenOwner_, _qtyNotStaked_ );
			}
		}

		/**
		* @dev Internal function that mints `qtyStaked_` tokens and stakes them to the count of `tokenOwner_`.
		*/
		function _mintInContract( address tokenOwner_, uint256 qtyStaked_ ) internal {
			uint256 _currentToken_ = _supplyMinted();
			uint256 _lastToken_ = _currentToken_ + qtyStaked_ - 1;

			while ( _currentToken_ <= _lastToken_ ) {
				_stakedOwners[ _currentToken_ ] = tokenOwner_;
				_currentToken_ ++;
			}

			_mint( address( this ), qtyStaked_ );
		}

		/**
		* @dev Internal function returning the owner of the staked token number `tokenId_`.
		*
		* Requirements:
		*
		* - `tokenId_` must exist.
		*/
		function _ownerOfStaked( uint256 tokenId_ ) internal view virtual returns ( address ) {
			return _stakedOwners[ tokenId_ ];
		}

		/**
		* @dev Internal function that stakes the token number `tokenId_` to the count of `tokenOwner_`.
		*/
		function _stake( address tokenOwner_, uint256 tokenId_ ) internal {
			_stakedOwners[ tokenId_ ] = tokenOwner_;
			_transfer( tokenOwner_, address( this ), tokenId_ );
		}

		/**
		* @dev Internal function that unstakes the token `tokenId_` and transfers it back to `tokenOwner_`.
		*/
		function _unstake( address tokenOwner_, uint256 tokenId_ ) internal {
			_transfer( address( this ), tokenOwner_, tokenId_ );
			delete _stakedOwners[ tokenId_ ];
		}
	// **************************************

	// **************************************
	// *****           PUBLIC           *****
	// **************************************
		/**
		* @dev Stakes the token `tokenId_` to the count of its owner.
		* 
		* Requirements:
		* 
		* - Caller must be allowed to manage `tokenId_` or its owner's tokens.
		* - `tokenId_` must exist.
		*/
		function stake( uint256 tokenId_ ) external exists( tokenId_ ) {
			address _operator_ = _msgSender();
			address _tokenOwner_ = _ownerOf( tokenId_ );
			bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ );

			if ( ! _isApproved_ ) {
				revert IERC721_CALLER_NOT_APPROVED();
			}
			_stake( _tokenOwner_, tokenId_ );
		}

		/**
		* @dev Unstakes the token `tokenId_` and returns it to its owner.
		* 
		* Requirements:
		* 
		* - Caller must be allowed to manage `tokenId_` or its owner's tokens.
		* - `tokenId_` must exist.
		*/
		function unstake( uint256 tokenId_ ) external exists( tokenId_ ) {
			address _operator_ = _msgSender();
			address _tokenOwner_ = _ownerOfStaked( tokenId_ );
			bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ );

			if ( ! _isApproved_ ) {
				revert IERC721_CALLER_NOT_APPROVED();
			}
			_unstake( _tokenOwner_, tokenId_ );
		}
	// **************************************

	// **************************************
	// *****            VIEW            *****
	// **************************************
		/**
		* @dev Returns the number of tokens owned by `tokenOwner_`.
		*/
		function balanceOf( address tokenOwner_ ) public view virtual override returns ( uint256 balance ) {
			return _balanceOfStaked( tokenOwner_ ) + _balanceOf( tokenOwner_ );
		}

		/**
		* @dev Returns the number of tokens staked by `tokenOwner_`.
		*/
		function balanceOfStaked( address tokenOwner_ ) public view virtual returns ( uint256 ) {
			return _balanceOfStaked( tokenOwner_ );
		}

		/**
		* @dev Returns the owner of token number `tokenId_`.
		*
		* Requirements:
		*
		* - `tokenId_` must exist.
		*/
		function ownerOf( uint256 tokenId_ ) public view virtual override exists( tokenId_ ) returns ( address ) {
			address _tokenOwner_ = _ownerOf( tokenId_ );
			if ( _tokenOwner_ == address( this ) ) {
				return _ownerOfStaked( tokenId_ );
			}
			return _tokenOwner_;
		}

		/**
		* @dev Returns the owner of staked token number `tokenId_`.
		*
		* Requirements:
		*
		* - `tokenId_` must exist.
		*/
		function ownerOfStaked( uint256 tokenId_ ) public view virtual exists( tokenId_ ) returns ( address ) {
			return _ownerOfStaked( tokenId_ );
		}
	// **************************************

	// **************************************
	// *****            PURE            *****
	// **************************************
		/**
		* @dev Signals that this contract knows how to handle ERC721 tokens.
		*/
		function onERC721Received( address, address, uint256, bytes memory ) public override pure returns ( bytes4 ) {
			return type( IERC721Receiver ).interfaceId;
		}
	// **************************************
}

// File: contracts/IERC721Enumerable.sol


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

    /**
     * @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: contracts/ERC721BatchEnumerable.sol



/**
* Author: Lambdalf the White
*/

pragma solidity 0.8.10;



/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension and the Enumerable extension.
* 
* Note: This implementation is only compatible with a sequential order of tokens minted.
* If you need to mint tokens in a random order, you will need to override the following functions:
* Note also that this implementations is fairly inefficient and as such, 
* those functions should be avoided inside non-view functions.
*/
abstract contract ERC721BatchEnumerable is ERC721Batch, IERC721Enumerable {
	// Errors
	error IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS();
	error IERC721Enumerable_INDEX_OUT_OF_BOUNDS();

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

	/**
	* @dev See {IERC721Enumerable-tokenByIndex}.
	*/
	function tokenByIndex( uint256 index_ ) public view virtual override returns ( uint256 ) {
		if ( index_ >= _supplyMinted() ) {
			revert IERC721Enumerable_INDEX_OUT_OF_BOUNDS();
		}
		return index_;
	}

	/**
	* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
	*/
	function tokenOfOwnerByIndex( address tokenOwner_, uint256 index_ ) public view virtual override returns ( uint256 tokenId ) {
		uint256 _supplyMinted_ = _supplyMinted();
		if ( index_ >= _balanceOf( tokenOwner_ ) ) {
			revert IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS();
		}

		uint256 _count_ = 0;
		for ( uint256 i = 0; i < _supplyMinted_; i++ ) {
			if ( _exists( i ) && tokenOwner_ == _ownerOf( i ) ) {
				if ( index_ == _count_ ) {
					return i;
				}
				_count_++;
			}
		}
	}

	/**
	* @dev See {IERC721Enumerable-totalSupply}.
	*/
	function totalSupply() public view virtual override returns ( uint256 ) {
		uint256 _supplyMinted_ = _supplyMinted();
		uint256 _count_ = 0;
		for ( uint256 i; i < _supplyMinted_; i++ ) {
			if ( _exists( i ) ) {
				_count_++;
			}
		}
		return _count_;
	}
}

// File: contracts/CCFoundersKeys.sol



/**
* Author: Lambdalf the White
*/

pragma solidity 0.8.10;



contract CCFoundersKeys is ERC721BatchEnumerable, ERC721BatchStakable, ERC2981Base, IOwnable, IPausable, ITradable, IWhitelistable {
	// Events
	event PaymentReleased( address indexed from, address[] indexed tos, uint256[] indexed amounts );

	// Errors
	error CCFoundersKeys_ARRAY_LENGTH_MISMATCH();
	error CCFoundersKeys_FORBIDDEN();
	error CCFoundersKeys_INCORRECT_PRICE();
	error CCFoundersKeys_INSUFFICIENT_KEY_BALANCE();
	error CCFoundersKeys_MAX_BATCH();
	error CCFoundersKeys_MAX_RESERVE();
	error CCFoundersKeys_MAX_SUPPLY();
	error CCFoundersKeys_NO_ETHER_BALANCE();
	error CCFoundersKeys_TRANSFER_FAIL();

	// Founders Key whitelist mint price
	uint public immutable WL_MINT_PRICE; // = 0.069 ether;

	// Founders Key public mint price
	uint public immutable PUBLIC_MINT_PRICE; // = 0.1 ether;

	// Max supply
	uint public immutable MAX_SUPPLY;

	// Max TX
	uint public immutable MAX_BATCH;

	// 2C Safe wallet ~ 90%
	address private immutable _CC_SAFE;

	// 2C Operations wallet ~ 5%
	address private immutable _CC_CHARITY;

	// 2C Founders wallet ~ 2.5%
	address private immutable _CC_FOUNDERS;

	// 2C Community wallet ~ 2.5%
	address private immutable _CC_COMMUNITY;

	// Mapping of Anon holders to amount of free key claimable
	mapping( address => uint256 ) public anonClaimList;

	uint256 private _reserve;

	constructor(
		uint256 reserve_,
		uint256 maxBatch_,
		uint256 maxSupply_,
		uint256 royaltyRate_,
		uint256 wlMintPrice_,
		uint256 publicMintPrice_,
		string memory name_,
		string memory symbol_,
		string memory baseURI_,
		// address devAddress_,
		address[] memory wallets_
	) {
		address _contractOwner_ = _msgSender();
		_initIOwnable( _contractOwner_ );
		_initERC2981Base( _contractOwner_, royaltyRate_ );
		_initERC721BatchMetadata( name_, symbol_ );
		_setBaseURI( baseURI_ );
		_CC_SAFE          = wallets_[ 0 ];
		_CC_CHARITY       = wallets_[ 1 ];
		_CC_FOUNDERS      = wallets_[ 2 ];
		_CC_COMMUNITY     = wallets_[ 3 ];
		_reserve          = reserve_;
		MAX_BATCH         = maxBatch_;
		MAX_SUPPLY        = maxSupply_;
		WL_MINT_PRICE     = wlMintPrice_;
		PUBLIC_MINT_PRICE = publicMintPrice_;
		// _mintAndStake( devAddress_, 5 );
	}

	// **************************************
	// *****          INTERNAL          *****
	// **************************************
		/**
		* @dev Internal function returning whether `operator_` is allowed to manage tokens on behalf of `tokenOwner_`.
		* 
		* @param tokenOwner_ address that owns tokens
		* @param operator_ address that tries to manage tokens
		* 
		* @return bool whether `operator_` is allowed to manage the token
		*/
		function _isApprovedForAll( address tokenOwner_, address operator_ ) internal view virtual override returns ( bool ) {
			return _isRegisteredProxy( tokenOwner_, operator_ ) ||
						 super._isApprovedForAll( tokenOwner_, operator_ );
		}

		/**
		* @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 {
			if ( address( this ).balance < amount_ ) {
				revert CCFoundersKeys_INCORRECT_PRICE();
			}
			( bool _success_, ) = recipient_.call{ value: amount_ }( "" );
			if ( ! _success_ ) {
				revert CCFoundersKeys_TRANSFER_FAIL();
			}
		}
	// **************************************

	// **************************************
	// *****           PUBLIC           *****
	// **************************************
		/**
		* @dev Mints `qty_` tokens and transfers them to the caller.
		* 
		* Requirements:
		* 
		* - Sale state must be {SaleState.PRESALE}.
		* - There must be enough tokens left to mint outside of the reserve.
		* - Caller must be whitelisted.
		*/
		function claim( uint256 qty_ ) external presaleOpen {
			address _account_   = _msgSender();
			if ( qty_ > anonClaimList[ _account_ ] ) {
				revert CCFoundersKeys_FORBIDDEN();
			}

			uint256 _endSupply_ = _supplyMinted() + qty_;
			if ( _endSupply_ > MAX_SUPPLY - _reserve ) {
				revert CCFoundersKeys_MAX_SUPPLY();
			}

			unchecked {
				anonClaimList[ _account_ ] -= qty_;
			}
			_mint( _account_, qty_ );
		}

		/**
		* @dev Mints `qty_` tokens, stakes `qtyStaked_` of them to the count of the caller, and transfers the remaining to them.
		* 
		* Requirements:
		* 
		* - Sale state must be {SaleState.PRESALE}.
		* - There must be enough tokens left to mint outside of the reserve.
		* - Caller must be whitelisted.
		* - If `qtyStaked_` is higher than `qty_`, only `qty_` tokens are staked.
		*/
		function claimAndStake( uint256 qty_, uint256 qtyStaked_ ) external presaleOpen {
			address _account_   = _msgSender();
			if ( qty_ > anonClaimList[ _account_ ] ) {
				revert CCFoundersKeys_FORBIDDEN();
			}

			uint256 _endSupply_ = _supplyMinted() + qty_;
			if ( _endSupply_ > MAX_SUPPLY - _reserve ) {
				revert CCFoundersKeys_MAX_SUPPLY();
			}

			unchecked {
				anonClaimList[ _account_ ] -= qty_;
			}
			_mintAndStake( _account_, qty_, qtyStaked_ );
		}

		/**
		* @dev Mints a token and transfers it to the caller.
		* 
		* Requirements:
		* 
		* - Sale state must be {SaleState.PRESALE}.
		* - There must be enough tokens left to mint outside of the reserve.
		* - Caller must send enough ether to pay for 1 token at presale price.
		* - Caller must be whitelisted.
		*/
		function mintPreSale( bytes32[] memory proof_ ) external payable presaleOpen isWhitelisted( _msgSender(), proof_, 1, 1 ) {
			if ( _supplyMinted() + 1 > MAX_SUPPLY - _reserve ) {
				revert CCFoundersKeys_MAX_SUPPLY();
			}

			if ( WL_MINT_PRICE != msg.value ) {
				revert CCFoundersKeys_INCORRECT_PRICE();
			}

			address _account_    = _msgSender();
			_consumeWhitelist( _account_, 1 );
			_mint( _account_, 1 );
		}

		/**
		* @dev Mints a token and stakes it to the count of the caller.
		* 
		* Requirements:
		* 
		* - Sale state must be {SaleState.PRESALE}.
		* - There must be enough tokens left to mint outside of the reserve.
		* - Caller must send enough ether to pay for 1 token at presale price.
		* - Caller must be whitelisted.
		*/
		function mintPreSaleAndStake( bytes32[] memory proof_ ) external payable presaleOpen isWhitelisted( _msgSender(), proof_, 1, 1 ) {
			if ( _supplyMinted() + 1 > MAX_SUPPLY - _reserve ) {
				revert CCFoundersKeys_MAX_SUPPLY();
			}

			if ( WL_MINT_PRICE != msg.value ) {
				revert CCFoundersKeys_INCORRECT_PRICE();
			}

			address _account_    = _msgSender();
			_consumeWhitelist( _account_, 1 );
			_mintAndStake( _account_, 1, 1 );
		}

		/**
		* @dev Mints `qty_` tokens and transfers them to the caller.
		* 
		* Requirements:
		* 
		* - Sale state must be {SaleState.SALE}.
		* - There must be enough tokens left to mint outside of the reserve.
		* - Caller must send enough ether to pay for `qty_` tokens at public sale price.
		*/
		function mint( uint256 qty_ ) external payable saleOpen {
			if ( qty_ > MAX_BATCH ) {
				revert CCFoundersKeys_MAX_BATCH();
			}

			uint256 _endSupply_  = _supplyMinted() + qty_;
			if ( _endSupply_ > MAX_SUPPLY - _reserve ) {
				revert CCFoundersKeys_MAX_SUPPLY();
			}

			if ( qty_ * PUBLIC_MINT_PRICE != msg.value ) {
				revert CCFoundersKeys_INCORRECT_PRICE();
			}
			address _account_    = _msgSender();
			_mint( _account_, qty_ );
		}

		/**
		* @dev Mints `qty_` tokens, stakes `qtyStaked_` of them to the count of the caller, and transfers the remaining to them.
		* 
		* Requirements:
		* 
		* - Sale state must be {SaleState.SALE}.
		* - There must be enough tokens left to mint outside of the reserve.
		* - Caller must send enough ether to pay for `qty_` tokens at public sale price.
		* - If `qtyStaked_` is higher than `qty_`, only `qty_` tokens are staked.
		*/
		function mintAndStake( uint256 qty_, uint256 qtyStaked_ ) external payable saleOpen {
			if ( qty_ > MAX_BATCH ) {
				revert CCFoundersKeys_MAX_BATCH();
			}

			uint256 _endSupply_  = _supplyMinted() + qty_;
			if ( _endSupply_ > MAX_SUPPLY - _reserve ) {
				revert CCFoundersKeys_MAX_SUPPLY();
			}

			if ( qty_ * PUBLIC_MINT_PRICE != msg.value ) {
				revert CCFoundersKeys_INCORRECT_PRICE();
			}
			address _account_    = _msgSender();
			_mintAndStake( _account_, qty_, qtyStaked_ );
		}
	// **************************************

	// **************************************
	// *****       CONTRACT_OWNER       *****
	// **************************************
		/**
		* @dev Mints `amounts_` tokens and transfers them to `accounts_`.
		* 
		* Requirements:
		* 
		* - Caller must be the contract owner.
		* - `accounts_` and `amounts_` must have the same length.
		* - There must be enough tokens left in the reserve.
		*/
		function airdrop( address[] memory accounts_, uint256[] memory amounts_ ) external onlyOwner {
			uint256 _len_ = amounts_.length;
			if ( _len_ != accounts_.length ) {
				revert CCFoundersKeys_ARRAY_LENGTH_MISMATCH();
			}
			uint _totalQty_;
			for ( uint256 i = _len_; i > 0; i -- ) {
				_totalQty_ += amounts_[ i - 1 ];
			}
			if ( _totalQty_ > _reserve ) {
				revert CCFoundersKeys_MAX_RESERVE();
			}
			unchecked {
				_reserve -= _totalQty_;
			}
			for ( uint256 i = _len_; i > 0; i -- ) {
				_mint( accounts_[ i - 1], amounts_[ i - 1] );
			}
		}

		/**
		* @dev Saves `accounts_` in the anon claim list.
		* 
		* Requirements:
		* 
		* - Caller must be the contract owner.
		* - Sale state must be {SaleState.CLOSED}.
		* - `accounts_` and `amounts_` must have the same length.
		*/
		function setAnonClaimList( address[] memory accounts_, uint256[] memory amounts_ ) external onlyOwner saleClosed {
			uint256 _len_ = amounts_.length;
			if ( _len_ != accounts_.length ) {
				revert CCFoundersKeys_ARRAY_LENGTH_MISMATCH();
			}
			for ( uint256 i; i < _len_; i ++ ) {
				anonClaimList[ accounts_[ i ] ] = amounts_[ i ];
			}
		}

		/**
		* @dev See {ITradable-setProxyRegistry}.
		* 
		* Requirements:
		* 
		* - Caller must be the contract owner.
		*/
		function setProxyRegistry( address proxyRegistryAddress_ ) external onlyOwner {
			_setProxyRegistry( proxyRegistryAddress_ );
		}

		/**
		* @dev Updates the royalty recipient and rate.
		* 
		* Requirements:
		* 
		* - Caller must be the contract owner.
		*/
		function setRoyaltyInfo( address royaltyRecipient_, uint256 royaltyRate_ ) external onlyOwner {
			_setRoyaltyInfo( royaltyRecipient_, royaltyRate_ );
		}

		/**
		* @dev See {IPausable-setSaleState}.
		* 
		* Requirements:
		* 
		* - Caller must be the contract owner.
		*/
		function setSaleState( SaleState newState_ ) external onlyOwner {
			_setSaleState( newState_ );
		}

		/**
		* @dev See {IWhitelistable-setWhitelist}.
		* 
		* Requirements:
		* 
		* - Caller must be the contract owner.
		* - Sale state must be {SaleState.CLOSED}.
		*/
		function setWhitelist( bytes32 root_ ) external onlyOwner saleClosed {
			_setWhitelist( root_ );
		}

		/**
		* @dev Withdraws all the money stored in the contract and splits it amongst the set wallets.
		* 
		* Requirements:
		* 
		* - Caller must be the contract owner.
		*/
		function withdraw() external onlyOwner {
			uint256 _balance_ = address(this).balance;
			if ( _balance_ == 0 ) {
				revert CCFoundersKeys_NO_ETHER_BALANCE();
			}

			uint256 _safeShare_ = _balance_ * 900 / 1000;
			uint256 _charityShare_ = _balance_ * 50 / 1000;
			uint256 _othersShare_ = _charityShare_ / 2;
			_sendValue( payable( _CC_COMMUNITY ), _othersShare_ );
			_sendValue( payable( _CC_FOUNDERS ), _othersShare_ );
			_sendValue( payable( _CC_CHARITY ), _charityShare_ );
			_sendValue( payable( _CC_SAFE ), _safeShare_ );

			address[] memory _tos_ = new address[]( 4 );
			_tos_[ 0 ] = _CC_COMMUNITY;
			_tos_[ 1 ] = _CC_FOUNDERS;
			_tos_[ 2 ] = _CC_CHARITY;
			_tos_[ 3 ] = _CC_SAFE;
			uint256[] memory _amounts_ = new uint256[]( 4 );
			_amounts_[ 0 ] = _othersShare_;
			_amounts_[ 1 ] = _othersShare_;
			_amounts_[ 2 ] = _charityShare_;
			_amounts_[ 3 ] = _safeShare_;
			emit PaymentReleased( address( this ), _tos_, _amounts_ );
		}
	// **************************************

	// **************************************
	// *****            VIEW            *****
	// **************************************
		/**
		* @dev Returns the number of tokens owned by `tokenOwner_`.
		*/
		function balanceOf( address tokenOwner_ ) public view virtual override(ERC721Batch, ERC721BatchStakable) returns ( uint256 balance ) {
			return ERC721BatchStakable.balanceOf( tokenOwner_ );
		}

		/**
		* @dev Returns the owner of token number `tokenId_`.
		*
		* Requirements:
		*
		* - `tokenId_` must exist.
		*/
		function ownerOf( uint256 tokenId_ ) public view virtual override(ERC721Batch, ERC721BatchStakable) exists( tokenId_ ) returns ( address ) {
			return ERC721BatchStakable.ownerOf( tokenId_ );
		}

		/**
		* @dev See {IERC2981-royaltyInfo}.
		*
		* Requirements:
		*
		* - `tokenId_` must exist.
		*/
		function royaltyInfo( uint256 tokenId_, uint256 salePrice_ ) public view virtual override exists( tokenId_ ) returns ( address, uint256 ) {
			return super.royaltyInfo( tokenId_, salePrice_ );
		}

		/**
		* @dev See {IERC165-supportsInterface}.
		*/
		function supportsInterface( bytes4 interfaceId_ ) public view virtual override(ERC721BatchEnumerable, ERC721Batch, ERC2981Base) returns ( bool ) {
			return 
				interfaceId_ == type( IERC2981 ).interfaceId ||
				ERC721Batch.supportsInterface( interfaceId_ ) ||
				ERC721BatchEnumerable.supportsInterface( interfaceId_ );
		}
	// **************************************
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"reserve_","type":"uint256"},{"internalType":"uint256","name":"maxBatch_","type":"uint256"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"uint256","name":"royaltyRate_","type":"uint256"},{"internalType":"uint256","name":"wlMintPrice_","type":"uint256"},{"internalType":"uint256","name":"publicMintPrice_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address[]","name":"wallets_","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CCFoundersKeys_ARRAY_LENGTH_MISMATCH","type":"error"},{"inputs":[],"name":"CCFoundersKeys_FORBIDDEN","type":"error"},{"inputs":[],"name":"CCFoundersKeys_INCORRECT_PRICE","type":"error"},{"inputs":[],"name":"CCFoundersKeys_INSUFFICIENT_KEY_BALANCE","type":"error"},{"inputs":[],"name":"CCFoundersKeys_MAX_BATCH","type":"error"},{"inputs":[],"name":"CCFoundersKeys_MAX_RESERVE","type":"error"},{"inputs":[],"name":"CCFoundersKeys_MAX_SUPPLY","type":"error"},{"inputs":[],"name":"CCFoundersKeys_NO_ETHER_BALANCE","type":"error"},{"inputs":[],"name":"CCFoundersKeys_TRANSFER_FAIL","type":"error"},{"inputs":[],"name":"IERC2981_INVALID_ROYALTIES","type":"error"},{"inputs":[],"name":"IERC721Enumerable_INDEX_OUT_OF_BOUNDS","type":"error"},{"inputs":[],"name":"IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS","type":"error"},{"inputs":[],"name":"IERC721_APPROVE_CALLER","type":"error"},{"inputs":[],"name":"IERC721_APPROVE_OWNER","type":"error"},{"inputs":[],"name":"IERC721_CALLER_NOT_APPROVED","type":"error"},{"inputs":[],"name":"IERC721_NONEXISTANT_TOKEN","type":"error"},{"inputs":[],"name":"IERC721_NON_ERC721_RECEIVER","type":"error"},{"inputs":[],"name":"IERC721_NULL_ADDRESS_BALANCE","type":"error"},{"inputs":[],"name":"IERC721_NULL_ADDRESS_TRANSFER","type":"error"},{"inputs":[],"name":"IOwnable_NOT_OWNER","type":"error"},{"inputs":[],"name":"IPausable_PRESALE_NOT_OPEN","type":"error"},{"inputs":[],"name":"IPausable_SALE_NOT_CLOSED","type":"error"},{"inputs":[],"name":"IPausable_SALE_NOT_OPEN","type":"error"},{"inputs":[],"name":"IWhitelistable_CONSUMED","type":"error"},{"inputs":[],"name":"IWhitelistable_FORBIDDEN","type":"error"},{"inputs":[],"name":"IWhitelistable_NOT_SET","type":"error"},{"inputs":[],"name":"IWhitelistable_NO_ALLOWANCE","type":"error"},{"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":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address[]","name":"tos","type":"address[]"},{"indexed":true,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum IPausable.SaleState","name":"previousState","type":"uint8"},{"indexed":true,"internalType":"enum IPausable.SaleState","name":"newState","type":"uint8"}],"name":"SaleStateChanged","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":"MAX_BATCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"anonClaimList","outputs":[{"internalType":"uint256","name":"","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":"tokenOwner_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"}],"name":"balanceOfStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty_","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty_","type":"uint256"},{"internalType":"uint256","name":"qtyStaked_","type":"uint256"}],"name":"claimAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"},{"internalType":"address","name":"operator_","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty_","type":"uint256"},{"internalType":"uint256","name":"qtyStaked_","type":"uint256"}],"name":"mintAndStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"mintPreSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"mintPreSaleAndStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","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":"uint256","name":"tokenId_","type":"uint256"}],"name":"ownerOfStaked","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"salePrice_","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","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":"","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":[],"name":"saleState","outputs":[{"internalType":"enum IPausable.SaleState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"setAnonClaimList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator_","type":"address"},{"internalType":"bool","name":"approved_","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyRegistryAddress_","type":"address"}],"name":"setProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyRecipient_","type":"address"},{"internalType":"uint256","name":"royaltyRate_","type":"uint256"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IPausable.SaleState","name":"newState_","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root_","type":"bytes32"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"stake","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":"index_","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"},{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","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":"","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":"uint256","name":"tokenId_","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101806040523480156200001257600080fd5b506040516200489038038062004890833981016040819052620000359162000428565b600a80546001600160a01b0319163390811790915562000056818962000167565b62000062858562000177565b6200006d83620001a7565b816000815181106200008357620000836200051c565b60200260200101516001600160a01b0316610100816001600160a01b03168152505081600181518110620000bb57620000bb6200051c565b60200260200101516001600160a01b0316610120816001600160a01b03168152505081600281518110620000f357620000f36200051c565b60200260200101516001600160a01b0316610140816001600160a01b031681525050816003815181106200012b576200012b6200051c565b60209081029190910101516001600160a01b031661016052505050600f979097555060e09490945260c0929092525060805260a052506200056f565b620001738282620001bc565b5050565b81516200018c90600090602085019062000205565b508051620001a290600190602084019062000205565b505050565b80516200017390600290602084019062000205565b612710811115620001e057604051635b75946560e11b815260040160405180910390fd5b600855600980546001600160a01b0319166001600160a01b0392909216919091179055565b828054620002139062000532565b90600052602060002090601f01602090048101928262000237576000855562000282565b82601f106200025257805160ff191683800117855562000282565b8280016001018555821562000282579182015b828111156200028257825182559160200191906001019062000265565b506200029092915062000294565b5090565b5b8082111562000290576000815560010162000295565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620002ec57620002ec620002ab565b604052919050565b600082601f8301126200030657600080fd5b81516001600160401b03811115620003225762000322620002ab565b602062000338601f8301601f19168201620002c1565b82815285828487010111156200034d57600080fd5b60005b838110156200036d57858101830151828201840152820162000350565b838111156200037f5760008385840101525b5095945050505050565b600082601f8301126200039b57600080fd5b815160206001600160401b03821115620003b957620003b9620002ab565b8160051b620003ca828201620002c1565b9283528481018201928281019087851115620003e557600080fd5b83870192505b848310156200041d5782516001600160a01b03811681146200040d5760008081fd5b82529183019190830190620003eb565b979650505050505050565b6000806000806000806000806000806101408b8d0312156200044957600080fd5b8a51995060208b0151985060408b0151975060608b0151965060808b0151955060a08b0151945060c08b015160018060401b03808211156200048a57600080fd5b620004988e838f01620002f4565b955060e08d0151915080821115620004af57600080fd5b620004bd8e838f01620002f4565b94506101008d0151915080821115620004d557600080fd5b620004e38e838f01620002f4565b93506101208d0151915080821115620004fb57600080fd5b506200050a8d828e0162000389565b9150509295989b9194979a5092959850565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200054757607f821691505b602082108114156200056957634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051610140516101605161424b6200064560003960008181611757015261181f01526000818161178101526118730152600081816117ab01526118c70152600081816117d5015261191b0152600081816107ab01528181610df5015261216c01526000818161050a01528181610c7e01528181610e6a01528181611448015281816115970152818161200c01526121e10152600081816106f201528181610ed20152612249015260008181610759015281816116040152612079015261424b6000f3fe6080604052600436106102dc5760003560e01c80634f6ccce711610184578063950bff9f116100d6578063adfdeef91161008a578063e2e784d511610064578063e2e784d514610895578063e985e9c5146108b5578063f2fde38b146108d557600080fd5b8063adfdeef914610835578063b88d4fde14610855578063c87b56dd1461087557600080fd5b8063a0712d68116100bb578063a0712d68146107e2578063a22cb465146107f5578063a694fc3a1461081557600080fd5b8063950bff9f1461079957806395d89b41146107cd57600080fd5b8063672434821161013857806380d65b0a1161011257806380d65b0a1461073457806388089f0b146107475780638da5cb5b1461077b57600080fd5b806367243482146106c05780636bde2627146106e057806370a082311461071457600080fd5b80635a67de07116101695780635a67de0714610641578063603f4d52146106615780636352211e146106a057600080fd5b80634f6ccce714610601578063520332151461062157600080fd5b80632a55205a1161023d578063379607f5116101f15780633ccfd60b116101cb5780633ccfd60b146105ac57806342842e0e146105c1578063440bc7f3146105e157600080fd5b8063379607f51461054c578063381d7df01461056c5780633cb971ca1461059957600080fd5b80632f745c59116102225780632f745c59146104d857806332cb6b0c146104f85780633455f41e1461052c57600080fd5b80632a55205a146104795780632e17de78146104b857600080fd5b8063150b7a02116102945780631b7b79ee116102795780631b7b79ee14610426578063215f45b41461043957806323b872dd1461045957600080fd5b8063150b7a02146103b257806318160ddd1461040357600080fd5b8063081812fc116102c5578063081812fc14610338578063095ea7b314610370578063142982f41461039257600080fd5b806301ffc9a7146102e157806306fdde0314610316575b600080fd5b3480156102ed57600080fd5b506103016102fc36600461380a565b6108f5565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b610960565b60405161030d919061389d565b34801561034457600080fd5b506103586103533660046138b0565b6109f2565b6040516001600160a01b03909116815260200161030d565b34801561037c57600080fd5b5061039061038b3660046138de565b610a57565b005b34801561039e57600080fd5b506103906103ad36600461390a565b610bb0565b3480156103be57600080fd5b506103d26103cd3660046139aa565b610d10565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161030d565b34801561040f57600080fd5b50610418610d3a565b60405190815260200161030d565b61039061043436600461390a565b610d8b565b34801561044557600080fd5b50610390610454366004613b1b565b610f3a565b34801561046557600080fd5b50610390610474366004613bdd565b6110ab565b34801561048557600080fd5b5061049961049436600461390a565b611195565b604080516001600160a01b03909316835260208301919091520161030d565b3480156104c457600080fd5b506103906104d33660046138b0565b6111f0565b3480156104e457600080fd5b506104186104f33660046138de565b6112a4565b34801561050457600080fd5b506104187f000000000000000000000000000000000000000000000000000000000000000081565b34801561053857600080fd5b50610418610547366004613c1e565b61136f565b34801561055857600080fd5b506103906105673660046138b0565b61137a565b34801561057857600080fd5b50610418610587366004613c1e565b600e6020526000908152604090205481565b6103906105a7366004613c3b565b6114d8565b3480156105b857600080fd5b5061039061167f565b3480156105cd57600080fd5b506103906105dc366004613bdd565b611a67565b3480156105ed57600080fd5b506103906105fc3660046138b0565b611b99565b34801561060d57600080fd5b5061041861061c3660046138b0565b611c60565b34801561062d57600080fd5b5061035861063c3660046138b0565b611ca7565b34801561064d57600080fd5b5061039061065c366004613ccc565b611d0b565b34801561066d57600080fd5b50600a546106939074010000000000000000000000000000000000000000900460ff1681565b60405161030d9190613d1c565b3480156106ac57600080fd5b506103586106bb3660046138b0565b611d67565b3480156106cc57600080fd5b506103906106db366004613b1b565b611db4565b3480156106ec57600080fd5b506104187f000000000000000000000000000000000000000000000000000000000000000081565b34801561072057600080fd5b5061041861072f366004613c1e565b611f42565b610390610742366004613c3b565b611f4d565b34801561075357600080fd5b506104187f000000000000000000000000000000000000000000000000000000000000000081565b34801561078757600080fd5b50600a546001600160a01b0316610358565b3480156107a557600080fd5b506104187f000000000000000000000000000000000000000000000000000000000000000081565b3480156107d957600080fd5b5061032b6120f3565b6103906107f03660046138b0565b612102565b34801561080157600080fd5b50610390610810366004613d5d565b6122b0565b34801561082157600080fd5b506103906108303660046138b0565b61237f565b34801561084157600080fd5b50610390610850366004613c1e565b61241f565b34801561086157600080fd5b50610390610870366004613d9b565b6124d8565b34801561088157600080fd5b5061032b6108903660046138b0565b61263c565b3480156108a157600080fd5b506103906108b03660046138de565b6126d7565b3480156108c157600080fd5b506103016108d0366004613e3a565b612738565b3480156108e157600080fd5b506103906108f0366004613c1e565b612744565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061094b575061094b82612801565b8061095a575061095a826128e5565b92915050565b60606000805461096f90613e68565b80601f016020809104026020016040519081016040528092919081815260200182805461099b90613e68565b80156109e85780601f106109bd576101008083540402835291602001916109e8565b820191906000526020600020905b8154815290600101906020018083116109cb57829003601f168201915b5050505050905090565b600081610a00816003541190565b610a36576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600560205260409020546001600160a01b031691505b50919050565b80610a63816003541190565b610a99576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000610aa58461293b565b90506000610ab4828487612992565b905080610aed576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600160a01b0316866001600160a01b03161415610b39576040517fcef24c0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526005602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a811691821790925591518893918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b6001600a5474010000000000000000000000000000000000000000900460ff166002811115610be157610be1613ced565b14610c18576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152600e6020526040902054831115610c61576040517fe8aad3f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083610c6d60035490565b610c779190613ee5565b9050600f547f0000000000000000000000000000000000000000000000000000000000000000610ca79190613efd565b811115610ce0576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600e6020526040902080548590039055610d0a8285856129e7565b50505050565b7f150b7a02000000000000000000000000000000000000000000000000000000005b949350505050565b600080610d4660035490565b90506000805b82811015610d8457610d5f816003541190565b15610d725781610d6e81613f14565b9250505b80610d7c81613f14565b915050610d4c565b5092915050565b6002600a5474010000000000000000000000000000000000000000900460ff166002811115610dbc57610dbc613ced565b14610df3576040517f13ce6b3100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000821115610e4d576040517fb3ccae9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082610e5960035490565b610e639190613ee5565b9050600f547f0000000000000000000000000000000000000000000000000000000000000000610e939190613efd565b811115610ecc576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34610ef77f000000000000000000000000000000000000000000000000000000000000000085613f4d565b14610f2e576040517f225456a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33610d0a8185856129e7565b33610f4d600a546001600160a01b031690565b6001600160a01b031614610f8d576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600a5474010000000000000000000000000000000000000000900460ff166002811115610fbe57610fbe613ced565b14610ff5576040517fe90d4d7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805182518114611031576040517f9259bce600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610d0a5782818151811061104e5761104e613f8a565b6020026020010151600e600086848151811061106c5761106c613f8a565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806110a390613f14565b915050611034565b806110b7816003541190565b6110ed576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360006110f98461293b565b90506000611108828487612992565b905080611141576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611181576040517fd563b6a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118c828787612a2e565b50505050505050565b600080836111a4816003541190565b6111da576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111e48585612bf8565b92509250509250929050565b806111fc816003541190565b611232576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526007602052604081205433916001600160a01b039091169061125a828487612992565b905080611293576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61129d8286612c58565b5050505050565b6000806112b060035490565b90506112bb84612c9a565b83106112f3576040517f8adbcb8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b828110156113665761130a816003541190565b801561132f575061131a8161293b565b6001600160a01b0316866001600160a01b0316145b15611354578185141561134657925061095a915050565b8161135081613f14565b9250505b8061135e81613f14565b9150506112f7565b50505092915050565b600061095a82612d48565b6001600a5474010000000000000000000000000000000000000000900460ff1660028111156113ab576113ab613ced565b146113e2576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152600e602052604090205482111561142b576040517fe8aad3f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008261143760035490565b6114419190613ee5565b9050600f547f00000000000000000000000000000000000000000000000000000000000000006114719190613efd565b8111156114aa576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600e60205260409020805484900390556114d38284612dc3565b505050565b6001600a5474010000000000000000000000000000000000000000900460ff16600281111561150957611509613ced565b14611540576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33816001806000611552858585612ed9565b90508181101561158e576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f546115bb907f0000000000000000000000000000000000000000000000000000000000000000613efd565b6003546115c9906001613ee5565b1115611601576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b347f00000000000000000000000000000000000000000000000000000000000000001461165a576040517f225456a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152600d602052604090208054600190810190915561118c908290806129e7565b33611692600a546001600160a01b031690565b6001600160a01b0316146116d2576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b478061170a576040517fe13f349a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103e861171b83610384613f4d565b6117259190613fe8565b905060006103e8611737846032613f4d565b6117419190613fe8565b90506000611750600283613fe8565b905061177c7f000000000000000000000000000000000000000000000000000000000000000082612fc9565b6117a67f000000000000000000000000000000000000000000000000000000000000000082612fc9565b6117d07f000000000000000000000000000000000000000000000000000000000000000083612fc9565b6117fa7f000000000000000000000000000000000000000000000000000000000000000084612fc9565b60408051600480825260a08201909252600091602082016080803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061185157611851613f8a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106118a5576118a5613f8a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816002815181106118f9576118f9613f8a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160038151811061194d5761194d613f8a565b6001600160a01b039290921660209283029190910182015260408051600480825260a082019092526000929091908201608080368337019050509050828160008151811061199d5761199d613f8a565b60200260200101818152505082816001815181106119bd576119bd613f8a565b60200260200101818152505083816002815181106119dd576119dd613f8a565b60200260200101818152505084816003815181106119fd576119fd613f8a565b60200260200101818152505080604051611a179190613ffc565b604051809103902082604051611a2d9190614032565b6040519081900381209030907f7d148a78dd4772dd1b6008be07f3b70b1590d60b4b192e263cdcf1da2510f26f90600090a4505050505050565b80611a73816003541190565b611aa9576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000611ab58461293b565b90506000611ac4828487612992565b905080611afd576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611b3d576040517fd563b6a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b48828787612a2e565b611b6382878760405180602001604052806000815250613090565b61118c576040517f71fbfca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33611bac600a546001600160a01b031690565b6001600160a01b031614611bec576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600a5474010000000000000000000000000000000000000000900460ff166002811115611c1d57611c1d613ced565b14611c54576040517fe90d4d7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c5d81600c55565b50565b6000611c6b60035490565b8210611ca3576040517fa8111f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b600081611cb5816003541190565b611ceb576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600760205260409020546001600160a01b03165b9392505050565b33611d1e600a546001600160a01b031690565b6001600160a01b031614611d5e576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c5d81613209565b600081611d75816003541190565b611dab576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d04836132bb565b33611dc7600a546001600160a01b031690565b6001600160a01b031614611e07576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805182518114611e43576040517f9259bce600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b8015611e905783611e59600183613efd565b81518110611e6957611e69613f8a565b602002602001015182611e7c9190613ee5565b915080611e8881614065565b915050611e47565b50600f54811115611ecd576040517fb18f58ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f80548290039055815b801561129d57611f3085611eed600184613efd565b81518110611efd57611efd613f8a565b602002602001015185600184611f139190613efd565b81518110611f2357611f23613f8a565b6020026020010151612dc3565b80611f3a81614065565b915050611ed8565b600061095a8261333d565b6001600a5474010000000000000000000000000000000000000000900460ff166002811115611f7e57611f7e613ced565b14611fb5576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33816001806000611fc7858585612ed9565b905081811015612003576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f54612030907f0000000000000000000000000000000000000000000000000000000000000000613efd565b60035461203e906001613ee5565b1115612076576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b347f0000000000000000000000000000000000000000000000000000000000000000146120cf576040517f225456a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152600d602052604090208054600190810190915561118c908290612dc3565b60606001805461096f90613e68565b6002600a5474010000000000000000000000000000000000000000900460ff16600281111561213357612133613ced565b1461216a576040517f13ce6b3100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008111156121c4576040517fb3ccae9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816121d060035490565b6121da9190613ee5565b9050600f547f000000000000000000000000000000000000000000000000000000000000000061220a9190613efd565b811115612243576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3461226e7f000000000000000000000000000000000000000000000000000000000000000084613f4d565b146122a5576040517f225456a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336114d38184612dc3565b336001600160a01b0383168114156122f4576040517fb3c28f3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381811660008181526006602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b8061238b816003541190565b6123c1576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360006123cd8461293b565b905060006123dc828487612992565b905080612415576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61129d828661335b565b33612432600a546001600160a01b031690565b6001600160a01b031614612472576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831617905550565b826124e4816003541190565b61251a576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360006125268661293b565b90506000612535828489612992565b90508061256e576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0388166125ae576040517fd563b6a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125b9828989612a2e565b6125fb82898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061309092505050565b612631576040517f71fbfca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b60608161264a816003541190565b612680576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002805461268f90613e68565b9050116126a45761269f836133a5565b611d04565b60026126af846133a5565b6040516020016126c09291906140b6565b604051602081830303815290604052915050919050565b336126ea600a546001600160a01b031690565b6001600160a01b03161461272a576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61273482826134d7565b5050565b6000611d048383613550565b33612757600a546001600160a01b031690565b6001600160a01b031614612797576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000148061289457507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b8061095a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061095a575061095a82612801565b60008181526004602052604081205482906001600160a01b03165b6001600160a01b038116611d04578161296e81614065565b6000818152600460205260409020549093506001600160a01b031691506129569050565b600080846001600160a01b0316846001600160a01b031614806129ce57506000838152600560205260409020546001600160a01b038581169116145b806129de57506129de8585613550565b95945050505050565b600081838111156129f9575082612a0e565b83831015612a0e57612a0b8385613efd565b91505b8015612a1e57612a1e8582613590565b811561129d5761129d8583612dc3565b600081815260056020526040812080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905581612a6e576000612a79565b612a79600183613efd565b90506000612a88836001613ee5565b905060008383108015612aa15750612aa1836003541190565b8015612ac257506000838152600460205260409020546001600160a01b0316155b90506000612ad1836003541190565b8015612af257506000838152600460205260409020546001600160a01b0316155b90508115612b3a57600084815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389161790555b8015612b8057600083815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389161790555b60008581526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a811691821790925591518893918b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050505050565b600080821580612c085750600854155b15612c225750506009546001600160a01b03166000612c51565b600061271084600854612c359190613f4d565b612c3f9190613fe8565b6009546001600160a01b031693509150505b9250929050565b612c63308383612a2e565b600090815260076020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b60006001600160a01b038216612cb257506000919050565b6000612cbd60035490565b9050600080805b83811015612d3e576000818152600460205260409020546001600160a01b031615612d04576000818152600460205260409020546001600160a01b031691505b816001600160a01b0316866001600160a01b03161415612d2c5782612d2881613f14565b9350505b80612d3681613f14565b915050612cc4565b5090949350505050565b60006001600160a01b038216612d6057506000919050565b6000612d6b60035490565b90506000805b82811015612dbb576000818152600760205260409020546001600160a01b0386811691161415612da95781612da581613f14565b9250505b80612db381613f14565b915050612d71565b509392505050565b60035460006001612dd48484613ee5565b612dde9190613efd565b600083815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038716179055905081811115612e6757600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386161790555b60005b83811015612ec457612e7c8184613ee5565b6040516001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480612ebc81613f14565b915050612e6a565b50612ed0816001613ee5565b60035550505050565b600c54600090612f15576040517fc71bad4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166000908152600d60205260409020548211612f66576040517fde33971400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f70848461361a565b612fa6576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b0383166000908152600d602052604090205481039392505050565b80471015613003576040517f225456a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613050576040519150601f19603f3d011682016040523d82523d6000602084013e613055565b606091505b50509050806114d3576040517ff12332f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000833b80156131ff576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063150b7a02906130e59033908a908990899060040161418b565b6020604051808303816000875af192505050801561313e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261313b918101906141c7565b60015b6131b2573d80801561316c576040519150601f19603f3d011682016040523d82523d6000602084013e613171565b606091505b5080516131aa576040517f71fbfca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149150610d329050565b6001915050610d32565b600a80547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600281111561326557613265613ced565b021790555081600281111561327c5761327c613ced565b81600281111561328e5761328e613ced565b6040517fe2034a7bf30bb7c637ee4fd008478210b21708c5c7177151827a49a6877a020d90600090a35050565b6000816132c9816003541190565b6132ff576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061330a8461293b565b90506001600160a01b038116301415611d04576000848152600760205260409020546001600160a01b0316925050610a51565b600061334882612c9a565b61335183612d48565b61095a9190613ee5565b600081815260076020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416179055612734823083612a2e565b6060816133e557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561340f57806133f981613f14565b91506134089050600a83613fe8565b91506133e9565b60008167ffffffffffffffff81111561342a5761342a61392c565b6040519080825280601f01601f191660200182016040528015613454576020820181803683370190505b5090505b8415610d3257613469600183613efd565b9150613476600a866141e4565b613481906030613ee5565b60f81b81838151811061349657613496613f8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506134d0600a86613fe8565b9450613458565b612710811115613513576040517fb6eb28ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600855600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600061355c838361367f565b80611d0457506001600160a01b0380841660009081526006602090815260408083209386168352929052205460ff16611d04565b600061359b60035490565b9050600060016135ab8484613ee5565b6135b59190613efd565b90505b80821161361057600082815260076020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386161790558161360881613f14565b9250506135b8565b610d0a3084612dc3565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050600c546136768483613770565b14949350505050565b6000805b600b54811015613766576000600b82815481106136a2576136a2613f8a565b6000918252602090912001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152918216925090851690829063c455279190602401602060405180830381865afa158015613715573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373991906141f8565b6001600160a01b031614156137535760019250505061095a565b508061375e81613f14565b915050613683565b5060009392505050565b600081815b8451811015612dbb57600085828151811061379257613792613f8a565b602002602001015190508083116137b857600083815260208290526040902092506137c9565b600081815260208490526040902092505b50806137d481613f14565b915050613775565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611c5d57600080fd5b60006020828403121561381c57600080fd5b8135611d04816137dc565b60005b8381101561384257818101518382015260200161382a565b83811115610d0a5750506000910152565b6000815180845261386b816020860160208601613827565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d046020830184613853565b6000602082840312156138c257600080fd5b5035919050565b6001600160a01b0381168114611c5d57600080fd5b600080604083850312156138f157600080fd5b82356138fc816138c9565b946020939093013593505050565b6000806040838503121561391d57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139a2576139a261392c565b604052919050565b600080600080608085870312156139c057600080fd5b84356139cb816138c9565b93506020858101356139dc816138c9565b935060408601359250606086013567ffffffffffffffff80821115613a0057600080fd5b818801915088601f830112613a1457600080fd5b813581811115613a2657613a2661392c565b613a56847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161395b565b91508082528984828501011115613a6c57600080fd5b808484018584013760008482840101525080935050505092959194509250565b600067ffffffffffffffff821115613aa657613aa661392c565b5060051b60200190565b600082601f830112613ac157600080fd5b81356020613ad6613ad183613a8c565b61395b565b82815260059290921b84018101918181019086841115613af557600080fd5b8286015b84811015613b105780358352918301918301613af9565b509695505050505050565b60008060408385031215613b2e57600080fd5b823567ffffffffffffffff80821115613b4657600080fd5b818501915085601f830112613b5a57600080fd5b81356020613b6a613ad183613a8c565b82815260059290921b84018101918181019089841115613b8957600080fd5b948201945b83861015613bb0578535613ba1816138c9565b82529482019490820190613b8e565b96505086013592505080821115613bc657600080fd5b50613bd385828601613ab0565b9150509250929050565b600080600060608486031215613bf257600080fd5b8335613bfd816138c9565b92506020840135613c0d816138c9565b929592945050506040919091013590565b600060208284031215613c3057600080fd5b8135611d04816138c9565b60006020808385031215613c4e57600080fd5b823567ffffffffffffffff811115613c6557600080fd5b8301601f81018513613c7657600080fd5b8035613c84613ad182613a8c565b81815260059190911b82018301908381019087831115613ca357600080fd5b928401925b82841015613cc157833582529284019290840190613ca8565b979650505050505050565b600060208284031215613cde57600080fd5b813560038110611d0457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613d57577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060408385031215613d7057600080fd5b8235613d7b816138c9565b915060208301358015158114613d9057600080fd5b809150509250929050565b600080600080600060808688031215613db357600080fd5b8535613dbe816138c9565b94506020860135613dce816138c9565b935060408601359250606086013567ffffffffffffffff80821115613df257600080fd5b818801915088601f830112613e0657600080fd5b813581811115613e1557600080fd5b896020828501011115613e2757600080fd5b9699959850939650602001949392505050565b60008060408385031215613e4d57600080fd5b8235613e58816138c9565b91506020830135613d90816138c9565b600181811c90821680613e7c57607f821691505b60208210811415610a51577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613ef857613ef8613eb6565b500190565b600082821015613f0f57613f0f613eb6565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f4657613f46613eb6565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f8557613f85613eb6565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613ff757613ff7613fb9565b500490565b815160009082906020808601845b838110156140265781518552938201939082019060010161400a565b50929695505050505050565b815160009082906020808601845b838110156140265781516001600160a01b031685529382019390820190600101614040565b60008161407457614074613eb6565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600081516140ac818560208601613827565b9290920192915050565b600080845481600182811c9150808316806140d257607f831692505b602080841082141561410b577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561411f576001811461414e5761417b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061417b565b60008b81526020902060005b868110156141735781548b82015290850190830161415a565b505084890196505b5050505050506129de818561409a565b60006001600160a01b038087168352808616602084015250836040830152608060608301526141bd6080830184613853565b9695505050505050565b6000602082840312156141d957600080fd5b8151611d04816137dc565b6000826141f3576141f3613fb9565b500690565b60006020828403121561420a57600080fd5b8151611d04816138c956fea2646970667358221220161d9fed2d15321556ab0a7c3fd07cb94c59e02dcc41f6f3f24781a25c00f65164736f6c634300080a003300000000000000000000000000000000000000000000000000000000000003f5000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000015b3000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000f5232269808000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000001c436f6c6c6563746f727320436c756220466f756e64657273204b65790000000000000000000000000000000000000000000000000000000000000000000000044343464b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003868747470733a2f2f636f6c6c6563746f7273636c75622e696f2f6170692f666f756e646572732f6d657461646174613f746f6b656e49443d00000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000730243c9a5c8c1a092a3eb4fc2e0d8796501cfb40000000000000000000000005efc2f54d6d104d1fad6716776b408d56a373a890000000000000000000000004a37e5ff83b739a1d543feefa43b73712957da5b0000000000000000000000001d014a0d021667c6afb3f97eb13e4c7bf1dc94a9

Deployed Bytecode

0x6080604052600436106102dc5760003560e01c80634f6ccce711610184578063950bff9f116100d6578063adfdeef91161008a578063e2e784d511610064578063e2e784d514610895578063e985e9c5146108b5578063f2fde38b146108d557600080fd5b8063adfdeef914610835578063b88d4fde14610855578063c87b56dd1461087557600080fd5b8063a0712d68116100bb578063a0712d68146107e2578063a22cb465146107f5578063a694fc3a1461081557600080fd5b8063950bff9f1461079957806395d89b41146107cd57600080fd5b8063672434821161013857806380d65b0a1161011257806380d65b0a1461073457806388089f0b146107475780638da5cb5b1461077b57600080fd5b806367243482146106c05780636bde2627146106e057806370a082311461071457600080fd5b80635a67de07116101695780635a67de0714610641578063603f4d52146106615780636352211e146106a057600080fd5b80634f6ccce714610601578063520332151461062157600080fd5b80632a55205a1161023d578063379607f5116101f15780633ccfd60b116101cb5780633ccfd60b146105ac57806342842e0e146105c1578063440bc7f3146105e157600080fd5b8063379607f51461054c578063381d7df01461056c5780633cb971ca1461059957600080fd5b80632f745c59116102225780632f745c59146104d857806332cb6b0c146104f85780633455f41e1461052c57600080fd5b80632a55205a146104795780632e17de78146104b857600080fd5b8063150b7a02116102945780631b7b79ee116102795780631b7b79ee14610426578063215f45b41461043957806323b872dd1461045957600080fd5b8063150b7a02146103b257806318160ddd1461040357600080fd5b8063081812fc116102c5578063081812fc14610338578063095ea7b314610370578063142982f41461039257600080fd5b806301ffc9a7146102e157806306fdde0314610316575b600080fd5b3480156102ed57600080fd5b506103016102fc36600461380a565b6108f5565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b610960565b60405161030d919061389d565b34801561034457600080fd5b506103586103533660046138b0565b6109f2565b6040516001600160a01b03909116815260200161030d565b34801561037c57600080fd5b5061039061038b3660046138de565b610a57565b005b34801561039e57600080fd5b506103906103ad36600461390a565b610bb0565b3480156103be57600080fd5b506103d26103cd3660046139aa565b610d10565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161030d565b34801561040f57600080fd5b50610418610d3a565b60405190815260200161030d565b61039061043436600461390a565b610d8b565b34801561044557600080fd5b50610390610454366004613b1b565b610f3a565b34801561046557600080fd5b50610390610474366004613bdd565b6110ab565b34801561048557600080fd5b5061049961049436600461390a565b611195565b604080516001600160a01b03909316835260208301919091520161030d565b3480156104c457600080fd5b506103906104d33660046138b0565b6111f0565b3480156104e457600080fd5b506104186104f33660046138de565b6112a4565b34801561050457600080fd5b506104187f00000000000000000000000000000000000000000000000000000000000015b381565b34801561053857600080fd5b50610418610547366004613c1e565b61136f565b34801561055857600080fd5b506103906105673660046138b0565b61137a565b34801561057857600080fd5b50610418610587366004613c1e565b600e6020526000908152604090205481565b6103906105a7366004613c3b565b6114d8565b3480156105b857600080fd5b5061039061167f565b3480156105cd57600080fd5b506103906105dc366004613bdd565b611a67565b3480156105ed57600080fd5b506103906105fc3660046138b0565b611b99565b34801561060d57600080fd5b5061041861061c3660046138b0565b611c60565b34801561062d57600080fd5b5061035861063c3660046138b0565b611ca7565b34801561064d57600080fd5b5061039061065c366004613ccc565b611d0b565b34801561066d57600080fd5b50600a546106939074010000000000000000000000000000000000000000900460ff1681565b60405161030d9190613d1c565b3480156106ac57600080fd5b506103586106bb3660046138b0565b611d67565b3480156106cc57600080fd5b506103906106db366004613b1b565b611db4565b3480156106ec57600080fd5b506104187f000000000000000000000000000000000000000000000000016345785d8a000081565b34801561072057600080fd5b5061041861072f366004613c1e565b611f42565b610390610742366004613c3b565b611f4d565b34801561075357600080fd5b506104187f00000000000000000000000000000000000000000000000000f523226980800081565b34801561078757600080fd5b50600a546001600160a01b0316610358565b3480156107a557600080fd5b506104187f000000000000000000000000000000000000000000000000000000000000000581565b3480156107d957600080fd5b5061032b6120f3565b6103906107f03660046138b0565b612102565b34801561080157600080fd5b50610390610810366004613d5d565b6122b0565b34801561082157600080fd5b506103906108303660046138b0565b61237f565b34801561084157600080fd5b50610390610850366004613c1e565b61241f565b34801561086157600080fd5b50610390610870366004613d9b565b6124d8565b34801561088157600080fd5b5061032b6108903660046138b0565b61263c565b3480156108a157600080fd5b506103906108b03660046138de565b6126d7565b3480156108c157600080fd5b506103016108d0366004613e3a565b612738565b3480156108e157600080fd5b506103906108f0366004613c1e565b612744565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061094b575061094b82612801565b8061095a575061095a826128e5565b92915050565b60606000805461096f90613e68565b80601f016020809104026020016040519081016040528092919081815260200182805461099b90613e68565b80156109e85780601f106109bd576101008083540402835291602001916109e8565b820191906000526020600020905b8154815290600101906020018083116109cb57829003601f168201915b5050505050905090565b600081610a00816003541190565b610a36576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600560205260409020546001600160a01b031691505b50919050565b80610a63816003541190565b610a99576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000610aa58461293b565b90506000610ab4828487612992565b905080610aed576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600160a01b0316866001600160a01b03161415610b39576040517fcef24c0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526005602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a811691821790925591518893918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b6001600a5474010000000000000000000000000000000000000000900460ff166002811115610be157610be1613ced565b14610c18576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152600e6020526040902054831115610c61576040517fe8aad3f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083610c6d60035490565b610c779190613ee5565b9050600f547f00000000000000000000000000000000000000000000000000000000000015b3610ca79190613efd565b811115610ce0576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600e6020526040902080548590039055610d0a8285856129e7565b50505050565b7f150b7a02000000000000000000000000000000000000000000000000000000005b949350505050565b600080610d4660035490565b90506000805b82811015610d8457610d5f816003541190565b15610d725781610d6e81613f14565b9250505b80610d7c81613f14565b915050610d4c565b5092915050565b6002600a5474010000000000000000000000000000000000000000900460ff166002811115610dbc57610dbc613ced565b14610df3576040517f13ce6b3100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000005821115610e4d576040517fb3ccae9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082610e5960035490565b610e639190613ee5565b9050600f547f00000000000000000000000000000000000000000000000000000000000015b3610e939190613efd565b811115610ecc576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34610ef77f000000000000000000000000000000000000000000000000016345785d8a000085613f4d565b14610f2e576040517f225456a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33610d0a8185856129e7565b33610f4d600a546001600160a01b031690565b6001600160a01b031614610f8d576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600a5474010000000000000000000000000000000000000000900460ff166002811115610fbe57610fbe613ced565b14610ff5576040517fe90d4d7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805182518114611031576040517f9259bce600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610d0a5782818151811061104e5761104e613f8a565b6020026020010151600e600086848151811061106c5761106c613f8a565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806110a390613f14565b915050611034565b806110b7816003541190565b6110ed576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360006110f98461293b565b90506000611108828487612992565b905080611141576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611181576040517fd563b6a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118c828787612a2e565b50505050505050565b600080836111a4816003541190565b6111da576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111e48585612bf8565b92509250509250929050565b806111fc816003541190565b611232576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526007602052604081205433916001600160a01b039091169061125a828487612992565b905080611293576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61129d8286612c58565b5050505050565b6000806112b060035490565b90506112bb84612c9a565b83106112f3576040517f8adbcb8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b828110156113665761130a816003541190565b801561132f575061131a8161293b565b6001600160a01b0316866001600160a01b0316145b15611354578185141561134657925061095a915050565b8161135081613f14565b9250505b8061135e81613f14565b9150506112f7565b50505092915050565b600061095a82612d48565b6001600a5474010000000000000000000000000000000000000000900460ff1660028111156113ab576113ab613ced565b146113e2576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152600e602052604090205482111561142b576040517fe8aad3f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008261143760035490565b6114419190613ee5565b9050600f547f00000000000000000000000000000000000000000000000000000000000015b36114719190613efd565b8111156114aa576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600e60205260409020805484900390556114d38284612dc3565b505050565b6001600a5474010000000000000000000000000000000000000000900460ff16600281111561150957611509613ced565b14611540576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33816001806000611552858585612ed9565b90508181101561158e576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f546115bb907f00000000000000000000000000000000000000000000000000000000000015b3613efd565b6003546115c9906001613ee5565b1115611601576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b347f00000000000000000000000000000000000000000000000000f52322698080001461165a576040517f225456a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152600d602052604090208054600190810190915561118c908290806129e7565b33611692600a546001600160a01b031690565b6001600160a01b0316146116d2576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b478061170a576040517fe13f349a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103e861171b83610384613f4d565b6117259190613fe8565b905060006103e8611737846032613f4d565b6117419190613fe8565b90506000611750600283613fe8565b905061177c7f0000000000000000000000001d014a0d021667c6afb3f97eb13e4c7bf1dc94a982612fc9565b6117a67f0000000000000000000000004a37e5ff83b739a1d543feefa43b73712957da5b82612fc9565b6117d07f0000000000000000000000005efc2f54d6d104d1fad6716776b408d56a373a8983612fc9565b6117fa7f000000000000000000000000730243c9a5c8c1a092a3eb4fc2e0d8796501cfb484612fc9565b60408051600480825260a08201909252600091602082016080803683370190505090507f0000000000000000000000001d014a0d021667c6afb3f97eb13e4c7bf1dc94a98160008151811061185157611851613f8a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000004a37e5ff83b739a1d543feefa43b73712957da5b816001815181106118a5576118a5613f8a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000005efc2f54d6d104d1fad6716776b408d56a373a89816002815181106118f9576118f9613f8a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000730243c9a5c8c1a092a3eb4fc2e0d8796501cfb48160038151811061194d5761194d613f8a565b6001600160a01b039290921660209283029190910182015260408051600480825260a082019092526000929091908201608080368337019050509050828160008151811061199d5761199d613f8a565b60200260200101818152505082816001815181106119bd576119bd613f8a565b60200260200101818152505083816002815181106119dd576119dd613f8a565b60200260200101818152505084816003815181106119fd576119fd613f8a565b60200260200101818152505080604051611a179190613ffc565b604051809103902082604051611a2d9190614032565b6040519081900381209030907f7d148a78dd4772dd1b6008be07f3b70b1590d60b4b192e263cdcf1da2510f26f90600090a4505050505050565b80611a73816003541190565b611aa9576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000611ab58461293b565b90506000611ac4828487612992565b905080611afd576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611b3d576040517fd563b6a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b48828787612a2e565b611b6382878760405180602001604052806000815250613090565b61118c576040517f71fbfca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33611bac600a546001600160a01b031690565b6001600160a01b031614611bec576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600a5474010000000000000000000000000000000000000000900460ff166002811115611c1d57611c1d613ced565b14611c54576040517fe90d4d7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c5d81600c55565b50565b6000611c6b60035490565b8210611ca3576040517fa8111f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b600081611cb5816003541190565b611ceb576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600760205260409020546001600160a01b03165b9392505050565b33611d1e600a546001600160a01b031690565b6001600160a01b031614611d5e576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c5d81613209565b600081611d75816003541190565b611dab576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d04836132bb565b33611dc7600a546001600160a01b031690565b6001600160a01b031614611e07576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805182518114611e43576040517f9259bce600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b8015611e905783611e59600183613efd565b81518110611e6957611e69613f8a565b602002602001015182611e7c9190613ee5565b915080611e8881614065565b915050611e47565b50600f54811115611ecd576040517fb18f58ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f80548290039055815b801561129d57611f3085611eed600184613efd565b81518110611efd57611efd613f8a565b602002602001015185600184611f139190613efd565b81518110611f2357611f23613f8a565b6020026020010151612dc3565b80611f3a81614065565b915050611ed8565b600061095a8261333d565b6001600a5474010000000000000000000000000000000000000000900460ff166002811115611f7e57611f7e613ced565b14611fb5576040517fa11aad5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33816001806000611fc7858585612ed9565b905081811015612003576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f54612030907f00000000000000000000000000000000000000000000000000000000000015b3613efd565b60035461203e906001613ee5565b1115612076576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b347f00000000000000000000000000000000000000000000000000f5232269808000146120cf576040517f225456a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152600d602052604090208054600190810190915561118c908290612dc3565b60606001805461096f90613e68565b6002600a5474010000000000000000000000000000000000000000900460ff16600281111561213357612133613ced565b1461216a576040517f13ce6b3100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000058111156121c4576040517fb3ccae9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816121d060035490565b6121da9190613ee5565b9050600f547f00000000000000000000000000000000000000000000000000000000000015b361220a9190613efd565b811115612243576040517fc77894c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3461226e7f000000000000000000000000000000000000000000000000016345785d8a000084613f4d565b146122a5576040517f225456a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336114d38184612dc3565b336001600160a01b0383168114156122f4576040517fb3c28f3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381811660008181526006602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b8061238b816003541190565b6123c1576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360006123cd8461293b565b905060006123dc828487612992565b905080612415576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61129d828661335b565b33612432600a546001600160a01b031690565b6001600160a01b031614612472576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831617905550565b826124e4816003541190565b61251a576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360006125268661293b565b90506000612535828489612992565b90508061256e576040517fbdc31d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0388166125ae576040517fd563b6a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125b9828989612a2e565b6125fb82898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061309092505050565b612631576040517f71fbfca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b60608161264a816003541190565b612680576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002805461268f90613e68565b9050116126a45761269f836133a5565b611d04565b60026126af846133a5565b6040516020016126c09291906140b6565b604051602081830303815290604052915050919050565b336126ea600a546001600160a01b031690565b6001600160a01b03161461272a576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61273482826134d7565b5050565b6000611d048383613550565b33612757600a546001600160a01b031690565b6001600160a01b031614612797576040517f01b09f9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000148061289457507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b8061095a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061095a575061095a82612801565b60008181526004602052604081205482906001600160a01b03165b6001600160a01b038116611d04578161296e81614065565b6000818152600460205260409020549093506001600160a01b031691506129569050565b600080846001600160a01b0316846001600160a01b031614806129ce57506000838152600560205260409020546001600160a01b038581169116145b806129de57506129de8585613550565b95945050505050565b600081838111156129f9575082612a0e565b83831015612a0e57612a0b8385613efd565b91505b8015612a1e57612a1e8582613590565b811561129d5761129d8583612dc3565b600081815260056020526040812080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905581612a6e576000612a79565b612a79600183613efd565b90506000612a88836001613ee5565b905060008383108015612aa15750612aa1836003541190565b8015612ac257506000838152600460205260409020546001600160a01b0316155b90506000612ad1836003541190565b8015612af257506000838152600460205260409020546001600160a01b0316155b90508115612b3a57600084815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389161790555b8015612b8057600083815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389161790555b60008581526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a811691821790925591518893918b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050505050565b600080821580612c085750600854155b15612c225750506009546001600160a01b03166000612c51565b600061271084600854612c359190613f4d565b612c3f9190613fe8565b6009546001600160a01b031693509150505b9250929050565b612c63308383612a2e565b600090815260076020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b60006001600160a01b038216612cb257506000919050565b6000612cbd60035490565b9050600080805b83811015612d3e576000818152600460205260409020546001600160a01b031615612d04576000818152600460205260409020546001600160a01b031691505b816001600160a01b0316866001600160a01b03161415612d2c5782612d2881613f14565b9350505b80612d3681613f14565b915050612cc4565b5090949350505050565b60006001600160a01b038216612d6057506000919050565b6000612d6b60035490565b90506000805b82811015612dbb576000818152600760205260409020546001600160a01b0386811691161415612da95781612da581613f14565b9250505b80612db381613f14565b915050612d71565b509392505050565b60035460006001612dd48484613ee5565b612dde9190613efd565b600083815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038716179055905081811115612e6757600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386161790555b60005b83811015612ec457612e7c8184613ee5565b6040516001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480612ebc81613f14565b915050612e6a565b50612ed0816001613ee5565b60035550505050565b600c54600090612f15576040517fc71bad4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166000908152600d60205260409020548211612f66576040517fde33971400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f70848461361a565b612fa6576040517fa432706200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b0383166000908152600d602052604090205481039392505050565b80471015613003576040517f225456a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613050576040519150601f19603f3d011682016040523d82523d6000602084013e613055565b606091505b50509050806114d3576040517ff12332f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000833b80156131ff576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063150b7a02906130e59033908a908990899060040161418b565b6020604051808303816000875af192505050801561313e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261313b918101906141c7565b60015b6131b2573d80801561316c576040519150601f19603f3d011682016040523d82523d6000602084013e613171565b606091505b5080516131aa576040517f71fbfca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149150610d329050565b6001915050610d32565b600a80547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600281111561326557613265613ced565b021790555081600281111561327c5761327c613ced565b81600281111561328e5761328e613ced565b6040517fe2034a7bf30bb7c637ee4fd008478210b21708c5c7177151827a49a6877a020d90600090a35050565b6000816132c9816003541190565b6132ff576040517f89a111e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061330a8461293b565b90506001600160a01b038116301415611d04576000848152600760205260409020546001600160a01b0316925050610a51565b600061334882612c9a565b61335183612d48565b61095a9190613ee5565b600081815260076020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416179055612734823083612a2e565b6060816133e557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561340f57806133f981613f14565b91506134089050600a83613fe8565b91506133e9565b60008167ffffffffffffffff81111561342a5761342a61392c565b6040519080825280601f01601f191660200182016040528015613454576020820181803683370190505b5090505b8415610d3257613469600183613efd565b9150613476600a866141e4565b613481906030613ee5565b60f81b81838151811061349657613496613f8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506134d0600a86613fe8565b9450613458565b612710811115613513576040517fb6eb28ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600855600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600061355c838361367f565b80611d0457506001600160a01b0380841660009081526006602090815260408083209386168352929052205460ff16611d04565b600061359b60035490565b9050600060016135ab8484613ee5565b6135b59190613efd565b90505b80821161361057600082815260076020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386161790558161360881613f14565b9250506135b8565b610d0a3084612dc3565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050600c546136768483613770565b14949350505050565b6000805b600b54811015613766576000600b82815481106136a2576136a2613f8a565b6000918252602090912001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152918216925090851690829063c455279190602401602060405180830381865afa158015613715573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373991906141f8565b6001600160a01b031614156137535760019250505061095a565b508061375e81613f14565b915050613683565b5060009392505050565b600081815b8451811015612dbb57600085828151811061379257613792613f8a565b602002602001015190508083116137b857600083815260208290526040902092506137c9565b600081815260208490526040902092505b50806137d481613f14565b915050613775565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611c5d57600080fd5b60006020828403121561381c57600080fd5b8135611d04816137dc565b60005b8381101561384257818101518382015260200161382a565b83811115610d0a5750506000910152565b6000815180845261386b816020860160208601613827565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d046020830184613853565b6000602082840312156138c257600080fd5b5035919050565b6001600160a01b0381168114611c5d57600080fd5b600080604083850312156138f157600080fd5b82356138fc816138c9565b946020939093013593505050565b6000806040838503121561391d57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139a2576139a261392c565b604052919050565b600080600080608085870312156139c057600080fd5b84356139cb816138c9565b93506020858101356139dc816138c9565b935060408601359250606086013567ffffffffffffffff80821115613a0057600080fd5b818801915088601f830112613a1457600080fd5b813581811115613a2657613a2661392c565b613a56847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161395b565b91508082528984828501011115613a6c57600080fd5b808484018584013760008482840101525080935050505092959194509250565b600067ffffffffffffffff821115613aa657613aa661392c565b5060051b60200190565b600082601f830112613ac157600080fd5b81356020613ad6613ad183613a8c565b61395b565b82815260059290921b84018101918181019086841115613af557600080fd5b8286015b84811015613b105780358352918301918301613af9565b509695505050505050565b60008060408385031215613b2e57600080fd5b823567ffffffffffffffff80821115613b4657600080fd5b818501915085601f830112613b5a57600080fd5b81356020613b6a613ad183613a8c565b82815260059290921b84018101918181019089841115613b8957600080fd5b948201945b83861015613bb0578535613ba1816138c9565b82529482019490820190613b8e565b96505086013592505080821115613bc657600080fd5b50613bd385828601613ab0565b9150509250929050565b600080600060608486031215613bf257600080fd5b8335613bfd816138c9565b92506020840135613c0d816138c9565b929592945050506040919091013590565b600060208284031215613c3057600080fd5b8135611d04816138c9565b60006020808385031215613c4e57600080fd5b823567ffffffffffffffff811115613c6557600080fd5b8301601f81018513613c7657600080fd5b8035613c84613ad182613a8c565b81815260059190911b82018301908381019087831115613ca357600080fd5b928401925b82841015613cc157833582529284019290840190613ca8565b979650505050505050565b600060208284031215613cde57600080fd5b813560038110611d0457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613d57577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060408385031215613d7057600080fd5b8235613d7b816138c9565b915060208301358015158114613d9057600080fd5b809150509250929050565b600080600080600060808688031215613db357600080fd5b8535613dbe816138c9565b94506020860135613dce816138c9565b935060408601359250606086013567ffffffffffffffff80821115613df257600080fd5b818801915088601f830112613e0657600080fd5b813581811115613e1557600080fd5b896020828501011115613e2757600080fd5b9699959850939650602001949392505050565b60008060408385031215613e4d57600080fd5b8235613e58816138c9565b91506020830135613d90816138c9565b600181811c90821680613e7c57607f821691505b60208210811415610a51577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613ef857613ef8613eb6565b500190565b600082821015613f0f57613f0f613eb6565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f4657613f46613eb6565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f8557613f85613eb6565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613ff757613ff7613fb9565b500490565b815160009082906020808601845b838110156140265781518552938201939082019060010161400a565b50929695505050505050565b815160009082906020808601845b838110156140265781516001600160a01b031685529382019390820190600101614040565b60008161407457614074613eb6565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600081516140ac818560208601613827565b9290920192915050565b600080845481600182811c9150808316806140d257607f831692505b602080841082141561410b577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561411f576001811461414e5761417b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061417b565b60008b81526020902060005b868110156141735781548b82015290850190830161415a565b505084890196505b5050505050506129de818561409a565b60006001600160a01b038087168352808616602084015250836040830152608060608301526141bd6080830184613853565b9695505050505050565b6000602082840312156141d957600080fd5b8151611d04816137dc565b6000826141f3576141f3613fb9565b500690565b60006020828403121561420a57600080fd5b8151611d04816138c956fea2646970667358221220161d9fed2d15321556ab0a7c3fd07cb94c59e02dcc41f6f3f24781a25c00f65164736f6c634300080a0033

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

00000000000000000000000000000000000000000000000000000000000003f5000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000015b3000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000f5232269808000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000001c436f6c6c6563746f727320436c756220466f756e64657273204b65790000000000000000000000000000000000000000000000000000000000000000000000044343464b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003868747470733a2f2f636f6c6c6563746f7273636c75622e696f2f6170692f666f756e646572732f6d657461646174613f746f6b656e49443d00000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000730243c9a5c8c1a092a3eb4fc2e0d8796501cfb40000000000000000000000005efc2f54d6d104d1fad6716776b408d56a373a890000000000000000000000004a37e5ff83b739a1d543feefa43b73712957da5b0000000000000000000000001d014a0d021667c6afb3f97eb13e4c7bf1dc94a9

-----Decoded View---------------
Arg [0] : reserve_ (uint256): 1013
Arg [1] : maxBatch_ (uint256): 5
Arg [2] : maxSupply_ (uint256): 5555
Arg [3] : royaltyRate_ (uint256): 75
Arg [4] : wlMintPrice_ (uint256): 69000000000000000
Arg [5] : publicMintPrice_ (uint256): 100000000000000000
Arg [6] : name_ (string): Collectors Club Founders Key
Arg [7] : symbol_ (string): CCFK
Arg [8] : baseURI_ (string): https://collectorsclub.io/api/founders/metadata?tokenID=
Arg [9] : wallets_ (address[]): 0x730243c9A5C8c1A092a3EB4Fc2E0D8796501cfb4,0x5EFC2F54D6D104d1fad6716776b408d56A373A89,0x4a37E5ff83b739A1d543FEEfa43B73712957DA5b,0x1d014a0D021667C6aFB3F97eB13E4C7bF1dC94A9

-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000003f5
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [2] : 00000000000000000000000000000000000000000000000000000000000015b3
Arg [3] : 000000000000000000000000000000000000000000000000000000000000004b
Arg [4] : 00000000000000000000000000000000000000000000000000f5232269808000
Arg [5] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [8] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [10] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [11] : 436f6c6c6563746f727320436c756220466f756e64657273204b657900000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [13] : 4343464b00000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000038
Arg [15] : 68747470733a2f2f636f6c6c6563746f7273636c75622e696f2f6170692f666f
Arg [16] : 756e646572732f6d657461646174613f746f6b656e49443d0000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [18] : 000000000000000000000000730243c9a5c8c1a092a3eb4fc2e0d8796501cfb4
Arg [19] : 0000000000000000000000005efc2f54d6d104d1fad6716776b408d56a373a89
Arg [20] : 0000000000000000000000004a37e5ff83b739a1d543feefa43b73712957da5b
Arg [21] : 0000000000000000000000001d014a0d021667c6afb3f97eb13e4c7bf1dc94a9


Deployed Bytecode Sourcemap

45094:14658:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59373:332;;;;;;;;;;-1:-1:-1;59373:332:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;59373:332:0;;;;;;;;33856:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33335:148::-;;;;;;;;;;-1:-1:-1;33335:148:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1819:55:1;;;1801:74;;1789:2;1774:18;33335:148:0;1655:226:1;29499:510:0;;;;;;;;;;-1:-1:-1;29499:510:0;;;;;:::i;:::-;;:::i;:::-;;50532:482;;;;;;;;;;-1:-1:-1;50532:482:0;;;;;:::i;:::-;;:::i;41419:163::-;;;;;;;;;;-1:-1:-1;41419:163:0;;;;;:::i;:::-;;:::i;:::-;;;4492:66:1;4480:79;;;4462:98;;4450:2;4435:18;41419:163:0;4318:248:1;44704:266:0;;;;;;;;;;;;;:::i;:::-;;;4717:25:1;;;4705:2;4690:18;44704:266:0;4571:177:1;53807:511:0;;;;;;:::i;:::-;;:::i;55602:354::-;;;;;;;;;;-1:-1:-1;55602:354:0;;;;;:::i;:::-;;:::i;32361:489::-;;;;;;;;;;-1:-1:-1;32361:489:0;;;;;:::i;:::-;;:::i;59113:198::-;;;;;;;;;;-1:-1:-1;59113:198:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7481:55:1;;;7463:74;;7568:2;7553:18;;7546:34;;;;7436:18;59113:198:0;7289:297:1;39432:366:0;;;;;;;;;;-1:-1:-1;39432:366:0;;;;;:::i;:::-;;:::i;44138:504::-;;;;;;;;;;-1:-1:-1;44138:504:0;;;;;:::i;:::-;;:::i;45938:32::-;;;;;;;;;;;;;;;40316:138;;;;;;;;;;-1:-1:-1;40316:138:0;;;;;:::i;:::-;;:::i;49693:434::-;;;;;;;;;;-1:-1:-1;49693:434:0;;;;;:::i;:::-;;:::i;46378:50::-;;;;;;;;;;-1:-1:-1;46378:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;52126:453;;;;;;:::i;:::-;;:::i;57230:982::-;;;;;;;;;;;;;:::i;30242:617::-;;;;;;;;;;-1:-1:-1;30242:617:0;;;;;:::i;:::-;;:::i;56939:103::-;;;;;;;;;;-1:-1:-1;56939:103:0;;;;;:::i;:::-;;:::i;43861:207::-;;;;;;;;;;-1:-1:-1;43861:207:0;;;;;:::i;:::-;;:::i;41005:147::-;;;;;;;;;;-1:-1:-1;41005:147:0;;;;;:::i;:::-;;:::i;56654:102::-;;;;;;;;;;-1:-1:-1;56654:102:0;;;;;:::i;:::-;;:::i;5954:26::-;;;;;;;;;;-1:-1:-1;5954:26:0;;;;;;;;;;;;;;;;;;:::i;58800:197::-;;;;;;;;;;-1:-1:-1;58800:197:0;;;;;:::i;:::-;;:::i;54772:579::-;;;;;;;;;;-1:-1:-1;54772:579:0;;;;;:::i;:::-;;:::i;45861:39::-;;;;;;;;;;;;;;;58470:196;;;;;;;;;;-1:-1:-1;58470:196:0;;;;;:::i;:::-;;:::i;51348:434::-;;;;;;:::i;:::-;;:::i;45766:35::-;;;;;;;;;;;;;;;8091:80;;;;;;;;;;-1:-1:-1;8160:6:0;;-1:-1:-1;;;;;8160:6:0;8091:80;;45988:31;;;;;;;;;;;;;;;34616:99;;;;;;;;;;;;;:::i;52893:463::-;;;;;;:::i;:::-;;:::i;31796:336::-;;;;;;;;;;-1:-1:-1;31796:336:0;;;;;:::i;:::-;;:::i;38853:356::-;;;;;;;;;;-1:-1:-1;38853:356:0;;;;;:::i;:::-;;:::i;56092:132::-;;;;;;;;;;-1:-1:-1;56092:132:0;;;;;:::i;:::-;;:::i;31092:642::-;;;;;;;;;;-1:-1:-1;31092:642:0;;;;;:::i;:::-;;:::i;34776:247::-;;;;;;;;;;-1:-1:-1;34776:247:0;;;;;:::i;:::-;;:::i;56366:156::-;;;;;;;;;;-1:-1:-1;56366:156:0;;;;;:::i;:::-;;:::i;33630:169::-;;;;;;;;;;-1:-1:-1;33630:169:0;;;;;:::i;:::-;;:::i;8491:188::-;;;;;;;;;;-1:-1:-1;8491:188:0;;;;;:::i;:::-;;:::i;59373:332::-;59511:4;59537:44;;;59553:28;59537:44;;:98;;;59590:45;59621:12;59590:29;:45::i;:::-;59537:162;;;;59644:55;59685:12;59644:39;:55::i;:::-;59524:175;59373:332;-1:-1:-1;;59373:332:0:o;33856:95::-;33911:13;33940:5;33933:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33856:95;:::o;33335:148::-;33427:7;33406:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;33450:27:::1;::::0;;;:15:::1;:27;::::0;;;;;-1:-1:-1;;;;;33450:27:0::1;::::0;-1:-1:-1;21317:1:0::1;33335:148:::0;;;;:::o;29499:510::-;29574:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;10353:10;29591:18:::1;29653:20;29663:8:::0;29653::::1;:20::i;:::-;29630:43;;29679:17;29699:56;29719:12;29733:10;29745:8;29699:18;:56::i;:::-;29679:76;;29770:12;29763:72;;29799:29;;;;;;;;;;;;;;29763:72;29854:12;-1:-1:-1::0;;;;;29847:19:0::1;:3;-1:-1:-1::0;;;;;29847:19:0::1;;29842:71;;;29883:23;;;;;;;;;;;;;;29842:71;29920:27;::::0;;;:15:::1;:27;::::0;;;;;:33;;;::::1;-1:-1:-1::0;;;;;29920:33:0;;::::1;::::0;;::::1;::::0;;;29964:39;;29920:27;;29964:39;;::::1;::::0;::::1;::::0;::::1;29585:424;;;29499:510:::0;;;:::o;50532:482::-;6888:17;6875:9;;;;;;;:30;;;;;;;;:::i;:::-;;6870:85;;6921:28;;;;;;;;;;;;;;6870:85;10353:10;50618:17:::1;50670:26:::0;;;:13:::1;:26;::::0;;;;;50663:33;::::1;50658:88;;;50713:26;;;;;;;;;;;;;;50658:88;50753:19;50793:4;50775:15;27554:10:::0;;;27474:96;50775:15:::1;:22;;;;:::i;:::-;50753:44;;50835:8;;50822:10;:21;;;;:::i;:::-;50808:11;:35;50803:91;;;50860:27;;;;;;;;;;;;;;50803:91;-1:-1:-1::0;;;;;50918:26:0;::::1;;::::0;;;:13:::1;:26;::::0;;;;:34;;;;::::1;::::0;;50964:44:::1;50933:9:::0;50948:4;50996:10;50964:13:::1;:44::i;:::-;50612:402;;50532:482:::0;;:::o;41419:163::-;41541:35;41419:163;;;;;;;:::o;44704:266::-;44766:7;44781:22;44806:15;27554:10;;;27474:96;44806:15;44781:40;;44826:15;44856:9;44850:97;44871:14;44867:1;:18;44850:97;;;44904:12;44913:1;24377:10;;-1:-1:-1;24366:21:0;24277:116;44904:12;44899:43;;;44926:9;;;;:::i;:::-;;;;44899:43;44887:3;;;;:::i;:::-;;;;44850:97;;;-1:-1:-1;44958:7:0;44704:266;-1:-1:-1;;44704:266:0:o;53807:511::-;6707:14;6694:9;;;;;;;:27;;;;;;;;:::i;:::-;;6689:79;;6737:25;;;;;;;;;;;;;;6689:79;53909:9:::1;53902:4;:16;53897:71;;;53935:26;;;;;;;;;;;;;;53897:71;53975:19;54016:4;53998:15;27554:10:::0;;;27474:96;53998:15:::1;:22;;;;:::i;:::-;53975:45;;54058:8;;54045:10;:21;;;;:::i;:::-;54031:11;:35;54026:91;;;54083:27;;;;;;;;;;;;;;54026:91;54157:9;54129:24;54136:17;54129:4:::0;:24:::1;:::i;:::-;:37;54124:98;;54183:32;;;;;;;;;;;;;;54124:98;10353:10:::0;54268:44:::1;10353:10:::0;54294:4;54300:10;54268:13:::1;:44::i;55602:354::-:0;8292:10;8281:7;8160:6;;-1:-1:-1;;;;;8160:6:0;;8091:80;8281:7;-1:-1:-1;;;;;8281:21:0;;8276:68;;8318:20;;;;;;;;;;;;;;8276:68;6528:16:::1;6515:9;::::0;;;::::1;;;:29;::::0;::::1;;;;;;:::i;:::-;;6510:83;;6560:27;;;;;;;;;;;;;;6510:83;55737:15:::0;;55772:16;;55763:25;::::2;55758:92;;55805:38;;;;;;;;;;;;;;55758:92;55861:9;55855:96;55876:5;55872:1;:9;55855:96;;;55931:8;55941:1;55931:13;;;;;;;;:::i;:::-;;;;;;;55897;:31;55912:9;55923:1;55912:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;55897:31:0::2;-1:-1:-1::0;;;;;55897:31:0::2;;;;;;;;;;;;:47;;;;55883:4;;;;;:::i;:::-;;;;55855:96;;32361:489:::0;32450:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;10353:10;32467:18:::1;32529:20;32539:8:::0;32529::::1;:20::i;:::-;32506:43;;32555:17;32575:56;32595:12;32609:10;32621:8;32575:18;:56::i;:::-;32555:76;;32646:12;32639:72;;32675:29;;;;;;;;;;;;;;32639:72;-1:-1:-1::0;;;;;32723:19:0;::::1;32718:79;;32759:31;;;;;;;;;;;;;;32718:79;32804:40;32815:12;32829:3;32834:8;32804:9;:40::i;:::-;32461:389;;;32361:489:::0;;;;:::o;59113:198::-;59232:7;59241;59211:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;59264:41:::1;59283:8;59293:10;59264:17;:41::i;:::-;59257:48;;;;59113:198:::0;;;;;;:::o;39432:366::-;39486:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;39503:18:::1;37844:25:::0;;;:13;:25;;;;;;10353:10;;-1:-1:-1;;;;;37844:25:0;;;;39617:56:::1;37844:25:::0;10353:10;37844:25;39617:18:::1;:56::i;:::-;39597:76;;39688:12;39681:72;;39717:29;;;;;;;;;;;;;;39681:72;39758:34;39768:12;39782:8;39758;:34::i;:::-;39497:301;;;39432:366:::0;;:::o;44138:504::-;44245:15;44268:22;44293:15;27554:10;;;27474:96;44293:15;44268:40;;44328:25;44340:11;44328:10;:25::i;:::-;44318:6;:35;44313:107;;44369:45;;;;;;;;;;;;;;44313:107;44426:15;44456:9;44450:188;44475:14;44471:1;:18;44450:188;;;44508:12;44517:1;24377:10;;-1:-1:-1;24366:21:0;24277:116;44508:12;:44;;;;;44539:13;44549:1;44539:8;:13::i;:::-;-1:-1:-1;;;;;44524:28:0;:11;-1:-1:-1;;;;;44524:28:0;;44508:44;44503:130;;;44577:7;44567:6;:17;44562:49;;;44602:1;-1:-1:-1;44595:8:0;;-1:-1:-1;;44595:8:0;44562:49;44617:9;;;;:::i;:::-;;;;44503:130;44491:3;;;;:::i;:::-;;;;44450:188;;;;44263:379;;44138:504;;;;:::o;40316:138::-;40394:7;40417:31;40435:11;40417:16;:31::i;49693:434::-;6888:17;6875:9;;;;;;;:30;;;;;;;;:::i;:::-;;6870:85;;6921:28;;;;;;;;;;;;;;6870:85;10353:10;49751:17:::1;49803:26:::0;;;:13:::1;:26;::::0;;;;;49796:33;::::1;49791:88;;;49846:26;;;;;;;;;;;;;;49791:88;49886:19;49926:4;49908:15;27554:10:::0;;;27474:96;49908:15:::1;:22;;;;:::i;:::-;49886:44;;49968:8;;49955:10;:21;;;;:::i;:::-;49941:11;:35;49936:91;;;49993:27;;;;;;;;;;;;;;49936:91;-1:-1:-1::0;;;;;50051:26:0;::::1;;::::0;;;:13:::1;:26;::::0;;;;:34;;;;::::1;::::0;;50097:24:::1;50066:9:::0;50081:4;50097:5:::1;:24::i;:::-;49745:382;;49693:434:::0;:::o;52126:453::-;6888:17;6875:9;;;;;;;:30;;;;;;;;:::i;:::-;;6870:85;;6921:28;;;;;;;;;;;;;;6870:85;10353:10;52240:6;52248:1:::1;::::0;2977:17:::1;2997:54;3023:8;3033:6;3041:8;2997:24;:54::i;:::-;2977:74;;3075:4;3063:9;:16;3058:69;;;3095:26;;;;;;;;;;;;;;3058:69;52301:8:::2;::::0;52288:21:::2;::::0;:10:::2;:21;:::i;:::-;27554:10:::0;;52266:19:::2;::::0;52284:1:::2;52266:19;:::i;:::-;:43;52261:99;;;52326:27;;;;;;;;;;;;;;52261:99;52389:9;52372:13;:26;52367:87;;52415:32;;;;;;;;;;;;;;52367:87;10353:10:::0;52461:17:::2;4495:21:::0;;;:9;:21;;;;;:29;;52532:1:::2;4495:29:::0;;;;;;52541:32:::2;::::0;10353:10;;52532:1;52541:13:::2;:32::i;57230:982::-:0;8292:10;8281:7;8160:6;;-1:-1:-1;;;;;8160:6:0;;8091:80;8281:7;-1:-1:-1;;;;;8281:21:0;;8276:68;;8318:20;;;;;;;;;;;;;;8276:68;57295:21:::1;57327:14:::0;57322:76:::1;;57358:33;;;;;;;;;;;;;;57322:76;57405:19;57445:4;57427:15;:9:::0;57439:3:::1;57427:15;:::i;:::-;:22;;;;:::i;:::-;57405:44:::0;-1:-1:-1;57455:22:0::1;57497:4;57480:14;:9:::0;57492:2:::1;57480:14;:::i;:::-;:21;;;;:::i;:::-;57455:46:::0;-1:-1:-1;57507:21:0::1;57531:18;57548:1;57455:46:::0;57531:18:::1;:::i;:::-;57507:42;;57555:53;57576:13;57593;57555:10;:53::i;:::-;57614:52;57635:12;57651:13;57614:10;:52::i;:::-;57672;57693:11;57708:14;57672:10;:52::i;:::-;57730:46;57751:8;57763:11;57730:10;:46::i;:::-;57809:18;::::0;;57824:1:::1;57809:18:::0;;;;;::::1;::::0;;;57784:22:::1;::::0;57809:18:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;57809:18:0::1;57784:43;;57846:13;57833:5;57840:1;57833:10;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1::0;;;;;57833:26:0::1;;;-1:-1:-1::0;;;;;57833:26:0::1;;;::::0;::::1;57878:12;57865:5;57872:1;57865:10;;;;;;;;:::i;:::-;;;;;;:25;-1:-1:-1::0;;;;;57865:25:0::1;;;-1:-1:-1::0;;;;;57865:25:0::1;;;::::0;::::1;57909:11;57896:5;57903:1;57896:10;;;;;;;;:::i;:::-;;;;;;:24;-1:-1:-1::0;;;;;57896:24:0::1;;;-1:-1:-1::0;;;;;57896:24:0::1;;;::::0;::::1;57939:8;57926:5;57933:1;57926:10;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57926:21:0;;;::::1;:10;::::0;;::::1;::::0;;;;;;:21;57982:18:::1;::::0;;57997:1:::1;57982:18:::0;;;;;::::1;::::0;;;57953:26:::1;::::0;57982:18;;57997:1;57982:18;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;57982:18:0::1;57953:47;;58023:13;58006:9;58017:1;58006:14;;;;;;;;:::i;:::-;;;;;;:30;;;::::0;::::1;58059:13;58042:9;58053:1;58042:14;;;;;;;;:::i;:::-;;;;;;:30;;;::::0;::::1;58095:14;58078:9;58089:1;58078:14;;;;;;;;:::i;:::-;;;;;;:31;;;::::0;::::1;58132:11;58115:9;58126:1;58115:14;;;;;;;;:::i;:::-;;;;;;:28;;;::::0;::::1;58195:9;58154:52;;;;;;:::i;:::-;;;;;;;;58188:5;58154:52;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;;58180:4:::1;::::0;58154:52:::1;::::0;;;::::1;57269:943;;;;;;57230:982::o:0;30242:617::-;30335:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;10353:10;30352:18:::1;30414:20;30424:8:::0;30414::::1;:20::i;:::-;30391:43;;30440:17;30460:56;30480:12;30494:10;30506:8;30460:18;:56::i;:::-;30440:76;;30531:12;30524:72;;30560:29;;;;;;;;;;;;;;30524:72;-1:-1:-1::0;;;;;30608:19:0;::::1;30603:79;;30644:31;;;;;;;;;;;;;;30603:79;30689:40;30700:12;30714:3;30719:8;30689:9;:40::i;:::-;30744:57;30768:12;30782:3;30787:8;30744:57;;;;;;;;;;;::::0;:22:::1;:57::i;:::-;30737:117;;30818:29;;;;;;;;;;;;;;56939:103:::0;8292:10;8281:7;8160:6;;-1:-1:-1;;;;;8160:6:0;;8091:80;8281:7;-1:-1:-1;;;;;8281:21:0;;8276:68;;8318:20;;;;;;;;;;;;;;8276:68;6528:16:::1;6515:9;::::0;;;::::1;;;:29;::::0;::::1;;;;;;:::i;:::-;;6510:83;;6560:27;;;;;;;;;;;;;;6510:83;57014:22:::2;57029:5;3266::::0;:13;3204:80;57014:22:::2;56939:103:::0;:::o;43861:207::-;43940:7;43970:15;27554:10;;;27474:96;43970:15;43960:6;:25;43955:91;;44001:39;;;;;;;;;;;;;;43955:91;-1:-1:-1;44057:6:0;43861:207::o;41005:147::-;41097:7;41076:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;37821:7;37844:25;;;:13;:25;;;;;;-1:-1:-1;;;;;37844:25:0;41120:26:::1;41113:33:::0;41005:147;-1:-1:-1;;;41005:147:0:o;56654:102::-;8292:10;8281:7;8160:6;;-1:-1:-1;;;;;8160:6:0;;8091:80;8281:7;-1:-1:-1;;;;;8281:21:0;;8276:68;;8318:20;;;;;;;;;;;;;;8276:68;56724:26:::1;56739:9;56724:13;:26::i;58800:197::-:0;58929:7;58908:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;58952:39:::1;58981:8;58952:27;:39::i;54772:579::-:0;8292:10;8281:7;8160:6;;-1:-1:-1;;;;;8160:6:0;;8091:80;8281:7;-1:-1:-1;;;;;8281:21:0;;8276:68;;8318:20;;;;;;;;;;;;;;8276:68;54887:15;;54922:16;;54913:25;::::1;54908:92;;54955:38;;;;;;;;;;;;;;54908:92;55005:15;55044:5:::0;55026:84:::1;55051:5:::0;;55026:84:::1;;55086:8:::0;55096:5:::1;55100:1;55096::::0;:5:::1;:::i;:::-;55086:17;;;;;;;;:::i;:::-;;;;;;;55072:31;;;;;:::i;:::-;::::0;-1:-1:-1;55058:4:0;::::1;::::0;::::1;:::i;:::-;;;;55026:84;;;;55133:8;;55120:10;:21;55115:78;;;55158:28;;;;;;;;;;;;;;55115:78;55215:8;:22:::0;;;;::::1;::::0;;55267:5;55249:97:::1;55274:5:::0;;55249:97:::1;;55295:44;55302:9:::0;55313:5:::1;55317:1;55313::::0;:5:::1;:::i;:::-;55302:17;;;;;;;;:::i;:::-;;;;;;;55321:8;55335:1;55331;:5;;;;:::i;:::-;55321:16;;;;;;;;:::i;:::-;;;;;;;55295:5;:44::i;:::-;55281:4:::0;::::1;::::0;::::1;:::i;:::-;;;;55249:97;;58470:196:::0;58585:15;58616:44;58647:11;58616:29;:44::i;51348:434::-;6888:17;6875:9;;;;;;;:30;;;;;;;;:::i;:::-;;6870:85;;6921:28;;;;;;;;;;;;;;6870:85;10353:10;51454:6;51462:1:::1;::::0;2977:17:::1;2997:54;3023:8;3033:6;3041:8;2997:24;:54::i;:::-;2977:74;;3075:4;3063:9;:16;3058:69;;;3095:26;;;;;;;;;;;;;;3058:69;51515:8:::2;::::0;51502:21:::2;::::0;:10:::2;:21;:::i;:::-;27554:10:::0;;51480:19:::2;::::0;51498:1:::2;51480:19;:::i;:::-;:43;51475:99;;;51540:27;;;;;;;;;;;;;;51475:99;51603:9;51586:13;:26;51581:87;;51629:32;;;;;;;;;;;;;;51581:87;10353:10:::0;51675:17:::2;4495:21:::0;;;:9;:21;;;;;:29;;51746:1:::2;4495:29:::0;;;;;;51755:21:::2;::::0;10353:10;;51755:5:::2;:21::i;34616:99::-:0;34673:13;34702:7;34695:14;;;;;:::i;52893:463::-;6707:14;6694:9;;;;;;;:27;;;;;;;;:::i;:::-;;6689:79;;6737:25;;;;;;;;;;;;;;6689:79;52967:9:::1;52960:4;:16;52955:71;;;52993:26;;;;;;;;;;;;;;52955:71;53033:19;53074:4;53056:15;27554:10:::0;;;27474:96;53056:15:::1;:22;;;;:::i;:::-;53033:45;;53116:8;;53103:10;:21;;;;:::i;:::-;53089:11;:35;53084:91;;;53141:27;;;;;;;;;;;;;;53084:91;53215:9;53187:24;53194:17;53187:4:::0;:24:::1;:::i;:::-;:37;53182:98;;53241:32;;;;;;;;;;;;;;53182:98;10353:10:::0;53326:24:::1;10353:10:::0;53344:4;53326:5:::1;:24::i;31796:336::-:0;10353:10;-1:-1:-1;;;;;31933:22:0;;;;31928:75;;;31972:24;;;;;;;;;;;;;;31928:75;-1:-1:-1;;;;;32010:31:0;;;;;;;:18;:31;;;;;;;;:44;;;;;;;;;;;;;:56;;;;;;;;;;;;;32077:49;;586:41:1;;;32077:49:0;;559:18:1;32077:49:0;;;;;;;31884:248;31796:336;;:::o;38853:356::-;38905:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;10353:10;38922:18:::1;38984:20;38994:8:::0;38984::::1;:20::i;:::-;38961:43;;39010:17;39030:56;39050:12;39064:10;39076:8;39030:18;:56::i;:::-;39010:76;;39101:12;39094:72;;39130:29;;;;;;;;;;;;;;39094:72;39171:32;39179:12;39193:8;39171:6;:32::i;56092:132::-:0;8292:10;8281:7;8160:6;;-1:-1:-1;;;;;8160:6:0;;8091:80;8281:7;-1:-1:-1;;;;;8281:21:0;;8276:68;;8318:20;;;;;;;;;;;;;;8276:68;4960:16;:46;;;;;;;-1:-1:-1;4960:46:0;;;;;;;;;;-1:-1:-1;;;;;4960:46:0;;;;;56939:103;:::o;31092:642::-;31207:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;10353:10;31224:18:::1;31286:20;31296:8:::0;31286::::1;:20::i;:::-;31263:43;;31312:17;31332:56;31352:12;31366:10;31378:8;31332:18;:56::i;:::-;31312:76;;31403:12;31396:72;;31432:29;;;;;;;;;;;;;;31396:72;-1:-1:-1::0;;;;;31480:19:0;::::1;31475:79;;31516:31;;;;;;;;;;;;;;31475:79;31561:40;31572:12;31586:3;31591:8;31561:9;:40::i;:::-;31616:60;31640:12;31654:3;31659:8;31669:5;;31616:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31616:22:0::1;::::0;-1:-1:-1;;;31616:60:0:i:1;:::-;31609:120;;31693:29;;;;;;;;;;;;;;31609:120;31218:516;;;31092:642:::0;;;;;;:::o;34776:247::-;34872:13;34851:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;34928:1:::1;34908:8;34901:24;;;;;:::i;:::-;;;:28;:116;;34996:21;35007:8;34996:9;:21::i;:::-;34901:116;;;34958:8;34968:21;34979:8;34968:9;:21::i;:::-;34940:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34894:123;;34776:247:::0;;;;:::o;56366:156::-;8292:10;8281:7;8160:6;;-1:-1:-1;;;;;8160:6:0;;8091:80;8281:7;-1:-1:-1;;;;;8281:21:0;;8276:68;;8318:20;;;;;;;;;;;;;;8276:68;56466:50:::1;56483:17;56502:12;56466:15;:50::i;:::-;56366:156:::0;;:::o;33630:169::-;33730:4;33750:43;33769:11;33782:9;33750:17;:43::i;8491:188::-;8292:10;8281:7;8160:6;;-1:-1:-1;;;;;8160:6:0;;8091:80;8281:7;-1:-1:-1;;;;;8281:21:0;;8276:68;;8318:20;;;;;;;;;;;;;;8276:68;8590:6:::1;::::0;;-1:-1:-1;;;;;8601:18:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;8629:45:::1;::::0;8590:6;::::1;::::0;8601:18;8590:6;;8629:45:::1;::::0;8569:18:::1;::::0;8629:45:::1;8564:115;8491:188:::0;:::o;34281:276::-;34370:4;34396:51;;;34412:35;34396:51;;:103;;-1:-1:-1;34456:43:0;;;34472:27;34456:43;34396:103;:155;;;-1:-1:-1;34508:43:0;;;34524:27;34508:43;34383:168;34281:276;-1:-1:-1;;34281:276:0:o;43558:240::-;43669:4;43693:53;;;43709:37;43693:53;;:100;;;43754:39;43779:12;43754:23;:39::i;26812:308::-;26882:7;26955:20;;;:7;:20;;;;;;26918:8;;-1:-1:-1;;;;;26955:20:0;26981:107;-1:-1:-1;;;;;26989:28:0;;26981:107;;27027:12;;;;:::i;:::-;27061:20;;;;:7;:20;;;;;;27027:12;;-1:-1:-1;;;;;;27061:20:0;;-1:-1:-1;26981:107:0;;-1:-1:-1;26981:107:0;25662:327;25782:4;25795:17;25828:11;-1:-1:-1;;;;;25815:24:0;:9;-1:-1:-1;;;;;25815:24:0;;:82;;;-1:-1:-1;25870:27:0;;;;:15;:27;;;;;;-1:-1:-1;;;;;25857:40:0;;;25870:27;;25857:40;25815:82;:143;;;;25915:43;25934:11;25947:9;25915:17;:43::i;:::-;25795:163;25662:327;-1:-1:-1;;;;;25662:327:0:o;36591:502::-;36692:22;36742:10;36763:23;;;36758:164;;;-1:-1:-1;36810:10:0;36758:164;;;36855:10;36842;:23;36837:85;;;36892:23;36905:10;36892;:23;:::i;:::-;36875:40;;36837:85;36932:15;;36927:80;;36957:43;36974:11;36987;36957:15;:43::i;:::-;37017:18;;37012:76;;37045:36;37052:11;37065:14;37045:5;:36::i;28568:747::-;28697:1;28658:27;;;:15;:27;;;;;:42;;;;;;28729:12;:31;;28759:1;28729:31;;;28744:12;28755:1;28744:8;:12;:::i;:::-;28706:54;-1:-1:-1;28766:16:0;28789:12;:8;28800:1;28789:12;:::i;:::-;28766:35;;28807:27;28852:8;28837:12;:23;:69;;;;;28883:23;28892:12;24377:10;;-1:-1:-1;24366:21:0;24277:116;28883:23;28837:131;;;;-1:-1:-1;28965:1:0;28929:23;;;:7;:23;;;;;;-1:-1:-1;;;;;28929:23:0;:39;28837:131;28807:161;;28974:23;29000:19;29009:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;29000:19;:75;;;;-1:-1:-1;29072:1:0;29040:19;;;:7;:19;;;;;;-1:-1:-1;;;;;29040:19:0;:35;29000:75;28974:101;;29088:22;29083:75;;;29120:23;;;;:7;:23;;;;;:31;;;;-1:-1:-1;;;;;29120:31:0;;;;;29083:75;29170:18;29165:67;;;29198:19;;;;:7;:19;;;;;:27;;;;-1:-1:-1;;;;;29198:27:0;;;;;29165:67;29239:19;;;;:7;:19;;;;;;:25;;;;-1:-1:-1;;;;;29239:25:0;;;;;;;;;29277:32;;29239:19;;29277:32;;;;;;;28652:663;;;;28568:747;;;:::o;13311:327::-;13402:7;;13431:15;;;:36;;-1:-1:-1;13450:12:0;;:17;13431:36;13426:87;;;-1:-1:-1;;13485:17:0;;-1:-1:-1;;;;;13485:17:0;;13476:31;;13426:87;13517:23;12771:5;13558:10;13543:12;;:25;;;;:::i;:::-;:40;;;;:::i;:::-;13597:17;;-1:-1:-1;;;;;13597:17:0;;-1:-1:-1;13517:66:0;-1:-1:-1;;13311:327:0;;;;;;:::o;38289:169::-;38363:51;38383:4;38391:11;38404:8;38363:9;:51::i;:::-;38427:25;;;;:13;:25;;;;;38420:32;;;;;;-1:-1:-1;38289:169:0:o;21561:499::-;21636:7;-1:-1:-1;;;;;21657:27:0;;21652:57;;-1:-1:-1;21701:1:0;;21561:499;-1:-1:-1;21561:499:0:o;21652:57::-;21716:22;21741:15;27554:10;;;27474:96;21741:15;21716:40;;21762:15;21787:27;21826:9;21820:215;21841:14;21837:1;:18;21820:215;;;21900:1;21875:12;;;:7;:12;;;;;;-1:-1:-1;;;;;21875:12:0;:28;21870:86;;21936:12;;;;:7;:12;;;;;;-1:-1:-1;;;;;21936:12:0;;-1:-1:-1;21870:86:0;21982:19;-1:-1:-1;;;;;21967:34:0;:11;-1:-1:-1;;;;;21967:34:0;;21962:67;;;22012:9;;;;:::i;:::-;;;;21962:67;21857:3;;;;:::i;:::-;;;;21820:215;;;-1:-1:-1;22047:7:0;;21561:499;-1:-1:-1;;;;21561:499:0:o;36071:379::-;36152:7;-1:-1:-1;;;;;36173:27:0;;36168:57;;-1:-1:-1;36217:1:0;;36071:379;-1:-1:-1;36071:379:0:o;36168:57::-;36232:22;36257:15;27554:10;;;27474:96;36257:15;36232:40;;36278:15;36309:9;36303:122;36324:14;36320:1;:18;36303:122;;;36358:18;;;;:13;:18;;;;;;-1:-1:-1;;;;;36358:33:0;;;:18;;:33;36353:66;;;36402:9;;;;:::i;:::-;;;;36353:66;36340:3;;;;:::i;:::-;;;;36303:122;;;-1:-1:-1;36437:7:0;36071:379;-1:-1:-1;;;36071:379:0:o;26187:414::-;26277:10;;26254:20;26337:1;26315:19;26330:4;26277:10;26315:19;:::i;:::-;:23;;;;:::i;:::-;26346;;;;:7;:23;;;;;:29;;;;-1:-1:-1;;;;;26346:29:0;;;;;26293:45;-1:-1:-1;26386:26:0;;;26381:76;;;26422:22;;;;:7;:22;;;;;:28;;;;-1:-1:-1;;;;;26422:28:0;;;;;26381:76;26468:9;26462:100;26483:4;26479:1;:8;26462:100;;;26537:16;26552:1;26537:12;:16;:::i;:::-;26508:47;;-1:-1:-1;;;;;26508:47:0;;;26527:1;;26508:47;;26527:1;;26508:47;26489:4;;;;:::i;:::-;;;;26462:100;;;-1:-1:-1;26580:15:0;:11;26594:1;26580:15;:::i;:::-;26567:10;:28;-1:-1:-1;;;;26187:414:0:o;3489:491::-;3630:5;;3610:7;;3625:61;;3656:24;;;;;;;;;;;;;;3625:61;-1:-1:-1;;;;;3697:21:0;;;;;;:9;:21;;;;;;:33;-1:-1:-1;3692:85:0;;3746:25;;;;;;;;;;;;;;3692:85;3790:33;3805:8;3815:6;3790:13;:33::i;:::-;3783:88;;3839:26;;;;;;;;;;;;;;3783:88;-1:-1:-1;;;;;;3930:21:0;;3877:13;3930:21;;;:9;:21;;;;;;3919:32;;3489:491;;;;;:::o;48926:323::-;49039:7;49013:23;:33;49008:94;;;49063:32;;;;;;;;;;;;;;49008:94;49109:14;49129:10;-1:-1:-1;;;;;49129:15:0;49153:7;49129:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49107:61;;;49181:9;49174:70;;49207:30;;;;;;;;;;;;;;22597:1408;22724:4;23400:18;;23523:10;;23518:482;;23547:79;;;;;-1:-1:-1;;;;;23547:39:0;;;;;:79;;10353:10;;23602:5;;23609:8;;23619:5;;23547:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23547:79:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;23543:416;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23776:13:0;;23771:181;;23813:29;;;;;;;;;;;;;;23771:181;23925:6;23918:15;23908:6;23904:2;23899:17;23891:44;23543:416;23668:51;;23678:41;23668:51;;-1:-1:-1;23661:58:0;;-1:-1:-1;23661:58:0;23518:482;23989:4;23982:11;;;;;6228:192;6324:9;;;;;;;;;;6350;;6324;;6338:21;;;;;6350:9;6338:21;;;;;;;;:::i;:::-;;;;;;6404:9;6369:46;;;;;;;;:::i;:::-;6387:15;6369:46;;;;;;;;:::i;:::-;;;;;;;;6291:129;6228:192;:::o;40588:276::-;40683:7;40662:8;21245:19;21254:8;24377:10;;-1:-1:-1;24366:21:0;24277:116;21245:19;21238:75;;21280:27;;;;;;;;;;;;;;21238:75;40699:20:::1;40722;40732:8;40722;:20::i;:::-;40699:43:::0;-1:-1:-1;;;;;;40753:31:0;::::1;40778:4;40753:31;40748:86;;;37821:7:::0;37844:25;;;:13;:25;;;;;;-1:-1:-1;;;;;37844:25:0;40794:33:::1;;;;;40056:177:::0;40137:15;40202:25;40214:11;40202:10;:25::i;:::-;40168:31;40186:11;40168:16;:31::i;:::-;:59;;;;:::i;37993:174::-;38065:25;;;;:13;:25;;;;;:39;;;;-1:-1:-1;;;;;38065:39:0;;;;;38110:51;38065:39;38143:4;38065:25;38110:9;:51::i;27666:635::-;27726:13;27932:10;27927:42;;-1:-1:-1;;27952:10:0;;;;;;;;;;;;;;;;;;27666:635::o;27927:42::-;27989:5;27974:12;28020:60;28028:9;;28020:60;;28047:9;;;;:::i;:::-;;-1:-1:-1;28063:10:0;;-1:-1:-1;28071:2:0;28063:10;;:::i;:::-;;;28020:60;;;28085:19;28118:6;28107:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28107:19:0;;28085:41;;28132:135;28140:10;;28132:135;;28160:11;28170:1;28160:11;;:::i;:::-;;-1:-1:-1;28226:10:0;28234:2;28226:5;:10;:::i;:::-;28212:26;;:2;:26;:::i;:::-;28197:45;;28178:6;28186;28178:16;;;;;;;;:::i;:::-;;;;:64;;;;;;;;;;-1:-1:-1;28249:11:0;28258:2;28249:11;;:::i;:::-;;;28132:135;;13841:263;12771:5;13944:12;:27;13939:82;;;13987:28;;;;;;;;;;;;;;13939:82;14025:12;:32;14062:17;:37;;;;-1:-1:-1;;;;;14062:37:0;;;;;;;;;;13841:263::o;47797:241::-;47907:4;47927:44;47947:11;47960:9;47927:18;:44::i;:::-;:105;;;-1:-1:-1;;;;;;25094:33:0;;;25074:4;25094:33;;;:18;:33;;;;;;;;:46;;;;;;;;;;;;47983:49;24973:173;37218:362;37301:22;37326:15;27554:10;;;27474:96;37326:15;37301:40;-1:-1:-1;37347:19:0;37399:1;37369:27;37386:10;37301:40;37369:27;:::i;:::-;:31;;;;:::i;:::-;37347:53;;37408:123;37434:11;37416:14;:29;37408:123;;37455:31;;;;:13;:31;;;;;:45;;;;-1:-1:-1;;;;;37455:45:0;;;;;:31;37507:17;37455:31;37507:17;:::i;:::-;;;;37408:123;;;37538:36;37554:4;37562:10;37538:5;:36::i;3985:221::-;4113:26;;17602:66:1;17589:2;17585:15;;;17581:88;4113:26:0;;;17569:101:1;4076:4:0;;;;17686:12:1;;4113:26:0;;;;;;;;;;;;4103:37;;;;;;4088:52;;4196:5;;4152:40;4178:6;4186:4;4152:24;:40::i;:::-;:49;;3985:221;-1:-1:-1;;;;3985:221:0:o;5177:361::-;5271:4;5289:9;5283:234;5304:16;:23;5300:27;;5283:234;;;5341:29;5388:16;5406:1;5388:21;;;;;;;;:::i;:::-;;;;;;;;;;;5431:38;;;;;-1:-1:-1;;;;;1819:55:1;;;5431:38:0;;;1801:74:1;5388:21:0;;;;-1:-1:-1;5422:62:0;;;;5388:21;;5431:23;;1774:18:1;;5431:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5422:62:0;;5417:95;;;5501:4;5494:11;;;;;;5417:95;-1:-1:-1;5329:3:0;;;;:::i;:::-;;;;5283:234;;;-1:-1:-1;5528:5:0;;5177:361;-1:-1:-1;;;5177:361:0:o;1477:675::-;1560:7;1603:4;1560:7;1618:497;1642:5;:12;1638:1;:16;1618:497;;;1676:20;1699:5;1705:1;1699:8;;;;;;;;:::i;:::-;;;;;;;1676:31;;1742:12;1726;:28;1722:382;;2228:13;2278:15;;;2314:4;2307:15;;;2361:4;2345:21;;1854:57;;1722:382;;;2228:13;2278:15;;;2314:4;2307:15;;;2361:4;2345:21;;2031:57;;1722:382;-1:-1:-1;1656:3:0;;;;:::i;:::-;;;;1618:497;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:328::-;954:3;992:5;986:12;1019:6;1014:3;1007:19;1035:63;1091:6;1084:4;1079:3;1075:14;1068:4;1061:5;1057:16;1035:63;:::i;:::-;1143:2;1131:15;1148:66;1127:88;1118:98;;;;1218:4;1114:109;;901:328;-1:-1:-1;;901:328:1:o;1234:231::-;1383:2;1372:9;1365:21;1346:4;1403:56;1455:2;1444:9;1440:18;1432:6;1403:56;:::i;1470:180::-;1529:6;1582:2;1570:9;1561:7;1557:23;1553:32;1550:52;;;1598:1;1595;1588:12;1550:52;-1:-1:-1;1621:23:1;;1470:180;-1:-1:-1;1470:180:1:o;1886:154::-;-1:-1:-1;;;;;1965:5:1;1961:54;1954:5;1951:65;1941:93;;2030:1;2027;2020:12;2045:315;2113:6;2121;2174:2;2162:9;2153:7;2149:23;2145:32;2142:52;;;2190:1;2187;2180:12;2142:52;2229:9;2216:23;2248:31;2273:5;2248:31;:::i;:::-;2298:5;2350:2;2335:18;;;;2322:32;;-1:-1:-1;;;2045:315:1:o;2365:248::-;2433:6;2441;2494:2;2482:9;2473:7;2469:23;2465:32;2462:52;;;2510:1;2507;2500:12;2462:52;-1:-1:-1;;2533:23:1;;;2603:2;2588:18;;;2575:32;;-1:-1:-1;2365:248:1:o;2618:184::-;2670:77;2667:1;2660:88;2767:4;2764:1;2757:15;2791:4;2788:1;2781:15;2807:334;2878:2;2872:9;2934:2;2924:13;;2939:66;2920:86;2908:99;;3037:18;3022:34;;3058:22;;;3019:62;3016:88;;;3084:18;;:::i;:::-;3120:2;3113:22;2807:334;;-1:-1:-1;2807:334:1:o;3146:1167::-;3241:6;3249;3257;3265;3318:3;3306:9;3297:7;3293:23;3289:33;3286:53;;;3335:1;3332;3325:12;3286:53;3374:9;3361:23;3393:31;3418:5;3393:31;:::i;:::-;3443:5;-1:-1:-1;3467:2:1;3506:18;;;3493:32;3534:33;3493:32;3534:33;:::i;:::-;3586:7;-1:-1:-1;3640:2:1;3625:18;;3612:32;;-1:-1:-1;3695:2:1;3680:18;;3667:32;3718:18;3748:14;;;3745:34;;;3775:1;3772;3765:12;3745:34;3813:6;3802:9;3798:22;3788:32;;3858:7;3851:4;3847:2;3843:13;3839:27;3829:55;;3880:1;3877;3870:12;3829:55;3916:2;3903:16;3938:2;3934;3931:10;3928:36;;;3944:18;;:::i;:::-;3986:112;4094:2;4025:66;4018:4;4014:2;4010:13;4006:86;4002:95;3986:112;:::i;:::-;3973:125;;4121:2;4114:5;4107:17;4161:7;4156:2;4151;4147;4143:11;4139:20;4136:33;4133:53;;;4182:1;4179;4172:12;4133:53;4237:2;4232;4228;4224:11;4219:2;4212:5;4208:14;4195:45;4281:1;4276:2;4271;4264:5;4260:14;4256:23;4249:34;;4302:5;4292:15;;;;;3146:1167;;;;;;;:::o;4753:183::-;4813:4;4846:18;4838:6;4835:30;4832:56;;;4868:18;;:::i;:::-;-1:-1:-1;4913:1:1;4909:14;4925:4;4905:25;;4753:183::o;4941:662::-;4995:5;5048:3;5041:4;5033:6;5029:17;5025:27;5015:55;;5066:1;5063;5056:12;5015:55;5102:6;5089:20;5128:4;5152:60;5168:43;5208:2;5168:43;:::i;:::-;5152:60;:::i;:::-;5246:15;;;5332:1;5328:10;;;;5316:23;;5312:32;;;5277:12;;;;5356:15;;;5353:35;;;5384:1;5381;5374:12;5353:35;5420:2;5412:6;5408:15;5432:142;5448:6;5443:3;5440:15;5432:142;;;5514:17;;5502:30;;5552:12;;;;5465;;5432:142;;;-1:-1:-1;5592:5:1;4941:662;-1:-1:-1;;;;;;4941:662:1:o;5608:1215::-;5726:6;5734;5787:2;5775:9;5766:7;5762:23;5758:32;5755:52;;;5803:1;5800;5793:12;5755:52;5843:9;5830:23;5872:18;5913:2;5905:6;5902:14;5899:34;;;5929:1;5926;5919:12;5899:34;5967:6;5956:9;5952:22;5942:32;;6012:7;6005:4;6001:2;5997:13;5993:27;5983:55;;6034:1;6031;6024:12;5983:55;6070:2;6057:16;6092:4;6116:60;6132:43;6172:2;6132:43;:::i;6116:60::-;6210:15;;;6292:1;6288:10;;;;6280:19;;6276:28;;;6241:12;;;;6316:19;;;6313:39;;;6348:1;6345;6338:12;6313:39;6372:11;;;;6392:217;6408:6;6403:3;6400:15;6392:217;;;6488:3;6475:17;6505:31;6530:5;6505:31;:::i;:::-;6549:18;;6425:12;;;;6587;;;;6392:217;;;6628:5;-1:-1:-1;;6671:18:1;;6658:32;;-1:-1:-1;;6702:16:1;;;6699:36;;;6731:1;6728;6721:12;6699:36;;6754:63;6809:7;6798:8;6787:9;6783:24;6754:63;:::i;:::-;6744:73;;;5608:1215;;;;;:::o;6828:456::-;6905:6;6913;6921;6974:2;6962:9;6953:7;6949:23;6945:32;6942:52;;;6990:1;6987;6980:12;6942:52;7029:9;7016:23;7048:31;7073:5;7048:31;:::i;:::-;7098:5;-1:-1:-1;7155:2:1;7140:18;;7127:32;7168:33;7127:32;7168:33;:::i;:::-;6828:456;;7220:7;;-1:-1:-1;;;7274:2:1;7259:18;;;;7246:32;;6828:456::o;7591:247::-;7650:6;7703:2;7691:9;7682:7;7678:23;7674:32;7671:52;;;7719:1;7716;7709:12;7671:52;7758:9;7745:23;7777:31;7802:5;7777:31;:::i;7843:891::-;7927:6;7958:2;8001;7989:9;7980:7;7976:23;7972:32;7969:52;;;8017:1;8014;8007:12;7969:52;8057:9;8044:23;8090:18;8082:6;8079:30;8076:50;;;8122:1;8119;8112:12;8076:50;8145:22;;8198:4;8190:13;;8186:27;-1:-1:-1;8176:55:1;;8227:1;8224;8217:12;8176:55;8263:2;8250:16;8286:60;8302:43;8342:2;8302:43;:::i;8286:60::-;8380:15;;;8462:1;8458:10;;;;8450:19;;8446:28;;;8411:12;;;;8486:19;;;8483:39;;;8518:1;8515;8508:12;8483:39;8542:11;;;;8562:142;8578:6;8573:3;8570:15;8562:142;;;8644:17;;8632:30;;8595:12;;;;8682;;;;8562:142;;;8723:5;7843:891;-1:-1:-1;;;;;;;7843:891:1:o;8924:269::-;8996:6;9049:2;9037:9;9028:7;9024:23;9020:32;9017:52;;;9065:1;9062;9055:12;9017:52;9104:9;9091:23;9143:1;9136:5;9133:12;9123:40;;9159:1;9156;9149:12;9198:184;9250:77;9247:1;9240:88;9347:4;9344:1;9337:15;9371:4;9368:1;9361:15;9387:398;9532:2;9517:18;;9565:1;9554:13;;9544:201;;9601:77;9598:1;9591:88;9702:4;9699:1;9692:15;9730:4;9727:1;9720:15;9544:201;9754:25;;;9387:398;:::o;9790:416::-;9855:6;9863;9916:2;9904:9;9895:7;9891:23;9887:32;9884:52;;;9932:1;9929;9922:12;9884:52;9971:9;9958:23;9990:31;10015:5;9990:31;:::i;:::-;10040:5;-1:-1:-1;10097:2:1;10082:18;;10069:32;10139:15;;10132:23;10120:36;;10110:64;;10170:1;10167;10160:12;10110:64;10193:7;10183:17;;;9790:416;;;;;:::o;10211:936::-;10308:6;10316;10324;10332;10340;10393:3;10381:9;10372:7;10368:23;10364:33;10361:53;;;10410:1;10407;10400:12;10361:53;10449:9;10436:23;10468:31;10493:5;10468:31;:::i;:::-;10518:5;-1:-1:-1;10575:2:1;10560:18;;10547:32;10588:33;10547:32;10588:33;:::i;:::-;10640:7;-1:-1:-1;10694:2:1;10679:18;;10666:32;;-1:-1:-1;10749:2:1;10734:18;;10721:32;10772:18;10802:14;;;10799:34;;;10829:1;10826;10819:12;10799:34;10867:6;10856:9;10852:22;10842:32;;10912:7;10905:4;10901:2;10897:13;10893:27;10883:55;;10934:1;10931;10924:12;10883:55;10974:2;10961:16;11000:2;10992:6;10989:14;10986:34;;;11016:1;11013;11006:12;10986:34;11061:7;11056:2;11047:6;11043:2;11039:15;11035:24;11032:37;11029:57;;;11082:1;11079;11072:12;11029:57;10211:936;;;;-1:-1:-1;10211:936:1;;-1:-1:-1;11113:2:1;11105:11;;11135:6;10211:936;-1:-1:-1;;;10211:936:1:o;11152:388::-;11220:6;11228;11281:2;11269:9;11260:7;11256:23;11252:32;11249:52;;;11297:1;11294;11287:12;11249:52;11336:9;11323:23;11355:31;11380:5;11355:31;:::i;:::-;11405:5;-1:-1:-1;11462:2:1;11447:18;;11434:32;11475:33;11434:32;11475:33;:::i;11545:437::-;11624:1;11620:12;;;;11667;;;11688:61;;11742:4;11734:6;11730:17;11720:27;;11688:61;11795:2;11787:6;11784:14;11764:18;11761:38;11758:218;;;11832:77;11829:1;11822:88;11933:4;11930:1;11923:15;11961:4;11958:1;11951:15;11987:184;12039:77;12036:1;12029:88;12136:4;12133:1;12126:15;12160:4;12157:1;12150:15;12176:128;12216:3;12247:1;12243:6;12240:1;12237:13;12234:39;;;12253:18;;:::i;:::-;-1:-1:-1;12289:9:1;;12176:128::o;12309:125::-;12349:4;12377:1;12374;12371:8;12368:34;;;12382:18;;:::i;:::-;-1:-1:-1;12419:9:1;;12309:125::o;12439:195::-;12478:3;12509:66;12502:5;12499:77;12496:103;;;12579:18;;:::i;:::-;-1:-1:-1;12626:1:1;12615:13;;12439:195::o;12639:228::-;12679:7;12805:1;12737:66;12733:74;12730:1;12727:81;12722:1;12715:9;12708:17;12704:105;12701:131;;;12812:18;;:::i;:::-;-1:-1:-1;12852:9:1;;12639:228::o;12872:184::-;12924:77;12921:1;12914:88;13021:4;13018:1;13011:15;13045:4;13042:1;13035:15;13061:184;13113:77;13110:1;13103:88;13210:4;13207:1;13200:15;13234:4;13231:1;13224:15;13250:120;13290:1;13316;13306:35;;13321:18;;:::i;:::-;-1:-1:-1;13355:9:1;;13250:120::o;13375:543::-;13593:13;;13536:3;;13567;;13646:4;13673:15;;;13536:3;13716:175;13730:6;13727:1;13724:13;13716:175;;;13793:13;;13779:28;;13829:14;;;;13866:15;;;;13752:1;13745:9;13716:175;;;-1:-1:-1;13907:5:1;;13375:543;-1:-1:-1;;;;;;13375:543:1:o;13923:592::-;14141:13;;14084:3;;14115;;14194:4;14221:15;;;14084:3;14264:224;14278:6;14275:1;14272:13;14264:224;;;14345:13;;-1:-1:-1;;;;;14341:62:1;14327:77;;14426:14;;;;14463:15;;;;14300:1;14293:9;14264:224;;14520:196;14559:3;14587:5;14577:39;;14596:18;;:::i;:::-;-1:-1:-1;14643:66:1;14632:78;;14520:196::o;14847:185::-;14889:3;14927:5;14921:12;14942:52;14987:6;14982:3;14975:4;14968:5;14964:16;14942:52;:::i;:::-;15010:16;;;;;14847:185;-1:-1:-1;;14847:185:1:o;15037:1289::-;15213:3;15242:1;15275:6;15269:13;15305:3;15327:1;15355:9;15351:2;15347:18;15337:28;;15415:2;15404:9;15400:18;15437;15427:61;;15481:4;15473:6;15469:17;15459:27;;15427:61;15507:2;15555;15547:6;15544:14;15524:18;15521:38;15518:222;;;15594:77;15589:3;15582:90;15695:4;15692:1;15685:15;15725:4;15720:3;15713:17;15518:222;15756:18;15783:162;;;;15959:1;15954:320;;;;15749:525;;15783:162;15831:66;15820:9;15816:82;15811:3;15804:95;15928:6;15923:3;15919:16;15912:23;;15783:162;;15954:320;14794:1;14787:14;;;14831:4;14818:18;;16049:1;16063:165;16077:6;16074:1;16071:13;16063:165;;;16155:14;;16142:11;;;16135:35;16198:16;;;;16092:10;;16063:165;;;16067:3;;16257:6;16252:3;16248:16;16241:23;;15749:525;;;;;;;16290:30;16316:3;16308:6;16290:30;:::i;16541:523::-;16735:4;-1:-1:-1;;;;;16845:2:1;16837:6;16833:15;16822:9;16815:34;16897:2;16889:6;16885:15;16880:2;16869:9;16865:18;16858:43;;16937:6;16932:2;16921:9;16917:18;16910:34;16980:3;16975:2;16964:9;16960:18;16953:31;17001:57;17053:3;17042:9;17038:19;17030:6;17001:57;:::i;:::-;16993:65;16541:523;-1:-1:-1;;;;;;16541:523:1:o;17069:249::-;17138:6;17191:2;17179:9;17170:7;17166:23;17162:32;17159:52;;;17207:1;17204;17197:12;17159:52;17239:9;17233:16;17258:30;17282:5;17258:30;:::i;17323:112::-;17355:1;17381;17371:35;;17386:18;;:::i;:::-;-1:-1:-1;17420:9:1;;17323:112::o;17709:279::-;17807:6;17860:2;17848:9;17839:7;17835:23;17831:32;17828:52;;;17876:1;17873;17866:12;17828:52;17908:9;17902:16;17927:31;17952:5;17927:31;:::i

Swarm Source

ipfs://161d9fed2d15321556ab0a7c3fd07cb94c59e02dcc41f6f3f24781a25c00f651
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.