BEP-721
Overview
Max Total Supply
4,919APE
Holders
709
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 APELoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
ApeNFT
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at BscScan.com on 2022-04-30 */ // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // 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/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @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.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/BAS/NFTs/Apes/ApeNFT.sol /* ██████████ █████████ ████████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████████ █████████ ████████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████████ ██ ██ ████████ █████████████████████████████████████ Block, Ape, Scissors */ // Created by Dan and Jack pragma solidity 0.8.12; contract BASAuth is Ownable { mapping(address => bool) public ApeCreator; mapping(address => bool) public ApeModifier; // @dev The only user which can mint a NFT, genisis and shop contract that have this trait modifier onlyCreator(){ require(ApeCreator[msg.sender], "Caller must be a ApeCreator."); _; } // @dev modifier onlyModifier(){ require(ApeModifier[msg.sender], "Not ApeModifier."); _; } function modifyCreators(address _address, bool _state) external onlyOwner { ApeCreator[_address] = _state; } function modifyModifier(address _address, bool _state) external onlyOwner { ApeModifier[_address] = _state; } } contract ApeNFT is ERC721Enumerable, Ownable, BASAuth { using SafeMath for uint; uint immutable MaxApes = 2**256 - 1; uint immutable MaxLevel = 150; enum ApeState{POD, ALIVE, DEAD} enum ApeGender{MALE, FEMALE} struct Ape { uint level; ApeState state; ApeGender gender; uint breeding_count; uint[] stats; uint stat_points; uint[] traits; uint[] trait_levels; uint trait_points; uint pod_type; uint dna; uint elder_trait; uint birth; } mapping(uint => Ape) public tokenToApe; string private _customBaseURI = ""; event ApeChanges(uint _token, uint level, uint[] stats, uint stat_points, uint trait_points); event ApeBreeding(uint _token, uint breeding_count); event ApeTraitChanges(uint _token, uint[] traits, uint[] trait_levels, uint trait_points); event ApeElderTraitChanges(uint _token, uint elder_trait); event ApeStateChanges(uint _token, ApeState state); event ApeCreated(uint _token, ApeGender gender, uint[] stats, uint[] traits, uint birth); event PodCreated(uint _token, uint pod_type); event PodDNA(uint _token, uint dna); // Modifiing fuction allow Admin only add to them string[] public ApeTraits; uint public AmountOfTraits; string[] public PodTypes; uint public AmountOfPodTypes; string[] public ElderTraits; uint public AmountOfElderTraits; string[6] public ApeStats; constructor(string memory name, string memory symbol, string[] memory _ApeStats) ERC721(name, symbol) { require(_ApeStats.length == 6); for(uint i = 0; i < _ApeStats.length; i++){ ApeStats[i] = _ApeStats[i]; } } /** @dev Sets the baseURI to a string value */ function setBaseURI(string memory baseURI) public onlyOwner { _customBaseURI = baseURI; } /** @dev Overrides virtual _baseURI() used in ERC721 _tokenURI() to use custom value */ function _baseURI() internal view override returns (string memory) { return _customBaseURI; } /** @dev allows admin to add a trait to the ApeTraits list */ function addTraits(string[] memory trait_names) external onlyOwner { for(uint i; i < trait_names.length; i++){ ApeTraits.push(trait_names[i]); AmountOfTraits = AmountOfTraits.add(1); } } /** @dev allows admin to add a pod type to the PodTypes list */ function addPodTypes(string[] memory _pod_types) external onlyOwner { for(uint i; i < _pod_types.length; i++){ PodTypes.push(_pod_types[i]); AmountOfPodTypes = AmountOfPodTypes.add(1); } } /** @dev allows admin to add a elder trait to */ function addElderTraits(string[] memory _ape_traits) external onlyOwner { for(uint i; i < _ape_traits.length; i++){ ElderTraits.push(_ape_traits[i]); AmountOfElderTraits = AmountOfElderTraits.add(1); } } /** @dev mints the ape to the reciprent, also set the dns */ function createApePod(address _recipient, uint _pod_type) public onlyCreator returns(uint) { uint tokenId = totalSupply(); _safeMint(_recipient,tokenId); uint[] memory empty = new uint[](3); uint[] memory empty_stats = new uint[](6); tokenToApe[tokenId] = Ape(1,ApeState.POD,ApeGender.FEMALE,0,empty_stats,0,empty,empty,0,_pod_type,0,0,block.timestamp); emit PodCreated(tokenId, _pod_type); return tokenId; } /** @dev call back for chainlink randomness */ function setApeDna(uint _tokenId, uint _dna) public onlyCreator { tokenToApe[_tokenId].dna = _dna; emit PodDNA(_tokenId, _dna); } /** @dev creta ape with stats */ function createApe(address _recipient, ApeGender gender, uint[] calldata stats, uint[] calldata traits, uint dna ) external onlyCreator { uint tokenId = totalSupply(); _safeMint(_recipient,tokenId); tokenToApe[tokenId] = Ape(1, ApeState.ALIVE,gender,0, stats,0, traits, new uint[](3), 0, 0, dna, 0, block.timestamp); emit ApeCreated(tokenId, gender, stats, traits, block.timestamp); } /** @dev Takes a pod and two other apes and sets a pods ape state to alive, with trait and stat intialisation Notice when this functions is called the apes that are used most have their breeding counts be incremented */ function breedApe(uint _tokenId, ApeGender _gender, uint[] memory _stats, uint[] memory _traits) external onlyCreator { tokenToApe[_tokenId].state = ApeState.ALIVE; tokenToApe[_tokenId].gender = _gender; tokenToApe[_tokenId].stats = _stats; tokenToApe[_tokenId].traits = _traits; tokenToApe[_tokenId].birth = block.timestamp; emit ApeCreated(_tokenId, _gender, _stats, _traits, block.timestamp); } /** @dev adds to the leve of a ape */ function levelUp(uint _tokenId, uint levels) public onlyModifier { require(tokenToApe[_tokenId].level.add(levels) <= MaxLevel); tokenToApe[_tokenId].level = tokenToApe[_tokenId].level.add(levels); uint stat_multipler = levels/5; uint trait_multipler = levels/10; tokenToApe[_tokenId].stat_points = tokenToApe[_tokenId].stat_points.add(stat_multipler.mul(3)); tokenToApe[_tokenId].trait_points = tokenToApe[_tokenId].trait_points.add(trait_multipler.mul(2)); if((levels % 5 != 0 && tokenToApe[_tokenId].level % 5 == 0) || (tokenToApe[_tokenId].level.sub(levels) % 5 > tokenToApe[_tokenId].level % 5)){ tokenToApe[_tokenId].stat_points = tokenToApe[_tokenId].stat_points.add(3); } if(levels % 10 != 0 && tokenToApe[_tokenId].level % 10 == 0 || (tokenToApe[_tokenId].level.sub(levels) % 10 > tokenToApe[_tokenId].level % 10)){ tokenToApe[_tokenId].trait_points = tokenToApe[_tokenId].trait_points.add(2); } emit ApeChanges(_tokenId, tokenToApe[_tokenId].level, tokenToApe[_tokenId].stats , tokenToApe[_tokenId].stat_points, tokenToApe[_tokenId].trait_points); } /** @dev adds a mount of levels to a specified stat */ function levelUpStat(uint _tokenId, uint index, uint amount) public onlyModifier { require(amount <= tokenToApe[_tokenId].stat_points); tokenToApe[_tokenId].stats[index] = tokenToApe[_tokenId].stats[index].add(amount); tokenToApe[_tokenId].stat_points = tokenToApe[_tokenId].stat_points.sub(amount); emit ApeChanges(_tokenId, tokenToApe[_tokenId].level, tokenToApe[_tokenId].stats , tokenToApe[_tokenId].stat_points, tokenToApe[_tokenId].trait_points); } /** @dev adds a mount of levels to a specified trait */ function levelUpTrait(uint _tokenId, uint index, uint amount) public onlyModifier { require(amount <= tokenToApe[_tokenId].trait_points); tokenToApe[_tokenId].trait_levels[index] = tokenToApe[_tokenId].trait_levels[index].add(amount); tokenToApe[_tokenId].trait_points = tokenToApe[_tokenId].trait_points.sub(amount); emit ApeTraitChanges(_tokenId, tokenToApe[_tokenId].traits, tokenToApe[_tokenId].trait_levels, tokenToApe[_tokenId].trait_points); } /** @dev adds a new trait to a ape */ function addTrait(uint _tokenId, uint _newTrait) public onlyModifier { require(tokenToApe[_tokenId].traits.length < 4); require(_newTrait < ApeTraits.length); tokenToApe[_tokenId].traits.push(_newTrait); tokenToApe[_tokenId].trait_levels.push(0); emit ApeTraitChanges(_tokenId, tokenToApe[_tokenId].traits, tokenToApe[_tokenId].trait_levels, tokenToApe[_tokenId].trait_points); } /** @dev adds a mount to breeding count */ function addBreedingCount(uint _tokenId, uint amount) public onlyModifier { tokenToApe[_tokenId].breeding_count = tokenToApe[_tokenId].breeding_count.add(amount); emit ApeBreeding(_tokenId, tokenToApe[_tokenId].breeding_count); } /** @dev modifies the state of a ape */ function setState(uint _tokenId, ApeState _state) public onlyModifier { tokenToApe[_tokenId].state = _state; emit ApeStateChanges(_tokenId, _state); } /** @dev modifies the elder_trait of a ape */ function setElderTrait(uint _tokenId, uint _elder_trait) public onlyModifier { require(_elder_trait < ElderTraits.length); tokenToApe[_tokenId].elder_trait = _elder_trait; emit ApeElderTraitChanges(_tokenId, tokenToApe[_tokenId].elder_trait); } // /** // @dev returns the info for a Ape corresponding to a token id // */ function getApeStatsAndTraits(uint _tokenId) external view returns(uint[] memory stats, uint[] memory traits, uint[] memory trait_levels){ stats = tokenToApe[_tokenId].stats; traits = tokenToApe[_tokenId].traits; trait_levels = tokenToApe[_tokenId].trait_levels; } }
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":"_ApeStats","type":"string[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"breeding_count","type":"uint256"}],"name":"ApeBreeding","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"stats","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"stat_points","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"trait_points","type":"uint256"}],"name":"ApeChanges","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"enum ApeNFT.ApeGender","name":"gender","type":"uint8"},{"indexed":false,"internalType":"uint256[]","name":"stats","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"traits","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"birth","type":"uint256"}],"name":"ApeCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"elder_trait","type":"uint256"}],"name":"ApeElderTraitChanges","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"enum ApeNFT.ApeState","name":"state","type":"uint8"}],"name":"ApeStateChanges","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"traits","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"trait_levels","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"trait_points","type":"uint256"}],"name":"ApeTraitChanges","type":"event"},{"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":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pod_type","type":"uint256"}],"name":"PodCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dna","type":"uint256"}],"name":"PodDNA","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AmountOfElderTraits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AmountOfPodTypes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AmountOfTraits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ApeCreator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ApeModifier","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ApeStats","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ApeTraits","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ElderTraits","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PodTypes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addBreedingCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_ape_traits","type":"string[]"}],"name":"addElderTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_pod_types","type":"string[]"}],"name":"addPodTypes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_newTrait","type":"uint256"}],"name":"addTrait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"trait_names","type":"string[]"}],"name":"addTraits","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"enum ApeNFT.ApeGender","name":"_gender","type":"uint8"},{"internalType":"uint256[]","name":"_stats","type":"uint256[]"},{"internalType":"uint256[]","name":"_traits","type":"uint256[]"}],"name":"breedApe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"enum ApeNFT.ApeGender","name":"gender","type":"uint8"},{"internalType":"uint256[]","name":"stats","type":"uint256[]"},{"internalType":"uint256[]","name":"traits","type":"uint256[]"},{"internalType":"uint256","name":"dna","type":"uint256"}],"name":"createApe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_pod_type","type":"uint256"}],"name":"createApePod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApeStatsAndTraits","outputs":[{"internalType":"uint256[]","name":"stats","type":"uint256[]"},{"internalType":"uint256[]","name":"traits","type":"uint256[]"},{"internalType":"uint256[]","name":"trait_levels","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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"levels","type":"uint256"}],"name":"levelUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"levelUpStat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"levelUpTrait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"modifyCreators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"modifyModifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_dna","type":"uint256"}],"name":"setApeDna","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_elder_trait","type":"uint256"}],"name":"setElderTrait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"enum ApeNFT.ApeState","name":"_state","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenToApe","outputs":[{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"enum ApeNFT.ApeState","name":"state","type":"uint8"},{"internalType":"enum ApeNFT.ApeGender","name":"gender","type":"uint8"},{"internalType":"uint256","name":"breeding_count","type":"uint256"},{"internalType":"uint256","name":"stat_points","type":"uint256"},{"internalType":"uint256","name":"trait_points","type":"uint256"},{"internalType":"uint256","name":"pod_type","type":"uint256"},{"internalType":"uint256","name":"dna","type":"uint256"},{"internalType":"uint256","name":"elder_trait","type":"uint256"},{"internalType":"uint256","name":"birth","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600019608052609660a05260e06040819052600060c08190526200002691600e916200017e565b503480156200003457600080fd5b5060405162003d2638038062003d26833981016040819052620000579162000302565b825183908390620000709060009060208501906200017e565b508051620000869060019060208401906200017e565b505050620000a36200009d6200012860201b60201c565b6200012c565b8051600614620000b257600080fd5b60005b81518110156200011e57818181518110620000d457620000d46200041f565b602002602001015160158260068110620000f257620000f26200041f565b019080519060200190620001089291906200017e565b5080620001158162000435565b915050620000b5565b505050506200049c565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200018c906200045f565b90600052602060002090601f016020900481019282620001b05760008555620001fb565b82601f10620001cb57805160ff1916838001178555620001fb565b82800160010185558215620001fb579182015b82811115620001fb578251825591602001919060010190620001de565b50620002099291506200020d565b5090565b5b808211156200020957600081556001016200020e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000265576200026562000224565b604052919050565b600082601f8301126200027f57600080fd5b81516001600160401b038111156200029b576200029b62000224565b6020620002b1601f8301601f191682016200023a565b8281528582848701011115620002c657600080fd5b60005b83811015620002e6578581018301518282018401528201620002c9565b83811115620002f85760008385840101525b5095945050505050565b6000806000606084860312156200031857600080fd5b83516001600160401b03808211156200033057600080fd5b6200033e878388016200026d565b94506020915081860151818111156200035657600080fd5b62000364888289016200026d565b9450506040860151818111156200037a57600080fd5b8601601f810188136200038c57600080fd5b805182811115620003a157620003a162000224565b8060051b620003b28582016200023a565b918252828101850191858101908b841115620003cd57600080fd5b86850192505b838310156200040e57825186811115620003ed5760008081fd5b620003fd8d89838901016200026d565b8352509186019190860190620003d3565b809750505050505050509250925092565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200045857634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200047457607f821691505b602082108114156200049657634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051613867620004bf6000396000610f030152600050506138676000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c80636776be7511610167578063b0d04dea116100ce578063d100567511610087578063d10056751461062b578063e985e9c51461063e578063f2fde38b1461067a578063f355d70b1461068d578063f6ecede0146106a0578063f85781d3146106b357600080fd5b8063b0d04dea1461055c578063b2f5e2851461056f578063b68a2ba914610582578063b88d4fde14610595578063c87b56dd146105a8578063cc474967146105bb57600080fd5b806390180f911161012057806390180f91146104ff578063923a34ba1461051257806395d89b411461051b578063965ff5bc14610523578063a22cb46514610536578063a9e99e431461054957600080fd5b80636776be75146104ae57806370a08231146104c1578063715018a6146104d457806377e2eaec146104dc57806385202a15146104e55780638da5cb5b146104ee57600080fd5b80632f745c591161020b57806355f804b3116101c457806355f804b31461041d57806356306c021461043057806356aadf1c146104435780636352211e1461046657806365ec494d14610479578063663f24681461049b57600080fd5b80632f745c59146103ab5780634262cfb7146103be57806342842e0e146103d157806342949c51146103e45780634f6ccce7146103f75780635226dc931461040a57600080fd5b8063095ea7b31161025d578063095ea7b3146103385780631298ff431461034d57806318160ddd1461036057806323b872dd1461037257806327b1fded1461038557806329a26d101461039857600080fd5b806301ffc9a71461029a57806306fdde03146102c257806307cf4e9d146102d7578063081812fc146102ea5780630847c61414610315575b600080fd5b6102ad6102a8366004612c7e565b6106c6565b60405190151581526020015b60405180910390f35b6102ca6106f1565b6040516102b99190612cf3565b6102ca6102e5366004612d06565b610783565b6102fd6102f8366004612d06565b610823565b6040516001600160a01b0390911681526020016102b9565b6102ad610323366004612d3b565b600b6020526000908152604090205460ff1681565b61034b610346366004612d56565b6108bd565b005b61034b61035b366004612e63565b6109d3565b6008545b6040519081526020016102b9565b61034b610380366004612f19565b610a77565b61034b610393366004612f55565b610aa8565b61034b6103a6366004612f81565b610be4565b6103646103b9366004612d56565b610c39565b61034b6103cc366004613032565b610ccf565b61034b6103df366004612f19565b610dea565b6102ca6103f2366004612d06565b610e05565b610364610405366004612d06565b610e30565b61034b6104183660046130b0565b610ec3565b61034b61042b3660046130d2565b6111a2565b61034b61043e3660046130b0565b6111df565b6102ad610451366004612d3b565b600c6020526000908152604090205460ff1681565b6102fd610474366004612d06565b6112c1565b61048c610487366004612d06565b611338565b6040516102b993929190613142565b6102ca6104a9366004612d06565b611479565b61034b6104bc3660046131d1565b611489565b6103646104cf366004612d3b565b611723565b61034b6117aa565b61036460145481565b61036460125481565b600a546001600160a01b03166102fd565b6102ca61050d366004612d06565b6117e0565b61036460105481565b6102ca6117f0565b61034b61053136600461326b565b6117ff565b61034b610544366004612f81565b611894565b61034b610557366004612e63565b61189f565b61034b61056a3660046130b0565b61193f565b61036461057d366004612d56565b6119c7565b61034b6105903660046130b0565b611c08565b61034b6105a3366004613294565b611ca1565b6102ca6105b6366004612d06565b611cd9565b6106156105c9366004612d06565b600d6020526000908152604090208054600182015460028301546004840154600785015460088601546009870154600a880154600b90980154969760ff8088169861010090980416968a565b6040516102b99a9998979695949392919061333e565b61034b610639366004612f81565b611db4565b6102ad61064c366004613399565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61034b610688366004612d3b565b611e09565b61034b61069b3660046130b0565b611ea4565b61034b6106ae366004612f55565b611f1e565b61034b6106c1366004612e63565b612033565b60006001600160e01b0319821663780e9d6360e01b14806106eb57506106eb826120d3565b92915050565b606060008054610700906133cc565b80601f016020809104026020016040519081016040528092919081815260200182805461072c906133cc565b80156107795780601f1061074e57610100808354040283529160200191610779565b820191906000526020600020905b81548152906001019060200180831161075c57829003601f168201915b5050505050905090565b6015816006811061079357600080fd5b0180549091506107a2906133cc565b80601f01602080910402602001604051908101604052809291908181526020018280546107ce906133cc565b801561081b5780601f106107f05761010080835404028352916020019161081b565b820191906000526020600020905b8154815290600101906020018083116107fe57829003601f168201915b505050505081565b6000818152600260205260408120546001600160a01b03166108a15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108c8826112c1565b9050806001600160a01b0316836001600160a01b031614156109365760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610898565b336001600160a01b03821614806109525750610952813361064c565b6109c45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610898565b6109ce8383612123565b505050565b600a546001600160a01b031633146109fd5760405162461bcd60e51b815260040161089890613407565b60005b8151811015610a73576013828281518110610a1d57610a1d61343c565b60209081029190910181015182546001810184556000938452928290208151610a4f9491909101929190910190612b95565b50601454610a5e906001612191565b60145580610a6b81613468565b915050610a00565b5050565b610a81338261219d565b610a9d5760405162461bcd60e51b815260040161089890613483565b6109ce838383612294565b336000908152600c602052604090205460ff16610ad75760405162461bcd60e51b8152600401610898906134d4565b6000838152600d6020526040902060070154811115610af557600080fd5b6000838152600d602052604090206006018054610b3791839185908110610b1e57610b1e61343c565b906000526020600020015461219190919063ffffffff16565b6000848152600d60205260409020600601805484908110610b5a57610b5a61343c565b6000918252602080832090910192909255848152600d9091526040902060070154610b85908261243b565b6000848152600d6020526040908190206007810183905590517f44bc4425783fc482a00bdb0f9c767ed6666d073c213e1aac6944334139cdc5ac92610bd7928792600582019260069092019190613533565b60405180910390a1505050565b600a546001600160a01b03163314610c0e5760405162461bcd60e51b815260040161089890613407565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b6000610c4483611723565b8210610ca65760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610898565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b336000908152600b602052604090205460ff16610cfe5760405162461bcd60e51b815260040161089890613570565b6000848152600d602052604090206001908101805460ff19811683178255859261ffff19909116811790610100908490811115610d3d57610d3d613304565b02179055506000848152600d602090815260409091208351610d6792600390920191850190612c19565b506000848152600d602090815260409091208251610d8d92600590920191840190612c19565b506000848152600d60205260409081902042600b90910181905590517f949c186f4d21590f6f863f2edcfe78ffabd266d90e039e31f591248e7293d7cb91610ddc9187918791879187916135a7565b60405180910390a150505050565b6109ce83838360405180602001604052806000815250611ca1565b60118181548110610e1557600080fd5b9060005260206000200160009150905080546107a2906133cc565b6000610e3b60085490565b8210610e9e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610898565b60088281548110610eb157610eb161343c565b90600052602060002001549050919050565b336000908152600c602052604090205460ff16610ef25760405162461bcd60e51b8152600401610898906134d4565b6000828152600d60205260409020547f000000000000000000000000000000000000000000000000000000000000000090610f2d9083612191565b1115610f3857600080fd5b6000828152600d6020526040902054610f519082612191565b6000838152600d6020526040812091909155610f6e600583613608565b90506000610f7d600a84613608565b9050610fa5610f8d836003612447565b6000868152600d602052604090206004015490612191565b6000858152600d6020526040902060040155610fdd610fc5826002612447565b6000868152600d602052604090206007015490612191565b6000858152600d6020526040902060070155610ffa60058461361c565b1580159061102057506000848152600d602052604090205461101e9060059061361c565b155b8061106957506000848152600d60205260409020546110419060059061361c565b6000858152600d602052604090205460059061105d908661243b565b611067919061361c565b115b1561109e576000848152600d602052604090206004015461108b906003612191565b6000858152600d60205260409020600401555b6110a9600a8461361c565b158015906110cf57506000848152600d60205260409020546110cd90600a9061361c565b155b8061111857506000848152600d60205260409020546110f090600a9061361c565b6000858152600d6020526040902054600a9061110c908661243b565b611116919061361c565b115b1561114d576000848152600d602052604090206007015461113a906002612191565b6000858152600d60205260409020600701555b6000848152600d60205260409081902080546004820154600783015493517fcccdd9eb97d287b56e6097aaf46463b7fff246807f95687ed66ef08315503cc394610ddc948a9493600390910192909190613630565b600a546001600160a01b031633146111cc5760405162461bcd60e51b815260040161089890613407565b8051610a7390600e906020840190612b95565b336000908152600c602052604090205460ff1661120e5760405162461bcd60e51b8152600401610898906134d4565b6000828152600d602052604090206005015460041161122c57600080fd5b600f54811061123a57600080fd5b6000828152600d6020908152604080832060058101805460018181018355828752858720909101879055600683018054918201815580875294862001859055938690526007015490517f44bc4425783fc482a00bdb0f9c767ed6666d073c213e1aac6944334139cdc5ac936112b59387939192909190613533565b60405180910390a15050565b6000818152600260205260408120546001600160a01b0316806106eb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610898565b6060806060600d600085815260200190815260200160002060030180548060200260200160405190810160405280929190818152602001828054801561139d57602002820191906000526020600020905b815481526020019060010190808311611389575b50505050509250600d600085815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561140457602002820191906000526020600020905b8154815260200190600101908083116113f0575b50505050509150600d600085815260200190815260200160002060060180548060200260200160405190810160405280929190818152602001828054801561146b57602002820191906000526020600020905b815481526020019060010190808311611457575b505050505090509193909250565b600f8181548110610e1557600080fd5b336000908152600b602052604090205460ff166114b85760405162461bcd60e51b815260040161089890613570565b60006114c360085490565b90506114cf8882612453565b604080516101a081019091526001808252602082019081526020018860018111156114fc576114fc613304565b8152602001600081526020018787808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250938552505050602080830191909152604080518783028181018401835288825291909301929188918891829190850190849080828437600092019190915250505090825250604080516003808252608082019092526020928301929091908201606080368337505050815260006020808301829052604080840183905260608401879052608084018390524260a090940193909352848252600d8152919020825181559082015160018083018054909160ff199091169083600281111561160057611600613304565b021790555060408201518160010160016101000a81548160ff0219169083600181111561162f5761162f613304565b02179055506060820151600282015560808201518051611659916003840191602090910190612c19565b5060a0820151600482015560c0820151805161167f916005840191602090910190612c19565b5060e0820151805161169b916006840191602090910190612c19565b5061010082015181600701556101208201518160080155610140820151816009015561016082015181600a015561018082015181600b01559050507f949c186f4d21590f6f863f2edcfe78ffabd266d90e039e31f591248e7293d7cb818888888888426040516117119796959493929190613699565b60405180910390a15050505050505050565b60006001600160a01b03821661178e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610898565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146117d45760405162461bcd60e51b815260040161089890613407565b6117de600061246d565b565b60138181548110610e1557600080fd5b606060018054610700906133cc565b336000908152600c602052604090205460ff1661182e5760405162461bcd60e51b8152600401610898906134d4565b6000828152600d6020526040902060019081018054839260ff199091169083600281111561185e5761185e613304565b02179055507f5c995f77fa8d563529d4606baf3f82b9a2a0863b21547460af71bf306b40478c82826040516112b59291906136e8565b610a733383836124bf565b600a546001600160a01b031633146118c95760405162461bcd60e51b815260040161089890613407565b60005b8151811015610a735760118282815181106118e9576118e961343c565b6020908102919091018101518254600181018455600093845292829020815161191b9491909101929190910190612b95565b5060125461192a906001612191565b6012558061193781613468565b9150506118cc565b336000908152600c602052604090205460ff1661196e5760405162461bcd60e51b8152600401610898906134d4565b601354811061197c57600080fd5b6000828152600d6020908152604091829020600a0183905581518481529081018390527f3df16d2579b03503680733096ee0edc9f0b19a7b0bacaf8b9f5f1a8065f40f7891016112b5565b336000908152600b602052604081205460ff166119f65760405162461bcd60e51b815260040161089890613570565b6000611a0160085490565b9050611a0d8482612453565b6040805160038082526080820190925260009160208201606080368337505060408051600680825260e0820190925292935060009291506020820160c0803683375050604080516101a081018252600180825260006020808401828152848601849052606085018390526080850188905260a0850183905260c085018a905260e085018a9052610100850183905261012085018d905261014085018390526101608501839052426101808601528a8352600d909152939020825181559251838201805496975092959394509260ff191690836002811115611af057611af0613304565b021790555060408201518160010160016101000a81548160ff02191690836001811115611b1f57611b1f613304565b02179055506060820151600282015560808201518051611b49916003840191602090910190612c19565b5060a0820151600482015560c08201518051611b6f916005840191602090910190612c19565b5060e08201518051611b8b916006840191602090910190612c19565b50610100820151600782015561012082015160088201556101408201516009820155610160820151600a82015561018090910151600b9091015560408051848152602081018790527f76a50a2571445f476aad443975bd07fbdcb3b698fd76925af39de8199afa30b7910160405180910390a15090949350505050565b336000908152600c602052604090205460ff16611c375760405162461bcd60e51b8152600401610898906134d4565b6000828152600d6020526040902060020154611c539082612191565b6000838152600d602052604090819020600201829055517ff508e4684789b7f1386e302b3b5e968326282704ea02b6e999db8e74af696b38916112b591859190918252602082015260400190565b611cab338361219d565b611cc75760405162461bcd60e51b815260040161089890613483565b611cd38484848461258e565b50505050565b6000818152600260205260409020546060906001600160a01b0316611d585760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610898565b6000611d626125c1565b90506000815111611d825760405180602001604052806000815250611dad565b80611d8c846125d0565b604051602001611d9d9291906136fc565b6040516020818303038152906040525b9392505050565b600a546001600160a01b03163314611dde5760405162461bcd60e51b815260040161089890613407565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b600a546001600160a01b03163314611e335760405162461bcd60e51b815260040161089890613407565b6001600160a01b038116611e985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610898565b611ea18161246d565b50565b336000908152600b602052604090205460ff16611ed35760405162461bcd60e51b815260040161089890613570565b6000828152600d602090815260409182902060090183905581518481529081018390527f031b01ee141c2702f148824223d0d2f4a853e04695cd58cfbb534405c056649d91016112b5565b336000908152600c602052604090205460ff16611f4d5760405162461bcd60e51b8152600401610898906134d4565b6000838152600d6020526040902060040154811115611f6b57600080fd5b6000838152600d602052604090206003018054611f9491839185908110610b1e57610b1e61343c565b6000848152600d60205260409020600301805484908110611fb757611fb761343c565b6000918252602080832090910192909255848152600d9091526040902060040154611fe2908261243b565b6000848152600d602052604090819020600481018390558054600782015492517fcccdd9eb97d287b56e6097aaf46463b7fff246807f95687ed66ef08315503cc394610bd794899460030192613630565b600a546001600160a01b0316331461205d5760405162461bcd60e51b815260040161089890613407565b60005b8151811015610a7357600f82828151811061207d5761207d61343c565b602090810291909101810151825460018101845560009384529282902081516120af9491909101929190910190612b95565b506010546120be906001612191565b601055806120cb81613468565b915050612060565b60006001600160e01b031982166380ac58cd60e01b148061210457506001600160e01b03198216635b5e139f60e01b145b806106eb57506301ffc9a760e01b6001600160e01b03198316146106eb565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612158826112c1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611dad828461372b565b6000818152600260205260408120546001600160a01b03166122165760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610898565b6000612221836112c1565b9050806001600160a01b0316846001600160a01b0316148061225c5750836001600160a01b031661225184610823565b6001600160a01b0316145b8061228c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166122a7826112c1565b6001600160a01b03161461230b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610898565b6001600160a01b03821661236d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610898565b6123788383836126ce565b612383600082612123565b6001600160a01b03831660009081526003602052604081208054600192906123ac908490613743565b90915550506001600160a01b03821660009081526003602052604081208054600192906123da90849061372b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611dad8284613743565b6000611dad828461375a565b610a73828260405180602001604052806000815250612786565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156125215760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610898565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612599848484612294565b6125a5848484846127b9565b611cd35760405162461bcd60e51b815260040161089890613779565b6060600e8054610700906133cc565b6060816125f45750506040805180820190915260018152600360fc1b602082015290565b8160005b811561261e578061260881613468565b91506126179050600a83613608565b91506125f8565b60008167ffffffffffffffff81111561263957612639612d80565b6040519080825280601f01601f191660200182016040528015612663576020820181803683370190505b5090505b841561228c57612678600183613743565b9150612685600a8661361c565b61269090603061372b565b60f81b8183815181106126a5576126a561343c565b60200101906001600160f81b031916908160001a9053506126c7600a86613608565b9450612667565b6001600160a01b0383166127295761272481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61274c565b816001600160a01b0316836001600160a01b03161461274c5761274c83826128b7565b6001600160a01b038216612763576109ce81612954565b826001600160a01b0316826001600160a01b0316146109ce576109ce8282612a03565b6127908383612a47565b61279d60008484846127b9565b6109ce5760405162461bcd60e51b815260040161089890613779565b60006001600160a01b0384163b156128ac57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127fd9033908990889088906004016137cb565b6020604051808303816000875af1925050508015612838575060408051601f3d908101601f19168201909252612835918101906137fe565b60015b612892573d808015612866576040519150601f19603f3d011682016040523d82523d6000602084013e61286b565b606091505b50805161288a5760405162461bcd60e51b815260040161089890613779565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061228c565b506001949350505050565b600060016128c484611723565b6128ce9190613743565b600083815260076020526040902054909150808214612921576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061296690600190613743565b6000838152600960205260408120546008805493945090928490811061298e5761298e61343c565b9060005260206000200154905080600883815481106129af576129af61343c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806129e7576129e761381b565b6001900381819060005260206000200160009055905550505050565b6000612a0e83611723565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612a9d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610898565b6000818152600260205260409020546001600160a01b031615612b025760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610898565b612b0e600083836126ce565b6001600160a01b0382166000908152600360205260408120805460019290612b3790849061372b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612ba1906133cc565b90600052602060002090601f016020900481019282612bc35760008555612c09565b82601f10612bdc57805160ff1916838001178555612c09565b82800160010185558215612c09579182015b82811115612c09578251825591602001919060010190612bee565b50612c15929150612c53565b5090565b828054828255906000526020600020908101928215612c095791602002820182811115612c09578251825591602001919060010190612bee565b5b80821115612c155760008155600101612c54565b6001600160e01b031981168114611ea157600080fd5b600060208284031215612c9057600080fd5b8135611dad81612c68565b60005b83811015612cb6578181015183820152602001612c9e565b83811115611cd35750506000910152565b60008151808452612cdf816020860160208601612c9b565b601f01601f19169290920160200192915050565b602081526000611dad6020830184612cc7565b600060208284031215612d1857600080fd5b5035919050565b80356001600160a01b0381168114612d3657600080fd5b919050565b600060208284031215612d4d57600080fd5b611dad82612d1f565b60008060408385031215612d6957600080fd5b612d7283612d1f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612dbf57612dbf612d80565b604052919050565b600067ffffffffffffffff821115612de157612de1612d80565b5060051b60200190565b600067ffffffffffffffff831115612e0557612e05612d80565b612e18601f8401601f1916602001612d96565b9050828152838383011115612e2c57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612e5457600080fd5b611dad83833560208501612deb565b60006020808385031215612e7657600080fd5b823567ffffffffffffffff80821115612e8e57600080fd5b818501915085601f830112612ea257600080fd5b8135612eb5612eb082612dc7565b612d96565b81815260059190911b83018401908481019088831115612ed457600080fd5b8585015b83811015612f0c57803585811115612ef05760008081fd5b612efe8b89838a0101612e43565b845250918601918601612ed8565b5098975050505050505050565b600080600060608486031215612f2e57600080fd5b612f3784612d1f565b9250612f4560208501612d1f565b9150604084013590509250925092565b600080600060608486031215612f6a57600080fd5b505081359360208301359350604090920135919050565b60008060408385031215612f9457600080fd5b612f9d83612d1f565b915060208301358015158114612fb257600080fd5b809150509250929050565b803560028110612d3657600080fd5b600082601f830112612fdd57600080fd5b81356020612fed612eb083612dc7565b82815260059290921b8401810191818101908684111561300c57600080fd5b8286015b848110156130275780358352918301918301613010565b509695505050505050565b6000806000806080858703121561304857600080fd5b8435935061305860208601612fbd565b9250604085013567ffffffffffffffff8082111561307557600080fd5b61308188838901612fcc565b9350606087013591508082111561309757600080fd5b506130a487828801612fcc565b91505092959194509250565b600080604083850312156130c357600080fd5b50508035926020909101359150565b6000602082840312156130e457600080fd5b813567ffffffffffffffff8111156130fb57600080fd5b61228c84828501612e43565b600081518084526020808501945080840160005b838110156131375781518752958201959082019060010161311b565b509495945050505050565b6060815260006131556060830186613107565b82810360208401526131678186613107565b9050828103604084015261317b8185613107565b9695505050505050565b60008083601f84011261319757600080fd5b50813567ffffffffffffffff8111156131af57600080fd5b6020830191508360208260051b85010111156131ca57600080fd5b9250929050565b600080600080600080600060a0888a0312156131ec57600080fd5b6131f588612d1f565b965061320360208901612fbd565b9550604088013567ffffffffffffffff8082111561322057600080fd5b61322c8b838c01613185565b909750955060608a013591508082111561324557600080fd5b506132528a828b01613185565b989b979a50959894979596608090950135949350505050565b6000806040838503121561327e57600080fd5b82359150602083013560038110612fb257600080fd5b600080600080608085870312156132aa57600080fd5b6132b385612d1f565b93506132c160208601612d1f565b925060408501359150606085013567ffffffffffffffff8111156132e457600080fd5b8501601f810187136132f557600080fd5b6130a487823560208401612deb565b634e487b7160e01b600052602160045260246000fd5b6003811061332a5761332a613304565b9052565b6002811061332a5761332a613304565b8a81526101408101613353602083018c61331a565b613360604083018b61332e565b6060820198909852608081019690965260a086019490945260c085019290925260e0840152610100830152610120909101529392505050565b600080604083850312156133ac57600080fd5b6133b583612d1f565b91506133c360208401612d1f565b90509250929050565b600181811c908216806133e057607f821691505b6020821081141561340157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561347c5761347c613452565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526010908201526f2737ba1020b832a6b7b234b334b2b91760811b604082015260600190565b6000815480845260208085019450836000528060002060005b8381101561313757815487529582019560019182019101613517565b84815260806020820152600061354c60808301866134fe565b828103604084015261355e81866134fe565b91505082606083015295945050505050565b6020808252601c908201527f43616c6c6572206d75737420626520612041706543726561746f722e00000000604082015260600190565b8581526135b7602082018661332e565b60a0604082015260006135cd60a0830186613107565b82810360608401526135df8186613107565b9150508260808301529695505050505050565b634e487b7160e01b600052601260045260246000fd5b600082613617576136176135f2565b500490565b60008261362b5761362b6135f2565b500690565b85815284602082015260a06040820152600061364f60a08301866134fe565b606083019490945250608001529392505050565b81835260006001600160fb1b0383111561367c57600080fd5b8260051b8083602087013760009401602001938452509192915050565b8781526136a9602082018861332e565b60a0604082015260006136c060a083018789613663565b82810360608401526136d3818688613663565b91505082608083015298975050505050505050565b82815260408101611dad602083018461331a565b6000835161370e818460208801612c9b565b835190830190613722818360208801612c9b565b01949350505050565b6000821982111561373e5761373e613452565b500190565b60008282101561375557613755613452565b500390565b600081600019048311821515161561377457613774613452565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061317b90830184612cc7565b60006020828403121561381057600080fd5b8151611dad81612c68565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220c28e837c89a2345f8255cb532fe638dce8e3af4ef2861826b66ce294856ae35064736f6c634300080c0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000084241535f4150455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034150450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000008537472656e67746800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074167696c69747900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c496e74656c6c6967656e6365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075374616d696e610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044c75636b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084272656564696e67000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102955760003560e01c80636776be7511610167578063b0d04dea116100ce578063d100567511610087578063d10056751461062b578063e985e9c51461063e578063f2fde38b1461067a578063f355d70b1461068d578063f6ecede0146106a0578063f85781d3146106b357600080fd5b8063b0d04dea1461055c578063b2f5e2851461056f578063b68a2ba914610582578063b88d4fde14610595578063c87b56dd146105a8578063cc474967146105bb57600080fd5b806390180f911161012057806390180f91146104ff578063923a34ba1461051257806395d89b411461051b578063965ff5bc14610523578063a22cb46514610536578063a9e99e431461054957600080fd5b80636776be75146104ae57806370a08231146104c1578063715018a6146104d457806377e2eaec146104dc57806385202a15146104e55780638da5cb5b146104ee57600080fd5b80632f745c591161020b57806355f804b3116101c457806355f804b31461041d57806356306c021461043057806356aadf1c146104435780636352211e1461046657806365ec494d14610479578063663f24681461049b57600080fd5b80632f745c59146103ab5780634262cfb7146103be57806342842e0e146103d157806342949c51146103e45780634f6ccce7146103f75780635226dc931461040a57600080fd5b8063095ea7b31161025d578063095ea7b3146103385780631298ff431461034d57806318160ddd1461036057806323b872dd1461037257806327b1fded1461038557806329a26d101461039857600080fd5b806301ffc9a71461029a57806306fdde03146102c257806307cf4e9d146102d7578063081812fc146102ea5780630847c61414610315575b600080fd5b6102ad6102a8366004612c7e565b6106c6565b60405190151581526020015b60405180910390f35b6102ca6106f1565b6040516102b99190612cf3565b6102ca6102e5366004612d06565b610783565b6102fd6102f8366004612d06565b610823565b6040516001600160a01b0390911681526020016102b9565b6102ad610323366004612d3b565b600b6020526000908152604090205460ff1681565b61034b610346366004612d56565b6108bd565b005b61034b61035b366004612e63565b6109d3565b6008545b6040519081526020016102b9565b61034b610380366004612f19565b610a77565b61034b610393366004612f55565b610aa8565b61034b6103a6366004612f81565b610be4565b6103646103b9366004612d56565b610c39565b61034b6103cc366004613032565b610ccf565b61034b6103df366004612f19565b610dea565b6102ca6103f2366004612d06565b610e05565b610364610405366004612d06565b610e30565b61034b6104183660046130b0565b610ec3565b61034b61042b3660046130d2565b6111a2565b61034b61043e3660046130b0565b6111df565b6102ad610451366004612d3b565b600c6020526000908152604090205460ff1681565b6102fd610474366004612d06565b6112c1565b61048c610487366004612d06565b611338565b6040516102b993929190613142565b6102ca6104a9366004612d06565b611479565b61034b6104bc3660046131d1565b611489565b6103646104cf366004612d3b565b611723565b61034b6117aa565b61036460145481565b61036460125481565b600a546001600160a01b03166102fd565b6102ca61050d366004612d06565b6117e0565b61036460105481565b6102ca6117f0565b61034b61053136600461326b565b6117ff565b61034b610544366004612f81565b611894565b61034b610557366004612e63565b61189f565b61034b61056a3660046130b0565b61193f565b61036461057d366004612d56565b6119c7565b61034b6105903660046130b0565b611c08565b61034b6105a3366004613294565b611ca1565b6102ca6105b6366004612d06565b611cd9565b6106156105c9366004612d06565b600d6020526000908152604090208054600182015460028301546004840154600785015460088601546009870154600a880154600b90980154969760ff8088169861010090980416968a565b6040516102b99a9998979695949392919061333e565b61034b610639366004612f81565b611db4565b6102ad61064c366004613399565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61034b610688366004612d3b565b611e09565b61034b61069b3660046130b0565b611ea4565b61034b6106ae366004612f55565b611f1e565b61034b6106c1366004612e63565b612033565b60006001600160e01b0319821663780e9d6360e01b14806106eb57506106eb826120d3565b92915050565b606060008054610700906133cc565b80601f016020809104026020016040519081016040528092919081815260200182805461072c906133cc565b80156107795780601f1061074e57610100808354040283529160200191610779565b820191906000526020600020905b81548152906001019060200180831161075c57829003601f168201915b5050505050905090565b6015816006811061079357600080fd5b0180549091506107a2906133cc565b80601f01602080910402602001604051908101604052809291908181526020018280546107ce906133cc565b801561081b5780601f106107f05761010080835404028352916020019161081b565b820191906000526020600020905b8154815290600101906020018083116107fe57829003601f168201915b505050505081565b6000818152600260205260408120546001600160a01b03166108a15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108c8826112c1565b9050806001600160a01b0316836001600160a01b031614156109365760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610898565b336001600160a01b03821614806109525750610952813361064c565b6109c45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610898565b6109ce8383612123565b505050565b600a546001600160a01b031633146109fd5760405162461bcd60e51b815260040161089890613407565b60005b8151811015610a73576013828281518110610a1d57610a1d61343c565b60209081029190910181015182546001810184556000938452928290208151610a4f9491909101929190910190612b95565b50601454610a5e906001612191565b60145580610a6b81613468565b915050610a00565b5050565b610a81338261219d565b610a9d5760405162461bcd60e51b815260040161089890613483565b6109ce838383612294565b336000908152600c602052604090205460ff16610ad75760405162461bcd60e51b8152600401610898906134d4565b6000838152600d6020526040902060070154811115610af557600080fd5b6000838152600d602052604090206006018054610b3791839185908110610b1e57610b1e61343c565b906000526020600020015461219190919063ffffffff16565b6000848152600d60205260409020600601805484908110610b5a57610b5a61343c565b6000918252602080832090910192909255848152600d9091526040902060070154610b85908261243b565b6000848152600d6020526040908190206007810183905590517f44bc4425783fc482a00bdb0f9c767ed6666d073c213e1aac6944334139cdc5ac92610bd7928792600582019260069092019190613533565b60405180910390a1505050565b600a546001600160a01b03163314610c0e5760405162461bcd60e51b815260040161089890613407565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b6000610c4483611723565b8210610ca65760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610898565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b336000908152600b602052604090205460ff16610cfe5760405162461bcd60e51b815260040161089890613570565b6000848152600d602052604090206001908101805460ff19811683178255859261ffff19909116811790610100908490811115610d3d57610d3d613304565b02179055506000848152600d602090815260409091208351610d6792600390920191850190612c19565b506000848152600d602090815260409091208251610d8d92600590920191840190612c19565b506000848152600d60205260409081902042600b90910181905590517f949c186f4d21590f6f863f2edcfe78ffabd266d90e039e31f591248e7293d7cb91610ddc9187918791879187916135a7565b60405180910390a150505050565b6109ce83838360405180602001604052806000815250611ca1565b60118181548110610e1557600080fd5b9060005260206000200160009150905080546107a2906133cc565b6000610e3b60085490565b8210610e9e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610898565b60088281548110610eb157610eb161343c565b90600052602060002001549050919050565b336000908152600c602052604090205460ff16610ef25760405162461bcd60e51b8152600401610898906134d4565b6000828152600d60205260409020547f000000000000000000000000000000000000000000000000000000000000009690610f2d9083612191565b1115610f3857600080fd5b6000828152600d6020526040902054610f519082612191565b6000838152600d6020526040812091909155610f6e600583613608565b90506000610f7d600a84613608565b9050610fa5610f8d836003612447565b6000868152600d602052604090206004015490612191565b6000858152600d6020526040902060040155610fdd610fc5826002612447565b6000868152600d602052604090206007015490612191565b6000858152600d6020526040902060070155610ffa60058461361c565b1580159061102057506000848152600d602052604090205461101e9060059061361c565b155b8061106957506000848152600d60205260409020546110419060059061361c565b6000858152600d602052604090205460059061105d908661243b565b611067919061361c565b115b1561109e576000848152600d602052604090206004015461108b906003612191565b6000858152600d60205260409020600401555b6110a9600a8461361c565b158015906110cf57506000848152600d60205260409020546110cd90600a9061361c565b155b8061111857506000848152600d60205260409020546110f090600a9061361c565b6000858152600d6020526040902054600a9061110c908661243b565b611116919061361c565b115b1561114d576000848152600d602052604090206007015461113a906002612191565b6000858152600d60205260409020600701555b6000848152600d60205260409081902080546004820154600783015493517fcccdd9eb97d287b56e6097aaf46463b7fff246807f95687ed66ef08315503cc394610ddc948a9493600390910192909190613630565b600a546001600160a01b031633146111cc5760405162461bcd60e51b815260040161089890613407565b8051610a7390600e906020840190612b95565b336000908152600c602052604090205460ff1661120e5760405162461bcd60e51b8152600401610898906134d4565b6000828152600d602052604090206005015460041161122c57600080fd5b600f54811061123a57600080fd5b6000828152600d6020908152604080832060058101805460018181018355828752858720909101879055600683018054918201815580875294862001859055938690526007015490517f44bc4425783fc482a00bdb0f9c767ed6666d073c213e1aac6944334139cdc5ac936112b59387939192909190613533565b60405180910390a15050565b6000818152600260205260408120546001600160a01b0316806106eb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610898565b6060806060600d600085815260200190815260200160002060030180548060200260200160405190810160405280929190818152602001828054801561139d57602002820191906000526020600020905b815481526020019060010190808311611389575b50505050509250600d600085815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561140457602002820191906000526020600020905b8154815260200190600101908083116113f0575b50505050509150600d600085815260200190815260200160002060060180548060200260200160405190810160405280929190818152602001828054801561146b57602002820191906000526020600020905b815481526020019060010190808311611457575b505050505090509193909250565b600f8181548110610e1557600080fd5b336000908152600b602052604090205460ff166114b85760405162461bcd60e51b815260040161089890613570565b60006114c360085490565b90506114cf8882612453565b604080516101a081019091526001808252602082019081526020018860018111156114fc576114fc613304565b8152602001600081526020018787808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250938552505050602080830191909152604080518783028181018401835288825291909301929188918891829190850190849080828437600092019190915250505090825250604080516003808252608082019092526020928301929091908201606080368337505050815260006020808301829052604080840183905260608401879052608084018390524260a090940193909352848252600d8152919020825181559082015160018083018054909160ff199091169083600281111561160057611600613304565b021790555060408201518160010160016101000a81548160ff0219169083600181111561162f5761162f613304565b02179055506060820151600282015560808201518051611659916003840191602090910190612c19565b5060a0820151600482015560c0820151805161167f916005840191602090910190612c19565b5060e0820151805161169b916006840191602090910190612c19565b5061010082015181600701556101208201518160080155610140820151816009015561016082015181600a015561018082015181600b01559050507f949c186f4d21590f6f863f2edcfe78ffabd266d90e039e31f591248e7293d7cb818888888888426040516117119796959493929190613699565b60405180910390a15050505050505050565b60006001600160a01b03821661178e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610898565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146117d45760405162461bcd60e51b815260040161089890613407565b6117de600061246d565b565b60138181548110610e1557600080fd5b606060018054610700906133cc565b336000908152600c602052604090205460ff1661182e5760405162461bcd60e51b8152600401610898906134d4565b6000828152600d6020526040902060019081018054839260ff199091169083600281111561185e5761185e613304565b02179055507f5c995f77fa8d563529d4606baf3f82b9a2a0863b21547460af71bf306b40478c82826040516112b59291906136e8565b610a733383836124bf565b600a546001600160a01b031633146118c95760405162461bcd60e51b815260040161089890613407565b60005b8151811015610a735760118282815181106118e9576118e961343c565b6020908102919091018101518254600181018455600093845292829020815161191b9491909101929190910190612b95565b5060125461192a906001612191565b6012558061193781613468565b9150506118cc565b336000908152600c602052604090205460ff1661196e5760405162461bcd60e51b8152600401610898906134d4565b601354811061197c57600080fd5b6000828152600d6020908152604091829020600a0183905581518481529081018390527f3df16d2579b03503680733096ee0edc9f0b19a7b0bacaf8b9f5f1a8065f40f7891016112b5565b336000908152600b602052604081205460ff166119f65760405162461bcd60e51b815260040161089890613570565b6000611a0160085490565b9050611a0d8482612453565b6040805160038082526080820190925260009160208201606080368337505060408051600680825260e0820190925292935060009291506020820160c0803683375050604080516101a081018252600180825260006020808401828152848601849052606085018390526080850188905260a0850183905260c085018a905260e085018a9052610100850183905261012085018d905261014085018390526101608501839052426101808601528a8352600d909152939020825181559251838201805496975092959394509260ff191690836002811115611af057611af0613304565b021790555060408201518160010160016101000a81548160ff02191690836001811115611b1f57611b1f613304565b02179055506060820151600282015560808201518051611b49916003840191602090910190612c19565b5060a0820151600482015560c08201518051611b6f916005840191602090910190612c19565b5060e08201518051611b8b916006840191602090910190612c19565b50610100820151600782015561012082015160088201556101408201516009820155610160820151600a82015561018090910151600b9091015560408051848152602081018790527f76a50a2571445f476aad443975bd07fbdcb3b698fd76925af39de8199afa30b7910160405180910390a15090949350505050565b336000908152600c602052604090205460ff16611c375760405162461bcd60e51b8152600401610898906134d4565b6000828152600d6020526040902060020154611c539082612191565b6000838152600d602052604090819020600201829055517ff508e4684789b7f1386e302b3b5e968326282704ea02b6e999db8e74af696b38916112b591859190918252602082015260400190565b611cab338361219d565b611cc75760405162461bcd60e51b815260040161089890613483565b611cd38484848461258e565b50505050565b6000818152600260205260409020546060906001600160a01b0316611d585760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610898565b6000611d626125c1565b90506000815111611d825760405180602001604052806000815250611dad565b80611d8c846125d0565b604051602001611d9d9291906136fc565b6040516020818303038152906040525b9392505050565b600a546001600160a01b03163314611dde5760405162461bcd60e51b815260040161089890613407565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b600a546001600160a01b03163314611e335760405162461bcd60e51b815260040161089890613407565b6001600160a01b038116611e985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610898565b611ea18161246d565b50565b336000908152600b602052604090205460ff16611ed35760405162461bcd60e51b815260040161089890613570565b6000828152600d602090815260409182902060090183905581518481529081018390527f031b01ee141c2702f148824223d0d2f4a853e04695cd58cfbb534405c056649d91016112b5565b336000908152600c602052604090205460ff16611f4d5760405162461bcd60e51b8152600401610898906134d4565b6000838152600d6020526040902060040154811115611f6b57600080fd5b6000838152600d602052604090206003018054611f9491839185908110610b1e57610b1e61343c565b6000848152600d60205260409020600301805484908110611fb757611fb761343c565b6000918252602080832090910192909255848152600d9091526040902060040154611fe2908261243b565b6000848152600d602052604090819020600481018390558054600782015492517fcccdd9eb97d287b56e6097aaf46463b7fff246807f95687ed66ef08315503cc394610bd794899460030192613630565b600a546001600160a01b0316331461205d5760405162461bcd60e51b815260040161089890613407565b60005b8151811015610a7357600f82828151811061207d5761207d61343c565b602090810291909101810151825460018101845560009384529282902081516120af9491909101929190910190612b95565b506010546120be906001612191565b601055806120cb81613468565b915050612060565b60006001600160e01b031982166380ac58cd60e01b148061210457506001600160e01b03198216635b5e139f60e01b145b806106eb57506301ffc9a760e01b6001600160e01b03198316146106eb565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612158826112c1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611dad828461372b565b6000818152600260205260408120546001600160a01b03166122165760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610898565b6000612221836112c1565b9050806001600160a01b0316846001600160a01b0316148061225c5750836001600160a01b031661225184610823565b6001600160a01b0316145b8061228c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166122a7826112c1565b6001600160a01b03161461230b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610898565b6001600160a01b03821661236d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610898565b6123788383836126ce565b612383600082612123565b6001600160a01b03831660009081526003602052604081208054600192906123ac908490613743565b90915550506001600160a01b03821660009081526003602052604081208054600192906123da90849061372b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611dad8284613743565b6000611dad828461375a565b610a73828260405180602001604052806000815250612786565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156125215760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610898565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612599848484612294565b6125a5848484846127b9565b611cd35760405162461bcd60e51b815260040161089890613779565b6060600e8054610700906133cc565b6060816125f45750506040805180820190915260018152600360fc1b602082015290565b8160005b811561261e578061260881613468565b91506126179050600a83613608565b91506125f8565b60008167ffffffffffffffff81111561263957612639612d80565b6040519080825280601f01601f191660200182016040528015612663576020820181803683370190505b5090505b841561228c57612678600183613743565b9150612685600a8661361c565b61269090603061372b565b60f81b8183815181106126a5576126a561343c565b60200101906001600160f81b031916908160001a9053506126c7600a86613608565b9450612667565b6001600160a01b0383166127295761272481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61274c565b816001600160a01b0316836001600160a01b03161461274c5761274c83826128b7565b6001600160a01b038216612763576109ce81612954565b826001600160a01b0316826001600160a01b0316146109ce576109ce8282612a03565b6127908383612a47565b61279d60008484846127b9565b6109ce5760405162461bcd60e51b815260040161089890613779565b60006001600160a01b0384163b156128ac57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127fd9033908990889088906004016137cb565b6020604051808303816000875af1925050508015612838575060408051601f3d908101601f19168201909252612835918101906137fe565b60015b612892573d808015612866576040519150601f19603f3d011682016040523d82523d6000602084013e61286b565b606091505b50805161288a5760405162461bcd60e51b815260040161089890613779565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061228c565b506001949350505050565b600060016128c484611723565b6128ce9190613743565b600083815260076020526040902054909150808214612921576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061296690600190613743565b6000838152600960205260408120546008805493945090928490811061298e5761298e61343c565b9060005260206000200154905080600883815481106129af576129af61343c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806129e7576129e761381b565b6001900381819060005260206000200160009055905550505050565b6000612a0e83611723565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612a9d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610898565b6000818152600260205260409020546001600160a01b031615612b025760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610898565b612b0e600083836126ce565b6001600160a01b0382166000908152600360205260408120805460019290612b3790849061372b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612ba1906133cc565b90600052602060002090601f016020900481019282612bc35760008555612c09565b82601f10612bdc57805160ff1916838001178555612c09565b82800160010185558215612c09579182015b82811115612c09578251825591602001919060010190612bee565b50612c15929150612c53565b5090565b828054828255906000526020600020908101928215612c095791602002820182811115612c09578251825591602001919060010190612bee565b5b80821115612c155760008155600101612c54565b6001600160e01b031981168114611ea157600080fd5b600060208284031215612c9057600080fd5b8135611dad81612c68565b60005b83811015612cb6578181015183820152602001612c9e565b83811115611cd35750506000910152565b60008151808452612cdf816020860160208601612c9b565b601f01601f19169290920160200192915050565b602081526000611dad6020830184612cc7565b600060208284031215612d1857600080fd5b5035919050565b80356001600160a01b0381168114612d3657600080fd5b919050565b600060208284031215612d4d57600080fd5b611dad82612d1f565b60008060408385031215612d6957600080fd5b612d7283612d1f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612dbf57612dbf612d80565b604052919050565b600067ffffffffffffffff821115612de157612de1612d80565b5060051b60200190565b600067ffffffffffffffff831115612e0557612e05612d80565b612e18601f8401601f1916602001612d96565b9050828152838383011115612e2c57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612e5457600080fd5b611dad83833560208501612deb565b60006020808385031215612e7657600080fd5b823567ffffffffffffffff80821115612e8e57600080fd5b818501915085601f830112612ea257600080fd5b8135612eb5612eb082612dc7565b612d96565b81815260059190911b83018401908481019088831115612ed457600080fd5b8585015b83811015612f0c57803585811115612ef05760008081fd5b612efe8b89838a0101612e43565b845250918601918601612ed8565b5098975050505050505050565b600080600060608486031215612f2e57600080fd5b612f3784612d1f565b9250612f4560208501612d1f565b9150604084013590509250925092565b600080600060608486031215612f6a57600080fd5b505081359360208301359350604090920135919050565b60008060408385031215612f9457600080fd5b612f9d83612d1f565b915060208301358015158114612fb257600080fd5b809150509250929050565b803560028110612d3657600080fd5b600082601f830112612fdd57600080fd5b81356020612fed612eb083612dc7565b82815260059290921b8401810191818101908684111561300c57600080fd5b8286015b848110156130275780358352918301918301613010565b509695505050505050565b6000806000806080858703121561304857600080fd5b8435935061305860208601612fbd565b9250604085013567ffffffffffffffff8082111561307557600080fd5b61308188838901612fcc565b9350606087013591508082111561309757600080fd5b506130a487828801612fcc565b91505092959194509250565b600080604083850312156130c357600080fd5b50508035926020909101359150565b6000602082840312156130e457600080fd5b813567ffffffffffffffff8111156130fb57600080fd5b61228c84828501612e43565b600081518084526020808501945080840160005b838110156131375781518752958201959082019060010161311b565b509495945050505050565b6060815260006131556060830186613107565b82810360208401526131678186613107565b9050828103604084015261317b8185613107565b9695505050505050565b60008083601f84011261319757600080fd5b50813567ffffffffffffffff8111156131af57600080fd5b6020830191508360208260051b85010111156131ca57600080fd5b9250929050565b600080600080600080600060a0888a0312156131ec57600080fd5b6131f588612d1f565b965061320360208901612fbd565b9550604088013567ffffffffffffffff8082111561322057600080fd5b61322c8b838c01613185565b909750955060608a013591508082111561324557600080fd5b506132528a828b01613185565b989b979a50959894979596608090950135949350505050565b6000806040838503121561327e57600080fd5b82359150602083013560038110612fb257600080fd5b600080600080608085870312156132aa57600080fd5b6132b385612d1f565b93506132c160208601612d1f565b925060408501359150606085013567ffffffffffffffff8111156132e457600080fd5b8501601f810187136132f557600080fd5b6130a487823560208401612deb565b634e487b7160e01b600052602160045260246000fd5b6003811061332a5761332a613304565b9052565b6002811061332a5761332a613304565b8a81526101408101613353602083018c61331a565b613360604083018b61332e565b6060820198909852608081019690965260a086019490945260c085019290925260e0840152610100830152610120909101529392505050565b600080604083850312156133ac57600080fd5b6133b583612d1f565b91506133c360208401612d1f565b90509250929050565b600181811c908216806133e057607f821691505b6020821081141561340157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561347c5761347c613452565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526010908201526f2737ba1020b832a6b7b234b334b2b91760811b604082015260600190565b6000815480845260208085019450836000528060002060005b8381101561313757815487529582019560019182019101613517565b84815260806020820152600061354c60808301866134fe565b828103604084015261355e81866134fe565b91505082606083015295945050505050565b6020808252601c908201527f43616c6c6572206d75737420626520612041706543726561746f722e00000000604082015260600190565b8581526135b7602082018661332e565b60a0604082015260006135cd60a0830186613107565b82810360608401526135df8186613107565b9150508260808301529695505050505050565b634e487b7160e01b600052601260045260246000fd5b600082613617576136176135f2565b500490565b60008261362b5761362b6135f2565b500690565b85815284602082015260a06040820152600061364f60a08301866134fe565b606083019490945250608001529392505050565b81835260006001600160fb1b0383111561367c57600080fd5b8260051b8083602087013760009401602001938452509192915050565b8781526136a9602082018861332e565b60a0604082015260006136c060a083018789613663565b82810360608401526136d3818688613663565b91505082608083015298975050505050505050565b82815260408101611dad602083018461331a565b6000835161370e818460208801612c9b565b835190830190613722818360208801612c9b565b01949350505050565b6000821982111561373e5761373e613452565b500190565b60008282101561375557613755613452565b500390565b600081600019048311821515161561377457613774613452565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061317b90830184612cc7565b60006020828403121561381057600080fd5b8151611dad81612c68565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220c28e837c89a2345f8255cb532fe638dce8e3af4ef2861826b66ce294856ae35064736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000084241535f4150455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034150450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000008537472656e67746800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074167696c69747900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c496e74656c6c6967656e6365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075374616d696e610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044c75636b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084272656564696e67000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): BAS_APES
Arg [1] : symbol (string): APE
Arg [2] : _ApeStats (string[]): Strength,Agility,Intelligence,Stamina,Luck,Breeding
-----Encoded View---------------
26 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 4241535f41504553000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 4150450000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [12] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [15] : 537472656e677468000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [17] : 4167696c69747900000000000000000000000000000000000000000000000000
Arg [18] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [19] : 496e74656c6c6967656e63650000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [21] : 5374616d696e6100000000000000000000000000000000000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [23] : 4c75636b00000000000000000000000000000000000000000000000000000000
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [25] : 4272656564696e67000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
54138:9467:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46341:224;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;46341:224:0;;;;;;;;33161:100;;;:::i;:::-;;;;;;;:::i;55649:25::-;;;;;;:::i;:::-;;:::i;34720:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;34720:221:0;1528:203:1;53428:42:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;34243:411;;;;;;:::i;:::-;;:::i;:::-;;57070:252;;;;;;:::i;:::-;;:::i;46981:113::-;47069:10;:17;46981:113;;;4885:25:1;;;4873:2;4858:18;46981:113:0;4739:177:1;35470:339:0;;;;;;:::i;:::-;;:::i;61291:493::-;;;;;;:::i;:::-;;:::i;53878:122::-;;;;;;:::i;:::-;;:::i;46649:256::-;;;;;;:::i;:::-;;:::i;58861:456::-;;;;;;:::i;:::-;;:::i;35880:185::-;;;;;;:::i;:::-;;:::i;55511:24::-;;;;;;:::i;:::-;;:::i;47171:233::-;;;;;;:::i;:::-;;:::i;59382:1245::-;;;;;;:::i;:::-;;:::i;56012:103::-;;;;;;:::i;:::-;;:::i;61850:431::-;;;;;;:::i;:::-;;:::i;53477:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;32855:239;;;;;;:::i;:::-;;:::i;63303:296::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;55446:25::-;;;;;;:::i;:::-;;:::i;58178:425::-;;;;;;:::i;:::-;;:::i;32585:208::-;;;;;;:::i;:::-;;:::i;11757:103::-;;;:::i;55611:31::-;;;;;;55542:28;;;;;;11106:87;11179:6;;-1:-1:-1;;;;;11179:6:0;11106:87;;55577:27;;;;;;:::i;:::-;;:::i;55478:26::-;;;;;;33330:104;;;:::i;62674:173::-;;;;;;:::i;:::-;;:::i;35013:155::-;;;;;;:::i;:::-;;:::i;56755:237::-;;;;;;:::i;:::-;;:::i;62921:278::-;;;;;;:::i;:::-;;:::i;57411:476::-;;;;;;:::i;:::-;;:::i;62352:254::-;;;;;;:::i;:::-;;:::i;36136:328::-;;;;;;:::i;:::-;;:::i;33505:334::-;;;;;;:::i;:::-;;:::i;54737:38::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54008:123::-;;;;;;:::i;:::-;;:::i;35239:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;35360:25:0;;;35336:4;35360:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;35239:164;12015:201;;;;;;:::i;:::-;;:::i;57965:152::-;;;;;;:::i;:::-;;:::i;60710:497::-;;;;;;:::i;:::-;;:::i;56428:235::-;;;;;;:::i;:::-;;:::i;46341:224::-;46443:4;-1:-1:-1;;;;;;46467:50:0;;-1:-1:-1;;;46467:50:0;;:90;;;46521:36;46545:11;46521:23;:36::i;:::-;46460:97;46341:224;-1:-1:-1;;46341:224:0:o;33161:100::-;33215:13;33248:5;33241:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33161:100;:::o;55649:25::-;;;;;;;;;;;;;;;;;-1:-1:-1;55649:25:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34720:221::-;34796:7;38063:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38063:16:0;34816:73;;;;-1:-1:-1;;;34816:73:0;;13770:2:1;34816:73:0;;;13752:21:1;13809:2;13789:18;;;13782:30;13848:34;13828:18;;;13821:62;-1:-1:-1;;;13899:18:1;;;13892:42;13951:19;;34816:73:0;;;;;;;;;-1:-1:-1;34909:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34909:24:0;;34720:221::o;34243:411::-;34324:13;34340:23;34355:7;34340:14;:23::i;:::-;34324:39;;34388:5;-1:-1:-1;;;;;34382:11:0;:2;-1:-1:-1;;;;;34382:11:0;;;34374:57;;;;-1:-1:-1;;;34374:57:0;;14183:2:1;34374:57:0;;;14165:21:1;14222:2;14202:18;;;14195:30;14261:34;14241:18;;;14234:62;-1:-1:-1;;;14312:18:1;;;14305:31;14353:19;;34374:57:0;13981:397:1;34374:57:0;9910:10;-1:-1:-1;;;;;34466:21:0;;;;:62;;-1:-1:-1;34491:37:0;34508:5;9910:10;35239:164;:::i;34491:37::-;34444:168;;;;-1:-1:-1;;;34444:168:0;;14585:2:1;34444:168:0;;;14567:21:1;14624:2;14604:18;;;14597:30;14663:34;14643:18;;;14636:62;14734:26;14714:18;;;14707:54;14778:19;;34444:168:0;14383:420:1;34444:168:0;34625:21;34634:2;34638:7;34625:8;:21::i;:::-;34313:341;34243:411;;:::o;57070:252::-;11179:6;;-1:-1:-1;;;;;11179:6:0;9910:10;11326:23;11318:68;;;;-1:-1:-1;;;11318:68:0;;;;;;;:::i;:::-;57157:6:::1;57153:162;57169:11;:18;57165:1;:22;57153:162;;;57208:11;57225;57237:1;57225:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;57208:32;;::::1;::::0;::::1;::::0;;-1:-1:-1;57208:32:0;;;;;;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;57277:19:0::1;::::0;:26:::1;::::0;57301:1:::1;57277:23;:26::i;:::-;57255:19;:48:::0;57189:3;::::1;::::0;::::1;:::i;:::-;;;;57153:162;;;;57070:252:::0;:::o;35470:339::-;35665:41;9910:10;35698:7;35665:18;:41::i;:::-;35657:103;;;;-1:-1:-1;;;35657:103:0;;;;;;;:::i;:::-;35773:28;35783:4;35789:2;35793:7;35773:9;:28::i;61291:493::-;53818:10;53806:23;;;;:11;:23;;;;;;;;53798:52;;;;-1:-1:-1;;;53798:52:0;;;;;;;:::i;:::-;61402:20:::1;::::0;;;:10:::1;:20;::::0;;;;:33:::1;;::::0;61392:43;::::1;;61384:52;;;::::0;::::1;;61490:20;::::0;;;:10:::1;:20;::::0;;;;:33:::1;;:40:::0;;:52:::1;::::0;61535:6;;61524:5;;61490:40;::::1;;;;;:::i;:::-;;;;;;;;;:44;;:52;;;;:::i;:::-;61447:20;::::0;;;:10:::1;:20;::::0;;;;:33:::1;;:40:::0;;61481:5;;61447:40;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;:95:::0;;;;61589:20;;;:10:::1;:20:::0;;;;;;:33:::1;;::::0;:45:::1;::::0;61627:6;61589:37:::1;:45::i;:::-;61553:20;::::0;;;:10:::1;:20;::::0;;;;;;:33:::1;::::0;::::1;:81:::0;;;61652:124;;::::1;::::0;::::1;::::0;61564:8;;61678:27:::1;::::0;::::1;::::0;61707:33:::1;::::0;;::::1;::::0;61553:81;61652:124:::1;:::i;:::-;;;;;;;;61291:493:::0;;;:::o;53878:122::-;11179:6;;-1:-1:-1;;;;;11179:6:0;9910:10;11326:23;11318:68;;;;-1:-1:-1;;;11318:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53963:20:0;;;::::1;;::::0;;;:10:::1;:20;::::0;;;;:29;;-1:-1:-1;;53963:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53878:122::o;46649:256::-;46746:7;46782:23;46799:5;46782:16;:23::i;:::-;46774:5;:31;46766:87;;;;-1:-1:-1;;;46766:87:0;;17636:2:1;46766:87:0;;;17618:21:1;17675:2;17655:18;;;17648:30;17714:34;17694:18;;;17687:62;-1:-1:-1;;;17765:18:1;;;17758:41;17816:19;;46766:87:0;17434:407:1;46766:87:0;-1:-1:-1;;;;;;46871:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;46649:256::o;58861:456::-;53679:10;53668:22;;;;:10;:22;;;;;;;;53660:63;;;;-1:-1:-1;;;53660:63:0;;;;;;;:::i;:::-;58990:20:::1;::::0;;;:10:::1;:20;::::0;;;;59019:14:::1;58990:26:::0;;::::1;:43:::0;;-1:-1:-1;;58990:43:0;::::1;::::0;::::1;::::0;;59074:7;;-1:-1:-1;;59044:37:0;;;;;;::::1;::::0;59074:7;;59044:37;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;59092:20:0::1;::::0;;;:10:::1;:20;::::0;;;;;;;:35;;::::1;::::0;:26:::1;::::0;;::::1;::::0;:35;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;59138:20:0::1;::::0;;;:10:::1;:20;::::0;;;;;;;:37;;::::1;::::0;:27:::1;::::0;;::::1;::::0;:37;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;59186:20:0::1;::::0;;;:10:::1;:20;::::0;;;;;;59215:15:::1;59186:26;::::0;;::::1;:44:::0;;;59246:63;;::::1;::::0;::::1;::::0;59197:8;;59267:7;;59276:6;;59284:7;;59246:63:::1;:::i;:::-;;;;;;;;58861:456:::0;;;;:::o;35880:185::-;36018:39;36035:4;36041:2;36045:7;36018:39;;;;;;;;;;;;:16;:39::i;55511:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47171:233::-;47246:7;47282:30;47069:10;:17;;46981:113;47282:30;47274:5;:38;47266:95;;;;-1:-1:-1;;;47266:95:0;;19122:2:1;47266:95:0;;;19104:21:1;19161:2;19141:18;;;19134:30;19200:34;19180:18;;;19173:62;-1:-1:-1;;;19251:18:1;;;19244:42;19303:19;;47266:95:0;18920:408:1;47266:95:0;47379:10;47390:5;47379:17;;;;;;;;:::i;:::-;;;;;;;;;47372:24;;47171:233;;;:::o;59382:1245::-;53818:10;53806:23;;;;:11;:23;;;;;;;;53798:52;;;;-1:-1:-1;;;53798:52:0;;;;;;;:::i;:::-;59466:20:::1;::::0;;;:10:::1;:20;::::0;;;;:26;59508:8:::1;::::0;59466:38:::1;::::0;59497:6;59466:30:::1;:38::i;:::-;:50;;59458:59;;;::::0;::::1;;59559:20;::::0;;;:10:::1;:20;::::0;;;;:26;:38:::1;::::0;59590:6;59559:30:::1;:38::i;:::-;59530:20;::::0;;;:10:::1;:20;::::0;;;;:67;;;;59633:8:::1;59640:1;59633:6:::0;:8:::1;:::i;:::-;59611:30:::0;-1:-1:-1;59652:20:0::1;59675:9;59682:2;59675:6:::0;:9:::1;:::i;:::-;59652:32:::0;-1:-1:-1;59733:59:0::1;59770:21;:14:::0;59789:1:::1;59770:18;:21::i;:::-;59733:20;::::0;;;:10:::1;:20;::::0;;;;:32:::1;;::::0;;:36:::1;:59::i;:::-;59698:20;::::0;;;:10:::1;:20;::::0;;;;:32:::1;;:94:::0;59839:61:::1;59877:22;:15:::0;59897:1:::1;59877:19;:22::i;:::-;59839:20;::::0;;;:10:::1;:20;::::0;;;;:33:::1;;::::0;;:37:::1;:61::i;:::-;59803:20;::::0;;;:10:::1;:20;::::0;;;;:33:::1;;:97:::0;59915:10:::1;59924:1;59915:6:::0;:10:::1;:::i;:::-;:15:::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;59934:20:0::1;::::0;;;:10:::1;:20;::::0;;;;:26;:30:::1;::::0;59963:1:::1;::::0;59934:30:::1;:::i;:::-;:35:::0;59915:54:::1;59914:159;;;-1:-1:-1::0;60042:20:0::1;::::0;;;:10:::1;:20;::::0;;;;:26;:30:::1;::::0;60071:1:::1;::::0;60042:30:::1;:::i;:::-;59997:20;::::0;;;:10:::1;:20;::::0;;;;:26;60038:1:::1;::::0;59997:38:::1;::::0;60028:6;59997:30:::1;:38::i;:::-;:42;;;;:::i;:::-;:75;59914:159;59911:265;;;60125:20;::::0;;;:10:::1;:20;::::0;;;;:32:::1;;::::0;:39:::1;::::0;60162:1:::1;60125:36;:39::i;:::-;60090:20;::::0;;;:10:::1;:20;::::0;;;;:32:::1;;:74:::0;59911:265:::1;60189:11;60198:2;60189:6:::0;:11:::1;:::i;:::-;:16:::0;;::::1;::::0;:56:::1;;-1:-1:-1::0;60209:20:0::1;::::0;;;:10:::1;:20;::::0;;;;:26;:31:::1;::::0;60238:2:::1;::::0;60209:31:::1;:::i;:::-;:36:::0;60189:56:::1;:161;;;-1:-1:-1::0;60318:20:0::1;::::0;;;:10:::1;:20;::::0;;;;:26;:31:::1;::::0;60347:2:::1;::::0;60318:31:::1;:::i;:::-;60272:20;::::0;;;:10:::1;:20;::::0;;;;:26;60313:2:::1;::::0;60272:38:::1;::::0;60303:6;60272:30:::1;:38::i;:::-;:43;;;;:::i;:::-;:77;60189:161;60186:268;;;60402:20;::::0;;;:10:::1;:20;::::0;;;;:33:::1;;::::0;:40:::1;::::0;60440:1:::1;60402:37;:40::i;:::-;60366:20;::::0;;;:10:::1;:20;::::0;;;;:33:::1;;:76:::0;60186:268:::1;60492:20;::::0;;;:10:::1;:20;::::0;;;;;;:26;;60549:32:::1;::::0;::::1;::::0;60583:33:::1;::::0;::::1;::::0;60471:146;;::::1;::::0;::::1;::::0;60482:8;;60492:26;60520::::1;::::0;;::::1;::::0;60549:32;;60583:33;60471:146:::1;:::i;56012:103::-:0;11179:6;;-1:-1:-1;;;;;11179:6:0;9910:10;11326:23;11318:68;;;;-1:-1:-1;;;11318:68:0;;;;;;;:::i;:::-;56083:24;;::::1;::::0;:14:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;61850:431::-:0;53818:10;53806:23;;;;:11;:23;;;;;;;;53798:52;;;;-1:-1:-1;;;53798:52:0;;;;;;;:::i;:::-;61938:20:::1;::::0;;;:10:::1;:20;::::0;;;;:27:::1;;:34:::0;61975:1:::1;-1:-1:-1::0;61930:47:0::1;;;::::0;::::1;;62008:9;:16:::0;61996:28;::::1;61988:37;;;::::0;::::1;;62036:20;::::0;;;:10:::1;:20;::::0;;;;;;;:27:::1;::::0;::::1;:43:::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;;62090:33:::1;::::0;::::1;:41:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;62175:20;;;;62239:33:::1;;::::0;62149:124;;::::1;::::0;::::1;::::0;62047:8;;62036:27;;62090:33;;62239;62149:124:::1;:::i;:::-;;;;;;;;61850:431:::0;;:::o;32855:239::-;32927:7;32963:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32963:16:0;32998:19;32990:73;;;;-1:-1:-1;;;32990:73:0;;20467:2:1;32990:73:0;;;20449:21:1;20506:2;20486:18;;;20479:30;20545:34;20525:18;;;20518:62;-1:-1:-1;;;20596:18:1;;;20589:39;20645:19;;32990:73:0;20265:405:1;63303:296:0;63370:19;63391:20;63413:26;63459:10;:20;63470:8;63459:20;;;;;;;;;;;:26;;63451:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63505:10;:20;63516:8;63505:20;;;;;;;;;;;:27;;63496:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63558:10;:20;63569:8;63558:20;;;;;;;;;;;:33;;63543:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63303:296;;;;;:::o;55446:25::-;;;;;;;;;;;;58178:425;53679:10;53668:22;;;;:10;:22;;;;;;;;53660:63;;;;-1:-1:-1;;;53660:63:0;;;;;;;:::i;:::-;58325:12:::1;58340:13;47069:10:::0;:17;;46981:113;58340:13:::1;58325:28;;58364:29;58374:10;58385:7;58364:9;:29::i;:::-;58426:94;::::0;;::::1;::::0;::::1;::::0;;;58430:1:::1;58426:94:::0;;;::::1;::::0;::::1;::::0;::::1;;;;58448:6;58426:94;;;;;;;;:::i;:::-;;;;;58455:1;58426:94;;;;58458:5;;58426:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;58426:94:0;;;-1:-1:-1;;;58426:94:0::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;58467:6;;;;;;58426:94;;::::1;::::0;58467:6;;58426:94;58467:6;58426:94;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;;58426:94:0;;;-1:-1:-1;58475:13:0::1;::::0;;58486:1:::1;58475:13:::0;;;;;::::1;::::0;;;58426:94:::1;::::0;;::::1;::::0;58475:13;;58486:1;58475:13;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;;58426:94:0;;58490:1:::1;58426:94;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;58504:15:::1;58426:94:::0;;;;;;;;58404:19;;;:10:::1;:19:::0;;;;;:116;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;58404:116:0;;::::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;58404:116:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;58404:116:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;58404:116:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58536:59;58547:7;58556:6;58564:5;;58571:6;;58579:15;58536:59;;;;;;;;;;;;:::i;:::-;;;;;;;;58314:289;58178:425:::0;;;;;;;:::o;32585:208::-;32657:7;-1:-1:-1;;;;;32685:19:0;;32677:74;;;;-1:-1:-1;;;32677:74:0;;22007:2:1;32677:74:0;;;21989:21:1;22046:2;22026:18;;;22019:30;22085:34;22065:18;;;22058:62;-1:-1:-1;;;22136:18:1;;;22129:40;22186:19;;32677:74:0;21805:406:1;32677:74:0;-1:-1:-1;;;;;;32769:16:0;;;;;:9;:16;;;;;;;32585:208::o;11757:103::-;11179:6;;-1:-1:-1;;;;;11179:6:0;9910:10;11326:23;11318:68;;;;-1:-1:-1;;;11318:68:0;;;;;;;:::i;:::-;11822:30:::1;11849:1;11822:18;:30::i;:::-;11757:103::o:0;55577:27::-;;;;;;;;;;;;33330:104;33386:13;33419:7;33412:14;;;;;:::i;62674:173::-;53818:10;53806:23;;;;:11;:23;;;;;;;;53798:52;;;;-1:-1:-1;;;53798:52:0;;;;;;;:::i;:::-;62755:20:::1;::::0;;;:10:::1;:20;::::0;;;;:26:::1;::::0;;::::1;:35:::0;;62784:6;;-1:-1:-1;;62755:35:0;;::::1;::::0;62784:6;62755:35:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;62806:33;62822:8;62832:6;62806:33;;;;;;;:::i;35013:155::-:0;35108:52;9910:10;35141:8;35151;35108:18;:52::i;56755:237::-;11179:6;;-1:-1:-1;;;;;11179:6:0;9910:10;11326:23;11318:68;;;;-1:-1:-1;;;11318:68:0;;;;;;;:::i;:::-;56838:6:::1;56834:151;56850:10;:17;56846:1;:21;56834:151;;;56888:8;56902:10;56913:1;56902:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;56888:28;;::::1;::::0;::::1;::::0;;-1:-1:-1;56888:28:0;;;;;;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;56950:16:0::1;::::0;:23:::1;::::0;56971:1:::1;56950:20;:23::i;:::-;56931:16;:42:::0;56869:3;::::1;::::0;::::1;:::i;:::-;;;;56834:151;;62921:278:::0;53818:10;53806:23;;;;:11;:23;;;;;;;;53798:52;;;;-1:-1:-1;;;53798:52:0;;;;;;;:::i;:::-;63032:11:::1;:18:::0;63017:33;::::1;63009:42;;;::::0;::::1;;63062:20;::::0;;;:10:::1;:20;::::0;;;;;;;;:32:::1;;:47:::0;;;63127:64;;22672:25:1;;;22713:18;;;22706:34;;;63127:64:0::1;::::0;22645:18:1;63127:64:0::1;22498:248:1::0;57411:476:0;53679:10;57496:4;53668:22;;;:10;:22;;;;;;;;53660:63;;;;-1:-1:-1;;;53660:63:0;;;;;;;:::i;:::-;57513:12:::1;57528:13;47069:10:::0;:17;;46981:113;57528:13:::1;57513:28;;57552:29;57562:10;57573:7;57552:9;:29::i;:::-;57614:13;::::0;;57625:1:::1;57614:13:::0;;;;;::::1;::::0;;;57592:19:::1;::::0;57614:13:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;57666:13:0::1;::::0;;57677:1:::1;57666:13:::0;;;;;::::1;::::0;;;57592:35;;-1:-1:-1;57638:25:0::1;::::0;57666:13;-1:-1:-1;57666:13:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;57712:96:0::1;::::0;;::::1;::::0;::::1;::::0;;57716:1:::1;57712:96:::0;;;-1:-1:-1;57712:96:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57792:15:::1;57712:96:::0;;;;57690:19;;;:10:::1;:19:::0;;;;;;:118;;;;;;;;::::1;::::0;;57638:41;;-1:-1:-1;57712:96:0;;57690:19;;-1:-1:-1;57690:118:0;-1:-1:-1;;57690:118:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;57690:118:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;57690:118:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;57690:118:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;57690:118:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;57824:30:::1;::::0;;22672:25:1;;;22728:2;22713:18;;22706:34;;;57824:30:0::1;::::0;22645:18:1;57824:30:0::1;;;;;;;-1:-1:-1::0;57872:7:0;;57411:476;-1:-1:-1;;;;57411:476:0:o;62352:254::-;53818:10;53806:23;;;;:11;:23;;;;;;;;53798:52;;;;-1:-1:-1;;;53798:52:0;;;;;;;:::i;:::-;62475:20:::1;::::0;;;:10:::1;:20;::::0;;;;:35:::1;;::::0;:47:::1;::::0;62515:6;62475:39:::1;:47::i;:::-;62437:20;::::0;;;:10:::1;:20;::::0;;;;;;:35:::1;;:85:::0;;;62540:58;::::1;::::0;::::1;::::0;62448:8;;62437:85;22672:25:1;;;22728:2;22713:18;;22706:34;22660:2;22645:18;;22498:248;36136:328:0;36311:41;9910:10;36344:7;36311:18;:41::i;:::-;36303:103;;;;-1:-1:-1;;;36303:103:0;;;;;;;:::i;:::-;36417:39;36431:4;36437:2;36441:7;36450:5;36417:13;:39::i;:::-;36136:328;;;;:::o;33505:334::-;38039:4;38063:16;;;:7;:16;;;;;;33578:13;;-1:-1:-1;;;;;38063:16:0;33604:76;;;;-1:-1:-1;;;33604:76:0;;22953:2:1;33604:76:0;;;22935:21:1;22992:2;22972:18;;;22965:30;23031:34;23011:18;;;23004:62;-1:-1:-1;;;23082:18:1;;;23075:45;23137:19;;33604:76:0;22751:411:1;33604:76:0;33693:21;33717:10;:8;:10::i;:::-;33693:34;;33769:1;33751:7;33745:21;:25;:86;;;;;;;;;;;;;;;;;33797:7;33806:18;:7;:16;:18::i;:::-;33780:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33745:86;33738:93;33505:334;-1:-1:-1;;;33505:334:0:o;54008:123::-;11179:6;;-1:-1:-1;;;;;11179:6:0;9910:10;11326:23;11318:68;;;;-1:-1:-1;;;11318:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54093:21:0;;;::::1;;::::0;;;:11:::1;:21;::::0;;;;:30;;-1:-1:-1;;54093:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54008:123::o;12015:201::-;11179:6;;-1:-1:-1;;;;;11179:6:0;9910:10;11326:23;11318:68;;;;-1:-1:-1;;;11318:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12104:22:0;::::1;12096:73;;;::::0;-1:-1:-1;;;12096:73:0;;23844:2:1;12096:73:0::1;::::0;::::1;23826:21:1::0;23883:2;23863:18;;;23856:30;23922:34;23902:18;;;23895:62;-1:-1:-1;;;23973:18:1;;;23966:36;24019:19;;12096:73:0::1;23642:402:1::0;12096:73:0::1;12180:28;12199:8;12180:18;:28::i;:::-;12015:201:::0;:::o;57965:152::-;53679:10;53668:22;;;;:10;:22;;;;;;;;53660:63;;;;-1:-1:-1;;;53660:63:0;;;;;;;:::i;:::-;58040:20:::1;::::0;;;:10:::1;:20;::::0;;;;;;;;:24:::1;;:31:::0;;;58087:22;;22672:25:1;;;22713:18;;;22706:34;;;58087:22:0::1;::::0;22645:18:1;58087:22:0::1;22498:248:1::0;60710:497:0;53818:10;53806:23;;;;:11;:23;;;;;;;;53798:52;;;;-1:-1:-1;;;53798:52:0;;;;;;;:::i;:::-;60820:20:::1;::::0;;;:10:::1;:20;::::0;;;;:32:::1;;::::0;60810:42;::::1;;60802:51;;;::::0;::::1;;60900:20;::::0;;;:10:::1;:20;::::0;;;;:26:::1;;:33:::0;;:45:::1;::::0;60938:6;;60927:5;;60900:33;::::1;;;;;:::i;:45::-;60864:20;::::0;;;:10:::1;:20;::::0;;;;:26:::1;;:33:::0;;60891:5;;60864:33;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;:81:::0;;;;60991:20;;;:10:::1;:20:::0;;;;;;:32:::1;;::::0;:44:::1;::::0;61028:6;60991:36:::1;:44::i;:::-;60956:20;::::0;;;:10:::1;:20;::::0;;;;;;:32:::1;::::0;::::1;:79:::0;;;61074:26;;61165:33:::1;::::0;::::1;::::0;61053:146;;::::1;::::0;::::1;::::0;60967:8;;61102:26:::1;;::::0;61053:146:::1;:::i;56428:235::-:0;11179:6;;-1:-1:-1;;;;;11179:6:0;9910:10;11326:23;11318:68;;;;-1:-1:-1;;;11318:68:0;;;;;;;:::i;:::-;56510:6:::1;56506:150;56522:11;:18;56518:1;:22;56506:150;;;56561:9;56576:11;56588:1;56576:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;56561:30;;::::1;::::0;::::1;::::0;;-1:-1:-1;56561:30:0;;;;;;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;56623:14:0::1;::::0;:21:::1;::::0;56642:1:::1;56623:18;:21::i;:::-;56606:14;:38:::0;56542:3;::::1;::::0;::::1;:::i;:::-;;;;56506:150;;32216:305:::0;32318:4;-1:-1:-1;;;;;;32355:40:0;;-1:-1:-1;;;32355:40:0;;:105;;-1:-1:-1;;;;;;;32412:48:0;;-1:-1:-1;;;32412:48:0;32355:105;:158;;;-1:-1:-1;;;;;;;;;;23999:40:0;;;32477:36;23890:157;42120:174;42195:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;42195:29:0;-1:-1:-1;;;;;42195:29:0;;;;;;;;:24;;42249:23;42195:24;42249:14;:23::i;:::-;-1:-1:-1;;;;;42240:46:0;;;;;;;;;;;42120:174;;:::o;2862:98::-;2920:7;2947:5;2951:1;2947;:5;:::i;38268:348::-;38361:4;38063:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38063:16:0;38378:73;;;;-1:-1:-1;;;38378:73:0;;24384:2:1;38378:73:0;;;24366:21:1;24423:2;24403:18;;;24396:30;24462:34;24442:18;;;24435:62;-1:-1:-1;;;24513:18:1;;;24506:42;24565:19;;38378:73:0;24182:408:1;38378:73:0;38462:13;38478:23;38493:7;38478:14;:23::i;:::-;38462:39;;38531:5;-1:-1:-1;;;;;38520:16:0;:7;-1:-1:-1;;;;;38520:16:0;;:51;;;;38564:7;-1:-1:-1;;;;;38540:31:0;:20;38552:7;38540:11;:20::i;:::-;-1:-1:-1;;;;;38540:31:0;;38520:51;:87;;;-1:-1:-1;;;;;;35360:25:0;;;35336:4;35360:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;38575:32;38512:96;38268:348;-1:-1:-1;;;;38268:348:0:o;41377:625::-;41536:4;-1:-1:-1;;;;;41509:31:0;:23;41524:7;41509:14;:23::i;:::-;-1:-1:-1;;;;;41509:31:0;;41501:81;;;;-1:-1:-1;;;41501:81:0;;24797:2:1;41501:81:0;;;24779:21:1;24836:2;24816:18;;;24809:30;24875:34;24855:18;;;24848:62;-1:-1:-1;;;24926:18:1;;;24919:35;24971:19;;41501:81:0;24595:401:1;41501:81:0;-1:-1:-1;;;;;41601:16:0;;41593:65;;;;-1:-1:-1;;;41593:65:0;;25203:2:1;41593:65:0;;;25185:21:1;25242:2;25222:18;;;25215:30;25281:34;25261:18;;;25254:62;-1:-1:-1;;;25332:18:1;;;25325:34;25376:19;;41593:65:0;25001:400:1;41593:65:0;41671:39;41692:4;41698:2;41702:7;41671:20;:39::i;:::-;41775:29;41792:1;41796:7;41775:8;:29::i;:::-;-1:-1:-1;;;;;41817:15:0;;;;;;:9;:15;;;;;:20;;41836:1;;41817:15;:20;;41836:1;;41817:20;:::i;:::-;;;;-1:-1:-1;;;;;;;41848:13:0;;;;;;:9;:13;;;;;:18;;41865:1;;41848:13;:18;;41865:1;;41848:18;:::i;:::-;;;;-1:-1:-1;;41877:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41877:21:0;-1:-1:-1;;;;;41877:21:0;;;;;;;;;41916:27;;41877:16;;41916:27;;;;;;;34313:341;34243:411;;:::o;3243:98::-;3301:7;3328:5;3332:1;3328;:5;:::i;3600:98::-;3658:7;3685:5;3689:1;3685;:5;:::i;38958:110::-;39034:26;39044:2;39048:7;39034:26;;;;;;;;;;;;:9;:26::i;12376:191::-;12469:6;;;-1:-1:-1;;;;;12486:17:0;;;-1:-1:-1;;;;;;12486:17:0;;;;;;;12519:40;;12469:6;;;12486:17;12469:6;;12519:40;;12450:16;;12519:40;12439:128;12376:191;:::o;42436:315::-;42591:8;-1:-1:-1;;;;;42582:17:0;:5;-1:-1:-1;;;;;42582:17:0;;;42574:55;;;;-1:-1:-1;;;42574:55:0;;25911:2:1;42574:55:0;;;25893:21:1;25950:2;25930:18;;;25923:30;25989:27;25969:18;;;25962:55;26034:18;;42574:55:0;25709:349:1;42574:55:0;-1:-1:-1;;;;;42640:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;42640:46:0;;;;;;;;;;42702:41;;540::1;;;42702::0;;513:18:1;42702:41:0;;;;;;;42436:315;;;:::o;37346:::-;37503:28;37513:4;37519:2;37523:7;37503:9;:28::i;:::-;37550:48;37573:4;37579:2;37583:7;37592:5;37550:22;:48::i;:::-;37542:111;;;;-1:-1:-1;;;37542:111:0;;;;;;;:::i;56231:107::-;56283:13;56316:14;56309:21;;;;;:::i;7392:723::-;7448:13;7669:10;7665:53;;-1:-1:-1;;7696:10:0;;;;;;;;;;;;-1:-1:-1;;;7696:10:0;;;;;7392:723::o;7665:53::-;7743:5;7728:12;7784:78;7791:9;;7784:78;;7817:8;;;;:::i;:::-;;-1:-1:-1;7840:10:0;;-1:-1:-1;7848:2:0;7840:10;;:::i;:::-;;;7784:78;;;7872:19;7904:6;7894:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7894:17:0;;7872:39;;7922:154;7929:10;;7922:154;;7956:11;7966:1;7956:11;;:::i;:::-;;-1:-1:-1;8025:10:0;8033:2;8025:5;:10;:::i;:::-;8012:24;;:2;:24;:::i;:::-;7999:39;;7982:6;7989;7982:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7982:56:0;;;;;;;;-1:-1:-1;8053:11:0;8062:2;8053:11;;:::i;:::-;;;7922:154;;48017:589;-1:-1:-1;;;;;48223:18:0;;48219:187;;48258:40;48290:7;49433:10;:17;;49406:24;;;;:15;:24;;;;;:44;;;49461:24;;;;;;;;;;;;49329:164;48258:40;48219:187;;;48328:2;-1:-1:-1;;;;;48320:10:0;:4;-1:-1:-1;;;;;48320:10:0;;48316:90;;48347:47;48380:4;48386:7;48347:32;:47::i;:::-;-1:-1:-1;;;;;48420:16:0;;48416:183;;48453:45;48490:7;48453:36;:45::i;48416:183::-;48526:4;-1:-1:-1;;;;;48520:10:0;:2;-1:-1:-1;;;;;48520:10:0;;48516:83;;48547:40;48575:2;48579:7;48547:27;:40::i;39295:321::-;39425:18;39431:2;39435:7;39425:5;:18::i;:::-;39476:54;39507:1;39511:2;39515:7;39524:5;39476:22;:54::i;:::-;39454:154;;;;-1:-1:-1;;;39454:154:0;;;;;;;:::i;43316:799::-;43471:4;-1:-1:-1;;;;;43492:13:0;;14102:19;:23;43488:620;;43528:72;;-1:-1:-1;;;43528:72:0;;-1:-1:-1;;;;;43528:36:0;;;;;:72;;9910:10;;43579:4;;43585:7;;43594:5;;43528:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43528:72:0;;;;;;;;-1:-1:-1;;43528:72:0;;;;;;;;;;;;:::i;:::-;;;43524:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43770:13:0;;43766:272;;43813:60;;-1:-1:-1;;;43813:60:0;;;;;;;:::i;43766:272::-;43988:6;43982:13;43973:6;43969:2;43965:15;43958:38;43524:529;-1:-1:-1;;;;;;43651:51:0;-1:-1:-1;;;43651:51:0;;-1:-1:-1;43644:58:0;;43488:620;-1:-1:-1;44092:4:0;43316:799;;;;;;:::o;50120:988::-;50386:22;50436:1;50411:22;50428:4;50411:16;:22::i;:::-;:26;;;;:::i;:::-;50448:18;50469:26;;;:17;:26;;;;;;50386:51;;-1:-1:-1;50602:28:0;;;50598:328;;-1:-1:-1;;;;;50669:18:0;;50647:19;50669:18;;;:12;:18;;;;;;;;:34;;;;;;;;;50720:30;;;;;;:44;;;50837:30;;:17;:30;;;;;:43;;;50598:328;-1:-1:-1;51022:26:0;;;;:17;:26;;;;;;;;51015:33;;;-1:-1:-1;;;;;51066:18:0;;;;;:12;:18;;;;;:34;;;;;;;51059:41;50120:988::o;51403:1079::-;51681:10;:17;51656:22;;51681:21;;51701:1;;51681:21;:::i;:::-;51713:18;51734:24;;;:15;:24;;;;;;52107:10;:26;;51656:46;;-1:-1:-1;51734:24:0;;51656:46;;52107:26;;;;;;:::i;:::-;;;;;;;;;52085:48;;52171:11;52146:10;52157;52146:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;52251:28;;;:15;:28;;;;;;;:41;;;52423:24;;;;;52416:31;52458:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;51474:1008;;;51403:1079;:::o;48907:221::-;48992:14;49009:20;49026:2;49009:16;:20::i;:::-;-1:-1:-1;;;;;49040:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;49085:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;48907:221:0:o;39952:439::-;-1:-1:-1;;;;;40032:16:0;;40024:61;;;;-1:-1:-1;;;40024:61:0;;27564:2:1;40024:61:0;;;27546:21:1;;;27583:18;;;27576:30;27642:34;27622:18;;;27615:62;27694:18;;40024:61:0;27362:356:1;40024:61:0;38039:4;38063:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38063:16:0;:30;40096:58;;;;-1:-1:-1;;;40096:58:0;;27925:2:1;40096:58:0;;;27907:21:1;27964:2;27944:18;;;27937:30;28003;27983:18;;;27976:58;28051:18;;40096:58:0;27723:352:1;40096:58:0;40167:45;40196:1;40200:2;40204:7;40167:20;:45::i;:::-;-1:-1:-1;;;;;40225:13:0;;;;;;:9;:13;;;;;:18;;40242:1;;40225:13;:18;;40242:1;;40225:18;:::i;:::-;;;;-1:-1:-1;;40254:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40254:21:0;-1:-1:-1;;;;;40254:21:0;;;;;;;;40293:33;;40254:16;;;40293:33;;40254:16;;40293:33;57153:162:::1;57070:252:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;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;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:186::-;1973:6;2026:2;2014:9;2005:7;2001:23;1997:32;1994:52;;;2042:1;2039;2032:12;1994:52;2065:29;2084:9;2065:29;:::i;2105:254::-;2173:6;2181;2234:2;2222:9;2213:7;2209:23;2205:32;2202:52;;;2250:1;2247;2240:12;2202:52;2273:29;2292:9;2273:29;:::i;:::-;2263:39;2349:2;2334:18;;;;2321:32;;-1:-1:-1;;;2105:254:1:o;2364:127::-;2425:10;2420:3;2416:20;2413:1;2406:31;2456:4;2453:1;2446:15;2480:4;2477:1;2470:15;2496:275;2567:2;2561:9;2632:2;2613:13;;-1:-1:-1;;2609:27:1;2597:40;;2667:18;2652:34;;2688:22;;;2649:62;2646:88;;;2714:18;;:::i;:::-;2750:2;2743:22;2496:275;;-1:-1:-1;2496:275:1:o;2776:182::-;2835:4;2868:18;2860:6;2857:30;2854:56;;;2890:18;;:::i;:::-;-1:-1:-1;2935:1:1;2931:14;2947:4;2927:25;;2776:182::o;2963:407::-;3028:5;3062:18;3054:6;3051:30;3048:56;;;3084:18;;:::i;:::-;3122:57;3167:2;3146:15;;-1:-1:-1;;3142:29:1;3173:4;3138:40;3122:57;:::i;:::-;3113:66;;3202:6;3195:5;3188:21;3242:3;3233:6;3228:3;3224:16;3221:25;3218:45;;;3259:1;3256;3249:12;3218:45;3308:6;3303:3;3296:4;3289:5;3285:16;3272:43;3362:1;3355:4;3346:6;3339:5;3335:18;3331:29;3324:40;2963:407;;;;;:::o;3375:222::-;3418:5;3471:3;3464:4;3456:6;3452:17;3448:27;3438:55;;3489:1;3486;3479:12;3438:55;3511:80;3587:3;3578:6;3565:20;3558:4;3550:6;3546:17;3511:80;:::i;3602:1132::-;3696:6;3727:2;3770;3758:9;3749:7;3745:23;3741:32;3738:52;;;3786:1;3783;3776:12;3738:52;3826:9;3813:23;3855:18;3896:2;3888:6;3885:14;3882:34;;;3912:1;3909;3902:12;3882:34;3950:6;3939:9;3935:22;3925:32;;3995:7;3988:4;3984:2;3980:13;3976:27;3966:55;;4017:1;4014;4007:12;3966:55;4053:2;4040:16;4076:59;4092:42;4131:2;4092:42;:::i;:::-;4076:59;:::i;:::-;4169:15;;;4251:1;4247:10;;;;4239:19;;4235:28;;;4200:12;;;;4275:19;;;4272:39;;;4307:1;4304;4297:12;4272:39;4339:2;4335;4331:11;4351:353;4367:6;4362:3;4359:15;4351:353;;;4453:3;4440:17;4489:2;4476:11;4473:19;4470:109;;;4533:1;4562:2;4558;4551:14;4470:109;4604:57;4653:7;4648:2;4634:11;4630:2;4626:20;4622:29;4604:57;:::i;:::-;4592:70;;-1:-1:-1;4682:12:1;;;;4384;;4351:353;;;-1:-1:-1;4723:5:1;3602:1132;-1:-1:-1;;;;;;;;3602:1132:1:o;4921:328::-;4998:6;5006;5014;5067:2;5055:9;5046:7;5042:23;5038:32;5035:52;;;5083:1;5080;5073:12;5035:52;5106:29;5125:9;5106:29;:::i;:::-;5096:39;;5154:38;5188:2;5177:9;5173:18;5154:38;:::i;:::-;5144:48;;5239:2;5228:9;5224:18;5211:32;5201:42;;4921:328;;;;;:::o;5254:316::-;5331:6;5339;5347;5400:2;5388:9;5379:7;5375:23;5371:32;5368:52;;;5416:1;5413;5406:12;5368:52;-1:-1:-1;;5439:23:1;;;5509:2;5494:18;;5481:32;;-1:-1:-1;5560:2:1;5545:18;;;5532:32;;5254:316;-1:-1:-1;5254:316:1:o;5575:347::-;5640:6;5648;5701:2;5689:9;5680:7;5676:23;5672:32;5669:52;;;5717:1;5714;5707:12;5669:52;5740:29;5759:9;5740:29;:::i;:::-;5730:39;;5819:2;5808:9;5804:18;5791:32;5866:5;5859:13;5852:21;5845:5;5842:32;5832:60;;5888:1;5885;5878:12;5832:60;5911:5;5901:15;;;5575:347;;;;;:::o;5927:150::-;6002:20;;6051:1;6041:12;;6031:40;;6067:1;6064;6057:12;6082:661;6136:5;6189:3;6182:4;6174:6;6170:17;6166:27;6156:55;;6207:1;6204;6197:12;6156:55;6243:6;6230:20;6269:4;6293:59;6309:42;6348:2;6309:42;:::i;6293:59::-;6386:15;;;6472:1;6468:10;;;;6456:23;;6452:32;;;6417:12;;;;6496:15;;;6493:35;;;6524:1;6521;6514:12;6493:35;6560:2;6552:6;6548:15;6572:142;6588:6;6583:3;6580:15;6572:142;;;6654:17;;6642:30;;6692:12;;;;6605;;6572:142;;;-1:-1:-1;6732:5:1;6082:661;-1:-1:-1;;;;;;6082:661:1:o;6748:759::-;6898:6;6906;6914;6922;6975:3;6963:9;6954:7;6950:23;6946:33;6943:53;;;6992:1;6989;6982:12;6943:53;7028:9;7015:23;7005:33;;7057:45;7098:2;7087:9;7083:18;7057:45;:::i;:::-;7047:55;;7153:2;7142:9;7138:18;7125:32;7176:18;7217:2;7209:6;7206:14;7203:34;;;7233:1;7230;7223:12;7203:34;7256:61;7309:7;7300:6;7289:9;7285:22;7256:61;:::i;:::-;7246:71;;7370:2;7359:9;7355:18;7342:32;7326:48;;7399:2;7389:8;7386:16;7383:36;;;7415:1;7412;7405:12;7383:36;;7438:63;7493:7;7482:8;7471:9;7467:24;7438:63;:::i;:::-;7428:73;;;6748:759;;;;;;;:::o;7512:248::-;7580:6;7588;7641:2;7629:9;7620:7;7616:23;7612:32;7609:52;;;7657:1;7654;7647:12;7609:52;-1:-1:-1;;7680:23:1;;;7750:2;7735:18;;;7722:32;;-1:-1:-1;7512:248:1:o;7765:322::-;7834:6;7887:2;7875:9;7866:7;7862:23;7858:32;7855:52;;;7903:1;7900;7893:12;7855:52;7943:9;7930:23;7976:18;7968:6;7965:30;7962:50;;;8008:1;8005;7998:12;7962:50;8031;8073:7;8064:6;8053:9;8049:22;8031:50;:::i;8092:435::-;8145:3;8183:5;8177:12;8210:6;8205:3;8198:19;8236:4;8265:2;8260:3;8256:12;8249:19;;8302:2;8295:5;8291:14;8323:1;8333:169;8347:6;8344:1;8341:13;8333:169;;;8408:13;;8396:26;;8442:12;;;;8477:15;;;;8369:1;8362:9;8333:169;;;-1:-1:-1;8518:3:1;;8092:435;-1:-1:-1;;;;;8092:435:1:o;8532:669::-;8867:2;8856:9;8849:21;8830:4;8893:56;8945:2;8934:9;8930:18;8922:6;8893:56;:::i;:::-;8997:9;8989:6;8985:22;8980:2;8969:9;8965:18;8958:50;9031:44;9068:6;9060;9031:44;:::i;:::-;9017:58;;9123:9;9115:6;9111:22;9106:2;9095:9;9091:18;9084:50;9151:44;9188:6;9180;9151:44;:::i;:::-;9143:52;8532:669;-1:-1:-1;;;;;;8532:669:1:o;9206:367::-;9269:8;9279:6;9333:3;9326:4;9318:6;9314:17;9310:27;9300:55;;9351:1;9348;9341:12;9300:55;-1:-1:-1;9374:20:1;;9417:18;9406:30;;9403:50;;;9449:1;9446;9439:12;9403:50;9486:4;9478:6;9474:17;9462:29;;9546:3;9539:4;9529:6;9526:1;9522:14;9514:6;9510:27;9506:38;9503:47;9500:67;;;9563:1;9560;9553:12;9500:67;9206:367;;;;;:::o;9578:1012::-;9741:6;9749;9757;9765;9773;9781;9789;9842:3;9830:9;9821:7;9817:23;9813:33;9810:53;;;9859:1;9856;9849:12;9810:53;9882:29;9901:9;9882:29;:::i;:::-;9872:39;;9930:45;9971:2;9960:9;9956:18;9930:45;:::i;:::-;9920:55;;10026:2;10015:9;10011:18;9998:32;10049:18;10090:2;10082:6;10079:14;10076:34;;;10106:1;10103;10096:12;10076:34;10145:70;10207:7;10198:6;10187:9;10183:22;10145:70;:::i;:::-;10234:8;;-1:-1:-1;10119:96:1;-1:-1:-1;10322:2:1;10307:18;;10294:32;;-1:-1:-1;10338:16:1;;;10335:36;;;10367:1;10364;10357:12;10335:36;;10406:72;10470:7;10459:8;10448:9;10444:24;10406:72;:::i;:::-;9578:1012;;;;-1:-1:-1;9578:1012:1;;;;;;10579:3;10564:19;;;10551:33;;9578:1012;-1:-1:-1;;;;9578:1012:1:o;10595:337::-;10676:6;10684;10737:2;10725:9;10716:7;10712:23;10708:32;10705:52;;;10753:1;10750;10743:12;10705:52;10789:9;10776:23;10766:33;;10849:2;10838:9;10834:18;10821:32;10882:1;10875:5;10872:12;10862:40;;10898:1;10895;10888:12;10937:667;11032:6;11040;11048;11056;11109:3;11097:9;11088:7;11084:23;11080:33;11077:53;;;11126:1;11123;11116:12;11077:53;11149:29;11168:9;11149:29;:::i;:::-;11139:39;;11197:38;11231:2;11220:9;11216:18;11197:38;:::i;:::-;11187:48;;11282:2;11271:9;11267:18;11254:32;11244:42;;11337:2;11326:9;11322:18;11309:32;11364:18;11356:6;11353:30;11350:50;;;11396:1;11393;11386:12;11350:50;11419:22;;11472:4;11464:13;;11460:27;-1:-1:-1;11450:55:1;;11501:1;11498;11491:12;11450:55;11524:74;11590:7;11585:2;11572:16;11567:2;11563;11559:11;11524:74;:::i;11609:127::-;11670:10;11665:3;11661:20;11658:1;11651:31;11701:4;11698:1;11691:15;11725:4;11722:1;11715:15;11741:139;11821:1;11814:5;11811:12;11801:46;;11827:18;;:::i;:::-;11856;;11741:139::o;11885:140::-;11966:1;11959:5;11956:12;11946:46;;11972:18;;:::i;12030:883::-;12452:25;;;12439:3;12424:19;;12486:52;12534:2;12519:18;;12511:6;12486:52;:::i;:::-;12547:53;12596:2;12585:9;12581:18;12573:6;12547:53;:::i;:::-;12631:2;12616:18;;12609:34;;;;12674:3;12659:19;;12652:35;;;;12718:3;12703:19;;12696:35;;;;12762:3;12747:19;;12740:35;;;;12806:3;12791:19;;12784:35;12850:3;12835:19;;12828:35;12894:3;12879:19;;;12872:35;12030:883;;-1:-1:-1;;;12030:883:1:o;12918:260::-;12986:6;12994;13047:2;13035:9;13026:7;13022:23;13018:32;13015:52;;;13063:1;13060;13053:12;13015:52;13086:29;13105:9;13086:29;:::i;:::-;13076:39;;13134:38;13168:2;13157:9;13153:18;13134:38;:::i;:::-;13124:48;;12918:260;;;;;:::o;13183:380::-;13262:1;13258:12;;;;13305;;;13326:61;;13380:4;13372:6;13368:17;13358:27;;13326:61;13433:2;13425:6;13422:14;13402:18;13399:38;13396:161;;;13479:10;13474:3;13470:20;13467:1;13460:31;13514:4;13511:1;13504:15;13542:4;13539:1;13532:15;13396:161;;13183:380;;;:::o;14808:356::-;15010:2;14992:21;;;15029:18;;;15022:30;15088:34;15083:2;15068:18;;15061:62;15155:2;15140:18;;14808:356::o;15169:127::-;15230:10;15225:3;15221:20;15218:1;15211:31;15261:4;15258:1;15251:15;15285:4;15282:1;15275:15;15301:127;15362:10;15357:3;15353:20;15350:1;15343:31;15393:4;15390:1;15383:15;15417:4;15414:1;15407:15;15433:135;15472:3;-1:-1:-1;;15493:17:1;;15490:43;;;15513:18;;:::i;:::-;-1:-1:-1;15560:1:1;15549:13;;15433:135::o;15573:413::-;15775:2;15757:21;;;15814:2;15794:18;;;15787:30;15853:34;15848:2;15833:18;;15826:62;-1:-1:-1;;;15919:2:1;15904:18;;15897:47;15976:3;15961:19;;15573:413::o;15991:340::-;16193:2;16175:21;;;16232:2;16212:18;;;16205:30;-1:-1:-1;;;16266:2:1;16251:18;;16244:46;16322:2;16307:18;;15991:340::o;16336:469::-;16397:3;16435:5;16429:12;16462:6;16457:3;16450:19;16488:4;16517:2;16512:3;16508:12;16501:19;;16539:5;16536:1;16529:16;16581:2;16578:1;16568:16;16602:1;16612:168;16626:6;16623:1;16620:13;16612:168;;;16687:13;;16675:26;;16721:12;;;;16768:1;16756:14;;;;16641:9;16612:168;;16810:619;17117:6;17106:9;17099:25;17160:3;17155:2;17144:9;17140:18;17133:31;17080:4;17187:65;17247:3;17236:9;17232:19;17224:6;17187:65;:::i;:::-;17300:9;17292:6;17288:22;17283:2;17272:9;17268:18;17261:50;17328:52;17373:6;17365;17328:52;:::i;:::-;17320:60;;;17416:6;17411:2;17400:9;17396:18;17389:34;16810:619;;;;;;;:::o;17846:352::-;18048:2;18030:21;;;18087:2;18067:18;;;18060:30;18126;18121:2;18106:18;;18099:58;18189:2;18174:18;;17846:352::o;18203:712::-;18556:6;18545:9;18538:25;18572:53;18621:2;18610:9;18606:18;18598:6;18572:53;:::i;:::-;18661:3;18656:2;18645:9;18641:18;18634:31;18519:4;18688:57;18740:3;18729:9;18725:19;18717:6;18688:57;:::i;:::-;18793:9;18785:6;18781:22;18776:2;18765:9;18761:18;18754:50;18821:44;18858:6;18850;18821:44;:::i;:::-;18813:52;;;18902:6;18896:3;18885:9;18881:19;18874:35;18203:712;;;;;;;;:::o;19333:127::-;19394:10;19389:3;19385:20;19382:1;19375:31;19425:4;19422:1;19415:15;19449:4;19446:1;19439:15;19465:120;19505:1;19531;19521:35;;19536:18;;:::i;:::-;-1:-1:-1;19570:9:1;;19465:120::o;19590:112::-;19622:1;19648;19638:35;;19653:18;;:::i;:::-;-1:-1:-1;19687:9:1;;19590:112::o;19707:553::-;19995:6;19984:9;19977:25;20038:6;20033:2;20022:9;20018:18;20011:34;20081:3;20076:2;20065:9;20061:18;20054:31;19958:4;20102:65;20162:3;20151:9;20147:19;20139:6;20102:65;:::i;:::-;20198:2;20183:18;;20176:34;;;;-1:-1:-1;20241:3:1;20226:19;20219:35;20094:73;19707:553;-1:-1:-1;;;19707:553:1:o;20675:354::-;20763:19;;;20745:3;-1:-1:-1;;;;;20794:31:1;;20791:51;;;20838:1;20835;20828:12;20791:51;20874:6;20871:1;20867:14;20926:8;20919:5;20912:4;20907:3;20903:14;20890:45;21003:1;20958:18;;20978:4;20954:29;20992:13;;;-1:-1:-1;20954:29:1;;20675:354;-1:-1:-1;;20675:354:1:o;21034:766::-;21407:6;21396:9;21389:25;21423:53;21472:2;21461:9;21457:18;21449:6;21423:53;:::i;:::-;21512:3;21507:2;21496:9;21492:18;21485:31;21370:4;21539:74;21608:3;21597:9;21593:19;21585:6;21577;21539:74;:::i;:::-;21661:9;21653:6;21649:22;21644:2;21633:9;21629:18;21622:50;21689:61;21743:6;21735;21727;21689:61;:::i;:::-;21681:69;;;21787:6;21781:3;21770:9;21766:19;21759:35;21034:766;;;;;;;;;;:::o;22216:277::-;22401:25;;;22389:2;22374:18;;22435:52;22483:2;22468:18;;22460:6;22435:52;:::i;23167:470::-;23346:3;23384:6;23378:13;23400:53;23446:6;23441:3;23434:4;23426:6;23422:17;23400:53;:::i;:::-;23516:13;;23475:16;;;;23538:57;23516:13;23475:16;23572:4;23560:17;;23538:57;:::i;:::-;23611:20;;23167:470;-1:-1:-1;;;;23167:470:1:o;24049:128::-;24089:3;24120:1;24116:6;24113:1;24110:13;24107:39;;;24126:18;;:::i;:::-;-1:-1:-1;24162:9:1;;24049:128::o;25406:125::-;25446:4;25474:1;25471;25468:8;25465:34;;;25479:18;;:::i;:::-;-1:-1:-1;25516:9:1;;25406:125::o;25536:168::-;25576:7;25642:1;25638;25634:6;25630:14;25627:1;25624:21;25619:1;25612:9;25605:17;25601:45;25598:71;;;25649:18;;:::i;:::-;-1:-1:-1;25689:9:1;;25536:168::o;26063:414::-;26265:2;26247:21;;;26304:2;26284:18;;;26277:30;26343:34;26338:2;26323:18;;26316:62;-1:-1:-1;;;26409:2:1;26394:18;;26387:48;26467:3;26452:19;;26063:414::o;26482:489::-;-1:-1:-1;;;;;26751:15:1;;;26733:34;;26803:15;;26798:2;26783:18;;26776:43;26850:2;26835:18;;26828:34;;;26898:3;26893:2;26878:18;;26871:31;;;26676:4;;26919:46;;26945:19;;26937:6;26919:46;:::i;26976:249::-;27045:6;27098:2;27086:9;27077:7;27073:23;27069:32;27066:52;;;27114:1;27111;27104:12;27066:52;27146:9;27140:16;27165:30;27189:5;27165:30;:::i;27230:127::-;27291:10;27286:3;27282:20;27279:1;27272:31;27322:4;27319:1;27312:15;27346:4;27343:1;27336:15
Swarm Source
ipfs://c28e837c89a2345f8255cb532fe638dce8e3af4ef2861826b66ce294856ae350
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.