ERC-721
Overview
Max Total Supply
212 APES
Holders
91
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 APESLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ApeSquadCharacterSheetNFT
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-01 */ // Sources flattened with hardhat v2.9.1 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // 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/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/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/ERC721Opt.sol pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintToDeadAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error TransferToDeadAddress(); error UnableGetTokenOwnerByIndex(); error URIQueryForNonexistentToken(); /** * @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 1 (e.g. 1, 2, 3..). */ contract ERC721Opt is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; uint256 internal _nextTokenId = 1; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owners details // An empty struct value does not necessarily mean the token is unowned. See ownerOf implementation for details. mapping(uint256 => address) internal _owners; // Mapping owner address to balances mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Address to use for burned accounting address constant DEAD_ADDR = 0x000000000000000000000000000000000000dEaD; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { // Counter underflow is impossible as burned cannot be incremented // more than _nextTokenId - 1 times unchecked { return (_nextTokenId - 1) - balanceOf(DEAD_ADDR); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address owner) { if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken(); unchecked { for (uint256 curr = tokenId;; curr--) { owner = _owners[curr]; if (owner != address(0)) { return owner; } } } } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) revert ApprovalCallerNotOwnerNorApproved(); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) revert TransferToNonERC721ReceiverImplementer(); } function _isApprovedOrOwner(address sender, uint256 tokenId) internal view virtual returns (bool) { address owner = ownerOf(tokenId); return (sender == owner || getApproved(tokenId) == sender || isApprovedForAll(owner, sender)); } /** * @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 virtual returns (bool) { return tokenId > 0 && tokenId < _nextTokenId && _owners[tokenId] != DEAD_ADDR; } function _mint(address to, uint256 quantity) internal virtual { _mint(to, quantity, '', false); } function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal virtual { uint256 startTokenId = _nextTokenId; if (to == address(0)) revert MintToZeroAddress(); if (to == DEAD_ADDR) revert MintToDeadAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance overflow if current value + quantity > 1.56e77 (2**256) - 1 // updatedIndex overflows if _nextTokenId + quantity > 1.56e77 (2**256) - 1 unchecked { _balances[to] += quantity; _owners[startTokenId] = to; uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { if (!_checkOnERC721Received(address(0), to, updatedIndex, _data)) revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _nextTokenId = 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 { address owner = ownerOf(tokenId); bool isApprovedOrOwner = (_msgSender() == owner || isApprovedForAll(owner, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (owner != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); if (to == DEAD_ADDR) revert TransferToDeadAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, owner); // Underflow of the sender's balance is impossible because we check for // owner above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; // If the owner 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 (_owners[nextTokenId] == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _nextTokenId) { _owners[nextTokenId] = owner; } } } 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); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ownerOf(tokenId); _beforeTokenTransfers(owner, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, owner); // Underflow of the sender's balance is impossible because we check for // owner above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _balances[owner] -= 1; _balances[DEAD_ADDR] += 1; _owners[tokenId] = DEAD_ADDR; // If the owner 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 (_owners[nextTokenId] == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _nextTokenId) { _owners[nextTokenId] = owner; } } } emit Transfer(owner, address(0), tokenId); _afterTokenTransfers(owner, address(0), tokenId, 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 TransferToNonERC721ReceiverImplementer(); 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 contracts/extensions/ERC721OptOwnersExplicit.sol pragma solidity ^0.8.4; error AllOwnersHaveBeenSet(); error QuantityMustBeNonZero(); error NoTokensMintedYet(); abstract contract ERC721OptOwnersExplicit is ERC721Opt { uint256 public nextOwnerToExplicitlySet = 1; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { if (quantity == 0) revert QuantityMustBeNonZero(); if (_nextTokenId == 1) revert NoTokensMintedYet(); uint256 _nextOwnerToExplicitlySet = nextOwnerToExplicitlySet; if (_nextOwnerToExplicitlySet >= _nextTokenId) revert AllOwnersHaveBeenSet(); // Index underflow is impossible. // Counter or index overflow is incredibly unrealistic. unchecked { uint256 endIndex = _nextOwnerToExplicitlySet + quantity - 1; // Set the end index to be the last token index if (endIndex + 1 > _nextTokenId) { endIndex = _nextTokenId - 1; } for (uint256 i = _nextOwnerToExplicitlySet; i <= endIndex; i++) { if (_owners[i] == address(0) && _owners[i] != DEAD_ADDR) { address ownership = ownerOf(i); _owners[i] = ownership; } } nextOwnerToExplicitlySet = endIndex + 1; } } } // File contracts/extensions/ERC721OptBurnable.sol pragma solidity ^0.8.4; error BurnCallerNotOwnerNorApproved(); /** * @title ERC721Opt Burnable Token * @dev ERC721Opt Token that can be irreversibly burned (destroyed). */ abstract contract ERC721OptBurnable is ERC721Opt { /** * @dev Burns `tokenId`. See {ERC721Opt-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { if (!_isApprovedOrOwner(_msgSender(), tokenId)) revert BurnCallerNotOwnerNorApproved(); _burn(tokenId); } } // File contracts/extensions/ERC721OptBatchBurnable.sol pragma solidity ^0.8.4; /** * @title ERC721Opt Batch Burnable Token * @dev ERC721Opt Token that can be irreversibly batch burned (destroyed). */ abstract contract ERC721OptBatchBurnable is ERC721OptBurnable { /** * @dev Perform burn on a batch of tokens */ function batchBurn(uint16[] memory tokenIds) public virtual { for (uint16 i = 0; i < tokenIds.length; ++i) { if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert BurnCallerNotOwnerNorApproved(); _burn(tokenIds[i]); } } } // File contracts/extensions/ERC721OptBatchTransferable.sol pragma solidity ^0.8.4; /** * @title ERC721Opt Batch Transferable Token * @dev ERC721Opt Token that can be batch transfered */ abstract contract ERC721OptBatchTransferable is ERC721Opt { /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint16[] tokenIds ); /** * @dev Perform transferFrom on a batch of tokens */ function batchTransferFrom( address from, address to, uint16[] memory tokenIds ) public virtual { for (uint16 i = 0; i < tokenIds.length; ++i) { if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert TransferCallerNotOwnerNorApproved(); transferFrom(from, to, tokenIds[i]); } emit TransferBatch(_msgSender(), from, to, tokenIds); } /** * @dev Perform safeTransferFrom on a batch of tokens */ function safeBatchTransferFrom( address from, address to, uint16[] memory tokenIds ) public virtual { safeBatchTransferFrom(from, to, tokenIds, ''); } /** * @dev Perform safeTransferFrom on a batch of tokens */ function safeBatchTransferFrom( address from, address to, uint16[] memory tokenIds, bytes memory _data ) public virtual { for (uint256 i = 0; i < tokenIds.length; ++i) { if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert TransferCallerNotOwnerNorApproved(); safeTransferFrom(from, to, tokenIds[i], _data); } emit TransferBatch(_msgSender(), from, to, tokenIds); } } // File contracts/OpenSea.sol pragma solidity ^0.8.4; contract OpenSeaOwnableDelegateProxy {} contract OpenSeaProxyRegistry { mapping(address => OpenSeaOwnableDelegateProxy) public proxies; } // File contracts/ApeSquadCharacterSheetNFT.sol pragma solidity ^0.8.4; error CharacterSheetTypeQueryForNonexistentToken(); error OnlyMintersCanMintCharacterSheets(); error InvalidPurchaseCharacterSheetTypeId(); error AllCharacterSheetsOfTypeMinted(); error NoCharacterSheetMintAmountProvided(); error InvalidUpdateCharacterSheetLengthsDontMatch(); error InvalidUpdateCharacterSheetTypeId(); contract ApeSquadCharacterSheetNFT is Ownable, ERC721Opt, ERC721OptOwnersExplicit, ERC721OptBatchBurnable, ERC721OptBatchTransferable { using Strings for uint256; struct CharacterSheetPurchase { uint16 characterSheetTypeId; uint16 amount; } struct CharacterSheetType { string name; uint16 maxCharacterSheets; uint16 minted; } /* Base URI for token URIs */ string public baseURI; /* OpenSea user account proxy */ address public openSeaProxyRegistryAddress; /* Minter addressess */ mapping(address => bool) public minters; CharacterSheetType[] public characterSheetTypes; /* mapping of each token id to characterSheet type */ mapping(uint256 => uint16) _tokenIdCharacterSheetTypes; /* mapping of each token id to rarity. 0 = common, 1 = rare, 2 = legendary */ mapping(uint256 => uint8) public characterSheetRarity; constructor(string memory name_, string memory symbol_, string memory _initialBaseURI, address _openSeaProxyRegistryAddress, address[] memory _minters) ERC721Opt(name_, symbol_) { baseURI = _initialBaseURI; openSeaProxyRegistryAddress = _openSeaProxyRegistryAddress; for (uint256 i; i < _minters.length; i++) { minters[_minters[i]] = true; } _addCharacterSheet("Alex", 250); _addCharacterSheet("Borg", 250); _addCharacterSheet("Dax", 250); _addCharacterSheet("Kanoa", 250); _addCharacterSheet("Kazz", 250); } /** * @dev Get characterSheetType count */ function characterSheetTypeCount() public view returns (uint256) { return characterSheetTypes.length; } /** * @dev Get characterSheets left for sale */ function characterSheetsLeft(uint16 characterSheetTypeId) public view returns (uint256) { return characterSheetTypes[characterSheetTypeId].maxCharacterSheets - characterSheetTypes[characterSheetTypeId].minted; } /** * @dev Get the characterSheet type for a specific tokenId */ function tokenCharacterSheetType(uint256 tokenId) public view returns (string memory) { if (!_exists(tokenId)) revert CharacterSheetTypeQueryForNonexistentToken(); return characterSheetTypes[_tokenIdCharacterSheetTypes[tokenId]].name; } /** * @dev Override to if default approved for OS proxy accounts or normal approval */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { // Whitelist OpenSea proxy contract for easy trading. OpenSeaProxyRegistry openSeaProxyRegistry = OpenSeaProxyRegistry( openSeaProxyRegistryAddress ); if (address(openSeaProxyRegistry.proxies(owner)) == operator) { return true; } return ERC721Opt.isApprovedForAll(owner, operator); } /** * @dev Override to change the baseURI used in tokenURI */ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /** * @dev Override to change tokenURI format */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(_baseURI(), tokenId.toString(), '.json')) : ''; } /** * @dev Mint of specific characterSheet type to address. */ function mint(address to, CharacterSheetPurchase[] calldata characterSheetPurchases) public { if(!minters[msg.sender]) revert OnlyMintersCanMintCharacterSheets(); uint256 amountToMint; uint256 tokenId = _nextTokenId; for (uint16 i; i < characterSheetPurchases.length; i++) { CharacterSheetPurchase memory p = characterSheetPurchases[i]; if(p.characterSheetTypeId >= characterSheetTypes.length) revert InvalidPurchaseCharacterSheetTypeId(); if(p.amount > characterSheetsLeft(characterSheetPurchases[i].characterSheetTypeId)) revert AllCharacterSheetsOfTypeMinted(); characterSheetTypes[p.characterSheetTypeId].minted += p.amount; amountToMint += p.amount; for (uint16 j; j < p.amount; j++) { _tokenIdCharacterSheetTypes[tokenId++] = p.characterSheetTypeId; } } if(amountToMint == 0) revert NoCharacterSheetMintAmountProvided(); _safeMint(to, amountToMint, ''); } /** * @dev Mint of specific poster type to address. */ function mintType(address to, uint16 characterSheetTypeId, uint16 amount) public { if(!minters[msg.sender]) revert OnlyMintersCanMintCharacterSheets(); if(amount == 0) revert NoCharacterSheetMintAmountProvided(); uint256 tokenId = _nextTokenId; if(characterSheetTypeId >= characterSheetTypes.length) revert InvalidPurchaseCharacterSheetTypeId(); if(amount > characterSheetsLeft(characterSheetTypeId)) revert AllCharacterSheetsOfTypeMinted(); characterSheetTypes[characterSheetTypeId].minted += amount; for (uint16 i; i < amount; i++) { _tokenIdCharacterSheetTypes[tokenId++] = characterSheetTypeId; } _safeMint(to, amount, ''); } /** * @dev Set the base uri for token metadata */ function setBaseURI(string memory _newBaseURI) external onlyOwner { baseURI = _newBaseURI; } /** * @dev Set minter status for addresses */ function setMinters(address[] calldata addresses, bool allowed) external onlyOwner { for(uint256 i; i < addresses.length; i++) { minters[addresses[i]] = allowed; } } /** * @dev Add new characterSheet */ function _addCharacterSheet(string memory name, uint16 maxCharacterSheets) internal { CharacterSheetType memory cs; cs.name = name; cs.maxCharacterSheets = maxCharacterSheets; characterSheetTypes.push(cs); } /** * @dev Add new characterSheet */ function addCharacterSheet(string calldata name, uint16 maxCharacterSheets) external onlyOwner { _addCharacterSheet(name, maxCharacterSheets); } /** * @dev Update characterSheet names */ function updateCharacterSheetNames(uint16[] calldata characterSheetTypeIds, string[] calldata names) external onlyOwner { if(characterSheetTypeIds.length != names.length) revert InvalidUpdateCharacterSheetLengthsDontMatch(); for (uint16 i; i < characterSheetTypeIds.length; i++) { if(characterSheetTypeIds[i] >= characterSheetTypes.length) revert InvalidUpdateCharacterSheetTypeId(); characterSheetTypes[characterSheetTypeIds[i]].name = names[i]; } } /** * @dev Update available characterSheets */ function updateMaxCharacterSheets(uint16[] calldata characterSheetTypeIds, uint16[] calldata maxCharacterSheets) external onlyOwner { if(characterSheetTypeIds.length != maxCharacterSheets.length) revert InvalidUpdateCharacterSheetLengthsDontMatch(); for (uint16 i; i < characterSheetTypeIds.length; i++) { if(characterSheetTypeIds[i] >= characterSheetTypes.length) revert InvalidUpdateCharacterSheetTypeId(); characterSheetTypes[characterSheetTypeIds[i]].maxCharacterSheets = maxCharacterSheets[i]; } } /** * @dev Upate Rarities on chain for future staking */ function updateRarities(uint8 rarity, uint256[] calldata tokenIds) external onlyOwner { if (rarity == 0) { for(uint256 i; i < tokenIds.length; i++) { if (tokenIds[i] >= _nextTokenId) continue; delete characterSheetRarity[tokenIds[i]]; } } else { for(uint256 i; i < tokenIds.length; i++) { if (tokenIds[i] >= _nextTokenId) continue; characterSheetRarity[tokenIds[i]] = rarity; } } } /** * @dev Force update all owners for better transfers */ function updateOwners(uint256 quantity) external onlyOwner { _setOwnersExplicit(quantity); } } // File contracts/ApeSquadPosterNFT.sol pragma solidity ^0.8.4; error PosterTypeQueryForNonexistentToken(); error OnlyMintersCanMintPosters(); error InvalidPurchasePosterTypeId(); error AllPostersOfTypeMinted(); error NoPosterMintAmountProvided(); error InvalidUpdatePosterLengthsDontMatch(); error InvalidUpdatePosterTypeId(); contract ApeSquadPosterNFT is Ownable, ERC721Opt, ERC721OptOwnersExplicit, ERC721OptBatchBurnable, ERC721OptBatchTransferable { using Strings for uint256; struct PosterPurchase { uint16 posterTypeId; uint16 amount; } struct PosterType { string name; uint16 maxPosters; uint16 minted; } /* Base URI for token URIs */ string public baseURI; /* OpenSea user account proxy */ address public openSeaProxyRegistryAddress; /* Minter addressess */ mapping(address => bool) public minters; PosterType[] public posterTypes; /* mapping of each token id to poster type */ mapping(uint256 => uint16) _tokenIdPosterTypes; /* mapping of each token id to rarity. 0 = common, 1 = rare, 2 = legendary */ mapping(uint256 => uint8) public posterRarity; constructor(string memory name_, string memory symbol_, string memory _initialBaseURI, address _openSeaProxyRegistryAddress, address[] memory _minters) ERC721Opt(name_, symbol_) { baseURI = _initialBaseURI; openSeaProxyRegistryAddress = _openSeaProxyRegistryAddress; for (uint256 i; i < _minters.length; i++) { minters[_minters[i]] = true; } _addPoster("Season 1", 1250); } /** * @dev Get posterType count */ function posterTypeCount() public view returns (uint256) { return posterTypes.length; } /** * @dev Get posters left for sale */ function postersLeft(uint16 posterTypeId) public view returns (uint256) { return posterTypes[posterTypeId].maxPosters - posterTypes[posterTypeId].minted; } /** * @dev Get the poster type for a specific tokenId */ function tokenPosterType(uint256 tokenId) public view returns (string memory) { if (!_exists(tokenId)) revert PosterTypeQueryForNonexistentToken(); return posterTypes[_tokenIdPosterTypes[tokenId]].name; } /** * @dev Override to if default approved for OS proxy accounts or normal approval */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { // Whitelist OpenSea proxy contract for easy trading. OpenSeaProxyRegistry openSeaProxyRegistry = OpenSeaProxyRegistry( openSeaProxyRegistryAddress ); if (address(openSeaProxyRegistry.proxies(owner)) == operator) { return true; } return ERC721Opt.isApprovedForAll(owner, operator); } /** * @dev Override to change the baseURI used in tokenURI */ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /** * @dev Override to change tokenURI format */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(_baseURI(), tokenId.toString(), '.json')) : ''; } /** * @dev Mint of specific poster type to address. */ function mint(address to, PosterPurchase[] calldata posterPurchases) public { if(!minters[msg.sender]) revert OnlyMintersCanMintPosters(); uint256 amountToMint; uint256 tokenId = _nextTokenId; for (uint16 i; i < posterPurchases.length; i++) { PosterPurchase memory p = posterPurchases[i]; if(p.posterTypeId >= posterTypes.length) revert InvalidPurchasePosterTypeId(); if(p.amount > postersLeft(posterPurchases[i].posterTypeId)) revert AllPostersOfTypeMinted(); posterTypes[p.posterTypeId].minted += p.amount; amountToMint += p.amount; for (uint16 j; j < p.amount; j++) { _tokenIdPosterTypes[tokenId++] = p.posterTypeId; } } if(amountToMint == 0) revert NoPosterMintAmountProvided(); _safeMint(to, amountToMint, ''); } /** * @dev Mint of specific poster type to address. */ function mintType(address to, uint16 posterTypeId, uint16 amount) public { if(!minters[msg.sender]) revert OnlyMintersCanMintPosters(); if(amount == 0) revert NoPosterMintAmountProvided(); uint256 tokenId = _nextTokenId; if(posterTypeId >= posterTypes.length) revert InvalidPurchasePosterTypeId(); if(amount > postersLeft(posterTypeId)) revert AllPostersOfTypeMinted(); posterTypes[posterTypeId].minted += amount; for (uint16 i; i < amount; i++) { _tokenIdPosterTypes[tokenId++] = posterTypeId; } _safeMint(to, amount, ''); } /** * @dev Set the base uri for token metadata */ function setBaseURI(string memory _newBaseURI) external onlyOwner { baseURI = _newBaseURI; } /** * @dev Set minter status for addresses */ function setMinters(address[] calldata addresses, bool allowed) external onlyOwner { for(uint256 i; i < addresses.length; i++) { minters[addresses[i]] = allowed; } } /** * @dev Add new poster */ function _addPoster(string memory name, uint16 maxPosters) internal { PosterType memory p; p.name = name; p.maxPosters = maxPosters; posterTypes.push(p); } /** * @dev Add new poster */ function addPoster(string calldata name, uint16 maxPosters) external onlyOwner { _addPoster(name, maxPosters); } /** * @dev Update poster names */ function updatePosterNames(uint16[] calldata posterTypeIds, string[] calldata names) external onlyOwner { if(posterTypeIds.length != names.length) revert InvalidUpdatePosterLengthsDontMatch(); for (uint16 i; i < posterTypeIds.length; i++) { if(posterTypeIds[i] >= posterTypes.length) revert InvalidUpdatePosterTypeId(); posterTypes[posterTypeIds[i]].name = names[i]; } } /** * @dev Update available posters */ function updateMaxPosters(uint16[] calldata posterTypeIds, uint16[] calldata maxPosters) external onlyOwner { if(posterTypeIds.length != maxPosters.length) revert InvalidUpdatePosterLengthsDontMatch(); for (uint16 i; i < posterTypeIds.length; i++) { if(posterTypeIds[i] >= posterTypes.length) revert InvalidUpdatePosterTypeId(); posterTypes[posterTypeIds[i]].maxPosters = maxPosters[i]; } } /** * @dev Upate Rarities on chain for future staking */ function updateRarities(uint8 rarity, uint256[] calldata tokenIds) external onlyOwner { if (rarity == 0) { for(uint256 i; i < tokenIds.length; i++) { if (tokenIds[i] >= _nextTokenId) continue; delete posterRarity[tokenIds[i]]; } } else { for(uint256 i; i < tokenIds.length; i++) { if (tokenIds[i] >= _nextTokenId) continue; posterRarity[tokenIds[i]] = rarity; } } } /** * @dev Force update all owners for better transfers */ function updateOwners(uint256 quantity) external onlyOwner { _setOwnersExplicit(quantity); } } // File contracts/ApeSquadMinter.sol pragma solidity ^0.8.0; contract ApeSquadMinter is Ownable { /* Character Sheet NFT contract */ ApeSquadCharacterSheetNFT characterSheetNFTContract; /* Poster NFT contract */ ApeSquadPosterNFT posterNFTContract; /* Is Sale Active */ bool public saleIsActive; /* silver cards reserved for marketing */ mapping(uint16 => uint16) public reservedCharacterSheets; /* posters reserved for marketing */ uint16 public reservedSeason1Posters = 2; /* Price for character sheets */ uint256 public characterSheetPrice = 0.08 ether; /* NFT Contracts that can get free poster */ address[] public freeSeason1PosterNftContracts; /* Mapping of claimed posters */ mapping(address => bool) public season1PosterClaimed; constructor( ApeSquadCharacterSheetNFT _characterSheetNFTContract, ApeSquadPosterNFT _posterNFTContract, address[] memory _freeSeason1PosterNftContracts ) { characterSheetNFTContract = _characterSheetNFTContract; posterNFTContract = _posterNFTContract; for (uint16 i; i < characterSheetNFTContract.characterSheetTypeCount(); i++) { reservedCharacterSheets[i] = 6; } freeSeason1PosterNftContracts = _freeSeason1PosterNftContracts; } function mint(ApeSquadCharacterSheetNFT.CharacterSheetPurchase[] calldata characterSheetPurchases, bool freeSeason1Poster) external payable { require(msg.sender == tx.origin, 'Only EOA'); require(saleIsActive, 'Regular sale is not active'); uint256 totalAmount; for (uint16 i; i < characterSheetPurchases.length; i++) { require( characterSheetPurchases[i].amount <= characterSheetNFTContract.characterSheetsLeft(characterSheetPurchases[i].characterSheetTypeId) - reservedCharacterSheets[characterSheetPurchases[i].characterSheetTypeId], 'Sold Out' ); totalAmount += characterSheetPurchases[i].amount; } if (freeSeason1Poster) { require(!season1PosterClaimed[msg.sender], 'Season 1 Poster already claimed'); bool valid = totalAmount > 0 || characterSheetNFTContract.balanceOf(msg.sender) > 0; if (totalAmount == 0 && characterSheetNFTContract.balanceOf(msg.sender) == 0) { for (uint256 i; i < freeSeason1PosterNftContracts.length; i++) { valid = valid || IERC721(freeSeason1PosterNftContracts[i]).balanceOf(msg.sender) > 0; if (valid) break; } } require(valid, 'Season 1 Poster requirements not met'); season1PosterClaimed[msg.sender] = true; } require( msg.value >= (totalAmount * characterSheetPrice), 'Ether value sent is not correct' ); if(totalAmount > 0) { characterSheetNFTContract.mint(msg.sender, characterSheetPurchases); } if (freeSeason1Poster) { posterNFTContract.mintType(msg.sender, 0, 1); } } function flipSaleState() external onlyOwner { saleIsActive = !saleIsActive; } function setReserves(uint16[] calldata _characterSheetTypeIds, uint16[] calldata _characterSheetAmounts, uint16 _season1PosterAmount) external onlyOwner { require( _characterSheetTypeIds.length == _characterSheetAmounts.length, 'Character Sheet Type Ids length should match Amounts length' ); for (uint16 i; i < _characterSheetTypeIds.length; i++) { require( _characterSheetTypeIds[i] < characterSheetNFTContract.characterSheetTypeCount(), 'Character Sheet Type Id should be with in range' ); reservedCharacterSheets[_characterSheetTypeIds[i]] = _characterSheetAmounts[i]; } reservedSeason1Posters = _season1PosterAmount; } function setFreeSeason1PosterNftContracts(address[] calldata _freeSeason1PosterNftContracts) external onlyOwner { freeSeason1PosterNftContracts = _freeSeason1PosterNftContracts; } function setPrice(uint256 _characterSheetPrice) external onlyOwner { characterSheetPrice = _characterSheetPrice; } function reserveMint(uint16[] calldata _characterSheetTypeIds, uint16[] calldata _characterSheetAmounts, uint16 season1Posters, address[] calldata to) external onlyOwner { require( _characterSheetTypeIds.length == _characterSheetAmounts.length, 'Character Sheet Type Ids length should match Amounts length' ); for (uint16 i; i < _characterSheetTypeIds.length; i++) { require( (_characterSheetAmounts[i] * to.length) <= reservedCharacterSheets[_characterSheetTypeIds[i]], 'Not enough reserve left for team' ); } require( (season1Posters * to.length) <= reservedSeason1Posters, 'Not enough reserve left for team' ); for (uint16 i = 0; i < to.length; i++) { for (uint16 j; j < _characterSheetTypeIds.length; j++) { characterSheetNFTContract.mintType(to[i], _characterSheetTypeIds[j], _characterSheetAmounts[j]); } if (season1Posters > 0 ) { posterNFTContract.mintType(to[i], 0, season1Posters); } } for (uint16 i; i < _characterSheetTypeIds.length; i++) { reservedCharacterSheets[_characterSheetTypeIds[i]] -= uint16(_characterSheetAmounts[i] * to.length); } reservedSeason1Posters -= uint16(season1Posters * to.length); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"_initialBaseURI","type":"string"},{"internalType":"address","name":"_openSeaProxyRegistryAddress","type":"address"},{"internalType":"address[]","name":"_minters","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllCharacterSheetsOfTypeMinted","type":"error"},{"inputs":[],"name":"AllOwnersHaveBeenSet","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BurnCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"CharacterSheetTypeQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"InvalidPurchaseCharacterSheetTypeId","type":"error"},{"inputs":[],"name":"InvalidUpdateCharacterSheetLengthsDontMatch","type":"error"},{"inputs":[],"name":"InvalidUpdateCharacterSheetTypeId","type":"error"},{"inputs":[],"name":"MintToDeadAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoCharacterSheetMintAmountProvided","type":"error"},{"inputs":[],"name":"NoTokensMintedYet","type":"error"},{"inputs":[],"name":"OnlyMintersCanMintCharacterSheets","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"QuantityMustBeNonZero","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToDeadAddress","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"TransferBatch","type":"event"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"maxCharacterSheets","type":"uint16"}],"name":"addCharacterSheet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"characterSheetRarity","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"characterSheetTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"characterSheetTypes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"maxCharacterSheets","type":"uint16"},{"internalType":"uint16","name":"minted","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"characterSheetTypeId","type":"uint16"}],"name":"characterSheetsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"uint16","name":"characterSheetTypeId","type":"uint16"},{"internalType":"uint16","name":"amount","type":"uint16"}],"internalType":"struct ApeSquadCharacterSheetNFT.CharacterSheetPurchase[]","name":"characterSheetPurchases","type":"tuple[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"characterSheetTypeId","type":"uint16"},{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"mintType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"openSeaProxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"owner","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":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setMinters","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":"tokenId","type":"uint256"}],"name":"tokenCharacterSheetType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"characterSheetTypeIds","type":"uint16[]"},{"internalType":"string[]","name":"names","type":"string[]"}],"name":"updateCharacterSheetNames","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"characterSheetTypeIds","type":"uint16[]"},{"internalType":"uint16[]","name":"maxCharacterSheets","type":"uint16[]"}],"name":"updateMaxCharacterSheets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"updateOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"rarity","type":"uint8"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"updateRarities","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001805560016008553480156200001a57600080fd5b50604051620036e9380380620036e98339810160408190526200003d9162000484565b84846200004a33620001ec565b81516200005f906002906020850190620002e3565b50805162000075906003906020840190620002e3565b505083516200008d91506009906020860190620002e3565b50600a80546001600160a01b0319166001600160a01b03841617905560005b815181101562000118576001600b6000848481518110620000d157620000d1620005c4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806200010f81620005da565b915050620000ac565b50604080518082019091526004815263082d8caf60e31b6020820152620001419060fa6200023c565b604080518082019091526004815263426f726760e01b6020820152620001699060fa6200023c565b604080518082019091526003815262088c2f60eb1b6020820152620001909060fa6200023c565b6040805180820190915260058152644b616e6f6160d81b6020820152620001b99060fa6200023c565b60408051808201909152600481526325b0bd3d60e11b6020820152620001e19060fa6200023c565b505050505062000641565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70192620002ab928492910190620002e3565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b828054620002f19062000604565b90600052602060002090601f01602090048101928262000315576000855562000360565b82601f106200033057805160ff191683800117855562000360565b8280016001018555821562000360579182015b828111156200036057825182559160200191906001019062000343565b506200036e92915062000372565b5090565b5b808211156200036e576000815560010162000373565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003ca57620003ca62000389565b604052919050565b600082601f830112620003e457600080fd5b81516001600160401b0381111562000400576200040062000389565b602062000416601f8301601f191682016200039f565b82815285828487010111156200042b57600080fd5b60005b838110156200044b5785810183015182820184015282016200042e565b838111156200045d5760008385840101525b5095945050505050565b80516001600160a01b03811681146200047f57600080fd5b919050565b600080600080600060a086880312156200049d57600080fd5b85516001600160401b0380821115620004b557600080fd5b620004c389838a01620003d2565b9650602091508188015181811115620004db57600080fd5b620004e98a828b01620003d2565b965050604088015181811115620004ff57600080fd5b6200050d8a828b01620003d2565b9550506200051e6060890162000467565b93506080880151818111156200053357600080fd5b8801601f81018a136200054557600080fd5b8051828111156200055a576200055a62000389565b8060051b92506200056d8484016200039f565b818152928201840192848101908c8511156200058857600080fd5b928501925b84841015620005b157620005a18462000467565b825292850192908501906200058d565b8096505050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6000600019821415620005fd57634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200061957607f821691505b602082108114156200063b57634e487b7160e01b600052602260045260246000fd5b50919050565b61309880620006516000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c80638da5cb5b1161017b578063c6b2dd9f116100d8578063dffaf2d81161008c578063f2fde38b11610071578063f2fde38b146105b9578063f46eccc4146105cc578063f7a885c9146105ef57600080fd5b8063dffaf2d814610584578063e985e9c5146105a657600080fd5b8063c87b56dd116100bd578063c87b56dd14610555578063d7224ba014610568578063df7dd9751461057157600080fd5b8063c6b2dd9f1461052f578063c83072381461054257600080fd5b8063a22cb4651161012f578063b7f47d3211610114578063b7f47d32146104f6578063b88d4fde14610509578063c5bdcb9f1461051c57600080fd5b8063a22cb465146104d0578063a818fc3b146104e357600080fd5b806395d89b411161016057806395d89b41146104a25780639a97545b146104aa5780639b9cf33b146104bd57600080fd5b80638da5cb5b1461047e5780638f5ea8da1461048f57600080fd5b806342842e0e116102295780636c0360eb116101dd57806370a08231116101c257806370a0823114610450578063715018a6146104635780638754101c1461046b57600080fd5b80636c0360eb146104135780636c49f3761461041b57600080fd5b806353d8f7801161020e57806353d8f780146103da57806355f804b3146103ed5780636352211e1461040057600080fd5b806342842e0e146103b457806342966c68146103c757600080fd5b806318160ddd116102805780632ef7c967116102655780632ef7c9671461038657806330faa0d114610399578063416b136c146103ac57600080fd5b806318160ddd1461035d57806323b872dd1461037357600080fd5b8063081812fc116102b1578063081812fc1461030a578063095ea7b31461033557806316c655271461034a57600080fd5b806301ffc9a7146102cd57806306fdde03146102f5575b600080fd5b6102e06102db36600461255a565b610602565b60405190151581526020015b60405180910390f35b6102fd610654565b6040516102ec91906125d6565b61031d6103183660046125e9565b6106e6565b6040516001600160a01b0390911681526020016102ec565b610348610343366004612617565b61072a565b005b61034861035836600461268f565b6107b8565b610365610935565b6040519081526020016102ec565b6103486103813660046126fb565b61094d565b610348610394366004612753565b610958565b6102fd6103a73660046125e9565b610ae3565b600c54610365565b6103486103c23660046126fb565b610bd4565b6103486103d53660046125e9565b610bef565b6103486103e836600461268f565b610c22565b6103486103fb366004612837565b610d7f565b61031d61040e3660046125e9565b610dde565b6102fd610e37565b61043e6104293660046125e9565b600e6020526000908152604090205460ff1681565b60405160ff90911681526020016102ec565b61036561045e366004612880565b610ec5565b610348610f0a565b610348610479366004612924565b610f5e565b6000546001600160a01b031661031d565b61034861049d366004612924565b611054565b6102fd61106f565b6103656104b8366004612986565b61107e565b6103486104cb3660046129a1565b6110fa565b6103486104de3660046129e6565b61116a565b6103486104f1366004612a1b565b611200565b600a5461031d906001600160a01b031681565b610348610517366004612ab3565b611289565b61034861052a366004612b1f565b6112bd565b61034861053d3660046125e9565b6114e1565b610348610550366004612ba7565b611532565b6102fd6105633660046125e9565b6115eb565b61036560085481565b61034861057f366004612bf2565b611675565b6105976105923660046125e9565b6117c8565b6040516102ec93929190612c4d565b6102e06105b4366004612c7b565b611892565b6103486105c7366004612880565b611953565b6102e06105da366004612880565b600b6020526000908152604090205460ff1681565b6103486105fd366004612cb4565b611a20565b60006001600160e01b031982166380ac58cd60e01b148061063357506001600160e01b03198216635b5e139f60e01b145b8061064e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461066390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90612d31565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f182611afa565b61070e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061073582610dde565b9050806001600160a01b0316836001600160a01b0316141561076a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061078a57506107888133611892565b155b156107a8576040516367d9dca160e11b815260040160405180910390fd5b6107b3838383611b36565b505050565b6000546001600160a01b031633146108055760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064015b60405180910390fd5b82811461082557604051638bbbd08360e01b815260040160405180910390fd5b60005b61ffff811684111561092e57600c54858561ffff841681811061084d5761084d612d6c565b90506020020160208101906108629190612986565b61ffff161061088457604051633cf397bd60e21b815260040160405180910390fd5b82828261ffff1681811061089a5761089a612d6c565b90506020020160208101906108af9190612986565b600c86868461ffff168181106108c7576108c7612d6c565b90506020020160208101906108dc9190612986565b61ffff16815481106108f0576108f0612d6c565b906000526020600020906002020160010160006101000a81548161ffff021916908361ffff160217905550808061092690612d98565b915050610828565b5050505050565b600061094261dead610ec5565b600180540303905090565b6107b3838383611b92565b336000908152600b602052604090205460ff1661098857604051631936ec9960e31b815260040160405180910390fd5b61ffff81166109aa576040516332e516b960e01b815260040160405180910390fd5b600154600c5461ffff8416106109d3576040516355f0e58160e11b815260040160405180910390fd5b6109dc8361107e565b8261ffff161115610a0057604051631879a53760e01b815260040160405180910390fd5b81600c8461ffff1681548110610a1857610a18612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff16610a459190612dba565b92506101000a81548161ffff021916908361ffff16021790555060005b8261ffff168161ffff161015610abe5783600d600084610a8181612de0565b9550815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610ab690612d98565b915050610a62565b50610add848361ffff1660405180602001604052806000815250611d64565b50505050565b6060610aee82611afa565b610b0b57604051631dea22b760e11b815260040160405180910390fd5b6000828152600d6020526040902054600c8054909161ffff16908110610b3357610b33612d6c565b90600052602060002090600202016000018054610b4f90612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7b90612d31565b8015610bc85780601f10610b9d57610100808354040283529160200191610bc8565b820191906000526020600020905b815481529060010190602001808311610bab57829003601f168201915b50505050509050919050565b6107b383838360405180602001604052806000815250611289565b610bf93382611d71565b610c165760405163871b97e160e01b815260040160405180910390fd5b610c1f81611dc8565b50565b6000546001600160a01b03163314610c6a5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b828114610c8a57604051638bbbd08360e01b815260040160405180910390fd5b60005b61ffff811684111561092e57600c54858561ffff8416818110610cb257610cb2612d6c565b9050602002016020810190610cc79190612986565b61ffff1610610ce957604051633cf397bd60e21b815260040160405180910390fd5b82828261ffff16818110610cff57610cff612d6c565b9050602002810190610d119190612dfb565b600c87878561ffff16818110610d2957610d29612d6c565b9050602002016020810190610d3e9190612986565b61ffff1681548110610d5257610d52612d6c565b60009182526020909120610d6c9360029092020191612437565b5080610d7781612d98565b915050610c8d565b6000546001600160a01b03163314610dc75760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b8051610dda9060099060208401906124bb565b5050565b6000610de982611afa565b610e0657604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610e2e5750919050565b60001901610e08565b60098054610e4490612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7090612d31565b8015610ebd5780601f10610e9257610100808354040283529160200191610ebd565b820191906000526020600020905b815481529060010190602001808311610ea057829003601f168201915b505050505081565b60006001600160a01b038216610eee576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610f525760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b610f5c6000611ecc565b565b60005b81518161ffff161015610ff357610f9a335b838361ffff1681518110610f8957610f89612d6c565b602002602001015161ffff16611d71565b610fb757604051632ce44b5f60e11b815260040160405180910390fd5b610fe38484848461ffff1681518110610fd257610fd2612d6c565b602002602001015161ffff1661094d565b610fec81612d98565b9050610f61565b50816001600160a01b0316836001600160a01b031661100f3390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d204846040516110479190612e42565b60405180910390a4505050565b6107b383838360405180602001604052806000815250611a20565b60606003805461066390612d31565b6000600c8261ffff168154811061109757611097612d6c565b906000526020600020906002020160010160029054906101000a900461ffff16600c8361ffff16815481106110ce576110ce612d6c565b60009182526020909120600160029092020101546110f0919061ffff16612e8a565b61ffff1692915050565b60005b81518161ffff161015610dda5761111333610f73565b6111305760405163871b97e160e01b815260040160405180910390fd5b61115a828261ffff168151811061114957611149612d6c565b602002602001015161ffff16611dc8565b61116381612d98565b90506110fd565b6001600160a01b0382163314156111945760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146112485760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b6107b383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250611f1c915050565b611294848484611b92565b6112a084848484611fc1565b610add576040516368d2bf6b60e11b815260040160405180910390fd5b336000908152600b602052604090205460ff166112ed57604051631936ec9960e31b815260040160405180910390fd5b600154600090815b61ffff81168411156114a857600085858361ffff1681811061131957611319612d6c565b90506040020180360381019061132f9190612ead565b600c54815191925061ffff9091161061135b576040516355f0e58160e11b815260040160405180910390fd5b61138a86868461ffff1681811061137457611374612d6c565b6104b89260206040909202019081019150612986565b816020015161ffff1611156113b257604051631879a53760e01b815260040160405180910390fd5b8060200151600c826000015161ffff16815481106113d2576113d2612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff166113ff9190612dba565b92506101000a81548161ffff021916908361ffff160217905550806020015161ffff168461142d9190612f08565b935060005b816020015161ffff168161ffff161015611493578151600d60008661145681612de0565b9750815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808061148b90612d98565b915050611432565b505080806114a090612d98565b9150506112f5565b50816114c7576040516332e516b960e01b815260040160405180910390fd5b61092e858360405180602001604052806000815250611d64565b6000546001600160a01b031633146115295760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b610c1f816120c0565b6000546001600160a01b0316331461157a5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b60005b82811015610add5781600b600086868581811061159c5761159c612d6c565b90506020020160208101906115b19190612880565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806115e381612de0565b91505061157d565b60606115f682611afa565b61161357604051630a14c4b560e41b815260040160405180910390fd5b60006009805461162290612d31565b90501161163e576040518060200160405280600081525061064e565b6116466121da565b61164f836121e9565b604051602001611660929190612f20565b60405160208183030381529060405292915050565b6000546001600160a01b031633146116bd5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b60ff83166117405760005b81811015610add576001548383838181106116e5576116e5612d6c565b90506020020135106116f65761172e565b600e600084848481811061170c5761170c612d6c565b60209081029290920135835250810191909152604001600020805460ff191690555b8061173881612de0565b9150506116c8565b60005b81811015610add5760015483838381811061176057611760612d6c565b9050602002013510611771576117b6565b83600e600085858581811061178857611788612d6c565b90506020020135815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b806117c081612de0565b915050611743565b600c81815481106117d857600080fd5b90600052602060002090600202016000915090508060000180546117fb90612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461182790612d31565b80156118745780601f1061184957610100808354040283529160200191611874565b820191906000526020600020905b81548152906001019060200180831161185757829003601f168201915b5050506001909301549192505061ffff808216916201000090041683565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190612f77565b6001600160a01b0316141561192157600191505061064e565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b0316331461199b5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b6001600160a01b038116611a175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107fc565b610c1f81611ecc565b60005b8251811015611a9857611a4233848381518110610f8957610f89612d6c565b611a5f57604051632ce44b5f60e11b815260040160405180910390fd5b611a888585858481518110611a7657611a76612d6c565b602002602001015161ffff1685611289565b611a9181612de0565b9050611a23565b50826001600160a01b0316846001600160a01b0316611ab43390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20485604051611aec9190612e42565b60405180910390a450505050565b60008082118015611b0c575060015482105b801561064e57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9d82610dde565b90506000336001600160a01b0383161480611bbd5750611bbd8233611892565b80611bd8575033611bcd846106e6565b6001600160a01b0316145b905080611bf857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b031614611c295760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c5057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead1415611c7c57604051630278d60f60e11b815260040160405180910390fd5b611c8860008484611b36565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b0319169091179055908601808352912054909116611d1d57600154811015611d1d57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461092e565b6107b383838360016122ff565b600080611d7d83610dde565b9050806001600160a01b0316846001600160a01b03161480611db85750836001600160a01b0316611dad846106e6565b6001600160a01b0316145b8061194b575061194b8185611892565b6000611dd382610dde565b9050611de160008383611b36565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead179055908501808352912054909116611e8f57600154811015611e8f57600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70192611f899284929101906124bb565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b60006001600160a01b0384163b156120b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612005903390899088908890600401612f94565b6020604051808303816000875af1925050508015612040575060408051601f3d908101601f1916820190925261203d91810190612fd0565b60015b61209b573d80801561206e576040519150601f19603f3d011682016040523d82523d6000602084013e612073565b606091505b508051612093576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061194b565b506001949350505050565b806120de576040516356be441560e01b815260040160405180910390fd5b600154600114156121025760405163c0367cab60e01b815260040160405180910390fd5b600854600154811061212757604051630a596e2160e21b815260040160405180910390fd5b60015482820160001981019110156121425750600154600019015b815b8181116121cf576000818152600460205260409020546001600160a01b031615801561218957506000818152600460205260409020546001600160a01b031661dead14155b156121c757600061219982610dde565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101612144565b506001016008555050565b60606009805461066390612d31565b60608161220d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612237578061222181612de0565b91506122309050600a83613003565b9150612211565b60008167ffffffffffffffff81111561225257612252612798565b6040519080825280601f01601f19166020018201604052801561227c576020820181803683370190505b5090505b841561194b57612291600183613017565b915061229e600a8661302e565b6122a9906030612f08565b60f81b8183815181106122be576122be612d6c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506122f8600a86613003565b9450612280565b6001546001600160a01b03851661232857604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead141561235457604051631617320f60e01b815260040160405180910390fd5b836123725760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b8581101561242e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612422576124056000888488611fc1565b612422576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016123b2565b5060015561092e565b82805461244390612d31565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e5782800160ff198235161785556124ab565b828001600101855582156124ab579182015b828111156124ab578235825591602001919060010190612490565b506124b792915061252f565b5090565b8280546124c790612d31565b90600052602060002090601f0160209004810192826124e957600085556124ab565b82601f1061250257805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612514565b5b808211156124b75760008155600101612530565b6001600160e01b031981168114610c1f57600080fd5b60006020828403121561256c57600080fd5b813561257781612544565b9392505050565b60005b83811015612599578181015183820152602001612581565b83811115610add5750506000910152565b600081518084526125c281602086016020860161257e565b601f01601f19169290920160200192915050565b60208152600061257760208301846125aa565b6000602082840312156125fb57600080fd5b5035919050565b6001600160a01b0381168114610c1f57600080fd5b6000806040838503121561262a57600080fd5b823561263581612602565b946020939093013593505050565b60008083601f84011261265557600080fd5b50813567ffffffffffffffff81111561266d57600080fd5b6020830191508360208260051b850101111561268857600080fd5b9250929050565b600080600080604085870312156126a557600080fd5b843567ffffffffffffffff808211156126bd57600080fd5b6126c988838901612643565b909650945060208701359150808211156126e257600080fd5b506126ef87828801612643565b95989497509550505050565b60008060006060848603121561271057600080fd5b833561271b81612602565b9250602084013561272b81612602565b929592945050506040919091013590565b803561ffff8116811461274e57600080fd5b919050565b60008060006060848603121561276857600080fd5b833561277381612602565b92506127816020850161273c565b915061278f6040850161273c565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127d7576127d7612798565b604052919050565b600067ffffffffffffffff8311156127f9576127f9612798565b61280c601f8401601f19166020016127ae565b905082815283838301111561282057600080fd5b828260208301376000602084830101529392505050565b60006020828403121561284957600080fd5b813567ffffffffffffffff81111561286057600080fd5b8201601f8101841361287157600080fd5b61194b848235602084016127df565b60006020828403121561289257600080fd5b813561257781612602565b600082601f8301126128ae57600080fd5b8135602067ffffffffffffffff8211156128ca576128ca612798565b8160051b6128d98282016127ae565b92835284810182019282810190878511156128f357600080fd5b83870192505b848310156129195761290a8361273c565b825291830191908301906128f9565b979650505050505050565b60008060006060848603121561293957600080fd5b833561294481612602565b9250602084013561295481612602565b9150604084013567ffffffffffffffff81111561297057600080fd5b61297c8682870161289d565b9150509250925092565b60006020828403121561299857600080fd5b6125778261273c565b6000602082840312156129b357600080fd5b813567ffffffffffffffff8111156129ca57600080fd5b61194b8482850161289d565b8035801515811461274e57600080fd5b600080604083850312156129f957600080fd5b8235612a0481612602565b9150612a12602084016129d6565b90509250929050565b600080600060408486031215612a3057600080fd5b833567ffffffffffffffff80821115612a4857600080fd5b818601915086601f830112612a5c57600080fd5b813581811115612a6b57600080fd5b876020828501011115612a7d57600080fd5b60209283019550935061278f918601905061273c565b600082601f830112612aa457600080fd5b612577838335602085016127df565b60008060008060808587031215612ac957600080fd5b8435612ad481612602565b93506020850135612ae481612602565b925060408501359150606085013567ffffffffffffffff811115612b0757600080fd5b612b1387828801612a93565b91505092959194509250565b600080600060408486031215612b3457600080fd5b8335612b3f81612602565b9250602084013567ffffffffffffffff80821115612b5c57600080fd5b818601915086601f830112612b7057600080fd5b813581811115612b7f57600080fd5b8760208260061b8501011115612b9457600080fd5b6020830194508093505050509250925092565b600080600060408486031215612bbc57600080fd5b833567ffffffffffffffff811115612bd357600080fd5b612bdf86828701612643565b909450925061278f9050602085016129d6565b600080600060408486031215612c0757600080fd5b833560ff81168114612c1857600080fd5b9250602084013567ffffffffffffffff811115612c3457600080fd5b612c4086828701612643565b9497909650939450505050565b606081526000612c6060608301866125aa565b61ffff94851660208401529290931660409091015292915050565b60008060408385031215612c8e57600080fd5b8235612c9981612602565b91506020830135612ca981612602565b809150509250929050565b60008060008060808587031215612cca57600080fd5b8435612cd581612602565b93506020850135612ce581612602565b9250604085013567ffffffffffffffff80821115612d0257600080fd5b612d0e8883890161289d565b93506060870135915080821115612d2457600080fd5b50612b1387828801612a93565b600181811c90821680612d4557607f821691505b60208210811415612d6657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff80831681811415612db057612db0612d82565b6001019392505050565b600061ffff808316818516808303821115612dd757612dd7612d82565b01949350505050565b6000600019821415612df457612df4612d82565b5060010190565b6000808335601e19843603018112612e1257600080fd5b83018035915067ffffffffffffffff821115612e2d57600080fd5b60200191503681900382131561268857600080fd5b6020808252825182820181905260009190848201906040850190845b81811015612e7e57835161ffff1683529284019291840191600101612e5e565b50909695505050505050565b600061ffff83811690831681811015612ea557612ea5612d82565b039392505050565b600060408284031215612ebf57600080fd5b6040516040810181811067ffffffffffffffff82111715612ee257612ee2612798565b604052612eee8361273c565b8152612efc6020840161273c565b60208201529392505050565b60008219821115612f1b57612f1b612d82565b500190565b60008351612f3281846020880161257e565b835190830190612f4681836020880161257e565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600060208284031215612f8957600080fd5b815161257781612602565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612fc660808301846125aa565b9695505050505050565b600060208284031215612fe257600080fd5b815161257781612544565b634e487b7160e01b600052601260045260246000fd5b60008261301257613012612fed565b500490565b60008282101561302957613029612d82565b500390565b60008261303d5761303d612fed565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220f3bfb2ace60a15c0a4c4221cd4f34a7c24af6ac32e8f458c4c823bafac71be8064736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000008417065537175616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044150455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004868747470733a2f2f717478613465377a786b2e657865637574652d6170692e75732d656173742d312e616d617a6f6e6177732e636f6d2f6368617261637465722d7368656574732f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006ab6b9c8ed19a464722198e8f4ef113e10c298b8
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102c85760003560e01c80638da5cb5b1161017b578063c6b2dd9f116100d8578063dffaf2d81161008c578063f2fde38b11610071578063f2fde38b146105b9578063f46eccc4146105cc578063f7a885c9146105ef57600080fd5b8063dffaf2d814610584578063e985e9c5146105a657600080fd5b8063c87b56dd116100bd578063c87b56dd14610555578063d7224ba014610568578063df7dd9751461057157600080fd5b8063c6b2dd9f1461052f578063c83072381461054257600080fd5b8063a22cb4651161012f578063b7f47d3211610114578063b7f47d32146104f6578063b88d4fde14610509578063c5bdcb9f1461051c57600080fd5b8063a22cb465146104d0578063a818fc3b146104e357600080fd5b806395d89b411161016057806395d89b41146104a25780639a97545b146104aa5780639b9cf33b146104bd57600080fd5b80638da5cb5b1461047e5780638f5ea8da1461048f57600080fd5b806342842e0e116102295780636c0360eb116101dd57806370a08231116101c257806370a0823114610450578063715018a6146104635780638754101c1461046b57600080fd5b80636c0360eb146104135780636c49f3761461041b57600080fd5b806353d8f7801161020e57806353d8f780146103da57806355f804b3146103ed5780636352211e1461040057600080fd5b806342842e0e146103b457806342966c68146103c757600080fd5b806318160ddd116102805780632ef7c967116102655780632ef7c9671461038657806330faa0d114610399578063416b136c146103ac57600080fd5b806318160ddd1461035d57806323b872dd1461037357600080fd5b8063081812fc116102b1578063081812fc1461030a578063095ea7b31461033557806316c655271461034a57600080fd5b806301ffc9a7146102cd57806306fdde03146102f5575b600080fd5b6102e06102db36600461255a565b610602565b60405190151581526020015b60405180910390f35b6102fd610654565b6040516102ec91906125d6565b61031d6103183660046125e9565b6106e6565b6040516001600160a01b0390911681526020016102ec565b610348610343366004612617565b61072a565b005b61034861035836600461268f565b6107b8565b610365610935565b6040519081526020016102ec565b6103486103813660046126fb565b61094d565b610348610394366004612753565b610958565b6102fd6103a73660046125e9565b610ae3565b600c54610365565b6103486103c23660046126fb565b610bd4565b6103486103d53660046125e9565b610bef565b6103486103e836600461268f565b610c22565b6103486103fb366004612837565b610d7f565b61031d61040e3660046125e9565b610dde565b6102fd610e37565b61043e6104293660046125e9565b600e6020526000908152604090205460ff1681565b60405160ff90911681526020016102ec565b61036561045e366004612880565b610ec5565b610348610f0a565b610348610479366004612924565b610f5e565b6000546001600160a01b031661031d565b61034861049d366004612924565b611054565b6102fd61106f565b6103656104b8366004612986565b61107e565b6103486104cb3660046129a1565b6110fa565b6103486104de3660046129e6565b61116a565b6103486104f1366004612a1b565b611200565b600a5461031d906001600160a01b031681565b610348610517366004612ab3565b611289565b61034861052a366004612b1f565b6112bd565b61034861053d3660046125e9565b6114e1565b610348610550366004612ba7565b611532565b6102fd6105633660046125e9565b6115eb565b61036560085481565b61034861057f366004612bf2565b611675565b6105976105923660046125e9565b6117c8565b6040516102ec93929190612c4d565b6102e06105b4366004612c7b565b611892565b6103486105c7366004612880565b611953565b6102e06105da366004612880565b600b6020526000908152604090205460ff1681565b6103486105fd366004612cb4565b611a20565b60006001600160e01b031982166380ac58cd60e01b148061063357506001600160e01b03198216635b5e139f60e01b145b8061064e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461066390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90612d31565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f182611afa565b61070e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061073582610dde565b9050806001600160a01b0316836001600160a01b0316141561076a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061078a57506107888133611892565b155b156107a8576040516367d9dca160e11b815260040160405180910390fd5b6107b3838383611b36565b505050565b6000546001600160a01b031633146108055760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064015b60405180910390fd5b82811461082557604051638bbbd08360e01b815260040160405180910390fd5b60005b61ffff811684111561092e57600c54858561ffff841681811061084d5761084d612d6c565b90506020020160208101906108629190612986565b61ffff161061088457604051633cf397bd60e21b815260040160405180910390fd5b82828261ffff1681811061089a5761089a612d6c565b90506020020160208101906108af9190612986565b600c86868461ffff168181106108c7576108c7612d6c565b90506020020160208101906108dc9190612986565b61ffff16815481106108f0576108f0612d6c565b906000526020600020906002020160010160006101000a81548161ffff021916908361ffff160217905550808061092690612d98565b915050610828565b5050505050565b600061094261dead610ec5565b600180540303905090565b6107b3838383611b92565b336000908152600b602052604090205460ff1661098857604051631936ec9960e31b815260040160405180910390fd5b61ffff81166109aa576040516332e516b960e01b815260040160405180910390fd5b600154600c5461ffff8416106109d3576040516355f0e58160e11b815260040160405180910390fd5b6109dc8361107e565b8261ffff161115610a0057604051631879a53760e01b815260040160405180910390fd5b81600c8461ffff1681548110610a1857610a18612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff16610a459190612dba565b92506101000a81548161ffff021916908361ffff16021790555060005b8261ffff168161ffff161015610abe5783600d600084610a8181612de0565b9550815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610ab690612d98565b915050610a62565b50610add848361ffff1660405180602001604052806000815250611d64565b50505050565b6060610aee82611afa565b610b0b57604051631dea22b760e11b815260040160405180910390fd5b6000828152600d6020526040902054600c8054909161ffff16908110610b3357610b33612d6c565b90600052602060002090600202016000018054610b4f90612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7b90612d31565b8015610bc85780601f10610b9d57610100808354040283529160200191610bc8565b820191906000526020600020905b815481529060010190602001808311610bab57829003601f168201915b50505050509050919050565b6107b383838360405180602001604052806000815250611289565b610bf93382611d71565b610c165760405163871b97e160e01b815260040160405180910390fd5b610c1f81611dc8565b50565b6000546001600160a01b03163314610c6a5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b828114610c8a57604051638bbbd08360e01b815260040160405180910390fd5b60005b61ffff811684111561092e57600c54858561ffff8416818110610cb257610cb2612d6c565b9050602002016020810190610cc79190612986565b61ffff1610610ce957604051633cf397bd60e21b815260040160405180910390fd5b82828261ffff16818110610cff57610cff612d6c565b9050602002810190610d119190612dfb565b600c87878561ffff16818110610d2957610d29612d6c565b9050602002016020810190610d3e9190612986565b61ffff1681548110610d5257610d52612d6c565b60009182526020909120610d6c9360029092020191612437565b5080610d7781612d98565b915050610c8d565b6000546001600160a01b03163314610dc75760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b8051610dda9060099060208401906124bb565b5050565b6000610de982611afa565b610e0657604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610e2e5750919050565b60001901610e08565b60098054610e4490612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7090612d31565b8015610ebd5780601f10610e9257610100808354040283529160200191610ebd565b820191906000526020600020905b815481529060010190602001808311610ea057829003601f168201915b505050505081565b60006001600160a01b038216610eee576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610f525760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b610f5c6000611ecc565b565b60005b81518161ffff161015610ff357610f9a335b838361ffff1681518110610f8957610f89612d6c565b602002602001015161ffff16611d71565b610fb757604051632ce44b5f60e11b815260040160405180910390fd5b610fe38484848461ffff1681518110610fd257610fd2612d6c565b602002602001015161ffff1661094d565b610fec81612d98565b9050610f61565b50816001600160a01b0316836001600160a01b031661100f3390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d204846040516110479190612e42565b60405180910390a4505050565b6107b383838360405180602001604052806000815250611a20565b60606003805461066390612d31565b6000600c8261ffff168154811061109757611097612d6c565b906000526020600020906002020160010160029054906101000a900461ffff16600c8361ffff16815481106110ce576110ce612d6c565b60009182526020909120600160029092020101546110f0919061ffff16612e8a565b61ffff1692915050565b60005b81518161ffff161015610dda5761111333610f73565b6111305760405163871b97e160e01b815260040160405180910390fd5b61115a828261ffff168151811061114957611149612d6c565b602002602001015161ffff16611dc8565b61116381612d98565b90506110fd565b6001600160a01b0382163314156111945760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146112485760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b6107b383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250611f1c915050565b611294848484611b92565b6112a084848484611fc1565b610add576040516368d2bf6b60e11b815260040160405180910390fd5b336000908152600b602052604090205460ff166112ed57604051631936ec9960e31b815260040160405180910390fd5b600154600090815b61ffff81168411156114a857600085858361ffff1681811061131957611319612d6c565b90506040020180360381019061132f9190612ead565b600c54815191925061ffff9091161061135b576040516355f0e58160e11b815260040160405180910390fd5b61138a86868461ffff1681811061137457611374612d6c565b6104b89260206040909202019081019150612986565b816020015161ffff1611156113b257604051631879a53760e01b815260040160405180910390fd5b8060200151600c826000015161ffff16815481106113d2576113d2612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff166113ff9190612dba565b92506101000a81548161ffff021916908361ffff160217905550806020015161ffff168461142d9190612f08565b935060005b816020015161ffff168161ffff161015611493578151600d60008661145681612de0565b9750815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808061148b90612d98565b915050611432565b505080806114a090612d98565b9150506112f5565b50816114c7576040516332e516b960e01b815260040160405180910390fd5b61092e858360405180602001604052806000815250611d64565b6000546001600160a01b031633146115295760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b610c1f816120c0565b6000546001600160a01b0316331461157a5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b60005b82811015610add5781600b600086868581811061159c5761159c612d6c565b90506020020160208101906115b19190612880565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806115e381612de0565b91505061157d565b60606115f682611afa565b61161357604051630a14c4b560e41b815260040160405180910390fd5b60006009805461162290612d31565b90501161163e576040518060200160405280600081525061064e565b6116466121da565b61164f836121e9565b604051602001611660929190612f20565b60405160208183030381529060405292915050565b6000546001600160a01b031633146116bd5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b60ff83166117405760005b81811015610add576001548383838181106116e5576116e5612d6c565b90506020020135106116f65761172e565b600e600084848481811061170c5761170c612d6c565b60209081029290920135835250810191909152604001600020805460ff191690555b8061173881612de0565b9150506116c8565b60005b81811015610add5760015483838381811061176057611760612d6c565b9050602002013510611771576117b6565b83600e600085858581811061178857611788612d6c565b90506020020135815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b806117c081612de0565b915050611743565b600c81815481106117d857600080fd5b90600052602060002090600202016000915090508060000180546117fb90612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461182790612d31565b80156118745780601f1061184957610100808354040283529160200191611874565b820191906000526020600020905b81548152906001019060200180831161185757829003601f168201915b5050506001909301549192505061ffff808216916201000090041683565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190612f77565b6001600160a01b0316141561192157600191505061064e565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b0316331461199b5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b6001600160a01b038116611a175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107fc565b610c1f81611ecc565b60005b8251811015611a9857611a4233848381518110610f8957610f89612d6c565b611a5f57604051632ce44b5f60e11b815260040160405180910390fd5b611a888585858481518110611a7657611a76612d6c565b602002602001015161ffff1685611289565b611a9181612de0565b9050611a23565b50826001600160a01b0316846001600160a01b0316611ab43390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20485604051611aec9190612e42565b60405180910390a450505050565b60008082118015611b0c575060015482105b801561064e57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9d82610dde565b90506000336001600160a01b0383161480611bbd5750611bbd8233611892565b80611bd8575033611bcd846106e6565b6001600160a01b0316145b905080611bf857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b031614611c295760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c5057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead1415611c7c57604051630278d60f60e11b815260040160405180910390fd5b611c8860008484611b36565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b0319169091179055908601808352912054909116611d1d57600154811015611d1d57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461092e565b6107b383838360016122ff565b600080611d7d83610dde565b9050806001600160a01b0316846001600160a01b03161480611db85750836001600160a01b0316611dad846106e6565b6001600160a01b0316145b8061194b575061194b8185611892565b6000611dd382610dde565b9050611de160008383611b36565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead179055908501808352912054909116611e8f57600154811015611e8f57600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70192611f899284929101906124bb565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b60006001600160a01b0384163b156120b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612005903390899088908890600401612f94565b6020604051808303816000875af1925050508015612040575060408051601f3d908101601f1916820190925261203d91810190612fd0565b60015b61209b573d80801561206e576040519150601f19603f3d011682016040523d82523d6000602084013e612073565b606091505b508051612093576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061194b565b506001949350505050565b806120de576040516356be441560e01b815260040160405180910390fd5b600154600114156121025760405163c0367cab60e01b815260040160405180910390fd5b600854600154811061212757604051630a596e2160e21b815260040160405180910390fd5b60015482820160001981019110156121425750600154600019015b815b8181116121cf576000818152600460205260409020546001600160a01b031615801561218957506000818152600460205260409020546001600160a01b031661dead14155b156121c757600061219982610dde565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101612144565b506001016008555050565b60606009805461066390612d31565b60608161220d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612237578061222181612de0565b91506122309050600a83613003565b9150612211565b60008167ffffffffffffffff81111561225257612252612798565b6040519080825280601f01601f19166020018201604052801561227c576020820181803683370190505b5090505b841561194b57612291600183613017565b915061229e600a8661302e565b6122a9906030612f08565b60f81b8183815181106122be576122be612d6c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506122f8600a86613003565b9450612280565b6001546001600160a01b03851661232857604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead141561235457604051631617320f60e01b815260040160405180910390fd5b836123725760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b8581101561242e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612422576124056000888488611fc1565b612422576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016123b2565b5060015561092e565b82805461244390612d31565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e5782800160ff198235161785556124ab565b828001600101855582156124ab579182015b828111156124ab578235825591602001919060010190612490565b506124b792915061252f565b5090565b8280546124c790612d31565b90600052602060002090601f0160209004810192826124e957600085556124ab565b82601f1061250257805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612514565b5b808211156124b75760008155600101612530565b6001600160e01b031981168114610c1f57600080fd5b60006020828403121561256c57600080fd5b813561257781612544565b9392505050565b60005b83811015612599578181015183820152602001612581565b83811115610add5750506000910152565b600081518084526125c281602086016020860161257e565b601f01601f19169290920160200192915050565b60208152600061257760208301846125aa565b6000602082840312156125fb57600080fd5b5035919050565b6001600160a01b0381168114610c1f57600080fd5b6000806040838503121561262a57600080fd5b823561263581612602565b946020939093013593505050565b60008083601f84011261265557600080fd5b50813567ffffffffffffffff81111561266d57600080fd5b6020830191508360208260051b850101111561268857600080fd5b9250929050565b600080600080604085870312156126a557600080fd5b843567ffffffffffffffff808211156126bd57600080fd5b6126c988838901612643565b909650945060208701359150808211156126e257600080fd5b506126ef87828801612643565b95989497509550505050565b60008060006060848603121561271057600080fd5b833561271b81612602565b9250602084013561272b81612602565b929592945050506040919091013590565b803561ffff8116811461274e57600080fd5b919050565b60008060006060848603121561276857600080fd5b833561277381612602565b92506127816020850161273c565b915061278f6040850161273c565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127d7576127d7612798565b604052919050565b600067ffffffffffffffff8311156127f9576127f9612798565b61280c601f8401601f19166020016127ae565b905082815283838301111561282057600080fd5b828260208301376000602084830101529392505050565b60006020828403121561284957600080fd5b813567ffffffffffffffff81111561286057600080fd5b8201601f8101841361287157600080fd5b61194b848235602084016127df565b60006020828403121561289257600080fd5b813561257781612602565b600082601f8301126128ae57600080fd5b8135602067ffffffffffffffff8211156128ca576128ca612798565b8160051b6128d98282016127ae565b92835284810182019282810190878511156128f357600080fd5b83870192505b848310156129195761290a8361273c565b825291830191908301906128f9565b979650505050505050565b60008060006060848603121561293957600080fd5b833561294481612602565b9250602084013561295481612602565b9150604084013567ffffffffffffffff81111561297057600080fd5b61297c8682870161289d565b9150509250925092565b60006020828403121561299857600080fd5b6125778261273c565b6000602082840312156129b357600080fd5b813567ffffffffffffffff8111156129ca57600080fd5b61194b8482850161289d565b8035801515811461274e57600080fd5b600080604083850312156129f957600080fd5b8235612a0481612602565b9150612a12602084016129d6565b90509250929050565b600080600060408486031215612a3057600080fd5b833567ffffffffffffffff80821115612a4857600080fd5b818601915086601f830112612a5c57600080fd5b813581811115612a6b57600080fd5b876020828501011115612a7d57600080fd5b60209283019550935061278f918601905061273c565b600082601f830112612aa457600080fd5b612577838335602085016127df565b60008060008060808587031215612ac957600080fd5b8435612ad481612602565b93506020850135612ae481612602565b925060408501359150606085013567ffffffffffffffff811115612b0757600080fd5b612b1387828801612a93565b91505092959194509250565b600080600060408486031215612b3457600080fd5b8335612b3f81612602565b9250602084013567ffffffffffffffff80821115612b5c57600080fd5b818601915086601f830112612b7057600080fd5b813581811115612b7f57600080fd5b8760208260061b8501011115612b9457600080fd5b6020830194508093505050509250925092565b600080600060408486031215612bbc57600080fd5b833567ffffffffffffffff811115612bd357600080fd5b612bdf86828701612643565b909450925061278f9050602085016129d6565b600080600060408486031215612c0757600080fd5b833560ff81168114612c1857600080fd5b9250602084013567ffffffffffffffff811115612c3457600080fd5b612c4086828701612643565b9497909650939450505050565b606081526000612c6060608301866125aa565b61ffff94851660208401529290931660409091015292915050565b60008060408385031215612c8e57600080fd5b8235612c9981612602565b91506020830135612ca981612602565b809150509250929050565b60008060008060808587031215612cca57600080fd5b8435612cd581612602565b93506020850135612ce581612602565b9250604085013567ffffffffffffffff80821115612d0257600080fd5b612d0e8883890161289d565b93506060870135915080821115612d2457600080fd5b50612b1387828801612a93565b600181811c90821680612d4557607f821691505b60208210811415612d6657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff80831681811415612db057612db0612d82565b6001019392505050565b600061ffff808316818516808303821115612dd757612dd7612d82565b01949350505050565b6000600019821415612df457612df4612d82565b5060010190565b6000808335601e19843603018112612e1257600080fd5b83018035915067ffffffffffffffff821115612e2d57600080fd5b60200191503681900382131561268857600080fd5b6020808252825182820181905260009190848201906040850190845b81811015612e7e57835161ffff1683529284019291840191600101612e5e565b50909695505050505050565b600061ffff83811690831681811015612ea557612ea5612d82565b039392505050565b600060408284031215612ebf57600080fd5b6040516040810181811067ffffffffffffffff82111715612ee257612ee2612798565b604052612eee8361273c565b8152612efc6020840161273c565b60208201529392505050565b60008219821115612f1b57612f1b612d82565b500190565b60008351612f3281846020880161257e565b835190830190612f4681836020880161257e565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600060208284031215612f8957600080fd5b815161257781612602565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612fc660808301846125aa565b9695505050505050565b600060208284031215612fe257600080fd5b815161257781612544565b634e487b7160e01b600052601260045260246000fd5b60008261301257613012612fed565b500490565b60008282101561302957613029612d82565b500390565b60008261303d5761303d612fed565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220f3bfb2ace60a15c0a4c4221cd4f34a7c24af6ac32e8f458c4c823bafac71be8064736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000008417065537175616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044150455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004868747470733a2f2f717478613465377a786b2e657865637574652d6170692e75732d656173742d312e616d617a6f6e6177732e636f6d2f6368617261637465722d7368656574732f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006ab6b9c8ed19a464722198e8f4ef113e10c298b8
-----Decoded View---------------
Arg [0] : name_ (string): ApeSquad
Arg [1] : symbol_ (string): APES
Arg [2] : _initialBaseURI (string): https://qtxa4e7zxk.execute-api.us-east-1.amazonaws.com/character-sheets/
Arg [3] : _openSeaProxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [4] : _minters (address[]): 0x6AB6B9C8ed19A464722198E8f4ef113E10c298B8
-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 4170655371756164000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4150455300000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000048
Arg [10] : 68747470733a2f2f717478613465377a786b2e657865637574652d6170692e75
Arg [11] : 732d656173742d312e616d617a6f6e6177732e636f6d2f636861726163746572
Arg [12] : 2d7368656574732f000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000006ab6b9c8ed19a464722198e8f4ef113e10c298b8
Deployed Bytecode Sourcemap
44669:8716:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25389:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;25389:305:0;;;;;;;;26488:100;;;:::i;:::-;;;;;;;:::i;27965:212::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:55:1;;;1674:74;;1662:2;1647:18;27965:212:0;1528:226:1;27554:345:0;;;;;;:::i;:::-;;:::i;:::-;;52009:564;;;;;;:::i;:::-;;:::i;25028:289::-;;;:::i;:::-;;;3529:25:1;;;3517:2;3502:18;25028:289:0;3383:177:1;28838:170:0;;;;;;:::i;:::-;;:::i;49611:760::-;;;;;;:::i;:::-;;:::i;46835:261::-;;;;;;:::i;:::-;;:::i;46330:117::-;46413:19;:26;46330:117;;29079:185;;;;;;:::i;:::-;;:::i;41292:176::-;;;;;;:::i;:::-;;:::i;51425:512::-;;;;;;:::i;:::-;;:::i;50446:106::-;;;;;;:::i;:::-;;:::i;26014:407::-;;;;;;:::i;:::-;;:::i;45112:21::-;;;:::i;45577:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6825:4:1;6813:17;;;6795:36;;6783:2;6768:18;45577:53:0;6653:184:1;25758:194:0;;;;;;:::i;:::-;;:::i;2713:103::-;;;:::i;42762:427::-;;;;;;:::i;:::-;;:::i;2062:87::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;2062:87;;43274:196;;;;;;:::i;:::-;;:::i;26657:104::-;;;:::i;46520:225::-;;;;;;:::i;:::-;;:::i;41829:273::-;;;;;;:::i;:::-;;:::i;28249:287::-;;;;;;:::i;:::-;;:::i;51200:158::-;;;;;;:::i;:::-;;:::i;45180:42::-;;;;;-1:-1:-1;;;;;45180:42:0;;;29335:316;;;;;;:::i;:::-;;:::i;48455:1075::-;;;;;;:::i;:::-;;:::i;53276:106::-;;;;;;:::i;:::-;;:::i;50623:201::-;;;;;;:::i;:::-;;:::i;47985:381::-;;;;;;:::i;:::-;;:::i;39575:43::-;;;;;;52655:537;;;;;;:::i;:::-;;:::i;45312:47::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;47208:508::-;;;;;;:::i;:::-;;:::i;2971:201::-;;;;;;:::i;:::-;;:::i;45264:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43555:472;;;;;;:::i;:::-;;:::i;25389:305::-;25491:4;-1:-1:-1;;;;;;25528:40:0;;-1:-1:-1;;;25528:40:0;;:105;;-1:-1:-1;;;;;;;25585:48:0;;-1:-1:-1;;;25585:48:0;25528:105;:158;;;-1:-1:-1;;;;;;;;;;22804:40:0;;;25650:36;25508:178;25389:305;-1:-1:-1;;25389:305:0:o;26488:100::-;26542:13;26575:5;26568:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26488:100;:::o;27965:212::-;28041:7;28066:16;28074:7;28066;:16::i;:::-;28061:64;;28091:34;;-1:-1:-1;;;28091:34:0;;;;;;;;;;;28061:64;-1:-1:-1;28145:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28145:24:0;;27965:212::o;27554:345::-;27635:13;27651:16;27659:7;27651;:16::i;:::-;27635:32;;27688:5;-1:-1:-1;;;;;27682:11:0;:2;-1:-1:-1;;;;;27682:11:0;;27678:48;;;27702:24;;-1:-1:-1;;;27702:24:0;;;;;;;;;;;27678:48;860:10;-1:-1:-1;;;;;27743:21:0;;;;;;:63;;-1:-1:-1;27769:37:0;27786:5;860:10;47208:508;:::i;27769:37::-;27768:38;27743:63;27739:111;;;27815:35;;-1:-1:-1;;;27815:35:0;;;;;;;;;;;27739:111;27863:28;27872:2;27876:7;27885:5;27863:8;:28::i;:::-;27624:275;27554:345;;:::o;52009:564::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;;;;;;;;;52155:57;;::::1;52152:114;;52221:45;;-1:-1:-1::0;;;52221:45:0::1;;;;;;;;;;;52152:114;52284:8;52279:287;52294:32;::::0;::::1;::::0;-1:-1:-1;52279:287:0::1;;;52379:19;:26:::0;52351:21;;:24:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:54;;;52348:101;;52414:35;;-1:-1:-1::0;;;52414:35:0::1;;;;;;;;;;;52348:101;52533:18;;52552:1;52533:21;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52466:19;52486:21;;52508:1;52486:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52466:45;;;;;;;;;;:::i;:::-;;;;;;;;;;;:64;;;:88;;;;;;;;;;;;;;;;;;52328:3;;;;;:::i;:::-;;;;52279:287;;;;52009:564:::0;;;;:::o;25028:289::-;25080:7;25274:20;24785:42;25274:9;:20::i;:::-;25269:1;25254:12;;:16;25253:41;25246:48;;25028:289;:::o;28838:170::-;28972:28;28982:4;28988:2;28992:7;28972:9;:28::i;49611:760::-;49715:10;49707:19;;;;:7;:19;;;;;;;;49703:67;;49735:35;;-1:-1:-1;;;49735:35:0;;;;;;;;;;;49703:67;49798:11;;;49795:59;;49818:36;;-1:-1:-1;;;49818:36:0;;;;;;;;;;;49795:59;49885:12;;49935:19;:26;49911:50;;;;49908:99;;49970:37;;-1:-1:-1;;;49970:37:0;;;;;;;;;;;49908:99;50032:41;50052:20;50032:19;:41::i;:::-;50023:6;:50;;;50020:94;;;50082:32;;-1:-1:-1;;;50082:32:0;;;;;;;;;;;50020:94;50179:6;50127:19;50147:20;50127:41;;;;;;;;;;:::i;:::-;;;;;;;;;;;:48;;;:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50203:8;50198:120;50217:6;50213:10;;:1;:10;;;50198:120;;;50286:20;50245:27;:38;50273:9;;;;:::i;:::-;;;50245:38;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;50225:3;;;;;:::i;:::-;;;;50198:120;;;;50338:25;50348:2;50352:6;50338:25;;;;;;;;;;;;;;:9;:25::i;:::-;49692:679;49611:760;;;:::o;46835:261::-;46906:13;46937:16;46945:7;46937;:16::i;:::-;46932:74;;46962:44;;-1:-1:-1;;;46962:44:0;;;;;;;;;;;46932:74;47046:36;;;;:27;:36;;;;;;47026:19;:57;;:19;;47046:36;;;47026:57;;;;;;:::i;:::-;;;;;;;;;;;:62;;47019:69;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46835:261;;;:::o;29079:185::-;29217:39;29234:4;29240:2;29244:7;29217:39;;;;;;;;;;;;:16;:39::i;41292:176::-;41354:41;860:10;41387:7;41354:18;:41::i;:::-;41349:86;;41404:31;;-1:-1:-1;;;41404:31:0;;;;;;;;;;;41349:86;41446:14;41452:7;41446:5;:14::i;:::-;41292:176;:::o;51425:512::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;51559:44;;::::1;51556:101;;51612:45;;-1:-1:-1::0;;;51612:45:0::1;;;;;;;;;;;51556:101;51675:8;51670:260;51685:32;::::0;::::1;::::0;-1:-1:-1;51670:260:0::1;;;51770:19;:26:::0;51742:21;;:24:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:54;;;51739:101;;51805:35;;-1:-1:-1::0;;;51805:35:0::1;;;;;;;;;;;51739:101;51910:5;;51916:1;51910:8;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;51857:19;51877:21;;51899:1;51877:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;51857:45;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:61:::1;::::0;:45:::1;::::0;;::::1;;::::0;:61:::1;:::i;:::-;-1:-1:-1::0;51719:3:0;::::1;::::0;::::1;:::i;:::-;;;;51670:260;;50446:106:::0;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;50523:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;50446:106:::0;:::o;26014:407::-;26086:13;26117:16;26125:7;26117;:16::i;:::-;26112:61;;26142:31;;-1:-1:-1;;;26142:31:0;;;;;;;;;;;26112:61;26231:7;26211:192;26276:13;;;;:7;:13;;;;;;-1:-1:-1;;;;;26276:13:0;;-1:-1:-1;26312:19:0;;26308:80;;26356:12;26014:407;;;:::o;26308:80::-;-1:-1:-1;;26241:6:0;26211:192;;45112:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25758:194::-;25830:7;-1:-1:-1;;;;;25854:19:0;;25850:60;;25882:28;;-1:-1:-1;;;25882:28:0;;;;;;;;;;;25850:60;-1:-1:-1;;;;;;25928:16:0;;;;;:9;:16;;;;;;;25758:194::o;2713:103::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;2778:30:::1;2805:1;2778:18;:30::i;:::-;2713:103::o:0;42762:427::-;42906:8;42901:216;42924:8;:15;42920:1;:19;;;42901:216;;;42966:45;860:10;42985:12;42999:8;43008:1;42999:11;;;;;;;;;;:::i;:::-;;;;;;;42966:45;;:18;:45::i;:::-;42961:94;;43020:35;;-1:-1:-1;;;43020:35:0;;;;;;;;;;;42961:94;43070:35;43083:4;43089:2;43093:8;43102:1;43093:11;;;;;;;;;;:::i;:::-;;;;;;;43070:35;;:12;:35::i;:::-;42941:3;;;:::i;:::-;;;42901:216;;;;43168:2;-1:-1:-1;;;;;43134:47:0;43162:4;-1:-1:-1;;;;;43134:47:0;43148:12;860:10;;780:98;43148:12;-1:-1:-1;;;;;43134:47:0;;43172:8;43134:47;;;;;;:::i;:::-;;;;;;;;42762:427;;;:::o;43274:196::-;43417:45;43439:4;43445:2;43449:8;43417:45;;;;;;;;;;;;:21;:45::i;26657:104::-;26713:13;26746:7;26739:14;;;;;:::i;46520:225::-;46599:7;46689:19;46709:20;46689:41;;;;;;;;;;:::i;:::-;;;;;;;;;;;:48;;;;;;;;;;;;46626:19;46646:20;46626:41;;;;;;;;;;:::i;:::-;;;;;;;;;:60;:41;;;;;:60;;:111;;;:60;;:111;:::i;:::-;46619:118;;;46520:225;-1:-1:-1;;46520:225:0:o;41829:273::-;41905:8;41900:195;41923:8;:15;41919:1;:19;;;41900:195;;;41965:45;860:10;41984:12;780:98;41965:45;41960:90;;42019:31;;-1:-1:-1;;;42019:31:0;;;;;;;;;;;41960:90;42065:18;42071:8;42080:1;42071:11;;;;;;;;;;:::i;:::-;;;;;;;42065:18;;:5;:18::i;:::-;41940:3;;;:::i;:::-;;;41900:195;;28249:287;-1:-1:-1;;;;;28348:24:0;;860:10;28348:24;28344:54;;;28381:17;;-1:-1:-1;;;28381:17:0;;;;;;;;;;;28344:54;860:10;28411:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28411:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28411:53:0;;;;;;;;;;28480:48;;540:41:1;;;28411:42:0;;860:10;28480:48;;513:18:1;28480:48:0;;;;;;;28249:287;;:::o;51200:158::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;51306:44:::1;51325:4;;51306:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;51331:18:0;;-1:-1:-1;51306:18:0::1;::::0;-1:-1:-1;;51306:44:0:i:1;29335:316::-:0;29502:28;29512:4;29518:2;29522:7;29502:9;:28::i;:::-;29546:48;29569:4;29575:2;29579:7;29588:5;29546:22;:48::i;:::-;29541:102;;29603:40;;-1:-1:-1;;;29603:40:0;;;;;;;;;;;48455:1075;48570:10;48562:19;;;;:7;:19;;;;;;;;48558:67;;48590:35;;-1:-1:-1;;;48590:35:0;;;;;;;;;;;48558:67;48689:12;;48638:20;;;48714:667;48729:34;;;;-1:-1:-1;48714:667:0;;;48785:31;48819:23;;48843:1;48819:26;;;;;;;;;:::i;:::-;;;;;;48785:60;;;;;;;;;;:::i;:::-;48891:19;:26;48865:22;;48785:60;;-1:-1:-1;48865:52:0;;;;;48862:101;;48926:37;;-1:-1:-1;;;48926:37:0;;;;;;;;;;;48862:101;48994:68;49014:23;;49038:1;49014:26;;;;;;;;;:::i;:::-;:47;;;:26;;;;;:47;;;;-1:-1:-1;49014:47:0;:::i;48994:68::-;48983:1;:8;;;:79;;;48980:123;;;49071:32;;-1:-1:-1;;;49071:32:0;;;;;;;;;;;48980:123;49174:1;:8;;;49120:19;49140:1;:22;;;49120:43;;;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;;:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49213:1;:8;;;49197:24;;;;;;;:::i;:::-;;;49243:8;49238:132;49257:1;:8;;;49253:12;;:1;:12;;;49238:132;;;49332:22;;49291:27;49332:22;49319:9;;;;:::i;:::-;;;49291:38;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;49267:3;;;;;:::i;:::-;;;;49238:132;;;;48770:611;48765:3;;;;;:::i;:::-;;;;48714:667;;;-1:-1:-1;49408:17:0;49405:65;;49434:36;;-1:-1:-1;;;49434:36:0;;;;;;;;;;;49405:65;49491:31;49501:2;49505:12;49491:31;;;;;;;;;;;;:9;:31::i;53276:106::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;53346:28:::1;53365:8;53346:18;:28::i;50623:201::-:0;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;50721:9:::1;50717:100;50732:20:::0;;::::1;50717:100;;;50798:7;50774;:21;50782:9;;50792:1;50782:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50774:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50774:21:0;:31;;-1:-1:-1;;50774:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50754:3;::::1;::::0;::::1;:::i;:::-;;;;50717:100;;47985:381:::0;48103:13;48139:16;48147:7;48139;:16::i;:::-;48134:59;;48164:29;;-1:-1:-1;;;48164:29:0;;;;;;;;;;;48134:59;48250:1;48232:7;48226:21;;;;;:::i;:::-;;;:25;:132;;;;;;;;;;;;;;;;;48295:10;:8;:10::i;:::-;48307:18;:7;:16;:18::i;:::-;48278:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48206:152;47985:381;-1:-1:-1;;47985:381:0:o;52655:537::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;52756:11:::1;::::0;::::1;52752:433;;52788:9;52784:178;52799:19:::0;;::::1;52784:178;;;52863:12;;52848:8;;52857:1;52848:11;;;;;;;:::i;:::-;;;;;;;:27;52844:41;;52877:8;;52844:41;52913:20;:33;52934:8;;52943:1;52934:11;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;52913:33:::0;;-1:-1:-1;52913:33:0;::::1;::::0;;;;;;-1:-1:-1;52913:33:0;52906:40;;-1:-1:-1;;52906:40:0::1;::::0;;52784:178:::1;52820:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52784:178;;52752:433;52998:9;52994:180;53009:19:::0;;::::1;52994:180;;;53073:12;;53058:8;;53067:1;53058:11;;;;;;;:::i;:::-;;;;;;;:27;53054:41;;53087:8;;53054:41;53152:6;53116:20;:33;53137:8;;53146:1;53137:11;;;;;;;:::i;:::-;;;;;;;53116:33;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;52994:180;53030:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52994:180;;45312:47:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45312:47:0;;;;;;;-1:-1:-1;;45312:47:0;;;;;;;;;;:::o;47208:508::-;47497:27;;47558:35;;-1:-1:-1;;;47558:35:0;;-1:-1:-1;;;;;1692:55:1;;;47558:35:0;;;1674:74:1;47333:4:0;;47497:27;;;47550:56;;;;47497:27;;47558:28;;1647:18:1;;47558:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47550:56:0;;47546:100;;;47630:4;47623:11;;;;;47546:100;-1:-1:-1;;;;;28728:25:0;;;28704:4;28728:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;47665:43;47658:50;47208:508;-1:-1:-1;;;;47208:508:0:o;2971:201::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;-1:-1:-1;;;;;3060:22:0;::::1;3052:73;;;::::0;-1:-1:-1;;;3052:73:0;;19369:2:1;3052:73:0::1;::::0;::::1;19351:21:1::0;19408:2;19388:18;;;19381:30;19447:34;19427:18;;;19420:62;19518:8;19498:18;;;19491:36;19544:19;;3052:73:0::1;19167:402:1::0;3052:73:0::1;3136:28;3155:8;3136:18;:28::i;43555:472::-:0;43732:9;43727:228;43751:8;:15;43747:1;:19;43727:228;;;43793:45;860:10;43826:8;43835:1;43826:11;;;;;;;;:::i;43793:45::-;43788:94;;43847:35;;-1:-1:-1;;;43847:35:0;;;;;;;;;;;43788:94;43897:46;43914:4;43920:2;43924:8;43933:1;43924:11;;;;;;;;:::i;:::-;;;;;;;43897:46;;43937:5;43897:16;:46::i;:::-;43768:3;;;:::i;:::-;;;43727:228;;;;44006:2;-1:-1:-1;;;;;43972:47:0;44000:4;-1:-1:-1;;;;;43972:47:0;43986:12;860:10;;780:98;43986:12;-1:-1:-1;;;;;43972:47:0;;44010:8;43972:47;;;;;;:::i;:::-;;;;;;;;43555:472;;;;:::o;30195:167::-;30260:4;30294:1;30284:7;:11;:37;;;;;30309:12;;30299:7;:22;30284:37;:70;;;;-1:-1:-1;30325:16:0;;;;:7;:16;;;;;;-1:-1:-1;;;;;30325:16:0;24785:42;30325:29;;30277:77;30195:167;-1:-1:-1;;30195:167:0:o;34926:196::-;35041:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;35041:29:0;-1:-1:-1;;;;;35041:29:0;;;;;;;;;35086:28;;35041:24;;35086:28;;;;;;;34926:196;;;:::o;32937:1871::-;33052:13;33068:16;33076:7;33068;:16::i;:::-;33052:32;-1:-1:-1;33097:22:0;860:10;-1:-1:-1;;;;;33123:21:0;;;;:75;;-1:-1:-1;33161:37:0;33178:5;860:10;47208:508;:::i;33161:37::-;33123:128;;;-1:-1:-1;860:10:0;33215:20;33227:7;33215:11;:20::i;:::-;-1:-1:-1;;;;;33215:36:0;;33123:128;33097:155;;33270:17;33265:66;;33296:35;;-1:-1:-1;;;33296:35:0;;;;;;;;;;;33265:66;33355:4;-1:-1:-1;;;;;33346:13:0;:5;-1:-1:-1;;;;;33346:13:0;;33342:54;;33368:28;;-1:-1:-1;;;33368:28:0;;;;;;;;;;;33342:54;-1:-1:-1;;;;;33411:16:0;;33407:52;;33436:23;;-1:-1:-1;;;33436:23:0;;;;;;;;;;;33407:52;-1:-1:-1;;;;;33474:15:0;;24785:42;33474:15;33470:51;;;33498:23;;-1:-1:-1;;;33498:23:0;;;;;;;;;;;33470:51;33642:36;33659:1;33663:7;33672:5;33642:8;:36::i;:::-;-1:-1:-1;;;;;33970:15:0;;;;;;;:9;:15;;;;;;;;:20;;-1:-1:-1;;33970:20:0;;;34005:13;;;;;;;;;:18;;33989:1;34005:18;;;;;;34040:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34040:21:0;;;;;;34345:11;;;34375:20;;;;;;34345:11;;34375:20;34371:321;;34592:12;;34578:11;:26;34574:103;;;34629:20;;;;:7;:20;;;;;:28;;-1:-1:-1;;;;;;34629:28:0;-1:-1:-1;;;;;34629:28:0;;;;;34574:103;33945:758;34739:7;34735:2;-1:-1:-1;;;;;34720:27:0;34729:4;-1:-1:-1;;;;;34720:27:0;;;;;;;;;;;34758:42;49611:760;30968:171;31099:32;31105:2;31109:8;31119:5;31126:4;31099:5;:32::i;29659:281::-;29751:4;29768:13;29784:16;29792:7;29784;:16::i;:::-;29768:32;;29831:5;-1:-1:-1;;;;;29821:15:0;:6;-1:-1:-1;;;;;29821:15:0;;:62;;;;29877:6;-1:-1:-1;;;;;29853:30:0;:20;29865:7;29853:11;:20::i;:::-;-1:-1:-1;;;;;29853:30:0;;29821:62;:110;;;;29900:31;29917:5;29924:6;29900:16;:31::i;35351:1422::-;35411:13;35427:16;35435:7;35427;:16::i;:::-;35411:32;;35573:36;35590:1;35594:7;35603:5;35573:8;:36::i;:::-;-1:-1:-1;;;;;35901:16:0;;;;;;;:9;:16;;;;;;;;:21;;-1:-1:-1;;35901:21:0;;;35937:20;:25;;35921:1;35937:25;;;;;;35979:16;;;:7;:16;;;;;;:28;;-1:-1:-1;;;;;;35979:28:0;24785:42;35979:28;;;36291:11;;;36321:20;;;;;;36291:11;;36321:20;36317:322;;36538:12;;36524:11;:26;36520:104;;;36576:20;;;;:7;:20;;;;;:28;;-1:-1:-1;;;;;;36576:28:0;-1:-1:-1;;;;;36576:28:0;;;;;36520:104;-1:-1:-1;36667:36:0;;36695:7;;36691:1;;-1:-1:-1;;;;;36667:36:0;;;;;36691:1;;36667:36;50523:21:::1;50446:106:::0;:::o;3332:191::-;3406:16;3425:6;;-1:-1:-1;;;;;3442:17:0;;;-1:-1:-1;;;;;;3442:17:0;;;;;;3475:40;;3425:6;;;;;;;3475:40;;3406:16;3475:40;3395:128;3332:191;:::o;50886:252::-;-1:-1:-1;;;;;;;;;;;;;;;51022:14:0;;;51047:42;;;-1:-1:-1;;;;51047:42:0;;;;51102:19;:28;;;;;;;;;;;;;-1:-1:-1;;;;51102:28:0;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51102:28:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51102:28:0;;;;;;;;;;;;;;;-1:-1:-1;;;50886:252:0:o;37338:765::-;37493:4;-1:-1:-1;;;;;37514:13:0;;12717:19;:23;37510:586;;37550:72;;-1:-1:-1;;;37550:72:0;;-1:-1:-1;;;;;37550:36:0;;;;;:72;;860:10;;37601:4;;37607:7;;37616:5;;37550:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37550:72:0;;;;;;;;-1:-1:-1;;37550:72:0;;;;;;;;;;;;:::i;:::-;;;37546:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37796:13:0;;37792:234;;37823:40;;-1:-1:-1;;;37823:40:0;;;;;;;;;;;37792:234;37976:6;37970:13;37961:6;37957:2;37953:15;37946:38;37546:495;-1:-1:-1;;;;;;37673:55:0;-1:-1:-1;;;37673:55:0;;-1:-1:-1;37666:62:0;;37510:586;-1:-1:-1;38080:4:0;37338:765;;;;;;:::o;39731:1074::-;39801:13;39797:49;;39823:23;;-1:-1:-1;;;39823:23:0;;;;;;;;;;;39797:49;39861:12;;39877:1;39861:17;39857:49;;;39887:19;;-1:-1:-1;;;39887:19:0;;;;;;;;;;;39857:49;39953:24;;40021:12;;39992:41;;39988:76;;40042:22;;-1:-1:-1;;;40042:22:0;;;;;;;;;;;39988:76;40268:1;40366:12;40229:36;;;-1:-1:-1;;40229:40:0;;;-1:-1:-1;40347:95:0;;;-1:-1:-1;40425:1:0;40410:12;-1:-1:-1;;40410:16:0;40347:95;40475:25;40458:273;40507:8;40502:1;:13;40458:273;;40567:1;40545:10;;;:7;:10;;;;;;-1:-1:-1;;;;;40545:10:0;:24;:51;;;;-1:-1:-1;40573:10:0;;;;:7;:10;;;;;;-1:-1:-1;;;;;40573:10:0;24785:42;40573:23;;40545:51;40541:175;;;40621:17;40641:10;40649:1;40641:7;:10::i;:::-;40674;;;;:7;:10;;;;;:22;;-1:-1:-1;;;;;;40674:22:0;-1:-1:-1;;;;;40674:22:0;;;;;;;;;;-1:-1:-1;40541:175:0;40517:3;;40458:273;;;-1:-1:-1;40785:1:0;40774:12;40747:24;:39;-1:-1:-1;;39731:1074:0:o;47803:108::-;47863:13;47896:7;47889:14;;;;;:::i;20065:723::-;20121:13;20342:10;20338:53;;-1:-1:-1;;20369:10:0;;;;;;;;;;;;-1:-1:-1;;;20369:10:0;;;;;20065:723::o;20338:53::-;20416:5;20401:12;20457:78;20464:9;;20457:78;;20490:8;;;;:::i;:::-;;-1:-1:-1;20513:10:0;;-1:-1:-1;20521:2:0;20513:10;;:::i;:::-;;;20457:78;;;20545:19;20577:6;20567:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20567:17:0;;20545:39;;20595:154;20602:10;;20595:154;;20629:11;20639:1;20629:11;;:::i;:::-;;-1:-1:-1;20698:10:0;20706:2;20698:5;:10;:::i;:::-;20685:24;;:2;:24;:::i;:::-;20672:39;;20655:6;20662;20655:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;20726:11:0;20735:2;20726:11;;:::i;:::-;;;20595:154;;31398:1285;31568:12;;-1:-1:-1;;;;;31595:16:0;;31591:48;;31620:19;;-1:-1:-1;;;31620:19:0;;;;;;;;;;;31591:48;-1:-1:-1;;;;;31654:15:0;;24785:42;31654:15;31650:47;;;31678:19;;-1:-1:-1;;;31678:19:0;;;;;;;;;;;31650:47;31712:13;31708:44;;31734:18;;-1:-1:-1;;;31734:18:0;;;;;;;;;;;31708:44;-1:-1:-1;;;;;32079:13:0;;;;;;:9;:13;;;;;;;;:25;;;;;;32121:21;;;:7;:21;;;;;:26;;-1:-1:-1;;;;;;32121:26:0;;;;;;;32129:12;;32216:332;32236:8;32232:1;:12;32216:332;;;32275:38;;32300:12;;-1:-1:-1;;;;;32275:38:0;;;32292:1;;32275:38;;32292:1;;32275:38;32336:4;32332:166;;;32370:59;32401:1;32405:2;32409:12;32423:5;32370:22;:59::i;:::-;32365:113;;32438:40;;-1:-1:-1;;;32438:40:0;;;;;;;;;;;32365:113;32518:14;;;;;32246:3;32216:332;;;-1:-1:-1;32564:12:0;:27;32615:60;49611:760;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1759:154::-;-1:-1:-1;;;;;1838:5:1;1834:54;1827:5;1824:65;1814:93;;1903:1;1900;1893:12;1918:315;1986:6;1994;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;2102:9;2089:23;2121:31;2146:5;2121:31;:::i;:::-;2171:5;2223:2;2208:18;;;;2195:32;;-1:-1:-1;;;1918:315:1:o;2238:366::-;2300:8;2310:6;2364:3;2357:4;2349:6;2345:17;2341:27;2331:55;;2382:1;2379;2372:12;2331:55;-1:-1:-1;2405:20:1;;2448:18;2437:30;;2434:50;;;2480:1;2477;2470:12;2434:50;2517:4;2509:6;2505:17;2493:29;;2577:3;2570:4;2560:6;2557:1;2553:14;2545:6;2541:27;2537:38;2534:47;2531:67;;;2594:1;2591;2584:12;2531:67;2238:366;;;;;:::o;2609:769::-;2729:6;2737;2745;2753;2806:2;2794:9;2785:7;2781:23;2777:32;2774:52;;;2822:1;2819;2812:12;2774:52;2862:9;2849:23;2891:18;2932:2;2924:6;2921:14;2918:34;;;2948:1;2945;2938:12;2918:34;2987:69;3048:7;3039:6;3028:9;3024:22;2987:69;:::i;:::-;3075:8;;-1:-1:-1;2961:95:1;-1:-1:-1;3163:2:1;3148:18;;3135:32;;-1:-1:-1;3179:16:1;;;3176:36;;;3208:1;3205;3198:12;3176:36;;3247:71;3310:7;3299:8;3288:9;3284:24;3247:71;:::i;:::-;2609:769;;;;-1:-1:-1;3337:8:1;-1:-1:-1;;;;2609:769:1:o;3565:456::-;3642:6;3650;3658;3711:2;3699:9;3690:7;3686:23;3682:32;3679:52;;;3727:1;3724;3717:12;3679:52;3766:9;3753:23;3785:31;3810:5;3785:31;:::i;:::-;3835:5;-1:-1:-1;3892:2:1;3877:18;;3864:32;3905:33;3864:32;3905:33;:::i;:::-;3565:456;;3957:7;;-1:-1:-1;;;4011:2:1;3996:18;;;;3983:32;;3565:456::o;4026:159::-;4093:20;;4153:6;4142:18;;4132:29;;4122:57;;4175:1;4172;4165:12;4122:57;4026:159;;;:::o;4190:391::-;4265:6;4273;4281;4334:2;4322:9;4313:7;4309:23;4305:32;4302:52;;;4350:1;4347;4340:12;4302:52;4389:9;4376:23;4408:31;4433:5;4408:31;:::i;:::-;4458:5;-1:-1:-1;4482:37:1;4515:2;4500:18;;4482:37;:::i;:::-;4472:47;;4538:37;4571:2;4560:9;4556:18;4538:37;:::i;:::-;4528:47;;4190:391;;;;;:::o;5373:127::-;5434:10;5429:3;5425:20;5422:1;5415:31;5465:4;5462:1;5455:15;5489:4;5486:1;5479:15;5505:275;5576:2;5570:9;5641:2;5622:13;;-1:-1:-1;;5618:27:1;5606:40;;5676:18;5661:34;;5697:22;;;5658:62;5655:88;;;5723:18;;:::i;:::-;5759:2;5752:22;5505:275;;-1:-1:-1;5505:275:1:o;5785:407::-;5850:5;5884:18;5876:6;5873:30;5870:56;;;5906:18;;:::i;:::-;5944:57;5989:2;5968:15;;-1:-1:-1;;5964:29:1;5995:4;5960:40;5944:57;:::i;:::-;5935:66;;6024:6;6017:5;6010:21;6064:3;6055:6;6050:3;6046:16;6043:25;6040:45;;;6081:1;6078;6071:12;6040:45;6130:6;6125:3;6118:4;6111:5;6107:16;6094:43;6184:1;6177:4;6168:6;6161:5;6157:18;6153:29;6146:40;5785:407;;;;;:::o;6197:451::-;6266:6;6319:2;6307:9;6298:7;6294:23;6290:32;6287:52;;;6335:1;6332;6325:12;6287:52;6375:9;6362:23;6408:18;6400:6;6397:30;6394:50;;;6440:1;6437;6430:12;6394:50;6463:22;;6516:4;6508:13;;6504:27;-1:-1:-1;6494:55:1;;6545:1;6542;6535:12;6494:55;6568:74;6634:7;6629:2;6616:16;6611:2;6607;6603:11;6568:74;:::i;6842:247::-;6901:6;6954:2;6942:9;6933:7;6929:23;6925:32;6922:52;;;6970:1;6967;6960:12;6922:52;7009:9;6996:23;7028:31;7053:5;7028:31;:::i;7094:716::-;7147:5;7200:3;7193:4;7185:6;7181:17;7177:27;7167:55;;7218:1;7215;7208:12;7167:55;7254:6;7241:20;7280:4;7303:18;7299:2;7296:26;7293:52;;;7325:18;;:::i;:::-;7371:2;7368:1;7364:10;7394:28;7418:2;7414;7410:11;7394:28;:::i;:::-;7456:15;;;7526;;;7522:24;;;7487:12;;;;7558:15;;;7555:35;;;7586:1;7583;7576:12;7555:35;7622:2;7614:6;7610:15;7599:26;;7634:147;7650:6;7645:3;7642:15;7634:147;;;7716:22;7734:3;7716:22;:::i;:::-;7704:35;;7667:12;;;;7759;;;;7634:147;;;7799:5;7094:716;-1:-1:-1;;;;;;;7094:716:1:o;7815:622::-;7916:6;7924;7932;7985:2;7973:9;7964:7;7960:23;7956:32;7953:52;;;8001:1;7998;7991:12;7953:52;8040:9;8027:23;8059:31;8084:5;8059:31;:::i;:::-;8109:5;-1:-1:-1;8166:2:1;8151:18;;8138:32;8179:33;8138:32;8179:33;:::i;:::-;8231:7;-1:-1:-1;8289:2:1;8274:18;;8261:32;8316:18;8305:30;;8302:50;;;8348:1;8345;8338:12;8302:50;8371:60;8423:7;8414:6;8403:9;8399:22;8371:60;:::i;:::-;8361:70;;;7815:622;;;;;:::o;8442:184::-;8500:6;8553:2;8541:9;8532:7;8528:23;8524:32;8521:52;;;8569:1;8566;8559:12;8521:52;8592:28;8610:9;8592:28;:::i;8631:346::-;8714:6;8767:2;8755:9;8746:7;8742:23;8738:32;8735:52;;;8783:1;8780;8773:12;8735:52;8823:9;8810:23;8856:18;8848:6;8845:30;8842:50;;;8888:1;8885;8878:12;8842:50;8911:60;8963:7;8954:6;8943:9;8939:22;8911:60;:::i;8982:160::-;9047:20;;9103:13;;9096:21;9086:32;;9076:60;;9132:1;9129;9122:12;9147:315;9212:6;9220;9273:2;9261:9;9252:7;9248:23;9244:32;9241:52;;;9289:1;9286;9279:12;9241:52;9328:9;9315:23;9347:31;9372:5;9347:31;:::i;:::-;9397:5;-1:-1:-1;9421:35:1;9452:2;9437:18;;9421:35;:::i;:::-;9411:45;;9147:315;;;;;:::o;9467:670::-;9546:6;9554;9562;9615:2;9603:9;9594:7;9590:23;9586:32;9583:52;;;9631:1;9628;9621:12;9583:52;9671:9;9658:23;9700:18;9741:2;9733:6;9730:14;9727:34;;;9757:1;9754;9747:12;9727:34;9795:6;9784:9;9780:22;9770:32;;9840:7;9833:4;9829:2;9825:13;9821:27;9811:55;;9862:1;9859;9852:12;9811:55;9902:2;9889:16;9928:2;9920:6;9917:14;9914:34;;;9944:1;9941;9934:12;9914:34;9991:7;9984:4;9975:6;9971:2;9967:15;9963:26;9960:39;9957:59;;;10012:1;10009;10002:12;9957:59;10043:4;10035:13;;;;-1:-1:-1;10067:6:1;-1:-1:-1;10092:39:1;;10110:20;;;-1:-1:-1;10092:39:1;:::i;10142:221::-;10184:5;10237:3;10230:4;10222:6;10218:17;10214:27;10204:55;;10255:1;10252;10245:12;10204:55;10277:80;10353:3;10344:6;10331:20;10324:4;10316:6;10312:17;10277:80;:::i;10368:665::-;10463:6;10471;10479;10487;10540:3;10528:9;10519:7;10515:23;10511:33;10508:53;;;10557:1;10554;10547:12;10508:53;10596:9;10583:23;10615:31;10640:5;10615:31;:::i;:::-;10665:5;-1:-1:-1;10722:2:1;10707:18;;10694:32;10735:33;10694:32;10735:33;:::i;:::-;10787:7;-1:-1:-1;10841:2:1;10826:18;;10813:32;;-1:-1:-1;10896:2:1;10881:18;;10868:32;10923:18;10912:30;;10909:50;;;10955:1;10952;10945:12;10909:50;10978:49;11019:7;11010:6;10999:9;10995:22;10978:49;:::i;:::-;10968:59;;;10368:665;;;;;;;:::o;11038:792::-;11175:6;11183;11191;11244:2;11232:9;11223:7;11219:23;11215:32;11212:52;;;11260:1;11257;11250:12;11212:52;11299:9;11286:23;11318:31;11343:5;11318:31;:::i;:::-;11368:5;-1:-1:-1;11424:2:1;11409:18;;11396:32;11447:18;11477:14;;;11474:34;;;11504:1;11501;11494:12;11474:34;11542:6;11531:9;11527:22;11517:32;;11587:7;11580:4;11576:2;11572:13;11568:27;11558:55;;11609:1;11606;11599:12;11558:55;11649:2;11636:16;11675:2;11667:6;11664:14;11661:34;;;11691:1;11688;11681:12;11661:34;11744:7;11739:2;11729:6;11726:1;11722:14;11718:2;11714:23;11710:32;11707:45;11704:65;;;11765:1;11762;11755:12;11704:65;11796:2;11792;11788:11;11778:21;;11818:6;11808:16;;;;;11038:792;;;;;:::o;11835:504::-;11927:6;11935;11943;11996:2;11984:9;11975:7;11971:23;11967:32;11964:52;;;12012:1;12009;12002:12;11964:52;12052:9;12039:23;12085:18;12077:6;12074:30;12071:50;;;12117:1;12114;12107:12;12071:50;12156:69;12217:7;12208:6;12197:9;12193:22;12156:69;:::i;:::-;12244:8;;-1:-1:-1;12130:95:1;-1:-1:-1;12298:35:1;;-1:-1:-1;12329:2:1;12314:18;;12298:35;:::i;12344:593::-;12437:6;12445;12453;12506:2;12494:9;12485:7;12481:23;12477:32;12474:52;;;12522:1;12519;12512:12;12474:52;12561:9;12548:23;12611:4;12604:5;12600:16;12593:5;12590:27;12580:55;;12631:1;12628;12621:12;12580:55;12654:5;-1:-1:-1;12710:2:1;12695:18;;12682:32;12737:18;12726:30;;12723:50;;;12769:1;12766;12759:12;12723:50;12808:69;12869:7;12860:6;12849:9;12845:22;12808:69;:::i;:::-;12344:593;;12896:8;;-1:-1:-1;12782:95:1;;-1:-1:-1;;;;12344:593:1:o;12942:401::-;13143:2;13132:9;13125:21;13106:4;13163:45;13204:2;13193:9;13189:18;13181:6;13163:45;:::i;:::-;13227:6;13269:15;;;13264:2;13249:18;;13242:43;13321:15;;;;13316:2;13301:18;;;13294:43;13155:53;12942:401;-1:-1:-1;;12942:401:1:o;13348:388::-;13416:6;13424;13477:2;13465:9;13456:7;13452:23;13448:32;13445:52;;;13493:1;13490;13483:12;13445:52;13532:9;13519:23;13551:31;13576:5;13551:31;:::i;:::-;13601:5;-1:-1:-1;13658:2:1;13643:18;;13630:32;13671:33;13630:32;13671:33;:::i;:::-;13723:7;13713:17;;;13348:388;;;;;:::o;13741:842::-;13860:6;13868;13876;13884;13937:3;13925:9;13916:7;13912:23;13908:33;13905:53;;;13954:1;13951;13944:12;13905:53;13993:9;13980:23;14012:31;14037:5;14012:31;:::i;:::-;14062:5;-1:-1:-1;14119:2:1;14104:18;;14091:32;14132:33;14091:32;14132:33;:::i;:::-;14184:7;-1:-1:-1;14242:2:1;14227:18;;14214:32;14265:18;14295:14;;;14292:34;;;14322:1;14319;14312:12;14292:34;14345:60;14397:7;14388:6;14377:9;14373:22;14345:60;:::i;:::-;14335:70;;14458:2;14447:9;14443:18;14430:32;14414:48;;14487:2;14477:8;14474:16;14471:36;;;14503:1;14500;14493:12;14471:36;;14526:51;14569:7;14558:8;14547:9;14543:24;14526:51;:::i;14588:380::-;14667:1;14663:12;;;;14710;;;14731:61;;14785:4;14777:6;14773:17;14763:27;;14731:61;14838:2;14830:6;14827:14;14807:18;14804:38;14801:161;;;14884:10;14879:3;14875:20;14872:1;14865:31;14919:4;14916:1;14909:15;14947:4;14944:1;14937:15;14801:161;;14588:380;;;:::o;15334:127::-;15395:10;15390:3;15386:20;15383:1;15376:31;15426:4;15423:1;15416:15;15450:4;15447:1;15440:15;15466:127;15527:10;15522:3;15518:20;15515:1;15508:31;15558:4;15555:1;15548:15;15582:4;15579:1;15572:15;15598:197;15636:3;15664:6;15705:2;15698:5;15694:14;15732:2;15723:7;15720:15;15717:41;;;15738:18;;:::i;:::-;15787:1;15774:15;;15598:197;-1:-1:-1;;;15598:197:1:o;15800:224::-;15839:3;15867:6;15900:2;15897:1;15893:10;15930:2;15927:1;15923:10;15961:3;15957:2;15953:12;15948:3;15945:21;15942:47;;;15969:18;;:::i;:::-;16005:13;;15800:224;-1:-1:-1;;;;15800:224:1:o;16029:135::-;16068:3;-1:-1:-1;;16089:17:1;;16086:43;;;16109:18;;:::i;:::-;-1:-1:-1;16156:1:1;16145:13;;16029:135::o;16169:522::-;16247:4;16253:6;16313:11;16300:25;16407:2;16403:7;16392:8;16376:14;16372:29;16368:43;16348:18;16344:68;16334:96;;16426:1;16423;16416:12;16334:96;16453:33;;16505:20;;;-1:-1:-1;16548:18:1;16537:30;;16534:50;;;16580:1;16577;16570:12;16534:50;16613:4;16601:17;;-1:-1:-1;16644:14:1;16640:27;;;16630:38;;16627:58;;;16681:1;16678;16671:12;16696:643;16865:2;16917:21;;;16987:13;;16890:18;;;17009:22;;;16836:4;;16865:2;17088:15;;;;17062:2;17047:18;;;16836:4;17131:182;17145:6;17142:1;17139:13;17131:182;;;17210:13;;17225:6;17206:26;17194:39;;17288:15;;;;17253:12;;;;17167:1;17160:9;17131:182;;;-1:-1:-1;17330:3:1;;16696:643;-1:-1:-1;;;;;;16696:643:1:o;17344:217::-;17383:4;17412:6;17468:10;;;;17438;;17490:12;;;17487:38;;;17505:18;;:::i;:::-;17542:13;;17344:217;-1:-1:-1;;;17344:217:1:o;17566:529::-;17665:6;17718:2;17706:9;17697:7;17693:23;17689:32;17686:52;;;17734:1;17731;17724:12;17686:52;17767:2;17761:9;17809:2;17801:6;17797:15;17878:6;17866:10;17863:22;17842:18;17830:10;17827:34;17824:62;17821:88;;;17889:18;;:::i;:::-;17925:2;17918:22;17964:28;17982:9;17964:28;:::i;:::-;17956:6;17949:44;18026:37;18059:2;18048:9;18044:18;18026:37;:::i;:::-;18021:2;18009:15;;18002:62;18013:6;17566:529;-1:-1:-1;;;17566:529:1:o;18100:128::-;18140:3;18171:1;18167:6;18164:1;18161:13;18158:39;;;18177:18;;:::i;:::-;-1:-1:-1;18213:9:1;;18100:128::o;18233:637::-;18513:3;18551:6;18545:13;18567:53;18613:6;18608:3;18601:4;18593:6;18589:17;18567:53;:::i;:::-;18683:13;;18642:16;;;;18705:57;18683:13;18642:16;18739:4;18727:17;;18705:57;:::i;:::-;18827:7;18784:20;;18813:22;;;18862:1;18851:13;;18233:637;-1:-1:-1;;;;18233:637:1:o;18875:287::-;18981:6;19034:2;19022:9;19013:7;19009:23;19005:32;19002:52;;;19050:1;19047;19040:12;19002:52;19082:9;19076:16;19101:31;19126:5;19101:31;:::i;19574:512::-;19768:4;-1:-1:-1;;;;;19878:2:1;19870:6;19866:15;19855:9;19848:34;19930:2;19922:6;19918:15;19913:2;19902:9;19898:18;19891:43;;19970:6;19965:2;19954:9;19950:18;19943:34;20013:3;20008:2;19997:9;19993:18;19986:31;20034:46;20075:3;20064:9;20060:19;20052:6;20034:46;:::i;:::-;20026:54;19574:512;-1:-1:-1;;;;;;19574:512:1:o;20091:249::-;20160:6;20213:2;20201:9;20192:7;20188:23;20184:32;20181:52;;;20229:1;20226;20219:12;20181:52;20261:9;20255:16;20280:30;20304:5;20280:30;:::i;20345:127::-;20406:10;20401:3;20397:20;20394:1;20387:31;20437:4;20434:1;20427:15;20461:4;20458:1;20451:15;20477:120;20517:1;20543;20533:35;;20548:18;;:::i;:::-;-1:-1:-1;20582:9:1;;20477:120::o;20602:125::-;20642:4;20670:1;20667;20664:8;20661:34;;;20675:18;;:::i;:::-;-1:-1:-1;20712:9:1;;20602:125::o;20732:112::-;20764:1;20790;20780:35;;20795:18;;:::i;:::-;-1:-1:-1;20829:9:1;;20732:112::o
Swarm Source
ipfs://f3bfb2ace60a15c0a4c4221cd4f34a7c24af6ac32e8f458c4c823bafac71be80
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.