Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 11 from a total of 11 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Fuck Goblin Twon | 14912965 | 881 days ago | IN | 0 ETH | 0.00194695 | ||||
Fuck Goblin Twon | 14912964 | 881 days ago | IN | 0 ETH | 0.00223376 | ||||
Fuck Goblin Twon | 14912962 | 881 days ago | IN | 0 ETH | 0.00217816 | ||||
Set Approval For... | 14910063 | 882 days ago | IN | 0 ETH | 0.00288524 | ||||
Fuck Goblin Twon | 14909906 | 882 days ago | IN | 0 ETH | 0.00535463 | ||||
Fuck Goblin Twon | 14909894 | 882 days ago | IN | 0 ETH | 0.00404616 | ||||
End Auction And ... | 14909792 | 882 days ago | IN | 0 ETH | 0.00829868 | ||||
Hello World | 14909594 | 882 days ago | IN | 0 ETH | 0.01587011 | ||||
Hello World | 14909564 | 882 days ago | IN | 0 ETH | 0.03421393 | ||||
Set Base URI | 14909552 | 882 days ago | IN | 0 ETH | 0.00294314 | ||||
0x61010060 | 14909427 | 882 days ago | IN | 0 ETH | 0.08917105 |
Loading...
Loading
Contract Name:
CyberGoblin
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-05 */ // Sources flattened with hardhat v2.9.1 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // 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 @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File contracts/ERC721A.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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 * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File @openzeppelin/contracts/utils/cryptography/[email protected] // 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/CyberGoblin.sol pragma solidity ^0.8.0; contract CyberGoblin is Ownable, ERC721A, ReentrancyGuard { uint256 public immutable maxPerAddressDuringMint; uint256 public immutable amountForDevs; uint256 constant public MAXFREEAMOUNT = 3000; struct SaleConfig { uint64 publicPrice; uint64 publicPrice2; uint32 publicSaleKey; } SaleConfig public saleConfig; constructor( uint256 maxBatchSize_, uint256 collectionSize_, uint256 amountForDevs_ ) ERC721A("CyberGoblin", "CyberGoblin", maxBatchSize_, collectionSize_) { maxPerAddressDuringMint = maxBatchSize_; amountForDevs = amountForDevs_; saleConfig.publicPrice = 0 ether; saleConfig.publicSaleKey = 0; require( amountForDevs_ <= collectionSize_, "larger collection size needed" ); } function endAuctionAndSetupNonAuctionSaleInfo( uint64 publicPriceWei, uint64 publicPrice2Wei, uint32 publicSaleKey ) external onlyOwner { saleConfig = SaleConfig( publicPriceWei, publicPrice2Wei, publicSaleKey ); } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function fuckGoblinTwon(uint256 quantity, uint256 callerPublicSaleKey) external payable callerIsUser { SaleConfig memory config = saleConfig; uint256 publicSaleKey = uint256(config.publicSaleKey); uint256 publicPrice = uint256(config.publicPrice2); if (totalSupply() < MAXFREEAMOUNT) { publicPrice = uint256(config.publicPrice); } require( publicSaleKey == callerPublicSaleKey, "called with incorrect public sale key" ); require( isPublicSaleOn(publicSaleKey), "public sale has not begun yet" ); require(totalSupply() + quantity <= collectionSize, "reached max supply"); require( numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "can not mint this many" ); _safeMint(msg.sender, quantity); refundIfOver(publicPrice * quantity); } function refundIfOver(uint256 price) private { require(msg.value >= price, "Need to send more ETH."); if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } function isPublicSaleOn( uint256 publicSaleKey ) public pure returns (bool) { return publicSaleKey != 0; } // For marketing etc. function helloWorld(uint256 quantity) external onlyOwner { require( totalSupply() + quantity <= amountForDevs, "too many already minted before dev mint" ); require( quantity % maxBatchSize == 0, "can only mint a multiple of the maxBatchSize" ); uint256 numChunks = quantity / maxBatchSize; for (uint256 i = 0; i < numChunks; i++) { _safeMint(msg.sender, maxBatchSize); } } // // metadata URI string private _baseTokenURI; function getSalePrice() public view returns (uint256) { if (totalSupply() < MAXFREEAMOUNT) { return uint256(saleConfig.publicPrice); } return uint256(saleConfig.publicPrice2); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdrawMoney() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant { _setOwnersExplicit(quantity); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return ownershipOf(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"amountForDevs_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"MAXFREEAMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountForDevs","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":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"publicPriceWei","type":"uint64"},{"internalType":"uint64","name":"publicPrice2Wei","type":"uint64"},{"internalType":"uint32","name":"publicSaleKey","type":"uint32"}],"name":"endAuctionAndSetupNonAuctionSaleInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"callerPublicSaleKey","type":"uint256"}],"name":"fuckGoblinTwon","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"helloWorld","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicSaleKey","type":"uint256"}],"name":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleConfig","outputs":[{"internalType":"uint64","name":"publicPrice","type":"uint64"},{"internalType":"uint64","name":"publicPrice2","type":"uint64"},{"internalType":"uint32","name":"publicSaleKey","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","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":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610100604052600060015560006008553480156200001c57600080fd5b5060405162002ebf38038062002ebf8339810160408190526200003f9162000326565b6040518060400160405280600b81526020016a21bcb132b923b7b13634b760a91b8152506040518060400160405280600b81526020016a21bcb132b923b7b13634b760a91b8152508484620000a36200009d6200022c60201b60201c565b62000230565b60008111620001105760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620001725760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000107565b83516200018790600290602087019062000280565b5082516200019d90600390602086019062000280565b5060a0919091526080525050600160095560c083905260e0819052600a80546001600160401b0363ffffffff60801b011916905581811115620002235760405162461bcd60e51b815260206004820152601d60248201527f6c617267657220636f6c6c656374696f6e2073697a65206e6565646564000000604482015260640162000107565b50505062000391565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200028e9062000354565b90600052602060002090601f016020900481019282620002b25760008555620002fd565b82601f10620002cd57805160ff1916838001178555620002fd565b82800160010185558215620002fd579182015b82811115620002fd578251825591602001919060010190620002e0565b506200030b9291506200030f565b5090565b5b808211156200030b576000815560010162000310565b6000806000606084860312156200033b578283fd5b8351925060208401519150604084015190509250925092565b600181811c908216806200036957607f821691505b602082108114156200038b57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051612ab56200040a600039600081816106c20152610fc30152600081816104930152610efa015260008181611059015281816110e70152818161111f01528181611cca01528181611cf401526121d2015260008181610e8201528181611a2b0152611a5d0152612ab56000f3fe6080604052600436106101f95760003560e01c80636352211e1161010d578063a22cb465116100a0578063d7224ba01161006f578063d7224ba014610611578063dc33e68114610627578063e985e9c514610647578063f2fde38b14610690578063fbe1aa51146106b057600080fd5b8063a22cb4651461059c578063ac446002146105bc578063b88d4fde146105d1578063c87b56dd146105f157600080fd5b80638da5cb5b116100dc5780638da5cb5b146104b557806390aa0b0f146104d35780639231ab2a1461053a57806395d89b411461058757600080fd5b80636352211e1461042c57806370a082311461044c578063715018a61461046c5780638bc35c2f1461048157600080fd5b80632ebd86f0116101905780634f6ccce71161015f5780634f6ccce71461039957806355f804b3146103b95780635768e7fc146103d95780635d3a9c29146103ec5780635ec085191461040c57600080fd5b80632ebd86f01461032e5780632f745c59146103445780632fbc0bf11461036457806342842e0e1461037957600080fd5b806316e6e15a116101cc57806316e6e15a146102af57806318160ddd146102cf57806323b872dd146102ee5780632d20fb601461030e57600080fd5b806301ffc9a7146101fe57806306fdde0314610233578063081812fc14610255578063095ea7b31461028d575b600080fd5b34801561020a57600080fd5b5061021e610219366004612670565b6106e4565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b50610248610751565b60405161022a9190612833565b34801561026157600080fd5b50610275610270366004612714565b6107e3565b6040516001600160a01b03909116815260200161022a565b34801561029957600080fd5b506102ad6102a8366004612647565b610873565b005b3480156102bb57600080fd5b506102ad6102ca36600461274d565b61098b565b3480156102db57600080fd5b506001545b60405190815260200161022a565b3480156102fa57600080fd5b506102ad6103093660046124fe565b610a23565b34801561031a57600080fd5b506102ad610329366004612714565b610a2e565b34801561033a57600080fd5b506102e0610bb881565b34801561035057600080fd5b506102e061035f366004612647565b610ac1565b34801561037057600080fd5b506102e0610c39565b34801561038557600080fd5b506102ad6103943660046124fe565b610c74565b3480156103a557600080fd5b506102e06103b4366004612714565b610c8f565b3480156103c557600080fd5b506102ad6103d43660046126a8565b610cf8565b6102ad6103e736600461272c565b610d2e565b3480156103f857600080fd5b506102ad610407366004612714565b610f97565b34801561041857600080fd5b5061021e610427366004612714565b151590565b34801561043857600080fd5b50610275610447366004612714565b611155565b34801561045857600080fd5b506102e06104673660046124b2565b611167565b34801561047857600080fd5b506102ad6111f8565b34801561048d57600080fd5b506102e07f000000000000000000000000000000000000000000000000000000000000000081565b3480156104c157600080fd5b506000546001600160a01b0316610275565b3480156104df57600080fd5b50600a5461050e906001600160401b0380821691600160401b810490911690600160801b900463ffffffff1683565b604080516001600160401b03948516815293909216602084015263ffffffff169082015260600161022a565b34801561054657600080fd5b5061055a610555366004612714565b61122e565b6040805182516001600160a01b031681526020928301516001600160401b0316928101929092520161022a565b34801561059357600080fd5b5061024861124b565b3480156105a857600080fd5b506102ad6105b736600461260d565b61125a565b3480156105c857600080fd5b506102ad61131f565b3480156105dd57600080fd5b506102ad6105ec366004612539565b61142c565b3480156105fd57600080fd5b5061024861060c366004612714565b611465565b34801561061d57600080fd5b506102e060085481565b34801561063357600080fd5b506102e06106423660046124b2565b611532565b34801561065357600080fd5b5061021e6106623660046124cc565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561069c57600080fd5b506102ad6106ab3660046124b2565b61153d565b3480156106bc57600080fd5b506102e07f000000000000000000000000000000000000000000000000000000000000000081565b60006001600160e01b031982166380ac58cd60e01b148061071557506001600160e01b03198216635b5e139f60e01b145b8061073057506001600160e01b0319821663780e9d6360e01b145b8061074b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610760906129bd565b80601f016020809104026020016040519081016040528092919081815260200182805461078c906129bd565b80156107d95780601f106107ae576101008083540402835291602001916107d9565b820191906000526020600020905b8154815290600101906020018083116107bc57829003601f168201915b5050505050905090565b60006107f0826001541190565b6108575760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061087e82611155565b9050806001600160a01b0316836001600160a01b031614156108ed5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161084e565b336001600160a01b038216148061090957506109098133610662565b61097b5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161084e565b6109868383836115d8565b505050565b6000546001600160a01b031633146109b55760405162461bcd60e51b815260040161084e90612846565b604080516060810182526001600160401b03948516808252939094166020850181905263ffffffff929092169301839052600a80546fffffffffffffffffffffffffffffffff1916909217600160401b9091021763ffffffff60801b1916600160801b909202919091179055565b610986838383611634565b6000546001600160a01b03163314610a585760405162461bcd60e51b815260040161084e90612846565b60026009541415610aab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161084e565b6002600955610ab9816119ba565b506001600955565b6000610acc83611167565b8210610b255760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161084e565b6000610b3060015490565b905060008060005b83811015610bd9576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610b8a57805192505b876001600160a01b0316836001600160a01b03161415610bc65786841415610bb85750935061074b92505050565b83610bc2816129f8565b9450505b5080610bd1816129f8565b915050610b38565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161084e565b6000610bb8610c4760015490565b1015610c5d5750600a546001600160401b031690565b50600a54600160401b90046001600160401b031690565b6109868383836040518060200160405280600081525061142c565b6000610c9a60015490565b8210610cf45760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161084e565b5090565b6000546001600160a01b03163314610d225760405162461bcd60e51b815260040161084e90612846565b610986600b83836123ef565b323314610d7d5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161084e565b60408051606081018252600a546001600160401b038082168352600160401b82041660208301819052600160801b90910463ffffffff16928201839052600154919291610bb81115610dd6575081516001600160401b03165b838214610e335760405162461bcd60e51b815260206004820152602560248201527f63616c6c6564207769746820696e636f7272656374207075626c69632073616c60448201526465206b657960d81b606482015260840161084e565b81610e805760405162461bcd60e51b815260206004820152601d60248201527f7075626c69632073616c6520686173206e6f7420626567756e20796574000000604482015260640161084e565b7f000000000000000000000000000000000000000000000000000000000000000085610eab60015490565b610eb591906128f0565b1115610ef85760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161084e565b7f000000000000000000000000000000000000000000000000000000000000000085610f2333611532565b610f2d91906128f0565b1115610f745760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b604482015260640161084e565b610f7e3386611ba3565b610f90610f8b868361291c565b611bc1565b5050505050565b6000546001600160a01b03163314610fc15760405162461bcd60e51b815260040161084e90612846565b7f000000000000000000000000000000000000000000000000000000000000000081610fec60015490565b610ff691906128f0565b11156110545760405162461bcd60e51b815260206004820152602760248201527f746f6f206d616e7920616c7265616479206d696e746564206265666f72652064604482015266195d881b5a5b9d60ca1b606482015260840161084e565b61107e7f000000000000000000000000000000000000000000000000000000000000000082612a13565b156110e05760405162461bcd60e51b815260206004820152602c60248201527f63616e206f6e6c79206d696e742061206d756c7469706c65206f66207468652060448201526b6d6178426174636853697a6560a01b606482015260840161084e565b600061110c7f000000000000000000000000000000000000000000000000000000000000000083612908565b905060005b8181101561098657611143337f0000000000000000000000000000000000000000000000000000000000000000611ba3565b8061114d816129f8565b915050611111565b600061116082611c48565b5192915050565b60006001600160a01b0382166111d35760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161084e565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146112225760405162461bcd60e51b815260040161084e90612846565b61122c6000611df1565b565b604080518082019091526000808252602082015261074b82611c48565b606060038054610760906129bd565b6001600160a01b0382163314156112b35760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161084e565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146113495760405162461bcd60e51b815260040161084e90612846565b6002600954141561139c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161084e565b6002600955604051600090339047908381818185875af1925050503d80600081146113e3576040519150601f19603f3d011682016040523d82523d6000602084013e6113e8565b606091505b5050905080610ab95760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161084e565b611437848484611634565b61144384848484611e41565b61145f5760405162461bcd60e51b815260040161084e9061287b565b50505050565b6060611472826001541190565b6114d65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161084e565b60006114e0611f4f565b90506000815111611500576040518060200160405280600081525061152b565b8061150a84611f5e565b60405160200161151b9291906127c7565b6040516020818303038152906040525b9392505050565b600061074b82612077565b6000546001600160a01b031633146115675760405162461bcd60e51b815260040161084e90612846565b6001600160a01b0381166115cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084e565b6115d581611df1565b50565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061163f82611c48565b80519091506000906001600160a01b0316336001600160a01b0316148061167657503361166b846107e3565b6001600160a01b0316145b80611688575081516116889033610662565b9050806116f25760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161084e565b846001600160a01b031682600001516001600160a01b0316146117665760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161084e565b6001600160a01b0384166117ca5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161084e565b6117da60008484600001516115d8565b6001600160a01b038516600090815260056020526040812080546001929061180c9084906001600160801b031661293b565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611858918591166128ce565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556118df8460016128f0565b6000818152600460205260409020549091506001600160a01b031661197057611909816001541190565b156119705760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60085481611a0a5760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604482015260640161084e565b60006001611a1884846128f0565b611a229190612963565b9050611a4f60017f0000000000000000000000000000000000000000000000000000000000000000612963565b811115611a8457611a8160017f0000000000000000000000000000000000000000000000000000000000000000612963565b90505b611a8f816001541190565b611aea5760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b606482015260840161084e565b815b818111611b8f576000818152600460205260409020546001600160a01b0316611b7d576000611b1a82611c48565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80611b87816129f8565b915050611aec565b50611b9b8160016128f0565b600855505050565b611bbd828260405180602001604052806000815250612115565b5050565b80341015611c0a5760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b604482015260640161084e565b803411156115d557336108fc611c208334612963565b6040518115909202916000818181858888f19350505050158015611bbd573d6000803e3d6000fd5b6040805180820190915260008082526020820152611c67826001541190565b611cc65760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161084e565b60007f00000000000000000000000000000000000000000000000000000000000000008310611d2757611d197f000000000000000000000000000000000000000000000000000000000000000084612963565b611d249060016128f0565b90505b825b818110611d90576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611d7d57949350505050565b5080611d88816129a6565b915050611d29565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161084e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b15611f4357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e859033908990889088906004016127f6565b602060405180830381600087803b158015611e9f57600080fd5b505af1925050508015611ecf575060408051601f3d908101601f19168201909252611ecc9181019061268c565b60015b611f29573d808015611efd576040519150601f19603f3d011682016040523d82523d6000602084013e611f02565b606091505b508051611f215760405162461bcd60e51b815260040161084e9061287b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f47565b5060015b949350505050565b6060600b8054610760906129bd565b606081611f825750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fac5780611f96816129f8565b9150611fa59050600a83612908565b9150611f86565b6000816001600160401b03811115611fd457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ffe576020820181803683370190505b5090505b8415611f4757612013600183612963565b9150612020600a86612a13565b61202b9060306128f0565b60f81b81838151811061204e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612070600a86612908565b9450612002565b60006001600160a01b0382166120e95760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b606482015260840161084e565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b6001546001600160a01b0384166121785760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161084e565b612183816001541190565b156121d05760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161084e565b7f000000000000000000000000000000000000000000000000000000000000000083111561224b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161084e565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906122a79087906128ce565b6001600160801b031681526020018583602001516122c591906128ce565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156123e45760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46123a86000888488611e41565b6123c45760405162461bcd60e51b815260040161084e9061287b565b816123ce816129f8565b92505080806123dc906129f8565b91505061235b565b5060018190556119b2565b8280546123fb906129bd565b90600052602060002090601f01602090048101928261241d5760008555612463565b82601f106124365782800160ff19823516178555612463565b82800160010185558215612463579182015b82811115612463578235825591602001919060010190612448565b50610cf49291505b80821115610cf4576000815560010161246b565b80356001600160a01b038116811461249657600080fd5b919050565b80356001600160401b038116811461249657600080fd5b6000602082840312156124c3578081fd5b61152b8261247f565b600080604083850312156124de578081fd5b6124e78361247f565b91506124f56020840161247f565b90509250929050565b600080600060608486031215612512578081fd5b61251b8461247f565b92506125296020850161247f565b9150604084013590509250925092565b6000806000806080858703121561254e578081fd5b6125578561247f565b93506125656020860161247f565b92506040850135915060608501356001600160401b0380821115612587578283fd5b818701915087601f83011261259a578283fd5b8135818111156125ac576125ac612a53565b604051601f8201601f19908116603f011681019083821181831017156125d4576125d4612a53565b816040528281528a60208487010111156125ec578586fd5b82602086016020830137918201602001949094529598949750929550505050565b6000806040838503121561261f578182fd5b6126288361247f565b91506020830135801515811461263c578182fd5b809150509250929050565b60008060408385031215612659578182fd5b6126628361247f565b946020939093013593505050565b600060208284031215612681578081fd5b813561152b81612a69565b60006020828403121561269d578081fd5b815161152b81612a69565b600080602083850312156126ba578182fd5b82356001600160401b03808211156126d0578384fd5b818501915085601f8301126126e3578384fd5b8135818111156126f1578485fd5b866020828501011115612702578485fd5b60209290920196919550909350505050565b600060208284031215612725578081fd5b5035919050565b6000806040838503121561273e578182fd5b50508035926020909101359150565b600080600060608486031215612761578283fd5b61276a8461249b565b92506127786020850161249b565b9150604084013563ffffffff81168114612790578182fd5b809150509250925092565b600081518084526127b381602086016020860161297a565b601f01601f19169290920160200192915050565b600083516127d981846020880161297a565b8351908301906127ed81836020880161297a565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128299083018461279b565b9695505050505050565b60208152600061152b602083018461279b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b038083168185168083038211156127ed576127ed612a27565b6000821982111561290357612903612a27565b500190565b60008261291757612917612a3d565b500490565b600081600019048311821515161561293657612936612a27565b500290565b60006001600160801b038381169083168181101561295b5761295b612a27565b039392505050565b60008282101561297557612975612a27565b500390565b60005b8381101561299557818101518382015260200161297d565b8381111561145f5750506000910152565b6000816129b5576129b5612a27565b506000190190565b600181811c908216806129d157607f821691505b602082108114156129f257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a0c57612a0c612a27565b5060010190565b600082612a2257612a22612a3d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146115d557600080fdfea2646970667358221220ed49ce4417200a0cacbd0dc06d086e667d86b94fd81a330b9e50279360c2dd8764736f6c634300080400330000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode
0x6080604052600436106101f95760003560e01c80636352211e1161010d578063a22cb465116100a0578063d7224ba01161006f578063d7224ba014610611578063dc33e68114610627578063e985e9c514610647578063f2fde38b14610690578063fbe1aa51146106b057600080fd5b8063a22cb4651461059c578063ac446002146105bc578063b88d4fde146105d1578063c87b56dd146105f157600080fd5b80638da5cb5b116100dc5780638da5cb5b146104b557806390aa0b0f146104d35780639231ab2a1461053a57806395d89b411461058757600080fd5b80636352211e1461042c57806370a082311461044c578063715018a61461046c5780638bc35c2f1461048157600080fd5b80632ebd86f0116101905780634f6ccce71161015f5780634f6ccce71461039957806355f804b3146103b95780635768e7fc146103d95780635d3a9c29146103ec5780635ec085191461040c57600080fd5b80632ebd86f01461032e5780632f745c59146103445780632fbc0bf11461036457806342842e0e1461037957600080fd5b806316e6e15a116101cc57806316e6e15a146102af57806318160ddd146102cf57806323b872dd146102ee5780632d20fb601461030e57600080fd5b806301ffc9a7146101fe57806306fdde0314610233578063081812fc14610255578063095ea7b31461028d575b600080fd5b34801561020a57600080fd5b5061021e610219366004612670565b6106e4565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b50610248610751565b60405161022a9190612833565b34801561026157600080fd5b50610275610270366004612714565b6107e3565b6040516001600160a01b03909116815260200161022a565b34801561029957600080fd5b506102ad6102a8366004612647565b610873565b005b3480156102bb57600080fd5b506102ad6102ca36600461274d565b61098b565b3480156102db57600080fd5b506001545b60405190815260200161022a565b3480156102fa57600080fd5b506102ad6103093660046124fe565b610a23565b34801561031a57600080fd5b506102ad610329366004612714565b610a2e565b34801561033a57600080fd5b506102e0610bb881565b34801561035057600080fd5b506102e061035f366004612647565b610ac1565b34801561037057600080fd5b506102e0610c39565b34801561038557600080fd5b506102ad6103943660046124fe565b610c74565b3480156103a557600080fd5b506102e06103b4366004612714565b610c8f565b3480156103c557600080fd5b506102ad6103d43660046126a8565b610cf8565b6102ad6103e736600461272c565b610d2e565b3480156103f857600080fd5b506102ad610407366004612714565b610f97565b34801561041857600080fd5b5061021e610427366004612714565b151590565b34801561043857600080fd5b50610275610447366004612714565b611155565b34801561045857600080fd5b506102e06104673660046124b2565b611167565b34801561047857600080fd5b506102ad6111f8565b34801561048d57600080fd5b506102e07f000000000000000000000000000000000000000000000000000000000000000581565b3480156104c157600080fd5b506000546001600160a01b0316610275565b3480156104df57600080fd5b50600a5461050e906001600160401b0380821691600160401b810490911690600160801b900463ffffffff1683565b604080516001600160401b03948516815293909216602084015263ffffffff169082015260600161022a565b34801561054657600080fd5b5061055a610555366004612714565b61122e565b6040805182516001600160a01b031681526020928301516001600160401b0316928101929092520161022a565b34801561059357600080fd5b5061024861124b565b3480156105a857600080fd5b506102ad6105b736600461260d565b61125a565b3480156105c857600080fd5b506102ad61131f565b3480156105dd57600080fd5b506102ad6105ec366004612539565b61142c565b3480156105fd57600080fd5b5061024861060c366004612714565b611465565b34801561061d57600080fd5b506102e060085481565b34801561063357600080fd5b506102e06106423660046124b2565b611532565b34801561065357600080fd5b5061021e6106623660046124cc565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561069c57600080fd5b506102ad6106ab3660046124b2565b61153d565b3480156106bc57600080fd5b506102e07f00000000000000000000000000000000000000000000000000000000000003e881565b60006001600160e01b031982166380ac58cd60e01b148061071557506001600160e01b03198216635b5e139f60e01b145b8061073057506001600160e01b0319821663780e9d6360e01b145b8061074b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610760906129bd565b80601f016020809104026020016040519081016040528092919081815260200182805461078c906129bd565b80156107d95780601f106107ae576101008083540402835291602001916107d9565b820191906000526020600020905b8154815290600101906020018083116107bc57829003601f168201915b5050505050905090565b60006107f0826001541190565b6108575760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061087e82611155565b9050806001600160a01b0316836001600160a01b031614156108ed5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161084e565b336001600160a01b038216148061090957506109098133610662565b61097b5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161084e565b6109868383836115d8565b505050565b6000546001600160a01b031633146109b55760405162461bcd60e51b815260040161084e90612846565b604080516060810182526001600160401b03948516808252939094166020850181905263ffffffff929092169301839052600a80546fffffffffffffffffffffffffffffffff1916909217600160401b9091021763ffffffff60801b1916600160801b909202919091179055565b610986838383611634565b6000546001600160a01b03163314610a585760405162461bcd60e51b815260040161084e90612846565b60026009541415610aab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161084e565b6002600955610ab9816119ba565b506001600955565b6000610acc83611167565b8210610b255760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161084e565b6000610b3060015490565b905060008060005b83811015610bd9576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610b8a57805192505b876001600160a01b0316836001600160a01b03161415610bc65786841415610bb85750935061074b92505050565b83610bc2816129f8565b9450505b5080610bd1816129f8565b915050610b38565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161084e565b6000610bb8610c4760015490565b1015610c5d5750600a546001600160401b031690565b50600a54600160401b90046001600160401b031690565b6109868383836040518060200160405280600081525061142c565b6000610c9a60015490565b8210610cf45760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161084e565b5090565b6000546001600160a01b03163314610d225760405162461bcd60e51b815260040161084e90612846565b610986600b83836123ef565b323314610d7d5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161084e565b60408051606081018252600a546001600160401b038082168352600160401b82041660208301819052600160801b90910463ffffffff16928201839052600154919291610bb81115610dd6575081516001600160401b03165b838214610e335760405162461bcd60e51b815260206004820152602560248201527f63616c6c6564207769746820696e636f7272656374207075626c69632073616c60448201526465206b657960d81b606482015260840161084e565b81610e805760405162461bcd60e51b815260206004820152601d60248201527f7075626c69632073616c6520686173206e6f7420626567756e20796574000000604482015260640161084e565b7f000000000000000000000000000000000000000000000000000000000000271085610eab60015490565b610eb591906128f0565b1115610ef85760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161084e565b7f000000000000000000000000000000000000000000000000000000000000000585610f2333611532565b610f2d91906128f0565b1115610f745760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b604482015260640161084e565b610f7e3386611ba3565b610f90610f8b868361291c565b611bc1565b5050505050565b6000546001600160a01b03163314610fc15760405162461bcd60e51b815260040161084e90612846565b7f00000000000000000000000000000000000000000000000000000000000003e881610fec60015490565b610ff691906128f0565b11156110545760405162461bcd60e51b815260206004820152602760248201527f746f6f206d616e7920616c7265616479206d696e746564206265666f72652064604482015266195d881b5a5b9d60ca1b606482015260840161084e565b61107e7f000000000000000000000000000000000000000000000000000000000000000582612a13565b156110e05760405162461bcd60e51b815260206004820152602c60248201527f63616e206f6e6c79206d696e742061206d756c7469706c65206f66207468652060448201526b6d6178426174636853697a6560a01b606482015260840161084e565b600061110c7f000000000000000000000000000000000000000000000000000000000000000583612908565b905060005b8181101561098657611143337f0000000000000000000000000000000000000000000000000000000000000005611ba3565b8061114d816129f8565b915050611111565b600061116082611c48565b5192915050565b60006001600160a01b0382166111d35760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161084e565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146112225760405162461bcd60e51b815260040161084e90612846565b61122c6000611df1565b565b604080518082019091526000808252602082015261074b82611c48565b606060038054610760906129bd565b6001600160a01b0382163314156112b35760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161084e565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146113495760405162461bcd60e51b815260040161084e90612846565b6002600954141561139c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161084e565b6002600955604051600090339047908381818185875af1925050503d80600081146113e3576040519150601f19603f3d011682016040523d82523d6000602084013e6113e8565b606091505b5050905080610ab95760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161084e565b611437848484611634565b61144384848484611e41565b61145f5760405162461bcd60e51b815260040161084e9061287b565b50505050565b6060611472826001541190565b6114d65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161084e565b60006114e0611f4f565b90506000815111611500576040518060200160405280600081525061152b565b8061150a84611f5e565b60405160200161151b9291906127c7565b6040516020818303038152906040525b9392505050565b600061074b82612077565b6000546001600160a01b031633146115675760405162461bcd60e51b815260040161084e90612846565b6001600160a01b0381166115cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084e565b6115d581611df1565b50565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061163f82611c48565b80519091506000906001600160a01b0316336001600160a01b0316148061167657503361166b846107e3565b6001600160a01b0316145b80611688575081516116889033610662565b9050806116f25760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161084e565b846001600160a01b031682600001516001600160a01b0316146117665760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161084e565b6001600160a01b0384166117ca5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161084e565b6117da60008484600001516115d8565b6001600160a01b038516600090815260056020526040812080546001929061180c9084906001600160801b031661293b565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611858918591166128ce565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556118df8460016128f0565b6000818152600460205260409020549091506001600160a01b031661197057611909816001541190565b156119705760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60085481611a0a5760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604482015260640161084e565b60006001611a1884846128f0565b611a229190612963565b9050611a4f60017f0000000000000000000000000000000000000000000000000000000000002710612963565b811115611a8457611a8160017f0000000000000000000000000000000000000000000000000000000000002710612963565b90505b611a8f816001541190565b611aea5760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b606482015260840161084e565b815b818111611b8f576000818152600460205260409020546001600160a01b0316611b7d576000611b1a82611c48565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80611b87816129f8565b915050611aec565b50611b9b8160016128f0565b600855505050565b611bbd828260405180602001604052806000815250612115565b5050565b80341015611c0a5760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b604482015260640161084e565b803411156115d557336108fc611c208334612963565b6040518115909202916000818181858888f19350505050158015611bbd573d6000803e3d6000fd5b6040805180820190915260008082526020820152611c67826001541190565b611cc65760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161084e565b60007f00000000000000000000000000000000000000000000000000000000000000058310611d2757611d197f000000000000000000000000000000000000000000000000000000000000000584612963565b611d249060016128f0565b90505b825b818110611d90576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611d7d57949350505050565b5080611d88816129a6565b915050611d29565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161084e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b15611f4357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e859033908990889088906004016127f6565b602060405180830381600087803b158015611e9f57600080fd5b505af1925050508015611ecf575060408051601f3d908101601f19168201909252611ecc9181019061268c565b60015b611f29573d808015611efd576040519150601f19603f3d011682016040523d82523d6000602084013e611f02565b606091505b508051611f215760405162461bcd60e51b815260040161084e9061287b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f47565b5060015b949350505050565b6060600b8054610760906129bd565b606081611f825750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fac5780611f96816129f8565b9150611fa59050600a83612908565b9150611f86565b6000816001600160401b03811115611fd457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ffe576020820181803683370190505b5090505b8415611f4757612013600183612963565b9150612020600a86612a13565b61202b9060306128f0565b60f81b81838151811061204e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612070600a86612908565b9450612002565b60006001600160a01b0382166120e95760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b606482015260840161084e565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b6001546001600160a01b0384166121785760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161084e565b612183816001541190565b156121d05760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161084e565b7f000000000000000000000000000000000000000000000000000000000000000583111561224b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161084e565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906122a79087906128ce565b6001600160801b031681526020018583602001516122c591906128ce565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156123e45760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46123a86000888488611e41565b6123c45760405162461bcd60e51b815260040161084e9061287b565b816123ce816129f8565b92505080806123dc906129f8565b91505061235b565b5060018190556119b2565b8280546123fb906129bd565b90600052602060002090601f01602090048101928261241d5760008555612463565b82601f106124365782800160ff19823516178555612463565b82800160010185558215612463579182015b82811115612463578235825591602001919060010190612448565b50610cf49291505b80821115610cf4576000815560010161246b565b80356001600160a01b038116811461249657600080fd5b919050565b80356001600160401b038116811461249657600080fd5b6000602082840312156124c3578081fd5b61152b8261247f565b600080604083850312156124de578081fd5b6124e78361247f565b91506124f56020840161247f565b90509250929050565b600080600060608486031215612512578081fd5b61251b8461247f565b92506125296020850161247f565b9150604084013590509250925092565b6000806000806080858703121561254e578081fd5b6125578561247f565b93506125656020860161247f565b92506040850135915060608501356001600160401b0380821115612587578283fd5b818701915087601f83011261259a578283fd5b8135818111156125ac576125ac612a53565b604051601f8201601f19908116603f011681019083821181831017156125d4576125d4612a53565b816040528281528a60208487010111156125ec578586fd5b82602086016020830137918201602001949094529598949750929550505050565b6000806040838503121561261f578182fd5b6126288361247f565b91506020830135801515811461263c578182fd5b809150509250929050565b60008060408385031215612659578182fd5b6126628361247f565b946020939093013593505050565b600060208284031215612681578081fd5b813561152b81612a69565b60006020828403121561269d578081fd5b815161152b81612a69565b600080602083850312156126ba578182fd5b82356001600160401b03808211156126d0578384fd5b818501915085601f8301126126e3578384fd5b8135818111156126f1578485fd5b866020828501011115612702578485fd5b60209290920196919550909350505050565b600060208284031215612725578081fd5b5035919050565b6000806040838503121561273e578182fd5b50508035926020909101359150565b600080600060608486031215612761578283fd5b61276a8461249b565b92506127786020850161249b565b9150604084013563ffffffff81168114612790578182fd5b809150509250925092565b600081518084526127b381602086016020860161297a565b601f01601f19169290920160200192915050565b600083516127d981846020880161297a565b8351908301906127ed81836020880161297a565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128299083018461279b565b9695505050505050565b60208152600061152b602083018461279b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b038083168185168083038211156127ed576127ed612a27565b6000821982111561290357612903612a27565b500190565b60008261291757612917612a3d565b500490565b600081600019048311821515161561293657612936612a27565b500290565b60006001600160801b038381169083168181101561295b5761295b612a27565b039392505050565b60008282101561297557612975612a27565b500390565b60005b8381101561299557818101518382015260200161297d565b8381111561145f5750506000910152565b6000816129b5576129b5612a27565b506000190190565b600181811c908216806129d157607f821691505b602082108114156129f257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a0c57612a0c612a27565b5060010190565b600082612a2257612a22612a3d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146115d557600080fdfea2646970667358221220ed49ce4417200a0cacbd0dc06d086e667d86b94fd81a330b9e50279360c2dd8764736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000003e8
-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 5
Arg [1] : collectionSize_ (uint256): 10000
Arg [2] : amountForDevs_ (uint256): 1000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode Sourcemap
45214:3979:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30435:370;;;;;;;;;;-1:-1:-1;30435:370:0;;;;;:::i;:::-;;:::i;:::-;;;6903:14:1;;6896:22;6878:41;;6866:2;6851:18;30435:370:0;;;;;;;;32161:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33686:204::-;;;;;;;;;;-1:-1:-1;33686:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6201:32:1;;;6183:51;;6171:2;6156:18;33686:204:0;6138:102:1;33249:379:0;;;;;;;;;;-1:-1:-1;33249:379:0;;;;;:::i;:::-;;:::i;:::-;;46013:266;;;;;;;;;;-1:-1:-1;46013:266:0;;;;;:::i;:::-;;:::i;28996:94::-;;;;;;;;;;-1:-1:-1;29072:12:0;;28996:94;;;20599:25:1;;;20587:2;20572:18;28996:94:0;20554:76:1;34536:142:0;;;;;;;;;;-1:-1:-1;34536:142:0;;;;;:::i;:::-;;:::i;48806:118::-;;;;;;;;;;-1:-1:-1;48806:118:0;;;;;:::i;:::-;;:::i;45374:44::-;;;;;;;;;;;;45414:4;45374:44;;29627:744;;;;;;;;;;-1:-1:-1;29627:744:0;;;;;:::i;:::-;;:::i;48188:205::-;;;;;;;;;;;;;:::i;34741:157::-;;;;;;;;;;-1:-1:-1;34741:157:0;;;;;:::i;:::-;;:::i;29159:177::-;;;;;;;;;;-1:-1:-1;29159:177:0;;;;;:::i;:::-;;:::i;48513:100::-;;;;;;;;;;-1:-1:-1;48513:100:0;;;;;:::i;:::-;;:::i;46402:896::-;;;;;;:::i;:::-;;:::i;47680:445::-;;;;;;;;;;-1:-1:-1;47680:445:0;;;;;:::i;:::-;;:::i;47516:129::-;;;;;;;;;;-1:-1:-1;47516:129:0;;;;;:::i;:::-;47621:18;;;47516:129;31984:118;;;;;;;;;;-1:-1:-1;31984:118:0;;;;;:::i;:::-;;:::i;30861:211::-;;;;;;;;;;-1:-1:-1;30861:211:0;;;;;:::i;:::-;;:::i;2682:103::-;;;;;;;;;;;;;:::i;45278:48::-;;;;;;;;;;;;;;;2031:87;;;;;;;;;;-1:-1:-1;2077:7:0;2104:6;-1:-1:-1;;;;;2104:6:0;2031:87;;45531:28;;;;;;;;;;-1:-1:-1;45531:28:0;;;;-1:-1:-1;;;;;45531:28:0;;;;-1:-1:-1;;;45531:28:0;;;;;;-1:-1:-1;;;45531:28:0;;;;;;;;;;-1:-1:-1;;;;;20886:15:1;;;20868:34;;20938:15;;;;20933:2;20918:18;;20911:43;21002:10;20990:23;20970:18;;;20963:51;20819:2;20804:18;45531:28:0;20786:234:1;49043:147:0;;;;;;;;;;-1:-1:-1;49043:147:0;;;;;:::i;:::-;;:::i;:::-;;;;20318:13:1;;-1:-1:-1;;;;;20314:39:1;20296:58;;20414:4;20402:17;;;20396:24;-1:-1:-1;;;;;20392:49:1;20370:20;;;20363:79;;;;20269:18;49043:147:0;20251:197:1;32316:98:0;;;;;;;;;;;;;:::i;33954:274::-;;;;;;;;;;-1:-1:-1;33954:274:0;;;;;:::i;:::-;;:::i;48619:181::-;;;;;;;;;;;;;:::i;34961:311::-;;;;;;;;;;-1:-1:-1;34961:311:0;;;;;:::i;:::-;;:::i;32477:394::-;;;;;;;;;;-1:-1:-1;32477:394:0;;;;;:::i;:::-;;:::i;39376:43::-;;;;;;;;;;;;;;;;48930:107;;;;;;;;;;-1:-1:-1;48930:107:0;;;;;:::i;:::-;;:::i;34291:186::-;;;;;;;;;;-1:-1:-1;34291:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;34436:25:0;;;34413:4;34436:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34291:186;2940:201;;;;;;;;;;-1:-1:-1;2940:201:0;;;;;:::i;:::-;;:::i;45331:38::-;;;;;;;;;;;;;;;30435:370;30562:4;-1:-1:-1;;;;;;30592:40:0;;-1:-1:-1;;;30592:40:0;;:99;;-1:-1:-1;;;;;;;30643:48:0;;-1:-1:-1;;;30643:48:0;30592:99;:160;;;-1:-1:-1;;;;;;;30702:50:0;;-1:-1:-1;;;30702:50:0;30592:160;:207;;;-1:-1:-1;;;;;;;;;;26626:40:0;;;30763:36;30578:221;30435:370;-1:-1:-1;;30435:370:0:o;32161:94::-;32215:13;32244:5;32237:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32161:94;:::o;33686:204::-;33754:7;33778:16;33786:7;35598:12;;-1:-1:-1;35588:22:0;35511:105;33778:16;33770:74;;;;-1:-1:-1;;;33770:74:0;;19473:2:1;33770:74:0;;;19455:21:1;19512:2;19492:18;;;19485:30;19551:34;19531:18;;;19524:62;-1:-1:-1;;;19602:18:1;;;19595:43;19655:19;;33770:74:0;;;;;;;;;-1:-1:-1;33860:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33860:24:0;;33686:204::o;33249:379::-;33318:13;33334:24;33350:7;33334:15;:24::i;:::-;33318:40;;33379:5;-1:-1:-1;;;;;33373:11:0;:2;-1:-1:-1;;;;;33373:11:0;;;33365:58;;;;-1:-1:-1;;;33365:58:0;;14837:2:1;33365:58:0;;;14819:21:1;14876:2;14856:18;;;14849:30;14915:34;14895:18;;;14888:62;-1:-1:-1;;;14966:18:1;;;14959:32;15008:19;;33365:58:0;14809:224:1;33365:58:0;829:10;-1:-1:-1;;;;;33448:21:0;;;;:62;;-1:-1:-1;33473:37:0;33490:5;829:10;34291:186;:::i;33473:37::-;33432:153;;;;-1:-1:-1;;;33432:153:0;;10983:2:1;33432:153:0;;;10965:21:1;11022:2;11002:18;;;10995:30;11061:34;11041:18;;;11034:62;11132:27;11112:18;;;11105:55;11177:19;;33432:153:0;10955:247:1;33432:153:0;33594:28;33603:2;33607:7;33616:5;33594:8;:28::i;:::-;33249:379;;;:::o;46013:266::-;2077:7;2104:6;-1:-1:-1;;;;;2104:6:0;829:10;2251:23;2243:68;;;;-1:-1:-1;;;2243:68:0;;;;;;;:::i;:::-;46187:86:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;46187:86:0;;::::1;::::0;;;;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;46174:10:::1;:99:::0;;-1:-1:-1;;46174:99:0;;;;-1:-1:-1;;;46174:99:0;;::::1;;-1:-1:-1::0;;;;46174:99:0::1;-1:-1:-1::0;;;46174:99:0;;::::1;::::0;;;::::1;::::0;;46013:266::o;34536:142::-;34644:28;34654:4;34660:2;34664:7;34644:9;:28::i;48806:118::-;2077:7;2104:6;-1:-1:-1;;;;;2104:6:0;829:10;2251:23;2243:68;;;;-1:-1:-1;;;2243:68:0;;;;;;;:::i;:::-;5319:1:::1;5917:7;;:19;;5909:63;;;::::0;-1:-1:-1;;;5909:63:0;;18697:2:1;5909:63:0::1;::::0;::::1;18679:21:1::0;18736:2;18716:18;;;18709:30;18775:33;18755:18;;;18748:61;18826:18;;5909:63:0::1;18669:181:1::0;5909:63:0::1;5319:1;6050:7;:18:::0;48890:28:::2;48909:8:::0;48890:18:::2;:28::i;:::-;-1:-1:-1::0;5275:1:0::1;6229:7;:22:::0;48806:118::o;29627:744::-;29736:7;29771:16;29781:5;29771:9;:16::i;:::-;29763:5;:24;29755:71;;;;-1:-1:-1;;;29755:71:0;;7356:2:1;29755:71:0;;;7338:21:1;7395:2;7375:18;;;7368:30;7434:34;7414:18;;;7407:62;-1:-1:-1;;;7485:18:1;;;7478:32;7527:19;;29755:71:0;7328:224:1;29755:71:0;29833:22;29858:13;29072:12;;;28996:94;29858:13;29833:38;;29878:19;29908:25;29958:9;29953:350;29977:14;29973:1;:18;29953:350;;;30007:31;30041:14;;;:11;:14;;;;;;;;;30007:48;;;;;;;;;-1:-1:-1;;;;;30007:48:0;;;;;-1:-1:-1;;;30007:48:0;;;-1:-1:-1;;;;;30007:48:0;;;;;;;;30068:28;30064:89;;30129:14;;;-1:-1:-1;30064:89:0;30186:5;-1:-1:-1;;;;;30165:26:0;:17;-1:-1:-1;;;;;30165:26:0;;30161:135;;;30223:5;30208:11;:20;30204:59;;;-1:-1:-1;30250:1:0;-1:-1:-1;30243:8:0;;-1:-1:-1;;;30243:8:0;30204:59;30273:13;;;;:::i;:::-;;;;30161:135;-1:-1:-1;29993:3:0;;;;:::i;:::-;;;;29953:350;;;-1:-1:-1;30309:56:0;;-1:-1:-1;;;30309:56:0;;17875:2:1;30309:56:0;;;17857:21:1;17914:2;17894:18;;;17887:30;17953:34;17933:18;;;17926:62;-1:-1:-1;;;18004:18:1;;;17997:44;18058:19;;30309:56:0;17847:236:1;48188:205:0;48233:7;45414:4;48254:13;29072:12;;;28996:94;48254:13;:29;48250:92;;;-1:-1:-1;48311:10:0;:22;-1:-1:-1;;;;;48311:22:0;;48188:205::o;48250:92::-;-1:-1:-1;48363:10:0;:23;-1:-1:-1;;;48363:23:0;;-1:-1:-1;;;;;48363:23:0;;48188:205::o;34741:157::-;34853:39;34870:4;34876:2;34880:7;34853:39;;;;;;;;;;;;:16;:39::i;29159:177::-;29226:7;29258:13;29072:12;;;28996:94;29258:13;29250:5;:21;29242:69;;;;-1:-1:-1;;;29242:69:0;;8990:2:1;29242:69:0;;;8972:21:1;9029:2;9009:18;;;9002:30;9068:34;9048:18;;;9041:62;-1:-1:-1;;;9119:18:1;;;9112:33;9162:19;;29242:69:0;8962:225:1;29242:69:0;-1:-1:-1;29325:5:0;29159:177::o;48513:100::-;2077:7;2104:6;-1:-1:-1;;;;;2104:6:0;829:10;2251:23;2243:68;;;;-1:-1:-1;;;2243:68:0;;;;;;;:::i;:::-;48584:23:::1;:13;48600:7:::0;;48584:23:::1;:::i;46402:896::-:0;46322:9;46335:10;46322:23;46314:66;;;;-1:-1:-1;;;46314:66:0;;10624:2:1;46314:66:0;;;10606:21:1;10663:2;10643:18;;;10636:30;10702:32;10682:18;;;10675:60;10752:18;;46314:66:0;10596:180:1;46314:66:0;46528:37:::1;::::0;;::::1;::::0;::::1;::::0;;46555:10:::1;46528:37:::0;-1:-1:-1;;;;;46528:37:0;;::::1;::::0;;-1:-1:-1;;;46528:37:0;::::1;;;::::0;::::1;::::0;;;-1:-1:-1;;;46528:37:0;;::::1;;;::::0;;;;;;29072:12;;46528:37;;;45414:4:::1;-1:-1:-1::0;46689:95:0::1;;;-1:-1:-1::0;46757:18:0;;-1:-1:-1;;;;;46749:27:0::1;46689:95;46823:19;46806:13;:36;46790:107;;;::::0;-1:-1:-1;;;46790:107:0;;10218:2:1;46790:107:0::1;::::0;::::1;10200:21:1::0;10257:2;10237:18;;;10230:30;10296:34;10276:18;;;10269:62;-1:-1:-1;;;10347:18:1;;;10340:35;10392:19;;46790:107:0::1;10190:227:1::0;46790:107:0::1;47621:18:::0;46906:92:::1;;;::::0;-1:-1:-1;;;46906:92:0;;14479:2:1;46906:92:0::1;::::0;::::1;14461:21:1::0;14518:2;14498:18;;;14491:30;14557:31;14537:18;;;14530:59;14606:18;;46906:92:0::1;14451:179:1::0;46906:92:0::1;47043:14;47031:8;47015:13;29072:12:::0;;;28996:94;47015:13:::1;:24;;;;:::i;:::-;:42;;47007:73;;;::::0;-1:-1:-1;;;47007:73:0;;12174:2:1;47007:73:0::1;::::0;::::1;12156:21:1::0;12213:2;12193:18;;;12186:30;-1:-1:-1;;;12232:18:1;;;12225:48;12290:18;;47007:73:0::1;12146:168:1::0;47007:73:0::1;47148:23;47136:8;47109:24;47122:10;47109:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;47093:118;;;::::0;-1:-1:-1;;;47093:118:0;;17116:2:1;47093:118:0::1;::::0;::::1;17098:21:1::0;17155:2;17135:18;;;17128:30;-1:-1:-1;;;17174:18:1;;;17167:52;17236:18;;47093:118:0::1;17088:172:1::0;47093:118:0::1;47218:31;47228:10;47240:8;47218:9;:31::i;:::-;47256:36;47269:22;47283:8:::0;47269:11;:22:::1;:::i;:::-;47256:12;:36::i;:::-;46387:1;;;46402:896:::0;;:::o;47680:445::-;2077:7;2104:6;-1:-1:-1;;;;;2104:6:0;829:10;2251:23;2243:68;;;;-1:-1:-1;;;2243:68:0;;;;;;;:::i;:::-;47788:13:::1;47776:8;47760:13;29072:12:::0;;;28996:94;47760:13:::1;:24;;;;:::i;:::-;:41;;47744:114;;;::::0;-1:-1:-1;;;47744:114:0;;17467:2:1;47744:114:0::1;::::0;::::1;17449:21:1::0;17506:2;17486:18;;;17479:30;17545:34;17525:18;;;17518:62;-1:-1:-1;;;17596:18:1;;;17589:37;17643:19;;47744:114:0::1;17439:229:1::0;47744:114:0::1;47881:23;47892:12;47881:8:::0;:23:::1;:::i;:::-;:28:::0;47865:106:::1;;;::::0;-1:-1:-1;;;47865:106:0;;8577:2:1;47865:106:0::1;::::0;::::1;8559:21:1::0;8616:2;8596:18;;;8589:30;8655:34;8635:18;;;8628:62;-1:-1:-1;;;8706:18:1;;;8699:42;8758:19;;47865:106:0::1;8549:234:1::0;47865:106:0::1;47978:17;47998:23;48009:12;47998:8:::0;:23:::1;:::i;:::-;47978:43;;48033:9;48028:92;48052:9;48048:1;:13;48028:92;;;48077:35;48087:10;48099:12;48077:9;:35::i;:::-;48063:3:::0;::::1;::::0;::::1;:::i;:::-;;;;48028:92;;31984:118:::0;32048:7;32071:20;32083:7;32071:11;:20::i;:::-;:25;;31984:118;-1:-1:-1;;31984:118:0:o;30861:211::-;30925:7;-1:-1:-1;;;;;30949:19:0;;30941:75;;;;-1:-1:-1;;;30941:75:0;;11762:2:1;30941:75:0;;;11744:21:1;11801:2;11781:18;;;11774:30;11840:34;11820:18;;;11813:62;-1:-1:-1;;;11891:18:1;;;11884:41;11942:19;;30941:75:0;11734:233:1;30941:75:0;-1:-1:-1;;;;;;31038:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;31038:27:0;;30861:211::o;2682:103::-;2077:7;2104:6;-1:-1:-1;;;;;2104:6:0;829:10;2251:23;2243:68;;;;-1:-1:-1;;;2243:68:0;;;;;;;:::i;:::-;2747:30:::1;2774:1;2747:18;:30::i;:::-;2682:103::o:0;49043:147::-;-1:-1:-1;;;;;;;;;;;;;;;;;49164:20:0;49176:7;49164:11;:20::i;32316:98::-;32372:13;32401:7;32394:14;;;;;:::i;33954:274::-;-1:-1:-1;;;;;34045:24:0;;829:10;34045:24;;34037:63;;;;-1:-1:-1;;;34037:63:0;;13705:2:1;34037:63:0;;;13687:21:1;13744:2;13724:18;;;13717:30;13783:28;13763:18;;;13756:56;13829:18;;34037:63:0;13677:176:1;34037:63:0;829:10;34109:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34109:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34109:53:0;;;;;;;;;;34174:48;;6878:41:1;;;34109:42:0;;829:10;34174:48;;6851:18:1;34174:48:0;;;;;;;33954:274;;:::o;48619:181::-;2077:7;2104:6;-1:-1:-1;;;;;2104:6:0;829:10;2251:23;2243:68;;;;-1:-1:-1;;;2243:68:0;;;;;;;:::i;:::-;5319:1:::1;5917:7;;:19;;5909:63;;;::::0;-1:-1:-1;;;5909:63:0;;18697:2:1;5909:63:0::1;::::0;::::1;18679:21:1::0;18736:2;18716:18;;;18709:30;18775:33;18755:18;;;18748:61;18826:18;;5909:63:0::1;18669:181:1::0;5909:63:0::1;5319:1;6050:7;:18:::0;48702:49:::2;::::0;48684:12:::2;::::0;48702:10:::2;::::0;48725:21:::2;::::0;48684:12;48702:49;48684:12;48702:49;48725:21;48702:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48683:68;;;48766:7;48758:36;;;::::0;-1:-1:-1;;;48758:36:0;;15240:2:1;48758:36:0::2;::::0;::::2;15222:21:1::0;15279:2;15259:18;;;15252:30;-1:-1:-1;;;15298:18:1;;;15291:46;15354:18;;48758:36:0::2;15212:166:1::0;34961:311:0;35098:28;35108:4;35114:2;35118:7;35098:9;:28::i;:::-;35149:48;35172:4;35178:2;35182:7;35191:5;35149:22;:48::i;:::-;35133:133;;;;-1:-1:-1;;;35133:133:0;;;;;;;:::i;:::-;34961:311;;;;:::o;32477:394::-;32575:13;32616:16;32624:7;35598:12;;-1:-1:-1;35588:22:0;35511:105;32616:16;32600:97;;;;-1:-1:-1;;;32600:97:0;;13289:2:1;32600:97:0;;;13271:21:1;13328:2;13308:18;;;13301:30;13367:34;13347:18;;;13340:62;-1:-1:-1;;;13418:18:1;;;13411:45;13473:19;;32600:97:0;13261:237:1;32600:97:0;32706:21;32730:10;:8;:10::i;:::-;32706:34;;32785:1;32767:7;32761:21;:25;:104;;;;;;;;;;;;;;;;;32822:7;32831:18;:7;:16;:18::i;:::-;32805:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32761:104;32747:118;32477:394;-1:-1:-1;;;32477:394:0:o;48930:107::-;48988:7;49011:20;49025:5;49011:13;:20::i;2940:201::-;2077:7;2104:6;-1:-1:-1;;;;;2104:6:0;829:10;2251:23;2243:68;;;;-1:-1:-1;;;2243:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3029:22:0;::::1;3021:73;;;::::0;-1:-1:-1;;;3021:73:0;;7759:2:1;3021:73:0::1;::::0;::::1;7741:21:1::0;7798:2;7778:18;;;7771:30;7837:34;7817:18;;;7810:62;-1:-1:-1;;;7888:18:1;;;7881:36;7934:19;;3021:73:0::1;7731:228:1::0;3021:73:0::1;3105:28;3124:8;3105:18;:28::i;:::-;2940:201:::0;:::o;39198:172::-;39295:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;39295:29:0;-1:-1:-1;;;;;39295:29:0;;;;;;;;;39336:28;;39295:24;;39336:28;;;;;;;39198:172;;;:::o;37563:1529::-;37660:35;37698:20;37710:7;37698:11;:20::i;:::-;37769:18;;37660:58;;-1:-1:-1;37727:22:0;;-1:-1:-1;;;;;37753:34:0;829:10;-1:-1:-1;;;;;37753:34:0;;:81;;;-1:-1:-1;829:10:0;37798:20;37810:7;37798:11;:20::i;:::-;-1:-1:-1;;;;;37798:36:0;;37753:81;:142;;;-1:-1:-1;37862:18:0;;37845:50;;829:10;34291:186;:::i;37845:50::-;37727:169;;37921:17;37905:101;;;;-1:-1:-1;;;37905:101:0;;14060:2:1;37905:101:0;;;14042:21:1;14099:2;14079:18;;;14072:30;14138:34;14118:18;;;14111:62;-1:-1:-1;;;14189:18:1;;;14182:48;14247:19;;37905:101:0;14032:240:1;37905:101:0;38053:4;-1:-1:-1;;;;;38031:26:0;:13;:18;;;-1:-1:-1;;;;;38031:26:0;;38015:98;;;;-1:-1:-1;;;38015:98:0;;12521:2:1;38015:98:0;;;12503:21:1;12560:2;12540:18;;;12533:30;12599:34;12579:18;;;12572:62;-1:-1:-1;;;12650:18:1;;;12643:36;12696:19;;38015:98:0;12493:228:1;38015:98:0;-1:-1:-1;;;;;38128:16:0;;38120:66;;;;-1:-1:-1;;;38120:66:0;;9394:2:1;38120:66:0;;;9376:21:1;9433:2;9413:18;;;9406:30;9472:34;9452:18;;;9445:62;-1:-1:-1;;;9523:18:1;;;9516:35;9568:19;;38120:66:0;9366:227:1;38120:66:0;38295:49;38312:1;38316:7;38325:13;:18;;;38295:8;:49::i;:::-;-1:-1:-1;;;;;38353:18:0;;;;;;:12;:18;;;;;:31;;38383:1;;38353:18;:31;;38383:1;;-1:-1:-1;;;;;38353:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;38353:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38391:16:0;;-1:-1:-1;38391:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;38391:16:0;;:29;;-1:-1:-1;;38391:29:0;;:::i;:::-;;;-1:-1:-1;;;;;38391:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38450:43:0;;;;;;;;-1:-1:-1;;;;;38450:43:0;;;;;-1:-1:-1;;;;;38476:15:0;38450:43;;;;;;;;;-1:-1:-1;38427:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;38427:66:0;-1:-1:-1;;;;;;38427:66:0;;;;;;;;;;;38743:11;38439:7;-1:-1:-1;38743:11:0;:::i;:::-;38806:1;38765:24;;;:11;:24;;;;;:29;38721:33;;-1:-1:-1;;;;;;38765:29:0;38761:236;;38823:20;38831:11;35598:12;;-1:-1:-1;35588:22:0;35511:105;38823:20;38819:171;;;38883:97;;;;;;;;38910:18;;-1:-1:-1;;;;;38883:97:0;;;;;;38941:28;;;;-1:-1:-1;;;;;38883:97:0;;;;;;;;;-1:-1:-1;38856:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;38856:124:0;-1:-1:-1;;;;;;38856:124:0;;;;;;;;;;;;38819:171;39029:7;39025:2;-1:-1:-1;;;;;39010:27:0;39019:4;-1:-1:-1;;;;;39010:27:0;;;;;;;;;;;39044:42;37563:1529;;;;;;:::o;39524:846::-;39614:24;;39653:12;39645:49;;;;-1:-1:-1;;;39645:49:0;;11409:2:1;39645:49:0;;;11391:21:1;11448:2;11428:18;;;11421:30;11487:26;11467:18;;;11460:54;11531:18;;39645:49:0;11381:174:1;39645:49:0;39701:16;39751:1;39720:28;39740:8;39720:17;:28;:::i;:::-;:32;;;;:::i;:::-;39701:51;-1:-1:-1;39774:18:0;39791:1;39774:14;:18;:::i;:::-;39763:8;:29;39759:81;;;39814:18;39831:1;39814:14;:18;:::i;:::-;39803:29;;39759:81;39955:17;39963:8;35598:12;;-1:-1:-1;35588:22:0;35511:105;39955:17;39947:68;;;;-1:-1:-1;;;39947:68:0;;18290:2:1;39947:68:0;;;18272:21:1;18329:2;18309:18;;;18302:30;18368:34;18348:18;;;18341:62;-1:-1:-1;;;18419:18:1;;;18412:36;18465:19;;39947:68:0;18262:228:1;39947:68:0;40039:17;40022:297;40063:8;40058:1;:13;40022:297;;40122:1;40091:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;40091:19:0;40087:225;;40137:31;40171:14;40183:1;40171:11;:14::i;:::-;40213:89;;;;;;;;40240:14;;-1:-1:-1;;;;;40213:89:0;;;;;;40267:24;;;;-1:-1:-1;;;;;40213:89:0;;;;;;;;;-1:-1:-1;40196:14:0;;;:11;:14;;;;;;;:106;;;;;;;;;-1:-1:-1;;;40196:106:0;-1:-1:-1;;;;;;40196:106:0;;;;;;;;;;;;-1:-1:-1;40087:225:0;40073:3;;;;:::i;:::-;;;;40022:297;;;-1:-1:-1;40352:12:0;:8;40363:1;40352:12;:::i;:::-;40325:24;:39;-1:-1:-1;;;39524:846:0:o;35622:98::-;35687:27;35697:2;35701:8;35687:27;;;;;;;;;;;;:9;:27::i;:::-;35622:98;;:::o;47304:204::-;47377:5;47364:9;:18;;47356:53;;;;-1:-1:-1;;;47356:53:0;;16005:2:1;47356:53:0;;;15987:21:1;16044:2;16024:18;;;16017:30;-1:-1:-1;;;16063:18:1;;;16056:52;16125:18;;47356:53:0;15977:172:1;47356:53:0;47432:5;47420:9;:17;47416:87;;;47456:10;47448:47;47477:17;47489:5;47477:9;:17;:::i;:::-;47448:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31324:606;-1:-1:-1;;;;;;;;;;;;;;;;;31441:16:0;31449:7;35598:12;;-1:-1:-1;35588:22:0;35511:105;31441:16;31433:71;;;;-1:-1:-1;;;31433:71:0;;8166:2:1;31433:71:0;;;8148:21:1;8205:2;8185:18;;;8178:30;8244:34;8224:18;;;8217:62;-1:-1:-1;;;8295:18:1;;;8288:40;8345:19;;31433:71:0;8138:232:1;31433:71:0;31513:26;31561:12;31550:7;:23;31546:93;;31605:22;31615:12;31605:7;:22;:::i;:::-;:26;;31630:1;31605:26;:::i;:::-;31584:47;;31546:93;31667:7;31647:212;31684:18;31676:4;:26;31647:212;;31721:31;31755:17;;;:11;:17;;;;;;;;;31721:51;;;;;;;;;-1:-1:-1;;;;;31721:51:0;;;;;-1:-1:-1;;;31721:51:0;;;-1:-1:-1;;;;;31721:51:0;;;;;;;;31785:28;31781:71;;31833:9;31324:606;-1:-1:-1;;;;31324:606:0:o;31781:71::-;-1:-1:-1;31704:6:0;;;;:::i;:::-;;;;31647:212;;;-1:-1:-1;31867:57:0;;-1:-1:-1;;;31867:57:0;;19057:2:1;31867:57:0;;;19039:21:1;19096:2;19076:18;;;19069:30;19135:34;19115:18;;;19108:62;-1:-1:-1;;;19186:18:1;;;19179:45;19241:19;;31867:57:0;19029:237:1;3301:191:0;3375:16;3394:6;;-1:-1:-1;;;;;3411:17:0;;;-1:-1:-1;;;;;;3411:17:0;;;;;;3444:40;;3394:6;;;;;;;3444:40;;3375:16;3444:40;3301:191;;:::o;40913:690::-;41050:4;-1:-1:-1;;;;;41067:13:0;;16539:19;:23;41063:535;;41106:72;;-1:-1:-1;;;41106:72:0;;-1:-1:-1;;;;;41106:36:0;;;;;:72;;829:10;;41157:4;;41163:7;;41172:5;;41106:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41106:72:0;;;;;;;;-1:-1:-1;;41106:72:0;;;;;;;;;;;;:::i;:::-;;;41093:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41337:13:0;;41333:215;;41370:61;;-1:-1:-1;;;41370:61:0;;;;;;;:::i;41333:215::-;41516:6;41510:13;41501:6;41497:2;41493:15;41486:38;41093:464;-1:-1:-1;;;;;;41228:55:0;-1:-1:-1;;;41228:55:0;;-1:-1:-1;41221:62:0;;41063:535;-1:-1:-1;41586:4:0;41063:535;40913:690;;;;;;:::o;48399:108::-;48459:13;48488;48481:20;;;;;:::i;23887:723::-;23943:13;24164:10;24160:53;;-1:-1:-1;;24191:10:0;;;;;;;;;;;;-1:-1:-1;;;24191:10:0;;;;;23887:723::o;24160:53::-;24238:5;24223:12;24279:78;24286:9;;24279:78;;24312:8;;;;:::i;:::-;;-1:-1:-1;24335:10:0;;-1:-1:-1;24343:2:0;24335:10;;:::i;:::-;;;24279:78;;;24367:19;24399:6;-1:-1:-1;;;;;24389:17:0;;;;;-1:-1:-1;;;24389:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24389:17:0;;24367:39;;24417:154;24424:10;;24417:154;;24451:11;24461:1;24451:11;;:::i;:::-;;-1:-1:-1;24520:10:0;24528:2;24520:5;:10;:::i;:::-;24507:24;;:2;:24;:::i;:::-;24494:39;;24477:6;24484;24477:14;;;;;;-1:-1:-1;;;24477:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;24477:56:0;;;;;;;;-1:-1:-1;24548:11:0;24557:2;24548:11;;:::i;:::-;;;24417:154;;31078:240;31139:7;-1:-1:-1;;;;;31171:19:0;;31155:102;;;;-1:-1:-1;;;31155:102:0;;9800:2:1;31155:102:0;;;9782:21:1;9839:2;9819:18;;;9812:30;9878:34;9858:18;;;9851:62;-1:-1:-1;;;9929:18:1;;;9922:47;9986:19;;31155:102:0;9772:239:1;31155:102:0;-1:-1:-1;;;;;;31279:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;31279:32:0;;-1:-1:-1;;;;;31279:32:0;;31078:240::o;36059:1272::-;36187:12;;-1:-1:-1;;;;;36214:16:0;;36206:62;;;;-1:-1:-1;;;36206:62:0;;16714:2:1;36206:62:0;;;16696:21:1;16753:2;16733:18;;;16726:30;16792:34;16772:18;;;16765:62;-1:-1:-1;;;16843:18:1;;;16836:31;16884:19;;36206:62:0;16686:223:1;36206:62:0;36405:21;36413:12;35598;;-1:-1:-1;35588:22:0;35511:105;36405:21;36404:22;36396:64;;;;-1:-1:-1;;;36396:64:0;;16356:2:1;36396:64:0;;;16338:21:1;16395:2;16375:18;;;16368:30;16434:31;16414:18;;;16407:59;16483:18;;36396:64:0;16328:179:1;36396:64:0;36487:12;36475:8;:24;;36467:71;;;;-1:-1:-1;;;36467:71:0;;19887:2:1;36467:71:0;;;19869:21:1;19926:2;19906:18;;;19899:30;19965:34;19945:18;;;19938:62;-1:-1:-1;;;20016:18:1;;;20009:32;20058:19;;36467:71:0;19859:224:1;36467:71:0;-1:-1:-1;;;;;36650:16:0;;36617:30;36650:16;;;:12;:16;;;;;;;;;36617:49;;;;;;;;;-1:-1:-1;;;;;36617:49:0;;;;;-1:-1:-1;;;36617:49:0;;;;;;;;;;;36692:119;;;;;;;;36712:19;;36617:49;;36692:119;;;36712:39;;36742:8;;36712:39;:::i;:::-;-1:-1:-1;;;;;36692:119:0;;;;;36795:8;36760:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;36692:119:0;;;;;;-1:-1:-1;;;;;36673:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;36673:138:0;;;;;;;;;;;;36846:43;;;;;;;;;;-1:-1:-1;;;;;36872:15:0;36846:43;;;;;;;;36818:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;36818:71:0;-1:-1:-1;;;;;;36818:71:0;;;;;;;;;;;;;;;;;;36830:12;;36942:281;36966:8;36962:1;:12;36942:281;;;36995:38;;37020:12;;-1:-1:-1;;;;;36995:38:0;;;37012:1;;36995:38;;37012:1;;36995:38;37060:59;37091:1;37095:2;37099:12;37113:5;37060:22;:59::i;:::-;37042:150;;;;-1:-1:-1;;;37042:150:0;;;;;;;:::i;:::-;37201:14;;;;:::i;:::-;;;;36976:3;;;;;:::i;:::-;;;;36942:281;;;-1:-1:-1;37231:12:0;:27;;;37265:60;34961:311;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:171::-;259:20;;-1:-1:-1;;;;;308:30:1;;298:41;;288:2;;353:1;350;343:12;368:196;427:6;480:2;468:9;459:7;455:23;451:32;448:2;;;501:6;493;486:22;448:2;529:29;548:9;529:29;:::i;569:270::-;637:6;645;698:2;686:9;677:7;673:23;669:32;666:2;;;719:6;711;704:22;666:2;747:29;766:9;747:29;:::i;:::-;737:39;;795:38;829:2;818:9;814:18;795:38;:::i;:::-;785:48;;656:183;;;;;:::o;844:338::-;921:6;929;937;990:2;978:9;969:7;965:23;961:32;958:2;;;1011:6;1003;996:22;958:2;1039:29;1058:9;1039:29;:::i;:::-;1029:39;;1087:38;1121:2;1110:9;1106:18;1087:38;:::i;:::-;1077:48;;1172:2;1161:9;1157:18;1144:32;1134:42;;948:234;;;;;:::o;1187:1183::-;1282:6;1290;1298;1306;1359:3;1347:9;1338:7;1334:23;1330:33;1327:2;;;1381:6;1373;1366:22;1327:2;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1597:2;1586:9;1582:18;1569:32;-1:-1:-1;;;;;1661:2:1;1653:6;1650:14;1647:2;;;1682:6;1674;1667:22;1647:2;1725:6;1714:9;1710:22;1700:32;;1770:7;1763:4;1759:2;1755:13;1751:27;1741:2;;1797:6;1789;1782:22;1741:2;1838;1825:16;1860:2;1856;1853:10;1850:2;;;1866:18;;:::i;:::-;1941:2;1935:9;1909:2;1995:13;;-1:-1:-1;;1991:22:1;;;2015:2;1987:31;1983:40;1971:53;;;2039:18;;;2059:22;;;2036:46;2033:2;;;2085:18;;:::i;:::-;2125:10;2121:2;2114:22;2160:2;2152:6;2145:18;2200:7;2195:2;2190;2186;2182:11;2178:20;2175:33;2172:2;;;2226:6;2218;2211:22;2172:2;2287;2282;2278;2274:11;2269:2;2261:6;2257:15;2244:46;2310:15;;;2327:2;2306:24;2299:40;;;;1317:1053;;;;-1:-1:-1;1317:1053:1;;-1:-1:-1;;;;1317:1053:1:o;2375:367::-;2440:6;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:2;;;2522:6;2514;2507:22;2469:2;2550:29;2569:9;2550:29;:::i;:::-;2540:39;;2629:2;2618:9;2614:18;2601:32;2676:5;2669:13;2662:21;2655:5;2652:32;2642:2;;2703:6;2695;2688:22;2642:2;2731:5;2721:15;;;2459:283;;;;;:::o;2747:264::-;2815:6;2823;2876:2;2864:9;2855:7;2851:23;2847:32;2844:2;;;2897:6;2889;2882:22;2844:2;2925:29;2944:9;2925:29;:::i;:::-;2915:39;3001:2;2986:18;;;;2973:32;;-1:-1:-1;;;2834:177:1:o;3016:255::-;3074:6;3127:2;3115:9;3106:7;3102:23;3098:32;3095:2;;;3148:6;3140;3133:22;3095:2;3192:9;3179:23;3211:30;3235:5;3211:30;:::i;3276:259::-;3345:6;3398:2;3386:9;3377:7;3373:23;3369:32;3366:2;;;3419:6;3411;3404:22;3366:2;3456:9;3450:16;3475:30;3499:5;3475:30;:::i;3540:642::-;3611:6;3619;3672:2;3660:9;3651:7;3647:23;3643:32;3640:2;;;3693:6;3685;3678:22;3640:2;3738:9;3725:23;-1:-1:-1;;;;;3808:2:1;3800:6;3797:14;3794:2;;;3829:6;3821;3814:22;3794:2;3872:6;3861:9;3857:22;3847:32;;3917:7;3910:4;3906:2;3902:13;3898:27;3888:2;;3944:6;3936;3929:22;3888:2;3989;3976:16;4015:2;4007:6;4004:14;4001:2;;;4036:6;4028;4021:22;4001:2;4086:7;4081:2;4072:6;4068:2;4064:15;4060:24;4057:37;4054:2;;;4112:6;4104;4097:22;4054:2;4148;4140:11;;;;;4170:6;;-1:-1:-1;3630:552:1;;-1:-1:-1;;;;3630:552:1:o;4187:190::-;4246:6;4299:2;4287:9;4278:7;4274:23;4270:32;4267:2;;;4320:6;4312;4305:22;4267:2;-1:-1:-1;4348:23:1;;4257:120;-1:-1:-1;4257:120:1:o;4382:258::-;4450:6;4458;4511:2;4499:9;4490:7;4486:23;4482:32;4479:2;;;4532:6;4524;4517:22;4479:2;-1:-1:-1;;4560:23:1;;;4630:2;4615:18;;;4602:32;;-1:-1:-1;4469:171:1:o;4645:440::-;4719:6;4727;4735;4788:2;4776:9;4767:7;4763:23;4759:32;4756:2;;;4809:6;4801;4794:22;4756:2;4837:28;4855:9;4837:28;:::i;:::-;4827:38;;4884:37;4917:2;4906:9;4902:18;4884:37;:::i;:::-;4874:47;;4971:2;4960:9;4956:18;4943:32;5015:10;5008:5;5004:22;4997:5;4994:33;4984:2;;5046:6;5038;5031:22;4984:2;5074:5;5064:15;;;4746:339;;;;;:::o;5090:257::-;5131:3;5169:5;5163:12;5196:6;5191:3;5184:19;5212:63;5268:6;5261:4;5256:3;5252:14;5245:4;5238:5;5234:16;5212:63;:::i;:::-;5329:2;5308:15;-1:-1:-1;;5304:29:1;5295:39;;;;5336:4;5291:50;;5139:208;-1:-1:-1;;5139:208:1:o;5352:470::-;5531:3;5569:6;5563:13;5585:53;5631:6;5626:3;5619:4;5611:6;5607:17;5585:53;:::i;:::-;5701:13;;5660:16;;;;5723:57;5701:13;5660:16;5757:4;5745:17;;5723:57;:::i;:::-;5796:20;;5539:283;-1:-1:-1;;;;5539:283:1:o;6245:488::-;-1:-1:-1;;;;;6514:15:1;;;6496:34;;6566:15;;6561:2;6546:18;;6539:43;6613:2;6598:18;;6591:34;;;6661:3;6656:2;6641:18;;6634:31;;;6439:4;;6682:45;;6707:19;;6699:6;6682:45;:::i;:::-;6674:53;6448:285;-1:-1:-1;;;;;;6448:285:1:o;6930:219::-;7079:2;7068:9;7061:21;7042:4;7099:44;7139:2;7128:9;7124:18;7116:6;7099:44;:::i;12726:356::-;12928:2;12910:21;;;12947:18;;;12940:30;13006:34;13001:2;12986:18;;12979:62;13073:2;13058:18;;12900:182::o;15383:415::-;15585:2;15567:21;;;15624:2;15604:18;;;15597:30;15663:34;15658:2;15643:18;;15636:62;-1:-1:-1;;;15729:2:1;15714:18;;15707:49;15788:3;15773:19;;15557:241::o;21025:253::-;21065:3;-1:-1:-1;;;;;21154:2:1;21151:1;21147:10;21184:2;21181:1;21177:10;21215:3;21211:2;21207:12;21202:3;21199:21;21196:2;;;21223:18;;:::i;21283:128::-;21323:3;21354:1;21350:6;21347:1;21344:13;21341:2;;;21360:18;;:::i;:::-;-1:-1:-1;21396:9:1;;21331:80::o;21416:120::-;21456:1;21482;21472:2;;21487:18;;:::i;:::-;-1:-1:-1;21521:9:1;;21462:74::o;21541:168::-;21581:7;21647:1;21643;21639:6;21635:14;21632:1;21629:21;21624:1;21617:9;21610:17;21606:45;21603:2;;;21654:18;;:::i;:::-;-1:-1:-1;21694:9:1;;21593:116::o;21714:246::-;21754:4;-1:-1:-1;;;;;21867:10:1;;;;21837;;21889:12;;;21886:2;;;21904:18;;:::i;:::-;21941:13;;21763:197;-1:-1:-1;;;21763:197:1:o;21965:125::-;22005:4;22033:1;22030;22027:8;22024:2;;;22038:18;;:::i;:::-;-1:-1:-1;22075:9:1;;22014:76::o;22095:258::-;22167:1;22177:113;22191:6;22188:1;22185:13;22177:113;;;22267:11;;;22261:18;22248:11;;;22241:39;22213:2;22206:10;22177:113;;;22308:6;22305:1;22302:13;22299:2;;;-1:-1:-1;;22343:1:1;22325:16;;22318:27;22148:205::o;22358:136::-;22397:3;22425:5;22415:2;;22434:18;;:::i;:::-;-1:-1:-1;;;22470:18:1;;22405:89::o;22499:380::-;22578:1;22574:12;;;;22621;;;22642:2;;22696:4;22688:6;22684:17;22674:27;;22642:2;22749;22741:6;22738:14;22718:18;22715:38;22712:2;;;22795:10;22790:3;22786:20;22783:1;22776:31;22830:4;22827:1;22820:15;22858:4;22855:1;22848:15;22712:2;;22554:325;;;:::o;22884:135::-;22923:3;-1:-1:-1;;22944:17:1;;22941:2;;;22964:18;;:::i;:::-;-1:-1:-1;23011:1:1;23000:13;;22931:88::o;23024:112::-;23056:1;23082;23072:2;;23087:18;;:::i;:::-;-1:-1:-1;23121:9:1;;23062:74::o;23141:127::-;23202:10;23197:3;23193:20;23190:1;23183:31;23233:4;23230:1;23223:15;23257:4;23254:1;23247:15;23273:127;23334:10;23329:3;23325:20;23322:1;23315:31;23365:4;23362:1;23355:15;23389:4;23386:1;23379:15;23405:127;23466:10;23461:3;23457:20;23454:1;23447:31;23497:4;23494:1;23487:15;23521:4;23518:1;23511:15;23537:131;-1:-1:-1;;;;;;23611:32:1;;23601:43;;23591:2;;23658:1;23655;23648:12
Swarm Source
ipfs://ed49ce4417200a0cacbd0dc06d086e667d86b94fd81a330b9e50279360c2dd87
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.