Source Code
Overview
GLMR Balance
GLMR Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 119 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 3282708 | 1027 days ago | IN | 0 GLMR | 0.00247944 | ||||
| Set Approval For... | 3282705 | 1027 days ago | IN | 0 GLMR | 0.00247944 | ||||
| Set Approval For... | 3282699 | 1027 days ago | IN | 0 GLMR | 0.00247944 | ||||
| Set Approval For... | 2160360 | 1187 days ago | IN | 0 GLMR | 0.00470351 | ||||
| Set Approval For... | 1871285 | 1228 days ago | IN | 0 GLMR | 0.00472668 | ||||
| Set Approval For... | 1795911 | 1239 days ago | IN | 0 GLMR | 0.00470351 | ||||
| Set Approval For... | 1742554 | 1247 days ago | IN | 0 GLMR | 0.00470351 | ||||
| Set Approval For... | 1742533 | 1247 days ago | IN | 0 GLMR | 0.00470351 | ||||
| Withdraw | 1666928 | 1258 days ago | IN | 0 GLMR | 0.00605747 | ||||
| Set Approval For... | 1383462 | 1299 days ago | IN | 0 GLMR | 0.00470351 | ||||
| Mint | 1310698 | 1310 days ago | IN | 8 GLMR | 0.01533215 | ||||
| Mint | 1259011 | 1318 days ago | IN | 80 GLMR | 0.12150083 | ||||
| Mint | 1202128 | 1326 days ago | IN | 24 GLMR | 0.03892519 | ||||
| Mint | 1202128 | 1326 days ago | IN | 56 GLMR | 0.08611127 | ||||
| Mint | 1175544 | 1330 days ago | IN | 8 GLMR | 0.01533215 | ||||
| Mint | 1175541 | 1330 days ago | IN | 8 GLMR | 0.01533215 | ||||
| Mint | 1175532 | 1330 days ago | IN | 8 GLMR | 0.01533215 | ||||
| Mint | 1175528 | 1330 days ago | IN | 16 GLMR | 0.02712867 | ||||
| Mint | 1175515 | 1330 days ago | IN | 8 GLMR | 0.01533215 | ||||
| Mint | 1175514 | 1330 days ago | IN | 24 GLMR | 0.03892519 | ||||
| Set Approval For... | 1083559 | 1344 days ago | IN | 0 GLMR | 0.004634 | ||||
| Set Approval For... | 1071088 | 1345 days ago | IN | 0 GLMR | 0.00470351 | ||||
| Set Whitelist Ac... | 1052909 | 1348 days ago | IN | 0 GLMR | 0.002595 | ||||
| Set Freemint Act... | 1052907 | 1348 days ago | IN | 0 GLMR | 0.0025921 | ||||
| Set Approval For... | 987867 | 1357 days ago | IN | 0 GLMR | 0.00474985 |
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 1666928 | 1258 days ago | 646 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ShapeMonsters
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/**
*Submitted for verification at moonbeam.moonscan.io on 2022-03-26
*/
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/utils/Address.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits a {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Trees proofs.
*
* The proofs can be generated using the JavaScript library
* https://github.com/miguelmota/merkletreejs[merkletreejs].
* Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
*
* See `test/utils/cryptography/MerkleProof.test.js` for some examples.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
if (computedHash <= proofElement) {
// Hash(current computed hash + current element of the proof)
computedHash = _efficientHash(computedHash, proofElement);
} else {
// Hash(current element of the proof + current computed hash)
computedHash = _efficientHash(proofElement, computedHash);
}
}
return computedHash;
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
// File: @openzeppelin/contracts/interfaces/IERC165.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)
pragma solidity ^0.8.0;
// File: @openzeppelin/contracts/interfaces/IERC2981.sol
// S PDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*
* _Available since v4.5._
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
// File: contracts/ShapeMonsters.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
/*
_______ _______ _______ _______ _______ _______ _ _______ _________ _______ _______ _______
( ____ \|\ /|( ___ )( ____ )( ____ \ ( )( ___ )( ( /|( ____ \\__ __/( ____ \( ____ )( ____ \
| ( \/| ) ( || ( ) || ( )|| ( \/ | () () || ( ) || \ ( || ( \/ ) ( | ( \/| ( )|| ( \/
| (_____ | (___) || (___) || (____)|| (__ | || || || | | || \ | || (_____ | | | (__ | (____)|| (_____
(_____ )| ___ || ___ || _____)| __) | |(_)| || | | || (\ \) |(_____ ) | | | __) | __)(_____ )
) || ( ) || ( ) || ( | ( | | | || | | || | \ | ) | | | | ( | (\ ( ) |
/\____) || ) ( || ) ( || ) | (____/\ | ) ( || (___) || ) \ |/\____) | | | | (____/\| ) \ \__/\____) |
\_______)|/ \||/ \||/ (_______/ |/ \|(_______)|/ )_)\_______) )_( (_______/|/ \__/\_______)
@@@@@@@@@@@@@@@@@@@&#//*,,,... ....
@@@,......./@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@, @@@.....,,,,,,,,,,,,,,,,,,,,,,,,,,,,....(@@@@
@@@@@@@@@ @@@...,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..@@@@
@@@@@@@@@@ @@@(.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.@@@ @@@@@@
@@@@@@@. @@@.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.#@@( @@@@@@@@@
,/@@@ @@@,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.@@@ @@@@@@@@@&
@& @@@.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.@@@ @@@@@@@
@# #@@#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.@@@ @@@
@& @@@,,,,,,,,,,,,,,@@@@,,,,,,,,,,,,,,@@,,,,,,,,,,,,@@@ (@(
@@ @@@,,,,,,,,,,,,%@@@@@@,,,,,,,,,,,@@@@@@,,,,,,,,,,.@@@ @@
@@ @@@(,,,,,,,,,,,,@@@@@@@@,,,,,,,,,@@@@@@@@,,,,,,,,,,@@@ @@@
@@ @@@,,,,,,,,,,,,/@@@@@@@@,,,,,,,,,@@@@@@@@,,,,,,,,,,,@@@ @@@
.@# #@@@,,,,,,,,,,,,,@@@@@@@@,,,,,,,,,@@@@@@@@,,,,,,,,,,,@@@ @@@
@@ @@@,,,,,,,,,,,,,,@@@@@@@@,,,,,,,,,@@@@@@@@,,,,,,,,,,,*@@@ @@@@
&@@ @@@,,,,,,,,,,,,,,@@@@@@@@,,,,,,,,,@@@@@@@@,,,,,,,,,,,,@@@ @@@@@@
@@@@ @@@(,,,,,,,,,,,,,,,@@@@@&,,,,,,,,,,,@@@@@@,,,,,,,,,,,%/#@@@@@@@@@
@@@@@@@& @@@@@@%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@
(@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*@@,,@@&
@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@
@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@/,,,,,,,,,,,,,,,@@@
%@@,,,,,,,,,,,,@@@@@@@@,,,,,,,,,,,(@@@@@@@@@@@@@,,,,,,,,,,,,@@@
@@@,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,@@&
@@%,,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,@@@
&@@,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,*@@%
@@@,,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,,,@@@
@@#,,,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,,,,@@@
@@@,,,,,,,,,,,,,@@@@@@@@@@@#,,,@@@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,&@@@
@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@/,,,,,,,,,,,,,,,,,,,,,@@@
.@@/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,&@@@
@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*@@@#
@@@@/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*@@@@@@&
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&
@@@ @@@
@@@ @@@
@@@ @@@
@@% @@@
@@@ @@@
@@@ @@@
@@@, @@@
@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@
*/
contract ShapeMonsters is ERC721, IERC2981, Ownable, ReentrancyGuard, ERC721Enumerable {
using Strings for uint256;
string public PROVENANCE_HASH;
uint256 constant MAX_SUPPLY = 2222;
uint256 private _currentId;
string public baseURI;
string private _contractURI;
bool public isWhitelistActive = false;
bool public isFreemintActive = false;
bool public isMintActive = false;
mapping(address => bool) private _alreadyMinted;
mapping(address => bool) private _alreadyWhitelistMinted;
uint256 public whitelistPrice = 5 ether;
uint256 public price = 8 ether;
bytes32 public merkleRootWhitelist;
bytes32 public merkleRootFreemint;
address public beneficiary;
address public royalties;
constructor(
address _beneficiary,
address _royalties,
string memory _initialBaseURI,
string memory _initialContractURI
) ERC721("Shape Monsters", "ShapeMonsters") {
beneficiary = _beneficiary;
royalties = _royalties;
baseURI = _initialBaseURI;
_contractURI = _initialContractURI;
}
// Accessors
function setProvenanceHash(string calldata hash) public onlyOwner {
PROVENANCE_HASH = hash;
}
function setBeneficiary(address _beneficiary) public onlyOwner {
beneficiary = _beneficiary;
}
function setRoyalties(address _royalties) public onlyOwner {
royalties = _royalties;
}
function setWhitelistActive(bool _isActive) public onlyOwner {
isWhitelistActive = _isActive;
}
function setFreemintActive(bool _isActive) public onlyOwner {
isFreemintActive = _isActive;
}
function setMintActive(bool _isActive) public onlyOwner {
isMintActive = _isActive;
}
function setMerkleRootWhitelist(bytes32 _merkleRoot) public onlyOwner {
merkleRootWhitelist = _merkleRoot;
}
function setMerkleRootFreemint(bytes32 _merkleRoot) public onlyOwner {
merkleRootFreemint = _merkleRoot;
}
function alreadyMinted(address addr) public view returns (bool) {
return _alreadyMinted[addr];
}
function totalSupply() public view override(ERC721Enumerable) returns (uint256) {
return _currentId;
}
// Metadata
function setBaseURI(string memory uri) public onlyOwner {
baseURI = uri;
}
function _baseURI() internal view override returns (string memory) {
return baseURI;
}
function contractURI() public view returns (string memory) {
return _contractURI;
}
function setContractURI(string memory uri) public onlyOwner {
_contractURI = uri;
}
// Minting
function mintListed(
uint256 amount,
bytes32[] calldata merkleProof
) public payable nonReentrant {
address sender = _msgSender();
require(isWhitelistActive, "Sale is closed");
require(_verifyWhitelist(merkleProof, sender), "Invalid proof");
require(msg.value == whitelistPrice * amount, "Incorrect payable amount");
require(!_alreadyWhitelistMinted[sender], "Already minted your Whitelist Spot");
_alreadyWhitelistMinted[sender] = true;
_internalMint(sender, amount);
}
function freeMint(
bytes32[] calldata merkleProof
) public payable nonReentrant {
address sender = _msgSender();
require(isFreemintActive, "Sale is closed");
require(_verifyFreemint(merkleProof, sender), "Invalid proof");
require(!_alreadyMinted[sender], "Already minted your Free Mint");
_alreadyMinted[sender] = true;
_internalMint(sender, 1);
}
function mint(
uint256 amount
) public payable nonReentrant {
address sender = _msgSender();
require(isMintActive, "Sale is closed");
require(msg.value == price * amount, "Incorrect payable amount");
_internalMint(sender, amount);
}
function ownerMint(address to, uint256 amount) public onlyOwner {
_internalMint(to, amount);
}
function withdraw() public onlyOwner {
payable(beneficiary).transfer(address(this).balance);
}
// Private
function _internalMint(address to, uint256 amount) private {
require(_currentId + amount <= MAX_SUPPLY, "Will exceed maximum supply");
for (uint256 i = 1; i <= amount; i++) {
_currentId++;
_safeMint(to, _currentId);
}
}
function _verifyWhitelist(
bytes32[] calldata merkleProof,
address sender
/* uint256 maxAmount */
) private view returns (bool) {
bytes32 leaf = keccak256(abi.encodePacked(sender));
return MerkleProof.verify(merkleProof, merkleRootWhitelist, leaf);
}
function _verifyFreemint(
bytes32[] calldata merkleProof,
address sender
/* uint256 maxAmount */
) private view returns (bool) {
bytes32 leaf = keccak256(abi.encodePacked(sender));
return MerkleProof.verify(merkleProof, merkleRootFreemint, leaf);
}
// ERC165
function supportsInterface(bytes4 interfaceId) public view override(ERC721, IERC165, ERC721Enumerable) returns (bool) {
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
// IERC2981
function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address, uint256 royaltyAmount) {
_tokenId; // silence solc warning
royaltyAmount = (_salePrice / 100) * 3;
return (royalties, royaltyAmount);
}
// ERC721Enumerable
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal override(ERC721, ERC721Enumerable) {
super._beforeTokenTransfer(from, to, tokenId);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"address","name":"_royalties","type":"address"},{"internalType":"string","name":"_initialBaseURI","type":"string"},{"internalType":"string","name":"_initialContractURI","type":"string"}],"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":"PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"alreadyMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFreemintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootFreemint","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootWhitelist","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintListed","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalties","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setFreemintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootFreemint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royalties","type":"address"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setWhitelistActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526010805462ffffff19169055674563918244f40000601355676f05b59d3b2000006014553480156200003557600080fd5b50604051620030a1380380620030a1833981016040819052620000589162000337565b604080518082018252600e81526d5368617065204d6f6e737465727360901b60208083019182528351808501909452600d84526c53686170654d6f6e737465727360981b908401528151919291620000b391600091620001a7565b508051620000c9906001906020840190620001a7565b505050620000e6620000e06200015160201b60201c565b62000155565b6001600755601780546001600160a01b038087166001600160a01b031992831617909255601880549286169290911691909117905581516200013090600e906020850190620001a7565b5080516200014690600f906020840190620001a7565b505050505062000403565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001b590620003c7565b90600052602060002090601f016020900481019282620001d9576000855562000224565b82601f10620001f457805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022457825182559160200191906001019062000207565b506200023292915062000236565b5090565b5b8082111562000232576000815560010162000237565b80516001600160a01b03811681146200026557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200029257600080fd5b81516001600160401b0380821115620002af57620002af6200026a565b604051601f8301601f19908116603f01168101908282118183101715620002da57620002da6200026a565b81604052838152602092508683858801011115620002f757600080fd5b600091505b838210156200031b5785820183015181830184015290820190620002fc565b838211156200032d5760008385830101525b9695505050505050565b600080600080608085870312156200034e57600080fd5b62000359856200024d565b935062000369602086016200024d565b60408601519093506001600160401b03808211156200038757600080fd5b620003958883890162000280565b93506060870151915080821115620003ac57600080fd5b50620003bb8782880162000280565b91505092959194509250565b600181811c90821680620003dc57607f821691505b602082108103620003fd57634e487b7160e01b600052602260045260246000fd5b50919050565b612c8e80620004136000396000f3fe6080604052600436106102935760003560e01c80636fb2dccb1161015a578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c5146107bb578063ee1cc94414610804578063f053dc5c14610824578063f2fde38b14610844578063fc1a1c3614610864578063ff1b65561461087a57600080fd5b8063b88d4fde14610714578063c1a64e5e14610734578063c3b754dc14610747578063c87b56dd14610767578063e86789f614610787578063e8a3d485146107a657600080fd5b80638e1f9cfe116101135780638e1f9cfe14610680578063938e3d7b1461069657806395d89b41146106b6578063a035b1fe146106cb578063a0712d68146106e1578063a22cb465146106f457600080fd5b80636fb2dccb146105e457806370a0823114610604578063715018a6146106245780637319aaa01461063957806388d15d501461064f5780638da5cb5b1461066257600080fd5b8063360bede8116101fe5780634f6ccce7116101b75780634f6ccce714610535578063524513d61461055557806355f804b31461056f5780635b92ac0d1461058f5780636352211e146105af5780636c0360eb146105cf57600080fd5b8063360bede81461048057806338af3eed146104a05780633c6c9946146104c05780633ccfd60b146104e057806342842e0e146104f5578063484b973c1461051557600080fd5b806318160ddd1161025057806318160ddd146103a25780631c31f710146103c157806323b872dd146103e15780632a55205a146104015780632a9e63c6146104405780632f745c591461046057600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b3146103275780630a398b88146103495780631096952314610382575b600080fd5b3480156102a457600080fd5b506102b86102b33660046124f9565b61088f565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26108ba565b6040516102c4919061256e565b3480156102fb57600080fd5b5061030f61030a366004612581565b61094c565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506103476103423660046125b6565b6109e6565b005b34801561035557600080fd5b506102b86103643660046125e0565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561038e57600080fd5b5061034761039d3660046125fb565b610afb565b3480156103ae57600080fd5b50600d545b6040519081526020016102c4565b3480156103cd57600080fd5b506103476103dc3660046125e0565b610b31565b3480156103ed57600080fd5b506103476103fc36600461266d565b610b7d565b34801561040d57600080fd5b5061042161041c3660046126a9565b610bae565b604080516001600160a01b0390931683526020830191909152016102c4565b34801561044c57600080fd5b5061034761045b3660046125e0565b610bdf565b34801561046c57600080fd5b506103b361047b3660046125b6565b610c2b565b34801561048c57600080fd5b5061034761049b366004612581565b610cc1565b3480156104ac57600080fd5b5060175461030f906001600160a01b031681565b3480156104cc57600080fd5b506103476104db366004612581565b610cf0565b3480156104ec57600080fd5b50610347610d1f565b34801561050157600080fd5b5061034761051036600461266d565b610d85565b34801561052157600080fd5b506103476105303660046125b6565b610da0565b34801561054157600080fd5b506103b3610550366004612581565b610dd8565b34801561056157600080fd5b506010546102b89060ff1681565b34801561057b57600080fd5b5061034761058a366004612757565b610e6b565b34801561059b57600080fd5b506010546102b89062010000900460ff1681565b3480156105bb57600080fd5b5061030f6105ca366004612581565b610ea8565b3480156105db57600080fd5b506102e2610f1f565b3480156105f057600080fd5b506103476105ff3660046127b0565b610fad565b34801561061057600080fd5b506103b361061f3660046125e0565b610ff1565b34801561063057600080fd5b50610347611078565b34801561064557600080fd5b506103b360165481565b61034761065d366004612810565b6110ae565b34801561066e57600080fd5b506006546001600160a01b031661030f565b34801561068c57600080fd5b506103b360155481565b3480156106a257600080fd5b506103476106b1366004612757565b6111e9565b3480156106c257600080fd5b506102e2611226565b3480156106d757600080fd5b506103b360145481565b6103476106ef366004612581565b611235565b34801561070057600080fd5b5061034761070f366004612852565b6112f0565b34801561072057600080fd5b5061034761072f366004612885565b6112fb565b610347610742366004612901565b611333565b34801561075357600080fd5b506103476107623660046127b0565b6114c8565b34801561077357600080fd5b506102e2610782366004612581565b611505565b34801561079357600080fd5b506010546102b890610100900460ff1681565b3480156107b257600080fd5b506102e26115e0565b3480156107c757600080fd5b506102b86107d636600461294d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561081057600080fd5b5061034761081f3660046127b0565b6115ef565b34801561083057600080fd5b5060185461030f906001600160a01b031681565b34801561085057600080fd5b5061034761085f3660046125e0565b611635565b34801561087057600080fd5b506103b360135481565b34801561088657600080fd5b506102e26116cd565b60006001600160e01b0319821663152a902d60e11b14806108b457506108b4826116da565b92915050565b6060600080546108c990612977565b80601f01602080910402602001604051908101604052809291908181526020018280546108f590612977565b80156109425780601f1061091757610100808354040283529160200191610942565b820191906000526020600020905b81548152906001019060200180831161092557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109f182610ea8565b9050806001600160a01b0316836001600160a01b031603610a5e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109c1565b336001600160a01b0382161480610a7a5750610a7a81336107d6565b610aec5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109c1565b610af683836116ff565b505050565b6006546001600160a01b03163314610b255760405162461bcd60e51b81526004016109c1906129b1565b610af6600c83836123d6565b6006546001600160a01b03163314610b5b5760405162461bcd60e51b81526004016109c1906129b1565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b610b87338261176d565b610ba35760405162461bcd60e51b81526004016109c1906129e6565b610af6838383611864565b600080610bbc606484612a63565b610bc7906003612a77565b6018546001600160a01b0316925090505b9250929050565b6006546001600160a01b03163314610c095760405162461bcd60e51b81526004016109c1906129b1565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610c3683610ff1565b8210610c985760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109c1565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b6006546001600160a01b03163314610ceb5760405162461bcd60e51b81526004016109c1906129b1565b601555565b6006546001600160a01b03163314610d1a5760405162461bcd60e51b81526004016109c1906129b1565b601655565b6006546001600160a01b03163314610d495760405162461bcd60e51b81526004016109c1906129b1565b6017546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610d82573d6000803e3d6000fd5b50565b610af6838383604051806020016040528060008152506112fb565b6006546001600160a01b03163314610dca5760405162461bcd60e51b81526004016109c1906129b1565b610dd48282611a0b565b5050565b6000610de3600a5490565b8210610e465760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109c1565b600a8281548110610e5957610e59612a96565b90600052602060002001549050919050565b6006546001600160a01b03163314610e955760405162461bcd60e51b81526004016109c1906129b1565b8051610dd490600e90602084019061245a565b6000818152600260205260408120546001600160a01b0316806108b45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109c1565b600e8054610f2c90612977565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5890612977565b8015610fa55780601f10610f7a57610100808354040283529160200191610fa5565b820191906000526020600020905b815481529060010190602001808311610f8857829003601f168201915b505050505081565b6006546001600160a01b03163314610fd75760405162461bcd60e51b81526004016109c1906129b1565b601080549115156101000261ff0019909216919091179055565b60006001600160a01b03821661105c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109c1565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146110a25760405162461bcd60e51b81526004016109c1906129b1565b6110ac6000611aa7565b565b6002600754036110d05760405162461bcd60e51b81526004016109c190612aac565b60026007556010543390610100900460ff166110fe5760405162461bcd60e51b81526004016109c190612ae3565b611109838383611af9565b6111455760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016109c1565b6001600160a01b03811660009081526011602052604090205460ff16156111ae5760405162461bcd60e51b815260206004820152601d60248201527f416c7265616479206d696e74656420796f75722046726565204d696e7400000060448201526064016109c1565b6001600160a01b0381166000908152601160205260409020805460ff191660019081179091556111df908290611a0b565b5050600160075550565b6006546001600160a01b031633146112135760405162461bcd60e51b81526004016109c1906129b1565b8051610dd490600f90602084019061245a565b6060600180546108c990612977565b6002600754036112575760405162461bcd60e51b81526004016109c190612aac565b6002600755601054339062010000900460ff166112865760405162461bcd60e51b81526004016109c190612ae3565b816014546112949190612a77565b34146112dd5760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e58589b1948185b5bdd5b9d60421b60448201526064016109c1565b6112e78183611a0b565b50506001600755565b610dd4338383611b7f565b611305338361176d565b6113215760405162461bcd60e51b81526004016109c1906129e6565b61132d84848484611c4d565b50505050565b6002600754036113555760405162461bcd60e51b81526004016109c190612aac565b6002600755601054339060ff1661137e5760405162461bcd60e51b81526004016109c190612ae3565b611389838383611c80565b6113c55760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016109c1565b836013546113d39190612a77565b341461141c5760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e58589b1948185b5bdd5b9d60421b60448201526064016109c1565b6001600160a01b03811660009081526012602052604090205460ff16156114905760405162461bcd60e51b815260206004820152602260248201527f416c7265616479206d696e74656420796f75722057686974656c6973742053706044820152611bdd60f21b60648201526084016109c1565b6001600160a01b0381166000908152601260205260409020805460ff191660011790556114bd8185611a0b565b505060016007555050565b6006546001600160a01b031633146114f25760405162461bcd60e51b81526004016109c1906129b1565b6010805460ff1916911515919091179055565b6000818152600260205260409020546060906001600160a01b03166115845760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109c1565b600061158e611cfd565b905060008151116115ae57604051806020016040528060008152506115d9565b806115b884611d0c565b6040516020016115c9929190612b0b565b6040516020818303038152906040525b9392505050565b6060600f80546108c990612977565b6006546001600160a01b031633146116195760405162461bcd60e51b81526004016109c1906129b1565b60108054911515620100000262ff000019909216919091179055565b6006546001600160a01b0316331461165f5760405162461bcd60e51b81526004016109c1906129b1565b6001600160a01b0381166116c45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c1565b610d8281611aa7565b600c8054610f2c90612977565b60006001600160e01b0319821663780e9d6360e01b14806108b457506108b482611e0d565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061173482610ea8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117e65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109c1565b60006117f183610ea8565b9050806001600160a01b0316846001600160a01b0316148061182c5750836001600160a01b03166118218461094c565b6001600160a01b0316145b8061185c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661187782610ea8565b6001600160a01b0316146118db5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109c1565b6001600160a01b03821661193d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109c1565b611948838383611e5d565b6119536000826116ff565b6001600160a01b038316600090815260036020526040812080546001929061197c908490612b3a565b90915550506001600160a01b03821660009081526003602052604081208054600192906119aa908490612b51565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6108ae81600d54611a1c9190612b51565b1115611a6a5760405162461bcd60e51b815260206004820152601a60248201527f57696c6c20657863656564206d6178696d756d20737570706c7900000000000060448201526064016109c1565b60015b818111610af657600d8054906000611a8483612b69565b9190505550611a9583600d54611e68565b80611a9f81612b69565b915050611a6d565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040516bffffffffffffffffffffffff19606083901b1660208201526000908190603401604051602081830303815290604052805190602001209050611b76858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506016549150849050611e82565b95945050505050565b816001600160a01b0316836001600160a01b031603611be05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109c1565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c58848484611864565b611c6484848484611e98565b61132d5760405162461bcd60e51b81526004016109c190612b82565b6040516bffffffffffffffffffffffff19606083901b1660208201526000908190603401604051602081830303815290604052805190602001209050611b76858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015549150849050611e82565b6060600e80546108c990612977565b606081600003611d335750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d5d5780611d4781612b69565b9150611d569050600a83612a63565b9150611d37565b60008167ffffffffffffffff811115611d7857611d786126cb565b6040519080825280601f01601f191660200182016040528015611da2576020820181803683370190505b5090505b841561185c57611db7600183612b3a565b9150611dc4600a86612bd4565b611dcf906030612b51565b60f81b818381518110611de457611de4612a96565b60200101906001600160f81b031916908160001a905350611e06600a86612a63565b9450611da6565b60006001600160e01b031982166380ac58cd60e01b1480611e3e57506001600160e01b03198216635b5e139f60e01b145b806108b457506301ffc9a760e01b6001600160e01b03198316146108b4565b610af6838383611f99565b610dd4828260405180602001604052806000815250612051565b600082611e8f8584612084565b14949350505050565b60006001600160a01b0384163b15611f8e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611edc903390899088908890600401612be8565b6020604051808303816000875af1925050508015611f17575060408051601f3d908101601f19168201909252611f1491810190612c25565b60015b611f74573d808015611f45576040519150601f19603f3d011682016040523d82523d6000602084013e611f4a565b606091505b508051600003611f6c5760405162461bcd60e51b81526004016109c190612b82565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061185c565b506001949350505050565b6001600160a01b038316611ff457611fef81600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b612017565b816001600160a01b0316836001600160a01b0316146120175761201783826120f8565b6001600160a01b03821661202e57610af681612195565b826001600160a01b0316826001600160a01b031614610af657610af68282612244565b61205b8383612288565b6120686000848484611e98565b610af65760405162461bcd60e51b81526004016109c190612b82565b600081815b84518110156120f05760008582815181106120a6576120a6612a96565b602002602001015190508083116120cc57600083815260208290526040902092506120dd565b600081815260208490526040902092505b50806120e881612b69565b915050612089565b509392505050565b6000600161210584610ff1565b61210f9190612b3a565b600083815260096020526040902054909150808214612162576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906121a790600190612b3a565b6000838152600b6020526040812054600a80549394509092849081106121cf576121cf612a96565b9060005260206000200154905080600a83815481106121f0576121f0612a96565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061222857612228612c42565b6001900381819060005260206000200160009055905550505050565b600061224f83610ff1565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6001600160a01b0382166122de5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109c1565b6000818152600260205260409020546001600160a01b0316156123435760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109c1565b61234f60008383611e5d565b6001600160a01b0382166000908152600360205260408120805460019290612378908490612b51565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546123e290612977565b90600052602060002090601f016020900481019282612404576000855561244a565b82601f1061241d5782800160ff1982351617855561244a565b8280016001018555821561244a579182015b8281111561244a57823582559160200191906001019061242f565b506124569291506124ce565b5090565b82805461246690612977565b90600052602060002090601f016020900481019282612488576000855561244a565b82601f106124a157805160ff191683800117855561244a565b8280016001018555821561244a579182015b8281111561244a5782518255916020019190600101906124b3565b5b8082111561245657600081556001016124cf565b6001600160e01b031981168114610d8257600080fd5b60006020828403121561250b57600080fd5b81356115d9816124e3565b60005b83811015612531578181015183820152602001612519565b8381111561132d5750506000910152565b6000815180845261255a816020860160208601612516565b601f01601f19169290920160200192915050565b6020815260006115d96020830184612542565b60006020828403121561259357600080fd5b5035919050565b80356001600160a01b03811681146125b157600080fd5b919050565b600080604083850312156125c957600080fd5b6125d28361259a565b946020939093013593505050565b6000602082840312156125f257600080fd5b6115d98261259a565b6000806020838503121561260e57600080fd5b823567ffffffffffffffff8082111561262657600080fd5b818501915085601f83011261263a57600080fd5b81358181111561264957600080fd5b86602082850101111561265b57600080fd5b60209290920196919550909350505050565b60008060006060848603121561268257600080fd5b61268b8461259a565b92506126996020850161259a565b9150604084013590509250925092565b600080604083850312156126bc57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156126fc576126fc6126cb565b604051601f8501601f19908116603f01168101908282118183101715612724576127246126cb565b8160405280935085815286868601111561273d57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561276957600080fd5b813567ffffffffffffffff81111561278057600080fd5b8201601f8101841361279157600080fd5b61185c848235602084016126e1565b803580151581146125b157600080fd5b6000602082840312156127c257600080fd5b6115d9826127a0565b60008083601f8401126127dd57600080fd5b50813567ffffffffffffffff8111156127f557600080fd5b6020830191508360208260051b8501011115610bd857600080fd5b6000806020838503121561282357600080fd5b823567ffffffffffffffff81111561283a57600080fd5b612846858286016127cb565b90969095509350505050565b6000806040838503121561286557600080fd5b61286e8361259a565b915061287c602084016127a0565b90509250929050565b6000806000806080858703121561289b57600080fd5b6128a48561259a565b93506128b26020860161259a565b925060408501359150606085013567ffffffffffffffff8111156128d557600080fd5b8501601f810187136128e657600080fd5b6128f5878235602084016126e1565b91505092959194509250565b60008060006040848603121561291657600080fd5b83359250602084013567ffffffffffffffff81111561293457600080fd5b612940868287016127cb565b9497909650939450505050565b6000806040838503121561296057600080fd5b6129698361259a565b915061287c6020840161259a565b600181811c9082168061298b57607f821691505b6020821081036129ab57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082612a7257612a72612a37565b500490565b6000816000190483118215151615612a9157612a91612a4d565b500290565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600e908201526d14d85b19481a5cc818db1bdcd95960921b604082015260600190565b60008351612b1d818460208801612516565b835190830190612b31818360208801612516565b01949350505050565b600082821015612b4c57612b4c612a4d565b500390565b60008219821115612b6457612b64612a4d565b500190565b600060018201612b7b57612b7b612a4d565b5060010190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612be357612be3612a37565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c1b90830184612542565b9695505050505050565b600060208284031215612c3757600080fd5b81516115d9816124e3565b634e487b7160e01b600052603160045260246000fdfea26469706673582212208429858b725cf6e337db698abc8fe317b2e9120729dd9a67100f5194a6f9013964736f6c634300080d0033000000000000000000000000b00862355b51d36f25d93addf45dee27a5ddef140000000000000000000000006c27ad58e3f7e8cc363fb7bddc6cb18b041e633d000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f696e76697369626c65667269656e64732e696f2f6170692f000000000000000000000000000000000000000000000000000000000000003a68747470733a2f2f696e76697369626c65667269656e64732e696f2f6170692f636f6e7472616374732f496e76697369626c65467269656e6473000000000000
Deployed Bytecode
0x6080604052600436106102935760003560e01c80636fb2dccb1161015a578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c5146107bb578063ee1cc94414610804578063f053dc5c14610824578063f2fde38b14610844578063fc1a1c3614610864578063ff1b65561461087a57600080fd5b8063b88d4fde14610714578063c1a64e5e14610734578063c3b754dc14610747578063c87b56dd14610767578063e86789f614610787578063e8a3d485146107a657600080fd5b80638e1f9cfe116101135780638e1f9cfe14610680578063938e3d7b1461069657806395d89b41146106b6578063a035b1fe146106cb578063a0712d68146106e1578063a22cb465146106f457600080fd5b80636fb2dccb146105e457806370a0823114610604578063715018a6146106245780637319aaa01461063957806388d15d501461064f5780638da5cb5b1461066257600080fd5b8063360bede8116101fe5780634f6ccce7116101b75780634f6ccce714610535578063524513d61461055557806355f804b31461056f5780635b92ac0d1461058f5780636352211e146105af5780636c0360eb146105cf57600080fd5b8063360bede81461048057806338af3eed146104a05780633c6c9946146104c05780633ccfd60b146104e057806342842e0e146104f5578063484b973c1461051557600080fd5b806318160ddd1161025057806318160ddd146103a25780631c31f710146103c157806323b872dd146103e15780632a55205a146104015780632a9e63c6146104405780632f745c591461046057600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b3146103275780630a398b88146103495780631096952314610382575b600080fd5b3480156102a457600080fd5b506102b86102b33660046124f9565b61088f565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26108ba565b6040516102c4919061256e565b3480156102fb57600080fd5b5061030f61030a366004612581565b61094c565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506103476103423660046125b6565b6109e6565b005b34801561035557600080fd5b506102b86103643660046125e0565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561038e57600080fd5b5061034761039d3660046125fb565b610afb565b3480156103ae57600080fd5b50600d545b6040519081526020016102c4565b3480156103cd57600080fd5b506103476103dc3660046125e0565b610b31565b3480156103ed57600080fd5b506103476103fc36600461266d565b610b7d565b34801561040d57600080fd5b5061042161041c3660046126a9565b610bae565b604080516001600160a01b0390931683526020830191909152016102c4565b34801561044c57600080fd5b5061034761045b3660046125e0565b610bdf565b34801561046c57600080fd5b506103b361047b3660046125b6565b610c2b565b34801561048c57600080fd5b5061034761049b366004612581565b610cc1565b3480156104ac57600080fd5b5060175461030f906001600160a01b031681565b3480156104cc57600080fd5b506103476104db366004612581565b610cf0565b3480156104ec57600080fd5b50610347610d1f565b34801561050157600080fd5b5061034761051036600461266d565b610d85565b34801561052157600080fd5b506103476105303660046125b6565b610da0565b34801561054157600080fd5b506103b3610550366004612581565b610dd8565b34801561056157600080fd5b506010546102b89060ff1681565b34801561057b57600080fd5b5061034761058a366004612757565b610e6b565b34801561059b57600080fd5b506010546102b89062010000900460ff1681565b3480156105bb57600080fd5b5061030f6105ca366004612581565b610ea8565b3480156105db57600080fd5b506102e2610f1f565b3480156105f057600080fd5b506103476105ff3660046127b0565b610fad565b34801561061057600080fd5b506103b361061f3660046125e0565b610ff1565b34801561063057600080fd5b50610347611078565b34801561064557600080fd5b506103b360165481565b61034761065d366004612810565b6110ae565b34801561066e57600080fd5b506006546001600160a01b031661030f565b34801561068c57600080fd5b506103b360155481565b3480156106a257600080fd5b506103476106b1366004612757565b6111e9565b3480156106c257600080fd5b506102e2611226565b3480156106d757600080fd5b506103b360145481565b6103476106ef366004612581565b611235565b34801561070057600080fd5b5061034761070f366004612852565b6112f0565b34801561072057600080fd5b5061034761072f366004612885565b6112fb565b610347610742366004612901565b611333565b34801561075357600080fd5b506103476107623660046127b0565b6114c8565b34801561077357600080fd5b506102e2610782366004612581565b611505565b34801561079357600080fd5b506010546102b890610100900460ff1681565b3480156107b257600080fd5b506102e26115e0565b3480156107c757600080fd5b506102b86107d636600461294d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561081057600080fd5b5061034761081f3660046127b0565b6115ef565b34801561083057600080fd5b5060185461030f906001600160a01b031681565b34801561085057600080fd5b5061034761085f3660046125e0565b611635565b34801561087057600080fd5b506103b360135481565b34801561088657600080fd5b506102e26116cd565b60006001600160e01b0319821663152a902d60e11b14806108b457506108b4826116da565b92915050565b6060600080546108c990612977565b80601f01602080910402602001604051908101604052809291908181526020018280546108f590612977565b80156109425780601f1061091757610100808354040283529160200191610942565b820191906000526020600020905b81548152906001019060200180831161092557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109f182610ea8565b9050806001600160a01b0316836001600160a01b031603610a5e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109c1565b336001600160a01b0382161480610a7a5750610a7a81336107d6565b610aec5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109c1565b610af683836116ff565b505050565b6006546001600160a01b03163314610b255760405162461bcd60e51b81526004016109c1906129b1565b610af6600c83836123d6565b6006546001600160a01b03163314610b5b5760405162461bcd60e51b81526004016109c1906129b1565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b610b87338261176d565b610ba35760405162461bcd60e51b81526004016109c1906129e6565b610af6838383611864565b600080610bbc606484612a63565b610bc7906003612a77565b6018546001600160a01b0316925090505b9250929050565b6006546001600160a01b03163314610c095760405162461bcd60e51b81526004016109c1906129b1565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610c3683610ff1565b8210610c985760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109c1565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b6006546001600160a01b03163314610ceb5760405162461bcd60e51b81526004016109c1906129b1565b601555565b6006546001600160a01b03163314610d1a5760405162461bcd60e51b81526004016109c1906129b1565b601655565b6006546001600160a01b03163314610d495760405162461bcd60e51b81526004016109c1906129b1565b6017546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610d82573d6000803e3d6000fd5b50565b610af6838383604051806020016040528060008152506112fb565b6006546001600160a01b03163314610dca5760405162461bcd60e51b81526004016109c1906129b1565b610dd48282611a0b565b5050565b6000610de3600a5490565b8210610e465760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109c1565b600a8281548110610e5957610e59612a96565b90600052602060002001549050919050565b6006546001600160a01b03163314610e955760405162461bcd60e51b81526004016109c1906129b1565b8051610dd490600e90602084019061245a565b6000818152600260205260408120546001600160a01b0316806108b45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109c1565b600e8054610f2c90612977565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5890612977565b8015610fa55780601f10610f7a57610100808354040283529160200191610fa5565b820191906000526020600020905b815481529060010190602001808311610f8857829003601f168201915b505050505081565b6006546001600160a01b03163314610fd75760405162461bcd60e51b81526004016109c1906129b1565b601080549115156101000261ff0019909216919091179055565b60006001600160a01b03821661105c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109c1565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146110a25760405162461bcd60e51b81526004016109c1906129b1565b6110ac6000611aa7565b565b6002600754036110d05760405162461bcd60e51b81526004016109c190612aac565b60026007556010543390610100900460ff166110fe5760405162461bcd60e51b81526004016109c190612ae3565b611109838383611af9565b6111455760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016109c1565b6001600160a01b03811660009081526011602052604090205460ff16156111ae5760405162461bcd60e51b815260206004820152601d60248201527f416c7265616479206d696e74656420796f75722046726565204d696e7400000060448201526064016109c1565b6001600160a01b0381166000908152601160205260409020805460ff191660019081179091556111df908290611a0b565b5050600160075550565b6006546001600160a01b031633146112135760405162461bcd60e51b81526004016109c1906129b1565b8051610dd490600f90602084019061245a565b6060600180546108c990612977565b6002600754036112575760405162461bcd60e51b81526004016109c190612aac565b6002600755601054339062010000900460ff166112865760405162461bcd60e51b81526004016109c190612ae3565b816014546112949190612a77565b34146112dd5760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e58589b1948185b5bdd5b9d60421b60448201526064016109c1565b6112e78183611a0b565b50506001600755565b610dd4338383611b7f565b611305338361176d565b6113215760405162461bcd60e51b81526004016109c1906129e6565b61132d84848484611c4d565b50505050565b6002600754036113555760405162461bcd60e51b81526004016109c190612aac565b6002600755601054339060ff1661137e5760405162461bcd60e51b81526004016109c190612ae3565b611389838383611c80565b6113c55760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016109c1565b836013546113d39190612a77565b341461141c5760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e58589b1948185b5bdd5b9d60421b60448201526064016109c1565b6001600160a01b03811660009081526012602052604090205460ff16156114905760405162461bcd60e51b815260206004820152602260248201527f416c7265616479206d696e74656420796f75722057686974656c6973742053706044820152611bdd60f21b60648201526084016109c1565b6001600160a01b0381166000908152601260205260409020805460ff191660011790556114bd8185611a0b565b505060016007555050565b6006546001600160a01b031633146114f25760405162461bcd60e51b81526004016109c1906129b1565b6010805460ff1916911515919091179055565b6000818152600260205260409020546060906001600160a01b03166115845760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109c1565b600061158e611cfd565b905060008151116115ae57604051806020016040528060008152506115d9565b806115b884611d0c565b6040516020016115c9929190612b0b565b6040516020818303038152906040525b9392505050565b6060600f80546108c990612977565b6006546001600160a01b031633146116195760405162461bcd60e51b81526004016109c1906129b1565b60108054911515620100000262ff000019909216919091179055565b6006546001600160a01b0316331461165f5760405162461bcd60e51b81526004016109c1906129b1565b6001600160a01b0381166116c45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c1565b610d8281611aa7565b600c8054610f2c90612977565b60006001600160e01b0319821663780e9d6360e01b14806108b457506108b482611e0d565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061173482610ea8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117e65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109c1565b60006117f183610ea8565b9050806001600160a01b0316846001600160a01b0316148061182c5750836001600160a01b03166118218461094c565b6001600160a01b0316145b8061185c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661187782610ea8565b6001600160a01b0316146118db5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109c1565b6001600160a01b03821661193d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109c1565b611948838383611e5d565b6119536000826116ff565b6001600160a01b038316600090815260036020526040812080546001929061197c908490612b3a565b90915550506001600160a01b03821660009081526003602052604081208054600192906119aa908490612b51565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6108ae81600d54611a1c9190612b51565b1115611a6a5760405162461bcd60e51b815260206004820152601a60248201527f57696c6c20657863656564206d6178696d756d20737570706c7900000000000060448201526064016109c1565b60015b818111610af657600d8054906000611a8483612b69565b9190505550611a9583600d54611e68565b80611a9f81612b69565b915050611a6d565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040516bffffffffffffffffffffffff19606083901b1660208201526000908190603401604051602081830303815290604052805190602001209050611b76858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506016549150849050611e82565b95945050505050565b816001600160a01b0316836001600160a01b031603611be05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109c1565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c58848484611864565b611c6484848484611e98565b61132d5760405162461bcd60e51b81526004016109c190612b82565b6040516bffffffffffffffffffffffff19606083901b1660208201526000908190603401604051602081830303815290604052805190602001209050611b76858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015549150849050611e82565b6060600e80546108c990612977565b606081600003611d335750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d5d5780611d4781612b69565b9150611d569050600a83612a63565b9150611d37565b60008167ffffffffffffffff811115611d7857611d786126cb565b6040519080825280601f01601f191660200182016040528015611da2576020820181803683370190505b5090505b841561185c57611db7600183612b3a565b9150611dc4600a86612bd4565b611dcf906030612b51565b60f81b818381518110611de457611de4612a96565b60200101906001600160f81b031916908160001a905350611e06600a86612a63565b9450611da6565b60006001600160e01b031982166380ac58cd60e01b1480611e3e57506001600160e01b03198216635b5e139f60e01b145b806108b457506301ffc9a760e01b6001600160e01b03198316146108b4565b610af6838383611f99565b610dd4828260405180602001604052806000815250612051565b600082611e8f8584612084565b14949350505050565b60006001600160a01b0384163b15611f8e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611edc903390899088908890600401612be8565b6020604051808303816000875af1925050508015611f17575060408051601f3d908101601f19168201909252611f1491810190612c25565b60015b611f74573d808015611f45576040519150601f19603f3d011682016040523d82523d6000602084013e611f4a565b606091505b508051600003611f6c5760405162461bcd60e51b81526004016109c190612b82565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061185c565b506001949350505050565b6001600160a01b038316611ff457611fef81600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b612017565b816001600160a01b0316836001600160a01b0316146120175761201783826120f8565b6001600160a01b03821661202e57610af681612195565b826001600160a01b0316826001600160a01b031614610af657610af68282612244565b61205b8383612288565b6120686000848484611e98565b610af65760405162461bcd60e51b81526004016109c190612b82565b600081815b84518110156120f05760008582815181106120a6576120a6612a96565b602002602001015190508083116120cc57600083815260208290526040902092506120dd565b600081815260208490526040902092505b50806120e881612b69565b915050612089565b509392505050565b6000600161210584610ff1565b61210f9190612b3a565b600083815260096020526040902054909150808214612162576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906121a790600190612b3a565b6000838152600b6020526040812054600a80549394509092849081106121cf576121cf612a96565b9060005260206000200154905080600a83815481106121f0576121f0612a96565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061222857612228612c42565b6001900381819060005260206000200160009055905550505050565b600061224f83610ff1565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6001600160a01b0382166122de5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109c1565b6000818152600260205260409020546001600160a01b0316156123435760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109c1565b61234f60008383611e5d565b6001600160a01b0382166000908152600360205260408120805460019290612378908490612b51565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546123e290612977565b90600052602060002090601f016020900481019282612404576000855561244a565b82601f1061241d5782800160ff1982351617855561244a565b8280016001018555821561244a579182015b8281111561244a57823582559160200191906001019061242f565b506124569291506124ce565b5090565b82805461246690612977565b90600052602060002090601f016020900481019282612488576000855561244a565b82601f106124a157805160ff191683800117855561244a565b8280016001018555821561244a579182015b8281111561244a5782518255916020019190600101906124b3565b5b8082111561245657600081556001016124cf565b6001600160e01b031981168114610d8257600080fd5b60006020828403121561250b57600080fd5b81356115d9816124e3565b60005b83811015612531578181015183820152602001612519565b8381111561132d5750506000910152565b6000815180845261255a816020860160208601612516565b601f01601f19169290920160200192915050565b6020815260006115d96020830184612542565b60006020828403121561259357600080fd5b5035919050565b80356001600160a01b03811681146125b157600080fd5b919050565b600080604083850312156125c957600080fd5b6125d28361259a565b946020939093013593505050565b6000602082840312156125f257600080fd5b6115d98261259a565b6000806020838503121561260e57600080fd5b823567ffffffffffffffff8082111561262657600080fd5b818501915085601f83011261263a57600080fd5b81358181111561264957600080fd5b86602082850101111561265b57600080fd5b60209290920196919550909350505050565b60008060006060848603121561268257600080fd5b61268b8461259a565b92506126996020850161259a565b9150604084013590509250925092565b600080604083850312156126bc57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156126fc576126fc6126cb565b604051601f8501601f19908116603f01168101908282118183101715612724576127246126cb565b8160405280935085815286868601111561273d57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561276957600080fd5b813567ffffffffffffffff81111561278057600080fd5b8201601f8101841361279157600080fd5b61185c848235602084016126e1565b803580151581146125b157600080fd5b6000602082840312156127c257600080fd5b6115d9826127a0565b60008083601f8401126127dd57600080fd5b50813567ffffffffffffffff8111156127f557600080fd5b6020830191508360208260051b8501011115610bd857600080fd5b6000806020838503121561282357600080fd5b823567ffffffffffffffff81111561283a57600080fd5b612846858286016127cb565b90969095509350505050565b6000806040838503121561286557600080fd5b61286e8361259a565b915061287c602084016127a0565b90509250929050565b6000806000806080858703121561289b57600080fd5b6128a48561259a565b93506128b26020860161259a565b925060408501359150606085013567ffffffffffffffff8111156128d557600080fd5b8501601f810187136128e657600080fd5b6128f5878235602084016126e1565b91505092959194509250565b60008060006040848603121561291657600080fd5b83359250602084013567ffffffffffffffff81111561293457600080fd5b612940868287016127cb565b9497909650939450505050565b6000806040838503121561296057600080fd5b6129698361259a565b915061287c6020840161259a565b600181811c9082168061298b57607f821691505b6020821081036129ab57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082612a7257612a72612a37565b500490565b6000816000190483118215151615612a9157612a91612a4d565b500290565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600e908201526d14d85b19481a5cc818db1bdcd95960921b604082015260600190565b60008351612b1d818460208801612516565b835190830190612b31818360208801612516565b01949350505050565b600082821015612b4c57612b4c612a4d565b500390565b60008219821115612b6457612b64612a4d565b500190565b600060018201612b7b57612b7b612a4d565b5060010190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612be357612be3612a37565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c1b90830184612542565b9695505050505050565b600060208284031215612c3757600080fd5b81516115d9816124e3565b634e487b7160e01b600052603160045260246000fdfea26469706673582212208429858b725cf6e337db698abc8fe317b2e9120729dd9a67100f5194a6f9013964736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b00862355b51d36f25d93addf45dee27a5ddef140000000000000000000000006c27ad58e3f7e8cc363fb7bddc6cb18b041e633d000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f696e76697369626c65667269656e64732e696f2f6170692f000000000000000000000000000000000000000000000000000000000000003a68747470733a2f2f696e76697369626c65667269656e64732e696f2f6170692f636f6e7472616374732f496e76697369626c65467269656e6473000000000000
-----Decoded View---------------
Arg [0] : _beneficiary (address): 0xB00862355b51d36F25D93AdDf45DEE27A5DDef14
Arg [1] : _royalties (address): 0x6c27ad58E3f7e8Cc363fB7BDDC6cb18b041e633D
Arg [2] : _initialBaseURI (string): https://invisiblefriends.io/api/
Arg [3] : _initialContractURI (string): https://invisiblefriends.io/api/contracts/InvisibleFriends
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000b00862355b51d36f25d93addf45dee27a5ddef14
Arg [1] : 0000000000000000000000006c27ad58e3f7e8cc363fb7bddc6cb18b041e633d
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [5] : 68747470733a2f2f696e76697369626c65667269656e64732e696f2f6170692f
Arg [6] : 000000000000000000000000000000000000000000000000000000000000003a
Arg [7] : 68747470733a2f2f696e76697369626c65667269656e64732e696f2f6170692f
Arg [8] : 636f6e7472616374732f496e76697369626c65467269656e6473000000000000
Deployed Bytecode Sourcemap
58396:5633:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63306:219;;;;;;;;;;-1:-1:-1;63306:219:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;63306:219:0;;;;;;;;22804:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24363:221::-;;;;;;;;;;-1:-1:-1;24363:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;24363:221:0;1528:203:1;23886:411:0;;;;;;;;;;-1:-1:-1;23886:411:0;;;;;:::i;:::-;;:::i;:::-;;60371:104;;;;;;;;;;-1:-1:-1;60371:104:0;;;;;:::i;:::-;-1:-1:-1;;;;;60449:20:0;60429:4;60449:20;;;:14;:20;;;;;;;;;60371:104;59499:101;;;;;;;;;;-1:-1:-1;59499:101:0;;;;;:::i;:::-;;:::i;60481:110::-;;;;;;;;;;-1:-1:-1;60575:10:0;;60481:110;;;3107:25:1;;;3095:2;3080:18;60481:110:0;2961:177:1;59606:102:0;;;;;;;;;;-1:-1:-1;59606:102:0;;;;;:::i;:::-;;:::i;25113:339::-;;;;;;;;;;-1:-1:-1;25113:339:0;;;;;:::i;:::-;;:::i;63548:244::-;;;;;;;;;;-1:-1:-1;63548:244:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3921:32:1;;;3903:51;;3985:2;3970:18;;3963:34;;;;3876:18;63548:244:0;3729:274:1;59714:94:0;;;;;;;;;;-1:-1:-1;59714:94:0;;;;;:::i;:::-;;:::i;37432:256::-;;;;;;;;;;-1:-1:-1;37432:256:0;;;;;:::i;:::-;;:::i;60129:116::-;;;;;;;;;;-1:-1:-1;60129:116:0;;;;;:::i;:::-;;:::i;59085:26::-;;;;;;;;;;-1:-1:-1;59085:26:0;;;;-1:-1:-1;;;;;59085:26:0;;;60251:114;;;;;;;;;;-1:-1:-1;60251:114:0;;;;;:::i;:::-;;:::i;62338:102::-;;;;;;;;;;;;;:::i;25523:185::-;;;;;;;;;;-1:-1:-1;25523:185:0;;;;;:::i;:::-;;:::i;62230:102::-;;;;;;;;;;-1:-1:-1;62230:102:0;;;;;:::i;:::-;;:::i;37954:233::-;;;;;;;;;;-1:-1:-1;37954:233:0;;;;;:::i;:::-;;:::i;58688:37::-;;;;;;;;;;-1:-1:-1;58688:37:0;;;;;;;;60614:82;;;;;;;;;;-1:-1:-1;60614:82:0;;;;;:::i;:::-;;:::i;58771:32::-;;;;;;;;;;-1:-1:-1;58771:32:0;;;;;;;;;;;22498:239;;;;;;;;;;-1:-1:-1;22498:239:0;;;;;:::i;:::-;;:::i;58628:21::-;;;;;;;;;;;;;:::i;59923:101::-;;;;;;;;;;-1:-1:-1;59923:101:0;;;;;:::i;:::-;;:::i;22228:208::-;;;;;;;;;;-1:-1:-1;22228:208:0;;;;;:::i;:::-;;:::i;45015:103::-;;;;;;;;;;;;;:::i;59045:33::-;;;;;;;;;;;;;;;;61547:392;;;;;;:::i;:::-;;:::i;44364:87::-;;;;;;;;;;-1:-1:-1;44437:6:0;;-1:-1:-1;;;;;44437:6:0;44364:87;;59006:34;;;;;;;;;;;;;;;;60899:91;;;;;;;;;;-1:-1:-1;60899:91:0;;;;;:::i;:::-;;:::i;22973:104::-;;;;;;;;;;;;;:::i;58969:30::-;;;;;;;;;;;;;;;;61945:279;;;;;;:::i;:::-;;:::i;24656:155::-;;;;;;;;;;-1:-1:-1;24656:155:0;;;;;:::i;:::-;;:::i;25779:328::-;;;;;;;;;;-1:-1:-1;25779:328:0;;;;;:::i;:::-;;:::i;61012:527::-;;;;;;:::i;:::-;;:::i;59814:103::-;;;;;;;;;;-1:-1:-1;59814:103:0;;;;;:::i;:::-;;:::i;23148:334::-;;;;;;;;;;-1:-1:-1;23148:334:0;;;;;:::i;:::-;;:::i;58730:36::-;;;;;;;;;;-1:-1:-1;58730:36:0;;;;;;;;;;;60802:91;;;;;;;;;;;;;:::i;24882:164::-;;;;;;;;;;-1:-1:-1;24882:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25003:25:0;;;24979:4;25003:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24882:164;60030:93;;;;;;;;;;-1:-1:-1;60030:93:0;;;;;:::i;:::-;;:::i;59116:24::-;;;;;;;;;;-1:-1:-1;59116:24:0;;;;-1:-1:-1;;;;;59116:24:0;;;45273:201;;;;;;;;;;-1:-1:-1;45273:201:0;;;;;:::i;:::-;;:::i;58925:39::-;;;;;;;;;;;;;;;;58520:29;;;;;;;;;;;;;:::i;63306:219::-;63418:4;-1:-1:-1;;;;;;63438:41:0;;-1:-1:-1;;;63438:41:0;;:81;;;63483:36;63507:11;63483:23;:36::i;:::-;63431:88;63306:219;-1:-1:-1;;63306:219:0:o;22804:100::-;22858:13;22891:5;22884:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22804:100;:::o;24363:221::-;24439:7;27706:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27706:16:0;24459:73;;;;-1:-1:-1;;;24459:73:0;;9057:2:1;24459:73:0;;;9039:21:1;9096:2;9076:18;;;9069:30;9135:34;9115:18;;;9108:62;-1:-1:-1;;;9186:18:1;;;9179:42;9238:19;;24459:73:0;;;;;;;;;-1:-1:-1;24552:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24552:24:0;;24363:221::o;23886:411::-;23967:13;23983:23;23998:7;23983:14;:23::i;:::-;23967:39;;24031:5;-1:-1:-1;;;;;24025:11:0;:2;-1:-1:-1;;;;;24025:11:0;;24017:57;;;;-1:-1:-1;;;24017:57:0;;9470:2:1;24017:57:0;;;9452:21:1;9509:2;9489:18;;;9482:30;9548:34;9528:18;;;9521:62;-1:-1:-1;;;9599:18:1;;;9592:31;9640:19;;24017:57:0;9268:397:1;24017:57:0;17073:10;-1:-1:-1;;;;;24109:21:0;;;;:62;;-1:-1:-1;24134:37:0;24151:5;17073:10;24882:164;:::i;24134:37::-;24087:168;;;;-1:-1:-1;;;24087:168:0;;9872:2:1;24087:168:0;;;9854:21:1;9911:2;9891:18;;;9884:30;9950:34;9930:18;;;9923:62;10021:26;10001:18;;;9994:54;10065:19;;24087:168:0;9670:420:1;24087:168:0;24268:21;24277:2;24281:7;24268:8;:21::i;:::-;23956:341;23886:411;;:::o;59499:101::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;59572:22:::1;:15;59590:4:::0;;59572:22:::1;:::i;59606:102::-:0;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;59676:11:::1;:26:::0;;-1:-1:-1;;;;;;59676:26:0::1;-1:-1:-1::0;;;;;59676:26:0;;;::::1;::::0;;;::::1;::::0;;59606:102::o;25113:339::-;25308:41;17073:10;25341:7;25308:18;:41::i;:::-;25300:103;;;;-1:-1:-1;;;25300:103:0;;;;;;;:::i;:::-;25416:28;25426:4;25432:2;25436:7;25416:9;:28::i;63548:244::-;63630:7;;63725:16;63738:3;63725:10;:16;:::i;:::-;63724:22;;63745:1;63724:22;:::i;:::-;63761:9;;-1:-1:-1;;;;;63761:9:0;;-1:-1:-1;63708:38:0;-1:-1:-1;63548:244:0;;;;;;:::o;59714:94::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;59780:9:::1;:22:::0;;-1:-1:-1;;;;;;59780:22:0::1;-1:-1:-1::0;;;;;59780:22:0;;;::::1;::::0;;;::::1;::::0;;59714:94::o;37432:256::-;37529:7;37565:23;37582:5;37565:16;:23::i;:::-;37557:5;:31;37549:87;;;;-1:-1:-1;;;37549:87:0;;11638:2:1;37549:87:0;;;11620:21:1;11677:2;11657:18;;;11650:30;11716:34;11696:18;;;11689:62;-1:-1:-1;;;11767:18:1;;;11760:41;11818:19;;37549:87:0;11436:407:1;37549:87:0;-1:-1:-1;;;;;;37654:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37432:256::o;60129:116::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;60206:19:::1;:33:::0;60129:116::o;60251:114::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;60327:18:::1;:32:::0;60251:114::o;62338:102::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;62390:11:::1;::::0;62382:52:::1;::::0;-1:-1:-1;;;;;62390:11:0;;::::1;::::0;62412:21:::1;62382:52:::0;::::1;;;::::0;62390:11:::1;62382:52:::0;62390:11;62382:52;62412:21;62390:11;62382:52;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;62338:102::o:0;25523:185::-;25661:39;25678:4;25684:2;25688:7;25661:39;;;;;;;;;;;;:16;:39::i;62230:102::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;62301:25:::1;62315:2;62319:6;62301:13;:25::i;:::-;62230:102:::0;;:::o;37954:233::-;38029:7;38065:30;37852:10;:17;;37764:113;38065:30;38057:5;:38;38049:95;;;;-1:-1:-1;;;38049:95:0;;12050:2:1;38049:95:0;;;12032:21:1;12089:2;12069:18;;;12062:30;12128:34;12108:18;;;12101:62;-1:-1:-1;;;12179:18:1;;;12172:42;12231:19;;38049:95:0;11848:408:1;38049:95:0;38162:10;38173:5;38162:17;;;;;;;;:::i;:::-;;;;;;;;;38155:24;;37954:233;;;:::o;60614:82::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;60677:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;22498:239::-:0;22570:7;22606:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22606:16:0;;22633:73;;;;-1:-1:-1;;;22633:73:0;;12595:2:1;22633:73:0;;;12577:21:1;12634:2;12614:18;;;12607:30;12673:34;12653:18;;;12646:62;-1:-1:-1;;;12724:18:1;;;12717:39;12773:19;;22633:73:0;12393:405:1;58628:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59923:101::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;59990:16:::1;:28:::0;;;::::1;;;;-1:-1:-1::0;;59990:28:0;;::::1;::::0;;;::::1;::::0;;59923:101::o;22228:208::-;22300:7;-1:-1:-1;;;;;22328:19:0;;22320:74;;;;-1:-1:-1;;;22320:74:0;;13005:2:1;22320:74:0;;;12987:21:1;13044:2;13024:18;;;13017:30;13083:34;13063:18;;;13056:62;-1:-1:-1;;;13134:18:1;;;13127:40;13184:19;;22320:74:0;12803:406:1;22320:74:0;-1:-1:-1;;;;;;22412:16:0;;;;;:9;:16;;;;;;;22228:208::o;45015:103::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;45080:30:::1;45107:1;45080:18;:30::i;:::-;45015:103::o:0;61547:392::-;50097:1;50695:7;;:19;50687:63;;;;-1:-1:-1;;;50687:63:0;;;;;;;:::i;:::-;50097:1;50828:7;:18;61690:16:::1;::::0;17073:10;;61690:16:::1;::::0;::::1;;;61682:43;;;;-1:-1:-1::0;;;61682:43:0::1;;;;;;;:::i;:::-;61740:36;61756:11;;61769:6;61740:15;:36::i;:::-;61732:62;;;::::0;-1:-1:-1;;;61732:62:0;;14119:2:1;61732:62:0::1;::::0;::::1;14101:21:1::0;14158:2;14138:18;;;14131:30;-1:-1:-1;;;14177:18:1;;;14170:43;14230:18;;61732:62:0::1;13917:337:1::0;61732:62:0::1;-1:-1:-1::0;;;;;61810:22:0;::::1;;::::0;;;:14:::1;:22;::::0;;;;;::::1;;61809:23;61801:65;;;::::0;-1:-1:-1;;;61801:65:0;;14461:2:1;61801:65:0::1;::::0;::::1;14443:21:1::0;14500:2;14480:18;;;14473:30;14539:31;14519:18;;;14512:59;14588:18;;61801:65:0::1;14259:353:1::0;61801:65:0::1;-1:-1:-1::0;;;;;61873:22:0;::::1;;::::0;;;:14:::1;:22;::::0;;;;:29;;-1:-1:-1;;61873:29:0::1;61898:4;61873:29:::0;;::::1;::::0;;;61909:24:::1;::::0;61888:6;;61909:13:::1;:24::i;:::-;-1:-1:-1::0;;50053:1:0;51007:7;:22;-1:-1:-1;61547:392:0:o;60899:91::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;60966:18;;::::1;::::0;:12:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;22973:104::-:0;23029:13;23062:7;23055:14;;;;;:::i;61945:279::-;50097:1;50695:7;;:19;50687:63;;;;-1:-1:-1;;;50687:63:0;;;;;;;:::i;:::-;50097:1;50828:7;:18;62072:12:::1;::::0;17073:10;;62072:12;;::::1;;;62064:39;;;;-1:-1:-1::0;;;62064:39:0::1;;;;;;;:::i;:::-;62141:6;62133:5;;:14;;;;:::i;:::-;62120:9;:27;62112:64;;;::::0;-1:-1:-1;;;62112:64:0;;14819:2:1;62112:64:0::1;::::0;::::1;14801:21:1::0;14858:2;14838:18;;;14831:30;-1:-1:-1;;;14877:18:1;;;14870:54;14941:18;;62112:64:0::1;14617:348:1::0;62112:64:0::1;62187:29;62201:6;62209;62187:13;:29::i;:::-;-1:-1:-1::0;;50053:1:0;51007:7;:22;61945:279::o;24656:155::-;24751:52;17073:10;24784:8;24794;24751:18;:52::i;25779:328::-;25954:41;17073:10;25987:7;25954:18;:41::i;:::-;25946:103;;;;-1:-1:-1;;;25946:103:0;;;;;;;:::i;:::-;26060:39;26074:4;26080:2;26084:7;26093:5;26060:13;:39::i;:::-;25779:328;;;;:::o;61012:527::-;50097:1;50695:7;;:19;50687:63;;;;-1:-1:-1;;;50687:63:0;;;;;;;:::i;:::-;50097:1;50828:7;:18;61178:17:::1;::::0;17073:10;;61178:17:::1;;61170:44;;;;-1:-1:-1::0;;;61170:44:0::1;;;;;;;:::i;:::-;61229:37;61246:11;;61259:6;61229:16;:37::i;:::-;61221:63;;;::::0;-1:-1:-1;;;61221:63:0;;14119:2:1;61221:63:0::1;::::0;::::1;14101:21:1::0;14158:2;14138:18;;;14131:30;-1:-1:-1;;;14177:18:1;;;14170:43;14230:18;;61221:63:0::1;13917:337:1::0;61221:63:0::1;61329:6;61312:14;;:23;;;;:::i;:::-;61299:9;:36;61291:73;;;::::0;-1:-1:-1;;;61291:73:0;;14819:2:1;61291:73:0::1;::::0;::::1;14801:21:1::0;14858:2;14838:18;;;14831:30;-1:-1:-1;;;14877:18:1;;;14870:54;14941:18;;61291:73:0::1;14617:348:1::0;61291:73:0::1;-1:-1:-1::0;;;;;61380:31:0;::::1;;::::0;;;:23:::1;:31;::::0;;;;;::::1;;61379:32;61371:79;;;::::0;-1:-1:-1;;;61371:79:0;;15172:2:1;61371:79:0::1;::::0;::::1;15154:21:1::0;15211:2;15191:18;;;15184:30;15250:34;15230:18;;;15223:62;-1:-1:-1;;;15301:18:1;;;15294:32;15343:19;;61371:79:0::1;14970:398:1::0;61371:79:0::1;-1:-1:-1::0;;;;;61459:31:0;::::1;;::::0;;;:23:::1;:31;::::0;;;;:38;;-1:-1:-1;;61459:38:0::1;61493:4;61459:38;::::0;;61504:29:::1;61483:6:::0;61526;61504:13:::1;:29::i;:::-;-1:-1:-1::0;;50053:1:0;51007:7;:22;-1:-1:-1;;61012:527:0:o;59814:103::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;59882:17:::1;:29:::0;;-1:-1:-1;;59882:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59814:103::o;23148:334::-;27682:4;27706:16;;;:7;:16;;;;;;23221:13;;-1:-1:-1;;;;;27706:16:0;23247:76;;;;-1:-1:-1;;;23247:76:0;;15575:2:1;23247:76:0;;;15557:21:1;15614:2;15594:18;;;15587:30;15653:34;15633:18;;;15626:62;-1:-1:-1;;;15704:18:1;;;15697:45;15759:19;;23247:76:0;15373:411:1;23247:76:0;23336:21;23360:10;:8;:10::i;:::-;23336:34;;23412:1;23394:7;23388:21;:25;:86;;;;;;;;;;;;;;;;;23440:7;23449:18;:7;:16;:18::i;:::-;23423:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23388:86;23381:93;23148:334;-1:-1:-1;;;23148:334:0:o;60802:91::-;60846:13;60875:12;60868:19;;;;;:::i;60030:93::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;60093:12:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;60093:24:0;;::::1;::::0;;;::::1;::::0;;60030:93::o;45273:201::-;44437:6;;-1:-1:-1;;;;;44437:6:0;17073:10;44584:23;44576:68;;;;-1:-1:-1;;;44576:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45362:22:0;::::1;45354:73;;;::::0;-1:-1:-1;;;45354:73:0;;16466:2:1;45354:73:0::1;::::0;::::1;16448:21:1::0;16505:2;16485:18;;;16478:30;16544:34;16524:18;;;16517:62;-1:-1:-1;;;16595:18:1;;;16588:36;16641:19;;45354:73:0::1;16264:402:1::0;45354:73:0::1;45438:28;45457:8;45438:18;:28::i;58520:29::-:0;;;;;;;:::i;37124:224::-;37226:4;-1:-1:-1;;;;;;37250:50:0;;-1:-1:-1;;;37250:50:0;;:90;;;37304:36;37328:11;37304:23;:36::i;31763:174::-;31838:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31838:29:0;-1:-1:-1;;;;;31838:29:0;;;;;;;;:24;;31892:23;31838:24;31892:14;:23::i;:::-;-1:-1:-1;;;;;31883:46:0;;;;;;;;;;;31763:174;;:::o;27911:348::-;28004:4;27706:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27706:16:0;28021:73;;;;-1:-1:-1;;;28021:73:0;;16873:2:1;28021:73:0;;;16855:21:1;16912:2;16892:18;;;16885:30;16951:34;16931:18;;;16924:62;-1:-1:-1;;;17002:18:1;;;16995:42;17054:19;;28021:73:0;16671:408:1;28021:73:0;28105:13;28121:23;28136:7;28121:14;:23::i;:::-;28105:39;;28174:5;-1:-1:-1;;;;;28163:16:0;:7;-1:-1:-1;;;;;28163:16:0;;:51;;;;28207:7;-1:-1:-1;;;;;28183:31:0;:20;28195:7;28183:11;:20::i;:::-;-1:-1:-1;;;;;28183:31:0;;28163:51;:87;;;-1:-1:-1;;;;;;25003:25:0;;;24979:4;25003:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28218:32;28155:96;27911:348;-1:-1:-1;;;;27911:348:0:o;31020:625::-;31179:4;-1:-1:-1;;;;;31152:31:0;:23;31167:7;31152:14;:23::i;:::-;-1:-1:-1;;;;;31152:31:0;;31144:81;;;;-1:-1:-1;;;31144:81:0;;17286:2:1;31144:81:0;;;17268:21:1;17325:2;17305:18;;;17298:30;17364:34;17344:18;;;17337:62;-1:-1:-1;;;17415:18:1;;;17408:35;17460:19;;31144:81:0;17084:401:1;31144:81:0;-1:-1:-1;;;;;31244:16:0;;31236:65;;;;-1:-1:-1;;;31236:65:0;;17692:2:1;31236:65:0;;;17674:21:1;17731:2;17711:18;;;17704:30;17770:34;17750:18;;;17743:62;-1:-1:-1;;;17821:18:1;;;17814:34;17865:19;;31236:65:0;17490:400:1;31236:65:0;31314:39;31335:4;31341:2;31345:7;31314:20;:39::i;:::-;31418:29;31435:1;31439:7;31418:8;:29::i;:::-;-1:-1:-1;;;;;31460:15:0;;;;;;:9;:15;;;;;:20;;31479:1;;31460:15;:20;;31479:1;;31460:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31491:13:0;;;;;;:9;:13;;;;;:18;;31508:1;;31491:13;:18;;31508:1;;31491:18;:::i;:::-;;;;-1:-1:-1;;31520:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31520:21:0;-1:-1:-1;;;;;31520:21:0;;;;;;;;;31559:27;;31520:16;;31559:27;;;;;;;23956:341;23886:411;;:::o;62462:253::-;58586:4;62549:6;62536:10;;:19;;;;:::i;:::-;:33;;62528:72;;;;-1:-1:-1;;;62528:72:0;;18360:2:1;62528:72:0;;;18342:21:1;18399:2;18379:18;;;18372:30;18438:28;18418:18;;;18411:56;18484:18;;62528:72:0;18158:350:1;62528:72:0;62626:1;62609:101;62634:6;62629:1;:11;62609:101;;62656:10;:12;;;:10;:12;;;:::i;:::-;;;;;;62677:25;62687:2;62691:10;;62677:9;:25::i;:::-;62642:3;;;;:::i;:::-;;;;62609:101;;45634:191;45727:6;;;-1:-1:-1;;;;;45744:17:0;;;-1:-1:-1;;;;;;45744:17:0;;;;;;;45777:40;;45727:6;;;45744:17;45727:6;;45777:40;;45708:16;;45777:40;45697:128;45634:191;:::o;63008:279::-;63185:24;;-1:-1:-1;;18802:2:1;18798:15;;;18794:53;63185:24:0;;;18782:66:1;63147:4:0;;;;18864:12:1;;63185:24:0;;;;;;;;;;;;63175:35;;;;;;63160:50;;63224:57;63243:11;;63224:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63256:18:0;;;-1:-1:-1;63276:4:0;;-1:-1:-1;63224:18:0;:57::i;:::-;63217:64;63008:279;-1:-1:-1;;;;;63008:279:0:o;32079:315::-;32234:8;-1:-1:-1;;;;;32225:17:0;:5;-1:-1:-1;;;;;32225:17:0;;32217:55;;;;-1:-1:-1;;;32217:55:0;;19089:2:1;32217:55:0;;;19071:21:1;19128:2;19108:18;;;19101:30;19167:27;19147:18;;;19140:55;19212:18;;32217:55:0;18887:349:1;32217:55:0;-1:-1:-1;;;;;32283:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32283:46:0;;;;;;;;;;32345:41;;540::1;;;32345::0;;513:18:1;32345:41:0;;;;;;;32079:315;;;:::o;26989:::-;27146:28;27156:4;27162:2;27166:7;27146:9;:28::i;:::-;27193:48;27216:4;27222:2;27226:7;27235:5;27193:22;:48::i;:::-;27185:111;;;;-1:-1:-1;;;27185:111:0;;;;;;;:::i;62721:281::-;62899:24;;-1:-1:-1;;18802:2:1;18798:15;;;18794:53;62899:24:0;;;18782:66:1;62861:4:0;;;;18864:12:1;;62899:24:0;;;;;;;;;;;;62889:35;;;;;;62874:50;;62938:58;62957:11;;62938:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62970:19:0;;;-1:-1:-1;62991:4:0;;-1:-1:-1;62938:18:0;:58::i;60702:94::-;60754:13;60783:7;60776:14;;;;;:::i;17604:723::-;17660:13;17881:5;17890:1;17881:10;17877:53;;-1:-1:-1;;17908:10:0;;;;;;;;;;;;-1:-1:-1;;;17908:10:0;;;;;17604:723::o;17877:53::-;17955:5;17940:12;17996:78;18003:9;;17996:78;;18029:8;;;;:::i;:::-;;-1:-1:-1;18052:10:0;;-1:-1:-1;18060:2:0;18052:10;;:::i;:::-;;;17996:78;;;18084:19;18116:6;18106:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18106:17:0;;18084:39;;18134:154;18141:10;;18134:154;;18168:11;18178:1;18168:11;;:::i;:::-;;-1:-1:-1;18237:10:0;18245:2;18237:5;:10;:::i;:::-;18224:24;;:2;:24;:::i;:::-;18211:39;;18194:6;18201;18194:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18194:56:0;;;;;;;;-1:-1:-1;18265:11:0;18274:2;18265:11;;:::i;:::-;;;18134:154;;21859:305;21961:4;-1:-1:-1;;;;;;21998:40:0;;-1:-1:-1;;;21998:40:0;;:105;;-1:-1:-1;;;;;;;22055:48:0;;-1:-1:-1;;;22055:48:0;21998:105;:158;;;-1:-1:-1;;;;;;;;;;20367:40:0;;;22120:36;20258:157;63823:203;63975:45;64002:4;64008:2;64012:7;63975:26;:45::i;28601:110::-;28677:26;28687:2;28691:7;28677:26;;;;;;;;;;;;:9;:26::i;46787:190::-;46912:4;46965;46936:25;46949:5;46956:4;46936:12;:25::i;:::-;:33;;46787:190;-1:-1:-1;;;;46787:190:0:o;32959:799::-;33114:4;-1:-1:-1;;;;;33135:13:0;;9307:19;:23;33131:620;;33171:72;;-1:-1:-1;;;33171:72:0;;-1:-1:-1;;;;;33171:36:0;;;;;:72;;17073:10;;33222:4;;33228:7;;33237:5;;33171:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33171:72:0;;;;;;;;-1:-1:-1;;33171:72:0;;;;;;;;;;;;:::i;:::-;;;33167:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33413:6;:13;33430:1;33413:18;33409:272;;33456:60;;-1:-1:-1;;;33456:60:0;;;;;;;:::i;33409:272::-;33631:6;33625:13;33616:6;33612:2;33608:15;33601:38;33167:529;-1:-1:-1;;;;;;33294:51:0;-1:-1:-1;;;33294:51:0;;-1:-1:-1;33287:58:0;;33131:620;-1:-1:-1;33735:4:0;32959:799;;;;;;:::o;38800:589::-;-1:-1:-1;;;;;39006:18:0;;39002:187;;39041:40;39073:7;40216:10;:17;;40189:24;;;;:15;:24;;;;;:44;;;40244:24;;;;;;;;;;;;40112:164;39041:40;39002:187;;;39111:2;-1:-1:-1;;;;;39103:10:0;:4;-1:-1:-1;;;;;39103:10:0;;39099:90;;39130:47;39163:4;39169:7;39130:32;:47::i;:::-;-1:-1:-1;;;;;39203:16:0;;39199:183;;39236:45;39273:7;39236:36;:45::i;39199:183::-;39309:4;-1:-1:-1;;;;;39303:10:0;:2;-1:-1:-1;;;;;39303:10:0;;39299:83;;39330:40;39358:2;39362:7;39330:27;:40::i;28938:321::-;29068:18;29074:2;29078:7;29068:5;:18::i;:::-;29119:54;29150:1;29154:2;29158:7;29167:5;29119:22;:54::i;:::-;29097:154;;;;-1:-1:-1;;;29097:154:0;;;;;;;:::i;47339:675::-;47422:7;47465:4;47422:7;47480:497;47504:5;:12;47500:1;:16;47480:497;;;47538:20;47561:5;47567:1;47561:8;;;;;;;;:::i;:::-;;;;;;;47538:31;;47604:12;47588;:28;47584:382;;48090:13;48140:15;;;48176:4;48169:15;;;48223:4;48207:21;;47716:57;;47584:382;;;48090:13;48140:15;;;48176:4;48169:15;;;48223:4;48207:21;;47893:57;;47584:382;-1:-1:-1;47518:3:0;;;;:::i;:::-;;;;47480:497;;;-1:-1:-1;47994:12:0;47339:675;-1:-1:-1;;;47339:675:0:o;40903:988::-;41169:22;41219:1;41194:22;41211:4;41194:16;:22::i;:::-;:26;;;;:::i;:::-;41231:18;41252:26;;;:17;:26;;;;;;41169:51;;-1:-1:-1;41385:28:0;;;41381:328;;-1:-1:-1;;;;;41452:18:0;;41430:19;41452:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41503:30;;;;;;:44;;;41620:30;;:17;:30;;;;;:43;;;41381:328;-1:-1:-1;41805:26:0;;;;:17;:26;;;;;;;;41798:33;;;-1:-1:-1;;;;;41849:18:0;;;;;:12;:18;;;;;:34;;;;;;;41842:41;40903:988::o;42186:1079::-;42464:10;:17;42439:22;;42464:21;;42484:1;;42464:21;:::i;:::-;42496:18;42517:24;;;:15;:24;;;;;;42890:10;:26;;42439:46;;-1:-1:-1;42517:24:0;;42439:46;;42890:26;;;;;;:::i;:::-;;;;;;;;;42868:48;;42954:11;42929:10;42940;42929:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;43034:28;;;:15;:28;;;;;;;:41;;;43206:24;;;;;43199:31;43241:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42257:1008;;;42186:1079;:::o;39690:221::-;39775:14;39792:20;39809:2;39792:16;:20::i;:::-;-1:-1:-1;;;;;39823:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39868:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39690:221:0:o;29595:439::-;-1:-1:-1;;;;;29675:16:0;;29667:61;;;;-1:-1:-1;;;29667:61:0;;20859:2:1;29667:61:0;;;20841:21:1;;;20878:18;;;20871:30;20937:34;20917:18;;;20910:62;20989:18;;29667:61:0;20657:356:1;29667:61:0;27682:4;27706:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27706:16:0;:30;29739:58;;;;-1:-1:-1;;;29739:58:0;;21220:2:1;29739:58:0;;;21202:21:1;21259:2;21239:18;;;21232:30;21298;21278:18;;;21271:58;21346:18;;29739:58:0;21018:352:1;29739:58:0;29810:45;29839:1;29843:2;29847:7;29810:20;:45::i;:::-;-1:-1:-1;;;;;29868:13:0;;;;;;:9;:13;;;;;:18;;29885:1;;29868:13;:18;;29885:1;;29868:18;:::i;:::-;;;;-1:-1:-1;;29897:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29897:21:0;-1:-1:-1;;;;;29897:21:0;;;;;;;;29936:33;;29897:16;;;29936:33;;29897:16;;29936:33;62230:102;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2173:186::-;2232:6;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2324:29;2343:9;2324:29;:::i;2364:592::-;2435:6;2443;2496:2;2484:9;2475:7;2471:23;2467:32;2464:52;;;2512:1;2509;2502:12;2464:52;2552:9;2539:23;2581:18;2622:2;2614:6;2611:14;2608:34;;;2638:1;2635;2628:12;2608:34;2676:6;2665:9;2661:22;2651:32;;2721:7;2714:4;2710:2;2706:13;2702:27;2692:55;;2743:1;2740;2733:12;2692:55;2783:2;2770:16;2809:2;2801:6;2798:14;2795:34;;;2825:1;2822;2815:12;2795:34;2870:7;2865:2;2856:6;2852:2;2848:15;2844:24;2841:37;2838:57;;;2891:1;2888;2881:12;2838:57;2922:2;2914:11;;;;;2944:6;;-1:-1:-1;2364:592:1;;-1:-1:-1;;;;2364:592:1:o;3143:328::-;3220:6;3228;3236;3289:2;3277:9;3268:7;3264:23;3260:32;3257:52;;;3305:1;3302;3295:12;3257:52;3328:29;3347:9;3328:29;:::i;:::-;3318:39;;3376:38;3410:2;3399:9;3395:18;3376:38;:::i;:::-;3366:48;;3461:2;3450:9;3446:18;3433:32;3423:42;;3143:328;;;;;:::o;3476:248::-;3544:6;3552;3605:2;3593:9;3584:7;3580:23;3576:32;3573:52;;;3621:1;3618;3611:12;3573:52;-1:-1:-1;;3644:23:1;;;3714:2;3699:18;;;3686:32;;-1:-1:-1;3476:248:1:o;4193:127::-;4254:10;4249:3;4245:20;4242:1;4235:31;4285:4;4282:1;4275:15;4309:4;4306:1;4299:15;4325:632;4390:5;4420:18;4461:2;4453:6;4450:14;4447:40;;;4467:18;;:::i;:::-;4542:2;4536:9;4510:2;4596:15;;-1:-1:-1;;4592:24:1;;;4618:2;4588:33;4584:42;4572:55;;;4642:18;;;4662:22;;;4639:46;4636:72;;;4688:18;;:::i;:::-;4728:10;4724:2;4717:22;4757:6;4748:15;;4787:6;4779;4772:22;4827:3;4818:6;4813:3;4809:16;4806:25;4803:45;;;4844:1;4841;4834:12;4803:45;4894:6;4889:3;4882:4;4874:6;4870:17;4857:44;4949:1;4942:4;4933:6;4925;4921:19;4917:30;4910:41;;;;4325:632;;;;;:::o;4962:451::-;5031:6;5084:2;5072:9;5063:7;5059:23;5055:32;5052:52;;;5100:1;5097;5090:12;5052:52;5140:9;5127:23;5173:18;5165:6;5162:30;5159:50;;;5205:1;5202;5195:12;5159:50;5228:22;;5281:4;5273:13;;5269:27;-1:-1:-1;5259:55:1;;5310:1;5307;5300:12;5259:55;5333:74;5399:7;5394:2;5381:16;5376:2;5372;5368:11;5333:74;:::i;5418:160::-;5483:20;;5539:13;;5532:21;5522:32;;5512:60;;5568:1;5565;5558:12;5583:180;5639:6;5692:2;5680:9;5671:7;5667:23;5663:32;5660:52;;;5708:1;5705;5698:12;5660:52;5731:26;5747:9;5731:26;:::i;5950:367::-;6013:8;6023:6;6077:3;6070:4;6062:6;6058:17;6054:27;6044:55;;6095:1;6092;6085:12;6044:55;-1:-1:-1;6118:20:1;;6161:18;6150:30;;6147:50;;;6193:1;6190;6183:12;6147:50;6230:4;6222:6;6218:17;6206:29;;6290:3;6283:4;6273:6;6270:1;6266:14;6258:6;6254:27;6250:38;6247:47;6244:67;;;6307:1;6304;6297:12;6322:437;6408:6;6416;6469:2;6457:9;6448:7;6444:23;6440:32;6437:52;;;6485:1;6482;6475:12;6437:52;6525:9;6512:23;6558:18;6550:6;6547:30;6544:50;;;6590:1;6587;6580:12;6544:50;6629:70;6691:7;6682:6;6671:9;6667:22;6629:70;:::i;:::-;6718:8;;6603:96;;-1:-1:-1;6322:437:1;-1:-1:-1;;;;6322:437:1:o;6764:254::-;6829:6;6837;6890:2;6878:9;6869:7;6865:23;6861:32;6858:52;;;6906:1;6903;6896:12;6858:52;6929:29;6948:9;6929:29;:::i;:::-;6919:39;;6977:35;7008:2;6997:9;6993:18;6977:35;:::i;:::-;6967:45;;6764:254;;;;;:::o;7023:667::-;7118:6;7126;7134;7142;7195:3;7183:9;7174:7;7170:23;7166:33;7163:53;;;7212:1;7209;7202:12;7163:53;7235:29;7254:9;7235:29;:::i;:::-;7225:39;;7283:38;7317:2;7306:9;7302:18;7283:38;:::i;:::-;7273:48;;7368:2;7357:9;7353:18;7340:32;7330:42;;7423:2;7412:9;7408:18;7395:32;7450:18;7442:6;7439:30;7436:50;;;7482:1;7479;7472:12;7436:50;7505:22;;7558:4;7550:13;;7546:27;-1:-1:-1;7536:55:1;;7587:1;7584;7577:12;7536:55;7610:74;7676:7;7671:2;7658:16;7653:2;7649;7645:11;7610:74;:::i;:::-;7600:84;;;7023:667;;;;;;;:::o;7695:505::-;7790:6;7798;7806;7859:2;7847:9;7838:7;7834:23;7830:32;7827:52;;;7875:1;7872;7865:12;7827:52;7911:9;7898:23;7888:33;;7972:2;7961:9;7957:18;7944:32;7999:18;7991:6;7988:30;7985:50;;;8031:1;8028;8021:12;7985:50;8070:70;8132:7;8123:6;8112:9;8108:22;8070:70;:::i;:::-;7695:505;;8159:8;;-1:-1:-1;8044:96:1;;-1:-1:-1;;;;7695:505:1:o;8205:260::-;8273:6;8281;8334:2;8322:9;8313:7;8309:23;8305:32;8302:52;;;8350:1;8347;8340:12;8302:52;8373:29;8392:9;8373:29;:::i;:::-;8363:39;;8421:38;8455:2;8444:9;8440:18;8421:38;:::i;8470:380::-;8549:1;8545:12;;;;8592;;;8613:61;;8667:4;8659:6;8655:17;8645:27;;8613:61;8720:2;8712:6;8709:14;8689:18;8686:38;8683:161;;8766:10;8761:3;8757:20;8754:1;8747:31;8801:4;8798:1;8791:15;8829:4;8826:1;8819:15;8683:161;;8470:380;;;:::o;10095:356::-;10297:2;10279:21;;;10316:18;;;10309:30;10375:34;10370:2;10355:18;;10348:62;10442:2;10427:18;;10095:356::o;10456:413::-;10658:2;10640:21;;;10697:2;10677:18;;;10670:30;10736:34;10731:2;10716:18;;10709:62;-1:-1:-1;;;10802:2:1;10787:18;;10780:47;10859:3;10844:19;;10456:413::o;10874:127::-;10935:10;10930:3;10926:20;10923:1;10916:31;10966:4;10963:1;10956:15;10990:4;10987:1;10980:15;11006:127;11067:10;11062:3;11058:20;11055:1;11048:31;11098:4;11095:1;11088:15;11122:4;11119:1;11112:15;11138:120;11178:1;11204;11194:35;;11209:18;;:::i;:::-;-1:-1:-1;11243:9:1;;11138:120::o;11263:168::-;11303:7;11369:1;11365;11361:6;11357:14;11354:1;11351:21;11346:1;11339:9;11332:17;11328:45;11325:71;;;11376:18;;:::i;:::-;-1:-1:-1;11416:9:1;;11263:168::o;12261:127::-;12322:10;12317:3;12313:20;12310:1;12303:31;12353:4;12350:1;12343:15;12377:4;12374:1;12367:15;13214:355;13416:2;13398:21;;;13455:2;13435:18;;;13428:30;13494:33;13489:2;13474:18;;13467:61;13560:2;13545:18;;13214:355::o;13574:338::-;13776:2;13758:21;;;13815:2;13795:18;;;13788:30;-1:-1:-1;;;13849:2:1;13834:18;;13827:44;13903:2;13888:18;;13574:338::o;15789:470::-;15968:3;16006:6;16000:13;16022:53;16068:6;16063:3;16056:4;16048:6;16044:17;16022:53;:::i;:::-;16138:13;;16097:16;;;;16160:57;16138:13;16097:16;16194:4;16182:17;;16160:57;:::i;:::-;16233:20;;15789:470;-1:-1:-1;;;;15789:470:1:o;17895:125::-;17935:4;17963:1;17960;17957:8;17954:34;;;17968:18;;:::i;:::-;-1:-1:-1;18005:9:1;;17895:125::o;18025:128::-;18065:3;18096:1;18092:6;18089:1;18086:13;18083:39;;;18102:18;;:::i;:::-;-1:-1:-1;18138:9:1;;18025:128::o;18513:135::-;18552:3;18573:17;;;18570:43;;18593:18;;:::i;:::-;-1:-1:-1;18640:1:1;18629:13;;18513:135::o;19241:414::-;19443:2;19425:21;;;19482:2;19462:18;;;19455:30;19521:34;19516:2;19501:18;;19494:62;-1:-1:-1;;;19587:2:1;19572:18;;19565:48;19645:3;19630:19;;19241:414::o;19660:112::-;19692:1;19718;19708:35;;19723:18;;:::i;:::-;-1:-1:-1;19757:9:1;;19660:112::o;19777:489::-;-1:-1:-1;;;;;20046:15:1;;;20028:34;;20098:15;;20093:2;20078:18;;20071:43;20145:2;20130:18;;20123:34;;;20193:3;20188:2;20173:18;;20166:31;;;19971:4;;20214:46;;20240:19;;20232:6;20214:46;:::i;:::-;20206:54;19777:489;-1:-1:-1;;;;;;19777:489:1:o;20271:249::-;20340:6;20393:2;20381:9;20372:7;20368:23;20364:32;20361:52;;;20409:1;20406;20399:12;20361:52;20441:9;20435:16;20460:30;20484:5;20460:30;:::i;20525:127::-;20586:10;20581:3;20577:20;20574:1;20567:31;20617:4;20614:1;20607:15;20641:4;20638:1;20631:15
Swarm Source
ipfs://8429858b725cf6e337db698abc8fe317b2e9120729dd9a67100f5194a6f90139
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.