ERC-721
Overview
Max Total Supply
5,000 3GMAIB
Holders
1,710
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
20 3GMAIBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ThreeGMAIBanners
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-09 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; /** /$$$$$$ /$$$$$$ /$$ /$$ /$$__ $$ /$$__ $$| $$$ /$$$ |__/ \ $$| $$ \__/| $$$$ /$$$$ /$$$$$/| $$ /$$$$| $$ $$/$$ $$ |___ $$| $$|_ $$| $$ $$$| $$ /$$ \ $$| $$ \ $$| $$\ $ | $$ | $$$$$$/| $$$$$$/| $$ \/ | $$ \______/ \______/ |__/ |__/ ** Website https://3gm.dev/ ** Twitter https://twitter.com/3gmdev **/ // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } /** * @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 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); } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @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); } // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @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; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } //import 'openzeppelin-contracts/contracts/token/ERC721/IERC721.sol'; // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if a `leafs` can be proved to be a part of a Merkle tree * defined by `root`. For this, `proofs` for each leaf must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Then * 'proofFlag' designates the nodes needed for the multi proof. * * _Available since v4.7._ */ function multiProofVerify( bytes32 root, bytes32[] calldata leaves, bytes32[] calldata proofs, bool[] calldata proofFlag ) internal pure returns (bool) { return processMultiProof(leaves, proofs, proofFlag) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using the multi proof as `proofFlag`. A multi proof is * valid if the final hash matches the root of the tree. * * _Available since v4.7._ */ function processMultiProof( bytes32[] calldata leaves, bytes32[] calldata proofs, bool[] calldata proofFlag ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlag.length; // Check proof validity. require(leavesLen + proofs.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proofs` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlag[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proofs[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proofs[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } //import "openzeppelin-contracts/contracts/utils/Counters.sol"; // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @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); } } contract ThreeGMAIBanners is ERC721, Ownable { string public baseURI = ""; string public contractURI = "https://3gm.mypinata.cloud/ipfs/QmaD9sdhZQRHfSK9W7yLAC6AhAbrDaMMoFhaoPReGVdyaQ"; uint256 private _totalSupply = 1000; uint256 public constant MAX_SUPPLY = 5000; address public constant proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1; bytes32 public whitelistMerkle = 0x1cfb3782ce6326e9a67a21a6e9c32b6fdaa4e5eb016341fbcbdaf93bedd7c4f0; uint256 public txLimit = 1; uint256 public walletLimit = 2; uint256 public price = 0.05 ether; bool public claimPaused = true; bool public whitelistPaused = true; bool public publicPaused = true; IERC721 threeGMGenesisPass = IERC721(0xbB52d85C8dE311A031770b48dC9F91083E6D12B1); mapping(uint256 => bool) public claimedGenesis; mapping(address => uint256) public claimedWhitelist; mapping(address => uint256) public walletMint; constructor() ERC721("3gmAIBanners", "3GMAIB") {} function claimFromGenesis(uint256[] calldata _tokenIds) external payable { address _caller = _msgSender(); require(!claimPaused || owner() == _caller, "Claim paused"); require(tx.origin == _caller, "No contracts"); for (uint256 i; i < _tokenIds.length; i++) { require(threeGMGenesisPass.ownerOf(_tokenIds[i]) == _caller, "Not owner of the token"); require(!claimedGenesis[_tokenIds[i]], "Token already claimed"); claimedGenesis[_tokenIds[i]] = true; _safeMint(_caller, _tokenIds[i]); _safeMint(_caller, _tokenIds[i] + 333); _safeMint(_caller, _tokenIds[i] + 666); } } function whitelist(uint256 _amountToMint, uint256 _maxAmount, bytes32[] calldata _merkleProof) external payable { require(!whitelistPaused, "Whitelist paused"); require(MAX_SUPPLY >= _totalSupply + _amountToMint, "Exceeds max supply"); require(_amountToMint > 0, "Not 0 mints"); address _caller = _msgSender(); require(tx.origin == _caller, "No contracts"); require(claimedWhitelist[_caller] + _amountToMint <= _maxAmount, "Not allow to mint more"); bytes32 leaf = keccak256(abi.encodePacked(_caller, _maxAmount)); require(MerkleProof.verify(_merkleProof, whitelistMerkle, leaf), "Invalid proof"); unchecked { claimedWhitelist[_caller] += _amountToMint; } for (uint256 i; i < _amountToMint; i++) { _safeMint(_caller, _totalSupply); unchecked { _totalSupply += 1; } } } function mint(uint256 _amountToMint) external payable { require(!publicPaused, "Public paused"); require(MAX_SUPPLY >= _totalSupply + _amountToMint, "Exceeds max supply"); require(_amountToMint > 0, "Not 0 mints"); require(_amountToMint <= txLimit, "Tx limit"); require(_amountToMint * price == msg.value, "Invalid funds provided"); address _caller = _msgSender(); require(tx.origin == _caller, "No contracts"); require(walletMint[_caller] + _amountToMint <= walletLimit, "Not allow to mint more"); unchecked { walletMint[_caller] += _amountToMint; } for (uint256 i; i < _amountToMint; i++) { _safeMint(_caller, _totalSupply); unchecked { _totalSupply += 1; } } } function isApprovedForAll(address owner, address operator) override public view returns (bool) { // Whitelist OpenSea proxy contract for easy trading. ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(owner)) == operator) { return true; } return super.isApprovedForAll(owner, operator); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; (bool success, ) = _msgSender().call{value: balance}(""); require(success, "Failed to send"); } function teamMint(address _to, uint256[] calldata _tokenIds) external onlyOwner { for (uint256 i; i < _tokenIds.length; i++) { _safeMint(_to, _tokenIds[i]); } } function toggleClaim() external onlyOwner { claimPaused = !claimPaused; } function toggleWhitelist() external onlyOwner { whitelistPaused = !whitelistPaused; } function togglePublic() external onlyOwner { publicPaused = !publicPaused; } function setPrice(uint256 _price) external onlyOwner { price = _price; } function setTxLimit(uint256 _limit) external onlyOwner { txLimit = _limit; } function setWalletLimit(uint256 _limit) external onlyOwner { walletLimit = _limit; } function setWhitelistMerkle(bytes32 _merkle) external onlyOwner { whitelistMerkle = _merkle; } function totalSupply() external view returns (uint256) { return _totalSupply; } function setBaseURI(string memory baseURI_) external onlyOwner { baseURI = baseURI_; } function setContractURI(string memory _contractURI) external onlyOwner { contractURI = _contractURI; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Token does not exist."); return bytes(baseURI).length > 0 ? string( abi.encodePacked( baseURI, Strings.toString(_tokenId), ".json" ) ) : ""; } } contract OwnableDelegateProxy {} contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimFromGenesis","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedGenesis","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_amountToMint","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkle","type":"bytes32"}],"name":"setWhitelistMerkle","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":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelist","outputs":[],"stateMutability":"nonpayable","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":"txLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"walletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountToMint","type":"uint256"},{"internalType":"uint256","name":"_maxAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMerkle","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040819052600060808190526200001b91600791620001a4565b506040518060800160405280604e815260200162002c59604e913980516200004c91600891602090910190620001a4565b506103e86009557f1cfb3782ce6326e9a67a21a6e9c32b6fdaa4e5eb016341fbcbdaf93bedd7c4f0600a556001600b556002600c5566b1a2bc2ec50000600d55600e80546001600160b81b03191676bb52d85c8de311a031770b48dc9f91083e6d12b1010101179055348015620000c257600080fd5b50604080518082018252600c81526b33676d414942616e6e65727360a01b60208083019182528351808501909452600684526519a3a6a0a4a160d11b9084015281519192916200011591600091620001a4565b5080516200012b906001906020840190620001a4565b50505062000148620001426200014e60201b60201c565b62000152565b62000286565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001b2906200024a565b90600052602060002090601f016020900481019282620001d6576000855562000221565b82601f10620001f157805160ff191683800117855562000221565b8280016001018555821562000221579182015b828111156200022157825182559160200191906001019062000204565b506200022f92915062000233565b5090565b5b808211156200022f576000815560010162000234565b600181811c908216806200025f57607f821691505b6020821081036200028057634e487b7160e01b600052602260045260246000fd5b50919050565b6129c380620002966000396000f3fe6080604052600436106102725760003560e01c8063715018a61161014f578063a91789e7116100c1578063d11297451161007a578063d112974514610719578063e8a3d4851461072e578063e985e9c514610743578063f1d5f51714610763578063f2fde38b14610783578063f3f30612146107a357600080fd5b8063a91789e714610661578063ab5e124a14610681578063b88d4fde1461069b578063c87b56dd146106bb578063cd7c0326146106db578063cd8805531461070357600080fd5b806394db17db1161011357806394db17db146105db57806395d89b41146105ee578063981d877114610603578063a035b1fe14610618578063a0712d681461062e578063a22cb4651461064157600080fd5b8063715018a6146105535780637e15144b146105685780638da5cb5b1461057d57806391b7f5ed1461059b578063938e3d7b146105bb57600080fd5b80633ccfd60b116101e85780635efec59a116101ac5780635efec59a1461049c57806361e61a25146104c95780636352211e146104e85780636c0360eb146105085780636caae8321461051d57806370a082311461053357600080fd5b80633ccfd60b146103f757806342842e0e1461040c57806345ceca0e1461042c57806355f804b31461045c5780635c85974f1461047c57600080fd5b80631056ae311161023a5780631056ae31146103485780631181d7ac1461038357806318160ddd1461039657806323b872dd146103ab57806332cb6b0c146103cb5780633c8463a1146103e157600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b3146103065780630bb12bb814610328575b600080fd5b34801561028357600080fd5b50610297610292366004612203565b6107c3565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c1610815565b6040516102a39190612278565b3480156102da57600080fd5b506102ee6102e936600461228b565b6108a7565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b506103266103213660046122b9565b6108ce565b005b34801561033457600080fd5b50600e546102979062010000900460ff1681565b34801561035457600080fd5b506103756103633660046122e5565b60116020526000908152604090205481565b6040519081526020016102a3565b61032661039136600461234e565b6109e8565b3480156103a257600080fd5b50600954610375565b3480156103b757600080fd5b506103266103c63660046123a1565b610c67565b3480156103d757600080fd5b5061037561138881565b3480156103ed57600080fd5b50610375600c5481565b34801561040357600080fd5b50610326610c98565b34801561041857600080fd5b506103266104273660046123a1565b610d51565b34801561043857600080fd5b5061029761044736600461228b565b600f6020526000908152604090205460ff1681565b34801561046857600080fd5b5061032661047736600461246e565b610d6c565b34801561048857600080fd5b5061032661049736600461228b565b610da9565b3480156104a857600080fd5b506103756104b73660046122e5565b60106020526000908152604090205481565b3480156104d557600080fd5b50600e5461029790610100900460ff1681565b3480156104f457600080fd5b506102ee61050336600461228b565b610dd8565b34801561051457600080fd5b506102c1610e38565b34801561052957600080fd5b50610375600b5481565b34801561053f57600080fd5b5061037561054e3660046122e5565b610ec6565b34801561055f57600080fd5b50610326610f4c565b34801561057457600080fd5b50610326610f82565b34801561058957600080fd5b506006546001600160a01b03166102ee565b3480156105a757600080fd5b506103266105b636600461228b565b610fc9565b3480156105c757600080fd5b506103266105d636600461246e565b610ff8565b6103266105e93660046124b7565b611035565b3480156105fa57600080fd5b506102c161130b565b34801561060f57600080fd5b5061032661131a565b34801561062457600080fd5b50610375600d5481565b61032661063c36600461228b565b611363565b34801561064d57600080fd5b5061032661065c3660046124f9565b6115ac565b34801561066d57600080fd5b5061032661067c36600461228b565b6115b7565b34801561068d57600080fd5b50600e546102979060ff1681565b3480156106a757600080fd5b506103266106b6366004612537565b6115e6565b3480156106c757600080fd5b506102c16106d636600461228b565b611618565b3480156106e757600080fd5b506102ee73a5409ec958c83c3f309868babaca7c86dcb077c181565b34801561070f57600080fd5b50610375600a5481565b34801561072557600080fd5b506103266116d3565b34801561073a57600080fd5b506102c1611711565b34801561074f57600080fd5b5061029761075e3660046125b7565b61171e565b34801561076f57600080fd5b5061032661077e36600461228b565b6117ed565b34801561078f57600080fd5b5061032661079e3660046122e5565b61181c565b3480156107af57600080fd5b506103266107be3660046125e5565b6118b7565b60006001600160e01b031982166380ac58cd60e01b14806107f457506001600160e01b03198216635b5e139f60e01b145b8061080f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546108249061263a565b80601f01602080910402602001604051908101604052809291908181526020018280546108509061263a565b801561089d5780601f106108725761010080835404028352916020019161089d565b820191906000526020600020905b81548152906001019060200180831161088057829003601f168201915b5050505050905090565b60006108b282611914565b506000908152600460205260409020546001600160a01b031690565b60006108d982610dd8565b9050806001600160a01b0316836001600160a01b03160361094b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806109675750610967813361171e565b6109d95760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610942565b6109e38383611973565b505050565b600e54610100900460ff1615610a335760405162461bcd60e51b815260206004820152601060248201526f15da1a5d195b1a5cdd081c185d5cd95960821b6044820152606401610942565b83600954610a41919061268a565b6113881015610a875760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b6044820152606401610942565b60008411610ac55760405162461bcd60e51b815260206004820152600b60248201526a4e6f742030206d696e747360a81b6044820152606401610942565b33328114610ae55760405162461bcd60e51b8152600401610942906126a2565b6001600160a01b0381166000908152601060205260409020548490610b0b90879061268a565b1115610b525760405162461bcd60e51b81526020600482015260166024820152754e6f7420616c6c6f7720746f206d696e74206d6f726560501b6044820152606401610942565b6040516bffffffffffffffffffffffff19606083901b16602082015260348101859052600090605401604051602081830303815290604052805190602001209050610bd484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a5491508490506119e1565b610c105760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610942565b6001600160a01b03821660009081526010602052604081208054880190555b86811015610c5e57610c43836009546119f7565b60098054600101905580610c56816126c8565b915050610c2f565b50505050505050565b610c713382611a11565b610c8d5760405162461bcd60e51b8152600401610942906126e1565b6109e3838383611a6f565b6006546001600160a01b03163314610cc25760405162461bcd60e51b81526004016109429061272f565b6040514790600090339083908381818185875af1925050503d8060008114610d06576040519150601f19603f3d011682016040523d82523d6000602084013e610d0b565b606091505b5050905080610d4d5760405162461bcd60e51b815260206004820152600e60248201526d11985a5b1959081d1bc81cd95b9960921b6044820152606401610942565b5050565b6109e3838383604051806020016040528060008152506115e6565b6006546001600160a01b03163314610d965760405162461bcd60e51b81526004016109429061272f565b8051610d4d906007906020840190612154565b6006546001600160a01b03163314610dd35760405162461bcd60e51b81526004016109429061272f565b600b55565b6000818152600260205260408120546001600160a01b03168061080f5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610942565b60078054610e459061263a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e719061263a565b8015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b820191906000526020600020905b815481529060010190602001808311610ea157829003601f168201915b505050505081565b60006001600160a01b038216610f305760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610942565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f765760405162461bcd60e51b81526004016109429061272f565b610f806000611c0b565b565b6006546001600160a01b03163314610fac5760405162461bcd60e51b81526004016109429061272f565b600e805461ff001981166101009182900460ff1615909102179055565b6006546001600160a01b03163314610ff35760405162461bcd60e51b81526004016109429061272f565b600d55565b6006546001600160a01b031633146110225760405162461bcd60e51b81526004016109429061272f565b8051610d4d906008906020840190612154565b600e54339060ff16158061106b5750806001600160a01b03166110606006546001600160a01b031690565b6001600160a01b0316145b6110a65760405162461bcd60e51b815260206004820152600c60248201526b10db185a5b481c185d5cd95960a21b6044820152606401610942565b326001600160a01b038216146110ce5760405162461bcd60e51b8152600401610942906126a2565b60005b8281101561130557600e546001600160a01b03808416916301000000900416636352211e86868581811061110757611107612764565b905060200201356040518263ffffffff1660e01b815260040161112c91815260200190565b602060405180830381865afa158015611149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116d919061277a565b6001600160a01b0316146111bc5760405162461bcd60e51b81526020600482015260166024820152752737ba1037bbb732b91037b3103a3432903a37b5b2b760511b6044820152606401610942565b600f60008585848181106111d2576111d2612764565b602090810292909201358352508101919091526040016000205460ff16156112345760405162461bcd60e51b8152602060048201526015602482015274151bdad95b88185b1c9958591e4818db185a5b5959605a1b6044820152606401610942565b6001600f600086868581811061124c5761124c612764565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555061129a8285858481811061128e5761128e612764565b905060200201356119f7565b6112c9828585848181106112b0576112b0612764565b9050602002013561014d6112c4919061268a565b6119f7565b6112f3828585848181106112df576112df612764565b9050602002013561029a6112c4919061268a565b806112fd816126c8565b9150506110d1565b50505050565b6060600180546108249061263a565b6006546001600160a01b031633146113445760405162461bcd60e51b81526004016109429061272f565b600e805462ff0000198116620100009182900460ff1615909102179055565b600e5462010000900460ff16156113ac5760405162461bcd60e51b815260206004820152600d60248201526c141d589b1a58c81c185d5cd959609a1b6044820152606401610942565b806009546113ba919061268a565b61138810156114005760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b6044820152606401610942565b6000811161143e5760405162461bcd60e51b815260206004820152600b60248201526a4e6f742030206d696e747360a81b6044820152606401610942565b600b5481111561147b5760405162461bcd60e51b8152602060048201526008602482015267151e081b1a5b5a5d60c21b6044820152606401610942565b34600d548261148a9190612797565b146114d05760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a5908199d5b991cc81c1c9bdd9a59195960521b6044820152606401610942565b333281146114f05760405162461bcd60e51b8152600401610942906126a2565b600c546001600160a01b03821660009081526011602052604090205461151790849061268a565b111561155e5760405162461bcd60e51b81526020600482015260166024820152754e6f7420616c6c6f7720746f206d696e74206d6f726560501b6044820152606401610942565b6001600160a01b03811660009081526011602052604081208054840190555b828110156109e357611591826009546119f7565b600980546001019055806115a4816126c8565b91505061157d565b610d4d338383611c5d565b6006546001600160a01b031633146115e15760405162461bcd60e51b81526004016109429061272f565b600a55565b6115f03383611a11565b61160c5760405162461bcd60e51b8152600401610942906126e1565b61130584848484611d2b565b6000818152600260205260409020546060906001600160a01b03166116775760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b6044820152606401610942565b6000600780546116869061263a565b9050116116a2576040518060200160405280600081525061080f565b60076116ad83611d5e565b6040516020016116be9291906127d2565b60405160208183030381529060405292915050565b6006546001600160a01b031633146116fd5760405162461bcd60e51b81526004016109429061272f565b600e805460ff19811660ff90911615179055565b60088054610e459061263a565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c455279190602401602060405180830381865afa15801561177f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a3919061277a565b6001600160a01b0316036117bb57600191505061080f565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b6006546001600160a01b031633146118175760405162461bcd60e51b81526004016109429061272f565b600c55565b6006546001600160a01b031633146118465760405162461bcd60e51b81526004016109429061272f565b6001600160a01b0381166118ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610942565b6118b481611c0b565b50565b6006546001600160a01b031633146118e15760405162461bcd60e51b81526004016109429061272f565b60005b81811015611305576119028484848481811061128e5761128e612764565b8061190c816126c8565b9150506118e4565b6000818152600260205260409020546001600160a01b03166118b45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610942565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906119a882610dd8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000826119ee8584611e5f565b14949350505050565b610d4d828260405180602001604052806000815250611eac565b600080611a1d83610dd8565b9050806001600160a01b0316846001600160a01b03161480611a445750611a44818561171e565b806117e55750836001600160a01b0316611a5d846108a7565b6001600160a01b031614949350505050565b826001600160a01b0316611a8282610dd8565b6001600160a01b031614611ae65760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610942565b6001600160a01b038216611b485760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610942565b611b53600082611973565b6001600160a01b0383166000908152600360205260408120805460019290611b7c90849061288c565b90915550506001600160a01b0382166000908152600360205260408120805460019290611baa90849061268a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611cbe5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610942565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d36848484611a6f565b611d4284848484611edf565b6113055760405162461bcd60e51b8152600401610942906128a3565b606081600003611d855750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611daf5780611d99816126c8565b9150611da89050600a8361290b565b9150611d89565b60008167ffffffffffffffff811115611dca57611dca6123e2565b6040519080825280601f01601f191660200182016040528015611df4576020820181803683370190505b5090505b84156117e557611e0960018361288c565b9150611e16600a8661291f565b611e2190603061268a565b60f81b818381518110611e3657611e36612764565b60200101906001600160f81b031916908160001a905350611e58600a8661290b565b9450611df8565b600081815b8451811015611ea457611e9082868381518110611e8357611e83612764565b6020026020010151611fe0565b915080611e9c816126c8565b915050611e64565b509392505050565b611eb68383612012565b611ec36000848484611edf565b6109e35760405162461bcd60e51b8152600401610942906128a3565b60006001600160a01b0384163b15611fd557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f23903390899088908890600401612933565b6020604051808303816000875af1925050508015611f5e575060408051601f3d908101601f19168201909252611f5b91810190612970565b60015b611fbb573d808015611f8c576040519150601f19603f3d011682016040523d82523d6000602084013e611f91565b606091505b508051600003611fb35760405162461bcd60e51b8152600401610942906128a3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506117e5565b506001949350505050565b6000818310611ffc57600082815260208490526040902061200b565b60008381526020839052604090205b9392505050565b6001600160a01b0382166120685760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610942565b6000818152600260205260409020546001600160a01b0316156120cd5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610942565b6001600160a01b03821660009081526003602052604081208054600192906120f690849061268a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121609061263a565b90600052602060002090601f01602090048101928261218257600085556121c8565b82601f1061219b57805160ff19168380011785556121c8565b828001600101855582156121c8579182015b828111156121c85782518255916020019190600101906121ad565b506121d49291506121d8565b5090565b5b808211156121d457600081556001016121d9565b6001600160e01b0319811681146118b457600080fd5b60006020828403121561221557600080fd5b813561200b816121ed565b60005b8381101561223b578181015183820152602001612223565b838111156113055750506000910152565b60008151808452612264816020860160208601612220565b601f01601f19169290920160200192915050565b60208152600061200b602083018461224c565b60006020828403121561229d57600080fd5b5035919050565b6001600160a01b03811681146118b457600080fd5b600080604083850312156122cc57600080fd5b82356122d7816122a4565b946020939093013593505050565b6000602082840312156122f757600080fd5b813561200b816122a4565b60008083601f84011261231457600080fd5b50813567ffffffffffffffff81111561232c57600080fd5b6020830191508360208260051b850101111561234757600080fd5b9250929050565b6000806000806060858703121561236457600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561238957600080fd5b61239587828801612302565b95989497509550505050565b6000806000606084860312156123b657600080fd5b83356123c1816122a4565b925060208401356123d1816122a4565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612413576124136123e2565b604051601f8501601f19908116603f0116810190828211818310171561243b5761243b6123e2565b8160405280935085815286868601111561245457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561248057600080fd5b813567ffffffffffffffff81111561249757600080fd5b8201601f810184136124a857600080fd5b6117e5848235602084016123f8565b600080602083850312156124ca57600080fd5b823567ffffffffffffffff8111156124e157600080fd5b6124ed85828601612302565b90969095509350505050565b6000806040838503121561250c57600080fd5b8235612517816122a4565b91506020830135801515811461252c57600080fd5b809150509250929050565b6000806000806080858703121561254d57600080fd5b8435612558816122a4565b93506020850135612568816122a4565b925060408501359150606085013567ffffffffffffffff81111561258b57600080fd5b8501601f8101871361259c57600080fd5b6125ab878235602084016123f8565b91505092959194509250565b600080604083850312156125ca57600080fd5b82356125d5816122a4565b9150602083013561252c816122a4565b6000806000604084860312156125fa57600080fd5b8335612605816122a4565b9250602084013567ffffffffffffffff81111561262157600080fd5b61262d86828701612302565b9497909650939450505050565b600181811c9082168061264e57607f821691505b60208210810361266e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561269d5761269d612674565b500190565b6020808252600c908201526b4e6f20636f6e74726163747360a01b604082015260600190565b6000600182016126da576126da612674565b5060010190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561278c57600080fd5b815161200b816122a4565b60008160001904831182151516156127b1576127b1612674565b500290565b600081516127c8818560208601612220565b9290920192915050565b600080845481600182811c9150808316806127ee57607f831692505b6020808410820361280d57634e487b7160e01b86526022600452602486fd5b81801561282157600181146128325761285f565b60ff1986168952848901965061285f565b60008b81526020902060005b868110156128575781548b82015290850190830161283e565b505084890196505b50505050505061288361287282866127b6565b64173539b7b760d91b815260050190565b95945050505050565b60008282101561289e5761289e612674565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261291a5761291a6128f5565b500490565b60008261292e5761292e6128f5565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129669083018461224c565b9695505050505050565b60006020828403121561298257600080fd5b815161200b816121ed56fea26469706673582212202a7a7b384de2efe1daf3763cd2f5ae300e84c096d0113be48a0ed9b62e46c94b64736f6c634300080d003368747470733a2f2f33676d2e6d7970696e6174612e636c6f75642f697066732f516d6144397364685a51524866534b395737794c414336416841627244614d4d6f4668616f505265475664796151
Deployed Bytecode
0x6080604052600436106102725760003560e01c8063715018a61161014f578063a91789e7116100c1578063d11297451161007a578063d112974514610719578063e8a3d4851461072e578063e985e9c514610743578063f1d5f51714610763578063f2fde38b14610783578063f3f30612146107a357600080fd5b8063a91789e714610661578063ab5e124a14610681578063b88d4fde1461069b578063c87b56dd146106bb578063cd7c0326146106db578063cd8805531461070357600080fd5b806394db17db1161011357806394db17db146105db57806395d89b41146105ee578063981d877114610603578063a035b1fe14610618578063a0712d681461062e578063a22cb4651461064157600080fd5b8063715018a6146105535780637e15144b146105685780638da5cb5b1461057d57806391b7f5ed1461059b578063938e3d7b146105bb57600080fd5b80633ccfd60b116101e85780635efec59a116101ac5780635efec59a1461049c57806361e61a25146104c95780636352211e146104e85780636c0360eb146105085780636caae8321461051d57806370a082311461053357600080fd5b80633ccfd60b146103f757806342842e0e1461040c57806345ceca0e1461042c57806355f804b31461045c5780635c85974f1461047c57600080fd5b80631056ae311161023a5780631056ae31146103485780631181d7ac1461038357806318160ddd1461039657806323b872dd146103ab57806332cb6b0c146103cb5780633c8463a1146103e157600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b3146103065780630bb12bb814610328575b600080fd5b34801561028357600080fd5b50610297610292366004612203565b6107c3565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c1610815565b6040516102a39190612278565b3480156102da57600080fd5b506102ee6102e936600461228b565b6108a7565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b506103266103213660046122b9565b6108ce565b005b34801561033457600080fd5b50600e546102979062010000900460ff1681565b34801561035457600080fd5b506103756103633660046122e5565b60116020526000908152604090205481565b6040519081526020016102a3565b61032661039136600461234e565b6109e8565b3480156103a257600080fd5b50600954610375565b3480156103b757600080fd5b506103266103c63660046123a1565b610c67565b3480156103d757600080fd5b5061037561138881565b3480156103ed57600080fd5b50610375600c5481565b34801561040357600080fd5b50610326610c98565b34801561041857600080fd5b506103266104273660046123a1565b610d51565b34801561043857600080fd5b5061029761044736600461228b565b600f6020526000908152604090205460ff1681565b34801561046857600080fd5b5061032661047736600461246e565b610d6c565b34801561048857600080fd5b5061032661049736600461228b565b610da9565b3480156104a857600080fd5b506103756104b73660046122e5565b60106020526000908152604090205481565b3480156104d557600080fd5b50600e5461029790610100900460ff1681565b3480156104f457600080fd5b506102ee61050336600461228b565b610dd8565b34801561051457600080fd5b506102c1610e38565b34801561052957600080fd5b50610375600b5481565b34801561053f57600080fd5b5061037561054e3660046122e5565b610ec6565b34801561055f57600080fd5b50610326610f4c565b34801561057457600080fd5b50610326610f82565b34801561058957600080fd5b506006546001600160a01b03166102ee565b3480156105a757600080fd5b506103266105b636600461228b565b610fc9565b3480156105c757600080fd5b506103266105d636600461246e565b610ff8565b6103266105e93660046124b7565b611035565b3480156105fa57600080fd5b506102c161130b565b34801561060f57600080fd5b5061032661131a565b34801561062457600080fd5b50610375600d5481565b61032661063c36600461228b565b611363565b34801561064d57600080fd5b5061032661065c3660046124f9565b6115ac565b34801561066d57600080fd5b5061032661067c36600461228b565b6115b7565b34801561068d57600080fd5b50600e546102979060ff1681565b3480156106a757600080fd5b506103266106b6366004612537565b6115e6565b3480156106c757600080fd5b506102c16106d636600461228b565b611618565b3480156106e757600080fd5b506102ee73a5409ec958c83c3f309868babaca7c86dcb077c181565b34801561070f57600080fd5b50610375600a5481565b34801561072557600080fd5b506103266116d3565b34801561073a57600080fd5b506102c1611711565b34801561074f57600080fd5b5061029761075e3660046125b7565b61171e565b34801561076f57600080fd5b5061032661077e36600461228b565b6117ed565b34801561078f57600080fd5b5061032661079e3660046122e5565b61181c565b3480156107af57600080fd5b506103266107be3660046125e5565b6118b7565b60006001600160e01b031982166380ac58cd60e01b14806107f457506001600160e01b03198216635b5e139f60e01b145b8061080f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546108249061263a565b80601f01602080910402602001604051908101604052809291908181526020018280546108509061263a565b801561089d5780601f106108725761010080835404028352916020019161089d565b820191906000526020600020905b81548152906001019060200180831161088057829003601f168201915b5050505050905090565b60006108b282611914565b506000908152600460205260409020546001600160a01b031690565b60006108d982610dd8565b9050806001600160a01b0316836001600160a01b03160361094b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806109675750610967813361171e565b6109d95760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610942565b6109e38383611973565b505050565b600e54610100900460ff1615610a335760405162461bcd60e51b815260206004820152601060248201526f15da1a5d195b1a5cdd081c185d5cd95960821b6044820152606401610942565b83600954610a41919061268a565b6113881015610a875760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b6044820152606401610942565b60008411610ac55760405162461bcd60e51b815260206004820152600b60248201526a4e6f742030206d696e747360a81b6044820152606401610942565b33328114610ae55760405162461bcd60e51b8152600401610942906126a2565b6001600160a01b0381166000908152601060205260409020548490610b0b90879061268a565b1115610b525760405162461bcd60e51b81526020600482015260166024820152754e6f7420616c6c6f7720746f206d696e74206d6f726560501b6044820152606401610942565b6040516bffffffffffffffffffffffff19606083901b16602082015260348101859052600090605401604051602081830303815290604052805190602001209050610bd484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a5491508490506119e1565b610c105760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610942565b6001600160a01b03821660009081526010602052604081208054880190555b86811015610c5e57610c43836009546119f7565b60098054600101905580610c56816126c8565b915050610c2f565b50505050505050565b610c713382611a11565b610c8d5760405162461bcd60e51b8152600401610942906126e1565b6109e3838383611a6f565b6006546001600160a01b03163314610cc25760405162461bcd60e51b81526004016109429061272f565b6040514790600090339083908381818185875af1925050503d8060008114610d06576040519150601f19603f3d011682016040523d82523d6000602084013e610d0b565b606091505b5050905080610d4d5760405162461bcd60e51b815260206004820152600e60248201526d11985a5b1959081d1bc81cd95b9960921b6044820152606401610942565b5050565b6109e3838383604051806020016040528060008152506115e6565b6006546001600160a01b03163314610d965760405162461bcd60e51b81526004016109429061272f565b8051610d4d906007906020840190612154565b6006546001600160a01b03163314610dd35760405162461bcd60e51b81526004016109429061272f565b600b55565b6000818152600260205260408120546001600160a01b03168061080f5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610942565b60078054610e459061263a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e719061263a565b8015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b820191906000526020600020905b815481529060010190602001808311610ea157829003601f168201915b505050505081565b60006001600160a01b038216610f305760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610942565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f765760405162461bcd60e51b81526004016109429061272f565b610f806000611c0b565b565b6006546001600160a01b03163314610fac5760405162461bcd60e51b81526004016109429061272f565b600e805461ff001981166101009182900460ff1615909102179055565b6006546001600160a01b03163314610ff35760405162461bcd60e51b81526004016109429061272f565b600d55565b6006546001600160a01b031633146110225760405162461bcd60e51b81526004016109429061272f565b8051610d4d906008906020840190612154565b600e54339060ff16158061106b5750806001600160a01b03166110606006546001600160a01b031690565b6001600160a01b0316145b6110a65760405162461bcd60e51b815260206004820152600c60248201526b10db185a5b481c185d5cd95960a21b6044820152606401610942565b326001600160a01b038216146110ce5760405162461bcd60e51b8152600401610942906126a2565b60005b8281101561130557600e546001600160a01b03808416916301000000900416636352211e86868581811061110757611107612764565b905060200201356040518263ffffffff1660e01b815260040161112c91815260200190565b602060405180830381865afa158015611149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116d919061277a565b6001600160a01b0316146111bc5760405162461bcd60e51b81526020600482015260166024820152752737ba1037bbb732b91037b3103a3432903a37b5b2b760511b6044820152606401610942565b600f60008585848181106111d2576111d2612764565b602090810292909201358352508101919091526040016000205460ff16156112345760405162461bcd60e51b8152602060048201526015602482015274151bdad95b88185b1c9958591e4818db185a5b5959605a1b6044820152606401610942565b6001600f600086868581811061124c5761124c612764565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555061129a8285858481811061128e5761128e612764565b905060200201356119f7565b6112c9828585848181106112b0576112b0612764565b9050602002013561014d6112c4919061268a565b6119f7565b6112f3828585848181106112df576112df612764565b9050602002013561029a6112c4919061268a565b806112fd816126c8565b9150506110d1565b50505050565b6060600180546108249061263a565b6006546001600160a01b031633146113445760405162461bcd60e51b81526004016109429061272f565b600e805462ff0000198116620100009182900460ff1615909102179055565b600e5462010000900460ff16156113ac5760405162461bcd60e51b815260206004820152600d60248201526c141d589b1a58c81c185d5cd959609a1b6044820152606401610942565b806009546113ba919061268a565b61138810156114005760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b6044820152606401610942565b6000811161143e5760405162461bcd60e51b815260206004820152600b60248201526a4e6f742030206d696e747360a81b6044820152606401610942565b600b5481111561147b5760405162461bcd60e51b8152602060048201526008602482015267151e081b1a5b5a5d60c21b6044820152606401610942565b34600d548261148a9190612797565b146114d05760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a5908199d5b991cc81c1c9bdd9a59195960521b6044820152606401610942565b333281146114f05760405162461bcd60e51b8152600401610942906126a2565b600c546001600160a01b03821660009081526011602052604090205461151790849061268a565b111561155e5760405162461bcd60e51b81526020600482015260166024820152754e6f7420616c6c6f7720746f206d696e74206d6f726560501b6044820152606401610942565b6001600160a01b03811660009081526011602052604081208054840190555b828110156109e357611591826009546119f7565b600980546001019055806115a4816126c8565b91505061157d565b610d4d338383611c5d565b6006546001600160a01b031633146115e15760405162461bcd60e51b81526004016109429061272f565b600a55565b6115f03383611a11565b61160c5760405162461bcd60e51b8152600401610942906126e1565b61130584848484611d2b565b6000818152600260205260409020546060906001600160a01b03166116775760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b6044820152606401610942565b6000600780546116869061263a565b9050116116a2576040518060200160405280600081525061080f565b60076116ad83611d5e565b6040516020016116be9291906127d2565b60405160208183030381529060405292915050565b6006546001600160a01b031633146116fd5760405162461bcd60e51b81526004016109429061272f565b600e805460ff19811660ff90911615179055565b60088054610e459061263a565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c455279190602401602060405180830381865afa15801561177f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a3919061277a565b6001600160a01b0316036117bb57600191505061080f565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b6006546001600160a01b031633146118175760405162461bcd60e51b81526004016109429061272f565b600c55565b6006546001600160a01b031633146118465760405162461bcd60e51b81526004016109429061272f565b6001600160a01b0381166118ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610942565b6118b481611c0b565b50565b6006546001600160a01b031633146118e15760405162461bcd60e51b81526004016109429061272f565b60005b81811015611305576119028484848481811061128e5761128e612764565b8061190c816126c8565b9150506118e4565b6000818152600260205260409020546001600160a01b03166118b45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610942565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906119a882610dd8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000826119ee8584611e5f565b14949350505050565b610d4d828260405180602001604052806000815250611eac565b600080611a1d83610dd8565b9050806001600160a01b0316846001600160a01b03161480611a445750611a44818561171e565b806117e55750836001600160a01b0316611a5d846108a7565b6001600160a01b031614949350505050565b826001600160a01b0316611a8282610dd8565b6001600160a01b031614611ae65760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610942565b6001600160a01b038216611b485760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610942565b611b53600082611973565b6001600160a01b0383166000908152600360205260408120805460019290611b7c90849061288c565b90915550506001600160a01b0382166000908152600360205260408120805460019290611baa90849061268a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611cbe5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610942565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d36848484611a6f565b611d4284848484611edf565b6113055760405162461bcd60e51b8152600401610942906128a3565b606081600003611d855750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611daf5780611d99816126c8565b9150611da89050600a8361290b565b9150611d89565b60008167ffffffffffffffff811115611dca57611dca6123e2565b6040519080825280601f01601f191660200182016040528015611df4576020820181803683370190505b5090505b84156117e557611e0960018361288c565b9150611e16600a8661291f565b611e2190603061268a565b60f81b818381518110611e3657611e36612764565b60200101906001600160f81b031916908160001a905350611e58600a8661290b565b9450611df8565b600081815b8451811015611ea457611e9082868381518110611e8357611e83612764565b6020026020010151611fe0565b915080611e9c816126c8565b915050611e64565b509392505050565b611eb68383612012565b611ec36000848484611edf565b6109e35760405162461bcd60e51b8152600401610942906128a3565b60006001600160a01b0384163b15611fd557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f23903390899088908890600401612933565b6020604051808303816000875af1925050508015611f5e575060408051601f3d908101601f19168201909252611f5b91810190612970565b60015b611fbb573d808015611f8c576040519150601f19603f3d011682016040523d82523d6000602084013e611f91565b606091505b508051600003611fb35760405162461bcd60e51b8152600401610942906128a3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506117e5565b506001949350505050565b6000818310611ffc57600082815260208490526040902061200b565b60008381526020839052604090205b9392505050565b6001600160a01b0382166120685760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610942565b6000818152600260205260409020546001600160a01b0316156120cd5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610942565b6001600160a01b03821660009081526003602052604081208054600192906120f690849061268a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121609061263a565b90600052602060002090601f01602090048101928261218257600085556121c8565b82601f1061219b57805160ff19168380011785556121c8565b828001600101855582156121c8579182015b828111156121c85782518255916020019190600101906121ad565b506121d49291506121d8565b5090565b5b808211156121d457600081556001016121d9565b6001600160e01b0319811681146118b457600080fd5b60006020828403121561221557600080fd5b813561200b816121ed565b60005b8381101561223b578181015183820152602001612223565b838111156113055750506000910152565b60008151808452612264816020860160208601612220565b601f01601f19169290920160200192915050565b60208152600061200b602083018461224c565b60006020828403121561229d57600080fd5b5035919050565b6001600160a01b03811681146118b457600080fd5b600080604083850312156122cc57600080fd5b82356122d7816122a4565b946020939093013593505050565b6000602082840312156122f757600080fd5b813561200b816122a4565b60008083601f84011261231457600080fd5b50813567ffffffffffffffff81111561232c57600080fd5b6020830191508360208260051b850101111561234757600080fd5b9250929050565b6000806000806060858703121561236457600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561238957600080fd5b61239587828801612302565b95989497509550505050565b6000806000606084860312156123b657600080fd5b83356123c1816122a4565b925060208401356123d1816122a4565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612413576124136123e2565b604051601f8501601f19908116603f0116810190828211818310171561243b5761243b6123e2565b8160405280935085815286868601111561245457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561248057600080fd5b813567ffffffffffffffff81111561249757600080fd5b8201601f810184136124a857600080fd5b6117e5848235602084016123f8565b600080602083850312156124ca57600080fd5b823567ffffffffffffffff8111156124e157600080fd5b6124ed85828601612302565b90969095509350505050565b6000806040838503121561250c57600080fd5b8235612517816122a4565b91506020830135801515811461252c57600080fd5b809150509250929050565b6000806000806080858703121561254d57600080fd5b8435612558816122a4565b93506020850135612568816122a4565b925060408501359150606085013567ffffffffffffffff81111561258b57600080fd5b8501601f8101871361259c57600080fd5b6125ab878235602084016123f8565b91505092959194509250565b600080604083850312156125ca57600080fd5b82356125d5816122a4565b9150602083013561252c816122a4565b6000806000604084860312156125fa57600080fd5b8335612605816122a4565b9250602084013567ffffffffffffffff81111561262157600080fd5b61262d86828701612302565b9497909650939450505050565b600181811c9082168061264e57607f821691505b60208210810361266e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561269d5761269d612674565b500190565b6020808252600c908201526b4e6f20636f6e74726163747360a01b604082015260600190565b6000600182016126da576126da612674565b5060010190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561278c57600080fd5b815161200b816122a4565b60008160001904831182151516156127b1576127b1612674565b500290565b600081516127c8818560208601612220565b9290920192915050565b600080845481600182811c9150808316806127ee57607f831692505b6020808410820361280d57634e487b7160e01b86526022600452602486fd5b81801561282157600181146128325761285f565b60ff1986168952848901965061285f565b60008b81526020902060005b868110156128575781548b82015290850190830161283e565b505084890196505b50505050505061288361287282866127b6565b64173539b7b760d91b815260050190565b95945050505050565b60008282101561289e5761289e612674565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261291a5761291a6128f5565b500490565b60008261292e5761292e6128f5565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129669083018461224c565b9695505050505050565b60006020828403121561298257600080fd5b815161200b816121ed56fea26469706673582212202a7a7b384de2efe1daf3763cd2f5ae300e84c096d0113be48a0ed9b62e46c94b64736f6c634300080d0033
Deployed Bytecode Sourcemap
43675:5719:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21726:305;;;;;;;;;;-1:-1:-1;21726:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;21726:305:0;;;;;;;;22653:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24166:171::-;;;;;;;;;;-1:-1:-1;24166:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;24166:171:0;1550:203:1;23683:417:0;;;;;;;;;;-1:-1:-1;23683:417:0;;;;;:::i;:::-;;:::i;:::-;;44361:31;;;;;;;;;;-1:-1:-1;44361:31:0;;;;;;;;;;;44601:45;;;;;;;;;;-1:-1:-1;44601:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2612:25:1;;;2600:2;2585:18;44601:45:0;2466:177:1;45397:904:0;;;;;;:::i;:::-;;:::i;48702:93::-;;;;;;;;;;-1:-1:-1;48775:12:0;;48702:93;;24866:336;;;;;;;;;;-1:-1:-1;24866:336:0;;;;;:::i;:::-;;:::i;43919:41::-;;;;;;;;;;;;43956:4;43919:41;;44204:30;;;;;;;;;;;;;;;;47567:209;;;;;;;;;;;;;:::i;25273:185::-;;;;;;;;;;-1:-1:-1;25273:185:0;;;;;:::i;:::-;;:::i;44490:46::-;;;;;;;;;;-1:-1:-1;44490:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;48803:100;;;;;;;;;;-1:-1:-1;48803:100:0;;;;;:::i;:::-;;:::i;48382:90::-;;;;;;;;;;-1:-1:-1;48382:90:0;;;;;:::i;:::-;;:::i;44543:51::-;;;;;;;;;;-1:-1:-1;44543:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;44320:34;;;;;;;;;;-1:-1:-1;44320:34:0;;;;;;;;;;;22364:222;;;;;;;;;;-1:-1:-1;22364:222:0;;;;;:::i;:::-;;:::i;43729:26::-;;;;;;;;;;;;;:::i;44171:::-;;;;;;;;;;;;;;;;22095:207;;;;;;;;;;-1:-1:-1;22095:207:0;;;;;:::i;:::-;;:::i;42854:103::-;;;;;;;;;;;;;:::i;48083:99::-;;;;;;;;;;;;;:::i;42203:87::-;;;;;;;;;;-1:-1:-1;42276:6:0;;-1:-1:-1;;;;;42276:6:0;42203:87;;48288:86;;;;;;;;;;-1:-1:-1;48288:86:0;;;;;:::i;:::-;;:::i;48911:116::-;;;;;;;;;;-1:-1:-1;48911:116:0;;;;;:::i;:::-;;:::i;44712:677::-;;;;;;:::i;:::-;;:::i;22822:104::-;;;;;;;;;;;;;:::i;48190:90::-;;;;;;;;;;;;;:::i;44241:33::-;;;;;;;;;;;;;;;;46309:797;;;;;;:::i;:::-;;:::i;24409:155::-;;;;;;;;;;-1:-1:-1;24409:155:0;;;;;:::i;:::-;;:::i;48586:108::-;;;;;;;;;;-1:-1:-1;48586:108:0;;;;;:::i;:::-;;:::i;44283:30::-;;;;;;;;;;-1:-1:-1;44283:30:0;;;;;;;;25529:323;;;;;;;;;;-1:-1:-1;25529:323:0;;;;;:::i;:::-;;:::i;49035:356::-;;;;;;;;;;-1:-1:-1;49035:356:0;;;;;:::i;:::-;;:::i;43967:89::-;;;;;;;;;;;;44014:42;43967:89;;44063:99;;;;;;;;;;;;;;;;47988:87;;;;;;;;;;;;;:::i;43762:108::-;;;;;;;;;;;;;:::i;47114:445::-;;;;;;;;;;-1:-1:-1;47114:445:0;;;;;:::i;:::-;;:::i;48480:98::-;;;;;;;;;;-1:-1:-1;48480:98:0;;;;;:::i;:::-;;:::i;43112:201::-;;;;;;;;;;-1:-1:-1;43112:201:0;;;;;:::i;:::-;;:::i;47784:196::-;;;;;;;;;;-1:-1:-1;47784:196:0;;;;;:::i;:::-;;:::i;21726:305::-;21828:4;-1:-1:-1;;;;;;21865:40:0;;-1:-1:-1;;;21865:40:0;;:105;;-1:-1:-1;;;;;;;21922:48:0;;-1:-1:-1;;;21922:48:0;21865:105;:158;;;-1:-1:-1;;;;;;;;;;20442:40:0;;;21987:36;21845:178;21726:305;-1:-1:-1;;21726:305:0:o;22653:100::-;22707:13;22740:5;22733:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22653:100;:::o;24166:171::-;24242:7;24262:23;24277:7;24262:14;:23::i;:::-;-1:-1:-1;24305:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24305:24:0;;24166:171::o;23683:417::-;23764:13;23780:23;23795:7;23780:14;:23::i;:::-;23764:39;;23828:5;-1:-1:-1;;;;;23822:11:0;:2;-1:-1:-1;;;;;23822:11:0;;23814:57;;;;-1:-1:-1;;;23814:57:0;;8871:2:1;23814:57:0;;;8853:21:1;8910:2;8890:18;;;8883:30;8949:34;8929:18;;;8922:62;-1:-1:-1;;;9000:18:1;;;8993:31;9041:19;;23814:57:0;;;;;;;;;17017:10;-1:-1:-1;;;;;23906:21:0;;;;:62;;-1:-1:-1;23931:37:0;23948:5;17017:10;47114:445;:::i;23931:37::-;23884:174;;;;-1:-1:-1;;;23884:174:0;;9273:2:1;23884:174:0;;;9255:21:1;9312:2;9292:18;;;9285:30;9351:34;9331:18;;;9324:62;9422:32;9402:18;;;9395:60;9472:19;;23884:174:0;9071:426:1;23884:174:0;24071:21;24080:2;24084:7;24071:8;:21::i;:::-;23753:347;23683:417;;:::o;45397:904::-;45529:15;;;;;;;45528:16;45520:45;;;;-1:-1:-1;;;45520:45:0;;9704:2:1;45520:45:0;;;9686:21:1;9743:2;9723:18;;;9716:30;-1:-1:-1;;;9762:18:1;;;9755:46;9818:18;;45520:45:0;9502:340:1;45520:45:0;45613:13;45598:12;;:28;;;;:::i;:::-;43956:4;45584:42;;45576:73;;;;-1:-1:-1;;;45576:73:0;;10314:2:1;45576:73:0;;;10296:21:1;10353:2;10333:18;;;10326:30;-1:-1:-1;;;10372:18:1;;;10365:48;10430:18;;45576:73:0;10112:342:1;45576:73:0;45684:1;45668:13;:17;45660:41;;;;-1:-1:-1;;;45660:41:0;;10661:2:1;45660:41:0;;;10643:21:1;10700:2;10680:18;;;10673:30;-1:-1:-1;;;10719:18:1;;;10712:41;10770:18;;45660:41:0;10459:335:1;45660:41:0;17017:10;45763:9;:20;;45755:45;;;;-1:-1:-1;;;45755:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45819:25:0;;;;;;:16;:25;;;;;;45864:10;;45819:41;;45847:13;;45819:41;:::i;:::-;:55;;45811:90;;;;-1:-1:-1;;;45811:90:0;;11342:2:1;45811:90:0;;;11324:21:1;11381:2;11361:18;;;11354:30;-1:-1:-1;;;11400:18:1;;;11393:52;11462:18;;45811:90:0;11140:346:1;45811:90:0;45939:37;;-1:-1:-1;;11668:2:1;11664:15;;;11660:53;45939:37:0;;;11648:66:1;11730:12;;;11723:28;;;45914:12:0;;11767::1;;45939:37:0;;;;;;;;;;;;45929:48;;;;;;45914:63;;45996:55;46015:12;;45996:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46029:15:0;;;-1:-1:-1;46046:4:0;;-1:-1:-1;45996:18:0;:55::i;:::-;45988:81;;;;-1:-1:-1;;;45988:81:0;;11992:2:1;45988:81:0;;;11974:21:1;12031:2;12011:18;;;12004:30;-1:-1:-1;;;12050:18:1;;;12043:43;12103:18;;45988:81:0;11790:337:1;45988:81:0;-1:-1:-1;;;;;46094:25:0;;;;;;:16;:25;;;;;:42;;;;;;46149:145;46169:13;46165:1;:17;46149:145;;;46204:32;46214:7;46223:12;;46204:9;:32::i;:::-;46263:12;:17;;46279:1;46263:17;;;46184:3;;;;:::i;:::-;;;;46149:145;;;;45509:792;;45397:904;;;;:::o;24866:336::-;25061:41;17017:10;25094:7;25061:18;:41::i;:::-;25053:100;;;;-1:-1:-1;;;25053:100:0;;;;;;;:::i;:::-;25166:28;25176:4;25182:2;25186:7;25166:9;:28::i;47567:209::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;47686:37:::1;::::0;47635:21:::1;::::0;47617:15:::1;::::0;17017:10;;47635:21;;47617:15;47686:37;47617:15;47686:37;47635:21;17017:10;47686:37:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47667:56;;;47742:7;47734:34;;;::::0;-1:-1:-1;;;47734:34:0;;13460:2:1;47734:34:0::1;::::0;::::1;13442:21:1::0;13499:2;13479:18;;;13472:30;-1:-1:-1;;;13518:18:1;;;13511:44;13572:18;;47734:34:0::1;13258:338:1::0;47734:34:0::1;47606:170;;47567:209::o:0;25273:185::-;25411:39;25428:4;25434:2;25438:7;25411:39;;;;;;;;;;;;:16;:39::i;48803:100::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;48877:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;48382:90::-:0;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;48448:7:::1;:16:::0;48382:90::o;22364:222::-;22436:7;22472:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22472:16:0;;22499:56;;;;-1:-1:-1;;;22499:56:0;;13803:2:1;22499:56:0;;;13785:21:1;13842:2;13822:18;;;13815:30;-1:-1:-1;;;13861:18:1;;;13854:54;13925:18;;22499:56:0;13601:348:1;43729:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22095:207::-;22167:7;-1:-1:-1;;;;;22195:19:0;;22187:73;;;;-1:-1:-1;;;22187:73:0;;14156:2:1;22187:73:0;;;14138:21:1;14195:2;14175:18;;;14168:30;14234:34;14214:18;;;14207:62;-1:-1:-1;;;14285:18:1;;;14278:39;14334:19;;22187:73:0;13954:405:1;22187:73:0;-1:-1:-1;;;;;;22278:16:0;;;;;:9;:16;;;;;;;22095:207::o;42854:103::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;42919:30:::1;42946:1;42919:18;:30::i;:::-;42854:103::o:0;48083:99::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;48159:15:::1;::::0;;-1:-1:-1;;48140:34:0;::::1;48159:15;::::0;;;::::1;;;48158:16;48140:34:::0;;::::1;;::::0;;48083:99::o;48288:86::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;48352:5:::1;:14:::0;48288:86::o;48911:116::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;48993:26;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;44712:677::-:0;44842:11;;17017:10;;44842:11;;44841:12;;:34;;;44868:7;-1:-1:-1;;;;;44857:18:0;:7;42276:6;;-1:-1:-1;;;;;42276:6:0;;42203:87;44857:7;-1:-1:-1;;;;;44857:18:0;;44841:34;44833:59;;;;-1:-1:-1;;;44833:59:0;;14566:2:1;44833:59:0;;;14548:21:1;14605:2;14585:18;;;14578:30;-1:-1:-1;;;14624:18:1;;;14617:42;14676:18;;44833:59:0;14364:336:1;44833:59:0;44909:9;-1:-1:-1;;;;;44909:20:0;;;44901:45;;;;-1:-1:-1;;;44901:45:0;;;;;;;:::i;:::-;44962:9;44957:425;44973:20;;;44957:425;;;45021:18;;-1:-1:-1;;;;;45021:51:0;;;;:18;;;;:26;45048:9;;45058:1;45048:12;;;;;;;:::i;:::-;;;;;;;45021:40;;;;;;;;;;;;;2612:25:1;;2600:2;2585:18;;2466:177;45021:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45021:51:0;;45013:86;;;;-1:-1:-1;;;45013:86:0;;15295:2:1;45013:86:0;;;15277:21:1;15334:2;15314:18;;;15307:30;-1:-1:-1;;;15353:18:1;;;15346:52;15415:18;;45013:86:0;15093:346:1;45013:86:0;45121:14;:28;45136:9;;45146:1;45136:12;;;;;;;:::i;:::-;;;;;;;;;;45121:28;;-1:-1:-1;45121:28:0;;;;;;;;-1:-1:-1;45121:28:0;;;;45120:29;45112:63;;;;-1:-1:-1;;;45112:63:0;;15646:2:1;45112:63:0;;;15628:21:1;15685:2;15665:18;;;15658:30;-1:-1:-1;;;15704:18:1;;;15697:51;15765:18;;45112:63:0;15444:345:1;45112:63:0;45221:4;45190:14;:28;45205:9;;45215:1;45205:12;;;;;;;:::i;:::-;;;;;;;45190:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;45238:32;45248:7;45257:9;;45267:1;45257:12;;;;;;;:::i;:::-;;;;;;;45238:9;:32::i;:::-;45283:38;45293:7;45302:9;;45312:1;45302:12;;;;;;;:::i;:::-;;;;;;;45317:3;45302:18;;;;:::i;:::-;45283:9;:38::i;:::-;45334;45344:7;45353:9;;45363:1;45353:12;;;;;;;:::i;:::-;;;;;;;45368:3;45353:18;;;;:::i;45334:38::-;44995:3;;;;:::i;:::-;;;;44957:425;;;;44785:604;44712:677;;:::o;22822:104::-;22878:13;22911:7;22904:14;;;;;:::i;48190:90::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;48260:12:::1;::::0;;-1:-1:-1;;48244:28:0;::::1;48260:12:::0;;;;::::1;;;48259:13;48244:28:::0;;::::1;;::::0;;48190:90::o;46309:797::-;46383:12;;;;;;;46382:13;46374:39;;;;-1:-1:-1;;;46374:39:0;;15996:2:1;46374:39:0;;;15978:21:1;16035:2;16015:18;;;16008:30;-1:-1:-1;;;16054:18:1;;;16047:43;16107:18;;46374:39:0;15794:337:1;46374:39:0;46461:13;46446:12;;:28;;;;:::i;:::-;43956:4;46432:42;;46424:73;;;;-1:-1:-1;;;46424:73:0;;10314:2:1;46424:73:0;;;10296:21:1;10353:2;10333:18;;;10326:30;-1:-1:-1;;;10372:18:1;;;10365:48;10430:18;;46424:73:0;10112:342:1;46424:73:0;46532:1;46516:13;:17;46508:41;;;;-1:-1:-1;;;46508:41:0;;10661:2:1;46508:41:0;;;10643:21:1;10700:2;10680:18;;;10673:30;-1:-1:-1;;;10719:18:1;;;10712:41;10770:18;;46508:41:0;10459:335:1;46508:41:0;46585:7;;46568:13;:24;;46560:45;;;;-1:-1:-1;;;46560:45:0;;16338:2:1;46560:45:0;;;16320:21:1;16377:1;16357:18;;;16350:29;-1:-1:-1;;;16395:18:1;;;16388:38;16443:18;;46560:45:0;16136:331:1;46560:45:0;46649:9;46640:5;;46624:13;:21;;;;:::i;:::-;:34;46616:69;;;;-1:-1:-1;;;46616:69:0;;16847:2:1;46616:69:0;;;16829:21:1;16886:2;16866:18;;;16859:30;-1:-1:-1;;;16905:18:1;;;16898:52;16967:18;;46616:69:0;16645:346:1;46616:69:0;17017:10;46747:9;:20;;46739:45;;;;-1:-1:-1;;;46739:45:0;;;;;;;:::i;:::-;46842:11;;-1:-1:-1;;;;;46803:19:0;;;;;;:10;:19;;;;;;:35;;46825:13;;46803:35;:::i;:::-;:50;;46795:85;;;;-1:-1:-1;;;46795:85:0;;11342:2:1;46795:85:0;;;11324:21:1;11381:2;11361:18;;;11354:30;-1:-1:-1;;;11400:18:1;;;11393:52;11462:18;;46795:85:0;11140:346:1;46795:85:0;-1:-1:-1;;;;;46905:19:0;;;;;;:10;:19;;;;;:36;;;;;;46954:145;46974:13;46970:1;:17;46954:145;;;47009:32;47019:7;47028:12;;47009:9;:32::i;:::-;47068:12;:17;;47084:1;47068:17;;;46989:3;;;;:::i;:::-;;;;46954:145;;24409:155;24504:52;17017:10;24537:8;24547;24504:18;:52::i;48586:108::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;48661:15:::1;:25:::0;48586:108::o;25529:323::-;25703:41;17017:10;25736:7;25703:18;:41::i;:::-;25695:100;;;;-1:-1:-1;;;25695:100:0;;;;;;;:::i;:::-;25806:38;25820:4;25826:2;25830:7;25839:4;25806:13;:38::i;49035:356::-;27424:4;27448:16;;;:7;:16;;;;;;49101:13;;-1:-1:-1;;;;;27448:16:0;49127:51;;;;-1:-1:-1;;;49127:51:0;;17198:2:1;49127:51:0;;;17180:21:1;17237:2;17217:18;;;17210:30;-1:-1:-1;;;17256:18:1;;;17249:51;17317:18;;49127:51:0;16996:345:1;49127:51:0;49220:1;49202:7;49196:21;;;;;:::i;:::-;;;:25;:187;;;;;;;;;;;;;;;;;49278:7;49302:26;49319:8;49302:16;:26::i;:::-;49245:122;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49189:194;49035:356;-1:-1:-1;;49035:356:0:o;47988:87::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;48056:11:::1;::::0;;-1:-1:-1;;48041:26:0;::::1;48056:11;::::0;;::::1;48055:12;48041:26;::::0;;47988:87::o;43762:108::-;;;;;;;:::i;47114:445::-;47412:28;;-1:-1:-1;;;47412:28:0;;-1:-1:-1;;;;;1714:32:1;;;47412:28:0;;;1696:51:1;47239:4:0;;44014:42;;47404:49;;;44014:42;;47412:21;;1669:18:1;;47412:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47404:49:0;;47400:93;;47477:4;47470:11;;;;;47400:93;-1:-1:-1;;;;;24756:25:0;;;24732:4;24756:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;47512:39;47505:46;47114:445;-1:-1:-1;;;;47114:445:0:o;48480:98::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;48550:11:::1;:20:::0;48480:98::o;43112:201::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43201:22:0;::::1;43193:73;;;::::0;-1:-1:-1;;;43193:73:0;;19573:2:1;43193:73:0::1;::::0;::::1;19555:21:1::0;19612:2;19592:18;;;19585:30;19651:34;19631:18;;;19624:62;-1:-1:-1;;;19702:18:1;;;19695:36;19748:19;;43193:73:0::1;19371:402:1::0;43193:73:0::1;43277:28;43296:8;43277:18;:28::i;:::-;43112:201:::0;:::o;47784:196::-;42276:6;;-1:-1:-1;;;;;42276:6:0;17017:10;42423:23;42415:68;;;;-1:-1:-1;;;42415:68:0;;;;;;;:::i;:::-;47880:9:::1;47875:98;47891:20:::0;;::::1;47875:98;;;47933:28;47943:3;47948:9;;47958:1;47948:12;;;;;;;:::i;47933:28::-;47913:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47875:98;;32141:135:::0;27424:4;27448:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27448:16:0;32215:53;;;;-1:-1:-1;;;32215:53:0;;13803:2:1;32215:53:0;;;13785:21:1;13842:2;13822:18;;;13815:30;-1:-1:-1;;;13861:18:1;;;13854:54;13925:18;;32215:53:0;13601:348:1;31420:174:0;31495:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31495:29:0;-1:-1:-1;;;;;31495:29:0;;;;;;;;:24;;31549:23;31495:24;31549:14;:23::i;:::-;-1:-1:-1;;;;;31540:46:0;;;;;;;;;;;31420:174;;:::o;36105:190::-;36230:4;36283;36254:25;36267:5;36274:4;36254:12;:25::i;:::-;:33;;36105:190;-1:-1:-1;;;;36105:190:0:o;28259:110::-;28335:26;28345:2;28349:7;28335:26;;;;;;;;;;;;:9;:26::i;27653:264::-;27746:4;27763:13;27779:23;27794:7;27779:14;:23::i;:::-;27763:39;;27832:5;-1:-1:-1;;;;;27821:16:0;:7;-1:-1:-1;;;;;27821:16:0;;:52;;;;27841:32;27858:5;27865:7;27841:16;:32::i;:::-;27821:87;;;;27901:7;-1:-1:-1;;;;;27877:31:0;:20;27889:7;27877:11;:20::i;:::-;-1:-1:-1;;;;;27877:31:0;;;27653:264;-1:-1:-1;;;;27653:264:0:o;30676:625::-;30835:4;-1:-1:-1;;;;;30808:31:0;:23;30823:7;30808:14;:23::i;:::-;-1:-1:-1;;;;;30808:31:0;;30800:81;;;;-1:-1:-1;;;30800:81:0;;19980:2:1;30800:81:0;;;19962:21:1;20019:2;19999:18;;;19992:30;20058:34;20038:18;;;20031:62;-1:-1:-1;;;20109:18:1;;;20102:35;20154:19;;30800:81:0;19778:401:1;30800:81:0;-1:-1:-1;;;;;30900:16:0;;30892:65;;;;-1:-1:-1;;;30892:65:0;;20386:2:1;30892:65:0;;;20368:21:1;20425:2;20405:18;;;20398:30;20464:34;20444:18;;;20437:62;-1:-1:-1;;;20515:18:1;;;20508:34;20559:19;;30892:65:0;20184:400:1;30892:65:0;31074:29;31091:1;31095:7;31074:8;:29::i;:::-;-1:-1:-1;;;;;31116:15:0;;;;;;:9;:15;;;;;:20;;31135:1;;31116:15;:20;;31135:1;;31116:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31147:13:0;;;;;;:9;:13;;;;;:18;;31164:1;;31147:13;:18;;31164:1;;31147:18;:::i;:::-;;;;-1:-1:-1;;31176:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31176:21:0;-1:-1:-1;;;;;31176:21:0;;;;;;;;;31215:27;;31176:16;;31215:27;;;;;;;23753:347;23683:417;;:::o;43473:191::-;43566:6;;;-1:-1:-1;;;;;43583:17:0;;;-1:-1:-1;;;;;;43583:17:0;;;;;;;43616:40;;43566:6;;;43583:17;43566:6;;43616:40;;43547:16;;43616:40;43536:128;43473:191;:::o;31737:315::-;31892:8;-1:-1:-1;;;;;31883:17:0;:5;-1:-1:-1;;;;;31883:17:0;;31875:55;;;;-1:-1:-1;;;31875:55:0;;20921:2:1;31875:55:0;;;20903:21:1;20960:2;20940:18;;;20933:30;20999:27;20979:18;;;20972:55;21044:18;;31875:55:0;20719:349:1;31875:55:0;-1:-1:-1;;;;;31941:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31941:46:0;;;;;;;;;;32003:41;;540::1;;;32003::0;;513:18:1;32003:41:0;;;;;;;31737:315;;;:::o;26733:313::-;26889:28;26899:4;26905:2;26909:7;26889:9;:28::i;:::-;26936:47;26959:4;26965:2;26969:7;26978:4;26936:22;:47::i;:::-;26928:110;;;;-1:-1:-1;;;26928:110:0;;;;;;;:::i;17489:723::-;17545:13;17766:5;17775:1;17766:10;17762:53;;-1:-1:-1;;17793:10:0;;;;;;;;;;;;-1:-1:-1;;;17793:10:0;;;;;17489:723::o;17762:53::-;17840:5;17825:12;17881:78;17888:9;;17881:78;;17914:8;;;;:::i;:::-;;-1:-1:-1;17937:10:0;;-1:-1:-1;17945:2:0;17937:10;;:::i;:::-;;;17881:78;;;17969:19;18001:6;17991:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17991:17:0;;17969:39;;18019:154;18026:10;;18019:154;;18053:11;18063:1;18053:11;;:::i;:::-;;-1:-1:-1;18122:10:0;18130:2;18122:5;:10;:::i;:::-;18109:24;;:2;:24;:::i;:::-;18096:39;;18079:6;18086;18079:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18079:56:0;;;;;;;;-1:-1:-1;18150:11:0;18159:2;18150:11;;:::i;:::-;;;18019:154;;36972:296;37055:7;37098:4;37055:7;37113:118;37137:5;:12;37133:1;:16;37113:118;;;37186:33;37196:12;37210:5;37216:1;37210:8;;;;;;;;:::i;:::-;;;;;;;37186:9;:33::i;:::-;37171:48;-1:-1:-1;37151:3:0;;;;:::i;:::-;;;;37113:118;;;-1:-1:-1;37248:12:0;36972:296;-1:-1:-1;;;36972:296:0:o;28596:319::-;28725:18;28731:2;28735:7;28725:5;:18::i;:::-;28776:53;28807:1;28811:2;28815:7;28824:4;28776:22;:53::i;:::-;28754:153;;;;-1:-1:-1;;;28754:153:0;;;;;;;:::i;32840:853::-;32994:4;-1:-1:-1;;;;;33015:13:0;;9310:19;:23;33011:675;;33051:71;;-1:-1:-1;;;33051:71:0;;-1:-1:-1;;;;;33051:36:0;;;;;:71;;17017:10;;33102:4;;33108:7;;33117:4;;33051:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33051:71:0;;;;;;;;-1:-1:-1;;33051:71:0;;;;;;;;;;;;:::i;:::-;;;33047:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33292:6;:13;33309:1;33292:18;33288:328;;33335:60;;-1:-1:-1;;;33335:60:0;;;;;;;:::i;33288:328::-;33566:6;33560:13;33551:6;33547:2;33543:15;33536:38;33047:584;-1:-1:-1;;;;;;33173:51:0;-1:-1:-1;;;33173:51:0;;-1:-1:-1;33166:58:0;;33011:675;-1:-1:-1;33670:4:0;32840:853;;;;;;:::o;40718:149::-;40781:7;40812:1;40808;:5;:51;;40943:13;41037:15;;;41073:4;41066:15;;;41120:4;41104:21;;40808:51;;;40943:13;41037:15;;;41073:4;41066:15;;;41120:4;41104:21;;40816:20;40801:58;40718:149;-1:-1:-1;;;40718:149:0:o;29251:439::-;-1:-1:-1;;;;;29331:16:0;;29323:61;;;;-1:-1:-1;;;29323:61:0;;22827:2:1;29323:61:0;;;22809:21:1;;;22846:18;;;22839:30;22905:34;22885:18;;;22878:62;22957:18;;29323:61:0;22625:356:1;29323:61:0;27424:4;27448:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27448:16:0;:30;29395:58;;;;-1:-1:-1;;;29395:58:0;;23188:2:1;29395:58:0;;;23170:21:1;23227:2;23207:18;;;23200:30;23266;23246:18;;;23239:58;23314:18;;29395:58:0;22986:352:1;29395:58:0;-1:-1:-1;;;;;29524:13:0;;;;;;:9;:13;;;;;:18;;29541:1;;29524:13;:18;;29541:1;;29524:18;:::i;:::-;;;;-1:-1:-1;;29553:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29553:21:0;-1:-1:-1;;;;;29553:21:0;;;;;;;;29592:33;;29553:16;;;29592:33;;29553:16;;29592:33;47606:170:::1;;47567:209::o:0;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:131::-;-1:-1:-1;;;;;1833:31:1;;1823:42;;1813:70;;1879:1;1876;1869:12;1894:315;1962:6;1970;2023:2;2011:9;2002:7;1998:23;1994:32;1991:52;;;2039:1;2036;2029:12;1991:52;2078:9;2065:23;2097:31;2122:5;2097:31;:::i;:::-;2147:5;2199:2;2184:18;;;;2171:32;;-1:-1:-1;;;1894:315:1:o;2214:247::-;2273:6;2326:2;2314:9;2305:7;2301:23;2297:32;2294:52;;;2342:1;2339;2332:12;2294:52;2381:9;2368:23;2400:31;2425:5;2400:31;:::i;2648:367::-;2711:8;2721:6;2775:3;2768:4;2760:6;2756:17;2752:27;2742:55;;2793:1;2790;2783:12;2742:55;-1:-1:-1;2816:20:1;;2859:18;2848:30;;2845:50;;;2891:1;2888;2881:12;2845:50;2928:4;2920:6;2916:17;2904:29;;2988:3;2981:4;2971:6;2968:1;2964:14;2956:6;2952:27;2948:38;2945:47;2942:67;;;3005:1;3002;2995:12;2942:67;2648:367;;;;;:::o;3020:573::-;3124:6;3132;3140;3148;3201:2;3189:9;3180:7;3176:23;3172:32;3169:52;;;3217:1;3214;3207:12;3169:52;3253:9;3240:23;3230:33;;3310:2;3299:9;3295:18;3282:32;3272:42;;3365:2;3354:9;3350:18;3337:32;3392:18;3384:6;3381:30;3378:50;;;3424:1;3421;3414:12;3378:50;3463:70;3525:7;3516:6;3505:9;3501:22;3463:70;:::i;:::-;3020:573;;;;-1:-1:-1;3552:8:1;-1:-1:-1;;;;3020:573:1:o;3598:456::-;3675:6;3683;3691;3744:2;3732:9;3723:7;3719:23;3715:32;3712:52;;;3760:1;3757;3750:12;3712:52;3799:9;3786:23;3818:31;3843:5;3818:31;:::i;:::-;3868:5;-1:-1:-1;3925:2:1;3910:18;;3897:32;3938:33;3897:32;3938:33;:::i;:::-;3598:456;;3990:7;;-1:-1:-1;;;4044:2:1;4029:18;;;;4016:32;;3598:456::o;4059:127::-;4120:10;4115:3;4111:20;4108:1;4101:31;4151:4;4148:1;4141:15;4175:4;4172:1;4165:15;4191:632;4256:5;4286:18;4327:2;4319:6;4316:14;4313:40;;;4333:18;;:::i;:::-;4408:2;4402:9;4376:2;4462:15;;-1:-1:-1;;4458:24:1;;;4484:2;4454:33;4450:42;4438:55;;;4508:18;;;4528:22;;;4505:46;4502:72;;;4554:18;;:::i;:::-;4594:10;4590:2;4583:22;4623:6;4614:15;;4653:6;4645;4638:22;4693:3;4684:6;4679:3;4675:16;4672:25;4669:45;;;4710:1;4707;4700:12;4669:45;4760:6;4755:3;4748:4;4740:6;4736:17;4723:44;4815:1;4808:4;4799:6;4791;4787:19;4783:30;4776:41;;;;4191:632;;;;;:::o;4828:451::-;4897:6;4950:2;4938:9;4929:7;4925:23;4921:32;4918:52;;;4966:1;4963;4956:12;4918:52;5006:9;4993:23;5039:18;5031:6;5028:30;5025:50;;;5071:1;5068;5061:12;5025:50;5094:22;;5147:4;5139:13;;5135:27;-1:-1:-1;5125:55:1;;5176:1;5173;5166:12;5125:55;5199:74;5265:7;5260:2;5247:16;5242:2;5238;5234:11;5199:74;:::i;5284:437::-;5370:6;5378;5431:2;5419:9;5410:7;5406:23;5402:32;5399:52;;;5447:1;5444;5437:12;5399:52;5487:9;5474:23;5520:18;5512:6;5509:30;5506:50;;;5552:1;5549;5542:12;5506:50;5591:70;5653:7;5644:6;5633:9;5629:22;5591:70;:::i;:::-;5680:8;;5565:96;;-1:-1:-1;5284:437:1;-1:-1:-1;;;;5284:437:1:o;5726:416::-;5791:6;5799;5852:2;5840:9;5831:7;5827:23;5823:32;5820:52;;;5868:1;5865;5858:12;5820:52;5907:9;5894:23;5926:31;5951:5;5926:31;:::i;:::-;5976:5;-1:-1:-1;6033:2:1;6018:18;;6005:32;6075:15;;6068:23;6056:36;;6046:64;;6106:1;6103;6096:12;6046:64;6129:7;6119:17;;;5726:416;;;;;:::o;6332:795::-;6427:6;6435;6443;6451;6504:3;6492:9;6483:7;6479:23;6475:33;6472:53;;;6521:1;6518;6511:12;6472:53;6560:9;6547:23;6579:31;6604:5;6579:31;:::i;:::-;6629:5;-1:-1:-1;6686:2:1;6671:18;;6658:32;6699:33;6658:32;6699:33;:::i;:::-;6751:7;-1:-1:-1;6805:2:1;6790:18;;6777:32;;-1:-1:-1;6860:2:1;6845:18;;6832:32;6887:18;6876:30;;6873:50;;;6919:1;6916;6909:12;6873:50;6942:22;;6995:4;6987:13;;6983:27;-1:-1:-1;6973:55:1;;7024:1;7021;7014:12;6973:55;7047:74;7113:7;7108:2;7095:16;7090:2;7086;7082:11;7047:74;:::i;:::-;7037:84;;;6332:795;;;;;;;:::o;7314:388::-;7382:6;7390;7443:2;7431:9;7422:7;7418:23;7414:32;7411:52;;;7459:1;7456;7449:12;7411:52;7498:9;7485:23;7517:31;7542:5;7517:31;:::i;:::-;7567:5;-1:-1:-1;7624:2:1;7609:18;;7596:32;7637:33;7596:32;7637:33;:::i;7707:572::-;7802:6;7810;7818;7871:2;7859:9;7850:7;7846:23;7842:32;7839:52;;;7887:1;7884;7877:12;7839:52;7926:9;7913:23;7945:31;7970:5;7945:31;:::i;:::-;7995:5;-1:-1:-1;8051:2:1;8036:18;;8023:32;8078:18;8067:30;;8064:50;;;8110:1;8107;8100:12;8064:50;8149:70;8211:7;8202:6;8191:9;8187:22;8149:70;:::i;:::-;7707:572;;8238:8;;-1:-1:-1;8123:96:1;;-1:-1:-1;;;;7707:572:1:o;8284:380::-;8363:1;8359:12;;;;8406;;;8427:61;;8481:4;8473:6;8469:17;8459:27;;8427:61;8534:2;8526:6;8523:14;8503:18;8500:38;8497:161;;8580:10;8575:3;8571:20;8568:1;8561:31;8615:4;8612:1;8605:15;8643:4;8640:1;8633:15;8497:161;;8284:380;;;:::o;9847:127::-;9908:10;9903:3;9899:20;9896:1;9889:31;9939:4;9936:1;9929:15;9963:4;9960:1;9953:15;9979:128;10019:3;10050:1;10046:6;10043:1;10040:13;10037:39;;;10056:18;;:::i;:::-;-1:-1:-1;10092:9:1;;9979:128::o;10799:336::-;11001:2;10983:21;;;11040:2;11020:18;;;11013:30;-1:-1:-1;;;11074:2:1;11059:18;;11052:42;11126:2;11111:18;;10799:336::o;12132:135::-;12171:3;12192:17;;;12189:43;;12212:18;;:::i;:::-;-1:-1:-1;12259:1:1;12248:13;;12132:135::o;12272:410::-;12474:2;12456:21;;;12513:2;12493:18;;;12486:30;12552:34;12547:2;12532:18;;12525:62;-1:-1:-1;;;12618:2:1;12603:18;;12596:44;12672:3;12657:19;;12272:410::o;12687:356::-;12889:2;12871:21;;;12908:18;;;12901:30;12967:34;12962:2;12947:18;;12940:62;13034:2;13019:18;;12687:356::o;14705:127::-;14766:10;14761:3;14757:20;14754:1;14747:31;14797:4;14794:1;14787:15;14821:4;14818:1;14811:15;14837:251;14907:6;14960:2;14948:9;14939:7;14935:23;14931:32;14928:52;;;14976:1;14973;14966:12;14928:52;15008:9;15002:16;15027:31;15052:5;15027:31;:::i;16472:168::-;16512:7;16578:1;16574;16570:6;16566:14;16563:1;16560:21;16555:1;16548:9;16541:17;16537:45;16534:71;;;16585:18;;:::i;:::-;-1:-1:-1;16625:9:1;;16472:168::o;17472:185::-;17514:3;17552:5;17546:12;17567:52;17612:6;17607:3;17600:4;17593:5;17589:16;17567:52;:::i;:::-;17635:16;;;;;17472:185;-1:-1:-1;;17472:185:1:o;17780:1301::-;18057:3;18086:1;18119:6;18113:13;18149:3;18171:1;18199:9;18195:2;18191:18;18181:28;;18259:2;18248:9;18244:18;18281;18271:61;;18325:4;18317:6;18313:17;18303:27;;18271:61;18351:2;18399;18391:6;18388:14;18368:18;18365:38;18362:165;;-1:-1:-1;;;18426:33:1;;18482:4;18479:1;18472:15;18512:4;18433:3;18500:17;18362:165;18543:18;18570:104;;;;18688:1;18683:320;;;;18536:467;;18570:104;-1:-1:-1;;18603:24:1;;18591:37;;18648:16;;;;-1:-1:-1;18570:104:1;;18683:320;17419:1;17412:14;;;17456:4;17443:18;;18778:1;18792:165;18806:6;18803:1;18800:13;18792:165;;;18884:14;;18871:11;;;18864:35;18927:16;;;;18821:10;;18792:165;;;18796:3;;18986:6;18981:3;18977:16;18970:23;;18536:467;;;;;;;19019:56;19044:30;19070:3;19062:6;19044:30;:::i;:::-;-1:-1:-1;;;17722:20:1;;17767:1;17758:11;;17662:113;19019:56;19012:63;17780:1301;-1:-1:-1;;;;;17780:1301:1:o;20589:125::-;20629:4;20657:1;20654;20651:8;20648:34;;;20662:18;;:::i;:::-;-1:-1:-1;20699:9:1;;20589:125::o;21073:414::-;21275:2;21257:21;;;21314:2;21294:18;;;21287:30;21353:34;21348:2;21333:18;;21326:62;-1:-1:-1;;;21419:2:1;21404:18;;21397:48;21477:3;21462:19;;21073:414::o;21492:127::-;21553:10;21548:3;21544:20;21541:1;21534:31;21584:4;21581:1;21574:15;21608:4;21605:1;21598:15;21624:120;21664:1;21690;21680:35;;21695:18;;:::i;:::-;-1:-1:-1;21729:9:1;;21624:120::o;21749:112::-;21781:1;21807;21797:35;;21812:18;;:::i;:::-;-1:-1:-1;21846:9:1;;21749:112::o;21866:500::-;-1:-1:-1;;;;;22135:15:1;;;22117:34;;22187:15;;22182:2;22167:18;;22160:43;22234:2;22219:18;;22212:34;;;22282:3;22277:2;22262:18;;22255:31;;;22060:4;;22303:57;;22340:19;;22332:6;22303:57;:::i;:::-;22295:65;21866:500;-1:-1:-1;;;;;;21866:500:1:o;22371:249::-;22440:6;22493:2;22481:9;22472:7;22468:23;22464:32;22461:52;;;22509:1;22506;22499:12;22461:52;22541:9;22535:16;22560:30;22584:5;22560:30;:::i
Swarm Source
ipfs://2a7a7b384de2efe1daf3763cd2f5ae300e84c096d0113be48a0ed9b62e46c94b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.