Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ForTheBurn
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-09 */ // SPDX-License-Identifier: MIT // 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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/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/[email protected]/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (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`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/ERC721.sol pragma solidity ^0.8.0; contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal currentIndex; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) internal _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view returns (uint256) { require(index < totalSupply(), 'ERC721A: global index out of bounds'); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < balanceOf(owner), 'ERC721A: owner index out of bounds'); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert('ERC721A: unable to get token of owner by index'); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721A: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number minted query for the zero address'); return uint256(_addressData[owner].numberMinted); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), 'ERC721A: owner query for nonexistent token'); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert('ERC721A: unable to determine the owner of token'); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, 'ERC721A: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721A: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721A: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721A: approve to caller'); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = currentIndex; require(to != address(0), 'ERC721A: mint to the zero address'); require(quantity != 0, 'ERC721A: quantity must be greater than 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } updatedIndex++; } currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner'); require(to != address(0), 'ERC721A: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) internal { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721A: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: ForTheBurn.sol contract ForTheBurn is ERC721A, Ownable { using Strings for uint256; mapping (address => uint) nftCounts; bool revealed = false; string public uriPrereveal = "ipfs://QmemwoJQ4SBStUgVEU5pcNg6dVSNxU3ngeo4D6HduUeRxD"; string public uriPrefix = "ipfs://"; string public uriSuffix = ".json"; string _contractURI = "ipfs://QmSF182rUVYUsm2vcY5d7EdFVguPw3Uxw48g3Mx1WL46EQ"; uint256 constant maxSupply = 6969; uint256 maxSupplyModifier = 0; uint256 mintAmount = 1; uint256 constant maxMintAmount = 10; uint256 constant maxMintAmountPerTx = 1; uint256 maxMintAmountPerWallet = 1; address constant public royaltiesPayoutAddress = 0x49e543E966025C3D734926699cAF584DD43b0Bf7; uint256 public royaltiesPercent = 1000; // out of 10000 = 10% event Received(address, uint); receive() external payable { emit Received(msg.sender, msg.value); } constructor() ERC721A("For the Burn", "FTB") { _safeMint(msg.sender, 69); } function mint() external { require(nftCounts[msg.sender] < maxMintAmountPerWallet, "Exceeds mint amount per wallet!"); require(totalSupply() + mintAmount <= maxSupply + maxSupplyModifier, "Max supply exceeded!"); nftCounts[msg.sender] += mintAmount; _safeMint(msg.sender, mintAmount); if(totalSupply() + mintAmount > maxSupply + maxSupplyModifier) { unchecked { uint256 maxMaxSupplyModifier = 0; maxMaxSupplyModifier = maxMaxSupplyModifier - 1 - maxSupply; if(maxMaxSupplyModifier >= maxSupplyModifier + maxSupply) { maxSupplyModifier += maxSupply; } else { maxSupplyModifier = maxMaxSupplyModifier; } if(mintAmount <= maxMintAmount) { mintAmount++; } maxMintAmountPerWallet += mintAmount; } } } function ownerMint(uint256 _mintAmount) external onlyOwner { require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!"); _safeMint(msg.sender, mintAmount); } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "Non-existent token given!"); if(!revealed) { return uriPrereveal; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function setUriPrefix(string memory _uriPrefix) external onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) external onlyOwner { uriSuffix = _uriSuffix; } function setPrerevealUri(string memory _uriPrereveal) external onlyOwner { uriPrereveal = _uriPrereveal; } function withdrawAll() external onlyOwner { uint256 balance = address(this).balance; require(balance > 0); _withdraw(owner(), address(this).balance); } function _withdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "Transfer failed."); } function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount) { require(_exists(tokenId), "Non-existent token given!"); require(salePrice > 0, "Sale price must be greater than 0!"); return (royaltiesPayoutAddress, (salePrice * royaltiesPercent) / 10000); } function setRoyaltiesPercent(uint256 _royalitesPercent) external onlyOwner { require(_royalitesPercent > 0, "Royalties percent must be greater than 0!"); require(_royalitesPercent <= 10000, "Royalties percent must be less than or equal to 10000!"); royaltiesPercent = _royalitesPercent; } function setMintAmount(uint256 _mintAmount) external onlyOwner { mintAmount = _mintAmount; } function setMaxMintPerWallet(uint256 _maxMintAmountPerWallet) external onlyOwner { maxMintAmountPerWallet = _maxMintAmountPerWallet; } function supportsInterface(bytes4 interfaceId) public view virtual override (ERC721A) returns (bool) { return (interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId)); } function batchTransfer(uint256 startTokenId, uint256 quantity, address _recipient) external { require(quantity>=2); unchecked { TokenOwnership memory prevOwnership = ownershipOf(startTokenId); require(_ownerships[startTokenId].addr == msg.sender); _approve(address(0), startTokenId, msg.sender); emit Transfer(msg.sender, _recipient, startTokenId); for (uint256 i = 1; i < quantity; i++) { require(_ownerships[startTokenId].addr == address(0)); _approve(address(0), startTokenId+i, msg.sender); emit Transfer(msg.sender, _recipient, startTokenId+i); } _addressData[msg.sender].balance -= uint128(quantity); _addressData[_recipient].balance += uint128(quantity); uint256 nextTokenId = startTokenId + quantity + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = msg.sender; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } } function contractURI() public view returns (string memory) { return _contractURI; } function setContractURI(string memory mContractURI) external onlyOwner { _contractURI = mContractURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","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":[{"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":"startTokenId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"mint","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":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"royaltiesPayoutAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltiesPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"mContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerWallet","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"setMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrereveal","type":"string"}],"name":"setPrerevealUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royalitesPercent","type":"uint256"}],"name":"setRoyaltiesPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrereveal","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6009805460ff1916905560e0604052603560808181529062002e9e60a03980516200003391600a9160209091019062000594565b5060408051808201909152600780825266697066733a2f2f60c81b60209092019182526200006491600b9162000594565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200009391600c9162000594565b5060405180606001604052806035815260200162002ed3603591398051620000c491600d9160209091019062000594565b506000600e556001600f5560016010556103e8601155348015620000e757600080fd5b50604080518082018252600c81526b2337b9103a343290213ab93760a11b602080830191825283518085019094526003845262232a2160e91b908401528151919291620001379160019162000594565b5080516200014d90600290602084019062000594565b5050506200016a620001646200017d60201b60201c565b62000181565b62000177336045620001d3565b62000725565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001f5828260405180602001604052806000815250620001f960201b60201c565b5050565b6200020883838360016200020d565b505050565b6000546001600160a01b038516620002765760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b83620002d65760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b60648201526084016200026d565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b85811015620004105760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483156200040357620003aa60008884886200041b565b620004035760405162461bcd60e51b8152602060048201526033602482015260008051602062002f0883398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b60648201526084016200026d565b6001918201910162000353565b506000555050505050565b60006200043c846001600160a01b03166200058560201b6200172c1760201c565b156200057957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290620004769033908990889088906004016200066d565b602060405180830381600087803b1580156200049157600080fd5b505af1925050508015620004c4575060408051601f3d908101601f19168201909252620004c1918101906200063a565b60015b6200055e573d808015620004f5576040519150601f19603f3d011682016040523d82523d6000602084013e620004fa565b606091505b508051620005565760405162461bcd60e51b8152602060048201526033602482015260008051602062002f0883398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b60648201526084016200026d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506200057d565b5060015b949350505050565b6001600160a01b03163b151590565b828054620005a290620006e8565b90600052602060002090601f016020900481019282620005c6576000855562000611565b82601f10620005e157805160ff191683800117855562000611565b8280016001018555821562000611579182015b8281111562000611578251825591602001919060010190620005f4565b506200061f92915062000623565b5090565b5b808211156200061f576000815560010162000624565b6000602082840312156200064d57600080fd5b81516001600160e01b0319811681146200066657600080fd5b9392505050565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b82811015620006bc5785810182015185820160a0015281016200069e565b82811115620006cf57600060a084870101525b5050601f01601f19169190910160a00195945050505050565b600181811c90821680620006fd57607f821691505b602082108114156200071f57634e487b7160e01b600052602260045260246000fd5b50919050565b61276980620007356000396000f3fe60806040526004361061021d5760003560e01c8063715018a611610123578063afdf6134116100ab578063e07c46051161006f578063e07c46051461065f578063e8a3d4851461067f578063e985e9c514610694578063f19e75d4146106dd578063f2fde38b146106fd57600080fd5b8063afdf6134146105bf578063b88d4fde146105df578063c7cd997f146105ff578063c87b56dd1461061f578063dc02c8221461063f57600080fd5b8063938e3d7b116100f2578063938e3d7b1461053f57806395d89b411461055f5780639e91c70214610574578063a1a75f4a1461058a578063a22cb4651461059f57600080fd5b8063715018a6146104d75780637ec4a659146104ec578063853828b61461050c5780638da5cb5b1461052157600080fd5b80632822a5a8116101a65780634f6ccce7116101755780634f6ccce71461044d5780635503a0e81461046d57806362b99ad4146104825780636352211e1461049757806370a08231146104b757600080fd5b80632822a5a8146103ae5780632a55205a146103ce5780632f745c591461040d57806342842e0e1461042d57600080fd5b8063095ea7b3116101ed578063095ea7b3146103185780631249c58b1461033a57806316ba10e01461034f57806318160ddd1461036f57806323b872dd1461038e57600080fd5b8062891bda1461026157806301ffc9a7146102a657806306fdde03146102d6578063081812fc146102f857600080fd5b3661025c57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561026d57600080fd5b506102897349e543e966025c3d734926699caf584dd43b0bf781565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102b257600080fd5b506102c66102c13660046122f2565b61071d565b604051901515815260200161029d565b3480156102e257600080fd5b506102eb610748565b60405161029d9190612512565b34801561030457600080fd5b50610289610313366004612375565b6107da565b34801561032457600080fd5b506103386103333660046122c8565b61086a565b005b34801561034657600080fd5b50610338610982565b34801561035b57600080fd5b5061033861036a36600461232c565b610aeb565b34801561037b57600080fd5b506000545b60405190815260200161029d565b34801561039a57600080fd5b506103386103a93660046121d4565b610b2c565b3480156103ba57600080fd5b506103386103c936600461232c565b610b37565b3480156103da57600080fd5b506103ee6103e936600461238e565b610b74565b604080516001600160a01b03909316835260208301919091520161029d565b34801561041957600080fd5b506103806104283660046122c8565b610c60565b34801561043957600080fd5b506103386104483660046121d4565b610dbd565b34801561045957600080fd5b50610380610468366004612375565b610dd8565b34801561047957600080fd5b506102eb610e3a565b34801561048e57600080fd5b506102eb610ec8565b3480156104a357600080fd5b506102896104b2366004612375565b610ed5565b3480156104c357600080fd5b506103806104d2366004612186565b610ee7565b3480156104e357600080fd5b50610338610f78565b3480156104f857600080fd5b5061033861050736600461232c565b610fac565b34801561051857600080fd5b50610338610fe9565b34801561052d57600080fd5b506007546001600160a01b0316610289565b34801561054b57600080fd5b5061033861055a36600461232c565b61103c565b34801561056b57600080fd5b506102eb611079565b34801561058057600080fd5b5061038060115481565b34801561059657600080fd5b506102eb611088565b3480156105ab57600080fd5b506103386105ba36600461228c565b611095565b3480156105cb57600080fd5b506103386105da366004612375565b61115a565b3480156105eb57600080fd5b506103386105fa366004612210565b611189565b34801561060b57600080fd5b5061033861061a366004612375565b6111c2565b34801561062b57600080fd5b506102eb61063a366004612375565b6111f1565b34801561064b57600080fd5b5061033861065a3660046123b0565b611341565b34801561066b57600080fd5b5061033861067a366004612375565b6114f1565b34801561068b57600080fd5b506102eb6115f3565b3480156106a057600080fd5b506102c66106af3660046121a1565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156106e957600080fd5b506103386106f8366004612375565b611602565b34801561070957600080fd5b50610338610718366004612186565b611694565b60006001600160e01b0319821663152a902d60e11b148061074257506107428261173b565b92915050565b6060600180546107579061263b565b80601f01602080910402602001604051908101604052809291908181526020018280546107839061263b565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b60006107e7826000541190565b61084e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061087582610ed5565b9050806001600160a01b0316836001600160a01b031614156108e45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610845565b336001600160a01b0382161480610900575061090081336106af565b6109725760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610845565b61097d83838361178b565b505050565b60105433600090815260086020526040902054106109e25760405162461bcd60e51b815260206004820152601f60248201527f45786365656473206d696e7420616d6f756e74207065722077616c6c657421006044820152606401610845565b600e546109f190611b396125ad565b600f54600054610a0191906125ad565b1115610a465760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610845565b600f543360009081526008602052604081208054909190610a689084906125ad565b92505081905550610a7b33600f546117e7565b600e54610a8a90611b396125ad565b600f54600054610a9a91906125ad565b1115610ae957600e54611b391990611b39018110610ac157600e8054611b39019055610ac7565b600e8190555b600a600f5411610adb57600f805460010190555b50600f546010805490910190555b565b6007546001600160a01b03163314610b155760405162461bcd60e51b815260040161084590612525565b8051610b2890600c906020840190612064565b5050565b61097d838383611801565b6007546001600160a01b03163314610b615760405162461bcd60e51b815260040161084590612525565b8051610b2890600a906020840190612064565b600080610b82846000541190565b610bca5760405162461bcd60e51b81526020600482015260196024820152784e6f6e2d6578697374656e7420746f6b656e20676976656e2160381b6044820152606401610845565b60008311610c255760405162461bcd60e51b815260206004820152602260248201527f53616c65207072696365206d7573742062652067726561746572207468616e20604482015261302160f01b6064820152608401610845565b7349e543e966025c3d734926699caf584dd43b0bf761271060115485610c4b91906125d9565b610c5591906125c5565b915091509250929050565b6000610c6b83610ee7565b8210610cc45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610845565b600080549080805b83811015610d5d576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610d1f57805192505b876001600160a01b0316836001600160a01b03161415610d545786841415610d4d5750935061074292505050565b6001909301925b50600101610ccc565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610845565b61097d83838360405180602001604052806000815250611189565b600080548210610e365760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610845565b5090565b600c8054610e479061263b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e739061263b565b8015610ec05780601f10610e9557610100808354040283529160200191610ec0565b820191906000526020600020905b815481529060010190602001808311610ea357829003601f168201915b505050505081565b600b8054610e479061263b565b6000610ee082611ad1565b5192915050565b60006001600160a01b038216610f535760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610845565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610fa25760405162461bcd60e51b815260040161084590612525565b610ae96000611ba8565b6007546001600160a01b03163314610fd65760405162461bcd60e51b815260040161084590612525565b8051610b2890600b906020840190612064565b6007546001600160a01b031633146110135760405162461bcd60e51b815260040161084590612525565b478061101e57600080fd5b6110396110336007546001600160a01b031690565b47611bfa565b50565b6007546001600160a01b031633146110665760405162461bcd60e51b815260040161084590612525565b8051610b2890600d906020840190612064565b6060600280546107579061263b565b600a8054610e479061263b565b6001600160a01b0382163314156110ee5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610845565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146111845760405162461bcd60e51b815260040161084590612525565b601055565b611194848484611801565b6111a084848484611c90565b6111bc5760405162461bcd60e51b81526004016108459061255a565b50505050565b6007546001600160a01b031633146111ec5760405162461bcd60e51b815260040161084590612525565b600f55565b60606111fe826000541190565b6112465760405162461bcd60e51b81526020600482015260196024820152784e6f6e2d6578697374656e7420746f6b656e20676976656e2160381b6044820152606401610845565b60095460ff166112e257600a805461125d9061263b565b80601f01602080910402602001604051908101604052809291908181526020018280546112899061263b565b80156112d65780601f106112ab576101008083540402835291602001916112d6565b820191906000526020600020905b8154815290600101906020018083116112b957829003601f168201915b50505050509050919050565b60006112ec611d9e565b9050600081511161130c576040518060200160405280600081525061133a565b8061131684611dad565b600c60405160200161132a93929190612411565b6040516020818303038152906040525b9392505050565b600282101561134f57600080fd5b600061135a84611ad1565b6000858152600360205260409020549091506001600160a01b0316331461138057600080fd5b61138c6000853361178b565b60405184906001600160a01b03841690339060008051602061271483398151915290600090a460015b8381101561141d576000858152600360205260409020546001600160a01b0316156113df57600080fd5b6113ed60008287013361178b565b604051858201906001600160a01b03851690339060008051602061271483398151915290600090a46001016113b5565b5033600090815260046020908152604080832080546001600160801b03198082166001600160801b039283168a90038316179092556001600160a01b03878116865283862080549384169383168a0190921692909217905587870160010180855260039093529220549091166114ea57611498816000541190565b156114ea57600081815260036020908152604090912080549184015167ffffffffffffffff16600160a01b0267ffffffffffffffff60a01b1933166001600160e01b0319909316929092179190911790555b5050505050565b6007546001600160a01b0316331461151b5760405162461bcd60e51b815260040161084590612525565b6000811161157d5760405162461bcd60e51b815260206004820152602960248201527f526f79616c746965732070657263656e74206d7573742062652067726561746560448201526872207468616e20302160b81b6064820152608401610845565b6127108111156115ee5760405162461bcd60e51b815260206004820152603660248201527f526f79616c746965732070657263656e74206d757374206265206c657373207460448201527568616e206f7220657175616c20746f2031303030302160501b6064820152608401610845565b601155565b6060600d80546107579061263b565b6007546001600160a01b0316331461162c5760405162461bcd60e51b815260040161084590612525565b611b398161163960005490565b61164391906125ad565b11156116885760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610845565b61103933600f546117e7565b6007546001600160a01b031633146116be5760405162461bcd60e51b815260040161084590612525565b6001600160a01b0381166117235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610845565b61103981611ba8565b6001600160a01b03163b151590565b60006001600160e01b031982166380ac58cd60e01b148061176c57506001600160e01b03198216635b5e139f60e01b145b8061074257506301ffc9a760e01b6001600160e01b0319831614610742565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610b28828260405180602001604052806000815250611eab565b600061180c82611ad1565b80519091506000906001600160a01b0316336001600160a01b03161480611843575033611838846107da565b6001600160a01b0316145b806118555750815161185590336106af565b9050806118bf5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610845565b846001600160a01b031682600001516001600160a01b0316146119335760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610845565b6001600160a01b0384166119975760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610845565b6119a7600084846000015161178b565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116611a9c57611a4f816000541190565b15611a9c578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b031660008051602061271483398151915260405160405180910390a46114ea565b6040805180820190915260008082526020820152611af0826000541190565b611b4f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610845565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611b9e579392505050565b5060001901611b51565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611c47576040519150601f19603f3d011682016040523d82523d6000602084013e611c4c565b606091505b505090508061097d5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610845565b60006001600160a01b0384163b15611d9257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611cd49033908990889088906004016124d5565b602060405180830381600087803b158015611cee57600080fd5b505af1925050508015611d1e575060408051601f3d908101601f19168201909252611d1b9181019061230f565b60015b611d78573d808015611d4c576040519150601f19603f3d011682016040523d82523d6000602084013e611d51565b606091505b508051611d705760405162461bcd60e51b81526004016108459061255a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d96565b5060015b949350505050565b6060600b80546107579061263b565b606081611dd15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dfb5780611de581612676565b9150611df49050600a836125c5565b9150611dd5565b60008167ffffffffffffffff811115611e1657611e166126e7565b6040519080825280601f01601f191660200182016040528015611e40576020820181803683370190505b5090505b8415611d9657611e556001836125f8565b9150611e62600a86612691565b611e6d9060306125ad565b60f81b818381518110611e8257611e826126d1565b60200101906001600160f81b031916908160001a905350611ea4600a866125c5565b9450611e44565b61097d83838360016000546001600160a01b038516611f165760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610845565b83611f745760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610845565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b8581101561205b5760405182906001600160a01b03891690600090600080516020612714833981519152908290a4831561204f576120336000888488611c90565b61204f5760405162461bcd60e51b81526004016108459061255a565b60019182019101611ff2565b506000556114ea565b8280546120709061263b565b90600052602060002090601f01602090048101928261209257600085556120d8565b82601f106120ab57805160ff19168380011785556120d8565b828001600101855582156120d8579182015b828111156120d85782518255916020019190600101906120bd565b50610e369291505b80821115610e3657600081556001016120e0565b600067ffffffffffffffff8084111561210f5761210f6126e7565b604051601f8501601f19908116603f01168101908282118183101715612137576121376126e7565b8160405280935085815286868601111561215057600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461218157600080fd5b919050565b60006020828403121561219857600080fd5b61133a8261216a565b600080604083850312156121b457600080fd5b6121bd8361216a565b91506121cb6020840161216a565b90509250929050565b6000806000606084860312156121e957600080fd5b6121f28461216a565b92506122006020850161216a565b9150604084013590509250925092565b6000806000806080858703121561222657600080fd5b61222f8561216a565b935061223d6020860161216a565b925060408501359150606085013567ffffffffffffffff81111561226057600080fd5b8501601f8101871361227157600080fd5b612280878235602084016120f4565b91505092959194509250565b6000806040838503121561229f57600080fd5b6122a88361216a565b9150602083013580151581146122bd57600080fd5b809150509250929050565b600080604083850312156122db57600080fd5b6122e48361216a565b946020939093013593505050565b60006020828403121561230457600080fd5b813561133a816126fd565b60006020828403121561232157600080fd5b815161133a816126fd565b60006020828403121561233e57600080fd5b813567ffffffffffffffff81111561235557600080fd5b8201601f8101841361236657600080fd5b611d96848235602084016120f4565b60006020828403121561238757600080fd5b5035919050565b600080604083850312156123a157600080fd5b50508035926020909101359150565b6000806000606084860312156123c557600080fd5b83359250602084013591506123dc6040850161216a565b90509250925092565b600081518084526123fd81602086016020860161260f565b601f01601f19169290920160200192915050565b6000845160206124248285838a0161260f565b8551918401916124378184848a0161260f565b8554920191600090600181811c908083168061245457607f831692505b85831081141561247257634e487b7160e01b85526022600452602485fd5b8080156124865760018114612497576124c4565b60ff198516885283880195506124c4565b60008b81526020902060005b858110156124bc5781548a8201529084019088016124a3565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612508908301846123e5565b9695505050505050565b60208152600061133a60208301846123e5565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600082198211156125c0576125c06126a5565b500190565b6000826125d4576125d46126bb565b500490565b60008160001904831182151516156125f3576125f36126a5565b500290565b60008282101561260a5761260a6126a5565b500390565b60005b8381101561262a578181015183820152602001612612565b838111156111bc5750506000910152565b600181811c9082168061264f57607f821691505b6020821081141561267057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561268a5761268a6126a5565b5060010190565b6000826126a0576126a06126bb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461103957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212205c1e0176cf79e32b61174fb13acad206d58c84593acf74eafb29809d55931a0a64736f6c63430008070033697066733a2f2f516d656d776f4a51345342537455675645553570634e67366456534e7855336e67656f3444364864755565527844697066733a2f2f516d53463138327255565955736d32766359356437456446566775507733557877343867334d7831574c34364551455243373231413a207472616e7366657220746f206e6f6e2045524337323152
Deployed Bytecode
0x60806040526004361061021d5760003560e01c8063715018a611610123578063afdf6134116100ab578063e07c46051161006f578063e07c46051461065f578063e8a3d4851461067f578063e985e9c514610694578063f19e75d4146106dd578063f2fde38b146106fd57600080fd5b8063afdf6134146105bf578063b88d4fde146105df578063c7cd997f146105ff578063c87b56dd1461061f578063dc02c8221461063f57600080fd5b8063938e3d7b116100f2578063938e3d7b1461053f57806395d89b411461055f5780639e91c70214610574578063a1a75f4a1461058a578063a22cb4651461059f57600080fd5b8063715018a6146104d75780637ec4a659146104ec578063853828b61461050c5780638da5cb5b1461052157600080fd5b80632822a5a8116101a65780634f6ccce7116101755780634f6ccce71461044d5780635503a0e81461046d57806362b99ad4146104825780636352211e1461049757806370a08231146104b757600080fd5b80632822a5a8146103ae5780632a55205a146103ce5780632f745c591461040d57806342842e0e1461042d57600080fd5b8063095ea7b3116101ed578063095ea7b3146103185780631249c58b1461033a57806316ba10e01461034f57806318160ddd1461036f57806323b872dd1461038e57600080fd5b8062891bda1461026157806301ffc9a7146102a657806306fdde03146102d6578063081812fc146102f857600080fd5b3661025c57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561026d57600080fd5b506102897349e543e966025c3d734926699caf584dd43b0bf781565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102b257600080fd5b506102c66102c13660046122f2565b61071d565b604051901515815260200161029d565b3480156102e257600080fd5b506102eb610748565b60405161029d9190612512565b34801561030457600080fd5b50610289610313366004612375565b6107da565b34801561032457600080fd5b506103386103333660046122c8565b61086a565b005b34801561034657600080fd5b50610338610982565b34801561035b57600080fd5b5061033861036a36600461232c565b610aeb565b34801561037b57600080fd5b506000545b60405190815260200161029d565b34801561039a57600080fd5b506103386103a93660046121d4565b610b2c565b3480156103ba57600080fd5b506103386103c936600461232c565b610b37565b3480156103da57600080fd5b506103ee6103e936600461238e565b610b74565b604080516001600160a01b03909316835260208301919091520161029d565b34801561041957600080fd5b506103806104283660046122c8565b610c60565b34801561043957600080fd5b506103386104483660046121d4565b610dbd565b34801561045957600080fd5b50610380610468366004612375565b610dd8565b34801561047957600080fd5b506102eb610e3a565b34801561048e57600080fd5b506102eb610ec8565b3480156104a357600080fd5b506102896104b2366004612375565b610ed5565b3480156104c357600080fd5b506103806104d2366004612186565b610ee7565b3480156104e357600080fd5b50610338610f78565b3480156104f857600080fd5b5061033861050736600461232c565b610fac565b34801561051857600080fd5b50610338610fe9565b34801561052d57600080fd5b506007546001600160a01b0316610289565b34801561054b57600080fd5b5061033861055a36600461232c565b61103c565b34801561056b57600080fd5b506102eb611079565b34801561058057600080fd5b5061038060115481565b34801561059657600080fd5b506102eb611088565b3480156105ab57600080fd5b506103386105ba36600461228c565b611095565b3480156105cb57600080fd5b506103386105da366004612375565b61115a565b3480156105eb57600080fd5b506103386105fa366004612210565b611189565b34801561060b57600080fd5b5061033861061a366004612375565b6111c2565b34801561062b57600080fd5b506102eb61063a366004612375565b6111f1565b34801561064b57600080fd5b5061033861065a3660046123b0565b611341565b34801561066b57600080fd5b5061033861067a366004612375565b6114f1565b34801561068b57600080fd5b506102eb6115f3565b3480156106a057600080fd5b506102c66106af3660046121a1565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156106e957600080fd5b506103386106f8366004612375565b611602565b34801561070957600080fd5b50610338610718366004612186565b611694565b60006001600160e01b0319821663152a902d60e11b148061074257506107428261173b565b92915050565b6060600180546107579061263b565b80601f01602080910402602001604051908101604052809291908181526020018280546107839061263b565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b60006107e7826000541190565b61084e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061087582610ed5565b9050806001600160a01b0316836001600160a01b031614156108e45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610845565b336001600160a01b0382161480610900575061090081336106af565b6109725760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610845565b61097d83838361178b565b505050565b60105433600090815260086020526040902054106109e25760405162461bcd60e51b815260206004820152601f60248201527f45786365656473206d696e7420616d6f756e74207065722077616c6c657421006044820152606401610845565b600e546109f190611b396125ad565b600f54600054610a0191906125ad565b1115610a465760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610845565b600f543360009081526008602052604081208054909190610a689084906125ad565b92505081905550610a7b33600f546117e7565b600e54610a8a90611b396125ad565b600f54600054610a9a91906125ad565b1115610ae957600e54611b391990611b39018110610ac157600e8054611b39019055610ac7565b600e8190555b600a600f5411610adb57600f805460010190555b50600f546010805490910190555b565b6007546001600160a01b03163314610b155760405162461bcd60e51b815260040161084590612525565b8051610b2890600c906020840190612064565b5050565b61097d838383611801565b6007546001600160a01b03163314610b615760405162461bcd60e51b815260040161084590612525565b8051610b2890600a906020840190612064565b600080610b82846000541190565b610bca5760405162461bcd60e51b81526020600482015260196024820152784e6f6e2d6578697374656e7420746f6b656e20676976656e2160381b6044820152606401610845565b60008311610c255760405162461bcd60e51b815260206004820152602260248201527f53616c65207072696365206d7573742062652067726561746572207468616e20604482015261302160f01b6064820152608401610845565b7349e543e966025c3d734926699caf584dd43b0bf761271060115485610c4b91906125d9565b610c5591906125c5565b915091509250929050565b6000610c6b83610ee7565b8210610cc45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610845565b600080549080805b83811015610d5d576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610d1f57805192505b876001600160a01b0316836001600160a01b03161415610d545786841415610d4d5750935061074292505050565b6001909301925b50600101610ccc565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610845565b61097d83838360405180602001604052806000815250611189565b600080548210610e365760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610845565b5090565b600c8054610e479061263b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e739061263b565b8015610ec05780601f10610e9557610100808354040283529160200191610ec0565b820191906000526020600020905b815481529060010190602001808311610ea357829003601f168201915b505050505081565b600b8054610e479061263b565b6000610ee082611ad1565b5192915050565b60006001600160a01b038216610f535760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610845565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610fa25760405162461bcd60e51b815260040161084590612525565b610ae96000611ba8565b6007546001600160a01b03163314610fd65760405162461bcd60e51b815260040161084590612525565b8051610b2890600b906020840190612064565b6007546001600160a01b031633146110135760405162461bcd60e51b815260040161084590612525565b478061101e57600080fd5b6110396110336007546001600160a01b031690565b47611bfa565b50565b6007546001600160a01b031633146110665760405162461bcd60e51b815260040161084590612525565b8051610b2890600d906020840190612064565b6060600280546107579061263b565b600a8054610e479061263b565b6001600160a01b0382163314156110ee5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610845565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146111845760405162461bcd60e51b815260040161084590612525565b601055565b611194848484611801565b6111a084848484611c90565b6111bc5760405162461bcd60e51b81526004016108459061255a565b50505050565b6007546001600160a01b031633146111ec5760405162461bcd60e51b815260040161084590612525565b600f55565b60606111fe826000541190565b6112465760405162461bcd60e51b81526020600482015260196024820152784e6f6e2d6578697374656e7420746f6b656e20676976656e2160381b6044820152606401610845565b60095460ff166112e257600a805461125d9061263b565b80601f01602080910402602001604051908101604052809291908181526020018280546112899061263b565b80156112d65780601f106112ab576101008083540402835291602001916112d6565b820191906000526020600020905b8154815290600101906020018083116112b957829003601f168201915b50505050509050919050565b60006112ec611d9e565b9050600081511161130c576040518060200160405280600081525061133a565b8061131684611dad565b600c60405160200161132a93929190612411565b6040516020818303038152906040525b9392505050565b600282101561134f57600080fd5b600061135a84611ad1565b6000858152600360205260409020549091506001600160a01b0316331461138057600080fd5b61138c6000853361178b565b60405184906001600160a01b03841690339060008051602061271483398151915290600090a460015b8381101561141d576000858152600360205260409020546001600160a01b0316156113df57600080fd5b6113ed60008287013361178b565b604051858201906001600160a01b03851690339060008051602061271483398151915290600090a46001016113b5565b5033600090815260046020908152604080832080546001600160801b03198082166001600160801b039283168a90038316179092556001600160a01b03878116865283862080549384169383168a0190921692909217905587870160010180855260039093529220549091166114ea57611498816000541190565b156114ea57600081815260036020908152604090912080549184015167ffffffffffffffff16600160a01b0267ffffffffffffffff60a01b1933166001600160e01b0319909316929092179190911790555b5050505050565b6007546001600160a01b0316331461151b5760405162461bcd60e51b815260040161084590612525565b6000811161157d5760405162461bcd60e51b815260206004820152602960248201527f526f79616c746965732070657263656e74206d7573742062652067726561746560448201526872207468616e20302160b81b6064820152608401610845565b6127108111156115ee5760405162461bcd60e51b815260206004820152603660248201527f526f79616c746965732070657263656e74206d757374206265206c657373207460448201527568616e206f7220657175616c20746f2031303030302160501b6064820152608401610845565b601155565b6060600d80546107579061263b565b6007546001600160a01b0316331461162c5760405162461bcd60e51b815260040161084590612525565b611b398161163960005490565b61164391906125ad565b11156116885760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610845565b61103933600f546117e7565b6007546001600160a01b031633146116be5760405162461bcd60e51b815260040161084590612525565b6001600160a01b0381166117235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610845565b61103981611ba8565b6001600160a01b03163b151590565b60006001600160e01b031982166380ac58cd60e01b148061176c57506001600160e01b03198216635b5e139f60e01b145b8061074257506301ffc9a760e01b6001600160e01b0319831614610742565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610b28828260405180602001604052806000815250611eab565b600061180c82611ad1565b80519091506000906001600160a01b0316336001600160a01b03161480611843575033611838846107da565b6001600160a01b0316145b806118555750815161185590336106af565b9050806118bf5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610845565b846001600160a01b031682600001516001600160a01b0316146119335760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610845565b6001600160a01b0384166119975760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610845565b6119a7600084846000015161178b565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116611a9c57611a4f816000541190565b15611a9c578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b031660008051602061271483398151915260405160405180910390a46114ea565b6040805180820190915260008082526020820152611af0826000541190565b611b4f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610845565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611b9e579392505050565b5060001901611b51565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611c47576040519150601f19603f3d011682016040523d82523d6000602084013e611c4c565b606091505b505090508061097d5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610845565b60006001600160a01b0384163b15611d9257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611cd49033908990889088906004016124d5565b602060405180830381600087803b158015611cee57600080fd5b505af1925050508015611d1e575060408051601f3d908101601f19168201909252611d1b9181019061230f565b60015b611d78573d808015611d4c576040519150601f19603f3d011682016040523d82523d6000602084013e611d51565b606091505b508051611d705760405162461bcd60e51b81526004016108459061255a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d96565b5060015b949350505050565b6060600b80546107579061263b565b606081611dd15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dfb5780611de581612676565b9150611df49050600a836125c5565b9150611dd5565b60008167ffffffffffffffff811115611e1657611e166126e7565b6040519080825280601f01601f191660200182016040528015611e40576020820181803683370190505b5090505b8415611d9657611e556001836125f8565b9150611e62600a86612691565b611e6d9060306125ad565b60f81b818381518110611e8257611e826126d1565b60200101906001600160f81b031916908160001a905350611ea4600a866125c5565b9450611e44565b61097d83838360016000546001600160a01b038516611f165760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610845565b83611f745760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610845565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b8581101561205b5760405182906001600160a01b03891690600090600080516020612714833981519152908290a4831561204f576120336000888488611c90565b61204f5760405162461bcd60e51b81526004016108459061255a565b60019182019101611ff2565b506000556114ea565b8280546120709061263b565b90600052602060002090601f01602090048101928261209257600085556120d8565b82601f106120ab57805160ff19168380011785556120d8565b828001600101855582156120d8579182015b828111156120d85782518255916020019190600101906120bd565b50610e369291505b80821115610e3657600081556001016120e0565b600067ffffffffffffffff8084111561210f5761210f6126e7565b604051601f8501601f19908116603f01168101908282118183101715612137576121376126e7565b8160405280935085815286868601111561215057600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461218157600080fd5b919050565b60006020828403121561219857600080fd5b61133a8261216a565b600080604083850312156121b457600080fd5b6121bd8361216a565b91506121cb6020840161216a565b90509250929050565b6000806000606084860312156121e957600080fd5b6121f28461216a565b92506122006020850161216a565b9150604084013590509250925092565b6000806000806080858703121561222657600080fd5b61222f8561216a565b935061223d6020860161216a565b925060408501359150606085013567ffffffffffffffff81111561226057600080fd5b8501601f8101871361227157600080fd5b612280878235602084016120f4565b91505092959194509250565b6000806040838503121561229f57600080fd5b6122a88361216a565b9150602083013580151581146122bd57600080fd5b809150509250929050565b600080604083850312156122db57600080fd5b6122e48361216a565b946020939093013593505050565b60006020828403121561230457600080fd5b813561133a816126fd565b60006020828403121561232157600080fd5b815161133a816126fd565b60006020828403121561233e57600080fd5b813567ffffffffffffffff81111561235557600080fd5b8201601f8101841361236657600080fd5b611d96848235602084016120f4565b60006020828403121561238757600080fd5b5035919050565b600080604083850312156123a157600080fd5b50508035926020909101359150565b6000806000606084860312156123c557600080fd5b83359250602084013591506123dc6040850161216a565b90509250925092565b600081518084526123fd81602086016020860161260f565b601f01601f19169290920160200192915050565b6000845160206124248285838a0161260f565b8551918401916124378184848a0161260f565b8554920191600090600181811c908083168061245457607f831692505b85831081141561247257634e487b7160e01b85526022600452602485fd5b8080156124865760018114612497576124c4565b60ff198516885283880195506124c4565b60008b81526020902060005b858110156124bc5781548a8201529084019088016124a3565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612508908301846123e5565b9695505050505050565b60208152600061133a60208301846123e5565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600082198211156125c0576125c06126a5565b500190565b6000826125d4576125d46126bb565b500490565b60008160001904831182151516156125f3576125f36126a5565b500290565b60008282101561260a5761260a6126a5565b500390565b60005b8381101561262a578181015183820152602001612612565b838111156111bc5750506000910152565b600181811c9082168061264f57607f821691505b6020821081141561267057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561268a5761268a6126a5565b5060010190565b6000826126a0576126a06126bb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461103957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212205c1e0176cf79e32b61174fb13acad206d58c84593acf74eafb29809d55931a0a64736f6c63430008070033
Deployed Bytecode Sourcemap
39815:5888:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40677:31;;;40686:10;7502:51:1;;40698:9:0;7584:2:1;7569:18;;7562:34;40677:31:0;;7475:18:1;40677:31:0;;;;;;;39815:5888;;;;;40439:91;;;;;;;;;;;;40488:42;40439:91;;;;;-1:-1:-1;;;;;6791:32:1;;;6773:51;;6761:2;6746:18;40439:91:0;;;;;;;;44037:206;;;;;;;;;;-1:-1:-1;44037:206:0;;;;;:::i;:::-;;:::i;:::-;;;7772:14:1;;7765:22;7747:41;;7735:2;7720:18;44037:206:0;7607:187:1;28539:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30101:214::-;;;;;;;;;;-1:-1:-1;30101:214:0;;;;;:::i;:::-;;:::i;29622:413::-;;;;;;;;;;-1:-1:-1;29622:413:0;;;;;:::i;:::-;;:::i;:::-;;40813:906;;;;;;;;;;;;;:::i;42551:102::-;;;;;;;;;;-1:-1:-1;42551:102:0;;;;;:::i;:::-;;:::i;25004:91::-;;;;;;;;;;-1:-1:-1;25048:7:0;25075:12;25004:91;;;18103:25:1;;;18091:2;18076:18;25004:91:0;17957:177:1;30977:162:0;;;;;;;;;;-1:-1:-1;30977:162:0;;;;;:::i;:::-;;:::i;42659:114::-;;;;;;;;;;-1:-1:-1;42659:114:0;;;;;:::i;:::-;;:::i;43132:333::-;;;;;;;;;;-1:-1:-1;43132:333:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7520:32:1;;;7502:51;;7584:2;7569:18;;7562:34;;;;7475:18;43132:333:0;7328:274:1;25650:998:0;;;;;;;;;;-1:-1:-1;25650:998:0;;;;;:::i;:::-;;:::i;31210:177::-;;;;;;;;;;-1:-1:-1;31210:177:0;;;;;:::i;:::-;;:::i;25172:178::-;;;;;;;;;;-1:-1:-1;25172:178:0;;;;;:::i;:::-;;:::i;40091:33::-;;;;;;;;;;;;;:::i;40051:35::-;;;;;;;;;;;;;:::i;28348:124::-;;;;;;;;;;-1:-1:-1;28348:124:0;;;;;:::i;:::-;;:::i;27089:221::-;;;;;;;;;;-1:-1:-1;27089:221:0;;;;;:::i;:::-;;:::i;4721:103::-;;;;;;;;;;;;;:::i;42443:102::-;;;;;;;;;;-1:-1:-1;42443:102:0;;;;;:::i;:::-;;:::i;42779:171::-;;;;;;;;;;;;;:::i;4070:87::-;;;;;;;;;;-1:-1:-1;4143:6:0;;-1:-1:-1;;;;;4143:6:0;4070:87;;45583:117;;;;;;;;;;-1:-1:-1;45583:117:0;;;;;:::i;:::-;;:::i;28708:104::-;;;;;;;;;;;;;:::i;40535:38::-;;;;;;;;;;;;;;;;39962:84;;;;;;;;;;;;;:::i;30387:288::-;;;;;;;;;;-1:-1:-1;30387:288:0;;;;;:::i;:::-;;:::i;43889:142::-;;;;;;;;;;-1:-1:-1;43889:142:0;;;;;:::i;:::-;;:::i;31458:355::-;;;;;;;;;;-1:-1:-1;31458:355:0;;;;;:::i;:::-;;:::i;43783:100::-;;;;;;;;;;-1:-1:-1;43783:100:0;;;;;:::i;:::-;;:::i;41916:411::-;;;;;;;;;;-1:-1:-1;41916:411:0;;;;;:::i;:::-;;:::i;44251:1219::-;;;;;;;;;;-1:-1:-1;44251:1219:0;;;;;:::i;:::-;;:::i;43471:306::-;;;;;;;;;;-1:-1:-1;43471:306:0;;;;;:::i;:::-;;:::i;45478:97::-;;;;;;;;;;;;;:::i;30746:164::-;;;;;;;;;;-1:-1:-1;30746:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30867:25:0;;;30843:4;30867:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30746:164;41725:185;;;;;;;;;;-1:-1:-1;41725:185:0;;;;;:::i;:::-;;:::i;4979:201::-;;;;;;;;;;-1:-1:-1;4979:201:0;;;;;:::i;:::-;;:::i;44037:206::-;44132:4;-1:-1:-1;;;;;;44155:41:0;;-1:-1:-1;;;44155:41:0;;:81;;;44200:36;44224:11;44200:23;:36::i;:::-;44147:90;44037:206;-1:-1:-1;;44037:206:0:o;28539:100::-;28593:13;28626:5;28619:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28539:100;:::o;30101:214::-;30169:7;30197:16;30205:7;32125:4;32159:12;-1:-1:-1;32149:22:0;32068:111;30197:16;30189:74;;;;-1:-1:-1;;;30189:74:0;;17745:2:1;30189:74:0;;;17727:21:1;17784:2;17764:18;;;17757:30;17823:34;17803:18;;;17796:62;-1:-1:-1;;;17874:18:1;;;17867:43;17927:19;;30189:74:0;;;;;;;;;-1:-1:-1;30283:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30283:24:0;;30101:214::o;29622:413::-;29695:13;29711:24;29727:7;29711:15;:24::i;:::-;29695:40;;29760:5;-1:-1:-1;;;;;29754:11:0;:2;-1:-1:-1;;;;;29754:11:0;;;29746:58;;;;-1:-1:-1;;;29746:58:0;;14586:2:1;29746:58:0;;;14568:21:1;14625:2;14605:18;;;14598:30;14664:34;14644:18;;;14637:62;-1:-1:-1;;;14715:18:1;;;14708:32;14757:19;;29746:58:0;14384:398:1;29746:58:0;2868:10;-1:-1:-1;;;;;29839:21:0;;;;:62;;-1:-1:-1;29864:37:0;29881:5;2868:10;30746:164;:::i;29864:37::-;29817:169;;;;-1:-1:-1;;;29817:169:0;;11082:2:1;29817:169:0;;;11064:21:1;11121:2;11101:18;;;11094:30;11160:34;11140:18;;;11133:62;11231:27;11211:18;;;11204:55;11276:19;;29817:169:0;10880:421:1;29817:169:0;29999:28;30008:2;30012:7;30021:5;29999:8;:28::i;:::-;29684:351;29622:413;;:::o;40813:906::-;40877:22;;40863:10;40853:21;;;;:9;:21;;;;;;:46;40845:90;;;;-1:-1:-1;;;40845:90:0;;13042:2:1;40845:90:0;;;13024:21:1;13081:2;13061:18;;;13054:30;13120:33;13100:18;;;13093:61;13171:18;;40845:90:0;12840:355:1;40845:90:0;40992:17;;40980:29;;40242:4;40980:29;:::i;:::-;40966:10;;25048:7;25075:12;40950:26;;;;:::i;:::-;:59;;40942:92;;;;-1:-1:-1;;;40942:92:0;;14989:2:1;40942:92:0;;;14971:21:1;15028:2;15008:18;;;15001:30;-1:-1:-1;;;15047:18:1;;;15040:50;15107:18;;40942:92:0;14787:344:1;40942:92:0;41068:10;;41053;41043:21;;;;:9;:21;;;;;:35;;:21;;;:35;;41068:10;;41043:35;:::i;:::-;;;;;;;;41085:33;41095:10;41107;;41085:9;:33::i;:::-;41171:17;;41159:29;;40242:4;41159:29;:::i;:::-;41146:10;;25048:7;25075:12;41130:26;;;;:::i;:::-;:58;41127:587;;;41374:17;;-1:-1:-1;;41296:36:0;40242:4;41374:29;41350:53;;41347:204;;41424:17;:30;;40242:4;41424:30;;;41347:204;;;41495:17;:40;;;41347:204;40347:2;41568:10;;:27;41565:79;;41616:10;:12;;;;;;41565:79;-1:-1:-1;41684:10:0;;41658:22;:36;;;;;;;41127:587;40813:906::o;42551:102::-;4143:6;;-1:-1:-1;;;;;4143:6:0;2868:10;4290:23;4282:68;;;;-1:-1:-1;;;4282:68:0;;;;;;;:::i;:::-;42625:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;42551:102:::0;:::o;30977:162::-;31103:28;31113:4;31119:2;31123:7;31103:9;:28::i;42659:114::-;4143:6;;-1:-1:-1;;;;;4143:6:0;2868:10;4290:23;4282:68;;;;-1:-1:-1;;;4282:68:0;;;;;;;:::i;:::-;42739:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;43132:333::-:0;43212:16;43230:21;43268:16;43276:7;32125:4;32159:12;-1:-1:-1;32149:22:0;32068:111;43268:16;43260:54;;;;-1:-1:-1;;;43260:54:0;;12327:2:1;43260:54:0;;;12309:21:1;12366:2;12346:18;;;12339:30;-1:-1:-1;;;12385:18:1;;;12378:55;12450:18;;43260:54:0;12125:349:1;43260:54:0;43341:1;43329:9;:13;43321:60;;;;-1:-1:-1;;;43321:60:0;;10273:2:1;43321:60:0;;;10255:21:1;10312:2;10292:18;;;10285:30;10351:34;10331:18;;;10324:62;-1:-1:-1;;;10402:18:1;;;10395:32;10444:19;;43321:60:0;10071:398:1;43321:60:0;40488:42;43453:5;43433:16;;43421:9;:28;;;;:::i;:::-;43420:38;;;;:::i;:::-;43388:71;;;;43132:333;;;;;:::o;25650:998::-;25730:7;25766:16;25776:5;25766:9;:16::i;:::-;25758:5;:24;25750:71;;;;-1:-1:-1;;;25750:71:0;;8225:2:1;25750:71:0;;;8207:21:1;8264:2;8244:18;;;8237:30;8303:34;8283:18;;;8276:62;-1:-1:-1;;;8354:18:1;;;8347:32;8396:19;;25750:71:0;8023:398:1;25750:71:0;25832:22;25075:12;;;25832:22;;26095:466;26115:14;26111:1;:18;26095:466;;;26155:31;26189:14;;;:11;:14;;;;;;;;;26155:48;;;;;;;;;-1:-1:-1;;;;;26155:48:0;;;;;-1:-1:-1;;;26155:48:0;;;;;;;;;;;;26226:28;26222:111;;26299:14;;;-1:-1:-1;26222:111:0;26376:5;-1:-1:-1;;;;;26355:26:0;:17;-1:-1:-1;;;;;26355:26:0;;26351:195;;;26425:5;26410:11;:20;26406:85;;;-1:-1:-1;26466:1:0;-1:-1:-1;26459:8:0;;-1:-1:-1;;;26459:8:0;26406:85;26513:13;;;;;26351:195;-1:-1:-1;26131:3:0;;26095:466;;;-1:-1:-1;26584:56:0;;-1:-1:-1;;;26584:56:0;;16914:2:1;26584:56:0;;;16896:21:1;16953:2;16933:18;;;16926:30;16992:34;16972:18;;;16965:62;-1:-1:-1;;;17043:18:1;;;17036:44;17097:19;;26584:56:0;16712:410:1;31210:177:0;31340:39;31357:4;31363:2;31367:7;31340:39;;;;;;;;;;;;:16;:39::i;25172:178::-;25230:7;25075:12;;25258:5;:21;25250:69;;;;-1:-1:-1;;;25250:69:0;;9869:2:1;25250:69:0;;;9851:21:1;9908:2;9888:18;;;9881:30;9947:34;9927:18;;;9920:62;-1:-1:-1;;;9998:18:1;;;9991:33;10041:19;;25250:69:0;9667:399:1;25250:69:0;-1:-1:-1;25337:5:0;25172:178::o;40091:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40051:35::-;;;;;;;:::i;28348:124::-;28412:7;28439:20;28451:7;28439:11;:20::i;:::-;:25;;28348:124;-1:-1:-1;;28348:124:0:o;27089:221::-;27153:7;-1:-1:-1;;;;;27181:19:0;;27173:75;;;;-1:-1:-1;;;27173:75:0;;11508:2:1;27173:75:0;;;11490:21:1;11547:2;11527:18;;;11520:30;11586:34;11566:18;;;11559:62;-1:-1:-1;;;11637:18:1;;;11630:41;11688:19;;27173:75:0;11306:407:1;27173:75:0;-1:-1:-1;;;;;;27274:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;27274:27:0;;27089:221::o;4721:103::-;4143:6;;-1:-1:-1;;;;;4143:6:0;2868:10;4290:23;4282:68;;;;-1:-1:-1;;;4282:68:0;;;;;;;:::i;:::-;4786:30:::1;4813:1;4786:18;:30::i;42443:102::-:0;4143:6;;-1:-1:-1;;;;;4143:6:0;2868:10;4290:23;4282:68;;;;-1:-1:-1;;;4282:68:0;;;;;;;:::i;:::-;42517:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;42779:171::-:0;4143:6;;-1:-1:-1;;;;;4143:6:0;2868:10;4290:23;4282:68;;;;-1:-1:-1;;;4282:68:0;;;;;;;:::i;:::-;42846:21:::1;42882:11:::0;42874:20:::1;;;::::0;::::1;;42903:41;42913:7;4143:6:::0;;-1:-1:-1;;;;;4143:6:0;;4070:87;42913:7:::1;42922:21;42903:9;:41::i;:::-;42821:129;42779:171::o:0;45583:117::-;4143:6;;-1:-1:-1;;;;;4143:6:0;2868:10;4290:23;4282:68;;;;-1:-1:-1;;;4282:68:0;;;;;;;:::i;:::-;45665:27;;::::1;::::0;:12:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;28708:104::-:0;28764:13;28797:7;28790:14;;;;;:::i;39962:84::-;;;;;;;:::i;30387:288::-;-1:-1:-1;;;;;30482:24:0;;2868:10;30482:24;;30474:63;;;;-1:-1:-1;;;30474:63:0;;13402:2:1;30474:63:0;;;13384:21:1;13441:2;13421:18;;;13414:30;13480:28;13460:18;;;13453:56;13526:18;;30474:63:0;13200:350:1;30474:63:0;2868:10;30550:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30550:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30550:53:0;;;;;;;;;;30619:48;;7747:41:1;;;30550:42:0;;2868:10;30619:48;;7720:18:1;30619:48:0;;;;;;;30387:288;;:::o;43889:142::-;4143:6;;-1:-1:-1;;;;;4143:6:0;2868:10;4290:23;4282:68;;;;-1:-1:-1;;;4282:68:0;;;;;;;:::i;:::-;43977:22:::1;:48:::0;43889:142::o;31458:355::-;31617:28;31627:4;31633:2;31637:7;31617:9;:28::i;:::-;31678:48;31701:4;31707:2;31711:7;31720:5;31678:22;:48::i;:::-;31656:149;;;;-1:-1:-1;;;31656:149:0;;;;;;;:::i;:::-;31458:355;;;;:::o;43783:100::-;4143:6;;-1:-1:-1;;;;;4143:6:0;2868:10;4290:23;4282:68;;;;-1:-1:-1;;;4282:68:0;;;;;;;:::i;:::-;43853:10:::1;:24:::0;43783:100::o;41916:411::-;41990:13;42020:17;42028:8;32125:4;32159:12;-1:-1:-1;32149:22:0;32068:111;42020:17;42012:55;;;;-1:-1:-1;;;42012:55:0;;12327:2:1;42012:55:0;;;12309:21:1;12366:2;12346:18;;;12339:30;-1:-1:-1;;;12385:18:1;;;12378:55;12450:18;;42012:55:0;12125:349:1;42012:55:0;42080:8;;;;42076:52;;42108:12;42101:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41916:411;;;:::o;42076:52::-;42136:28;42167:10;:8;:10::i;:::-;42136:41;;42222:1;42197:14;42191:28;:32;:130;;;;;;;;;;;;;;;;;42259:14;42275:19;:8;:17;:19::i;:::-;42296:9;42242:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42191:130;42184:137;41916:411;-1:-1:-1;;;41916:411:0:o;44251:1219::-;44372:1;44362:8;:11;;44354:20;;;;;;44410:35;44448:25;44460:12;44448:11;:25::i;:::-;44496;;;;:11;:25;;;;;:30;44410:63;;-1:-1:-1;;;;;;44496:30:0;44530:10;44496:44;44488:53;;;;;;44556:46;44573:1;44577:12;44591:10;44556:8;:46::i;:::-;44622;;44655:12;;-1:-1:-1;;;;;44622:46:0;;;44631:10;;-1:-1:-1;;;;;;;;;;;44622:46:0;;;;44700:1;44683:266;44707:8;44703:1;:12;44683:266;;;44791:1;44749:25;;;:11;:25;;;;;:30;-1:-1:-1;;;;;44749:30:0;:44;44741:53;;;;;;44813:48;44830:1;44847;44834:12;:14;44850:10;44813:8;:48::i;:::-;44885;;44918:14;;;;-1:-1:-1;;;;;44885:48:0;;;44894:10;;-1:-1:-1;;;;;;;;;;;44885:48:0;;;;44717:3;;44683:266;;;-1:-1:-1;44976:10:0;44963:24;;;;:12;:24;;;;;;;;:53;;-1:-1:-1;;;;;;44963:53:0;;;-1:-1:-1;;;;;44963:53:0;;;;;;;;;;;;-1:-1:-1;;;;;45031:24:0;;;;;;;;:53;;;;;;;;;;;;;;;;;;;45123:23;;;-1:-1:-1;45123:27:0;45169:24;;;:11;:24;;;;;:29;45123:27;;45169:29;45165:287;;45237:20;45245:11;32125:4;32159:12;-1:-1:-1;32149:22:0;32068:111;45237:20;45233:204;;;45282:24;;;;:11;:24;;;;;;;;:42;;45389:28;;;;45347:70;;-1:-1:-1;;;45347:70:0;-1:-1:-1;;;;45314:10:0;45347:70;-1:-1:-1;;;;;;45347:70:0;;;;;;;;;;;;;45233:204;44385:1078;;44251:1219;;;:::o;43471:306::-;4143:6;;-1:-1:-1;;;;;4143:6:0;2868:10;4290:23;4282:68;;;;-1:-1:-1;;;4282:68:0;;;;;;;:::i;:::-;43581:1:::1;43561:17;:21;43553:75;;;::::0;-1:-1:-1;;;43553:75:0;;13757:2:1;43553:75:0::1;::::0;::::1;13739:21:1::0;13796:2;13776:18;;;13769:30;13835:34;13815:18;;;13808:62;-1:-1:-1;;;13886:18:1;;;13879:39;13935:19;;43553:75:0::1;13555:405:1::0;43553:75:0::1;43664:5;43643:17;:26;;43635:93;;;::::0;-1:-1:-1;;;43635:93:0;;8628:2:1;43635:93:0::1;::::0;::::1;8610:21:1::0;8667:2;8647:18;;;8640:30;8706:34;8686:18;;;8679:62;-1:-1:-1;;;8757:18:1;;;8750:52;8819:19;;43635:93:0::1;8426:418:1::0;43635:93:0::1;43735:16;:36:::0;43471:306::o;45478:97::-;45522:13;45555:12;45548:19;;;;;:::i;41725:185::-;4143:6;;-1:-1:-1;;;;;4143:6:0;2868:10;4290:23;4282:68;;;;-1:-1:-1;;;4282:68:0;;;;;;;:::i;:::-;40242:4:::1;41815:11;41799:13;25048:7:::0;25075:12;;25004:91;41799:13:::1;:27;;;;:::i;:::-;:40;;41791:73;;;::::0;-1:-1:-1;;;41791:73:0;;14989:2:1;41791:73:0::1;::::0;::::1;14971:21:1::0;15028:2;15008:18;;;15001:30;-1:-1:-1;;;15047:18:1;;;15040:50;15107:18;;41791:73:0::1;14787:344:1::0;41791:73:0::1;41871:33;41881:10;41893;;41871:9;:33::i;4979:201::-:0;4143:6;;-1:-1:-1;;;;;4143:6:0;2868:10;4290:23;4282:68;;;;-1:-1:-1;;;4282:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5068:22:0;::::1;5060:73;;;::::0;-1:-1:-1;;;5060:73:0;;9051:2:1;5060:73:0::1;::::0;::::1;9033:21:1::0;9090:2;9070:18;;;9063:30;9129:34;9109:18;;;9102:62;-1:-1:-1;;;9180:18:1;;;9173:36;9226:19;;5060:73:0::1;8849:402:1::0;5060:73:0::1;5144:28;5163:8;5144:18;:28::i;6777:326::-:0;-1:-1:-1;;;;;7072:19:0;;:23;;;6777:326::o;26720:305::-;26822:4;-1:-1:-1;;;;;;26859:40:0;;-1:-1:-1;;;26859:40:0;;:105;;-1:-1:-1;;;;;;;26916:48:0;;-1:-1:-1;;;26916:48:0;26859:105;:158;;;-1:-1:-1;;;;;;;;;;17914:40:0;;;26981:36;17805:157;36988:197;37104:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;37104:29:0;-1:-1:-1;;;;;37104:29:0;;;;;;;;;37149:28;;37104:24;;37149:28;;;;;;;36988:197;;;:::o;32187:104::-;32256:27;32266:2;32270:8;32256:27;;;;;;;;;;;;:9;:27::i;34868:2002::-;34983:35;35021:20;35033:7;35021:11;:20::i;:::-;35096:18;;34983:58;;-1:-1:-1;35054:22:0;;-1:-1:-1;;;;;35080:34:0;2868:10;-1:-1:-1;;;;;35080:34:0;;:87;;;-1:-1:-1;2868:10:0;35131:20;35143:7;35131:11;:20::i;:::-;-1:-1:-1;;;;;35131:36:0;;35080:87;:154;;;-1:-1:-1;35201:18:0;;35184:50;;2868:10;30746:164;:::i;35184:50::-;35054:181;;35256:17;35248:80;;;;-1:-1:-1;;;35248:80:0;;14167:2:1;35248:80:0;;;14149:21:1;14206:2;14186:18;;;14179:30;14245:34;14225:18;;;14218:62;-1:-1:-1;;;14296:18:1;;;14289:48;14354:19;;35248:80:0;13965:414:1;35248:80:0;35371:4;-1:-1:-1;;;;;35349:26:0;:13;:18;;;-1:-1:-1;;;;;35349:26:0;;35341:77;;;;-1:-1:-1;;;35341:77:0;;11920:2:1;35341:77:0;;;11902:21:1;11959:2;11939:18;;;11932:30;11998:34;11978:18;;;11971:62;-1:-1:-1;;;12049:18:1;;;12042:36;12095:19;;35341:77:0;11718:402:1;35341:77:0;-1:-1:-1;;;;;35437:16:0;;35429:66;;;;-1:-1:-1;;;35429:66:0;;10676:2:1;35429:66:0;;;10658:21:1;10715:2;10695:18;;;10688:30;10754:34;10734:18;;;10727:62;-1:-1:-1;;;10805:18:1;;;10798:35;10850:19;;35429:66:0;10474:401:1;35429:66:0;35616:49;35633:1;35637:7;35646:13;:18;;;35616:8;:49::i;:::-;-1:-1:-1;;;;;35961:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;35961:31:0;;;-1:-1:-1;;;;;35961:31:0;;;-1:-1:-1;;35961:31:0;;;;;;;36007:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;36007:29:0;;;;;;;;;;;;;36053:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;36098:61:0;;;;-1:-1:-1;;;36143:15:0;36098:61;;;;;;36433:11;;;36463:24;;;;;:29;36433:11;;36463:29;36459:295;;36531:20;36539:11;32125:4;32159:12;-1:-1:-1;32149:22:0;32068:111;36531:20;36527:212;;;36608:18;;;36576:24;;;:11;:24;;;;;;;;:50;;36691:28;;;;36649:70;;-1:-1:-1;;;36649:70:0;-1:-1:-1;;;;;;36649:70:0;;;-1:-1:-1;;;;;36576:50:0;;;36649:70;;;;;;;36527:212;35936:829;36801:7;36797:2;-1:-1:-1;;;;;36782:27:0;36791:4;-1:-1:-1;;;;;36782:27:0;-1:-1:-1;;;;;;;;;;;36782:27:0;;;;;;;;;36820:42;31458:355;27749:537;-1:-1:-1;;;;;;;;;;;;;;;;;27852:16:0;27860:7;32125:4;32159:12;-1:-1:-1;32149:22:0;32068:111;27852:16;27844:71;;;;-1:-1:-1;;;27844:71:0;;9458:2:1;27844:71:0;;;9440:21:1;9497:2;9477:18;;;9470:30;9536:34;9516:18;;;9509:62;-1:-1:-1;;;9587:18:1;;;9580:40;9637:19;;27844:71:0;9256:406:1;27844:71:0;27973:7;27953:245;28020:31;28054:17;;;:11;:17;;;;;;;;;28020:51;;;;;;;;;-1:-1:-1;;;;;28020:51:0;;;;;-1:-1:-1;;;28020:51:0;;;;;;;;;;;;28094:28;28090:93;;28154:9;27749:537;-1:-1:-1;;;27749:537:0:o;28090:93::-;-1:-1:-1;;;27993:6:0;27953:245;;5340:191;5433:6;;;-1:-1:-1;;;;;5450:17:0;;;-1:-1:-1;;;;;;5450:17:0;;;;;;;5483:40;;5433:6;;;5450:17;5433:6;;5483:40;;5414:16;;5483:40;5403:128;5340:191;:::o;42956:170::-;43026:12;43044:8;-1:-1:-1;;;;;43044:13:0;43065:7;43044:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43025:52;;;43092:7;43084:36;;;;-1:-1:-1;;;43084:36:0;;15338:2:1;43084:36:0;;;15320:21:1;15377:2;15357:18;;;15350:30;-1:-1:-1;;;15396:18:1;;;15389:46;15452:18;;43084:36:0;15136:340:1;37750:804:0;37905:4;-1:-1:-1;;;;;37926:13:0;;7072:19;:23;37922:625;;37962:72;;-1:-1:-1;;;37962:72:0;;-1:-1:-1;;;;;37962:36:0;;;;;:72;;2868:10;;38013:4;;38019:7;;38028:5;;37962:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37962:72:0;;;;;;;;-1:-1:-1;;37962:72:0;;;;;;;;;;;;:::i;:::-;;;37958:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38208:13:0;;38204:273;;38251:61;;-1:-1:-1;;;38251:61:0;;;;;;;:::i;38204:273::-;38427:6;38421:13;38412:6;38408:2;38404:15;38397:38;37958:534;-1:-1:-1;;;;;;38085:55:0;-1:-1:-1;;;38085:55:0;;-1:-1:-1;38078:62:0;;37922:625;-1:-1:-1;38531:4:0;37922:625;37750:804;;;;;;:::o;42333:104::-;42393:13;42422:9;42415:16;;;;;:::i;344:723::-;400:13;621:10;617:53;;-1:-1:-1;;648:10:0;;;;;;;;;;;;-1:-1:-1;;;648:10:0;;;;;344:723::o;617:53::-;695:5;680:12;736:78;743:9;;736:78;;769:8;;;;:::i;:::-;;-1:-1:-1;792:10:0;;-1:-1:-1;800:2:0;792:10;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;846:17:0;;824:39;;874:154;881:10;;874:154;;908:11;918:1;908:11;;:::i;:::-;;-1:-1:-1;977:10:0;985:2;977:5;:10;:::i;:::-;964:24;;:2;:24;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;934:56:0;;;;;;;;-1:-1:-1;1005:11:0;1014:2;1005:11;;:::i;:::-;;;874:154;;32654:163;32777:32;32783:2;32787:8;32797:5;32804:4;33215:20;33238:12;-1:-1:-1;;;;;33269:16:0;;33261:62;;;;-1:-1:-1;;;33261:62:0;;16103:2:1;33261:62:0;;;16085:21:1;16142:2;16122:18;;;16115:30;16181:34;16161:18;;;16154:62;-1:-1:-1;;;16232:18:1;;;16225:31;16273:19;;33261:62:0;15901:397:1;33261:62:0;33342:13;33334:66;;;;-1:-1:-1;;;33334:66:0;;16505:2:1;33334:66:0;;;16487:21:1;16544:2;16524:18;;;16517:30;16583:34;16563:18;;;16556:62;-1:-1:-1;;;16634:18:1;;;16627:38;16682:19;;33334:66:0;16303:404:1;33334:66:0;-1:-1:-1;;;;;33752:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;33752:45:0;;-1:-1:-1;;;;;33752:45:0;;;;;;;;;;33812:50;;;;;;;;;;;;;;33879:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;33929:66:0;;;;-1:-1:-1;;;33979:15:0;33929:66;;;;;;;33879:25;;34064:415;34084:8;34080:1;:12;34064:415;;;34123:38;;34148:12;;-1:-1:-1;;;;;34123:38:0;;;34140:1;;-1:-1:-1;;;;;;;;;;;34123:38:0;34140:1;;34123:38;34184:4;34180:249;;;34247:59;34278:1;34282:2;34286:12;34300:5;34247:22;:59::i;:::-;34213:196;;;;-1:-1:-1;;;34213:196:0;;;;;;;:::i;:::-;34449:14;;;;;34094:3;34064:415;;;-1:-1:-1;34495:12:0;:27;34546:60;31458:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:186::-;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;979:29;998:9;979:29;:::i;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:52;;;1164:1;1161;1154:12;1116:52;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1019:260;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1284:328;;;;;:::o;1617:666::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:53;;;1806:1;1803;1796:12;1757:53;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2099:22;;2152:4;2144:13;;2140:27;-1:-1:-1;2130:55:1;;2181:1;2178;2171:12;2130:55;2204:73;2269:7;2264:2;2251:16;2246:2;2242;2238:11;2204:73;:::i;:::-;2194:83;;;1617:666;;;;;;;:::o;2288:347::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2453:29;2472:9;2453:29;:::i;:::-;2443:39;;2532:2;2521:9;2517:18;2504:32;2579:5;2572:13;2565:21;2558:5;2555:32;2545:60;;2601:1;2598;2591:12;2545:60;2624:5;2614:15;;;2288:347;;;;;:::o;2640:254::-;2708:6;2716;2769:2;2757:9;2748:7;2744:23;2740:32;2737:52;;;2785:1;2782;2775:12;2737:52;2808:29;2827:9;2808:29;:::i;:::-;2798:39;2884:2;2869:18;;;;2856:32;;-1:-1:-1;;;2640:254:1:o;2899:245::-;2957:6;3010:2;2998:9;2989:7;2985:23;2981:32;2978:52;;;3026:1;3023;3016:12;2978:52;3065:9;3052:23;3084:30;3108:5;3084:30;:::i;3149:249::-;3218:6;3271:2;3259:9;3250:7;3246:23;3242:32;3239:52;;;3287:1;3284;3277:12;3239:52;3319:9;3313:16;3338:30;3362:5;3338:30;:::i;3403:450::-;3472:6;3525:2;3513:9;3504:7;3500:23;3496:32;3493:52;;;3541:1;3538;3531:12;3493:52;3581:9;3568:23;3614:18;3606:6;3603:30;3600:50;;;3646:1;3643;3636:12;3600:50;3669:22;;3722:4;3714:13;;3710:27;-1:-1:-1;3700:55:1;;3751:1;3748;3741:12;3700:55;3774:73;3839:7;3834:2;3821:16;3816:2;3812;3808:11;3774:73;:::i;3858:180::-;3917:6;3970:2;3958:9;3949:7;3945:23;3941:32;3938:52;;;3986:1;3983;3976:12;3938:52;-1:-1:-1;4009:23:1;;3858:180;-1:-1:-1;3858:180:1:o;4043:248::-;4111:6;4119;4172:2;4160:9;4151:7;4147:23;4143:32;4140:52;;;4188:1;4185;4178:12;4140:52;-1:-1:-1;;4211:23:1;;;4281:2;4266:18;;;4253:32;;-1:-1:-1;4043:248:1:o;4296:322::-;4373:6;4381;4389;4442:2;4430:9;4421:7;4417:23;4413:32;4410:52;;;4458:1;4455;4448:12;4410:52;4494:9;4481:23;4471:33;;4551:2;4540:9;4536:18;4523:32;4513:42;;4574:38;4608:2;4597:9;4593:18;4574:38;:::i;:::-;4564:48;;4296:322;;;;;:::o;4623:257::-;4664:3;4702:5;4696:12;4729:6;4724:3;4717:19;4745:63;4801:6;4794:4;4789:3;4785:14;4778:4;4771:5;4767:16;4745:63;:::i;:::-;4862:2;4841:15;-1:-1:-1;;4837:29:1;4828:39;;;;4869:4;4824:50;;4623:257;-1:-1:-1;;4623:257:1:o;4885:1527::-;5109:3;5147:6;5141:13;5173:4;5186:51;5230:6;5225:3;5220:2;5212:6;5208:15;5186:51;:::i;:::-;5300:13;;5259:16;;;;5322:55;5300:13;5259:16;5344:15;;;5322:55;:::i;:::-;5466:13;;5399:20;;;5439:1;;5526;5548:18;;;;5601;;;;5628:93;;5706:4;5696:8;5692:19;5680:31;;5628:93;5769:2;5759:8;5756:16;5736:18;5733:40;5730:167;;;-1:-1:-1;;;5796:33:1;;5852:4;5849:1;5842:15;5882:4;5803:3;5870:17;5730:167;5913:18;5940:110;;;;6064:1;6059:328;;;;5906:481;;5940:110;-1:-1:-1;;5975:24:1;;5961:39;;6020:20;;;;-1:-1:-1;5940:110:1;;6059:328;18212:1;18205:14;;;18249:4;18236:18;;6154:1;6168:169;6182:8;6179:1;6176:15;6168:169;;;6264:14;;6249:13;;;6242:37;6307:16;;;;6199:10;;6168:169;;;6172:3;;6368:8;6361:5;6357:20;6350:27;;5906:481;-1:-1:-1;6403:3:1;;4885:1527;-1:-1:-1;;;;;;;;;;;4885:1527:1:o;6835:488::-;-1:-1:-1;;;;;7104:15:1;;;7086:34;;7156:15;;7151:2;7136:18;;7129:43;7203:2;7188:18;;7181:34;;;7251:3;7246:2;7231:18;;7224:31;;;7029:4;;7272:45;;7297:19;;7289:6;7272:45;:::i;:::-;7264:53;6835:488;-1:-1:-1;;;;;;6835:488:1:o;7799:219::-;7948:2;7937:9;7930:21;7911:4;7968:44;8008:2;7997:9;7993:18;7985:6;7968:44;:::i;12479:356::-;12681:2;12663:21;;;12700:18;;;12693:30;12759:34;12754:2;12739:18;;12732:62;12826:2;12811:18;;12479:356::o;15481:415::-;15683:2;15665:21;;;15722:2;15702:18;;;15695:30;15761:34;15756:2;15741:18;;15734:62;-1:-1:-1;;;15827:2:1;15812:18;;15805:49;15886:3;15871:19;;15481:415::o;18265:128::-;18305:3;18336:1;18332:6;18329:1;18326:13;18323:39;;;18342:18;;:::i;:::-;-1:-1:-1;18378:9:1;;18265:128::o;18398:120::-;18438:1;18464;18454:35;;18469:18;;:::i;:::-;-1:-1:-1;18503:9:1;;18398:120::o;18523:168::-;18563:7;18629:1;18625;18621:6;18617:14;18614:1;18611:21;18606:1;18599:9;18592:17;18588:45;18585:71;;;18636:18;;:::i;:::-;-1:-1:-1;18676:9:1;;18523:168::o;18696:125::-;18736:4;18764:1;18761;18758:8;18755:34;;;18769:18;;:::i;:::-;-1:-1:-1;18806:9:1;;18696:125::o;18826:258::-;18898:1;18908:113;18922:6;18919:1;18916:13;18908:113;;;18998:11;;;18992:18;18979:11;;;18972:39;18944:2;18937:10;18908:113;;;19039:6;19036:1;19033:13;19030:48;;;-1:-1:-1;;19074:1:1;19056:16;;19049:27;18826:258::o;19089:380::-;19168:1;19164:12;;;;19211;;;19232:61;;19286:4;19278:6;19274:17;19264:27;;19232:61;19339:2;19331:6;19328:14;19308:18;19305:38;19302:161;;;19385:10;19380:3;19376:20;19373:1;19366:31;19420:4;19417:1;19410:15;19448:4;19445:1;19438:15;19302:161;;19089:380;;;:::o;19474:135::-;19513:3;-1:-1:-1;;19534:17:1;;19531:43;;;19554:18;;:::i;:::-;-1:-1:-1;19601:1:1;19590:13;;19474:135::o;19614:112::-;19646:1;19672;19662:35;;19677:18;;:::i;:::-;-1:-1:-1;19711:9:1;;19614:112::o;19731:127::-;19792:10;19787:3;19783:20;19780:1;19773:31;19823:4;19820:1;19813:15;19847:4;19844:1;19837:15;19863:127;19924:10;19919:3;19915:20;19912:1;19905:31;19955:4;19952:1;19945:15;19979:4;19976:1;19969:15;19995:127;20056:10;20051:3;20047:20;20044:1;20037:31;20087:4;20084:1;20077:15;20111:4;20108:1;20101:15;20127:127;20188:10;20183:3;20179:20;20176:1;20169:31;20219:4;20216:1;20209:15;20243:4;20240:1;20233:15;20259:131;-1:-1:-1;;;;;;20333:32:1;;20323:43;;20313:71;;20380:1;20377;20370:12
Swarm Source
ipfs://5c1e0176cf79e32b61174fb13acad206d58c84593acf74eafb29809d55931a0a
Loading...
Loading
Loading...
Loading

Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.