ERC-721
Overview
Max Total Supply
0 EG
Holders
49
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 EGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EternalGardens
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // Compatible with OpenZeppelin Contracts ^5.0.0 pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; contract EternalGardens is ERC721, ERC721Pausable, Ownable, ERC721Burnable, ReentrancyGuard { using Strings for uint256; uint256 private gardenerCounter = 0; uint256 private arboristCounter = 0; uint256 private gatekeeperCounter = 0; uint256 private guardianCounter = 0; uint256 private angelCounter = 0; uint256 private saintCounter = 0; uint256 private patronCounter = 0; uint256 public constant ARBORIST_OFFSET = 10000; uint256 public constant GATEKEEPER_OFFSET = 20000; uint256 public constant GUARDIAN_OFFSET = 30000; uint256 public constant ANGEL_OFFSET = 40000; uint256 public constant SAINT_OFFSET = 50000; uint256 public constant PATRON_OFFSET = 60000; uint256 public priceGardener = 0.05 ether; uint256 public priceArborist = 0.075 ether; uint256 public priceGatekeeper = 0.1 ether; uint256 public priceGuardian = 0.125 ether; uint256 public priceAngelSaint = 0.15 ether; uint256 public pricePatron = 0.25 ether; uint256 public maxMintAmountPerTx = 20; string public uriPrefix = "https://eternal-gardens.s3.amazonaws.com/json/"; string public uriSuffix = ".json"; bool public mintPaused = false; constructor(address initialOwner) ERC721("Eternal Gardens", "EG") Ownable(initialOwner) {} modifier mintCompliance(uint256 _mintAmount) { require(!paused(), "The mint is paused!"); require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!"); _; } modifier sufficientPayment(uint256 _price, uint256 _mintAmount) { require(msg.value >= _price * _mintAmount, "Insufficient payment"); _; } modifier whenMintNotPaused() { require(!mintPaused, "Public minting is paused"); _; } function setMintPaused(bool _state) external onlyOwner { mintPaused = _state; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function safeMint(address to, uint256 tokenId) public onlyOwner { _safeMint(to, tokenId); } function mintGardener(uint256 _amount) external payable mintCompliance(_amount) sufficientPayment(priceGardener, _amount) whenMintNotPaused { for (uint256 i = 0; i < _amount; i++) { uint256 tokenId = gardenerCounter; _safeMint(msg.sender, tokenId); gardenerCounter++; } } function mintArborist(uint256 _amount) external payable mintCompliance(_amount) sufficientPayment(priceArborist, _amount) whenMintNotPaused { for (uint256 i = 0; i < _amount; i++) { uint256 tokenId = arboristCounter + ARBORIST_OFFSET; _safeMint(msg.sender, tokenId); arboristCounter++; } } function mintGatekeeper(uint256 _amount) external payable mintCompliance(_amount) sufficientPayment(priceGatekeeper, _amount) whenMintNotPaused { for (uint256 i = 0; i < _amount; i++) { uint256 tokenId = gatekeeperCounter + GATEKEEPER_OFFSET; _safeMint(msg.sender, tokenId); gatekeeperCounter++; } } function mintGuardian(uint256 _amount) external payable mintCompliance(_amount) sufficientPayment(priceGuardian, _amount) whenMintNotPaused { for (uint256 i = 0; i < _amount; i++) { uint256 tokenId = guardianCounter + GUARDIAN_OFFSET; _safeMint(msg.sender, tokenId); guardianCounter++; } } function mintAngel(uint256 _amount) external payable mintCompliance(_amount) sufficientPayment(priceAngelSaint, _amount) whenMintNotPaused { for (uint256 i = 0; i < _amount; i++) { uint256 tokenId = angelCounter + ANGEL_OFFSET; _safeMint(msg.sender, tokenId); angelCounter++; } } function mintSaint(uint256 _amount) external payable mintCompliance(_amount) sufficientPayment(priceAngelSaint, _amount) whenMintNotPaused { for (uint256 i = 0; i < _amount; i++) { uint256 tokenId = saintCounter + SAINT_OFFSET; _safeMint(msg.sender, tokenId); saintCounter++; } } function mintPatron(uint256 _amount) external payable mintCompliance(_amount) sufficientPayment(pricePatron, _amount) whenMintNotPaused { for (uint256 i = 0; i < _amount; i++) { uint256 tokenId = patronCounter + PATRON_OFFSET; _safeMint(msg.sender, tokenId); patronCounter++; } } function mintFor(uint256 _amount, uint8 _tier, address _recipient) external onlyOwner { for (uint256 i = 0; i < _amount; i++) { uint256 tokenId; if (_tier == 0) { tokenId = gardenerCounter++; } else if (_tier == 1) { tokenId = arboristCounter++ + ARBORIST_OFFSET; } else if (_tier == 2) { tokenId = gatekeeperCounter++ + GATEKEEPER_OFFSET; } else if (_tier == 3) { tokenId = guardianCounter++ + GUARDIAN_OFFSET; } else if (_tier == 4) { tokenId = angelCounter++ + ANGEL_OFFSET; } else if (_tier == 5) { tokenId = saintCounter++ + SAINT_OFFSET; } else if (_tier == 6) { tokenId = patronCounter++ + PATRON_OFFSET; } else { revert("Invalid tier!"); } _safeMint(_recipient, tokenId); } } function setPriceGardener(uint256 _price) external onlyOwner { priceGardener = _price; } function setPriceArborist(uint256 _price) external onlyOwner { priceArborist = _price; } function setPriceGatekeeper(uint256 _price) external onlyOwner { priceGatekeeper = _price; } function setPriceGuardian(uint256 _price) external onlyOwner { priceGuardian = _price; } function setPriceAngelSaint(uint256 _price) external onlyOwner { priceAngelSaint = _price; } function setPricePatron(uint256 _price) external onlyOwner { pricePatron = _price; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) external onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setGardenerCounter(uint256 _newCounter) external onlyOwner { gardenerCounter = _newCounter; } function setArboristCounter(uint256 _newCounter) external onlyOwner { arboristCounter = _newCounter; } function setGatekeeperCounter(uint256 _newCounter) external onlyOwner { gatekeeperCounter = _newCounter; } function setGuardianCounter(uint256 _newCounter) external onlyOwner { guardianCounter = _newCounter; } function setAngelCounter(uint256 _newCounter) external onlyOwner { angelCounter = _newCounter; } function setSaintCounter(uint256 _newCounter) external onlyOwner { saintCounter = _newCounter; } function setPatronCounter(uint256 _newCounter) external onlyOwner { patronCounter = _newCounter; } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { _requireOwned(_tokenId); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } function _update(address to, uint256 tokenId, address auth) internal override(ERC721, ERC721Pausable) returns (address) { return super._update(to, tokenId, auth); } function supportsInterface(bytes4 interfaceId) public view override(ERC721) returns (bool) { return super.supportsInterface(interfaceId); } function withdraw() external onlyOwner nonReentrant { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success, "Failed to send Ether"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.20; import {IERC721} from "./IERC721.sol"; import {IERC721Receiver} from "./IERC721Receiver.sol"; import {IERC721Metadata} from "./extensions/IERC721Metadata.sol"; import {Context} from "../../utils/Context.sol"; import {Strings} from "../../utils/Strings.sol"; import {IERC165, ERC165} from "../../utils/introspection/ERC165.sol"; import {IERC721Errors} from "../../interfaces/draft-IERC6093.sol"; /** * @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}. */ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors { using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; mapping(uint256 tokenId => address) private _owners; mapping(address owner => uint256) private _balances; mapping(uint256 tokenId => address) private _tokenApprovals; mapping(address owner => mapping(address operator => 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 returns (uint256) { if (owner == address(0)) { revert ERC721InvalidOwner(address(0)); } return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual returns (address) { return _requireOwned(tokenId); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual returns (string memory) { _requireOwned(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual { _approve(to, tokenId, _msgSender()); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual returns (address) { _requireOwned(tokenId); return _getApproved(tokenId); } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. address previousOwner = _update(to, tokenId, _msgSender()); if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { transferFrom(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist * * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`. */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted. */ function _getApproved(uint256 tokenId) internal view virtual returns (address) { return _tokenApprovals[tokenId]; } /** * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in * particular (ignoring whether it is owned by `owner`). * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { return spender != address(0) && (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); } /** * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner. * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets * the `spender` for the specific `tokenId`. * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { if (!_isAuthorized(owner, spender, tokenId)) { if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } else { revert ERC721InsufficientApproval(spender, tokenId); } } } /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that * a uint256 would ever overflow from increments when these increments are bounded to uint128 values. * * WARNING: Increasing an account's balance using this function tends to be paired with an override of the * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership * remain consistent with one another. */ function _increaseBalance(address account, uint128 value) internal virtual { unchecked { _balances[account] += value; } } /** * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. * * The `auth` argument is optional. If the value passed is non 0, then this function will check that * `auth` is either the owner of the token, or approved to operate on the token (by the owner). * * Emits a {Transfer} event. * * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}. */ function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { address from = _ownerOf(tokenId); // Perform (optional) operator check if (auth != address(0)) { _checkAuthorized(from, auth, tokenId); } // Execute the update if (from != address(0)) { // Clear approval. No need to re-authorize or emit the Approval event _approve(address(0), tokenId, address(0), false); unchecked { _balances[from] -= 1; } } if (to != address(0)) { unchecked { _balances[to] += 1; } } _owners[tokenId] = to; emit Transfer(from, to, tokenId); return from; } /** * @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 { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner != address(0)) { revert ERC721InvalidSender(address(0)); } } /** * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance. * * 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 { _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); _checkOnERC721Received(address(0), to, tokenId, data); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal { address previousOwner = _update(address(0), tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(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 { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } else if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients * are aware of the ERC721 standard 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 like {safeTransferFrom} in the sense that it invokes * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `tokenId` token must exist and be owned by `from`. * - `to` cannot be the zero address. * - `from` cannot be the zero address. * - 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) internal { _safeTransfer(from, to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Approve `to` to operate on `tokenId` * * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is * either the owner of the token, or approved to operate on all tokens held by this owner. * * Emits an {Approval} event. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address to, uint256 tokenId, address auth) internal { _approve(to, tokenId, auth, true); } /** * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not * emitted in the context of transfers. */ function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { // Avoid reading the owner unless necessary if (emitEvent || auth != address(0)) { address owner = _requireOwned(tokenId); // We do not use _isAuthorized because single-token approvals should not be able to call approve if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { revert ERC721InvalidApprover(auth); } if (emitEvent) { emit Approval(owner, to, tokenId); } } _tokenApprovals[tokenId] = to; } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Requirements: * - operator can't be the address zero. * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { if (operator == address(0)) { revert ERC721InvalidOperator(operator); } _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned). * Returns the owner. * * Overrides to ownership logic should be done to {_ownerOf}. */ function _requireOwned(uint256 tokenId) internal view returns (address) { address owner = _ownerOf(tokenId); if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } return owner; } /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the * recipient doesn't accept the token transfer. 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 */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private { if (to.code.length > 0) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { if (retval != IERC721Receiver.onERC721Received.selector) { revert ERC721InvalidReceiver(to); } } catch (bytes memory reason) { if (reason.length == 0) { revert ERC721InvalidReceiver(to); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.20; import {ERC721} from "../ERC721.sol"; import {Context} from "../../../utils/Context.sol"; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. _update(address(0), tokenId, _msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.20; import {ERC721} from "../ERC721.sol"; import {Pausable} from "../../../utils/Pausable.sol"; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. * * IMPORTANT: This contract does not include public pause and unpause functions. In * addition to inheriting this contract, you must define both functions, invoking the * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will * make the contract pause mechanism of the contract unreachable, and thus unusable. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_update}. * * Requirements: * * - the contract must not be paused. */ function _update( address to, uint256 tokenId, address auth ) internal virtual override whenNotPaused returns (address) { return super._update(to, tokenId, auth); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.20; import {IERC721} from "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; import {IERC165} from "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.20; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be * reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @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; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); 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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; import {Math} from "./math/Math.sol"; import {SignedMath} from "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; 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_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ANGEL_OFFSET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ARBORIST_OFFSET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GATEKEEPER_OFFSET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GUARDIAN_OFFSET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PATRON_OFFSET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAINT_OFFSET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","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":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintAngel","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintArborist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_tier","type":"uint8"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"mintFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintGardener","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintGatekeeper","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintGuardian","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintPatron","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintSaint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceAngelSaint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceArborist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceGardener","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceGatekeeper","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceGuardian","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePatron","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCounter","type":"uint256"}],"name":"setAngelCounter","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":"uint256","name":"_newCounter","type":"uint256"}],"name":"setArboristCounter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCounter","type":"uint256"}],"name":"setGardenerCounter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCounter","type":"uint256"}],"name":"setGatekeeperCounter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCounter","type":"uint256"}],"name":"setGuardianCounter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setMintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCounter","type":"uint256"}],"name":"setPatronCounter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPriceAngelSaint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPriceArborist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPriceGardener","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPriceGatekeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPriceGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPricePatron","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCounter","type":"uint256"}],"name":"setSaintCounter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600060088190556009819055600a819055600b819055600c819055600d819055600e5566b1a2bc2ec50000600f5567010a741a4627800060105567016345785d8a00006011556701bc16d674ec8000601255670214e8348c4f00006013556703782dace9d90000601490815560155560e0604052602e60808181529062002be160a039601690620000919082620002af565b50604080518082019091526005815264173539b7b760d91b6020820152601790620000bd9082620002af565b506018805460ff19169055348015620000d557600080fd5b5060405162002c0f38038062002c0f833981016040819052620000f8916200037b565b806040518060400160405280600f81526020016e457465726e616c2047617264656e7360881b81525060405180604001604052806002815260200161454760f01b81525081600090816200014d9190620002af565b5060016200015c8282620002af565b50506006805460ff19169055506001600160a01b0381166200019857604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b620001a381620001b0565b50506001600755620003ad565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200023557607f821691505b6020821081036200025657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002aa57600081815260208120601f850160051c81016020861015620002855750805b601f850160051c820191505b81811015620002a65782815560010162000291565b5050505b505050565b81516001600160401b03811115620002cb57620002cb6200020a565b620002e381620002dc845462000220565b846200025c565b602080601f8311600181146200031b5760008415620003025750858301515b600019600386901b1c1916600185901b178555620002a6565b600085815260208120601f198616915b828110156200034c578886015182559484019460019091019084016200032b565b50858210156200036b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200038e57600080fd5b81516001600160a01b0381168114620003a657600080fd5b9392505050565b61282480620003bd6000396000f3fe6080604052600436106103b85760003560e01c806368d45c84116101f2578063a22cb4651161010d578063c44236da116100a0578063dc0ff9251161006f578063dc0ff92514610a3b578063e985e9c514610a51578063f2fde38b14610a71578063fe7f4f5314610a9157600080fd5b8063c44236da146109d2578063c87b56dd146109f2578063c9dbf5c214610a12578063d2f4e82a14610a2857600080fd5b8063bbc09f2c116100dc578063bbc09f2c1461096c578063bcfb07411461097f578063bfc98c8814610992578063c05f06aa146109b257600080fd5b8063a22cb465146108ec578063b071401b1461090c578063b69355011461092c578063b88d4fde1461094c57600080fd5b80638d1dea6711610185578063943a18f911610154578063943a18f91461088457806395d89b4114610897578063992ee4de146108ac578063a1448194146108cc57600080fd5b80638d1dea671461081f5780638da5cb5b14610835578063927c021a1461085857806394354fd01461086e57600080fd5b80637e018292116101c15780637e018292146107b05780637e4831d3146107d05780637ec4a659146107ea5780638456cb591461080a57600080fd5b806368d45c841461074557806370a0823114610765578063715018a6146107855780637783a3a11461079a57600080fd5b80633d23e7bb116102e25780635503a0e8116102755780636015b559116102445780636015b559146106dd57806362b99ad4146106fd5780636352211e14610712578063656556321461073257600080fd5b80635503a0e81461067a57806355f4be2e1461068f57806359f6dc6b146106a55780635c975abb146106c557600080fd5b806342966c68116102b157806342966c681461060457806344959cf7146106245780634e6f0c681461063a578063528546141461065a57600080fd5b80633d23e7bb146105a65780633f4ba83a146105bc578063403dbc70146105d157806342842e0e146105e457600080fd5b806317831a531161035a57806325f6e8191161032957806325f6e8191461054557806327fca4f71461055b578063393f68a31461057b5780633ccfd60b1461059157600080fd5b806317831a53146104c157806320e9c831146104e5578063229ebae51461050557806323b872dd1461052557600080fd5b8063081812fc11610396578063081812fc14610436578063095ea7b31461046e578063120e9bd11461048e57806316ba10e0146104a157600080fd5b806301ffc9a7146103bd57806306fdde03146103f257806307b96ebf14610414575b600080fd5b3480156103c957600080fd5b506103dd6103d8366004612140565b610aa7565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b50610407610ab8565b6040516103e991906121ad565b34801561042057600080fd5b5061043461042f3660046121c0565b610b4a565b005b34801561044257600080fd5b506104566104513660046121c0565b610b57565b6040516001600160a01b0390911681526020016103e9565b34801561047a57600080fd5b506104346104893660046121f5565b610b80565b61043461049c3660046121c0565b610b8f565b3480156104ad57600080fd5b506104346104bc3660046122ab565b610c99565b3480156104cd57600080fd5b506104d761753081565b6040519081526020016103e9565b3480156104f157600080fd5b506104346105003660046121c0565b610cad565b34801561051157600080fd5b506104346105203660046121c0565b610cba565b34801561053157600080fd5b506104346105403660046122f4565b610cc7565b34801561055157600080fd5b506104d7600f5481565b34801561056757600080fd5b506104346105763660046121c0565b610d52565b34801561058757600080fd5b506104d760115481565b34801561059d57600080fd5b50610434610d5f565b3480156105b257600080fd5b506104d760125481565b3480156105c857600080fd5b50610434610e0b565b6104346105df3660046121c0565b610e1b565b3480156105f057600080fd5b506104346105ff3660046122f4565b610f15565b34801561061057600080fd5b5061043461061f3660046121c0565b610f35565b34801561063057600080fd5b506104d761271081565b34801561064657600080fd5b506104346106553660046121c0565b610f41565b34801561066657600080fd5b506104346106753660046121c0565b610f4e565b34801561068657600080fd5b50610407610f5b565b34801561069b57600080fd5b506104d761ea6081565b3480156106b157600080fd5b506104346106c03660046121c0565b610fe9565b3480156106d157600080fd5b5060065460ff166103dd565b3480156106e957600080fd5b506104346106f83660046121c0565b610ff6565b34801561070957600080fd5b50610407611003565b34801561071e57600080fd5b5061045661072d3660046121c0565b611010565b6104346107403660046121c0565b61101b565b34801561075157600080fd5b50610434610760366004612330565b611115565b34801561077157600080fd5b506104d7610780366004612374565b61126e565b34801561079157600080fd5b506104346112b6565b3480156107a657600080fd5b506104d7614e2081565b3480156107bc57600080fd5b506104346107cb3660046121c0565b6112c8565b3480156107dc57600080fd5b506018546103dd9060ff1681565b3480156107f657600080fd5b506104346108053660046122ab565b6112d5565b34801561081657600080fd5b506104346112e9565b34801561082b57600080fd5b506104d760105481565b34801561084157600080fd5b5060065461010090046001600160a01b0316610456565b34801561086457600080fd5b506104d760145481565b34801561087a57600080fd5b506104d760155481565b6104346108923660046121c0565b6112f9565b3480156108a357600080fd5b506104076113e2565b3480156108b857600080fd5b506104346108c73660046121c0565b6113f1565b3480156108d857600080fd5b506104346108e73660046121f5565b6113fe565b3480156108f857600080fd5b5061043461090736600461239f565b611410565b34801561091857600080fd5b506104346109273660046121c0565b61141b565b34801561093857600080fd5b506104346109473660046123d2565b611428565b34801561095857600080fd5b506104346109673660046123ed565b611443565b61043461097a3660046121c0565b61145a565b61043461098d3660046121c0565b611554565b34801561099e57600080fd5b506104346109ad3660046121c0565b61164e565b3480156109be57600080fd5b506104346109cd3660046121c0565b61165b565b3480156109de57600080fd5b506104346109ed3660046121c0565b611668565b3480156109fe57600080fd5b50610407610a0d3660046121c0565b611675565b348015610a1e57600080fd5b506104d760135481565b610434610a363660046121c0565b6116e0565b348015610a4757600080fd5b506104d7619c4081565b348015610a5d57600080fd5b506103dd610a6c366004612469565b6117da565b348015610a7d57600080fd5b50610434610a8c366004612374565b611808565b348015610a9d57600080fd5b506104d761c35081565b6000610ab282611846565b92915050565b606060008054610ac790612493565b80601f0160208091040260200160405190810160405280929190818152602001828054610af390612493565b8015610b405780601f10610b1557610100808354040283529160200191610b40565b820191906000526020600020905b815481529060010190602001808311610b2357829003601f168201915b5050505050905090565b610b52611896565b601355565b6000610b62826118c9565b506000828152600460205260409020546001600160a01b0316610ab2565b610b8b828233611902565b5050565b80610b9c60065460ff1690565b15610bc25760405162461bcd60e51b8152600401610bb9906124cd565b60405180910390fd5b600081118015610bd457506015548111155b610bf05760405162461bcd60e51b8152600401610bb9906124fa565b60135482610bfe818361253e565b341015610c1d5760405162461bcd60e51b8152600401610bb990612555565b60185460ff1615610c405760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c92576000619c40600c54610c5d91906125ba565b9050610c69338261190f565b600c8054906000610c79836125cd565b9190505550508080610c8a906125cd565b915050610c43565b5050505050565b610ca1611896565b6017610b8b8282612634565b610cb5611896565b601055565b610cc2611896565b600d55565b6001600160a01b038216610cf157604051633250574960e11b815260006004820152602401610bb9565b6000610cfe838333611929565b9050836001600160a01b0316816001600160a01b031614610d4c576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610bb9565b50505050565b610d5a611896565b600855565b610d67611896565b610d6f61193e565b604051600090339047908381818185875af1925050503d8060008114610db1576040519150601f19603f3d011682016040523d82523d6000602084013e610db6565b606091505b5050905080610dfe5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610bb9565b50610e096001600755565b565b610e13611896565b610e09611968565b80610e2860065460ff1690565b15610e455760405162461bcd60e51b8152600401610bb9906124cd565b600081118015610e5757506015548111155b610e735760405162461bcd60e51b8152600401610bb9906124fa565b60125482610e81818361253e565b341015610ea05760405162461bcd60e51b8152600401610bb990612555565b60185460ff1615610ec35760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c92576000617530600b54610ee091906125ba565b9050610eec338261190f565b600b8054906000610efc836125cd565b9190505550508080610f0d906125cd565b915050610ec6565b610f3083838360405180602001604052806000815250611443565b505050565b610b8b60008233611929565b610f49611896565b600955565b610f56611896565b600a55565b60178054610f6890612493565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9490612493565b8015610fe15780601f10610fb657610100808354040283529160200191610fe1565b820191906000526020600020905b815481529060010190602001808311610fc457829003601f168201915b505050505081565b610ff1611896565b600c55565b610ffe611896565b600e55565b60168054610f6890612493565b6000610ab2826118c9565b8061102860065460ff1690565b156110455760405162461bcd60e51b8152600401610bb9906124cd565b60008111801561105757506015548111155b6110735760405162461bcd60e51b8152600401610bb9906124fa565b60135482611081818361253e565b3410156110a05760405162461bcd60e51b8152600401610bb990612555565b60185460ff16156110c35760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c9257600061c350600d546110e091906125ba565b90506110ec338261190f565b600d80549060006110fc836125cd565b919050555050808061110d906125cd565b9150506110c6565b61111d611896565b60005b83811015610d4c5760008360ff166000036111505760088054906000611145836125cd565b919050559050611251565b8360ff16600103611183576009805461271091600061116e836125cd565b9190505561117c91906125ba565b9050611251565b8360ff166002036111a157600a8054614e2091600061116e836125cd565b8360ff166003036111bf57600b805461753091600061116e836125cd565b8360ff166004036111dd57600c8054619c4091600061116e836125cd565b8360ff166005036111fb57600d805461c35091600061116e836125cd565b8360ff1660060361121957600e805461ea6091600061116e836125cd565b60405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420746965722160981b6044820152606401610bb9565b61125b838261190f565b5080611266816125cd565b915050611120565b60006001600160a01b03821661129a576040516322718ad960e21b815260006004820152602401610bb9565b506001600160a01b031660009081526003602052604090205490565b6112be611896565b610e0960006119ba565b6112d0611896565b601255565b6112dd611896565b6016610b8b8282612634565b6112f1611896565b610e09611a14565b8061130660065460ff1690565b156113235760405162461bcd60e51b8152600401610bb9906124cd565b60008111801561133557506015548111155b6113515760405162461bcd60e51b8152600401610bb9906124fa565b600f548261135f818361253e565b34101561137e5760405162461bcd60e51b8152600401610bb990612555565b60185460ff16156113a15760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c92576008546113b9338261190f565b600880549060006113c9836125cd565b91905055505080806113da906125cd565b9150506113a4565b606060018054610ac790612493565b6113f9611896565b601455565b611406611896565b610b8b828261190f565b610b8b338383611a51565b611423611896565b601555565b611430611896565b6018805460ff1916911515919091179055565b61144e848484610cc7565b610d4c84848484611af0565b8061146760065460ff1690565b156114845760405162461bcd60e51b8152600401610bb9906124cd565b60008111801561149657506015548111155b6114b25760405162461bcd60e51b8152600401610bb9906124fa565b601054826114c0818361253e565b3410156114df5760405162461bcd60e51b8152600401610bb990612555565b60185460ff16156115025760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c9257600061271060095461151f91906125ba565b905061152b338261190f565b6009805490600061153b836125cd565b919050555050808061154c906125cd565b915050611505565b8061156160065460ff1690565b1561157e5760405162461bcd60e51b8152600401610bb9906124cd565b60008111801561159057506015548111155b6115ac5760405162461bcd60e51b8152600401610bb9906124fa565b601454826115ba818361253e565b3410156115d95760405162461bcd60e51b8152600401610bb990612555565b60185460ff16156115fc5760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c9257600061ea60600e5461161991906125ba565b9050611625338261190f565b600e8054906000611635836125cd565b9190505550508080611646906125cd565b9150506115ff565b611656611896565b600f55565b611663611896565b601155565b611670611896565b600b55565b6060611680826118c9565b50600061168b611c12565b905060008151116116ab57604051806020016040528060008152506116d9565b806116b584611c21565b60176040516020016116c9939291906126f4565b6040516020818303038152906040525b9392505050565b806116ed60065460ff1690565b1561170a5760405162461bcd60e51b8152600401610bb9906124cd565b60008111801561171c57506015548111155b6117385760405162461bcd60e51b8152600401610bb9906124fa565b60115482611746818361253e565b3410156117655760405162461bcd60e51b8152600401610bb990612555565b60185460ff16156117885760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c92576000614e20600a546117a591906125ba565b90506117b1338261190f565b600a80549060006117c1836125cd565b91905055505080806117d2906125cd565b91505061178b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611810611896565b6001600160a01b03811661183a57604051631e4fbdf760e01b815260006004820152602401610bb9565b611843816119ba565b50565b60006001600160e01b031982166380ac58cd60e01b148061187757506001600160e01b03198216635b5e139f60e01b145b80610ab257506301ffc9a760e01b6001600160e01b0319831614610ab2565b6006546001600160a01b03610100909104163314610e095760405163118cdaa760e01b8152336004820152602401610bb9565b6000818152600260205260408120546001600160a01b031680610ab257604051637e27328960e01b815260048101849052602401610bb9565b610f308383836001611cb4565b610b8b828260405180602001604052806000815250611dba565b6000611936848484611dd1565b949350505050565b60026007540361196157604051633ee5aeb560e01b815260040160405180910390fd5b6002600755565b611970611de6565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a1c611e09565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861199d3390565b6001600160a01b038216611a8357604051630b61174360e31b81526001600160a01b0383166004820152602401610bb9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15610d4c57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611b32903390889087908790600401612794565b6020604051808303816000875af1925050508015611b6d575060408051601f3d908101601f19168201909252611b6a918101906127d1565b60015b611bd6573d808015611b9b576040519150601f19603f3d011682016040523d82523d6000602084013e611ba0565b606091505b508051600003611bce57604051633250574960e11b81526001600160a01b0385166004820152602401610bb9565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14610c9257604051633250574960e11b81526001600160a01b0385166004820152602401610bb9565b606060168054610ac790612493565b60606000611c2e83611e2d565b600101905060008167ffffffffffffffff811115611c4e57611c4e61221f565b6040519080825280601f01601f191660200182016040528015611c78576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c8257509392505050565b8080611cc857506001600160a01b03821615155b15611d8a576000611cd8846118c9565b90506001600160a01b03831615801590611d045750826001600160a01b0316816001600160a01b031614155b8015611d175750611d1581846117da565b155b15611d405760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610bb9565b8115611d885783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b611dc48383611f05565b610f306000848484611af0565b6000611ddb611e09565b611936848484611f6a565b60065460ff16610e0957604051638dfc202b60e01b815260040160405180910390fd5b60065460ff1615610e095760405163d93c066560e01b815260040160405180910390fd5b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e6c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611e98576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611eb657662386f26fc10000830492506010015b6305f5e1008310611ece576305f5e100830492506008015b6127108310611ee257612710830492506004015b60648310611ef4576064830492506002015b600a8310610ab25760010192915050565b6001600160a01b038216611f2f57604051633250574960e11b815260006004820152602401610bb9565b6000611f3d83836000611929565b90506001600160a01b03811615610f30576040516339e3563760e11b815260006004820152602401610bb9565b6000828152600260205260408120546001600160a01b0390811690831615611f9757611f97818486612063565b6001600160a01b03811615611fd557611fb4600085600080611cb4565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615612004576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b61206e8383836120c7565b610f30576001600160a01b03831661209c57604051637e27328960e01b815260048101829052602401610bb9565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610bb9565b60006001600160a01b038316158015906119365750826001600160a01b0316846001600160a01b03161480612101575061210184846117da565b806119365750506000908152600460205260409020546001600160a01b03908116911614919050565b6001600160e01b03198116811461184357600080fd5b60006020828403121561215257600080fd5b81356116d98161212a565b60005b83811015612178578181015183820152602001612160565b50506000910152565b6000815180845261219981602086016020860161215d565b601f01601f19169290920160200192915050565b6020815260006116d96020830184612181565b6000602082840312156121d257600080fd5b5035919050565b80356001600160a01b03811681146121f057600080fd5b919050565b6000806040838503121561220857600080fd5b612211836121d9565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122505761225061221f565b604051601f8501601f19908116603f011681019082821181831017156122785761227861221f565b8160405280935085815286868601111561229157600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156122bd57600080fd5b813567ffffffffffffffff8111156122d457600080fd5b8201601f810184136122e557600080fd5b61193684823560208401612235565b60008060006060848603121561230957600080fd5b612312846121d9565b9250612320602085016121d9565b9150604084013590509250925092565b60008060006060848603121561234557600080fd5b83359250602084013560ff8116811461235d57600080fd5b915061236b604085016121d9565b90509250925092565b60006020828403121561238657600080fd5b6116d9826121d9565b803580151581146121f057600080fd5b600080604083850312156123b257600080fd5b6123bb836121d9565b91506123c96020840161238f565b90509250929050565b6000602082840312156123e457600080fd5b6116d98261238f565b6000806000806080858703121561240357600080fd5b61240c856121d9565b935061241a602086016121d9565b925060408501359150606085013567ffffffffffffffff81111561243d57600080fd5b8501601f8101871361244e57600080fd5b61245d87823560208401612235565b91505092959194509250565b6000806040838503121561247c57600080fd5b612485836121d9565b91506123c9602084016121d9565b600181811c908216806124a757607f821691505b6020821081036124c757634e487b7160e01b600052602260045260246000fd5b50919050565b602080825260139082015272546865206d696e74206973207061757365642160681b604082015260600190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ab257610ab2612528565b602080825260149082015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b604082015260600190565b60208082526018908201527f5075626c6963206d696e74696e67206973207061757365640000000000000000604082015260600190565b80820180821115610ab257610ab2612528565b6000600182016125df576125df612528565b5060010190565b601f821115610f3057600081815260208120601f850160051c8101602086101561260d5750805b601f850160051c820191505b8181101561262c57828155600101612619565b505050505050565b815167ffffffffffffffff81111561264e5761264e61221f565b6126628161265c8454612493565b846125e6565b602080601f831160018114612697576000841561267f5750858301515b600019600386901b1c1916600185901b17855561262c565b600085815260208120601f198616915b828110156126c6578886015182559484019460019091019084016126a7565b50858210156126e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000845160206127078285838a0161215d565b85519184019161271a8184848a0161215d565b855492019160009061272b81612493565b60018281168015612743576001811461275857612784565b60ff1984168752821515830287019450612784565b896000528560002060005b8481101561277c57815489820152908301908701612763565b505082870194505b50929a9950505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127c790830184612181565b9695505050505050565b6000602082840312156127e357600080fd5b81516116d98161212a56fea26469706673582212204263bbbab9502fda980a96042f545637aa43155f481859bcd474db92ba69864a64736f6c6343000814003368747470733a2f2f657465726e616c2d67617264656e732e73332e616d617a6f6e6177732e636f6d2f6a736f6e2f000000000000000000000000cdfaff850e2427f8aad21b642ae8b4216061869e
Deployed Bytecode
0x6080604052600436106103b85760003560e01c806368d45c84116101f2578063a22cb4651161010d578063c44236da116100a0578063dc0ff9251161006f578063dc0ff92514610a3b578063e985e9c514610a51578063f2fde38b14610a71578063fe7f4f5314610a9157600080fd5b8063c44236da146109d2578063c87b56dd146109f2578063c9dbf5c214610a12578063d2f4e82a14610a2857600080fd5b8063bbc09f2c116100dc578063bbc09f2c1461096c578063bcfb07411461097f578063bfc98c8814610992578063c05f06aa146109b257600080fd5b8063a22cb465146108ec578063b071401b1461090c578063b69355011461092c578063b88d4fde1461094c57600080fd5b80638d1dea6711610185578063943a18f911610154578063943a18f91461088457806395d89b4114610897578063992ee4de146108ac578063a1448194146108cc57600080fd5b80638d1dea671461081f5780638da5cb5b14610835578063927c021a1461085857806394354fd01461086e57600080fd5b80637e018292116101c15780637e018292146107b05780637e4831d3146107d05780637ec4a659146107ea5780638456cb591461080a57600080fd5b806368d45c841461074557806370a0823114610765578063715018a6146107855780637783a3a11461079a57600080fd5b80633d23e7bb116102e25780635503a0e8116102755780636015b559116102445780636015b559146106dd57806362b99ad4146106fd5780636352211e14610712578063656556321461073257600080fd5b80635503a0e81461067a57806355f4be2e1461068f57806359f6dc6b146106a55780635c975abb146106c557600080fd5b806342966c68116102b157806342966c681461060457806344959cf7146106245780634e6f0c681461063a578063528546141461065a57600080fd5b80633d23e7bb146105a65780633f4ba83a146105bc578063403dbc70146105d157806342842e0e146105e457600080fd5b806317831a531161035a57806325f6e8191161032957806325f6e8191461054557806327fca4f71461055b578063393f68a31461057b5780633ccfd60b1461059157600080fd5b806317831a53146104c157806320e9c831146104e5578063229ebae51461050557806323b872dd1461052557600080fd5b8063081812fc11610396578063081812fc14610436578063095ea7b31461046e578063120e9bd11461048e57806316ba10e0146104a157600080fd5b806301ffc9a7146103bd57806306fdde03146103f257806307b96ebf14610414575b600080fd5b3480156103c957600080fd5b506103dd6103d8366004612140565b610aa7565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b50610407610ab8565b6040516103e991906121ad565b34801561042057600080fd5b5061043461042f3660046121c0565b610b4a565b005b34801561044257600080fd5b506104566104513660046121c0565b610b57565b6040516001600160a01b0390911681526020016103e9565b34801561047a57600080fd5b506104346104893660046121f5565b610b80565b61043461049c3660046121c0565b610b8f565b3480156104ad57600080fd5b506104346104bc3660046122ab565b610c99565b3480156104cd57600080fd5b506104d761753081565b6040519081526020016103e9565b3480156104f157600080fd5b506104346105003660046121c0565b610cad565b34801561051157600080fd5b506104346105203660046121c0565b610cba565b34801561053157600080fd5b506104346105403660046122f4565b610cc7565b34801561055157600080fd5b506104d7600f5481565b34801561056757600080fd5b506104346105763660046121c0565b610d52565b34801561058757600080fd5b506104d760115481565b34801561059d57600080fd5b50610434610d5f565b3480156105b257600080fd5b506104d760125481565b3480156105c857600080fd5b50610434610e0b565b6104346105df3660046121c0565b610e1b565b3480156105f057600080fd5b506104346105ff3660046122f4565b610f15565b34801561061057600080fd5b5061043461061f3660046121c0565b610f35565b34801561063057600080fd5b506104d761271081565b34801561064657600080fd5b506104346106553660046121c0565b610f41565b34801561066657600080fd5b506104346106753660046121c0565b610f4e565b34801561068657600080fd5b50610407610f5b565b34801561069b57600080fd5b506104d761ea6081565b3480156106b157600080fd5b506104346106c03660046121c0565b610fe9565b3480156106d157600080fd5b5060065460ff166103dd565b3480156106e957600080fd5b506104346106f83660046121c0565b610ff6565b34801561070957600080fd5b50610407611003565b34801561071e57600080fd5b5061045661072d3660046121c0565b611010565b6104346107403660046121c0565b61101b565b34801561075157600080fd5b50610434610760366004612330565b611115565b34801561077157600080fd5b506104d7610780366004612374565b61126e565b34801561079157600080fd5b506104346112b6565b3480156107a657600080fd5b506104d7614e2081565b3480156107bc57600080fd5b506104346107cb3660046121c0565b6112c8565b3480156107dc57600080fd5b506018546103dd9060ff1681565b3480156107f657600080fd5b506104346108053660046122ab565b6112d5565b34801561081657600080fd5b506104346112e9565b34801561082b57600080fd5b506104d760105481565b34801561084157600080fd5b5060065461010090046001600160a01b0316610456565b34801561086457600080fd5b506104d760145481565b34801561087a57600080fd5b506104d760155481565b6104346108923660046121c0565b6112f9565b3480156108a357600080fd5b506104076113e2565b3480156108b857600080fd5b506104346108c73660046121c0565b6113f1565b3480156108d857600080fd5b506104346108e73660046121f5565b6113fe565b3480156108f857600080fd5b5061043461090736600461239f565b611410565b34801561091857600080fd5b506104346109273660046121c0565b61141b565b34801561093857600080fd5b506104346109473660046123d2565b611428565b34801561095857600080fd5b506104346109673660046123ed565b611443565b61043461097a3660046121c0565b61145a565b61043461098d3660046121c0565b611554565b34801561099e57600080fd5b506104346109ad3660046121c0565b61164e565b3480156109be57600080fd5b506104346109cd3660046121c0565b61165b565b3480156109de57600080fd5b506104346109ed3660046121c0565b611668565b3480156109fe57600080fd5b50610407610a0d3660046121c0565b611675565b348015610a1e57600080fd5b506104d760135481565b610434610a363660046121c0565b6116e0565b348015610a4757600080fd5b506104d7619c4081565b348015610a5d57600080fd5b506103dd610a6c366004612469565b6117da565b348015610a7d57600080fd5b50610434610a8c366004612374565b611808565b348015610a9d57600080fd5b506104d761c35081565b6000610ab282611846565b92915050565b606060008054610ac790612493565b80601f0160208091040260200160405190810160405280929190818152602001828054610af390612493565b8015610b405780601f10610b1557610100808354040283529160200191610b40565b820191906000526020600020905b815481529060010190602001808311610b2357829003601f168201915b5050505050905090565b610b52611896565b601355565b6000610b62826118c9565b506000828152600460205260409020546001600160a01b0316610ab2565b610b8b828233611902565b5050565b80610b9c60065460ff1690565b15610bc25760405162461bcd60e51b8152600401610bb9906124cd565b60405180910390fd5b600081118015610bd457506015548111155b610bf05760405162461bcd60e51b8152600401610bb9906124fa565b60135482610bfe818361253e565b341015610c1d5760405162461bcd60e51b8152600401610bb990612555565b60185460ff1615610c405760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c92576000619c40600c54610c5d91906125ba565b9050610c69338261190f565b600c8054906000610c79836125cd565b9190505550508080610c8a906125cd565b915050610c43565b5050505050565b610ca1611896565b6017610b8b8282612634565b610cb5611896565b601055565b610cc2611896565b600d55565b6001600160a01b038216610cf157604051633250574960e11b815260006004820152602401610bb9565b6000610cfe838333611929565b9050836001600160a01b0316816001600160a01b031614610d4c576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610bb9565b50505050565b610d5a611896565b600855565b610d67611896565b610d6f61193e565b604051600090339047908381818185875af1925050503d8060008114610db1576040519150601f19603f3d011682016040523d82523d6000602084013e610db6565b606091505b5050905080610dfe5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610bb9565b50610e096001600755565b565b610e13611896565b610e09611968565b80610e2860065460ff1690565b15610e455760405162461bcd60e51b8152600401610bb9906124cd565b600081118015610e5757506015548111155b610e735760405162461bcd60e51b8152600401610bb9906124fa565b60125482610e81818361253e565b341015610ea05760405162461bcd60e51b8152600401610bb990612555565b60185460ff1615610ec35760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c92576000617530600b54610ee091906125ba565b9050610eec338261190f565b600b8054906000610efc836125cd565b9190505550508080610f0d906125cd565b915050610ec6565b610f3083838360405180602001604052806000815250611443565b505050565b610b8b60008233611929565b610f49611896565b600955565b610f56611896565b600a55565b60178054610f6890612493565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9490612493565b8015610fe15780601f10610fb657610100808354040283529160200191610fe1565b820191906000526020600020905b815481529060010190602001808311610fc457829003601f168201915b505050505081565b610ff1611896565b600c55565b610ffe611896565b600e55565b60168054610f6890612493565b6000610ab2826118c9565b8061102860065460ff1690565b156110455760405162461bcd60e51b8152600401610bb9906124cd565b60008111801561105757506015548111155b6110735760405162461bcd60e51b8152600401610bb9906124fa565b60135482611081818361253e565b3410156110a05760405162461bcd60e51b8152600401610bb990612555565b60185460ff16156110c35760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c9257600061c350600d546110e091906125ba565b90506110ec338261190f565b600d80549060006110fc836125cd565b919050555050808061110d906125cd565b9150506110c6565b61111d611896565b60005b83811015610d4c5760008360ff166000036111505760088054906000611145836125cd565b919050559050611251565b8360ff16600103611183576009805461271091600061116e836125cd565b9190505561117c91906125ba565b9050611251565b8360ff166002036111a157600a8054614e2091600061116e836125cd565b8360ff166003036111bf57600b805461753091600061116e836125cd565b8360ff166004036111dd57600c8054619c4091600061116e836125cd565b8360ff166005036111fb57600d805461c35091600061116e836125cd565b8360ff1660060361121957600e805461ea6091600061116e836125cd565b60405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420746965722160981b6044820152606401610bb9565b61125b838261190f565b5080611266816125cd565b915050611120565b60006001600160a01b03821661129a576040516322718ad960e21b815260006004820152602401610bb9565b506001600160a01b031660009081526003602052604090205490565b6112be611896565b610e0960006119ba565b6112d0611896565b601255565b6112dd611896565b6016610b8b8282612634565b6112f1611896565b610e09611a14565b8061130660065460ff1690565b156113235760405162461bcd60e51b8152600401610bb9906124cd565b60008111801561133557506015548111155b6113515760405162461bcd60e51b8152600401610bb9906124fa565b600f548261135f818361253e565b34101561137e5760405162461bcd60e51b8152600401610bb990612555565b60185460ff16156113a15760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c92576008546113b9338261190f565b600880549060006113c9836125cd565b91905055505080806113da906125cd565b9150506113a4565b606060018054610ac790612493565b6113f9611896565b601455565b611406611896565b610b8b828261190f565b610b8b338383611a51565b611423611896565b601555565b611430611896565b6018805460ff1916911515919091179055565b61144e848484610cc7565b610d4c84848484611af0565b8061146760065460ff1690565b156114845760405162461bcd60e51b8152600401610bb9906124cd565b60008111801561149657506015548111155b6114b25760405162461bcd60e51b8152600401610bb9906124fa565b601054826114c0818361253e565b3410156114df5760405162461bcd60e51b8152600401610bb990612555565b60185460ff16156115025760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c9257600061271060095461151f91906125ba565b905061152b338261190f565b6009805490600061153b836125cd565b919050555050808061154c906125cd565b915050611505565b8061156160065460ff1690565b1561157e5760405162461bcd60e51b8152600401610bb9906124cd565b60008111801561159057506015548111155b6115ac5760405162461bcd60e51b8152600401610bb9906124fa565b601454826115ba818361253e565b3410156115d95760405162461bcd60e51b8152600401610bb990612555565b60185460ff16156115fc5760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c9257600061ea60600e5461161991906125ba565b9050611625338261190f565b600e8054906000611635836125cd565b9190505550508080611646906125cd565b9150506115ff565b611656611896565b600f55565b611663611896565b601155565b611670611896565b600b55565b6060611680826118c9565b50600061168b611c12565b905060008151116116ab57604051806020016040528060008152506116d9565b806116b584611c21565b60176040516020016116c9939291906126f4565b6040516020818303038152906040525b9392505050565b806116ed60065460ff1690565b1561170a5760405162461bcd60e51b8152600401610bb9906124cd565b60008111801561171c57506015548111155b6117385760405162461bcd60e51b8152600401610bb9906124fa565b60115482611746818361253e565b3410156117655760405162461bcd60e51b8152600401610bb990612555565b60185460ff16156117885760405162461bcd60e51b8152600401610bb990612583565b60005b84811015610c92576000614e20600a546117a591906125ba565b90506117b1338261190f565b600a80549060006117c1836125cd565b91905055505080806117d2906125cd565b91505061178b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611810611896565b6001600160a01b03811661183a57604051631e4fbdf760e01b815260006004820152602401610bb9565b611843816119ba565b50565b60006001600160e01b031982166380ac58cd60e01b148061187757506001600160e01b03198216635b5e139f60e01b145b80610ab257506301ffc9a760e01b6001600160e01b0319831614610ab2565b6006546001600160a01b03610100909104163314610e095760405163118cdaa760e01b8152336004820152602401610bb9565b6000818152600260205260408120546001600160a01b031680610ab257604051637e27328960e01b815260048101849052602401610bb9565b610f308383836001611cb4565b610b8b828260405180602001604052806000815250611dba565b6000611936848484611dd1565b949350505050565b60026007540361196157604051633ee5aeb560e01b815260040160405180910390fd5b6002600755565b611970611de6565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a1c611e09565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861199d3390565b6001600160a01b038216611a8357604051630b61174360e31b81526001600160a01b0383166004820152602401610bb9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15610d4c57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611b32903390889087908790600401612794565b6020604051808303816000875af1925050508015611b6d575060408051601f3d908101601f19168201909252611b6a918101906127d1565b60015b611bd6573d808015611b9b576040519150601f19603f3d011682016040523d82523d6000602084013e611ba0565b606091505b508051600003611bce57604051633250574960e11b81526001600160a01b0385166004820152602401610bb9565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14610c9257604051633250574960e11b81526001600160a01b0385166004820152602401610bb9565b606060168054610ac790612493565b60606000611c2e83611e2d565b600101905060008167ffffffffffffffff811115611c4e57611c4e61221f565b6040519080825280601f01601f191660200182016040528015611c78576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c8257509392505050565b8080611cc857506001600160a01b03821615155b15611d8a576000611cd8846118c9565b90506001600160a01b03831615801590611d045750826001600160a01b0316816001600160a01b031614155b8015611d175750611d1581846117da565b155b15611d405760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610bb9565b8115611d885783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b611dc48383611f05565b610f306000848484611af0565b6000611ddb611e09565b611936848484611f6a565b60065460ff16610e0957604051638dfc202b60e01b815260040160405180910390fd5b60065460ff1615610e095760405163d93c066560e01b815260040160405180910390fd5b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e6c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611e98576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611eb657662386f26fc10000830492506010015b6305f5e1008310611ece576305f5e100830492506008015b6127108310611ee257612710830492506004015b60648310611ef4576064830492506002015b600a8310610ab25760010192915050565b6001600160a01b038216611f2f57604051633250574960e11b815260006004820152602401610bb9565b6000611f3d83836000611929565b90506001600160a01b03811615610f30576040516339e3563760e11b815260006004820152602401610bb9565b6000828152600260205260408120546001600160a01b0390811690831615611f9757611f97818486612063565b6001600160a01b03811615611fd557611fb4600085600080611cb4565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615612004576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b61206e8383836120c7565b610f30576001600160a01b03831661209c57604051637e27328960e01b815260048101829052602401610bb9565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610bb9565b60006001600160a01b038316158015906119365750826001600160a01b0316846001600160a01b03161480612101575061210184846117da565b806119365750506000908152600460205260409020546001600160a01b03908116911614919050565b6001600160e01b03198116811461184357600080fd5b60006020828403121561215257600080fd5b81356116d98161212a565b60005b83811015612178578181015183820152602001612160565b50506000910152565b6000815180845261219981602086016020860161215d565b601f01601f19169290920160200192915050565b6020815260006116d96020830184612181565b6000602082840312156121d257600080fd5b5035919050565b80356001600160a01b03811681146121f057600080fd5b919050565b6000806040838503121561220857600080fd5b612211836121d9565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122505761225061221f565b604051601f8501601f19908116603f011681019082821181831017156122785761227861221f565b8160405280935085815286868601111561229157600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156122bd57600080fd5b813567ffffffffffffffff8111156122d457600080fd5b8201601f810184136122e557600080fd5b61193684823560208401612235565b60008060006060848603121561230957600080fd5b612312846121d9565b9250612320602085016121d9565b9150604084013590509250925092565b60008060006060848603121561234557600080fd5b83359250602084013560ff8116811461235d57600080fd5b915061236b604085016121d9565b90509250925092565b60006020828403121561238657600080fd5b6116d9826121d9565b803580151581146121f057600080fd5b600080604083850312156123b257600080fd5b6123bb836121d9565b91506123c96020840161238f565b90509250929050565b6000602082840312156123e457600080fd5b6116d98261238f565b6000806000806080858703121561240357600080fd5b61240c856121d9565b935061241a602086016121d9565b925060408501359150606085013567ffffffffffffffff81111561243d57600080fd5b8501601f8101871361244e57600080fd5b61245d87823560208401612235565b91505092959194509250565b6000806040838503121561247c57600080fd5b612485836121d9565b91506123c9602084016121d9565b600181811c908216806124a757607f821691505b6020821081036124c757634e487b7160e01b600052602260045260246000fd5b50919050565b602080825260139082015272546865206d696e74206973207061757365642160681b604082015260600190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ab257610ab2612528565b602080825260149082015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b604082015260600190565b60208082526018908201527f5075626c6963206d696e74696e67206973207061757365640000000000000000604082015260600190565b80820180821115610ab257610ab2612528565b6000600182016125df576125df612528565b5060010190565b601f821115610f3057600081815260208120601f850160051c8101602086101561260d5750805b601f850160051c820191505b8181101561262c57828155600101612619565b505050505050565b815167ffffffffffffffff81111561264e5761264e61221f565b6126628161265c8454612493565b846125e6565b602080601f831160018114612697576000841561267f5750858301515b600019600386901b1c1916600185901b17855561262c565b600085815260208120601f198616915b828110156126c6578886015182559484019460019091019084016126a7565b50858210156126e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000845160206127078285838a0161215d565b85519184019161271a8184848a0161215d565b855492019160009061272b81612493565b60018281168015612743576001811461275857612784565b60ff1984168752821515830287019450612784565b896000528560002060005b8481101561277c57815489820152908301908701612763565b505082870194505b50929a9950505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127c790830184612181565b9695505050505050565b6000602082840312156127e357600080fd5b81516116d98161212a56fea26469706673582212204263bbbab9502fda980a96042f545637aa43155f481859bcd474db92ba69864a64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cdfaff850e2427f8aad21b642ae8b4216061869e
-----Decoded View---------------
Arg [0] : initialOwner (address): 0xCDfaff850E2427F8aaD21b642aE8B4216061869E
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000cdfaff850e2427f8aad21b642ae8b4216061869e
Deployed Bytecode Sourcemap
433:8499:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8519:187;;;;;;;;;;-1:-1:-1;8519:187:16;;;;;:::i;:::-;;:::i;:::-;;;565:14:17;;558:22;540:41;;528:2;513:18;8519:187:16;;;;;;;;2365:89:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6453:104:16:-;;;;;;;;;;-1:-1:-1;6453:104:16;;;;;:::i;:::-;;:::i;:::-;;3497:154:2;;;;;;;;;;-1:-1:-1;3497:154:2;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:17;;;1679:51;;1667:2;1652:18;3497:154:2;1533:203:17;3323:113:2;;;;;;;;;;-1:-1:-1;3323:113:2;;;;;:::i;:::-;;:::i;4032:335:16:-;;;;;;:::i;:::-;;:::i;6917:104::-;;;;;;;;;;-1:-1:-1;6917:104:16;;;;;:::i;:::-;;:::i;953:47::-;;;;;;;;;;;;995:5;953:47;;;;;3549:25:17;;;3537:2;3522:18;953:47:16;3403:177:17;6131:100:16;;;;;;;;;;-1:-1:-1;6131:100:16;;;;;:::i;:::-;;:::i;7625:108::-;;;;;;;;;;-1:-1:-1;7625:108:16;;;;;:::i;:::-;;:::i;4143:578:2:-;;;;;;;;;;-1:-1:-1;4143:578:2;;;;;:::i;:::-;;:::i;1158:41:16:-;;;;;;;;;;;;;;;;7027:114;;;;;;;;;;-1:-1:-1;7027:114:16;;;;;:::i;:::-;;:::i;1253:42::-;;;;;;;;;;;;;;;;8712:218;;;;;;;;;;;;;:::i;1301:42::-;;;;;;;;;;;;;;;;2414:63;;;;;;;;;;;;;:::i;3681:345::-;;;;;;:::i;:::-;;:::i;4787:132:2:-;;;;;;;;;;-1:-1:-1;4787:132:2;;;;;:::i;:::-;;:::i;561:314:5:-;;;;;;;;;;-1:-1:-1;561:314:5;;;;;:::i;:::-;;:::i;845:47:16:-;;;;;;;;;;;;887:5;845:47;;7147:114;;;;;;;;;;-1:-1:-1;7147:114:16;;;;;:::i;:::-;;:::i;7267:118::-;;;;;;;;;;-1:-1:-1;7267:118:16;;;;;:::i;:::-;;:::i;1569:33::-;;;;;;;;;;;;;:::i;1106:45::-;;;;;;;;;;;;1146:5;1106:45;;7511:108;;;;;;;;;;-1:-1:-1;7511:108:16;;;;;:::i;:::-;;:::i;1850:84:9:-;;;;;;;;;;-1:-1:-1;1920:7:9;;;;1850:84;;7739:110:16;;;;;;;;;;-1:-1:-1;7739:110:16;;;;;:::i;:::-;;:::i;1489:74::-;;;;;;;;;;;;;:::i;2185:118:2:-;;;;;;;;;;-1:-1:-1;2185:118:2;;;;;:::i;:::-;;:::i;4373:335:16:-;;;;;;:::i;:::-;;:::i;5055:963::-;;;;;;;;;;-1:-1:-1;5055:963:16;;;;;:::i;:::-;;:::i;1920:208:2:-;;;;;;;;;;-1:-1:-1;1920:208:2;;;;;:::i;:::-;;:::i;2293:101:0:-;;;;;;;;;;;;;:::i;898:49:16:-;;;;;;;;;;;;942:5;898:49;;6347:100;;;;;;;;;;-1:-1:-1;6347:100:16;;;;;:::i;:::-;;:::i;1609:30::-;;;;;;;;;;-1:-1:-1;1609:30:16;;;;;;;;6807:104;;;;;;;;;;-1:-1:-1;6807:104:16;;;;;:::i;:::-;;:::i;2349:59::-;;;;;;;;;;;;;:::i;1205:42::-;;;;;;;;;;;;;;;;1638:85:0;;;;;;;;;;-1:-1:-1;1710:6:0;;;;;-1:-1:-1;;;;;1710:6:0;1638:85;;1398:39:16;;;;;;;;;;;;;;;;1444:38;;;;;;;;;;;;;;;;2592:371;;;;;;:::i;:::-;;:::i;2518:93:2:-;;;;;;;;;;;;;:::i;6563:96:16:-;;;;;;;;;;-1:-1:-1;6563:96:16;;;;;:::i;:::-;;:::i;2483:103::-;;;;;;;;;;-1:-1:-1;2483:103:16;;;;;:::i;:::-;;:::i;3718:144:2:-;;;;;;;;;;-1:-1:-1;3718:144:2;;;;;:::i;:::-;;:::i;6665:136:16:-;;;;;;;;;;-1:-1:-1;6665:136:16;;;;;:::i;:::-;;:::i;2252:91::-;;;;;;;;;;-1:-1:-1;2252:91:16;;;;;:::i;:::-;;:::i;4985:208:2:-;;;;;;;;;;-1:-1:-1;4985:208:2;;;;;:::i;:::-;;:::i;2969:345:16:-;;;;;;:::i;:::-;;:::i;4714:335::-;;;;;;:::i;:::-;;:::i;6025:100::-;;;;;;;;;;-1:-1:-1;6025:100:16;;;;;:::i;:::-;;:::i;6237:104::-;;;;;;;;;;-1:-1:-1;6237:104:16;;;;;:::i;:::-;;:::i;7391:114::-;;;;;;;;;;-1:-1:-1;7391:114:16;;;;;:::i;:::-;;:::i;7969:334::-;;;;;;;;;;-1:-1:-1;7969:334:16;;;;;:::i;:::-;;:::i;1349:43::-;;;;;;;;;;;;;;;;3320:355;;;;;;:::i;:::-;;:::i;1006:44::-;;;;;;;;;;;;1045:5;1006:44;;3928:153:2;;;;;;;;;;-1:-1:-1;3928:153:2;;;;;:::i;:::-;;:::i;2543:215:0:-;;;;;;;;;;-1:-1:-1;2543:215:0;;;;;:::i;:::-;;:::i;1056:44:16:-;;;;;;;;;;;;1095:5;1056:44;;8519:187;8636:4;8663:36;8687:11;8663:23;:36::i;:::-;8656:43;8519:187;-1:-1:-1;;8519:187:16:o;2365:89:2:-;2410:13;2442:5;2435:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2365:89;:::o;6453:104:16:-;1531:13:0;:11;:13::i;:::-;6526:15:16::1;:24:::0;6453:104::o;3497:154:2:-;3564:7;3583:22;3597:7;3583:13;:22::i;:::-;-1:-1:-1;6008:7:2;6034:24;;;:15;:24;;;;;;-1:-1:-1;;;;;6034:24:2;3623:21;5938:127;3323:113;3394:35;3403:2;3407:7;735:10:8;3394:8:2;:35::i;:::-;3323:113;;:::o;4032:335:16:-;4100:7;1826:8;1920:7:9;;;;;1850:84;1826:8:16;1825:9;1817:41;;;;-1:-1:-1;;;1817:41:16;;;;;;;:::i;:::-;;;;;;;;;1890:1;1876:11;:15;:52;;;;;1910:18;;1895:11;:33;;1876:52;1868:85;;;;-1:-1:-1;;;1868:85:16;;;;;;;:::i;:::-;4127:15:::1;::::0;4144:7;2072:20:::1;4144:7:::0;4127:15;2072:20:::1;:::i;:::-;2059:9;:33;;2051:66;;;;-1:-1:-1::0;;;2051:66:16::1;;;;;;;:::i;:::-;2189:10:::2;::::0;::::2;;2188:11;2180:48;;;;-1:-1:-1::0;;;2180:48:16::2;;;;;;;:::i;:::-;4186:9:::3;4181:180;4205:7;4201:1;:11;4181:180;;;4233:15;1045:5;4251:12;;:27;;;;:::i;:::-;4233:45;;4292:30;4302:10;4314:7;4292:9;:30::i;:::-;4336:12;:14:::0;;;:12:::3;:14;::::0;::::3;:::i;:::-;;;;;;4219:142;4214:3;;;;;:::i;:::-;;;;4181:180;;;;1963:1:::1;;4032:335:::0;;:::o;6917:104::-;1531:13:0;:11;:13::i;:::-;6992:9:16::1;:22;7004:10:::0;6992:9;:22:::1;:::i;6131:100::-:0;1531:13:0;:11;:13::i;:::-;6202::16::1;:22:::0;6131:100::o;7625:108::-;1531:13:0;:11;:13::i;:::-;7700:12:16::1;:26:::0;7625:108::o;4143:578:2:-;-1:-1:-1;;;;;4237:16:2;;4233:87;;4276:33;;-1:-1:-1;;;4276:33:2;;4306:1;4276:33;;;1679:51:17;1652:18;;4276:33:2;1533:203:17;4233:87:2;4538:21;4562:34;4570:2;4574:7;735:10:8;4562:7:2;:34::i;:::-;4538:58;;4627:4;-1:-1:-1;;;;;4610:21:2;:13;-1:-1:-1;;;;;4610:21:2;;4606:109;;4654:50;;-1:-1:-1;;;4654:50:2;;-1:-1:-1;;;;;10892:15:17;;;4654:50:2;;;10874:34:17;10924:18;;;10917:34;;;10987:15;;10967:18;;;10960:43;10809:18;;4654:50:2;10634:375:17;4606:109:2;4223:498;4143:578;;;:::o;7027:114:16:-;1531:13:0;:11;:13::i;:::-;7105:15:16::1;:29:::0;7027:114::o;8712:218::-;1531:13:0;:11;:13::i;:::-;2356:21:10::1;:19;:21::i;:::-;8793:80:16::2;::::0;8775:12:::2;::::0;8801:10:::2;::::0;8838:21:::2;::::0;8775:12;8793:80;8775:12;8793:80;8838:21;8801:10;8793:80:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8774:99;;;8891:7;8883:40;;;::::0;-1:-1:-1;;;8883:40:16;;11426:2:17;8883:40:16::2;::::0;::::2;11408:21:17::0;11465:2;11445:18;;;11438:30;-1:-1:-1;;;11484:18:17;;;11477:50;11544:18;;8883:40:16::2;11224:344:17::0;8883:40:16::2;8764:166;2398:20:10::1;1713:1:::0;2924:7;:21;2744:208;2398:20:::1;8712:218:16:o:0;2414:63::-;1531:13:0;:11;:13::i;:::-;2460:10:16::1;:8;:10::i;3681:345::-:0;3752:7;1826:8;1920:7:9;;;;;1850:84;1826:8:16;1825:9;1817:41;;;;-1:-1:-1;;;1817:41:16;;;;;;;:::i;:::-;1890:1;1876:11;:15;:52;;;;;1910:18;;1895:11;:33;;1876:52;1868:85;;;;-1:-1:-1;;;1868:85:16;;;;;;;:::i;:::-;3779:13:::1;::::0;3794:7;2072:20:::1;3794:7:::0;3779:13;2072:20:::1;:::i;:::-;2059:9;:33;;2051:66;;;;-1:-1:-1::0;;;2051:66:16::1;;;;;;;:::i;:::-;2189:10:::2;::::0;::::2;;2188:11;2180:48;;;;-1:-1:-1::0;;;2180:48:16::2;;;;;;;:::i;:::-;3836:9:::3;3831:189;3855:7;3851:1;:11;3831:189;;;3883:15;995:5;3901:15;;:33;;;;:::i;:::-;3883:51;;3948:30;3958:10;3970:7;3948:9;:30::i;:::-;3992:15;:17:::0;;;:15:::3;:17;::::0;::::3;:::i;:::-;;;;;;3869:151;3864:3;;;;;:::i;:::-;;;;3831:189;;4787:132:2::0;4873:39;4890:4;4896:2;4900:7;4873:39;;;;;;;;;;;;:16;:39::i;:::-;4787:132;;;:::o;561:314:5:-;826:42;842:1;846:7;735:10:8;4562:7:2;:34::i;7147:114:16:-;1531:13:0;:11;:13::i;:::-;7225:15:16::1;:29:::0;7147:114::o;7267:118::-;1531:13:0;:11;:13::i;:::-;7347:17:16::1;:31:::0;7267:118::o;1569:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7511:108::-;1531:13:0;:11;:13::i;:::-;7586:12:16::1;:26:::0;7511:108::o;7739:110::-;1531:13:0;:11;:13::i;:::-;7815::16::1;:27:::0;7739:110::o;1489:74::-;;;;;;;:::i;2185:118:2:-;2248:7;2274:22;2288:7;2274:13;:22::i;4373:335:16:-;4441:7;1826:8;1920:7:9;;;;;1850:84;1826:8:16;1825:9;1817:41;;;;-1:-1:-1;;;1817:41:16;;;;;;;:::i;:::-;1890:1;1876:11;:15;:52;;;;;1910:18;;1895:11;:33;;1876:52;1868:85;;;;-1:-1:-1;;;1868:85:16;;;;;;;:::i;:::-;4468:15:::1;::::0;4485:7;2072:20:::1;4485:7:::0;4468:15;2072:20:::1;:::i;:::-;2059:9;:33;;2051:66;;;;-1:-1:-1::0;;;2051:66:16::1;;;;;;;:::i;:::-;2189:10:::2;::::0;::::2;;2188:11;2180:48;;;;-1:-1:-1::0;;;2180:48:16::2;;;;;;;:::i;:::-;4527:9:::3;4522:180;4546:7;4542:1;:11;4522:180;;;4574:15;1095:5;4592:12;;:27;;;;:::i;:::-;4574:45;;4633:30;4643:10;4655:7;4633:9;:30::i;:::-;4677:12;:14:::0;;;:12:::3;:14;::::0;::::3;:::i;:::-;;;;;;4560:142;4555:3;;;;;:::i;:::-;;;;4522:180;;5055:963:::0;1531:13:0;:11;:13::i;:::-;5156:9:16::1;5151:861;5175:7;5171:1;:11;5151:861;;;5203:15;5236:5;:10;;5245:1;5236:10:::0;5232:726:::1;;5276:15;:17:::0;;;:15:::1;:17;::::0;::::1;:::i;:::-;;;;;5266:27;;5232:726;;;5318:5;:10;;5327:1;5318:10:::0;5314:644:::1;;5358:15;:17:::0;;887:5:::1;::::0;5358:15:::1;:17;::::0;::::1;:::i;:::-;;;;;:35;;;;:::i;:::-;5348:45;;5314:644;;;5418:5;:10;;5427:1;5418:10:::0;5414:544:::1;;5458:17;:19:::0;;942:5:::1;::::0;5458:17:::1;:19;::::0;::::1;:::i;5414:544::-;5522:5;:10;;5531:1;5522:10:::0;5518:440:::1;;5562:15;:17:::0;;995:5:::1;::::0;5562:15:::1;:17;::::0;::::1;:::i;5518:440::-;5622:5;:10;;5631:1;5622:10:::0;5618:340:::1;;5662:12;:14:::0;;1045:5:::1;::::0;5662:12:::1;:14;::::0;::::1;:::i;5618:340::-;5716:5;:10;;5725:1;5716:10:::0;5712:246:::1;;5756:12;:14:::0;;1095:5:::1;::::0;5756:12:::1;:14;::::0;::::1;:::i;5712:246::-;5810:5;:10;;5819:1;5810:10:::0;5806:152:::1;;5850:13;:15:::0;;1146:5:::1;::::0;5850:13:::1;:15;::::0;::::1;:::i;5806:152::-;5920:23;::::0;-1:-1:-1;;;5920:23:16;;11775:2:17;5920:23:16::1;::::0;::::1;11757:21:17::0;11814:2;11794:18;;;11787:30;-1:-1:-1;;;11833:18:17;;;11826:43;11886:18;;5920:23:16::1;11573:337:17::0;5806:152:16::1;5971:30;5981:10;5993:7;5971:9;:30::i;:::-;-1:-1:-1::0;5184:3:16;::::1;::::0;::::1;:::i;:::-;;;;5151:861;;1920:208:2::0;1983:7;-1:-1:-1;;;;;2006:19:2;;2002:87;;2048:30;;-1:-1:-1;;;2048:30:2;;2075:1;2048:30;;;1679:51:17;1652:18;;2048:30:2;1533:203:17;2002:87:2;-1:-1:-1;;;;;;2105:16:2;;;;;:9;:16;;;;;;;1920:208::o;2293:101:0:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;6347:100:16:-:0;1531:13:0;:11;:13::i;:::-;6418::16::1;:22:::0;6347:100::o;6807:104::-;1531:13:0;:11;:13::i;:::-;6882:9:16::1;:22;6894:10:::0;6882:9;:22:::1;:::i;2349:59::-:0;1531:13:0;:11;:13::i;:::-;2393:8:16::1;:6;:8::i;2592:371::-:0;2687:7;1826:8;1920:7:9;;;;;1850:84;1826:8:16;1825:9;1817:41;;;;-1:-1:-1;;;1817:41:16;;;;;;;:::i;:::-;1890:1;1876:11;:15;:52;;;;;1910:18;;1895:11;:33;;1876:52;1868:85;;;;-1:-1:-1;;;1868:85:16;;;;;;;:::i;:::-;2722:13:::1;::::0;2737:7;2072:20:::1;2737:7:::0;2722:13;2072:20:::1;:::i;:::-;2059:9;:33;;2051:66;;;;-1:-1:-1::0;;;2051:66:16::1;;;;;;;:::i;:::-;2189:10:::2;::::0;::::2;;2188:11;2180:48;;;;-1:-1:-1::0;;;2180:48:16::2;;;;;;;:::i;:::-;2791:9:::3;2786:171;2810:7;2806:1;:11;2786:171;;;2856:15;::::0;2885:30:::3;2895:10;2856:15:::0;2885:9:::3;:30::i;:::-;2929:15;:17:::0;;;:15:::3;:17;::::0;::::3;:::i;:::-;;;;;;2824:133;2819:3;;;;;:::i;:::-;;;;2786:171;;2518:93:2::0;2565:13;2597:7;2590:14;;;;;:::i;6563:96:16:-;1531:13:0;:11;:13::i;:::-;6632:11:16::1;:20:::0;6563:96::o;2483:103::-;1531:13:0;:11;:13::i;:::-;2557:22:16::1;2567:2;2571:7;2557:9;:22::i;3718:144:2:-:0;3803:52;735:10:8;3836:8:2;3846;3803:18;:52::i;6665:136:16:-;1531:13:0;:11;:13::i;:::-;6754:18:16::1;:40:::0;6665:136::o;2252:91::-;1531:13:0;:11;:13::i;:::-;2317:10:16::1;:19:::0;;-1:-1:-1;;2317:19:16::1;::::0;::::1;;::::0;;;::::1;::::0;;2252:91::o;4985:208:2:-;5098:31;5111:4;5117:2;5121:7;5098:12;:31::i;:::-;5139:47;5162:4;5168:2;5172:7;5181:4;5139:22;:47::i;2969:345:16:-;3040:7;1826:8;1920:7:9;;;;;1850:84;1826:8:16;1825:9;1817:41;;;;-1:-1:-1;;;1817:41:16;;;;;;;:::i;:::-;1890:1;1876:11;:15;:52;;;;;1910:18;;1895:11;:33;;1876:52;1868:85;;;;-1:-1:-1;;;1868:85:16;;;;;;;:::i;:::-;3067:13:::1;::::0;3082:7;2072:20:::1;3082:7:::0;3067:13;2072:20:::1;:::i;:::-;2059:9;:33;;2051:66;;;;-1:-1:-1::0;;;2051:66:16::1;;;;;;;:::i;:::-;2189:10:::2;::::0;::::2;;2188:11;2180:48;;;;-1:-1:-1::0;;;2180:48:16::2;;;;;;;:::i;:::-;3124:9:::3;3119:189;3143:7;3139:1;:11;3119:189;;;3171:15;887:5;3189:15;;:33;;;;:::i;:::-;3171:51;;3236:30;3246:10;3258:7;3236:9;:30::i;:::-;3280:15;:17:::0;;;:15:::3;:17;::::0;::::3;:::i;:::-;;;;;;3157:151;3152:3;;;;;:::i;:::-;;;;3119:189;;4714:335:::0;4783:7;1826:8;1920:7:9;;;;;1850:84;1826:8:16;1825:9;1817:41;;;;-1:-1:-1;;;1817:41:16;;;;;;;:::i;:::-;1890:1;1876:11;:15;:52;;;;;1910:18;;1895:11;:33;;1876:52;1868:85;;;;-1:-1:-1;;;1868:85:16;;;;;;;:::i;:::-;4810:11:::1;::::0;4823:7;2072:20:::1;4823:7:::0;4810:11;2072:20:::1;:::i;:::-;2059:9;:33;;2051:66;;;;-1:-1:-1::0;;;2051:66:16::1;;;;;;;:::i;:::-;2189:10:::2;::::0;::::2;;2188:11;2180:48;;;;-1:-1:-1::0;;;2180:48:16::2;;;;;;;:::i;:::-;4865:9:::3;4860:183;4884:7;4880:1;:11;4860:183;;;4912:15;1146:5;4930:13;;:29;;;;:::i;:::-;4912:47;;4973:30;4983:10;4995:7;4973:9;:30::i;:::-;5017:13;:15:::0;;;:13:::3;:15;::::0;::::3;:::i;:::-;;;;;;4898:145;4893:3;;;;;:::i;:::-;;;;4860:183;;6025:100:::0;1531:13:0;:11;:13::i;:::-;6096::16::1;:22:::0;6025:100::o;6237:104::-;1531:13:0;:11;:13::i;:::-;6310:15:16::1;:24:::0;6237:104::o;7391:114::-;1531:13:0;:11;:13::i;:::-;7469:15:16::1;:29:::0;7391:114::o;7969:334::-;8043:13;8068:23;8082:8;8068:13;:23::i;:::-;;8102:28;8133:10;:8;:10::i;:::-;8102:41;;8191:1;8166:14;8160:28;:32;:136;;;;;;;;;;;;;;;;;8231:14;8247:19;:8;:17;:19::i;:::-;8268:9;8214:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8160:136;8153:143;7969:334;-1:-1:-1;;;7969:334:16:o;3320:355::-;3393:7;1826:8;1920:7:9;;;;;1850:84;1826:8:16;1825:9;1817:41;;;;-1:-1:-1;;;1817:41:16;;;;;;;:::i;:::-;1890:1;1876:11;:15;:52;;;;;1910:18;;1895:11;:33;;1876:52;1868:85;;;;-1:-1:-1;;;1868:85:16;;;;;;;:::i;:::-;3420:15:::1;::::0;3437:7;2072:20:::1;3437:7:::0;3420:15;2072:20:::1;:::i;:::-;2059:9;:33;;2051:66;;;;-1:-1:-1::0;;;2051:66:16::1;;;;;;;:::i;:::-;2189:10:::2;::::0;::::2;;2188:11;2180:48;;;;-1:-1:-1::0;;;2180:48:16::2;;;;;;;:::i;:::-;3479:9:::3;3474:195;3498:7;3494:1;:11;3474:195;;;3526:15;942:5;3544:17;;:37;;;;:::i;:::-;3526:55;;3595:30;3605:10;3617:7;3595:9;:30::i;:::-;3639:17;:19:::0;;;:17:::3;:19;::::0;::::3;:::i;:::-;;;;;;3512:157;3507:3;;;;;:::i;:::-;;;;3474:195;;3928:153:2::0;-1:-1:-1;;;;;4039:25:2;;;4016:4;4039:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;3928:153::o;2543:215:0:-;1531:13;:11;:13::i;:::-;-1:-1:-1;;;;;2627:22:0;::::1;2623:91;;2672:31;::::0;-1:-1:-1;;;2672:31:0;;2700:1:::1;2672:31;::::0;::::1;1679:51:17::0;1652:18;;2672:31:0::1;1533:203:17::0;2623:91:0::1;2723:28;2742:8;2723:18;:28::i;:::-;2543:215:::0;:::o;1561:300:2:-;1663:4;-1:-1:-1;;;;;;1698:40:2;;-1:-1:-1;;;1698:40:2;;:104;;-1:-1:-1;;;;;;;1754:48:2;;-1:-1:-1;;;1754:48:2;1698:104;:156;;;-1:-1:-1;;;;;;;;;;861:40:12;;;1818:36:2;762:146:12;1796:162:0;1710:6;;-1:-1:-1;;;;;1710:6:0;;;;;735:10:8;1855:23:0;1851:101;;1901:40;;-1:-1:-1;;;1901:40:0;;735:10:8;1901:40:0;;;1679:51:17;1652:18;;1901:40:0;1533:203:17;16138:241:2;16201:7;5799:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5799:16:2;;16263:88;;16309:31;;-1:-1:-1;;;16309:31:2;;;;;3549:25:17;;;3522:18;;16309:31:2;3403:177:17;14418:120:2;14498:33;14507:2;14511:7;14520:4;14526;14498:8;:33::i;10633:100::-;10700:26;10710:2;10714:7;10700:26;;;;;;;;;;;;:9;:26::i;8309:204:16:-;8444:7;8474:32;8488:2;8492:7;8501:4;8474:13;:32::i;:::-;8467:39;8309:204;-1:-1:-1;;;;8309:204:16:o;2431:307:10:-;1755:1;2558:7;;:18;2554:86;;2599:30;;-1:-1:-1;;;2599:30:10;;;;;;;;;;;2554:86;1755:1;2714:7;:17;2431:307::o;2710:117:9:-;1721:16;:14;:16::i;:::-;2768:7:::1;:15:::0;;-1:-1:-1;;2768:15:9::1;::::0;;2798:22:::1;735:10:8::0;2807:12:9::1;2798:22;::::0;-1:-1:-1;;;;;1697:32:17;;;1679:51;;1667:2;1652:18;2798:22:9::1;;;;;;;2710:117::o:0;2912:187:0:-;3004:6;;;-1:-1:-1;;;;;3020:17:0;;;3004:6;3020:17;;;-1:-1:-1;;;;;;3020:17:0;;;;;;3052:40;;3004:6;;;;;;;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;2463:115:9:-;1474:19;:17;:19::i;:::-;2522:7:::1;:14:::0;;-1:-1:-1;;2522:14:9::1;2532:4;2522:14;::::0;;2551:20:::1;2558:12;735:10:8::0;;656:96;15591:312:2;-1:-1:-1;;;;;15698:22:2;;15694:91;;15743:31;;-1:-1:-1;;;15743:31:2;;-1:-1:-1;;;;;1697:32:17;;15743:31:2;;;1679:51:17;1652:18;;15743:31:2;1533:203:17;15694:91:2;-1:-1:-1;;;;;15794:25:2;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;15794:46:2;;;;;;;;;;15855:41;;540::17;;;15855::2;;513:18:17;15855:41:2;;;;;;;15591:312;;;:::o;16918:782::-;-1:-1:-1;;;;;17034:14:2;;;:18;17030:664;;17072:71;;-1:-1:-1;;;17072:71:2;;-1:-1:-1;;;;;17072:36:2;;;;;:71;;735:10:8;;17123:4:2;;17129:7;;17138:4;;17072:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17072:71:2;;;;;;;;-1:-1:-1;;17072:71:2;;;;;;;;;;;;:::i;:::-;;;17068:616;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17381:6;:13;17398:1;17381:18;17377:293;;17430:25;;-1:-1:-1;;;17430:25:2;;-1:-1:-1;;;;;1697:32:17;;17430:25:2;;;1679:51:17;1652:18;;17430:25:2;1533:203:17;17377:293:2;17622:6;17616:13;17607:6;17603:2;17599:15;17592:38;17068:616;-1:-1:-1;;;;;;17190:51:2;;-1:-1:-1;;;17190:51:2;17186:130;;17272:25;;-1:-1:-1;;;17272:25:2;;-1:-1:-1;;;;;1697:32:17;;17272:25:2;;;1679:51:17;1652:18;;17272:25:2;1533:203:17;7855:108:16;7915:13;7947:9;7940:16;;;;;:::i;637:698:11:-;693:13;742:14;759:17;770:5;759:10;:17::i;:::-;779:1;759:21;742:38;;794:20;828:6;817:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:18:11;-1:-1:-1;794:41:11;-1:-1:-1;955:28:11;;;971:2;955:28;1010:282;-1:-1:-1;;1041:5:11;-1:-1:-1;;;1175:2:11;1164:14;;1159:32;1041:5;1146:46;1236:2;1227:11;;;-1:-1:-1;1256:21:11;1010:282;1256:21;-1:-1:-1;1312:6:11;637:698;-1:-1:-1;;;637:698:11:o;14720:662:2:-;14880:9;:31;;;-1:-1:-1;;;;;;14893:18:2;;;;14880:31;14876:460;;;14927:13;14943:22;14957:7;14943:13;:22::i;:::-;14927:38;-1:-1:-1;;;;;;15093:18:2;;;;;;:35;;;15124:4;-1:-1:-1;;;;;15115:13:2;:5;-1:-1:-1;;;;;15115:13:2;;;15093:35;:69;;;;;15133:29;15150:5;15157:4;15133:16;:29::i;:::-;15132:30;15093:69;15089:142;;;15189:27;;-1:-1:-1;;;15189:27:2;;-1:-1:-1;;;;;1697:32:17;;15189:27:2;;;1679:51:17;1652:18;;15189:27:2;1533:203:17;15089:142:2;15249:9;15245:81;;;15303:7;15299:2;-1:-1:-1;;;;;15283:28:2;15292:5;-1:-1:-1;;;;;15283:28:2;;;;;;;;;;;15245:81;14913:423;14876:460;-1:-1:-1;;15346:24:2;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;15346:29:2;-1:-1:-1;;;;;15346:29:2;;;;;;;;;;14720:662::o;10954:182::-;11048:18;11054:2;11058:7;11048:5;:18::i;:::-;11076:53;11107:1;11111:2;11115:7;11124:4;11076:22;:53::i;1120:204:6:-;1259:7;1474:19:9;:17;:19::i;:::-;1285:32:6::1;1299:2;1303:7;1312:4;1285:13;:32::i;2202:126:9:-:0;1920:7;;;;2260:62;;2296:15;;-1:-1:-1;;;2296:15:9;;;;;;;;;;;2002:128;1920:7;;;;2063:61;;;2098:15;;-1:-1:-1;;;2098:15:9;;;;;;;;;;;12214:916:14;12267:7;;-1:-1:-1;;;12342:17:14;;12338:103;;-1:-1:-1;;;12379:17:14;;;-1:-1:-1;12424:2:14;12414:12;12338:103;12467:8;12458:5;:17;12454:103;;12504:8;12495:17;;;-1:-1:-1;12540:2:14;12530:12;12454:103;12583:8;12574:5;:17;12570:103;;12620:8;12611:17;;;-1:-1:-1;12656:2:14;12646:12;12570:103;12699:7;12690:5;:16;12686:100;;12735:7;12726:16;;;-1:-1:-1;12770:1:14;12760:11;12686:100;12812:7;12803:5;:16;12799:100;;12848:7;12839:16;;;-1:-1:-1;12883:1:14;12873:11;12799:100;12925:7;12916:5;:16;12912:100;;12961:7;12952:16;;;-1:-1:-1;12996:1:14;12986:11;12912:100;13038:7;13029:5;:16;13025:66;;13075:1;13065:11;13117:6;12214:916;-1:-1:-1;;12214:916:14:o;9955:327:2:-;-1:-1:-1;;;;;10022:16:2;;10018:87;;10061:33;;-1:-1:-1;;;10061:33:2;;10091:1;10061:33;;;1679:51:17;1652:18;;10061:33:2;1533:203:17;10018:87:2;10114:21;10138:32;10146:2;10150:7;10167:1;10138:7;:32::i;:::-;10114:56;-1:-1:-1;;;;;;10184:27:2;;;10180:96;;10234:31;;-1:-1:-1;;;10234:31:2;;10262:1;10234:31;;;1679:51:17;1652:18;;10234:31:2;1533:203:17;8838:795:2;8924:7;5799:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5799:16:2;;;;9035:18;;;9031:86;;9069:37;9086:4;9092;9098:7;9069:16;:37::i;:::-;-1:-1:-1;;;;;9161:18:2;;;9157:256;;9277:48;9294:1;9298:7;9315:1;9319:5;9277:8;:48::i;:::-;-1:-1:-1;;;;;9368:15:2;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;9368:20:2;;;9157:256;-1:-1:-1;;;;;9427:16:2;;;9423:107;;-1:-1:-1;;;;;9487:13:2;;;;;;:9;:13;;;;;:18;;9504:1;9487:18;;;9423:107;9540:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9540:21:2;-1:-1:-1;;;;;9540:21:2;;;;;;;;;9577:27;;9540:16;;9577:27;;;;;;;9622:4;8838:795;-1:-1:-1;;;;8838:795:2:o;7082:368::-;7194:38;7208:5;7215:7;7224;7194:13;:38::i;:::-;7189:255;;-1:-1:-1;;;;;7252:19:2;;7248:186;;7298:31;;-1:-1:-1;;;7298:31:2;;;;;3549:25:17;;;3522:18;;7298:31:2;3403:177:17;7248:186:2;7375:44;;-1:-1:-1;;;7375:44:2;;-1:-1:-1;;;;;14248:32:17;;7375:44:2;;;14230:51:17;14297:18;;;14290:34;;;14203:18;;7375:44:2;14056:274:17;6376:272:2;6479:4;-1:-1:-1;;;;;6514:21:2;;;;;;:127;;;6561:7;-1:-1:-1;;;;;6552:16:2;:5;-1:-1:-1;;;;;6552:16:2;;:52;;;;6572:32;6589:5;6596:7;6572:16;:32::i;:::-;6552:88;;;-1:-1:-1;;6008:7:2;6034:24;;;:15;:24;;;;;;-1:-1:-1;;;;;6034:24:2;;;6608:32;;;;;-1:-1:-1;6376:272:2:o;14:131:17:-;-1:-1:-1;;;;;;88:32:17;;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:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:17;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:17;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:17:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:17;;1348:180;-1:-1:-1;1348:180:17:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:17;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:17:o;2178:127::-;2239:10;2234:3;2230:20;2227:1;2220:31;2270:4;2267:1;2260:15;2294:4;2291:1;2284:15;2310:632;2375:5;2405:18;2446:2;2438:6;2435:14;2432:40;;;2452:18;;:::i;:::-;2527:2;2521:9;2495:2;2581:15;;-1:-1:-1;;2577:24:17;;;2603:2;2573:33;2569:42;2557:55;;;2627:18;;;2647:22;;;2624:46;2621:72;;;2673:18;;:::i;:::-;2713:10;2709:2;2702:22;2742:6;2733:15;;2772:6;2764;2757:22;2812:3;2803:6;2798:3;2794:16;2791:25;2788:45;;;2829:1;2826;2819:12;2788:45;2879:6;2874:3;2867:4;2859:6;2855:17;2842:44;2934:1;2927:4;2918:6;2910;2906:19;2902:30;2895:41;;;;2310:632;;;;;:::o;2947:451::-;3016:6;3069:2;3057:9;3048:7;3044:23;3040:32;3037:52;;;3085:1;3082;3075:12;3037:52;3125:9;3112:23;3158:18;3150:6;3147:30;3144:50;;;3190:1;3187;3180:12;3144:50;3213:22;;3266:4;3258:13;;3254:27;-1:-1:-1;3244:55:17;;3295:1;3292;3285:12;3244:55;3318:74;3384:7;3379:2;3366:16;3361:2;3357;3353:11;3318:74;:::i;3585:328::-;3662:6;3670;3678;3731:2;3719:9;3710:7;3706:23;3702:32;3699:52;;;3747:1;3744;3737:12;3699:52;3770:29;3789:9;3770:29;:::i;:::-;3760:39;;3818:38;3852:2;3841:9;3837:18;3818:38;:::i;:::-;3808:48;;3903:2;3892:9;3888:18;3875:32;3865:42;;3585:328;;;;;:::o;3918:411::-;3993:6;4001;4009;4062:2;4050:9;4041:7;4037:23;4033:32;4030:52;;;4078:1;4075;4068:12;4030:52;4114:9;4101:23;4091:33;;4174:2;4163:9;4159:18;4146:32;4218:4;4211:5;4207:16;4200:5;4197:27;4187:55;;4238:1;4235;4228:12;4187:55;4261:5;-1:-1:-1;4285:38:17;4319:2;4304:18;;4285:38;:::i;:::-;4275:48;;3918:411;;;;;:::o;4334:186::-;4393:6;4446:2;4434:9;4425:7;4421:23;4417:32;4414:52;;;4462:1;4459;4452:12;4414:52;4485:29;4504:9;4485:29;:::i;4525:160::-;4590:20;;4646:13;;4639:21;4629:32;;4619:60;;4675:1;4672;4665:12;4690:254;4755:6;4763;4816:2;4804:9;4795:7;4791:23;4787:32;4784:52;;;4832:1;4829;4822:12;4784:52;4855:29;4874:9;4855:29;:::i;:::-;4845:39;;4903:35;4934:2;4923:9;4919:18;4903:35;:::i;:::-;4893:45;;4690:254;;;;;:::o;4949:180::-;5005:6;5058:2;5046:9;5037:7;5033:23;5029:32;5026:52;;;5074:1;5071;5064:12;5026:52;5097:26;5113:9;5097:26;:::i;5134:667::-;5229:6;5237;5245;5253;5306:3;5294:9;5285:7;5281:23;5277:33;5274:53;;;5323:1;5320;5313:12;5274:53;5346:29;5365:9;5346:29;:::i;:::-;5336:39;;5394:38;5428:2;5417:9;5413:18;5394:38;:::i;:::-;5384:48;;5479:2;5468:9;5464:18;5451:32;5441:42;;5534:2;5523:9;5519:18;5506:32;5561:18;5553:6;5550:30;5547:50;;;5593:1;5590;5583:12;5547:50;5616:22;;5669:4;5661:13;;5657:27;-1:-1:-1;5647:55:17;;5698:1;5695;5688:12;5647:55;5721:74;5787:7;5782:2;5769:16;5764:2;5760;5756:11;5721:74;:::i;:::-;5711:84;;;5134:667;;;;;;;:::o;5806:260::-;5874:6;5882;5935:2;5923:9;5914:7;5910:23;5906:32;5903:52;;;5951:1;5948;5941:12;5903:52;5974:29;5993:9;5974:29;:::i;:::-;5964:39;;6022:38;6056:2;6045:9;6041:18;6022:38;:::i;6071:380::-;6150:1;6146:12;;;;6193;;;6214:61;;6268:4;6260:6;6256:17;6246:27;;6214:61;6321:2;6313:6;6310:14;6290:18;6287:38;6284:161;;6367:10;6362:3;6358:20;6355:1;6348:31;6402:4;6399:1;6392:15;6430:4;6427:1;6420:15;6284:161;;6071:380;;;:::o;6456:343::-;6658:2;6640:21;;;6697:2;6677:18;;;6670:30;-1:-1:-1;;;6731:2:17;6716:18;;6709:49;6790:2;6775:18;;6456:343::o;6804:344::-;7006:2;6988:21;;;7045:2;7025:18;;;7018:30;-1:-1:-1;;;7079:2:17;7064:18;;7057:50;7139:2;7124:18;;6804:344::o;7153:127::-;7214:10;7209:3;7205:20;7202:1;7195:31;7245:4;7242:1;7235:15;7269:4;7266:1;7259:15;7285:168;7358:9;;;7389;;7406:15;;;7400:22;;7386:37;7376:71;;7427:18;;:::i;7458:344::-;7660:2;7642:21;;;7699:2;7679:18;;;7672:30;-1:-1:-1;;;7733:2:17;7718:18;;7711:50;7793:2;7778:18;;7458:344::o;7807:348::-;8009:2;7991:21;;;8048:2;8028:18;;;8021:30;8087:26;8082:2;8067:18;;8060:54;8146:2;8131:18;;7807:348::o;8160:125::-;8225:9;;;8246:10;;;8243:36;;;8259:18;;:::i;8290:135::-;8329:3;8350:17;;;8347:43;;8370:18;;:::i;:::-;-1:-1:-1;8417:1:17;8406:13;;8290:135::o;8556:545::-;8658:2;8653:3;8650:11;8647:448;;;8694:1;8719:5;8715:2;8708:17;8764:4;8760:2;8750:19;8834:2;8822:10;8818:19;8815:1;8811:27;8805:4;8801:38;8870:4;8858:10;8855:20;8852:47;;;-1:-1:-1;8893:4:17;8852:47;8948:2;8943:3;8939:12;8936:1;8932:20;8926:4;8922:31;8912:41;;9003:82;9021:2;9014:5;9011:13;9003:82;;;9066:17;;;9047:1;9036:13;9003:82;;;9007:3;;;8556:545;;;:::o;9277:1352::-;9403:3;9397:10;9430:18;9422:6;9419:30;9416:56;;;9452:18;;:::i;:::-;9481:97;9571:6;9531:38;9563:4;9557:11;9531:38;:::i;:::-;9525:4;9481:97;:::i;:::-;9633:4;;9697:2;9686:14;;9714:1;9709:663;;;;10416:1;10433:6;10430:89;;;-1:-1:-1;10485:19:17;;;10479:26;10430:89;-1:-1:-1;;9234:1:17;9230:11;;;9226:24;9222:29;9212:40;9258:1;9254:11;;;9209:57;10532:81;;9679:944;;9709:663;8503:1;8496:14;;;8540:4;8527:18;;-1:-1:-1;;9745:20:17;;;9863:236;9877:7;9874:1;9871:14;9863:236;;;9966:19;;;9960:26;9945:42;;10058:27;;;;10026:1;10014:14;;;;9893:19;;9863:236;;;9867:3;10127:6;10118:7;10115:19;10112:201;;;10188:19;;;10182:26;-1:-1:-1;;10271:1:17;10267:14;;;10283:3;10263:24;10259:37;10255:42;10240:58;10225:74;;10112:201;-1:-1:-1;;;;;10359:1:17;10343:14;;;10339:22;10326:36;;-1:-1:-1;9277:1352:17:o;11915:1256::-;12139:3;12177:6;12171:13;12203:4;12216:64;12273:6;12268:3;12263:2;12255:6;12251:15;12216:64;:::i;:::-;12343:13;;12302:16;;;;12365:68;12343:13;12302:16;12400:15;;;12365:68;:::i;:::-;12522:13;;12455:20;;;12495:1;;12560:36;12522:13;12560:36;:::i;:::-;12615:1;12632:18;;;12659:141;;;;12814:1;12809:337;;;;12625:521;;12659:141;-1:-1:-1;;12694:24:17;;12680:39;;12771:16;;12764:24;12750:39;;12739:51;;;-1:-1:-1;12659:141:17;;12809:337;12840:6;12837:1;12830:17;12888:2;12885:1;12875:16;12913:1;12927:169;12941:8;12938:1;12935:15;12927:169;;;13023:14;;13008:13;;;13001:37;13066:16;;;;12958:10;;12927:169;;;12931:3;;13127:8;13120:5;13116:20;13109:27;;12625:521;-1:-1:-1;13162:3:17;;11915:1256;-1:-1:-1;;;;;;;;;;11915:1256:17:o;13176:489::-;-1:-1:-1;;;;;13445:15:17;;;13427:34;;13497:15;;13492:2;13477:18;;13470:43;13544:2;13529:18;;13522:34;;;13592:3;13587:2;13572:18;;13565:31;;;13370:4;;13613:46;;13639:19;;13631:6;13613:46;:::i;:::-;13605:54;13176:489;-1:-1:-1;;;;;;13176:489:17:o;13670:249::-;13739:6;13792:2;13780:9;13771:7;13767:23;13763:32;13760:52;;;13808:1;13805;13798:12;13760:52;13840:9;13834:16;13859:30;13883:5;13859:30;:::i
Swarm Source
ipfs://4263bbbab9502fda980a96042f545637aa43155f481859bcd474db92ba69864a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.