Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
8,888 SVS
Holders
2,619
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SVSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SneakyVampireSyndicate
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /* ▄█▀▀▀█▄█ ▀████▀ ▀███▀ ▄█▀▀▀█▄█ ▄██ ▀█ ▀██ ▄▄█ ▄██ ▀█ ▀███▄ ██▄ ▄██ ▀███▄ ▀█████▄ ██▄ ▄█ ▀█████▄ ▄ ▀██ ▀████▀ ▄ ▀██ ██ ██ ▄██▄ ██ ██ █▀█████▀ ██ █▀█████▀ Sneaky Vampires Syndicate / 2021 / V2.0 */ import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; contract SneakyVampireSyndicate is ERC721Enumerable, Ownable { using Strings for uint256; using ECDSA for bytes32; uint256 public constant SVS_GIFT = 88; uint256 public constant SVS_PRIVATE = 800; uint256 public constant SVS_PUBLIC = 8000; uint256 public constant SVS_MAX = SVS_GIFT + SVS_PRIVATE + SVS_PUBLIC; uint256 public constant SVS_PRICE = 0.08 ether; uint256 public constant SVS_PER_MINT = 5; mapping(address => bool) public presalerList; mapping(address => uint256) public presalerListPurchases; mapping(string => bool) private _usedNonces; string private _contractURI; string private _tokenBaseURI = "https://svs.gg/api/metadata/"; address private _artistAddress = 0xea68212b0450A929B14726b90550933bC12fF813; address private _signerAddress = 0x7e3999B106E4Ef472E569b772bF7F7647D8F26Ba; string public proof; uint256 public giftedAmount; uint256 public publicAmountMinted; uint256 public privateAmountMinted; uint256 public presalePurchaseLimit = 2; bool public presaleLive; bool public saleLive; bool public locked; constructor() ERC721("Sneaky Vampire Syndicate", "SVS") { } modifier notLocked { require(!locked, "Contract metadata methods are locked"); _; } function addToPresaleList(address[] calldata entries) external onlyOwner { for(uint256 i = 0; i < entries.length; i++) { address entry = entries[i]; require(entry != address(0), "NULL_ADDRESS"); require(!presalerList[entry], "DUPLICATE_ENTRY"); presalerList[entry] = true; } } function removeFromPresaleList(address[] calldata entries) external onlyOwner { for(uint256 i = 0; i < entries.length; i++) { address entry = entries[i]; require(entry != address(0), "NULL_ADDRESS"); presalerList[entry] = false; } } function hashTransaction(address sender, uint256 qty, string memory nonce) private pure returns(bytes32) { bytes32 hash = keccak256(abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(sender, qty, nonce))) ); return hash; } function matchAddresSigner(bytes32 hash, bytes memory signature) private view returns(bool) { return _signerAddress == hash.recover(signature); } function buy(bytes32 hash, bytes memory signature, string memory nonce, uint256 tokenQuantity) external payable { require(saleLive, "SALE_CLOSED"); require(!presaleLive, "ONLY_PRESALE"); require(matchAddresSigner(hash, signature), "DIRECT_MINT_DISALLOWED"); require(!_usedNonces[nonce], "HASH_USED"); require(hashTransaction(msg.sender, tokenQuantity, nonce) == hash, "HASH_FAIL"); require(totalSupply() < SVS_MAX, "OUT_OF_STOCK"); require(publicAmountMinted + tokenQuantity <= SVS_PUBLIC, "EXCEED_PUBLIC"); require(tokenQuantity <= SVS_PER_MINT, "EXCEED_SVS_PER_MINT"); require(SVS_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH"); for(uint256 i = 0; i < tokenQuantity; i++) { publicAmountMinted++; _safeMint(msg.sender, totalSupply() + 1); } _usedNonces[nonce] = true; } function presaleBuy(uint256 tokenQuantity) external payable { require(!saleLive && presaleLive, "PRESALE_CLOSED"); require(presalerList[msg.sender], "NOT_QUALIFIED"); require(totalSupply() < SVS_MAX, "OUT_OF_STOCK"); require(privateAmountMinted + tokenQuantity <= SVS_PRIVATE, "EXCEED_PRIVATE"); require(presalerListPurchases[msg.sender] + tokenQuantity <= presalePurchaseLimit, "EXCEED_ALLOC"); require(SVS_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH"); for (uint256 i = 0; i < tokenQuantity; i++) { privateAmountMinted++; presalerListPurchases[msg.sender]++; _safeMint(msg.sender, totalSupply() + 1); } } function gift(address[] calldata receivers) external onlyOwner { require(totalSupply() + receivers.length <= SVS_MAX, "MAX_MINT"); require(giftedAmount + receivers.length <= SVS_GIFT, "GIFTS_EMPTY"); for (uint256 i = 0; i < receivers.length; i++) { giftedAmount++; _safeMint(receivers[i], totalSupply() + 1); } } function withdraw() external onlyOwner { payable(_artistAddress).transfer(address(this).balance * 2 / 5); payable(msg.sender).transfer(address(this).balance); } function isPresaler(address addr) external view returns (bool) { return presalerList[addr]; } function presalePurchasedCount(address addr) external view returns (uint256) { return presalerListPurchases[addr]; } // Owner functions for enabling presale, sale, revealing and setting the provenance hash function lockMetadata() external onlyOwner { locked = true; } function togglePresaleStatus() external onlyOwner { presaleLive = !presaleLive; } function toggleSaleStatus() external onlyOwner { saleLive = !saleLive; } function setSignerAddress(address addr) external onlyOwner { _signerAddress = addr; } function setProvenanceHash(string calldata hash) external onlyOwner notLocked { proof = hash; } function setContractURI(string calldata URI) external onlyOwner notLocked { _contractURI = URI; } function setBaseURI(string calldata URI) external onlyOwner notLocked { _tokenBaseURI = URI; } // aWYgeW91IHJlYWQgdGhpcywgc2VuZCBGcmVkZXJpayMwMDAxLCAiZnJlZGR5IGlzIGJpZyI= function contractURI() public view returns (string memory) { return _contractURI; } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), "Cannot query non-existent token"); return string(abi.encodePacked(_tokenBaseURI, tokenId.toString())); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../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. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.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}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./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); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../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 pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"SVS_GIFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SVS_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SVS_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SVS_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SVS_PRIVATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SVS_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"giftedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isPresaler","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"presaleBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePurchaseLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"presalePurchasedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerListPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proof","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setSignerAddress","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":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052601c60808190527f68747470733a2f2f7376732e67672f6170692f6d657461646174612f0000000060a09081526200004091600f91906200018b565b50601080546001600160a01b031990811673ea68212b0450a929b14726b90550933bc12ff8131790915560118054909116737e3999b106e4ef472e569b772bf7f7647d8f26ba17905560026016553480156200009b57600080fd5b50604080518082018252601881527f536e65616b792056616d706972652053796e646963617465000000000000000060208083019182528351808501909452600384526253565360e81b908401528151919291620000fc916000916200018b565b508051620001129060019060208401906200018b565b5050506200012f620001296200013560201b60201c565b62000139565b6200026e565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001999062000231565b90600052602060002090601f016020900481019282620001bd576000855562000208565b82601f10620001d857805160ff191683800117855562000208565b8280016001018555821562000208579182015b8281111562000208578251825591602001919060010190620001eb565b50620002169291506200021a565b5090565b5b808211156200021657600081556001016200021b565b600181811c908216806200024657607f821691505b602082108114156200026857634e487b7160e01b600052602260045260246000fd5b50919050565b6133a2806200027e6000396000f3fe6080604052600436106102e45760003560e01c80637ed32dad11610190578063a29714da116100dc578063e081b78111610095578063f2fde38b1161006f578063f2fde38b146108b6578063f4743070146108d6578063fac2e3c1146108ec578063faf924cf1461090157600080fd5b8063e081b78114610839578063e8a3d48514610858578063e985e9c51461086d57600080fd5b8063a29714da1461078e578063b179e060146107a4578063b88d4fde146107c4578063c87b56dd146107e4578063cf30901214610804578063dbf314cc1461082457600080fd5b806395d89b41116101495780639cf2e8d6116101235780639cf2e8d6146106f25780639e273b2f146107225780639ec70f191461075b578063a22cb4651461076e57600080fd5b806395d89b411461069b578063989bdbb6146106b05780639bf80316146106c557600080fd5b80637ed32dad14610604578063815f7bbd1461061a57806383a9e0491461062d5780638da5cb5b14610647578063938e3d7b14610665578063940f1ada1461068557600080fd5b80632f745c591161024f5780635ce7af1f11610208578063715018a6116101e2578063715018a6146105a55780637204a3c9146105ba578063730f8c65146105da5780637bffb4ce146105ef57600080fd5b80635ce7af1f1461052f5780636352211e1461056557806370a082311461058557600080fd5b80632f745c59146104845780633ccfd60b146104a457806342842e0e146104b95780634f6ccce7146104d957806355f804b3146104f957806359a12ad51461051957600080fd5b8063095ea7b3116102a1578063095ea7b3146103d957806310969523146103f9578063163e1e611461041957806318160ddd146104395780631b57190e1461044e57806323b872dd1461046457600080fd5b806301ffc9a7146102e9578063046dc1661461031e578063049c5c491461034057806306fdde0314610355578063081812fc1461037757806308333598146103af575b600080fd5b3480156102f557600080fd5b50610309610304366004612e71565b610916565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b5061033e610339366004612c1b565b610941565b005b34801561034c57600080fd5b5061033e610996565b34801561036157600080fd5b5061036a6109dd565b60405161031591906130ab565b34801561038357600080fd5b50610397610392366004612f0b565b610a6f565b6040516001600160a01b039091168152602001610315565b3480156103bb57600080fd5b506103cb67011c37937e08000081565b604051908152602001610315565b3480156103e557600080fd5b5061033e6103f4366004612d49565b610b04565b34801561040557600080fd5b5061033e610414366004612eab565b610c1a565b34801561042557600080fd5b5061033e610434366004612d73565b610c79565b34801561044557600080fd5b506008546103cb565b34801561045a57600080fd5b506103cb60135481565b34801561047057600080fd5b5061033e61047f366004612c69565b610dc7565b34801561049057600080fd5b506103cb61049f366004612d49565b610df8565b3480156104b057600080fd5b5061033e610e8e565b3480156104c557600080fd5b5061033e6104d4366004612c69565b610f36565b3480156104e557600080fd5b506103cb6104f4366004612f0b565b610f51565b34801561050557600080fd5b5061033e610514366004612eab565b610fe4565b34801561052557600080fd5b506103cb60155481565b34801561053b57600080fd5b506103cb61054a366004612c1b565b6001600160a01b03166000908152600c602052604090205490565b34801561057157600080fd5b50610397610580366004612f0b565b611043565b34801561059157600080fd5b506103cb6105a0366004612c1b565b6110ba565b3480156105b157600080fd5b5061033e611141565b3480156105c657600080fd5b5061033e6105d5366004612d73565b611177565b3480156105e657600080fd5b506103cb600581565b3480156105fb57600080fd5b5061033e6112ab565b34801561061057600080fd5b506103cb611f4081565b61033e610628366004612f0b565b6112e9565b34801561063957600080fd5b506017546103099060ff1681565b34801561065357600080fd5b50600a546001600160a01b0316610397565b34801561067157600080fd5b5061033e610680366004612eab565b61154a565b34801561069157600080fd5b506103cb60145481565b3480156106a757600080fd5b5061036a6115a9565b3480156106bc57600080fd5b5061033e6115b8565b3480156106d157600080fd5b506103cb6106e0366004612c1b565b600c6020526000908152604090205481565b3480156106fe57600080fd5b5061030961070d366004612c1b565b600b6020526000908152604090205460ff1681565b34801561072e57600080fd5b5061030961073d366004612c1b565b6001600160a01b03166000908152600b602052604090205460ff1690565b61033e610769366004612de8565b6115f5565b34801561077a57600080fd5b5061033e610789366004612d0d565b611927565b34801561079a57600080fd5b506103cb61032081565b3480156107b057600080fd5b5061033e6107bf366004612d73565b6119ec565b3480156107d057600080fd5b5061033e6107df366004612ca5565b611ac2565b3480156107f057600080fd5b5061036a6107ff366004612f0b565b611afa565b34801561081057600080fd5b506017546103099062010000900460ff1681565b34801561083057600080fd5b506103cb611b93565b34801561084557600080fd5b5060175461030990610100900460ff1681565b34801561086457600080fd5b5061036a611bb0565b34801561087957600080fd5b50610309610888366004612c36565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108c257600080fd5b5061033e6108d1366004612c1b565b611bbf565b3480156108e257600080fd5b506103cb60165481565b3480156108f857600080fd5b506103cb605881565b34801561090d57600080fd5b5061036a611c57565b60006001600160e01b0319821663780e9d6360e01b148061093b575061093b82611ce5565b92915050565b600a546001600160a01b031633146109745760405162461bcd60e51b815260040161096b90613110565b60405180910390fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146109c05760405162461bcd60e51b815260040161096b90613110565b6017805461ff001981166101009182900460ff1615909102179055565b6060600080546109ec90613268565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1890613268565b8015610a655780601f10610a3a57610100808354040283529160200191610a65565b820191906000526020600020905b815481529060010190602001808311610a4857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610ae85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096b565b506000908152600460205260409020546001600160a01b031690565b6000610b0f82611043565b9050806001600160a01b0316836001600160a01b03161415610b7d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161096b565b336001600160a01b0382161480610b995750610b998133610888565b610c0b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161096b565b610c158383611d35565b505050565b600a546001600160a01b03163314610c445760405162461bcd60e51b815260040161096b90613110565b60175462010000900460ff1615610c6d5760405162461bcd60e51b815260040161096b90613145565b610c1560128383612ac9565b600a546001600160a01b03163314610ca35760405162461bcd60e51b815260040161096b90613110565b611f40610cb361032060586131da565b610cbd91906131da565b81610cc760085490565b610cd191906131da565b1115610d0a5760405162461bcd60e51b815260206004820152600860248201526713505617d352539560c21b604482015260640161096b565b601354605890610d1b9083906131da565b1115610d575760405162461bcd60e51b815260206004820152600b60248201526a47494654535f454d50545960a81b604482015260640161096b565b60005b81811015610c155760138054906000610d72836132a3565b9190505550610db5838383818110610d8c57610d8c61332a565b9050602002016020810190610da19190612c1b565b6008545b610db09060016131da565b611da3565b80610dbf816132a3565b915050610d5a565b610dd13382611dbd565b610ded5760405162461bcd60e51b815260040161096b90613189565b610c15838383611eb4565b6000610e03836110ba565b8210610e655760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161096b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610eb85760405162461bcd60e51b815260040161096b90613110565b6010546001600160a01b03166108fc6005610ed4476002613206565b610ede91906131f2565b6040518115909202916000818181858888f19350505050158015610f06573d6000803e3d6000fd5b5060405133904780156108fc02916000818181858888f19350505050158015610f33573d6000803e3d6000fd5b50565b610c1583838360405180602001604052806000815250611ac2565b6000610f5c60085490565b8210610fbf5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161096b565b60088281548110610fd257610fd261332a565b90600052602060002001549050919050565b600a546001600160a01b0316331461100e5760405162461bcd60e51b815260040161096b90613110565b60175462010000900460ff16156110375760405162461bcd60e51b815260040161096b90613145565b610c15600f8383612ac9565b6000818152600260205260408120546001600160a01b03168061093b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161096b565b60006001600160a01b0382166111255760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161096b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461116b5760405162461bcd60e51b815260040161096b90613110565b611175600061205f565b565b600a546001600160a01b031633146111a15760405162461bcd60e51b815260040161096b90613110565b60005b81811015610c155760008383838181106111c0576111c061332a565b90506020020160208101906111d59190612c1b565b90506001600160a01b03811661121c5760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b604482015260640161096b565b6001600160a01b0381166000908152600b602052604090205460ff16156112775760405162461bcd60e51b815260206004820152600f60248201526e4455504c49434154455f454e54525960881b604482015260640161096b565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055806112a3816132a3565b9150506111a4565b600a546001600160a01b031633146112d55760405162461bcd60e51b815260040161096b90613110565b6017805460ff19811660ff90911615179055565b601754610100900460ff16158015611303575060175460ff165b6113405760405162461bcd60e51b815260206004820152600e60248201526d14149154d0531157d0d313d4d15160921b604482015260640161096b565b336000908152600b602052604090205460ff1661138f5760405162461bcd60e51b815260206004820152600d60248201526c1393d517d45550531251925151609a1b604482015260640161096b565b611f4061139f61032060586131da565b6113a991906131da565b600854106113e85760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b604482015260640161096b565b610320816015546113f991906131da565b11156114385760405162461bcd60e51b815260206004820152600e60248201526d4558434545445f5052495641544560901b604482015260640161096b565b601654336000908152600c60205260409020546114569083906131da565b11156114935760405162461bcd60e51b815260206004820152600c60248201526b4558434545445f414c4c4f4360a01b604482015260640161096b565b346114a68267011c37937e080000613206565b11156114e75760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604482015260640161096b565b60005b818110156115465760158054906000611502836132a3565b9091555050336000908152600c60205260408120805491611522836132a3565b919050555061153433610da560085490565b8061153e816132a3565b9150506114ea565b5050565b600a546001600160a01b031633146115745760405162461bcd60e51b815260040161096b90613110565b60175462010000900460ff161561159d5760405162461bcd60e51b815260040161096b90613145565b610c15600e8383612ac9565b6060600180546109ec90613268565b600a546001600160a01b031633146115e25760405162461bcd60e51b815260040161096b90613110565b6017805462ff0000191662010000179055565b601754610100900460ff1661163a5760405162461bcd60e51b815260206004820152600b60248201526a14d0531157d0d313d4d15160aa1b604482015260640161096b565b60175460ff161561167c5760405162461bcd60e51b815260206004820152600c60248201526b4f4e4c595f50524553414c4560a01b604482015260640161096b565b61168684846120b1565b6116cb5760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b604482015260640161096b565b600d826040516116db9190612fab565b9081526040519081900360200190205460ff16156117275760405162461bcd60e51b8152602060048201526009602482015268121054d217d554d15160ba1b604482015260640161096b565b836117333383856120d5565b1461176c5760405162461bcd60e51b8152602060048201526009602482015268121054d217d190525360ba1b604482015260640161096b565b611f4061177c61032060586131da565b61178691906131da565b600854106117c55760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b604482015260640161096b565b611f40816014546117d691906131da565b11156118145760405162461bcd60e51b815260206004820152600d60248201526c4558434545445f5055424c494360981b604482015260640161096b565b600581111561185b5760405162461bcd60e51b8152602060048201526013602482015272115610d1515117d4d594d7d4115497d3525395606a1b604482015260640161096b565b3461186e8267011c37937e080000613206565b11156118af5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604482015260640161096b565b60005b818110156118ee57601480549060006118ca836132a3565b91905055506118dc33610da560085490565b806118e6816132a3565b9150506118b2565b506001600d836040516119019190612fab565b908152604051908190036020019020805491151560ff1990921691909117905550505050565b6001600160a01b0382163314156119805760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161096b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611a165760405162461bcd60e51b815260040161096b90613110565b60005b81811015610c15576000838383818110611a3557611a3561332a565b9050602002016020810190611a4a9190612c1b565b90506001600160a01b038116611a915760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b604482015260640161096b565b6001600160a01b03166000908152600b60205260409020805460ff1916905580611aba816132a3565b915050611a19565b611acc3383611dbd565b611ae85760405162461bcd60e51b815260040161096b90613189565b611af484848484612157565b50505050565b6000818152600260205260409020546060906001600160a01b0316611b615760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00604482015260640161096b565b600f611b6c8361218a565b604051602001611b7d929190612fc7565b6040516020818303038152906040529050919050565b611f40611ba361032060586131da565b611bad91906131da565b81565b6060600e80546109ec90613268565b600a546001600160a01b03163314611be95760405162461bcd60e51b815260040161096b90613110565b6001600160a01b038116611c4e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161096b565b610f338161205f565b60128054611c6490613268565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9090613268565b8015611cdd5780601f10611cb257610100808354040283529160200191611cdd565b820191906000526020600020905b815481529060010190602001808311611cc057829003601f168201915b505050505081565b60006001600160e01b031982166380ac58cd60e01b1480611d1657506001600160e01b03198216635b5e139f60e01b145b8061093b57506301ffc9a760e01b6001600160e01b031983161461093b565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d6a82611043565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611546828260405180602001604052806000815250612288565b6000818152600260205260408120546001600160a01b0316611e365760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096b565b6000611e4183611043565b9050806001600160a01b0316846001600160a01b03161480611e7c5750836001600160a01b0316611e7184610a6f565b6001600160a01b0316145b80611eac57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ec782611043565b6001600160a01b031614611f2f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161096b565b6001600160a01b038216611f915760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161096b565b611f9c8383836122bb565b611fa7600082611d35565b6001600160a01b0383166000908152600360205260408120805460019290611fd0908490613225565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ffe9084906131da565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006120bd8383612373565b6011546001600160a01b039182169116149392505050565b6000808484846040516020016120ed93929190612f6c565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051808303601f19018152919052805160209091012095945050505050565b612162848484611eb4565b61216e84848484612397565b611af45760405162461bcd60e51b815260040161096b906130be565b6060816121ae5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121d857806121c2816132a3565b91506121d19050600a836131f2565b91506121b2565b60008167ffffffffffffffff8111156121f3576121f3613340565b6040519080825280601f01601f19166020018201604052801561221d576020820181803683370190505b5090505b8415611eac57612232600183613225565b915061223f600a866132be565b61224a9060306131da565b60f81b81838151811061225f5761225f61332a565b60200101906001600160f81b031916908160001a905350612281600a866131f2565b9450612221565b61229283836124a4565b61229f6000848484612397565b610c155760405162461bcd60e51b815260040161096b906130be565b6001600160a01b0383166123165761231181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612339565b816001600160a01b0316836001600160a01b0316146123395761233983826125f2565b6001600160a01b03821661235057610c158161268f565b826001600160a01b0316826001600160a01b031614610c1557610c15828261273e565b60008060006123828585612782565b9150915061238f816127f2565b509392505050565b60006001600160a01b0384163b1561249957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123db90339089908890889060040161306e565b602060405180830381600087803b1580156123f557600080fd5b505af1925050508015612425575060408051601f3d908101601f1916820190925261242291810190612e8e565b60015b61247f573d808015612453576040519150601f19603f3d011682016040523d82523d6000602084013e612458565b606091505b5080516124775760405162461bcd60e51b815260040161096b906130be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611eac565b506001949350505050565b6001600160a01b0382166124fa5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161096b565b6000818152600260205260409020546001600160a01b03161561255f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161096b565b61256b600083836122bb565b6001600160a01b03821660009081526003602052604081208054600192906125949084906131da565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016125ff846110ba565b6126099190613225565b60008381526007602052604090205490915080821461265c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906126a190600190613225565b600083815260096020526040812054600880549394509092849081106126c9576126c961332a565b9060005260206000200154905080600883815481106126ea576126ea61332a565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061272257612722613314565b6001900381819060005260206000200160009055905550505050565b6000612749836110ba565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6000808251604114156127b95760208301516040840151606085015160001a6127ad878285856129ad565b945094505050506127eb565b8251604014156127e357602083015160408401516127d8868383612a9a565b9350935050506127eb565b506000905060025b9250929050565b6000816004811115612806576128066132fe565b141561280f5750565b6001816004811115612823576128236132fe565b14156128715760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161096b565b6002816004811115612885576128856132fe565b14156128d35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161096b565b60038160048111156128e7576128e76132fe565b14156129405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161096b565b6004816004811115612954576129546132fe565b1415610f335760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161096b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156129e45750600090506003612a91565b8460ff16601b141580156129fc57508460ff16601c14155b15612a0d5750600090506004612a91565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a61573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a8a57600060019250925050612a91565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612abb878288856129ad565b935093505050935093915050565b828054612ad590613268565b90600052602060002090601f016020900481019282612af75760008555612b3d565b82601f10612b105782800160ff19823516178555612b3d565b82800160010185558215612b3d579182015b82811115612b3d578235825591602001919060010190612b22565b50612b49929150612b4d565b5090565b5b80821115612b495760008155600101612b4e565b600067ffffffffffffffff80841115612b7d57612b7d613340565b604051601f8501601f19908116603f01168101908282118183101715612ba557612ba5613340565b81604052809350858152868686011115612bbe57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612bef57600080fd5b919050565b600082601f830112612c0557600080fd5b612c1483833560208501612b62565b9392505050565b600060208284031215612c2d57600080fd5b612c1482612bd8565b60008060408385031215612c4957600080fd5b612c5283612bd8565b9150612c6060208401612bd8565b90509250929050565b600080600060608486031215612c7e57600080fd5b612c8784612bd8565b9250612c9560208501612bd8565b9150604084013590509250925092565b60008060008060808587031215612cbb57600080fd5b612cc485612bd8565b9350612cd260208601612bd8565b925060408501359150606085013567ffffffffffffffff811115612cf557600080fd5b612d0187828801612bf4565b91505092959194509250565b60008060408385031215612d2057600080fd5b612d2983612bd8565b915060208301358015158114612d3e57600080fd5b809150509250929050565b60008060408385031215612d5c57600080fd5b612d6583612bd8565b946020939093013593505050565b60008060208385031215612d8657600080fd5b823567ffffffffffffffff80821115612d9e57600080fd5b818501915085601f830112612db257600080fd5b813581811115612dc157600080fd5b8660208260051b8501011115612dd657600080fd5b60209290920196919550909350505050565b60008060008060808587031215612dfe57600080fd5b84359350602085013567ffffffffffffffff80821115612e1d57600080fd5b612e2988838901612bf4565b94506040870135915080821115612e3f57600080fd5b508501601f81018713612e5157600080fd5b612e6087823560208401612b62565b949793965093946060013593505050565b600060208284031215612e8357600080fd5b8135612c1481613356565b600060208284031215612ea057600080fd5b8151612c1481613356565b60008060208385031215612ebe57600080fd5b823567ffffffffffffffff80821115612ed657600080fd5b818501915085601f830112612eea57600080fd5b813581811115612ef957600080fd5b866020828501011115612dd657600080fd5b600060208284031215612f1d57600080fd5b5035919050565b60008151808452612f3c81602086016020860161323c565b601f01601f19169290920160200192915050565b60008151612f6281856020860161323c565b9290920192915050565b6bffffffffffffffffffffffff198460601b16815282601482015260008251612f9c81603485016020870161323c565b91909101603401949350505050565b60008251612fbd81846020870161323c565b9190910192915050565b600080845481600182811c915080831680612fe357607f831692505b602080841082141561300357634e487b7160e01b86526022600452602486fd5b818015613017576001811461302857613055565b60ff19861689528489019650613055565b60008b81526020902060005b8681101561304d5781548b820152908501908301613034565b505084890196505b5050505050506130658185612f50565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130a190830184612f24565b9695505050505050565b602081526000612c146020830184612f24565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60408201526318dad95960e21b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156131ed576131ed6132d2565b500190565b600082613201576132016132e8565b500490565b6000816000190483118215151615613220576132206132d2565b500290565b600082821015613237576132376132d2565b500390565b60005b8381101561325757818101518382015260200161323f565b83811115611af45750506000910152565b600181811c9082168061327c57607f821691505b6020821081141561329d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156132b7576132b76132d2565b5060010190565b6000826132cd576132cd6132e8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f3357600080fdfea26469706673582212208e38558e2da865c0c52652d2796cd7188a632dce4cc912f352aabd798db9eca364736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102e45760003560e01c80637ed32dad11610190578063a29714da116100dc578063e081b78111610095578063f2fde38b1161006f578063f2fde38b146108b6578063f4743070146108d6578063fac2e3c1146108ec578063faf924cf1461090157600080fd5b8063e081b78114610839578063e8a3d48514610858578063e985e9c51461086d57600080fd5b8063a29714da1461078e578063b179e060146107a4578063b88d4fde146107c4578063c87b56dd146107e4578063cf30901214610804578063dbf314cc1461082457600080fd5b806395d89b41116101495780639cf2e8d6116101235780639cf2e8d6146106f25780639e273b2f146107225780639ec70f191461075b578063a22cb4651461076e57600080fd5b806395d89b411461069b578063989bdbb6146106b05780639bf80316146106c557600080fd5b80637ed32dad14610604578063815f7bbd1461061a57806383a9e0491461062d5780638da5cb5b14610647578063938e3d7b14610665578063940f1ada1461068557600080fd5b80632f745c591161024f5780635ce7af1f11610208578063715018a6116101e2578063715018a6146105a55780637204a3c9146105ba578063730f8c65146105da5780637bffb4ce146105ef57600080fd5b80635ce7af1f1461052f5780636352211e1461056557806370a082311461058557600080fd5b80632f745c59146104845780633ccfd60b146104a457806342842e0e146104b95780634f6ccce7146104d957806355f804b3146104f957806359a12ad51461051957600080fd5b8063095ea7b3116102a1578063095ea7b3146103d957806310969523146103f9578063163e1e611461041957806318160ddd146104395780631b57190e1461044e57806323b872dd1461046457600080fd5b806301ffc9a7146102e9578063046dc1661461031e578063049c5c491461034057806306fdde0314610355578063081812fc1461037757806308333598146103af575b600080fd5b3480156102f557600080fd5b50610309610304366004612e71565b610916565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b5061033e610339366004612c1b565b610941565b005b34801561034c57600080fd5b5061033e610996565b34801561036157600080fd5b5061036a6109dd565b60405161031591906130ab565b34801561038357600080fd5b50610397610392366004612f0b565b610a6f565b6040516001600160a01b039091168152602001610315565b3480156103bb57600080fd5b506103cb67011c37937e08000081565b604051908152602001610315565b3480156103e557600080fd5b5061033e6103f4366004612d49565b610b04565b34801561040557600080fd5b5061033e610414366004612eab565b610c1a565b34801561042557600080fd5b5061033e610434366004612d73565b610c79565b34801561044557600080fd5b506008546103cb565b34801561045a57600080fd5b506103cb60135481565b34801561047057600080fd5b5061033e61047f366004612c69565b610dc7565b34801561049057600080fd5b506103cb61049f366004612d49565b610df8565b3480156104b057600080fd5b5061033e610e8e565b3480156104c557600080fd5b5061033e6104d4366004612c69565b610f36565b3480156104e557600080fd5b506103cb6104f4366004612f0b565b610f51565b34801561050557600080fd5b5061033e610514366004612eab565b610fe4565b34801561052557600080fd5b506103cb60155481565b34801561053b57600080fd5b506103cb61054a366004612c1b565b6001600160a01b03166000908152600c602052604090205490565b34801561057157600080fd5b50610397610580366004612f0b565b611043565b34801561059157600080fd5b506103cb6105a0366004612c1b565b6110ba565b3480156105b157600080fd5b5061033e611141565b3480156105c657600080fd5b5061033e6105d5366004612d73565b611177565b3480156105e657600080fd5b506103cb600581565b3480156105fb57600080fd5b5061033e6112ab565b34801561061057600080fd5b506103cb611f4081565b61033e610628366004612f0b565b6112e9565b34801561063957600080fd5b506017546103099060ff1681565b34801561065357600080fd5b50600a546001600160a01b0316610397565b34801561067157600080fd5b5061033e610680366004612eab565b61154a565b34801561069157600080fd5b506103cb60145481565b3480156106a757600080fd5b5061036a6115a9565b3480156106bc57600080fd5b5061033e6115b8565b3480156106d157600080fd5b506103cb6106e0366004612c1b565b600c6020526000908152604090205481565b3480156106fe57600080fd5b5061030961070d366004612c1b565b600b6020526000908152604090205460ff1681565b34801561072e57600080fd5b5061030961073d366004612c1b565b6001600160a01b03166000908152600b602052604090205460ff1690565b61033e610769366004612de8565b6115f5565b34801561077a57600080fd5b5061033e610789366004612d0d565b611927565b34801561079a57600080fd5b506103cb61032081565b3480156107b057600080fd5b5061033e6107bf366004612d73565b6119ec565b3480156107d057600080fd5b5061033e6107df366004612ca5565b611ac2565b3480156107f057600080fd5b5061036a6107ff366004612f0b565b611afa565b34801561081057600080fd5b506017546103099062010000900460ff1681565b34801561083057600080fd5b506103cb611b93565b34801561084557600080fd5b5060175461030990610100900460ff1681565b34801561086457600080fd5b5061036a611bb0565b34801561087957600080fd5b50610309610888366004612c36565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108c257600080fd5b5061033e6108d1366004612c1b565b611bbf565b3480156108e257600080fd5b506103cb60165481565b3480156108f857600080fd5b506103cb605881565b34801561090d57600080fd5b5061036a611c57565b60006001600160e01b0319821663780e9d6360e01b148061093b575061093b82611ce5565b92915050565b600a546001600160a01b031633146109745760405162461bcd60e51b815260040161096b90613110565b60405180910390fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146109c05760405162461bcd60e51b815260040161096b90613110565b6017805461ff001981166101009182900460ff1615909102179055565b6060600080546109ec90613268565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1890613268565b8015610a655780601f10610a3a57610100808354040283529160200191610a65565b820191906000526020600020905b815481529060010190602001808311610a4857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610ae85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096b565b506000908152600460205260409020546001600160a01b031690565b6000610b0f82611043565b9050806001600160a01b0316836001600160a01b03161415610b7d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161096b565b336001600160a01b0382161480610b995750610b998133610888565b610c0b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161096b565b610c158383611d35565b505050565b600a546001600160a01b03163314610c445760405162461bcd60e51b815260040161096b90613110565b60175462010000900460ff1615610c6d5760405162461bcd60e51b815260040161096b90613145565b610c1560128383612ac9565b600a546001600160a01b03163314610ca35760405162461bcd60e51b815260040161096b90613110565b611f40610cb361032060586131da565b610cbd91906131da565b81610cc760085490565b610cd191906131da565b1115610d0a5760405162461bcd60e51b815260206004820152600860248201526713505617d352539560c21b604482015260640161096b565b601354605890610d1b9083906131da565b1115610d575760405162461bcd60e51b815260206004820152600b60248201526a47494654535f454d50545960a81b604482015260640161096b565b60005b81811015610c155760138054906000610d72836132a3565b9190505550610db5838383818110610d8c57610d8c61332a565b9050602002016020810190610da19190612c1b565b6008545b610db09060016131da565b611da3565b80610dbf816132a3565b915050610d5a565b610dd13382611dbd565b610ded5760405162461bcd60e51b815260040161096b90613189565b610c15838383611eb4565b6000610e03836110ba565b8210610e655760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161096b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610eb85760405162461bcd60e51b815260040161096b90613110565b6010546001600160a01b03166108fc6005610ed4476002613206565b610ede91906131f2565b6040518115909202916000818181858888f19350505050158015610f06573d6000803e3d6000fd5b5060405133904780156108fc02916000818181858888f19350505050158015610f33573d6000803e3d6000fd5b50565b610c1583838360405180602001604052806000815250611ac2565b6000610f5c60085490565b8210610fbf5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161096b565b60088281548110610fd257610fd261332a565b90600052602060002001549050919050565b600a546001600160a01b0316331461100e5760405162461bcd60e51b815260040161096b90613110565b60175462010000900460ff16156110375760405162461bcd60e51b815260040161096b90613145565b610c15600f8383612ac9565b6000818152600260205260408120546001600160a01b03168061093b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161096b565b60006001600160a01b0382166111255760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161096b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461116b5760405162461bcd60e51b815260040161096b90613110565b611175600061205f565b565b600a546001600160a01b031633146111a15760405162461bcd60e51b815260040161096b90613110565b60005b81811015610c155760008383838181106111c0576111c061332a565b90506020020160208101906111d59190612c1b565b90506001600160a01b03811661121c5760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b604482015260640161096b565b6001600160a01b0381166000908152600b602052604090205460ff16156112775760405162461bcd60e51b815260206004820152600f60248201526e4455504c49434154455f454e54525960881b604482015260640161096b565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055806112a3816132a3565b9150506111a4565b600a546001600160a01b031633146112d55760405162461bcd60e51b815260040161096b90613110565b6017805460ff19811660ff90911615179055565b601754610100900460ff16158015611303575060175460ff165b6113405760405162461bcd60e51b815260206004820152600e60248201526d14149154d0531157d0d313d4d15160921b604482015260640161096b565b336000908152600b602052604090205460ff1661138f5760405162461bcd60e51b815260206004820152600d60248201526c1393d517d45550531251925151609a1b604482015260640161096b565b611f4061139f61032060586131da565b6113a991906131da565b600854106113e85760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b604482015260640161096b565b610320816015546113f991906131da565b11156114385760405162461bcd60e51b815260206004820152600e60248201526d4558434545445f5052495641544560901b604482015260640161096b565b601654336000908152600c60205260409020546114569083906131da565b11156114935760405162461bcd60e51b815260206004820152600c60248201526b4558434545445f414c4c4f4360a01b604482015260640161096b565b346114a68267011c37937e080000613206565b11156114e75760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604482015260640161096b565b60005b818110156115465760158054906000611502836132a3565b9091555050336000908152600c60205260408120805491611522836132a3565b919050555061153433610da560085490565b8061153e816132a3565b9150506114ea565b5050565b600a546001600160a01b031633146115745760405162461bcd60e51b815260040161096b90613110565b60175462010000900460ff161561159d5760405162461bcd60e51b815260040161096b90613145565b610c15600e8383612ac9565b6060600180546109ec90613268565b600a546001600160a01b031633146115e25760405162461bcd60e51b815260040161096b90613110565b6017805462ff0000191662010000179055565b601754610100900460ff1661163a5760405162461bcd60e51b815260206004820152600b60248201526a14d0531157d0d313d4d15160aa1b604482015260640161096b565b60175460ff161561167c5760405162461bcd60e51b815260206004820152600c60248201526b4f4e4c595f50524553414c4560a01b604482015260640161096b565b61168684846120b1565b6116cb5760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b604482015260640161096b565b600d826040516116db9190612fab565b9081526040519081900360200190205460ff16156117275760405162461bcd60e51b8152602060048201526009602482015268121054d217d554d15160ba1b604482015260640161096b565b836117333383856120d5565b1461176c5760405162461bcd60e51b8152602060048201526009602482015268121054d217d190525360ba1b604482015260640161096b565b611f4061177c61032060586131da565b61178691906131da565b600854106117c55760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b604482015260640161096b565b611f40816014546117d691906131da565b11156118145760405162461bcd60e51b815260206004820152600d60248201526c4558434545445f5055424c494360981b604482015260640161096b565b600581111561185b5760405162461bcd60e51b8152602060048201526013602482015272115610d1515117d4d594d7d4115497d3525395606a1b604482015260640161096b565b3461186e8267011c37937e080000613206565b11156118af5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604482015260640161096b565b60005b818110156118ee57601480549060006118ca836132a3565b91905055506118dc33610da560085490565b806118e6816132a3565b9150506118b2565b506001600d836040516119019190612fab565b908152604051908190036020019020805491151560ff1990921691909117905550505050565b6001600160a01b0382163314156119805760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161096b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611a165760405162461bcd60e51b815260040161096b90613110565b60005b81811015610c15576000838383818110611a3557611a3561332a565b9050602002016020810190611a4a9190612c1b565b90506001600160a01b038116611a915760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b604482015260640161096b565b6001600160a01b03166000908152600b60205260409020805460ff1916905580611aba816132a3565b915050611a19565b611acc3383611dbd565b611ae85760405162461bcd60e51b815260040161096b90613189565b611af484848484612157565b50505050565b6000818152600260205260409020546060906001600160a01b0316611b615760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00604482015260640161096b565b600f611b6c8361218a565b604051602001611b7d929190612fc7565b6040516020818303038152906040529050919050565b611f40611ba361032060586131da565b611bad91906131da565b81565b6060600e80546109ec90613268565b600a546001600160a01b03163314611be95760405162461bcd60e51b815260040161096b90613110565b6001600160a01b038116611c4e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161096b565b610f338161205f565b60128054611c6490613268565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9090613268565b8015611cdd5780601f10611cb257610100808354040283529160200191611cdd565b820191906000526020600020905b815481529060010190602001808311611cc057829003601f168201915b505050505081565b60006001600160e01b031982166380ac58cd60e01b1480611d1657506001600160e01b03198216635b5e139f60e01b145b8061093b57506301ffc9a760e01b6001600160e01b031983161461093b565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d6a82611043565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611546828260405180602001604052806000815250612288565b6000818152600260205260408120546001600160a01b0316611e365760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096b565b6000611e4183611043565b9050806001600160a01b0316846001600160a01b03161480611e7c5750836001600160a01b0316611e7184610a6f565b6001600160a01b0316145b80611eac57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ec782611043565b6001600160a01b031614611f2f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161096b565b6001600160a01b038216611f915760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161096b565b611f9c8383836122bb565b611fa7600082611d35565b6001600160a01b0383166000908152600360205260408120805460019290611fd0908490613225565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ffe9084906131da565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006120bd8383612373565b6011546001600160a01b039182169116149392505050565b6000808484846040516020016120ed93929190612f6c565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051808303601f19018152919052805160209091012095945050505050565b612162848484611eb4565b61216e84848484612397565b611af45760405162461bcd60e51b815260040161096b906130be565b6060816121ae5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121d857806121c2816132a3565b91506121d19050600a836131f2565b91506121b2565b60008167ffffffffffffffff8111156121f3576121f3613340565b6040519080825280601f01601f19166020018201604052801561221d576020820181803683370190505b5090505b8415611eac57612232600183613225565b915061223f600a866132be565b61224a9060306131da565b60f81b81838151811061225f5761225f61332a565b60200101906001600160f81b031916908160001a905350612281600a866131f2565b9450612221565b61229283836124a4565b61229f6000848484612397565b610c155760405162461bcd60e51b815260040161096b906130be565b6001600160a01b0383166123165761231181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612339565b816001600160a01b0316836001600160a01b0316146123395761233983826125f2565b6001600160a01b03821661235057610c158161268f565b826001600160a01b0316826001600160a01b031614610c1557610c15828261273e565b60008060006123828585612782565b9150915061238f816127f2565b509392505050565b60006001600160a01b0384163b1561249957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123db90339089908890889060040161306e565b602060405180830381600087803b1580156123f557600080fd5b505af1925050508015612425575060408051601f3d908101601f1916820190925261242291810190612e8e565b60015b61247f573d808015612453576040519150601f19603f3d011682016040523d82523d6000602084013e612458565b606091505b5080516124775760405162461bcd60e51b815260040161096b906130be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611eac565b506001949350505050565b6001600160a01b0382166124fa5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161096b565b6000818152600260205260409020546001600160a01b03161561255f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161096b565b61256b600083836122bb565b6001600160a01b03821660009081526003602052604081208054600192906125949084906131da565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016125ff846110ba565b6126099190613225565b60008381526007602052604090205490915080821461265c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906126a190600190613225565b600083815260096020526040812054600880549394509092849081106126c9576126c961332a565b9060005260206000200154905080600883815481106126ea576126ea61332a565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061272257612722613314565b6001900381819060005260206000200160009055905550505050565b6000612749836110ba565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6000808251604114156127b95760208301516040840151606085015160001a6127ad878285856129ad565b945094505050506127eb565b8251604014156127e357602083015160408401516127d8868383612a9a565b9350935050506127eb565b506000905060025b9250929050565b6000816004811115612806576128066132fe565b141561280f5750565b6001816004811115612823576128236132fe565b14156128715760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161096b565b6002816004811115612885576128856132fe565b14156128d35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161096b565b60038160048111156128e7576128e76132fe565b14156129405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161096b565b6004816004811115612954576129546132fe565b1415610f335760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161096b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156129e45750600090506003612a91565b8460ff16601b141580156129fc57508460ff16601c14155b15612a0d5750600090506004612a91565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a61573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a8a57600060019250925050612a91565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612abb878288856129ad565b935093505050935093915050565b828054612ad590613268565b90600052602060002090601f016020900481019282612af75760008555612b3d565b82601f10612b105782800160ff19823516178555612b3d565b82800160010185558215612b3d579182015b82811115612b3d578235825591602001919060010190612b22565b50612b49929150612b4d565b5090565b5b80821115612b495760008155600101612b4e565b600067ffffffffffffffff80841115612b7d57612b7d613340565b604051601f8501601f19908116603f01168101908282118183101715612ba557612ba5613340565b81604052809350858152868686011115612bbe57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612bef57600080fd5b919050565b600082601f830112612c0557600080fd5b612c1483833560208501612b62565b9392505050565b600060208284031215612c2d57600080fd5b612c1482612bd8565b60008060408385031215612c4957600080fd5b612c5283612bd8565b9150612c6060208401612bd8565b90509250929050565b600080600060608486031215612c7e57600080fd5b612c8784612bd8565b9250612c9560208501612bd8565b9150604084013590509250925092565b60008060008060808587031215612cbb57600080fd5b612cc485612bd8565b9350612cd260208601612bd8565b925060408501359150606085013567ffffffffffffffff811115612cf557600080fd5b612d0187828801612bf4565b91505092959194509250565b60008060408385031215612d2057600080fd5b612d2983612bd8565b915060208301358015158114612d3e57600080fd5b809150509250929050565b60008060408385031215612d5c57600080fd5b612d6583612bd8565b946020939093013593505050565b60008060208385031215612d8657600080fd5b823567ffffffffffffffff80821115612d9e57600080fd5b818501915085601f830112612db257600080fd5b813581811115612dc157600080fd5b8660208260051b8501011115612dd657600080fd5b60209290920196919550909350505050565b60008060008060808587031215612dfe57600080fd5b84359350602085013567ffffffffffffffff80821115612e1d57600080fd5b612e2988838901612bf4565b94506040870135915080821115612e3f57600080fd5b508501601f81018713612e5157600080fd5b612e6087823560208401612b62565b949793965093946060013593505050565b600060208284031215612e8357600080fd5b8135612c1481613356565b600060208284031215612ea057600080fd5b8151612c1481613356565b60008060208385031215612ebe57600080fd5b823567ffffffffffffffff80821115612ed657600080fd5b818501915085601f830112612eea57600080fd5b813581811115612ef957600080fd5b866020828501011115612dd657600080fd5b600060208284031215612f1d57600080fd5b5035919050565b60008151808452612f3c81602086016020860161323c565b601f01601f19169290920160200192915050565b60008151612f6281856020860161323c565b9290920192915050565b6bffffffffffffffffffffffff198460601b16815282601482015260008251612f9c81603485016020870161323c565b91909101603401949350505050565b60008251612fbd81846020870161323c565b9190910192915050565b600080845481600182811c915080831680612fe357607f831692505b602080841082141561300357634e487b7160e01b86526022600452602486fd5b818015613017576001811461302857613055565b60ff19861689528489019650613055565b60008b81526020902060005b8681101561304d5781548b820152908501908301613034565b505084890196505b5050505050506130658185612f50565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130a190830184612f24565b9695505050505050565b602081526000612c146020830184612f24565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60408201526318dad95960e21b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156131ed576131ed6132d2565b500190565b600082613201576132016132e8565b500490565b6000816000190483118215151615613220576132206132d2565b500290565b600082821015613237576132376132d2565b500390565b60005b8381101561325757818101518382015260200161323f565b83811115611af45750506000910152565b600181811c9082168061327c57607f821691505b6020821081141561329d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156132b7576132b76132d2565b5060010190565b6000826132cd576132cd6132e8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f3357600080fdfea26469706673582212208e38558e2da865c0c52652d2796cd7188a632dce4cc912f352aabd798db9eca364736f6c63430008070033
Deployed Bytecode Sourcemap
973:6420:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:222:4;;;;;;;;;;-1:-1:-1;910:222:4;;;;;:::i;:::-;;:::i;:::-;;;9342:14:14;;9335:22;9317:41;;9305:2;9290:18;910:222:4;;;;;;;;6471:99:13;;;;;;;;;;-1:-1:-1;6471:99:13;;;;;:::i;:::-;;:::i;:::-;;6373:86;;;;;;;;;;;;;:::i;2414:98:1:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3925:217::-;;;;;;;;;;-1:-1:-1;3925:217:1;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8640:32:14;;;8622:51;;8610:2;8595:18;3925:217:1;8476:203:14;1321:46:13;;;;;;;;;;;;1357:10;1321:46;;;;;25029:25:14;;;25017:2;25002:18;1321:46:13;24883:177:14;3463:401:1;;;;;;;;;;-1:-1:-1;3463:401:1;;;;;:::i;:::-;;:::i;6582:109:13:-;;;;;;;;;;-1:-1:-1;6582:109:13;;;;;:::i;:::-;;:::i;5228:389::-;;;;;;;;;;-1:-1:-1;5228:389:13;;;;;:::i;:::-;;:::i;1535:111:4:-;;;;;;;;;;-1:-1:-1;1622:10:4;:17;1535:111;;1891:27:13;;;;;;;;;;;;;;;;4789:330:1;;;;;;;;;;-1:-1:-1;4789:330:1;;;;;:::i;:::-;;:::i;1211:253:4:-;;;;;;;;;;-1:-1:-1;1211:253:4;;;;;:::i;:::-;;:::i;5629:183:13:-;;;;;;;;;;;;;:::i;5185:179:1:-;;;;;;;;;;-1:-1:-1;5185:179:1;;;;;:::i;:::-;;:::i;1718:230:4:-;;;;;;;;;;-1:-1:-1;1718:230:4;;;;;:::i;:::-;;:::i;6826:108:13:-;;;;;;;;;;-1:-1:-1;6826:108:13;;;;;:::i;:::-;;:::i;1965:34::-;;;;;;;;;;;;;;;;5943:130;;;;;;;;;;-1:-1:-1;5943:130:13;;;;;:::i;:::-;-1:-1:-1;;;;;6038:27:13;6011:7;6038:27;;;:21;:27;;;;;;;5943:130;2117:235:1;;;;;;;;;;-1:-1:-1;2117:235:1;;;;;:::i;:::-;;:::i;1855:205::-;;;;;;;;;;-1:-1:-1;1855:205:1;;;;;:::i;:::-;;:::i;1605:92:0:-;;;;;;;;;;;;;:::i;2329:356:13:-;;;;;;;;;;-1:-1:-1;2329:356:13;;;;;:::i;:::-;;:::i;1374:40::-;;;;;;;;;;;;1413:1;1374:40;;6266:95;;;;;;;;;;;;;:::i;1197:41::-;;;;;;;;;;;;1234:4;1197:41;;4474:742;;;;;;:::i;:::-;;:::i;2052:23::-;;;;;;;;;;-1:-1:-1;2052:23:13;;;;;;;;973:85:0;;;;;;;;;;-1:-1:-1;1045:6:0;;-1:-1:-1;;;;;1045:6:0;973:85;;6703:111:13;;;;;;;;;;-1:-1:-1;6703:111:13;;;;;:::i;:::-;;:::i;1925:33::-;;;;;;;;;;;;;;;;2576:102:1;;;;;;;;;;;;;:::i;6179:75:13:-;;;;;;;;;;;;;:::i;1478:56::-;;;;;;;;;;-1:-1:-1;1478:56:13;;;;;:::i;:::-;;;;;;;;;;;;;;1427:44;;;;;;;;;;-1:-1:-1;1427:44:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;5824:107;;;;;;;;;;-1:-1:-1;5824:107:13;;;;;:::i;:::-;-1:-1:-1;;;;;5905:18:13;5881:4;5905:18;;;:12;:18;;;;;;;;;5824:107;3524:938;;;;;;:::i;:::-;;:::i;4209:290:1:-;;;;;;;;;;-1:-1:-1;4209:290:1;;;;;:::i;:::-;;:::i;1149:41:13:-;;;;;;;;;;;;1187:3;1149:41;;2693:308;;;;;;;;;;-1:-1:-1;2693:308:13;;;;;:::i;:::-;;:::i;5430:320:1:-;;;;;;;;;;-1:-1:-1;5430:320:1;;;;;:::i;:::-;;:::i;7136:254:13:-;;;;;;;;;;-1:-1:-1;7136:254:13;;;;;:::i;:::-;;:::i;2109:18::-;;;;;;;;;;-1:-1:-1;2109:18:13;;;;;;;;;;;1245:69;;;;;;;;;;;;;:::i;2082:20::-;;;;;;;;;;-1:-1:-1;2082:20:13;;;;;;;;;;;7027:97;;;;;;;;;;;;;:::i;4565:162:1:-;;;;;;;;;;-1:-1:-1;4565:162:1;;;;;:::i;:::-;-1:-1:-1;;;;;4685:25:1;;;4662:4;4685:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4565:162;1846:189:0;;;;;;;;;;-1:-1:-1;1846:189:0;;;;;:::i;:::-;;:::i;2006:39:13:-;;;;;;;;;;;;;;;;1105:37;;;;;;;;;;;;1140:2;1105:37;;1865:19;;;;;;;;;;;;;:::i;910:222:4:-;1012:4;-1:-1:-1;;;;;;1035:50:4;;-1:-1:-1;;;1035:50:4;;:90;;;1089:36;1113:11;1089:23;:36::i;:::-;1028:97;910:222;-1:-1:-1;;910:222:4:o;6471:99:13:-;1045:6:0;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;;;;;;;;;6541:14:13::1;:21:::0;;-1:-1:-1;;;;;;6541:21:13::1;-1:-1:-1::0;;;;;6541:21:13;;;::::1;::::0;;;::::1;::::0;;6471:99::o;6373:86::-;1045:6:0;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;6443:8:13::1;::::0;;-1:-1:-1;;6431:20:13;::::1;6443:8;::::0;;;::::1;;;6442:9;6431:20:::0;;::::1;;::::0;;6373:86::o;2414:98:1:-;2468:13;2500:5;2493:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:98;:::o;3925:217::-;4001:7;7310:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7310:16:1;4020:73;;;;-1:-1:-1;;;4020:73:1;;19513:2:14;4020:73:1;;;19495:21:14;19552:2;19532:18;;;19525:30;19591:34;19571:18;;;19564:62;-1:-1:-1;;;19642:18:14;;;19635:42;19694:19;;4020:73:1;19311:408:14;4020:73:1;-1:-1:-1;4111:24:1;;;;:15;:24;;;;;;-1:-1:-1;;;;;4111:24:1;;3925:217::o;3463:401::-;3543:13;3559:23;3574:7;3559:14;:23::i;:::-;3543:39;;3606:5;-1:-1:-1;;;;;3600:11:1;:2;-1:-1:-1;;;;;3600:11:1;;;3592:57;;;;-1:-1:-1;;;3592:57:1;;22144:2:14;3592:57:1;;;22126:21:14;22183:2;22163:18;;;22156:30;22222:34;22202:18;;;22195:62;-1:-1:-1;;;22273:18:14;;;22266:31;22314:19;;3592:57:1;21942:397:14;3592:57:1;666:10:8;-1:-1:-1;;;;;3681:21:1;;;;:62;;-1:-1:-1;3706:37:1;3723:5;666:10:8;4565:162:1;:::i;3706:37::-;3660:165;;;;-1:-1:-1;;;3660:165:1;;17167:2:14;3660:165:1;;;17149:21:14;17206:2;17186:18;;;17179:30;17245:34;17225:18;;;17218:62;17316:26;17296:18;;;17289:54;17360:19;;3660:165:1;16965:420:14;3660:165:1;3836:21;3845:2;3849:7;3836:8;:21::i;:::-;3533:331;3463:401;;:::o;6582:109:13:-;1045:6:0;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;2250:6:13::1;::::0;;;::::1;;;2249:7;2241:56;;;;-1:-1:-1::0;;;2241:56:13::1;;;;;;;:::i;:::-;6671:12:::2;:5;6679:4:::0;;6671:12:::2;:::i;5228:389::-:0;1045:6:0;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;1234:4:13::1;1279:22;1187:3;1140:2;1279:22;:::i;:::-;:35;;;;:::i;:::-;5326:9:::0;5310:13:::1;1622:10:4::0;:17;;1535:111;5310:13:13::1;:32;;;;:::i;:::-;:43;;5302:64;;;::::0;-1:-1:-1;;;5302:64:13;;18816:2:14;5302:64:13::1;::::0;::::1;18798:21:14::0;18855:1;18835:18;;;18828:29;-1:-1:-1;;;18873:18:14;;;18866:38;18921:18;;5302:64:13::1;18614:331:14::0;5302:64:13::1;5385:12;::::0;1140:2:::1;::::0;5385:31:::1;::::0;5400:9;;5385:31:::1;:::i;:::-;:43;;5377:67;;;::::0;-1:-1:-1;;;5377:67:13;;20287:2:14;5377:67:13::1;::::0;::::1;20269:21:14::0;20326:2;20306:18;;;20299:30;-1:-1:-1;;;20345:18:14;;;20338:41;20396:18;;5377:67:13::1;20085:335:14::0;5377:67:13::1;5470:9;5465:145;5485:20:::0;;::::1;5465:145;;;5527:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;;;;;;5556:42;5566:9;;5576:1;5566:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1622:10:4::0;:17;5580:13:13::1;:17;::::0;5596:1:::1;5580:17;:::i;:::-;5556:9;:42::i;:::-;5507:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5465:145;;4789:330:1::0;4978:41;666:10:8;5011:7:1;4978:18;:41::i;:::-;4970:103;;;;-1:-1:-1;;;4970:103:1;;;;;;;:::i;:::-;5084:28;5094:4;5100:2;5104:7;5084:9;:28::i;1211:253:4:-;1308:7;1343:23;1360:5;1343:16;:23::i;:::-;1335:5;:31;1327:87;;;;-1:-1:-1;;;1327:87:4;;11946:2:14;1327:87:4;;;11928:21:14;11985:2;11965:18;;;11958:30;12024:34;12004:18;;;11997:62;-1:-1:-1;;;12075:18:14;;;12068:41;12126:19;;1327:87:4;11744:407:14;1327:87:4;-1:-1:-1;;;;;;1431:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1211:253::o;5629:183:13:-;1045:6:0;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;5687:14:13::1;::::0;-1:-1:-1;;;;;5687:14:13::1;5679:63;5740:1;5712:25;:21;5736:1;5712:25;:::i;:::-;:29;;;;:::i;:::-;5679:63;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;5753:51:13::1;::::0;5761:10:::1;::::0;5782:21:::1;5753:51:::0;::::1;;;::::0;::::1;::::0;;;5782:21;5761:10;5753:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;5629:183::o:0;5185:179:1:-;5318:39;5335:4;5341:2;5345:7;5318:39;;;;;;;;;;;;:16;:39::i;1718:230:4:-;1793:7;1828:30;1622:10;:17;;1535:111;1828:30;1820:5;:38;1812:95;;;;-1:-1:-1;;;1812:95:4;;23643:2:14;1812:95:4;;;23625:21:14;23682:2;23662:18;;;23655:30;23721:34;23701:18;;;23694:62;-1:-1:-1;;;23772:18:14;;;23765:42;23824:19;;1812:95:4;23441:408:14;1812:95:4;1924:10;1935:5;1924:17;;;;;;;;:::i;:::-;;;;;;;;;1917:24;;1718:230;;;:::o;6826:108:13:-;1045:6:0;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;2250:6:13::1;::::0;;;::::1;;;2249:7;2241:56;;;;-1:-1:-1::0;;;2241:56:13::1;;;;;;;:::i;:::-;6907:19:::2;:13;6923:3:::0;;6907:19:::2;:::i;2117:235:1:-:0;2189:7;2224:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2224:16:1;2258:19;2250:73;;;;-1:-1:-1;;;2250:73:1;;18003:2:14;2250:73:1;;;17985:21:14;18042:2;18022:18;;;18015:30;18081:34;18061:18;;;18054:62;-1:-1:-1;;;18132:18:14;;;18125:39;18181:19;;2250:73:1;17801:405:14;1855:205:1;1927:7;-1:-1:-1;;;;;1954:19:1;;1946:74;;;;-1:-1:-1;;;1946:74:1;;17592:2:14;1946:74:1;;;17574:21:14;17631:2;17611:18;;;17604:30;17670:34;17650:18;;;17643:62;-1:-1:-1;;;17721:18:14;;;17714:40;17771:19;;1946:74:1;17390:406:14;1946:74:1;-1:-1:-1;;;;;;2037:16:1;;;;;:9;:16;;;;;;;1855:205::o;1605:92:0:-;1045:6;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;1669:21:::1;1687:1;1669:9;:21::i;:::-;1605:92::o:0;2329:356:13:-;1045:6:0;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;2417:9:13::1;2413:262;2432:18:::0;;::::1;2413:262;;;2472:13;2488:7;;2496:1;2488:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2472:26:::0;-1:-1:-1;;;;;;2521:19:13;::::1;2513:44;;;::::0;-1:-1:-1;;;2513:44:13;;10894:2:14;2513:44:13::1;::::0;::::1;10876:21:14::0;10933:2;10913:18;;;10906:30;-1:-1:-1;;;10952:18:14;;;10945:42;11004:18;;2513:44:13::1;10692:336:14::0;2513:44:13::1;-1:-1:-1::0;;;;;2581:19:13;::::1;;::::0;;;:12:::1;:19;::::0;;;;;::::1;;2580:20;2572:48;;;::::0;-1:-1:-1;;;2572:48:13;;16145:2:14;2572:48:13::1;::::0;::::1;16127:21:14::0;16184:2;16164:18;;;16157:30;-1:-1:-1;;;16203:18:14;;;16196:45;16258:18;;2572:48:13::1;15943:339:14::0;2572:48:13::1;-1:-1:-1::0;;;;;2637:19:13::1;;::::0;;;:12:::1;:19;::::0;;;;:26;;-1:-1:-1;;2637:26:13::1;2659:4;2637:26;::::0;;2452:3;::::1;::::0;::::1;:::i;:::-;;;;2413:262;;6266:95:::0;1045:6:0;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;6342:11:13::1;::::0;;-1:-1:-1;;6327:26:13;::::1;6342:11;::::0;;::::1;6341:12;6327:26;::::0;;6266:95::o;4474:742::-;4554:8;;;;;;;4553:9;:24;;;;-1:-1:-1;4566:11:13;;;;4553:24;4545:51;;;;-1:-1:-1;;;4545:51:13;;10551:2:14;4545:51:13;;;10533:21:14;10590:2;10570:18;;;10563:30;-1:-1:-1;;;10609:18:14;;;10602:44;10663:18;;4545:51:13;10349:338:14;4545:51:13;4628:10;4615:24;;;;:12;:24;;;;;;;;4607:50;;;;-1:-1:-1;;;4607:50:13;;21442:2:14;4607:50:13;;;21424:21:14;21481:2;21461:18;;;21454:30;-1:-1:-1;;;21500:18:14;;;21493:43;21553:18;;4607:50:13;21240:337:14;4607:50:13;1234:4;1279:22;1187:3;1140:2;1279:22;:::i;:::-;:35;;;;:::i;:::-;1622:10:4;:17;4676:23:13;4668:48;;;;-1:-1:-1;;;4668:48:13;;14648:2:14;4668:48:13;;;14630:21:14;14687:2;14667:18;;;14660:30;-1:-1:-1;;;14706:18:14;;;14699:42;14758:18;;4668:48:13;14446:336:14;4668:48:13;1187:3;4757:13;4735:19;;:35;;;;:::i;:::-;:50;;4727:77;;;;-1:-1:-1;;;4727:77:13;;24056:2:14;4727:77:13;;;24038:21:14;24095:2;24075:18;;;24068:30;-1:-1:-1;;;24114:18:14;;;24107:44;24168:18;;4727:77:13;23854:338:14;4727:77:13;4876:20;;4845:10;4823:33;;;;:21;:33;;;;;;:49;;4859:13;;4823:49;:::i;:::-;:73;;4815:98;;;;-1:-1:-1;;;4815:98:13;;24399:2:14;4815:98:13;;;24381:21:14;24438:2;24418:18;;;24411:30;-1:-1:-1;;;24457:18:14;;;24450:42;24509:18;;4815:98:13;24197:336:14;4815:98:13;4961:9;4932:25;4944:13;1357:10;4932:25;:::i;:::-;:38;;4924:67;;;;-1:-1:-1;;;4924:67:13;;24740:2:14;4924:67:13;;;24722:21:14;24779:2;24759:18;;;24752:30;-1:-1:-1;;;24798:18:14;;;24791:46;24854:18;;4924:67:13;24538:340:14;4924:67:13;5017:9;5012:197;5036:13;5032:1;:17;5012:197;;;5071:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;5129:10:13;5107:33;;;;:21;:33;;;;;:35;;;;;;:::i;:::-;;;;;;5157:40;5167:10;5179:13;1622:10:4;:17;;1535:111;5157:40:13;5051:3;;;;:::i;:::-;;;;5012:197;;;;4474:742;:::o;6703:111::-;1045:6:0;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;2250:6:13::1;::::0;;;::::1;;;2249:7;2241:56;;;;-1:-1:-1::0;;;2241:56:13::1;;;;;;;:::i;:::-;6788:18:::2;:12;6803:3:::0;;6788:18:::2;:::i;2576:102:1:-:0;2632:13;2664:7;2657:14;;;;;:::i;6179:75:13:-;1045:6:0;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;6233:6:13::1;:13:::0;;-1:-1:-1;;6233:13:13::1;::::0;::::1;::::0;;6179:75::o;3524:938::-;3655:8;;;;;;;3647:32;;;;-1:-1:-1;;;3647:32:13;;15392:2:14;3647:32:13;;;15374:21:14;15431:2;15411:18;;;15404:30;-1:-1:-1;;;15450:18:14;;;15443:41;15501:18;;3647:32:13;15190:335:14;3647:32:13;3699:11;;;;3698:12;3690:37;;;;-1:-1:-1;;;3690:37:13;;16489:2:14;3690:37:13;;;16471:21:14;16528:2;16508:18;;;16501:30;-1:-1:-1;;;16547:18:14;;;16540:42;16599:18;;3690:37:13;16287:336:14;3690:37:13;3746:34;3764:4;3770:9;3746:17;:34::i;:::-;3738:69;;;;-1:-1:-1;;;3738:69:13;;11235:2:14;3738:69:13;;;11217:21:14;11274:2;11254:18;;;11247:30;-1:-1:-1;;;11293:18:14;;;11286:52;11355:18;;3738:69:13;11033:346:14;3738:69:13;3827:11;3839:5;3827:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3826:19;3818:41;;;;-1:-1:-1;;;3818:41:13;;22888:2:14;3818:41:13;;;22870:21:14;22927:1;22907:18;;;22900:29;-1:-1:-1;;;22945:18:14;;;22938:39;22994:18;;3818:41:13;22686:332:14;3818:41:13;3931:4;3878:49;3894:10;3906:13;3921:5;3878:15;:49::i;:::-;:57;3870:79;;;;-1:-1:-1;;;3870:79:13;;16830:2:14;3870:79:13;;;16812:21:14;16869:1;16849:18;;;16842:29;-1:-1:-1;;;16887:18:14;;;16880:39;16936:18;;3870:79:13;16628:332:14;3870:79:13;1234:4;1279:22;1187:3;1140:2;1279:22;:::i;:::-;:35;;;;:::i;:::-;1622:10:4;:17;3968:23:13;3960:48;;;;-1:-1:-1;;;3960:48:13;;14648:2:14;3960:48:13;;;14630:21:14;14687:2;14667:18;;;14660:30;-1:-1:-1;;;14706:18:14;;;14699:42;14758:18;;3960:48:13;14446:336:14;3960:48:13;1234:4;4048:13;4027:18;;:34;;;;:::i;:::-;:48;;4019:74;;;;-1:-1:-1;;;4019:74:13;;22546:2:14;4019:74:13;;;22528:21:14;22585:2;22565:18;;;22558:30;-1:-1:-1;;;22604:18:14;;;22597:43;22657:18;;4019:74:13;22344:337:14;4019:74:13;1413:1;4112:13;:29;;4104:61;;;;-1:-1:-1;;;4104:61:13;;13541:2:14;4104:61:13;;;13523:21:14;13580:2;13560:18;;;13553:30;-1:-1:-1;;;13599:18:14;;;13592:49;13658:18;;4104:61:13;13339:343:14;4104:61:13;4213:9;4184:25;4196:13;1357:10;4184:25;:::i;:::-;:38;;4176:67;;;;-1:-1:-1;;;4176:67:13;;24740:2:14;4176:67:13;;;24722:21:14;24779:2;24759:18;;;24752:30;-1:-1:-1;;;24798:18:14;;;24791:46;24854:18;;4176:67:13;24538:340:14;4176:67:13;4268:9;4264:145;4287:13;4283:1;:17;4264:145;;;4322:18;:20;;;:18;:20;;;:::i;:::-;;;;;;4357:40;4367:10;4379:13;1622:10:4;:17;;1535:111;4357:40:13;4302:3;;;;:::i;:::-;;;;4264:145;;;;4450:4;4429:11;4441:5;4429:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;-1:-1:-1;;4429:25:13;;;;;;;;;-1:-1:-1;;;;3524:938:13:o;4209:290:1:-;-1:-1:-1;;;;;4311:24:1;;666:10:8;4311:24:1;;4303:62;;;;-1:-1:-1;;;4303:62:1;;14294:2:14;4303:62:1;;;14276:21:14;14333:2;14313:18;;;14306:30;14372:27;14352:18;;;14345:55;14417:18;;4303:62:1;14092:349:14;4303:62:1;666:10:8;4376:32:1;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4376:42:1;;;;;;;;;;;;:53;;-1:-1:-1;;4376:53:1;;;;;;;;;;4444:48;;9317:41:14;;;4376:42:1;;666:10:8;4444:48:1;;9290:18:14;4444:48:1;;;;;;;4209:290;;:::o;2693:308:13:-;1045:6:0;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;2786:9:13::1;2782:212;2801:18:::0;;::::1;2782:212;;;2841:13;2857:7;;2865:1;2857:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2841:26:::0;-1:-1:-1;;;;;;2890:19:13;::::1;2882:44;;;::::0;-1:-1:-1;;;2882:44:13;;10894:2:14;2882:44:13::1;::::0;::::1;10876:21:14::0;10933:2;10913:18;;;10906:30;-1:-1:-1;;;10952:18:14;;;10945:42;11004:18;;2882:44:13::1;10692:336:14::0;2882:44:13::1;-1:-1:-1::0;;;;;2955:19:13::1;2977:5;2955:19:::0;;;:12:::1;:19;::::0;;;;:27;;-1:-1:-1;;2955:27:13::1;::::0;;2821:3;::::1;::::0;::::1;:::i;:::-;;;;2782:212;;5430:320:1::0;5599:41;666:10:8;5632:7:1;5599:18;:41::i;:::-;5591:103;;;;-1:-1:-1;;;5591:103:1;;;;;;;:::i;:::-;5704:39;5718:4;5724:2;5728:7;5737:5;5704:13;:39::i;:::-;5430:320;;;;:::o;7136:254:13:-;7287:4:1;7310:16;;;:7;:16;;;;;;7209:13:13;;-1:-1:-1;;;;;7310:16:1;7235:60:13;;;;-1:-1:-1;;;7235:60:13;;21784:2:14;7235:60:13;;;21766:21:14;21823:2;21803:18;;;21796:30;21862:33;21842:18;;;21835:61;21913:18;;7235:60:13;21582:355:14;7235:60:13;7347:13;7362:18;:7;:16;:18::i;:::-;7330:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7316:66;;7136:254;;;:::o;1245:69::-;1234:4;1279:22;1187:3;1140:2;1279:22;:::i;:::-;:35;;;;:::i;:::-;1245:69;:::o;7027:97::-;7071:13;7104:12;7097:19;;;;;:::i;1846:189:0:-;1045:6;;-1:-1:-1;;;;;1045:6:0;666:10:8;1185:23:0;1177:68;;;;-1:-1:-1;;;1177:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1934:22:0;::::1;1926:73;;;::::0;-1:-1:-1;;;1926:73:0;;12777:2:14;1926:73:0::1;::::0;::::1;12759:21:14::0;12816:2;12796:18;;;12789:30;12855:34;12835:18;;;12828:62;-1:-1:-1;;;12906:18:14;;;12899:36;12952:19;;1926:73:0::1;12575:402:14::0;1926:73:0::1;2009:19;2019:8;2009:9;:19::i;1865::13:-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1496:300:1:-;1598:4;-1:-1:-1;;;;;;1633:40:1;;-1:-1:-1;;;1633:40:1;;:104;;-1:-1:-1;;;;;;;1689:48:1;;-1:-1:-1;;;1689:48:1;1633:104;:156;;;-1:-1:-1;;;;;;;;;;871:40:11;;;1753:36:1;763:155:11;11073:171:1;11147:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11147:29:1;-1:-1:-1;;;;;11147:29:1;;;;;;;;:24;;11200:23;11147:24;11200:14;:23::i;:::-;-1:-1:-1;;;;;11191:46:1;;;;;;;;;;;11073:171;;:::o;8179:108::-;8254:26;8264:2;8268:7;8254:26;;;;;;;;;;;;:9;:26::i;7505:344::-;7598:4;7310:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7310:16:1;7614:73;;;;-1:-1:-1;;;7614:73:1;;15732:2:14;7614:73:1;;;15714:21:14;15771:2;15751:18;;;15744:30;15810:34;15790:18;;;15783:62;-1:-1:-1;;;15861:18:14;;;15854:42;15913:19;;7614:73:1;15530:408:14;7614:73:1;7697:13;7713:23;7728:7;7713:14;:23::i;:::-;7697:39;;7765:5;-1:-1:-1;;;;;7754:16:1;:7;-1:-1:-1;;;;;7754:16:1;;:51;;;;7798:7;-1:-1:-1;;;;;7774:31:1;:20;7786:7;7774:11;:20::i;:::-;-1:-1:-1;;;;;7774:31:1;;7754:51;:87;;;-1:-1:-1;;;;;;4685:25:1;;;4662:4;4685:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7809:32;7746:96;7505:344;-1:-1:-1;;;;7505:344:1:o;10402:560::-;10556:4;-1:-1:-1;;;;;10529:31:1;:23;10544:7;10529:14;:23::i;:::-;-1:-1:-1;;;;;10529:31:1;;10521:85;;;;-1:-1:-1;;;10521:85:1;;20627:2:14;10521:85:1;;;20609:21:14;20666:2;20646:18;;;20639:30;20705:34;20685:18;;;20678:62;-1:-1:-1;;;20756:18:14;;;20749:39;20805:19;;10521:85:1;20425:405:14;10521:85:1;-1:-1:-1;;;;;10624:16:1;;10616:65;;;;-1:-1:-1;;;10616:65:1;;13889:2:14;10616:65:1;;;13871:21:14;13928:2;13908:18;;;13901:30;13967:34;13947:18;;;13940:62;-1:-1:-1;;;14018:18:14;;;14011:34;14062:19;;10616:65:1;13687:400:14;10616:65:1;10692:39;10713:4;10719:2;10723:7;10692:20;:39::i;:::-;10793:29;10810:1;10814:7;10793:8;:29::i;:::-;-1:-1:-1;;;;;10833:15:1;;;;;;:9;:15;;;;;:20;;10852:1;;10833:15;:20;;10852:1;;10833:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10863:13:1;;;;;;:9;:13;;;;;:18;;10880:1;;10863:13;:18;;10880:1;;10863:18;:::i;:::-;;;;-1:-1:-1;;10891:16:1;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10891:21:1;-1:-1:-1;;;;;10891:21:1;;;;;;;;;10928:27;;10891:16;;10928:27;;;;;;;10402:560;;;:::o;2041:169:0:-;2115:6;;;-1:-1:-1;;;;;2131:17:0;;;-1:-1:-1;;;;;;2131:17:0;;;;;;;2163:40;;2115:6;;;2131:17;2115:6;;2163:40;;2096:16;;2163:40;2086:124;2041:169;:::o;3353:159:13:-;3439:4;3481:23;:4;3494:9;3481:12;:23::i;:::-;3463:14;;-1:-1:-1;;;;;3463:41:13;;;:14;;:41;;3353:159;-1:-1:-1;;;3353:159:13:o;3013:328::-;3109:7;3131:12;3263:6;3271:3;3276:5;3246:36;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3246:36:13;;;;;;;;;;3236:47;;3246:36;3236:47;;;;8333:66:14;3156:128:13;;;8321:79:14;;;;8416:12;;;8409:28;8453:12;;3156:128:13;;;;;;-1:-1:-1;;3156:128:13;;;;;;3146:151;;3156:128;3146:151;;;;;3013:328;-1:-1:-1;;;;;3013:328:13:o;6612:307:1:-;6763:28;6773:4;6779:2;6783:7;6763:9;:28::i;:::-;6809:48;6832:4;6838:2;6842:7;6851:5;6809:22;:48::i;:::-;6801:111;;;;-1:-1:-1;;;6801:111:1;;;;;;;:::i;275:703:9:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:9;;;;;;;;;;;;-1:-1:-1;;;574:10:9;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:9;;-1:-1:-1;720:2:9;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:9;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:9;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;849:56:9;;;;;;;;-1:-1:-1;919:11:9;928:2;919:11;;:::i;:::-;;;791:150;;8508:311:1;8633:18;8639:2;8643:7;8633:5;:18::i;:::-;8682:54;8713:1;8717:2;8721:7;8730:5;8682:22;:54::i;:::-;8661:151;;;;-1:-1:-1;;;8661:151:1;;;;;;;:::i;2544:572:4:-;-1:-1:-1;;;;;2743:18:4;;2739:183;;2777:40;2809:7;3925:10;:17;;3898:24;;;;:15;:24;;;;;:44;;;3952:24;;;;;;;;;;;;3822:161;2777:40;2739:183;;;2846:2;-1:-1:-1;;;;;2838:10:4;:4;-1:-1:-1;;;;;2838:10:4;;2834:88;;2864:47;2897:4;2903:7;2864:32;:47::i;:::-;-1:-1:-1;;;;;2935:16:4;;2931:179;;2967:45;3004:7;2967:36;:45::i;2931:179::-;3039:4;-1:-1:-1;;;;;3033:10:4;:2;-1:-1:-1;;;;;3033:10:4;;3029:81;;3059:40;3087:2;3091:7;3059:27;:40::i;4203:227:10:-;4281:7;4301:17;4320:18;4342:27;4353:4;4359:9;4342:10;:27::i;:::-;4300:69;;;;4379:18;4391:5;4379:11;:18::i;:::-;-1:-1:-1;4414:9:10;4203:227;-1:-1:-1;;;4203:227:10:o;11797:778:1:-;11947:4;-1:-1:-1;;;;;11967:13:1;;1034:20:7;1080:8;11963:606:1;;12002:72;;-1:-1:-1;;;12002:72:1;;-1:-1:-1;;;;;12002:36:1;;;;;:72;;666:10:8;;12053:4:1;;12059:7;;12068:5;;12002:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12002:72:1;;;;;;;;-1:-1:-1;;12002:72:1;;;;;;;;;;;;:::i;:::-;;;11998:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12241:13:1;;12237:266;;12283:60;;-1:-1:-1;;;12283:60:1;;;;;;;:::i;12237:266::-;12455:6;12449:13;12440:6;12436:2;12432:15;12425:38;11998:519;-1:-1:-1;;;;;;12124:51:1;-1:-1:-1;;;12124:51:1;;-1:-1:-1;12117:58:1;;11963:606;-1:-1:-1;12554:4:1;11797:778;;;;;;:::o;9141:372::-;-1:-1:-1;;;;;9220:16:1;;9212:61;;;;-1:-1:-1;;;9212:61:1;;19152:2:14;9212:61:1;;;19134:21:14;;;19171:18;;;19164:30;19230:34;19210:18;;;19203:62;19282:18;;9212:61:1;18950:356:14;9212:61:1;7287:4;7310:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7310:16:1;:30;9283:58;;;;-1:-1:-1;;;9283:58:1;;13184:2:14;9283:58:1;;;13166:21:14;13223:2;13203:18;;;13196:30;13262;13242:18;;;13235:58;13310:18;;9283:58:1;12982:352:14;9283:58:1;9352:45;9381:1;9385:2;9389:7;9352:20;:45::i;:::-;-1:-1:-1;;;;;9408:13:1;;;;;;:9;:13;;;;;:18;;9425:1;;9408:13;:18;;9425:1;;9408:18;:::i;:::-;;;;-1:-1:-1;;9436:16:1;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9436:21:1;-1:-1:-1;;;;;9436:21:1;;;;;;;;9473:33;;9436:16;;;9473:33;;9436:16;;9473:33;9141:372;;:::o;4600:970:4:-;4862:22;4912:1;4887:22;4904:4;4887:16;:22::i;:::-;:26;;;;:::i;:::-;4923:18;4944:26;;;:17;:26;;;;;;4862:51;;-1:-1:-1;5074:28:4;;;5070:323;;-1:-1:-1;;;;;5140:18:4;;5118:19;5140:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5189:30;;;;;;:44;;;5305:30;;:17;:30;;;;;:43;;;5070:323;-1:-1:-1;5486:26:4;;;;:17;:26;;;;;;;;5479:33;;;-1:-1:-1;;;;;5529:18:4;;;;;:12;:18;;;;;:34;;;;;;;5522:41;4600:970::o;5858:1061::-;6132:10;:17;6107:22;;6132:21;;6152:1;;6132:21;:::i;:::-;6163:18;6184:24;;;:15;:24;;;;;;6552:10;:26;;6107:46;;-1:-1:-1;6184:24:4;;6107:46;;6552:26;;;;;;:::i;:::-;;;;;;;;;6530:48;;6614:11;6589:10;6600;6589:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6693:28;;;:15;:28;;;;;;;:41;;;6862:24;;;;;6855:31;6896:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5929:990;;;5858:1061;:::o;3410:217::-;3494:14;3511:20;3528:2;3511:16;:20::i;:::-;-1:-1:-1;;;;;3541:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3585:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3410:217:4:o;2138:1279:10:-;2219:7;2228:12;2449:9;:16;2469:2;2449:22;2445:966;;;2738:4;2723:20;;2717:27;2787:4;2772:20;;2766:27;2844:4;2829:20;;2823:27;2487:9;2815:36;2885:25;2896:4;2815:36;2717:27;2766;2885:10;:25::i;:::-;2878:32;;;;;;;;;2445:966;2931:9;:16;2951:2;2931:22;2927:484;;;3200:4;3185:20;;3179:27;3250:4;3235:20;;3229:27;3290:23;3301:4;3179:27;3229;3290:10;:23::i;:::-;3283:30;;;;;;;;2927:484;-1:-1:-1;3360:1:10;;-1:-1:-1;3364:35:10;2927:484;2138:1279;;;;;:::o;443:631::-;520:20;511:5;:29;;;;;;;;:::i;:::-;;507:561;;;443:631;:::o;507:561::-;616:29;607:5;:38;;;;;;;;:::i;:::-;;603:465;;;661:34;;-1:-1:-1;;;661:34:10;;10198:2:14;661:34:10;;;10180:21:14;10237:2;10217:18;;;10210:30;10276:26;10256:18;;;10249:54;10320:18;;661:34:10;9996:348:14;603:465:10;725:35;716:5;:44;;;;;;;;:::i;:::-;;712:356;;;776:41;;-1:-1:-1;;;776:41:10;;11586:2:14;776:41:10;;;11568:21:14;11625:2;11605:18;;;11598:30;11664:33;11644:18;;;11637:61;11715:18;;776:41:10;11384:355:14;712:356:10;847:30;838:5;:39;;;;;;;;:::i;:::-;;834:234;;;893:44;;-1:-1:-1;;;893:44:10;;14989:2:14;893:44:10;;;14971:21:14;15028:2;15008:18;;;15001:30;15067:34;15047:18;;;15040:62;-1:-1:-1;;;15118:18:14;;;15111:32;15160:19;;893:44:10;14787:398:14;834:234:10;967:30;958:5;:39;;;;;;;;:::i;:::-;;954:114;;;1013:44;;-1:-1:-1;;;1013:44:10;;18413:2:14;1013:44:10;;;18395:21:14;18452:2;18432:18;;;18425:30;18491:34;18471:18;;;18464:62;-1:-1:-1;;;18542:18:14;;;18535:32;18584:19;;1013:44:10;18211:398:14;5654:1603:10;5780:7;;6704:66;6691:79;;6687:161;;;-1:-1:-1;6802:1:10;;-1:-1:-1;6806:30:10;6786:51;;6687:161;6861:1;:7;;6866:2;6861:7;;:18;;;;;6872:1;:7;;6877:2;6872:7;;6861:18;6857:100;;;-1:-1:-1;6911:1:10;;-1:-1:-1;6915:30:10;6895:51;;6857:100;7068:24;;;7051:14;7068:24;;;;;;;;;9596:25:14;;;9669:4;9657:17;;9637:18;;;9630:45;;;;9691:18;;;9684:34;;;9734:18;;;9727:34;;;7068:24:10;;9568:19:14;;7068:24:10;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7068:24:10;;-1:-1:-1;;7068:24:10;;;-1:-1:-1;;;;;;;7106:20:10;;7102:101;;7158:1;7162:29;7142:50;;;;;;;7102:101;7221:6;-1:-1:-1;7229:20:10;;-1:-1:-1;5654:1603:10;;;;;;;;:::o;4684:379::-;4794:7;;-1:-1:-1;;;;;4891:75:10;;4992:3;4988:12;;;5002:2;4984:21;5031:25;5042:4;4984:21;5051:1;4891:75;5031:10;:25::i;:::-;5024:32;;;;;;4684:379;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:14;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:14;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:14;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:220::-;870:5;923:3;916:4;908:6;904:17;900:27;890:55;;941:1;938;931:12;890:55;963:79;1038:3;1029:6;1016:20;1009:4;1001:6;997:17;963:79;:::i;:::-;954:88;828:220;-1:-1:-1;;;828:220:14:o;1053:186::-;1112:6;1165:2;1153:9;1144:7;1140:23;1136:32;1133:52;;;1181:1;1178;1171:12;1133:52;1204:29;1223:9;1204:29;:::i;1244:260::-;1312:6;1320;1373:2;1361:9;1352:7;1348:23;1344:32;1341:52;;;1389:1;1386;1379:12;1341:52;1412:29;1431:9;1412:29;:::i;:::-;1402:39;;1460:38;1494:2;1483:9;1479:18;1460:38;:::i;:::-;1450:48;;1244:260;;;;;:::o;1509:328::-;1586:6;1594;1602;1655:2;1643:9;1634:7;1630:23;1626:32;1623:52;;;1671:1;1668;1661:12;1623:52;1694:29;1713:9;1694:29;:::i;:::-;1684:39;;1742:38;1776:2;1765:9;1761:18;1742:38;:::i;:::-;1732:48;;1827:2;1816:9;1812:18;1799:32;1789:42;;1509:328;;;;;:::o;1842:537::-;1937:6;1945;1953;1961;2014:3;2002:9;1993:7;1989:23;1985:33;1982:53;;;2031:1;2028;2021:12;1982:53;2054:29;2073:9;2054:29;:::i;:::-;2044:39;;2102:38;2136:2;2125:9;2121:18;2102:38;:::i;:::-;2092:48;;2187:2;2176:9;2172:18;2159:32;2149:42;;2242:2;2231:9;2227:18;2214:32;2269:18;2261:6;2258:30;2255:50;;;2301:1;2298;2291:12;2255:50;2324:49;2365:7;2356:6;2345:9;2341:22;2324:49;:::i;:::-;2314:59;;;1842:537;;;;;;;:::o;2384:347::-;2449:6;2457;2510:2;2498:9;2489:7;2485:23;2481:32;2478:52;;;2526:1;2523;2516:12;2478:52;2549:29;2568:9;2549:29;:::i;:::-;2539:39;;2628:2;2617:9;2613:18;2600:32;2675:5;2668:13;2661:21;2654:5;2651:32;2641:60;;2697:1;2694;2687:12;2641:60;2720:5;2710:15;;;2384:347;;;;;:::o;2736:254::-;2804:6;2812;2865:2;2853:9;2844:7;2840:23;2836:32;2833:52;;;2881:1;2878;2871:12;2833:52;2904:29;2923:9;2904:29;:::i;:::-;2894:39;2980:2;2965:18;;;;2952:32;;-1:-1:-1;;;2736:254:14:o;2995:615::-;3081:6;3089;3142:2;3130:9;3121:7;3117:23;3113:32;3110:52;;;3158:1;3155;3148:12;3110:52;3198:9;3185:23;3227:18;3268:2;3260:6;3257:14;3254:34;;;3284:1;3281;3274:12;3254:34;3322:6;3311:9;3307:22;3297:32;;3367:7;3360:4;3356:2;3352:13;3348:27;3338:55;;3389:1;3386;3379:12;3338:55;3429:2;3416:16;3455:2;3447:6;3444:14;3441:34;;;3471:1;3468;3461:12;3441:34;3524:7;3519:2;3509:6;3506:1;3502:14;3498:2;3494:23;3490:32;3487:45;3484:65;;;3545:1;3542;3535:12;3484:65;3576:2;3568:11;;;;;3598:6;;-1:-1:-1;2995:615:14;;-1:-1:-1;;;;2995:615:14:o;3615:806::-;3720:6;3728;3736;3744;3797:3;3785:9;3776:7;3772:23;3768:33;3765:53;;;3814:1;3811;3804:12;3765:53;3850:9;3837:23;3827:33;;3911:2;3900:9;3896:18;3883:32;3934:18;3975:2;3967:6;3964:14;3961:34;;;3991:1;3988;3981:12;3961:34;4014:49;4055:7;4046:6;4035:9;4031:22;4014:49;:::i;:::-;4004:59;;4116:2;4105:9;4101:18;4088:32;4072:48;;4145:2;4135:8;4132:16;4129:36;;;4161:1;4158;4151:12;4129:36;-1:-1:-1;4184:24:14;;4239:4;4231:13;;4227:27;-1:-1:-1;4217:55:14;;4268:1;4265;4258:12;4217:55;4291:73;4356:7;4351:2;4338:16;4333:2;4329;4325:11;4291:73;:::i;:::-;3615:806;;;;-1:-1:-1;4281:83:14;;4411:2;4396:18;4383:32;;-1:-1:-1;;;3615:806:14:o;4426:245::-;4484:6;4537:2;4525:9;4516:7;4512:23;4508:32;4505:52;;;4553:1;4550;4543:12;4505:52;4592:9;4579:23;4611:30;4635:5;4611:30;:::i;4676:249::-;4745:6;4798:2;4786:9;4777:7;4773:23;4769:32;4766:52;;;4814:1;4811;4804:12;4766:52;4846:9;4840:16;4865:30;4889:5;4865:30;:::i;4930:592::-;5001:6;5009;5062:2;5050:9;5041:7;5037:23;5033:32;5030:52;;;5078:1;5075;5068:12;5030:52;5118:9;5105:23;5147:18;5188:2;5180:6;5177:14;5174:34;;;5204:1;5201;5194:12;5174:34;5242:6;5231:9;5227:22;5217:32;;5287:7;5280:4;5276:2;5272:13;5268:27;5258:55;;5309:1;5306;5299:12;5258:55;5349:2;5336:16;5375:2;5367:6;5364:14;5361:34;;;5391:1;5388;5381:12;5361:34;5436:7;5431:2;5422:6;5418:2;5414:15;5410:24;5407:37;5404:57;;;5457:1;5454;5447:12;5527:180;5586:6;5639:2;5627:9;5618:7;5614:23;5610:32;5607:52;;;5655:1;5652;5645:12;5607:52;-1:-1:-1;5678:23:14;;5527:180;-1:-1:-1;5527:180:14:o;5712:257::-;5753:3;5791:5;5785:12;5818:6;5813:3;5806:19;5834:63;5890:6;5883:4;5878:3;5874:14;5867:4;5860:5;5856:16;5834:63;:::i;:::-;5951:2;5930:15;-1:-1:-1;;5926:29:14;5917:39;;;;5958:4;5913:50;;5712:257;-1:-1:-1;;5712:257:14:o;5974:185::-;6016:3;6054:5;6048:12;6069:52;6114:6;6109:3;6102:4;6095:5;6091:16;6069:52;:::i;:::-;6137:16;;;;;5974:185;-1:-1:-1;;5974:185:14:o;6164:462::-;6406:26;6402:31;6393:6;6389:2;6385:15;6381:53;6376:3;6369:66;6465:6;6460:2;6455:3;6451:12;6444:28;6351:3;6501:6;6495:13;6517:62;6572:6;6567:2;6562:3;6558:12;6551:4;6543:6;6539:17;6517:62;:::i;:::-;6599:16;;;;6617:2;6595:25;;6164:462;-1:-1:-1;;;;6164:462:14:o;6631:276::-;6762:3;6800:6;6794:13;6816:53;6862:6;6857:3;6850:4;6842:6;6838:17;6816:53;:::i;:::-;6885:16;;;;;6631:276;-1:-1:-1;;6631:276:14:o;6912:1174::-;7088:3;7117:1;7150:6;7144:13;7180:3;7202:1;7230:9;7226:2;7222:18;7212:28;;7290:2;7279:9;7275:18;7312;7302:61;;7356:4;7348:6;7344:17;7334:27;;7302:61;7382:2;7430;7422:6;7419:14;7399:18;7396:38;7393:165;;;-1:-1:-1;;;7457:33:14;;7513:4;7510:1;7503:15;7543:4;7464:3;7531:17;7393:165;7574:18;7601:104;;;;7719:1;7714:320;;;;7567:467;;7601:104;-1:-1:-1;;7634:24:14;;7622:37;;7679:16;;;;-1:-1:-1;7601:104:14;;7714:320;25138:1;25131:14;;;25175:4;25162:18;;7809:1;7823:165;7837:6;7834:1;7831:13;7823:165;;;7915:14;;7902:11;;;7895:35;7958:16;;;;7852:10;;7823:165;;;7827:3;;8017:6;8012:3;8008:16;8001:23;;7567:467;;;;;;;8050:30;8076:3;8068:6;8050:30;:::i;:::-;8043:37;6912:1174;-1:-1:-1;;;;;6912:1174:14:o;8684:488::-;-1:-1:-1;;;;;8953:15:14;;;8935:34;;9005:15;;9000:2;8985:18;;8978:43;9052:2;9037:18;;9030:34;;;9100:3;9095:2;9080:18;;9073:31;;;8878:4;;9121:45;;9146:19;;9138:6;9121:45;:::i;:::-;9113:53;8684:488;-1:-1:-1;;;;;;8684:488:14:o;9772:219::-;9921:2;9910:9;9903:21;9884:4;9941:44;9981:2;9970:9;9966:18;9958:6;9941:44;:::i;12156:414::-;12358:2;12340:21;;;12397:2;12377:18;;;12370:30;12436:34;12431:2;12416:18;;12409:62;-1:-1:-1;;;12502:2:14;12487:18;;12480:48;12560:3;12545:19;;12156:414::o;19724:356::-;19926:2;19908:21;;;19945:18;;;19938:30;20004:34;19999:2;19984:18;;19977:62;20071:2;20056:18;;19724:356::o;20835:400::-;21037:2;21019:21;;;21076:2;21056:18;;;21049:30;21115:34;21110:2;21095:18;;21088:62;-1:-1:-1;;;21181:2:14;21166:18;;21159:34;21225:3;21210:19;;20835:400::o;23023:413::-;23225:2;23207:21;;;23264:2;23244:18;;;23237:30;23303:34;23298:2;23283:18;;23276:62;-1:-1:-1;;;23369:2:14;23354:18;;23347:47;23426:3;23411:19;;23023:413::o;25191:128::-;25231:3;25262:1;25258:6;25255:1;25252:13;25249:39;;;25268:18;;:::i;:::-;-1:-1:-1;25304:9:14;;25191:128::o;25324:120::-;25364:1;25390;25380:35;;25395:18;;:::i;:::-;-1:-1:-1;25429:9:14;;25324:120::o;25449:168::-;25489:7;25555:1;25551;25547:6;25543:14;25540:1;25537:21;25532:1;25525:9;25518:17;25514:45;25511:71;;;25562:18;;:::i;:::-;-1:-1:-1;25602:9:14;;25449:168::o;25622:125::-;25662:4;25690:1;25687;25684:8;25681:34;;;25695:18;;:::i;:::-;-1:-1:-1;25732:9:14;;25622:125::o;25752:258::-;25824:1;25834:113;25848:6;25845:1;25842:13;25834:113;;;25924:11;;;25918:18;25905:11;;;25898:39;25870:2;25863:10;25834:113;;;25965:6;25962:1;25959:13;25956:48;;;-1:-1:-1;;26000:1:14;25982:16;;25975:27;25752:258::o;26015:380::-;26094:1;26090:12;;;;26137;;;26158:61;;26212:4;26204:6;26200:17;26190:27;;26158:61;26265:2;26257:6;26254:14;26234:18;26231:38;26228:161;;;26311:10;26306:3;26302:20;26299:1;26292:31;26346:4;26343:1;26336:15;26374:4;26371:1;26364:15;26228:161;;26015:380;;;:::o;26400:135::-;26439:3;-1:-1:-1;;26460:17:14;;26457:43;;;26480:18;;:::i;:::-;-1:-1:-1;26527:1:14;26516:13;;26400:135::o;26540:112::-;26572:1;26598;26588:35;;26603:18;;:::i;:::-;-1:-1:-1;26637:9:14;;26540:112::o;26657:127::-;26718:10;26713:3;26709:20;26706:1;26699:31;26749:4;26746:1;26739:15;26773:4;26770:1;26763:15;26789:127;26850:10;26845:3;26841:20;26838:1;26831:31;26881:4;26878:1;26871:15;26905:4;26902:1;26895:15;26921:127;26982:10;26977:3;26973:20;26970:1;26963:31;27013:4;27010:1;27003:15;27037:4;27034:1;27027:15;27053:127;27114:10;27109:3;27105:20;27102:1;27095:31;27145:4;27142:1;27135:15;27169:4;27166:1;27159:15;27185:127;27246:10;27241:3;27237:20;27234:1;27227:31;27277:4;27274:1;27267:15;27301:4;27298:1;27291:15;27317:127;27378:10;27373:3;27369:20;27366:1;27359:31;27409:4;27406:1;27399:15;27433:4;27430:1;27423:15;27449:131;-1:-1:-1;;;;;;27523:32:14;;27513:43;;27503:71;;27570:1;27567;27560:12
Swarm Source
ipfs://8e38558e2da865c0c52652d2796cd7188a632dce4cc912f352aabd798db9eca3
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.