Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
3,556 VCR
Holders
614
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 VCRLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
VipCardRoom
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "./ERC721A.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; contract VipCardRoom is Ownable, ERC721A, ReentrancyGuard { event MintTransEvent(address indexed minter, uint256 value); event MintEvent(address indexed minter, string indexed note, uint256 value); event DevMintEvent(address indexed minter, string indexed note, uint256 value); event RefundIfOver(address indexed minter, string indexed note, uint256 value); //number of limited purchases per person uint256 public mintLimitPerAddress; //current period number of issue uint256 public issueAmount = 0; uint256 public mintedAmount = 0; bool private _whiteListCheck; uint256 public maxAmountForDevs; uint32 public issueNo; //配置 struct SaleConfig { uint32 publicSaleStartTime; uint64 mintlistPrice; } SaleConfig public saleConfig; mapping(uint256 => bytes) private _tokenPayloads; // // metadata URI string private _baseTokenURI; address payable private _bankAccount; bytes32 public root; // address=>mapping(issueNo=>count) mapping(address => mapping(uint256 => uint256)) public whitelistMintCounter; string private _notRevealedURI; mapping(uint256 => bool) private _blindBoxOpened; // [issueNo]=seed mapping(uint256 => uint256) public seeds; mapping(uint256 => uint256) public dices; uint256 public issueStartTokenId; //[tokenId]=true mapping(uint256 => bool) public metadataOpened; constructor( uint256 maxBatchSize_, uint256 collectionSize_, uint256 maxNormalNftIndex_, uint256 maxAmountForDevs_ ) ERC721A("VCR", "VCR", maxBatchSize_, collectionSize_, maxNormalNftIndex_, maxAmountForDevs_) { require(maxNormalNftIndex_ <= collectionSize_,"larger collection size needed"); mintLimitPerAddress = maxBatchSize_; maxAmountForDevs = maxAmountForDevs_; _bankAccount = payable(msg.sender); } function setIssueParam(uint256 issueStartTokenId_, uint64 mintlistPriceWei, uint32 publicSaleStartTime,uint256 mintMaxLimit,uint256 issueAmount_, uint32 issueNo_) external onlyOwner { require(issueAmount_ > 0, "issue amount must be nonzero"); require(issueNo_ > 0, "issue No must be nonzero"); require(issueStartTokenId_ >= totalSupply(), "issue start token must >= totalSupply"); saleConfig = SaleConfig( publicSaleStartTime, mintlistPriceWei ); mintLimitPerAddress = mintMaxLimit; issueAmount = issueAmount_; issueNo = issueNo_; mintedAmount = 0; issueStartTokenId = issueStartTokenId_; } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } modifier isOpen() { require( issueNo > 0 && issueAmount > 0 && uint256(saleConfig.mintlistPrice) > 0 && uint256(saleConfig.publicSaleStartTime) > 0 ,"issue param do not set all"); _; } function mint(bytes32[] memory _proof, uint256 quantity) external payable isOpen callerIsUser { require(quantity > 0, "mint quantity must be nonzero"); uint256 _saleStartTime = uint256(saleConfig.publicSaleStartTime); require( _saleStartTime != 0 && block.timestamp >= _saleStartTime, "sale has not started yet" ); require( quantity <= maxBatchSize, "mint quantity more then maxBatchSize" ); require(issueAmount > mintedAmount, "reached issue amount"); uint256 price = uint256(saleConfig.mintlistPrice); require(price != 0, "nft sale has not begun yet"); uint256 cost = price * quantity; require(cost <= msg.value, "ether must be enough"); require((totalSupply() + quantity) <= maxNormalNftIndex, "reached max supply"); if (_whiteListCheck) { require(_whitelistVerify(_proof), "Invalid merkle proof"); require(whitelistMintCounter[msg.sender][issueNo] + quantity <= mintLimitPerAddress, "reached maxnot eligible for whitelist mint"); whitelistMintCounter[msg.sender][issueNo] += quantity; } _safeMint(msg.sender, quantity, false); mintedAmount += quantity; _bankAccount.transfer(cost); emit MintTransEvent(_bankAccount, cost); emit MintEvent(msg.sender, "mint token success", quantity); _refundIfOver(cost); } function adminMint(uint256 quantity) external onlyOwner { require(quantity > 0, "adminMint quantity must be nonzero"); require(issueAmount > mintedAmount, "reached issue amount"); require((totalSupply() + quantity) <= maxNormalNftIndex, "reached max supply"); _safeMint(msg.sender, quantity, false); mintedAmount += quantity; emit MintEvent(msg.sender, "adminMint token success", quantity); } function _refundIfOver(uint256 price) private { uint256 refundValue = msg.value - price; if (refundValue > 0) { payable(msg.sender).transfer(refundValue); emit RefundIfOver(msg.sender, "refund value", refundValue); } } function setMaxPerAddressDuringMint(uint256 val) external onlyOwner { require(val > 0, "maxPerAddressDuringMin must be above zero"); mintLimitPerAddress = val; } // For marketing etc. function devMint(address to, uint256 quantity) external onlyOwner { require(to != address(0x0), "to address must be valied"); require( leftAmountForDevs() >= quantity && quantity > 0, "too many already minted before dev mint" ); _safeMint(to, quantity, true); emit DevMintEvent(msg.sender, "devMint token", quantity); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdrawMoney() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant { _setOwnersExplicit(quantity); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return ownershipOf(tokenId); } function batchSetIssueTokensPayload(uint32[] memory tokenIds, bytes[] memory payloads) external onlyOwner { require(tokenIds.length == payloads.length, "tokenIds length must equals to payloads length"); for (uint256 i = 0; i < tokenIds.length; i++) { _tokenPayloads[tokenIds[i]] = payloads[i]; } } function setIssueTokenPayloadByTokenId(uint256 tokenId, bytes memory payload) external onlyOwner { if (_tokenPayloads[tokenId].length != 0x0) { _tokenPayloads[tokenId] = payload; } } function getTokenPayloadByTokenId(uint256 tokenId) public view returns(bytes memory) { return _tokenPayloads[tokenId]; } /** * @dev * rand dice method depending on the issueNo, seed */ function _random() private view returns(uint32) { uint256 random = uint256(keccak256(abi.encodePacked(issueNo, seeds[issueNo]))); return uint32(random % issueAmount); } function setMerkleRoot(bytes32 _root, bool _check) external onlyOwner { root = _root; _whiteListCheck = _check; } function _whitelistVerify(bytes32[] memory _proof) internal view returns(bool) { return MerkleProof.verify(_proof, root, keccak256(abi.encodePacked(msg.sender))); } function setNotRevealedURI(string memory fn) external onlyOwner { _notRevealedURI = fn; } function setBlindBoxParams(bool open, uint256 _seed) external onlyOwner { _blindBoxOpened[issueNo] = open; seeds[issueNo] = _seed; dices[issueNo] = _random(); } /** * @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(); if (_enableShowTokenName(tokenId)) { return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId))) : ""; } else { return bytes(_notRevealedURI).length > 0 ? _notRevealedURI : ""; } } /** * @dev * show token metadata check */ function _enableShowTokenName(uint256 tokenId) private view returns(bool){ bool result = _blindBoxOpened[issueNo]; return result ? result : metadataOpened[tokenId]; } /** * @dev * set metadataOpened */ function setMetadataOpened(uint256[] memory tokenIds) external onlyOwner { for (uint256 i = 0; i < tokenIds.length; i++) { metadataOpened[tokenIds[i]] = true; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; uint256 private _vipCurrentIndex = 0; uint256 internal immutable maxNormalNftIndex; uint256 private maxAmountForDevs; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_, uint256 maxNormalNftIndex_, uint256 maxAmountForDevs_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); require( maxNormalNftIndex_ > 0 && maxNormalNftIndex_ <= collectionSize_, "ERC721A: maxNormalNftIndex must be nonzero and must less then collectionSize"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; maxNormalNftIndex = maxNormalNftIndex_; _vipCurrentIndex = 0; maxAmountForDevs = maxAmountForDevs_; currentIndex = maxAmountForDevs; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); if (_ownerships[tokenId].addr != address(0)) { return _ownerships[tokenId]; } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { if (tokenId >= maxAmountForDevs) { return tokenId < currentIndex; } else { return tokenId < _vipCurrentIndex; } } function _safeMint(address to, uint256 quantity, bool vip) internal { _safeMint(to, quantity, "", vip); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * - `vip` vip custom made * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data, bool vip ) internal { uint256 startTokenId = (vip ? _vipCurrentIndex : currentIndex); require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { _ownerships[updatedIndex] = TokenOwnership(to, uint64(block.timestamp)); emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } if (vip) { _vipCurrentIndex = updatedIndex; } else { currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } // function _safeUpdateTokenPayload(uint256 tokenId) internal { TokenOwnership memory tos = ownershipOf(tokenId); if (tos.addr != address(0)) { _ownerships[tokenId] = TokenOwnership(tos.addr, tos.startTimestamp); } } function leftAmountForDevs() public view returns(uint256) { return maxAmountForDevs - _vipCurrentIndex; } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) 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 // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) 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 // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) 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); /** * @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 // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) 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 // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) 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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @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 = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 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 Message, created from `s`. 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(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @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 // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"maxNormalNftIndex_","type":"uint256"},{"internalType":"uint256","name":"maxAmountForDevs_","type":"uint256"}],"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":"minter","type":"address"},{"indexed":true,"internalType":"string","name":"note","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"DevMintEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"string","name":"note","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"MintEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"MintTransEvent","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":"minter","type":"address"},{"indexed":true,"internalType":"string","name":"note","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"RefundIfOver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"adminMint","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":"uint32[]","name":"tokenIds","type":"uint32[]"},{"internalType":"bytes[]","name":"payloads","type":"bytes[]"}],"name":"batchSetIssueTokensPayload","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenPayloadByTokenId","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"issueAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"issueNo","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"issueStartTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leftAmountForDevs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmountForDevs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"metadataOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLimitPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleConfig","outputs":[{"internalType":"uint32","name":"publicSaleStartTime","type":"uint32"},{"internalType":"uint64","name":"mintlistPrice","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seeds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"open","type":"bool"},{"internalType":"uint256","name":"_seed","type":"uint256"}],"name":"setBlindBoxParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"issueStartTokenId_","type":"uint256"},{"internalType":"uint64","name":"mintlistPriceWei","type":"uint64"},{"internalType":"uint32","name":"publicSaleStartTime","type":"uint32"},{"internalType":"uint256","name":"mintMaxLimit","type":"uint256"},{"internalType":"uint256","name":"issueAmount_","type":"uint256"},{"internalType":"uint32","name":"issueNo_","type":"uint32"}],"name":"setIssueParam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"setIssueTokenPayloadByTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxPerAddressDuringMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"bool","name":"_check","type":"bool"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"setMetadataOpened","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fn","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistMintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e0604052600060015560006002556000600a556000600d556000600e553480156200002a57600080fd5b506040516200417b3803806200417b8339810160408190526200004d91620003ca565b604051806040016040528060038152602001622b21a960e91b815250604051806040016040528060038152602001622b21a960e91b81525085858585620000a36200009d620002d060201b60201c565b620002d4565b60008311620001105760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008411620001725760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000107565b600082118015620001835750828211155b6200020c5760405162461bcd60e51b815260206004820152604c60248201527f455243373231413a206d61784e6f726d616c4e6674496e646578206d7573742060448201527f6265206e6f6e7a65726f20616e64206d757374206c657373207468656e20636f60648201526b6c6c656374696f6e53697a6560a01b608482015260a40162000107565b85516200022190600490602089019062000324565b5084516200023790600590602088019062000324565b5060a09390935260809190915260c052600060025560038190556001908155600b55505082821115620002ad5760405162461bcd60e51b815260206004820152601d60248201527f6c617267657220636f6c6c656374696f6e2073697a65206e6565646564000000604482015260640162000107565b600c939093555050601055601580546001600160a01b031916331790556200043e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620003329062000401565b90600052602060002090601f016020900481019282620003565760008555620003a1565b82601f106200037157805160ff1916838001178555620003a1565b82800160010185558215620003a1579182015b82811115620003a157825182559160200191906001019062000384565b50620003af929150620003b3565b5090565b5b80821115620003af5760008155600101620003b4565b60008060008060808587031215620003e157600080fd5b505082516020840151604085015160609095015191969095509092509050565b600181811c908216806200041657607f821691505b602082108114156200043857634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c051613cff6200047c600039600081816111880152611b6c0152600061100c0152600081816127b301526127e50152613cff6000f3fe6080604052600436106102c95760003560e01c80639231ab2a11610175578063c90ea964116100dc578063e985e9c511610095578063f2c4ce1e1161006f578063f2c4ce1e1461091b578063f2fde38b1461093b578063f47885bc1461095b578063f7f5f49b1461097b57600080fd5b8063e985e9c51461088f578063ebf0c717146108d8578063f0503e80146108ee57600080fd5b8063c90ea964146107e4578063cac5dc8514610804578063d7224ba014610819578063da7e52cc1461082f578063dc33e6811461084f578063e92c0f371461086f57600080fd5b8063a8f1c6d81161012e578063a8f1c6d814610739578063ac44600214610759578063b88d4fde1461076e578063bbefb42c1461078e578063c1f26123146107a4578063c87b56dd146107c457600080fd5b80639231ab2a1461065357806395d89b41146106a05780639ce7a700146106b5578063a22cb465146106cb578063a4534cab146106eb578063a79b41111461070157600080fd5b806342842e0e116102345780636b1f72f3116101ed57806371a4b5d9116101c757806371a4b5d9146105945780638da5cb5b146105b457806390aa0b0f146105d2578063912475ba1461062657600080fd5b80636b1f72f31461053f57806370a082311461055f578063715018a61461057f57600080fd5b806342842e0e1461048c57806345de0d9b146104ac5780634f6ccce7146104bf57806355f804b3146104df578063627804af146104ff5780636352211e1461051f57600080fd5b806318160ddd1161028657806318160ddd146103e1578063195fd2211461040057806323b872dd146104165780632d20fb60146104365780632d380242146104565780632f745c591461046c57600080fd5b806301ffc9a7146102ce578063030194a11461030357806306fdde0314610335578063081812fc14610357578063095ea7b31461038f5780630c4eee18146103b1575b600080fd5b3480156102da57600080fd5b506102ee6102e93660046137e4565b61099b565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506011546103209063ffffffff1681565b60405163ffffffff90911681526020016102fa565b34801561034157600080fd5b5061034a610a08565b6040516102fa9190613a31565b34801561036357600080fd5b506103776103723660046138d7565b610a9a565b6040516001600160a01b0390911681526020016102fa565b34801561039b57600080fd5b506103af6103aa366004613581565b610b28565b005b3480156103bd57600080fd5b506102ee6103cc3660046138d7565b601d6020526000908152604090205460ff1681565b3480156103ed57600080fd5b506001545b6040519081526020016102fa565b34801561040c57600080fd5b506103f2600d5481565b34801561042257600080fd5b506103af6104313660046134b4565b610c40565b34801561044257600080fd5b506103af6104513660046138d7565b610c4b565b34801561046257600080fd5b506103f2600e5481565b34801561047857600080fd5b506103f2610487366004613581565b610cde565b34801561049857600080fd5b506103af6104a73660046134b4565b610e56565b6103af6104ba3660046135ab565b610e71565b3480156104cb57600080fd5b506103f26104da3660046138d7565b611429565b3480156104eb57600080fd5b506103af6104fa36600461381e565b611492565b34801561050b57600080fd5b506103af61051a366004613581565b6114c8565b34801561052b57600080fd5b5061037761053a3660046138d7565b611621565b34801561054b57600080fd5b506103af61055a3660046137a5565b611633565b34801561056b57600080fd5b506103f261057a366004613466565b6116bf565b34801561058b57600080fd5b506103af611750565b3480156105a057600080fd5b5061034a6105af3660046138d7565b611786565b3480156105c057600080fd5b506000546001600160a01b0316610377565b3480156105de57600080fd5b506012546106029063ffffffff81169064010000000090046001600160401b031682565b6040805163ffffffff90931683526001600160401b039091166020830152016102fa565b34801561063257600080fd5b506103f26106413660046138d7565b601b6020526000908152604090205481565b34801561065f57600080fd5b5061067361066e3660046138d7565b611828565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102fa565b3480156106ac57600080fd5b5061034a611845565b3480156106c157600080fd5b506103f2600c5481565b3480156106d757600080fd5b506103af6106e6366004613557565b611854565b3480156106f757600080fd5b506103f2601c5481565b34801561070d57600080fd5b506103f261071c366004613581565b601760209081526000928352604080842090915290825290205481565b34801561074557600080fd5b506103af6107543660046137c1565b611912565b34801561076557600080fd5b506103af611955565b34801561077a57600080fd5b506103af6107893660046134f0565b611a62565b34801561079a57600080fd5b506103f260105481565b3480156107b057600080fd5b506103af6107bf3660046138d7565b611a9b565b3480156107d057600080fd5b5061034a6107df3660046138d7565b611c6d565b3480156107f057600080fd5b506103af6107ff3660046136df565b611e09565b34801561081057600080fd5b506103f2611f19565b34801561082557600080fd5b506103f2600a5481565b34801561083b57600080fd5b506103af61084a3660046138f0565b611f30565b34801561085b57600080fd5b506103f261086a366004613466565b611f9d565b34801561087b57600080fd5b506103af61088a3660046138d7565b611fa8565b34801561089b57600080fd5b506102ee6108aa366004613481565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b3480156108e457600080fd5b506103f260165481565b3480156108fa57600080fd5b506103f26109093660046138d7565b601a6020526000908152604090205481565b34801561092757600080fd5b506103af61093636600461388f565b612039565b34801561094757600080fd5b506103af610956366004613466565b612076565b34801561096757600080fd5b506103af610976366004613648565b612111565b34801561098757600080fd5b506103af61099636600461392c565b61219f565b60006001600160e01b031982166380ac58cd60e01b14806109cc57506001600160e01b03198216635b5e139f60e01b145b806109e757506001600160e01b0319821663780e9d6360e01b145b80610a0257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610a1790613bf7565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4390613bf7565b8015610a905780601f10610a6557610100808354040283529160200191610a90565b820191906000526020600020905b815481529060010190602001808311610a7357829003601f168201915b5050505050905090565b6000610aa582612343565b610b0c5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610b3382611621565b9050806001600160a01b0316836001600160a01b03161415610ba25760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b03565b336001600160a01b0382161480610bbe5750610bbe81336108aa565b610c305760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b03565b610c3b838383612363565b505050565b610c3b8383836123bf565b6000546001600160a01b03163314610c755760405162461bcd60e51b8152600401610b0390613a44565b6002600b541415610cc85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b03565b6002600b55610cd681612742565b506001600b55565b6000610ce9836116bf565b8210610d425760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b03565b6000610d4d60015490565b905060008060005b83811015610df6576000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610da757805192505b876001600160a01b0316836001600160a01b03161415610de35786841415610dd557509350610a0292505050565b83610ddf81613c2c565b9450505b5080610dee81613c2c565b915050610d55565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b03565b610c3b83838360405180602001604052806000815250611a62565b60115463ffffffff1615801590610e8a57506000600d54115b8015610ea8575060125464010000000090046001600160401b031615155b8015610ebb575060125463ffffffff1615155b610f075760405162461bcd60e51b815260206004820152601a60248201527f697373756520706172616d20646f206e6f742073657420616c6c0000000000006044820152606401610b03565b323314610f565760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610b03565b60008111610fa65760405162461bcd60e51b815260206004820152601d60248201527f6d696e74207175616e74697479206d757374206265206e6f6e7a65726f0000006044820152606401610b03565b60125463ffffffff168015801590610fbe5750804210155b61100a5760405162461bcd60e51b815260206004820152601860248201527f73616c6520686173206e6f7420737461727465642079657400000000000000006044820152606401610b03565b7f00000000000000000000000000000000000000000000000000000000000000008211156110865760405162461bcd60e51b8152602060048201526024808201527f6d696e74207175616e74697479206d6f7265207468656e206d6178426174636860448201526353697a6560e01b6064820152608401610b03565b600e54600d54116110d05760405162461bcd60e51b81526020600482015260146024820152731c995858da1959081a5cdcdd5948185b5bdd5b9d60621b6044820152606401610b03565b60125464010000000090046001600160401b0316806111315760405162461bcd60e51b815260206004820152601a60248201527f6e66742073616c6520686173206e6f7420626567756e207965740000000000006044820152606401610b03565b600061113d8483613b6d565b9050348111156111865760405162461bcd60e51b81526020600482015260146024820152730cae8d0cae440daeae6e840c4ca40cadcdeeaced60631b6044820152606401610b03565b7f0000000000000000000000000000000000000000000000000000000000000000846111b160015490565b6111bb9190613b41565b11156111fe5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610b03565b600f5460ff161561131f5761121285612929565b6112555760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21036b2b935b63290383937b7b360611b6044820152606401610b03565b600c5433600090815260176020908152604080832060115463ffffffff168452909152902054611286908690613b41565b11156112e75760405162461bcd60e51b815260206004820152602a60248201527f72656163686564206d61786e6f7420656c696769626c6520666f722077686974604482015269195b1a5cdd081b5a5b9d60b21b6064820152608401610b03565b33600090815260176020908152604080832060115463ffffffff16845290915281208054869290611319908490613b41565b90915550505b61132b3385600061296f565b83600e600082825461133d9190613b41565b90915550506015546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561137c573d6000803e3d6000fd5b506015546040518281526001600160a01b03909116907f6124e8846a12798d4b0c9cf7bdbe95ded0d785357f8ec696abe1cc38a7d018749060200160405180910390a2604051716d696e7420746f6b656e207375636365737360701b81526012016040519081900381208582529033907f864de76b858e33bb99e7ad3b6f058581538661529f5311ad2243ba1af51d1f229060200160405180910390a36114228161298a565b5050505050565b600061143460015490565b821061148e5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b03565b5090565b6000546001600160a01b031633146114bc5760405162461bcd60e51b8152600401610b0390613a44565b610c3b60148383613215565b6000546001600160a01b031633146114f25760405162461bcd60e51b8152600401610b0390613a44565b6001600160a01b0382166115485760405162461bcd60e51b815260206004820152601960248201527f746f2061646472657373206d7573742062652076616c696564000000000000006044820152606401610b03565b80611551611f19565b1015801561155f5750600081115b6115bb5760405162461bcd60e51b815260206004820152602760248201527f746f6f206d616e7920616c7265616479206d696e746564206265666f72652064604482015266195d881b5a5b9d60ca1b6064820152608401610b03565b6115c78282600161296f565b6040516c3232bb26b4b73a103a37b5b2b760991b8152600d016040519081900381208282529033907f8c6812c4d2cebbd5ec28cf9feb2d7ff1b4c542b89ce420dd44afbc4fea9e22ea906020015b60405180910390a35050565b600061162c82612a1d565b5192915050565b6000546001600160a01b0316331461165d5760405162461bcd60e51b8152600401610b0390613a44565b6011805463ffffffff9081166000908152601960209081526040808320805460ff191688151517905593549092168152601a9091522081905561169e612b55565b60115463ffffffff9081166000908152601b60205260409020911690555050565b60006001600160a01b03821661172b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b03565b506001600160a01b03166000908152600760205260409020546001600160801b031690565b6000546001600160a01b0316331461177a5760405162461bcd60e51b8152600401610b0390613a44565b6117846000612bca565b565b60008181526013602052604090208054606091906117a390613bf7565b80601f01602080910402602001604051908101604052809291908181526020018280546117cf90613bf7565b801561181c5780601f106117f15761010080835404028352916020019161181c565b820191906000526020600020905b8154815290600101906020018083116117ff57829003601f168201915b50505050509050919050565b6040805180820190915260008082526020820152610a0282612a1d565b606060058054610a1790613bf7565b6001600160a01b0382163314156118ad5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b03565b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101611615565b6000546001600160a01b0316331461193c5760405162461bcd60e51b8152600401610b0390613a44565b601691909155600f805460ff1916911515919091179055565b6000546001600160a01b0316331461197f5760405162461bcd60e51b8152600401610b0390613a44565b6002600b5414156119d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b03565b6002600b55604051600090339047908381818185875af1925050503d8060008114611a19576040519150601f19603f3d011682016040523d82523d6000602084013e611a1e565b606091505b5050905080610cd65760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610b03565b611a6d8484846123bf565b611a7984848484612c1a565b611a955760405162461bcd60e51b8152600401610b0390613a79565b50505050565b6000546001600160a01b03163314611ac55760405162461bcd60e51b8152600401610b0390613a44565b60008111611b205760405162461bcd60e51b815260206004820152602260248201527f61646d696e4d696e74207175616e74697479206d757374206265206e6f6e7a65604482015261726f60f01b6064820152608401610b03565b600e54600d5411611b6a5760405162461bcd60e51b81526020600482015260146024820152731c995858da1959081a5cdcdd5948185b5bdd5b9d60621b6044820152606401610b03565b7f000000000000000000000000000000000000000000000000000000000000000081611b9560015490565b611b9f9190613b41565b1115611be25760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610b03565b611bee3382600061296f565b80600e6000828254611c009190613b41565b90915550506040517f61646d696e4d696e7420746f6b656e207375636365737300000000000000000081526017016040519081900381208282529033907f864de76b858e33bb99e7ad3b6f058581538661529f5311ad2243ba1af51d1f229060200160405180910390a350565b6060611c7882612343565b611cdc5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b03565b6000611ce6612d28565b9050611cf183612d37565b15611d46576000815111611d145760405180602001604052806000815250611d3f565b80611d1e84612d6e565b604051602001611d2f9291906139c5565b6040516020818303038152906040525b9392505050565b600060188054611d5590613bf7565b905011611d715760405180602001604052806000815250611d3f565b60188054611d7e90613bf7565b80601f0160208091040260200160405190810160405280929190818152602001828054611daa90613bf7565b8015611df75780601f10611dcc57610100808354040283529160200191611df7565b820191906000526020600020905b815481529060010190602001808311611dda57829003601f168201915b50505050509392505050565b50919050565b6000546001600160a01b03163314611e335760405162461bcd60e51b8152600401610b0390613a44565b8051825114611e9b5760405162461bcd60e51b815260206004820152602e60248201527f746f6b656e496473206c656e677468206d75737420657175616c7320746f207060448201526d0c2f2d8dec2c8e640d8cadccee8d60931b6064820152608401610b03565b60005b8251811015610c3b57818181518110611eb957611eb9613c87565b602002602001015160136000858481518110611ed757611ed7613c87565b602002602001015163ffffffff1681526020019081526020016000209080519060200190611f06929190613295565b5080611f1181613c2c565b915050611e9e565b6000600254600354611f2b9190613bb4565b905090565b6000546001600160a01b03163314611f5a5760405162461bcd60e51b8152600401610b0390613a44565b60008281526013602052604090208054611f7390613bf7565b159050611f995760008281526013602090815260409091208251610c3b92840190613295565b5050565b6000610a0282612e6b565b6000546001600160a01b03163314611fd25760405162461bcd60e51b8152600401610b0390613a44565b600081116120345760405162461bcd60e51b815260206004820152602960248201527f6d617850657241646472657373447572696e674d696e206d7573742062652061604482015268626f7665207a65726f60b81b6064820152608401610b03565b600c55565b6000546001600160a01b031633146120635760405162461bcd60e51b8152600401610b0390613a44565b8051611f99906018906020840190613295565b6000546001600160a01b031633146120a05760405162461bcd60e51b8152600401610b0390613a44565b6001600160a01b0381166121055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b03565b61210e81612bca565b50565b6000546001600160a01b0316331461213b5760405162461bcd60e51b8152600401610b0390613a44565b60005b8151811015611f99576001601d600084848151811061215f5761215f613c87565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808061219790613c2c565b91505061213e565b6000546001600160a01b031633146121c95760405162461bcd60e51b8152600401610b0390613a44565b600082116122195760405162461bcd60e51b815260206004820152601c60248201527f697373756520616d6f756e74206d757374206265206e6f6e7a65726f000000006044820152606401610b03565b60008163ffffffff161161226f5760405162461bcd60e51b815260206004820152601860248201527f6973737565204e6f206d757374206265206e6f6e7a65726f00000000000000006044820152606401610b03565b6001548610156122cf5760405162461bcd60e51b815260206004820152602560248201527f697373756520737461727420746f6b656e206d757374203e3d20746f74616c536044820152647570706c7960d81b6064820152608401610b03565b6040805180820190915263ffffffff9485168082526001600160401b03969096166020909101819052601280546bffffffffffffffffffffffff191690961764010000000090910217909455600c91909155600d556011805463ffffffff1916929091169190911790556000600e55601c55565b6000600354821061235657506001541190565b506002541190565b919050565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006123ca82612a1d565b80519091506000906001600160a01b0316336001600160a01b031614806124015750336123f684610a9a565b6001600160a01b0316145b806124135750815161241390336108aa565b90508061247d5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b03565b846001600160a01b031682600001516001600160a01b0316146124f15760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b03565b6001600160a01b0384166125555760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b03565b6125656000848460000151612363565b6001600160a01b03851660009081526007602052604081208054600192906125979084906001600160801b0316613b8c565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260076020526040812080546001945090926125e391859116613b1f565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526006909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561266a846001613b41565b6000818152600660205260409020549091506001600160a01b03166126f95761269281612343565b156126f95760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600690935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600a54816127925760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610b03565b600060016127a08484613b41565b6127aa9190613bb4565b90506127d760017f0000000000000000000000000000000000000000000000000000000000000000613bb4565b81111561280c5761280960017f0000000000000000000000000000000000000000000000000000000000000000613bb4565b90505b61281581612343565b6128705760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610b03565b815b818111612915576000818152600660205260409020546001600160a01b03166129035760006128a082612a1d565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600690965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b8061290d81613c2c565b915050612872565b50612921816001613b41565b600a55505050565b6016546040516bffffffffffffffffffffffff193360601b166020820152600091610a029184919060340160405160208183030381529060405280519060200120612f09565b610c3b83836040518060200160405280600081525084612f1f565b60006129968234613bb4565b90508015611f9957604051339082156108fc029083906000818181858888f193505050501580156129cb573d6000803e3d6000fd5b506040516b726566756e642076616c756560a01b8152600c016040519081900381208282529033907f4850d3a8f584ee1b800a295d89f3d9c4874e30c469376ee64e74d53a037df11f90602001611615565b6040805180820190915260008082526020820152612a3a82612343565b612a995760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b03565b6000828152600660205260409020546001600160a01b031615612af557506000908152600660209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160401b03169082015290565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b03565b60115463ffffffff166000818152601a6020908152604080832054905192938493612b9b939192910160e09290921b6001600160e01b0319168252600482015260240190565b6040516020818303038152906040528051906020012060001c9050600d5481612bc49190613c47565b91505090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b15612d1c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c5e9033908990889088906004016139f4565b602060405180830381600087803b158015612c7857600080fd5b505af1925050508015612ca8575060408051601f3d908101601f19168201909252612ca591810190613801565b60015b612d02573d808015612cd6576040519150601f19603f3d011682016040523d82523d6000602084013e612cdb565b606091505b508051612cfa5760405162461bcd60e51b8152600401610b0390613a79565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612d20565b5060015b949350505050565b606060148054610a1790613bf7565b60115463ffffffff1660009081526019602052604081205460ff1680610a02576000838152601d602052604090205460ff16611d3f565b606081612d925750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612dbc5780612da681613c2c565b9150612db59050600a83613b59565b9150612d96565b6000816001600160401b03811115612dd657612dd6613c9d565b6040519080825280601f01601f191660200182016040528015612e00576020820181803683370190505b5090505b8415612d2057612e15600183613bb4565b9150612e22600a86613c47565b612e2d906030613b41565b60f81b818381518110612e4257612e42613c87565b60200101906001600160f81b031916908160001a905350612e64600a86613b59565b9450612e04565b60006001600160a01b038216612edd5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610b03565b506001600160a01b0316600090815260076020526040902054600160801b90046001600160801b031690565b600082612f1685846131a1565b14949350505050565b600081612f2e57600154612f32565b6002545b90506001600160a01b038516612f945760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b03565b612f9d81612343565b15612fea5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b03565b6001600160a01b0385166000908152600760209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190613046908890613b1f565b6001600160801b031681526020018683602001516130649190613b1f565b6001600160801b039081169091526001600160a01b03881660009081526007602090815260408220845194909101518316600160801b029390921692909217905582905b86811015613181576040805180820182526001600160a01b03808b168083526001600160401b03428116602080860191825260008981526006909152868120955186549251909316600160a01b026001600160e01b031990921692909416919091171790925591518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131456000898489612c1a565b6131615760405162461bcd60e51b8152600401610b0390613a79565b8161316b81613c2c565b925050808061317990613c2c565b9150506130a8565b508315613192576002819055613198565b60018190555b50505050505050565b600081815b845181101561320d5760008582815181106131c3576131c3613c87565b602002602001015190508083116131e957600083815260208290526040902092506131fa565b600081815260208490526040902092505b508061320581613c2c565b9150506131a6565b509392505050565b82805461322190613bf7565b90600052602060002090601f0160209004810192826132435760008555613289565b82601f1061325c5782800160ff19823516178555613289565b82800160010185558215613289579182015b8281111561328957823582559160200191906001019061326e565b5061148e929150613309565b8280546132a190613bf7565b90600052602060002090601f0160209004810192826132c35760008555613289565b82601f106132dc57805160ff1916838001178555613289565b82800160010185558215613289579182015b828111156132895782518255916020019190600101906132ee565b5b8082111561148e576000815560010161330a565b60006001600160401b0383111561333757613337613c9d565b61334a601f8401601f1916602001613acc565b905082815283838301111561335e57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461235e57600080fd5b600082601f83011261339d57600080fd5b813560206133b26133ad83613afc565b613acc565b80838252828201915082860187848660051b89010111156133d257600080fd5b6000805b868110156134145782356001600160401b038111156133f3578283fd5b6134018b88838d0101613432565b86525093850193918501916001016133d6565b509198975050505050505050565b8035801515811461235e57600080fd5b600082601f83011261344357600080fd5b611d3f8383356020850161331e565b803563ffffffff8116811461235e57600080fd5b60006020828403121561347857600080fd5b611d3f82613375565b6000806040838503121561349457600080fd5b61349d83613375565b91506134ab60208401613375565b90509250929050565b6000806000606084860312156134c957600080fd5b6134d284613375565b92506134e060208501613375565b9150604084013590509250925092565b6000806000806080858703121561350657600080fd5b61350f85613375565b935061351d60208601613375565b92506040850135915060608501356001600160401b0381111561353f57600080fd5b61354b87828801613432565b91505092959194509250565b6000806040838503121561356a57600080fd5b61357383613375565b91506134ab60208401613422565b6000806040838503121561359457600080fd5b61359d83613375565b946020939093013593505050565b600080604083850312156135be57600080fd5b82356001600160401b038111156135d457600080fd5b8301601f810185136135e557600080fd5b803560206135f56133ad83613afc565b80838252828201915082850189848660051b880101111561361557600080fd5b600095505b8486101561363857803583526001959095019491830191830161361a565b5098969091013596505050505050565b6000602080838503121561365b57600080fd5b82356001600160401b0381111561367157600080fd5b8301601f8101851361368257600080fd5b80356136906133ad82613afc565b80828252848201915084840188868560051b87010111156136b057600080fd5b600094505b838510156136d35780358352600194909401939185019185016136b5565b50979650505050505050565b600080604083850312156136f257600080fd5b82356001600160401b038082111561370957600080fd5b818501915085601f83011261371d57600080fd5b8135602061372d6133ad83613afc565b8083825282820191508286018a848660051b890101111561374d57600080fd5b600096505b848710156137775761376381613452565b835260019690960195918301918301613752565b509650508601359250508082111561378e57600080fd5b5061379b8582860161338c565b9150509250929050565b600080604083850312156137b857600080fd5b61359d83613422565b600080604083850312156137d457600080fd5b823591506134ab60208401613422565b6000602082840312156137f657600080fd5b8135611d3f81613cb3565b60006020828403121561381357600080fd5b8151611d3f81613cb3565b6000806020838503121561383157600080fd5b82356001600160401b038082111561384857600080fd5b818501915085601f83011261385c57600080fd5b81358181111561386b57600080fd5b86602082850101111561387d57600080fd5b60209290920196919550909350505050565b6000602082840312156138a157600080fd5b81356001600160401b038111156138b757600080fd5b8201601f810184136138c857600080fd5b612d208482356020840161331e565b6000602082840312156138e957600080fd5b5035919050565b6000806040838503121561390357600080fd5b8235915060208301356001600160401b0381111561392057600080fd5b61379b85828601613432565b60008060008060008060c0878903121561394557600080fd5b8635955060208701356001600160401b038116811461396357600080fd5b945061397160408801613452565b9350606087013592506080870135915061398d60a08801613452565b90509295509295509295565b600081518084526139b1816020860160208601613bcb565b601f01601f19169290920160200192915050565b600083516139d7818460208801613bcb565b8351908301906139eb818360208801613bcb565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a2790830184613999565b9695505050505050565b602081526000611d3f6020830184613999565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715613af457613af4613c9d565b604052919050565b60006001600160401b03821115613b1557613b15613c9d565b5060051b60200190565b60006001600160801b038083168185168083038211156139eb576139eb613c5b565b60008219821115613b5457613b54613c5b565b500190565b600082613b6857613b68613c71565b500490565b6000816000190483118215151615613b8757613b87613c5b565b500290565b60006001600160801b0383811690831681811015613bac57613bac613c5b565b039392505050565b600082821015613bc657613bc6613c5b565b500390565b60005b83811015613be6578181015183820152602001613bce565b83811115611a955750506000910152565b600181811c90821680613c0b57607f821691505b60208210811415611e0357634e487b7160e01b600052602260045260246000fd5b6000600019821415613c4057613c40613c5b565b5060010190565b600082613c5657613c56613c71565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461210e57600080fdfea264697066735822122067943ee0e4013f84580f3103e5f79222264dd935299597286b4aca0672f8a2aa64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000003e9
Deployed Bytecode
0x6080604052600436106102c95760003560e01c80639231ab2a11610175578063c90ea964116100dc578063e985e9c511610095578063f2c4ce1e1161006f578063f2c4ce1e1461091b578063f2fde38b1461093b578063f47885bc1461095b578063f7f5f49b1461097b57600080fd5b8063e985e9c51461088f578063ebf0c717146108d8578063f0503e80146108ee57600080fd5b8063c90ea964146107e4578063cac5dc8514610804578063d7224ba014610819578063da7e52cc1461082f578063dc33e6811461084f578063e92c0f371461086f57600080fd5b8063a8f1c6d81161012e578063a8f1c6d814610739578063ac44600214610759578063b88d4fde1461076e578063bbefb42c1461078e578063c1f26123146107a4578063c87b56dd146107c457600080fd5b80639231ab2a1461065357806395d89b41146106a05780639ce7a700146106b5578063a22cb465146106cb578063a4534cab146106eb578063a79b41111461070157600080fd5b806342842e0e116102345780636b1f72f3116101ed57806371a4b5d9116101c757806371a4b5d9146105945780638da5cb5b146105b457806390aa0b0f146105d2578063912475ba1461062657600080fd5b80636b1f72f31461053f57806370a082311461055f578063715018a61461057f57600080fd5b806342842e0e1461048c57806345de0d9b146104ac5780634f6ccce7146104bf57806355f804b3146104df578063627804af146104ff5780636352211e1461051f57600080fd5b806318160ddd1161028657806318160ddd146103e1578063195fd2211461040057806323b872dd146104165780632d20fb60146104365780632d380242146104565780632f745c591461046c57600080fd5b806301ffc9a7146102ce578063030194a11461030357806306fdde0314610335578063081812fc14610357578063095ea7b31461038f5780630c4eee18146103b1575b600080fd5b3480156102da57600080fd5b506102ee6102e93660046137e4565b61099b565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506011546103209063ffffffff1681565b60405163ffffffff90911681526020016102fa565b34801561034157600080fd5b5061034a610a08565b6040516102fa9190613a31565b34801561036357600080fd5b506103776103723660046138d7565b610a9a565b6040516001600160a01b0390911681526020016102fa565b34801561039b57600080fd5b506103af6103aa366004613581565b610b28565b005b3480156103bd57600080fd5b506102ee6103cc3660046138d7565b601d6020526000908152604090205460ff1681565b3480156103ed57600080fd5b506001545b6040519081526020016102fa565b34801561040c57600080fd5b506103f2600d5481565b34801561042257600080fd5b506103af6104313660046134b4565b610c40565b34801561044257600080fd5b506103af6104513660046138d7565b610c4b565b34801561046257600080fd5b506103f2600e5481565b34801561047857600080fd5b506103f2610487366004613581565b610cde565b34801561049857600080fd5b506103af6104a73660046134b4565b610e56565b6103af6104ba3660046135ab565b610e71565b3480156104cb57600080fd5b506103f26104da3660046138d7565b611429565b3480156104eb57600080fd5b506103af6104fa36600461381e565b611492565b34801561050b57600080fd5b506103af61051a366004613581565b6114c8565b34801561052b57600080fd5b5061037761053a3660046138d7565b611621565b34801561054b57600080fd5b506103af61055a3660046137a5565b611633565b34801561056b57600080fd5b506103f261057a366004613466565b6116bf565b34801561058b57600080fd5b506103af611750565b3480156105a057600080fd5b5061034a6105af3660046138d7565b611786565b3480156105c057600080fd5b506000546001600160a01b0316610377565b3480156105de57600080fd5b506012546106029063ffffffff81169064010000000090046001600160401b031682565b6040805163ffffffff90931683526001600160401b039091166020830152016102fa565b34801561063257600080fd5b506103f26106413660046138d7565b601b6020526000908152604090205481565b34801561065f57600080fd5b5061067361066e3660046138d7565b611828565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102fa565b3480156106ac57600080fd5b5061034a611845565b3480156106c157600080fd5b506103f2600c5481565b3480156106d757600080fd5b506103af6106e6366004613557565b611854565b3480156106f757600080fd5b506103f2601c5481565b34801561070d57600080fd5b506103f261071c366004613581565b601760209081526000928352604080842090915290825290205481565b34801561074557600080fd5b506103af6107543660046137c1565b611912565b34801561076557600080fd5b506103af611955565b34801561077a57600080fd5b506103af6107893660046134f0565b611a62565b34801561079a57600080fd5b506103f260105481565b3480156107b057600080fd5b506103af6107bf3660046138d7565b611a9b565b3480156107d057600080fd5b5061034a6107df3660046138d7565b611c6d565b3480156107f057600080fd5b506103af6107ff3660046136df565b611e09565b34801561081057600080fd5b506103f2611f19565b34801561082557600080fd5b506103f2600a5481565b34801561083b57600080fd5b506103af61084a3660046138f0565b611f30565b34801561085b57600080fd5b506103f261086a366004613466565b611f9d565b34801561087b57600080fd5b506103af61088a3660046138d7565b611fa8565b34801561089b57600080fd5b506102ee6108aa366004613481565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b3480156108e457600080fd5b506103f260165481565b3480156108fa57600080fd5b506103f26109093660046138d7565b601a6020526000908152604090205481565b34801561092757600080fd5b506103af61093636600461388f565b612039565b34801561094757600080fd5b506103af610956366004613466565b612076565b34801561096757600080fd5b506103af610976366004613648565b612111565b34801561098757600080fd5b506103af61099636600461392c565b61219f565b60006001600160e01b031982166380ac58cd60e01b14806109cc57506001600160e01b03198216635b5e139f60e01b145b806109e757506001600160e01b0319821663780e9d6360e01b145b80610a0257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610a1790613bf7565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4390613bf7565b8015610a905780601f10610a6557610100808354040283529160200191610a90565b820191906000526020600020905b815481529060010190602001808311610a7357829003601f168201915b5050505050905090565b6000610aa582612343565b610b0c5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610b3382611621565b9050806001600160a01b0316836001600160a01b03161415610ba25760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b03565b336001600160a01b0382161480610bbe5750610bbe81336108aa565b610c305760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b03565b610c3b838383612363565b505050565b610c3b8383836123bf565b6000546001600160a01b03163314610c755760405162461bcd60e51b8152600401610b0390613a44565b6002600b541415610cc85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b03565b6002600b55610cd681612742565b506001600b55565b6000610ce9836116bf565b8210610d425760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b03565b6000610d4d60015490565b905060008060005b83811015610df6576000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610da757805192505b876001600160a01b0316836001600160a01b03161415610de35786841415610dd557509350610a0292505050565b83610ddf81613c2c565b9450505b5080610dee81613c2c565b915050610d55565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b03565b610c3b83838360405180602001604052806000815250611a62565b60115463ffffffff1615801590610e8a57506000600d54115b8015610ea8575060125464010000000090046001600160401b031615155b8015610ebb575060125463ffffffff1615155b610f075760405162461bcd60e51b815260206004820152601a60248201527f697373756520706172616d20646f206e6f742073657420616c6c0000000000006044820152606401610b03565b323314610f565760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610b03565b60008111610fa65760405162461bcd60e51b815260206004820152601d60248201527f6d696e74207175616e74697479206d757374206265206e6f6e7a65726f0000006044820152606401610b03565b60125463ffffffff168015801590610fbe5750804210155b61100a5760405162461bcd60e51b815260206004820152601860248201527f73616c6520686173206e6f7420737461727465642079657400000000000000006044820152606401610b03565b7f00000000000000000000000000000000000000000000000000000000000000028211156110865760405162461bcd60e51b8152602060048201526024808201527f6d696e74207175616e74697479206d6f7265207468656e206d6178426174636860448201526353697a6560e01b6064820152608401610b03565b600e54600d54116110d05760405162461bcd60e51b81526020600482015260146024820152731c995858da1959081a5cdcdd5948185b5bdd5b9d60621b6044820152606401610b03565b60125464010000000090046001600160401b0316806111315760405162461bcd60e51b815260206004820152601a60248201527f6e66742073616c6520686173206e6f7420626567756e207965740000000000006044820152606401610b03565b600061113d8483613b6d565b9050348111156111865760405162461bcd60e51b81526020600482015260146024820152730cae8d0cae440daeae6e840c4ca40cadcdeeaced60631b6044820152606401610b03565b7f0000000000000000000000000000000000000000000000000000000000002710846111b160015490565b6111bb9190613b41565b11156111fe5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610b03565b600f5460ff161561131f5761121285612929565b6112555760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21036b2b935b63290383937b7b360611b6044820152606401610b03565b600c5433600090815260176020908152604080832060115463ffffffff168452909152902054611286908690613b41565b11156112e75760405162461bcd60e51b815260206004820152602a60248201527f72656163686564206d61786e6f7420656c696769626c6520666f722077686974604482015269195b1a5cdd081b5a5b9d60b21b6064820152608401610b03565b33600090815260176020908152604080832060115463ffffffff16845290915281208054869290611319908490613b41565b90915550505b61132b3385600061296f565b83600e600082825461133d9190613b41565b90915550506015546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561137c573d6000803e3d6000fd5b506015546040518281526001600160a01b03909116907f6124e8846a12798d4b0c9cf7bdbe95ded0d785357f8ec696abe1cc38a7d018749060200160405180910390a2604051716d696e7420746f6b656e207375636365737360701b81526012016040519081900381208582529033907f864de76b858e33bb99e7ad3b6f058581538661529f5311ad2243ba1af51d1f229060200160405180910390a36114228161298a565b5050505050565b600061143460015490565b821061148e5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b03565b5090565b6000546001600160a01b031633146114bc5760405162461bcd60e51b8152600401610b0390613a44565b610c3b60148383613215565b6000546001600160a01b031633146114f25760405162461bcd60e51b8152600401610b0390613a44565b6001600160a01b0382166115485760405162461bcd60e51b815260206004820152601960248201527f746f2061646472657373206d7573742062652076616c696564000000000000006044820152606401610b03565b80611551611f19565b1015801561155f5750600081115b6115bb5760405162461bcd60e51b815260206004820152602760248201527f746f6f206d616e7920616c7265616479206d696e746564206265666f72652064604482015266195d881b5a5b9d60ca1b6064820152608401610b03565b6115c78282600161296f565b6040516c3232bb26b4b73a103a37b5b2b760991b8152600d016040519081900381208282529033907f8c6812c4d2cebbd5ec28cf9feb2d7ff1b4c542b89ce420dd44afbc4fea9e22ea906020015b60405180910390a35050565b600061162c82612a1d565b5192915050565b6000546001600160a01b0316331461165d5760405162461bcd60e51b8152600401610b0390613a44565b6011805463ffffffff9081166000908152601960209081526040808320805460ff191688151517905593549092168152601a9091522081905561169e612b55565b60115463ffffffff9081166000908152601b60205260409020911690555050565b60006001600160a01b03821661172b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b03565b506001600160a01b03166000908152600760205260409020546001600160801b031690565b6000546001600160a01b0316331461177a5760405162461bcd60e51b8152600401610b0390613a44565b6117846000612bca565b565b60008181526013602052604090208054606091906117a390613bf7565b80601f01602080910402602001604051908101604052809291908181526020018280546117cf90613bf7565b801561181c5780601f106117f15761010080835404028352916020019161181c565b820191906000526020600020905b8154815290600101906020018083116117ff57829003601f168201915b50505050509050919050565b6040805180820190915260008082526020820152610a0282612a1d565b606060058054610a1790613bf7565b6001600160a01b0382163314156118ad5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b03565b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101611615565b6000546001600160a01b0316331461193c5760405162461bcd60e51b8152600401610b0390613a44565b601691909155600f805460ff1916911515919091179055565b6000546001600160a01b0316331461197f5760405162461bcd60e51b8152600401610b0390613a44565b6002600b5414156119d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b03565b6002600b55604051600090339047908381818185875af1925050503d8060008114611a19576040519150601f19603f3d011682016040523d82523d6000602084013e611a1e565b606091505b5050905080610cd65760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610b03565b611a6d8484846123bf565b611a7984848484612c1a565b611a955760405162461bcd60e51b8152600401610b0390613a79565b50505050565b6000546001600160a01b03163314611ac55760405162461bcd60e51b8152600401610b0390613a44565b60008111611b205760405162461bcd60e51b815260206004820152602260248201527f61646d696e4d696e74207175616e74697479206d757374206265206e6f6e7a65604482015261726f60f01b6064820152608401610b03565b600e54600d5411611b6a5760405162461bcd60e51b81526020600482015260146024820152731c995858da1959081a5cdcdd5948185b5bdd5b9d60621b6044820152606401610b03565b7f000000000000000000000000000000000000000000000000000000000000271081611b9560015490565b611b9f9190613b41565b1115611be25760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610b03565b611bee3382600061296f565b80600e6000828254611c009190613b41565b90915550506040517f61646d696e4d696e7420746f6b656e207375636365737300000000000000000081526017016040519081900381208282529033907f864de76b858e33bb99e7ad3b6f058581538661529f5311ad2243ba1af51d1f229060200160405180910390a350565b6060611c7882612343565b611cdc5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b03565b6000611ce6612d28565b9050611cf183612d37565b15611d46576000815111611d145760405180602001604052806000815250611d3f565b80611d1e84612d6e565b604051602001611d2f9291906139c5565b6040516020818303038152906040525b9392505050565b600060188054611d5590613bf7565b905011611d715760405180602001604052806000815250611d3f565b60188054611d7e90613bf7565b80601f0160208091040260200160405190810160405280929190818152602001828054611daa90613bf7565b8015611df75780601f10611dcc57610100808354040283529160200191611df7565b820191906000526020600020905b815481529060010190602001808311611dda57829003601f168201915b50505050509392505050565b50919050565b6000546001600160a01b03163314611e335760405162461bcd60e51b8152600401610b0390613a44565b8051825114611e9b5760405162461bcd60e51b815260206004820152602e60248201527f746f6b656e496473206c656e677468206d75737420657175616c7320746f207060448201526d0c2f2d8dec2c8e640d8cadccee8d60931b6064820152608401610b03565b60005b8251811015610c3b57818181518110611eb957611eb9613c87565b602002602001015160136000858481518110611ed757611ed7613c87565b602002602001015163ffffffff1681526020019081526020016000209080519060200190611f06929190613295565b5080611f1181613c2c565b915050611e9e565b6000600254600354611f2b9190613bb4565b905090565b6000546001600160a01b03163314611f5a5760405162461bcd60e51b8152600401610b0390613a44565b60008281526013602052604090208054611f7390613bf7565b159050611f995760008281526013602090815260409091208251610c3b92840190613295565b5050565b6000610a0282612e6b565b6000546001600160a01b03163314611fd25760405162461bcd60e51b8152600401610b0390613a44565b600081116120345760405162461bcd60e51b815260206004820152602960248201527f6d617850657241646472657373447572696e674d696e206d7573742062652061604482015268626f7665207a65726f60b81b6064820152608401610b03565b600c55565b6000546001600160a01b031633146120635760405162461bcd60e51b8152600401610b0390613a44565b8051611f99906018906020840190613295565b6000546001600160a01b031633146120a05760405162461bcd60e51b8152600401610b0390613a44565b6001600160a01b0381166121055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b03565b61210e81612bca565b50565b6000546001600160a01b0316331461213b5760405162461bcd60e51b8152600401610b0390613a44565b60005b8151811015611f99576001601d600084848151811061215f5761215f613c87565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808061219790613c2c565b91505061213e565b6000546001600160a01b031633146121c95760405162461bcd60e51b8152600401610b0390613a44565b600082116122195760405162461bcd60e51b815260206004820152601c60248201527f697373756520616d6f756e74206d757374206265206e6f6e7a65726f000000006044820152606401610b03565b60008163ffffffff161161226f5760405162461bcd60e51b815260206004820152601860248201527f6973737565204e6f206d757374206265206e6f6e7a65726f00000000000000006044820152606401610b03565b6001548610156122cf5760405162461bcd60e51b815260206004820152602560248201527f697373756520737461727420746f6b656e206d757374203e3d20746f74616c536044820152647570706c7960d81b6064820152608401610b03565b6040805180820190915263ffffffff9485168082526001600160401b03969096166020909101819052601280546bffffffffffffffffffffffff191690961764010000000090910217909455600c91909155600d556011805463ffffffff1916929091169190911790556000600e55601c55565b6000600354821061235657506001541190565b506002541190565b919050565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006123ca82612a1d565b80519091506000906001600160a01b0316336001600160a01b031614806124015750336123f684610a9a565b6001600160a01b0316145b806124135750815161241390336108aa565b90508061247d5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b03565b846001600160a01b031682600001516001600160a01b0316146124f15760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b03565b6001600160a01b0384166125555760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b03565b6125656000848460000151612363565b6001600160a01b03851660009081526007602052604081208054600192906125979084906001600160801b0316613b8c565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260076020526040812080546001945090926125e391859116613b1f565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526006909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561266a846001613b41565b6000818152600660205260409020549091506001600160a01b03166126f95761269281612343565b156126f95760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600690935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600a54816127925760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610b03565b600060016127a08484613b41565b6127aa9190613bb4565b90506127d760017f0000000000000000000000000000000000000000000000000000000000002710613bb4565b81111561280c5761280960017f0000000000000000000000000000000000000000000000000000000000002710613bb4565b90505b61281581612343565b6128705760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610b03565b815b818111612915576000818152600660205260409020546001600160a01b03166129035760006128a082612a1d565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600690965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b8061290d81613c2c565b915050612872565b50612921816001613b41565b600a55505050565b6016546040516bffffffffffffffffffffffff193360601b166020820152600091610a029184919060340160405160208183030381529060405280519060200120612f09565b610c3b83836040518060200160405280600081525084612f1f565b60006129968234613bb4565b90508015611f9957604051339082156108fc029083906000818181858888f193505050501580156129cb573d6000803e3d6000fd5b506040516b726566756e642076616c756560a01b8152600c016040519081900381208282529033907f4850d3a8f584ee1b800a295d89f3d9c4874e30c469376ee64e74d53a037df11f90602001611615565b6040805180820190915260008082526020820152612a3a82612343565b612a995760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b03565b6000828152600660205260409020546001600160a01b031615612af557506000908152600660209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160401b03169082015290565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b03565b60115463ffffffff166000818152601a6020908152604080832054905192938493612b9b939192910160e09290921b6001600160e01b0319168252600482015260240190565b6040516020818303038152906040528051906020012060001c9050600d5481612bc49190613c47565b91505090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b15612d1c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c5e9033908990889088906004016139f4565b602060405180830381600087803b158015612c7857600080fd5b505af1925050508015612ca8575060408051601f3d908101601f19168201909252612ca591810190613801565b60015b612d02573d808015612cd6576040519150601f19603f3d011682016040523d82523d6000602084013e612cdb565b606091505b508051612cfa5760405162461bcd60e51b8152600401610b0390613a79565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612d20565b5060015b949350505050565b606060148054610a1790613bf7565b60115463ffffffff1660009081526019602052604081205460ff1680610a02576000838152601d602052604090205460ff16611d3f565b606081612d925750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612dbc5780612da681613c2c565b9150612db59050600a83613b59565b9150612d96565b6000816001600160401b03811115612dd657612dd6613c9d565b6040519080825280601f01601f191660200182016040528015612e00576020820181803683370190505b5090505b8415612d2057612e15600183613bb4565b9150612e22600a86613c47565b612e2d906030613b41565b60f81b818381518110612e4257612e42613c87565b60200101906001600160f81b031916908160001a905350612e64600a86613b59565b9450612e04565b60006001600160a01b038216612edd5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610b03565b506001600160a01b0316600090815260076020526040902054600160801b90046001600160801b031690565b600082612f1685846131a1565b14949350505050565b600081612f2e57600154612f32565b6002545b90506001600160a01b038516612f945760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b03565b612f9d81612343565b15612fea5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b03565b6001600160a01b0385166000908152600760209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190613046908890613b1f565b6001600160801b031681526020018683602001516130649190613b1f565b6001600160801b039081169091526001600160a01b03881660009081526007602090815260408220845194909101518316600160801b029390921692909217905582905b86811015613181576040805180820182526001600160a01b03808b168083526001600160401b03428116602080860191825260008981526006909152868120955186549251909316600160a01b026001600160e01b031990921692909416919091171790925591518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131456000898489612c1a565b6131615760405162461bcd60e51b8152600401610b0390613a79565b8161316b81613c2c565b925050808061317990613c2c565b9150506130a8565b508315613192576002819055613198565b60018190555b50505050505050565b600081815b845181101561320d5760008582815181106131c3576131c3613c87565b602002602001015190508083116131e957600083815260208290526040902092506131fa565b600081815260208490526040902092505b508061320581613c2c565b9150506131a6565b509392505050565b82805461322190613bf7565b90600052602060002090601f0160209004810192826132435760008555613289565b82601f1061325c5782800160ff19823516178555613289565b82800160010185558215613289579182015b8281111561328957823582559160200191906001019061326e565b5061148e929150613309565b8280546132a190613bf7565b90600052602060002090601f0160209004810192826132c35760008555613289565b82601f106132dc57805160ff1916838001178555613289565b82800160010185558215613289579182015b828111156132895782518255916020019190600101906132ee565b5b8082111561148e576000815560010161330a565b60006001600160401b0383111561333757613337613c9d565b61334a601f8401601f1916602001613acc565b905082815283838301111561335e57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461235e57600080fd5b600082601f83011261339d57600080fd5b813560206133b26133ad83613afc565b613acc565b80838252828201915082860187848660051b89010111156133d257600080fd5b6000805b868110156134145782356001600160401b038111156133f3578283fd5b6134018b88838d0101613432565b86525093850193918501916001016133d6565b509198975050505050505050565b8035801515811461235e57600080fd5b600082601f83011261344357600080fd5b611d3f8383356020850161331e565b803563ffffffff8116811461235e57600080fd5b60006020828403121561347857600080fd5b611d3f82613375565b6000806040838503121561349457600080fd5b61349d83613375565b91506134ab60208401613375565b90509250929050565b6000806000606084860312156134c957600080fd5b6134d284613375565b92506134e060208501613375565b9150604084013590509250925092565b6000806000806080858703121561350657600080fd5b61350f85613375565b935061351d60208601613375565b92506040850135915060608501356001600160401b0381111561353f57600080fd5b61354b87828801613432565b91505092959194509250565b6000806040838503121561356a57600080fd5b61357383613375565b91506134ab60208401613422565b6000806040838503121561359457600080fd5b61359d83613375565b946020939093013593505050565b600080604083850312156135be57600080fd5b82356001600160401b038111156135d457600080fd5b8301601f810185136135e557600080fd5b803560206135f56133ad83613afc565b80838252828201915082850189848660051b880101111561361557600080fd5b600095505b8486101561363857803583526001959095019491830191830161361a565b5098969091013596505050505050565b6000602080838503121561365b57600080fd5b82356001600160401b0381111561367157600080fd5b8301601f8101851361368257600080fd5b80356136906133ad82613afc565b80828252848201915084840188868560051b87010111156136b057600080fd5b600094505b838510156136d35780358352600194909401939185019185016136b5565b50979650505050505050565b600080604083850312156136f257600080fd5b82356001600160401b038082111561370957600080fd5b818501915085601f83011261371d57600080fd5b8135602061372d6133ad83613afc565b8083825282820191508286018a848660051b890101111561374d57600080fd5b600096505b848710156137775761376381613452565b835260019690960195918301918301613752565b509650508601359250508082111561378e57600080fd5b5061379b8582860161338c565b9150509250929050565b600080604083850312156137b857600080fd5b61359d83613422565b600080604083850312156137d457600080fd5b823591506134ab60208401613422565b6000602082840312156137f657600080fd5b8135611d3f81613cb3565b60006020828403121561381357600080fd5b8151611d3f81613cb3565b6000806020838503121561383157600080fd5b82356001600160401b038082111561384857600080fd5b818501915085601f83011261385c57600080fd5b81358181111561386b57600080fd5b86602082850101111561387d57600080fd5b60209290920196919550909350505050565b6000602082840312156138a157600080fd5b81356001600160401b038111156138b757600080fd5b8201601f810184136138c857600080fd5b612d208482356020840161331e565b6000602082840312156138e957600080fd5b5035919050565b6000806040838503121561390357600080fd5b8235915060208301356001600160401b0381111561392057600080fd5b61379b85828601613432565b60008060008060008060c0878903121561394557600080fd5b8635955060208701356001600160401b038116811461396357600080fd5b945061397160408801613452565b9350606087013592506080870135915061398d60a08801613452565b90509295509295509295565b600081518084526139b1816020860160208601613bcb565b601f01601f19169290920160200192915050565b600083516139d7818460208801613bcb565b8351908301906139eb818360208801613bcb565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a2790830184613999565b9695505050505050565b602081526000611d3f6020830184613999565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715613af457613af4613c9d565b604052919050565b60006001600160401b03821115613b1557613b15613c9d565b5060051b60200190565b60006001600160801b038083168185168083038211156139eb576139eb613c5b565b60008219821115613b5457613b54613c5b565b500190565b600082613b6857613b68613c71565b500490565b6000816000190483118215151615613b8757613b87613c5b565b500290565b60006001600160801b0383811690831681811015613bac57613bac613c5b565b039392505050565b600082821015613bc657613bc6613c5b565b500390565b60005b83811015613be6578181015183820152602001613bce565b83811115611a955750506000910152565b600181811c90821680613c0b57607f821691505b60208210811415611e0357634e487b7160e01b600052602260045260246000fd5b6000600019821415613c4057613c40613c5b565b5060010190565b600082613c5657613c56613c71565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461210e57600080fdfea264697066735822122067943ee0e4013f84580f3103e5f79222264dd935299597286b4aca0672f8a2aa64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000003e9
-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 2
Arg [1] : collectionSize_ (uint256): 10000
Arg [2] : maxNormalNftIndex_ (uint256): 10000
Arg [3] : maxAmountForDevs_ (uint256): 1001
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 00000000000000000000000000000000000000000000000000000000000003e9
Deployed Bytecode Sourcemap
398:9002:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4786:370:13;;;;;;;;;;-1:-1:-1;4786:370:13;;;;;:::i;:::-;;:::i;:::-;;;13623:14:15;;13616:22;13598:41;;13586:2;13571:18;4786:370:13;;;;;;;;1046:21:14;;;;;;;;;;-1:-1:-1;1046:21:14;;;;;;;;;;;31635:10:15;31623:23;;;31605:42;;31593:2;31578:18;1046:21:14;31461:192:15;6254:94:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;7779:204::-;;;;;;;;;;-1:-1:-1;7779:204:13;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12921:32:15;;;12903:51;;12891:2;12876:18;7779:204:13;12757:203:15;7342:379:13;;;;;;;;;;-1:-1:-1;7342:379:13;;;;;:::i;:::-;;:::i;:::-;;1781:46:14;;;;;;;;;;-1:-1:-1;1781:46:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;3347:94:13;;;;;;;;;;-1:-1:-1;3423:12:13;;3347:94;;;13796:25:15;;;13784:2;13769:18;3347:94:13;13650:177:15;898:30:14;;;;;;;;;;;;;;;;8629:142:13;;;;;;;;;;-1:-1:-1;8629:142:13;;;;;:::i;:::-;;:::i;6421:118:14:-;;;;;;;;;;-1:-1:-1;6421:118:14;;;;;:::i;:::-;;:::i;935:31::-;;;;;;;;;;;;;;;;3978:744:13;;;;;;;;;;-1:-1:-1;3978:744:13;;;;;:::i;:::-;;:::i;8834:157::-;;;;;;;;;;-1:-1:-1;8834:157:13;;;;;:::i;:::-;;:::i;3354:1381:14:-;;;;;;:::i;:::-;;:::i;3510:177:13:-;;;;;;;;;;-1:-1:-1;3510:177:13;;;;;:::i;:::-;;:::i;6128:100:14:-;;;;;;;;;;-1:-1:-1;6128:100:14;;;;;:::i;:::-;;:::i;5643:365::-;;;;;;;;;;-1:-1:-1;5643:365:14;;;;;:::i;:::-;;:::i;6077:118:13:-;;;;;;;;;;-1:-1:-1;6077:118:13;;;;;:::i;:::-;;:::i;8162:178:14:-;;;;;;;;;;-1:-1:-1;8162:178:14;;;;;:::i;:::-;;:::i;5212:211:13:-;;;;;;;;;;-1:-1:-1;5212:211:13;;;;;:::i;:::-;;:::i;1721:103:0:-;;;;;;;;;;;;;:::i;7347:128:14:-;;;;;;;;;;-1:-1:-1;7347:128:14;;;;;:::i;:::-;;:::i;1070:87:0:-;;;;;;;;;;-1:-1:-1;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;1070:87;;1180:28:14;;;;;;;;;;-1:-1:-1;1180:28:14;;;;;;;;;;;-1:-1:-1;;;;;1180:28:14;;;;;;;31858:10:15;31846:23;;;31828:42;;-1:-1:-1;;;;;31906:31:15;;;31901:2;31886:18;;31879:59;31801:18;1180:28:14;31658:286:15;1677:40:14;;;;;;;;;;-1:-1:-1;1677:40:14;;;;;:::i;:::-;;;;;;;;;;;;;;6658:147;;;;;;;;;;-1:-1:-1;6658:147:14;;;;;:::i;:::-;;:::i;:::-;;;;31144:13:15;;-1:-1:-1;;;;;31140:39:15;31122:58;;31240:4;31228:17;;;31222:24;-1:-1:-1;;;;;31218:49:15;31196:20;;;31189:79;;;;31095:18;6658:147:14;30912:362:15;6409:98:13;;;;;;;;;;;;;:::i;823:34:14:-;;;;;;;;;;;;;;;;8047:274:13;;;;;;;;;;-1:-1:-1;8047:274:13;;;;;:::i;:::-;;:::i;1724:32:14:-;;;;;;;;;;;;;;;;1437:75;;;;;;;;;;-1:-1:-1;1437:75:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;7749:126;;;;;;;;;;-1:-1:-1;7749:126:14;;;;;:::i;:::-;;:::i;6234:181::-;;;;;;;;;;;;;:::i;9054:311:13:-;;;;;;;;;;-1:-1:-1;9054:311:13;;;;;:::i;:::-;;:::i;1008:31:14:-;;;;;;;;;;;;;;;;4741:435;;;;;;;;;;-1:-1:-1;4741:435:14;;;;;:::i;:::-;;:::i;8403:513::-;;;;;;;;;;-1:-1:-1;8403:513:14;;;;;:::i;:::-;;:::i;6811:322::-;;;;;;;;;;-1:-1:-1;6811:322:14;;;;;:::i;:::-;;:::i;16160:113:13:-;;;;;;;;;;;;;:::i;13668:43::-;;;;;;;;;;;;;;;;7139:202:14;;;;;;;;;;-1:-1:-1;7139:202:14;;;;;:::i;:::-;;:::i;6545:107::-;;;;;;;;;;-1:-1:-1;6545:107:14;;;;;:::i;:::-;;:::i;5438:174::-;;;;;;;;;;-1:-1:-1;5438:174:14;;;;;:::i;:::-;;:::i;8384:186:13:-;;;;;;;;;;-1:-1:-1;8384:186:13;;;;;:::i;:::-;-1:-1:-1;;;;;8529:25:13;;;8506:4;8529:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;8384:186;1372:19:14;;;;;;;;;;;;;;;;1632:40;;;;;;;;;;-1:-1:-1;1632:40:14;;;;;:::i;:::-;;;;;;;;;;;;;;8059:97;;;;;;;;;;-1:-1:-1;8059:97:14;;;;;:::i;:::-;;:::i;1979:201:0:-;;;;;;;;;;-1:-1:-1;1979:201:0;;;;;:::i;:::-;;:::i;9215:182:14:-;;;;;;;;;;-1:-1:-1;9215:182:14;;;;;:::i;:::-;;:::i;2291:675::-;;;;;;;;;;-1:-1:-1;2291:675:14;;;;;:::i;:::-;;:::i;4786:370:13:-;4913:4;-1:-1:-1;;;;;;4943:40:13;;-1:-1:-1;;;4943:40:13;;:99;;-1:-1:-1;;;;;;;4994:48:13;;-1:-1:-1;;;4994:48:13;4943:99;:160;;;-1:-1:-1;;;;;;;5053:50:13;;-1:-1:-1;;;5053:50:13;4943:160;:207;;;-1:-1:-1;;;;;;;;;;963:40:11;;;5114:36:13;4929:221;4786:370;-1:-1:-1;;4786:370:13:o;6254:94::-;6308:13;6337:5;6330:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6254:94;:::o;7779:204::-;7847:7;7871:16;7879:7;7871;:16::i;:::-;7863:74;;;;-1:-1:-1;;;7863:74:13;;30700:2:15;7863:74:13;;;30682:21:15;30739:2;30719:18;;;30712:30;30778:34;30758:18;;;30751:62;-1:-1:-1;;;30829:18:15;;;30822:43;30882:19;;7863:74:13;;;;;;;;;-1:-1:-1;7953:24:13;;;;:15;:24;;;;;;-1:-1:-1;;;;;7953:24:13;;7779:204::o;7342:379::-;7411:13;7427:24;7443:7;7427:15;:24::i;:::-;7411:40;;7472:5;-1:-1:-1;;;;;7466:11:13;:2;-1:-1:-1;;;;;7466:11:13;;;7458:58;;;;-1:-1:-1;;;7458:58:13;;25585:2:15;7458:58:13;;;25567:21:15;25624:2;25604:18;;;25597:30;25663:34;25643:18;;;25636:62;-1:-1:-1;;;25714:18:15;;;25707:32;25756:19;;7458:58:13;25383:398:15;7458:58:13;736:10:7;-1:-1:-1;;;;;7541:21:13;;;;:62;;-1:-1:-1;7566:37:13;7583:5;736:10:7;8384:186:13;:::i;7566:37::-;7525:153;;;;-1:-1:-1;;;7525:153:13;;20632:2:15;7525:153:13;;;20614:21:15;20671:2;20651:18;;;20644:30;20710:34;20690:18;;;20683:62;20781:27;20761:18;;;20754:55;20826:19;;7525:153:13;20430:421:15;7525:153:13;7687:28;7696:2;7700:7;7709:5;7687:8;:28::i;:::-;7404:317;7342:379;;:::o;8629:142::-;8737:28;8747:4;8753:2;8757:7;8737:9;:28::i;6421:118:14:-;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;1778:1:1::1;2376:7;;:19;;2368:63;;;::::0;-1:-1:-1;;;2368:63:1;;29509:2:15;2368:63:1::1;::::0;::::1;29491:21:15::0;29548:2;29528:18;;;29521:30;29587:33;29567:18;;;29560:61;29638:18;;2368:63:1::1;29307:355:15::0;2368:63:1::1;1778:1;2509:7;:18:::0;6505:28:14::2;6524:8:::0;6505:18:::2;:28::i;:::-;-1:-1:-1::0;1734:1:1::1;2688:7;:22:::0;6421:118:14:o;3978:744:13:-;4087:7;4122:16;4132:5;4122:9;:16::i;:::-;4114:5;:24;4106:71;;;;-1:-1:-1;;;4106:71:13;;14480:2:15;4106:71:13;;;14462:21:15;14519:2;14499:18;;;14492:30;14558:34;14538:18;;;14531:62;-1:-1:-1;;;14609:18:15;;;14602:32;14651:19;;4106:71:13;14278:398:15;4106:71:13;4184:22;4209:13;3423:12;;;3347:94;4209:13;4184:38;;4229:19;4259:25;4309:9;4304:350;4328:14;4324:1;:18;4304:350;;;4358:31;4392:14;;;:11;:14;;;;;;;;;4358:48;;;;;;;;;-1:-1:-1;;;;;4358:48:13;;;;;-1:-1:-1;;;4358:48:13;;;-1:-1:-1;;;;;4358:48:13;;;;;;;;4419:28;4415:89;;4480:14;;;-1:-1:-1;4415:89:13;4537:5;-1:-1:-1;;;;;4516:26:13;:17;-1:-1:-1;;;;;4516:26:13;;4512:135;;;4574:5;4559:11;:20;4555:59;;;-1:-1:-1;4601:1:13;-1:-1:-1;4594:8:13;;-1:-1:-1;;;4594:8:13;4555:59;4624:13;;;;:::i;:::-;;;;4512:135;-1:-1:-1;4344:3:13;;;;:::i;:::-;;;;4304:350;;;-1:-1:-1;4660:56:13;;-1:-1:-1;;;4660:56:13;;28276:2:15;4660:56:13;;;28258:21:15;28315:2;28295:18;;;28288:30;28354:34;28334:18;;;28327:62;-1:-1:-1;;;28405:18:15;;;28398:44;28459:19;;4660:56:13;28074:410:15;8834:157:13;8946:39;8963:4;8969:2;8973:7;8946:39;;;;;;;;;;;;:16;:39::i;3354:1381:14:-;3130:7;;;;:11;;;;:46;;;3175:1;3161:11;;:15;3130:46;:103;;;;-1:-1:-1;3204:10:14;:24;;;;-1:-1:-1;;;;;3204:24:14;3196:37;;3130:103;:164;;;;-1:-1:-1;3259:10:14;:30;;;3251:43;;3130:164;3114:218;;;;-1:-1:-1;;;3114:218:14;;27111:2:15;3114:218:14;;;27093:21:15;27150:2;27130:18;;;27123:30;27189:28;27169:18;;;27162:56;27235:18;;3114:218:14;26909:350:15;3114:218:14;3011:9:::1;3024:10;3011:23;3003:66;;;::::0;-1:-1:-1;;;3003:66:14;;20273:2:15;3003:66:14::1;::::0;::::1;20255:21:15::0;20312:2;20292:18;;;20285:30;20351:32;20331:18;;;20324:60;20401:18;;3003:66:14::1;20071:354:15::0;3003:66:14::1;3474:1:::2;3463:8;:12;3455:54;;;::::0;-1:-1:-1;;;3455:54:14;;17924:2:15;3455:54:14::2;::::0;::::2;17906:21:15::0;17963:2;17943:18;;;17936:30;18002:31;17982:18;;;17975:59;18051:18;;3455:54:14::2;17722:353:15::0;3455:54:14::2;3549:10;:30:::0;::::2;;3603:19:::0;;;::::2;::::0;:56:::2;;;3645:14;3626:15;:33;;3603:56;3587:114;;;::::0;-1:-1:-1;;;3587:114:14;;19092:2:15;3587:114:14::2;::::0;::::2;19074:21:15::0;19131:2;19111:18;;;19104:30;19170:26;19150:18;;;19143:54;19214:18;;3587:114:14::2;18890:348:15::0;3587:114:14::2;3738:12;3726:8;:24;;3710:94;;;::::0;-1:-1:-1;;;3710:94:14;;21765:2:15;3710:94:14::2;::::0;::::2;21747:21:15::0;21804:2;21784:18;;;21777:30;21843:34;21823:18;;;21816:62;-1:-1:-1;;;21894:18:15;;;21887:34;21938:19;;3710:94:14::2;21563:400:15::0;3710:94:14::2;3835:12;;3821:11;;:26;3813:59;;;::::0;-1:-1:-1;;;3813:59:14;;16863:2:15;3813:59:14::2;::::0;::::2;16845:21:15::0;16902:2;16882:18;;;16875:30;-1:-1:-1;;;16921:18:15;;;16914:50;16981:18;;3813:59:14::2;16661:344:15::0;3813:59:14::2;3905:10;:24:::0;;;::::2;-1:-1:-1::0;;;;;3905:24:14::2;::::0;3937:49:::2;;;::::0;-1:-1:-1;;;3937:49:14;;17212:2:15;3937:49:14::2;::::0;::::2;17194:21:15::0;17251:2;17231:18;;;17224:30;17290:28;17270:18;;;17263:56;17336:18;;3937:49:14::2;17010:350:15::0;3937:49:14::2;3995:12;4010:16;4018:8:::0;4010:5;:16:::2;:::i;:::-;3995:31;;4049:9;4041:4;:17;;4033:50;;;::::0;-1:-1:-1;;;4033:50:14;;25236:2:15;4033:50:14::2;::::0;::::2;25218:21:15::0;25275:2;25255:18;;;25248:30;-1:-1:-1;;;25294:18:15;;;25287:50;25354:18;;4033:50:14::2;25034:344:15::0;4033:50:14::2;4130:17;4117:8;4101:13;3423:12:13::0;;;3347:94;4101:13:14::2;:24;;;;:::i;:::-;4100:47;;4092:78;;;::::0;-1:-1:-1;;;4092:78:14;;22582:2:15;4092:78:14::2;::::0;::::2;22564:21:15::0;22621:2;22601:18;;;22594:30;-1:-1:-1;;;22640:18:15;;;22633:48;22698:18;;4092:78:14::2;22380:342:15::0;4092:78:14::2;4183:15;::::0;::::2;;4179:296;;;4217:24;4234:6;4217:16;:24::i;:::-;4209:57;;;::::0;-1:-1:-1;;;4209:57:14;;23697:2:15;4209:57:14::2;::::0;::::2;23679:21:15::0;23736:2;23716:18;;;23709:30;-1:-1:-1;;;23755:18:15;;;23748:50;23815:18;;4209:57:14::2;23495:344:15::0;4209:57:14::2;4339:19;::::0;4304:10:::2;4283:32;::::0;;;:20:::2;:32;::::0;;;;;;;4316:7:::2;::::0;::::2;;4283:41:::0;;;;;;;;:52:::2;::::0;4327:8;;4283:52:::2;:::i;:::-;:75;;4275:130;;;::::0;-1:-1:-1;;;4275:130:14;;29098:2:15;4275:130:14::2;::::0;::::2;29080:21:15::0;29137:2;29117:18;;;29110:30;29176:34;29156:18;;;29149:62;-1:-1:-1;;;29227:18:15;;;29220:40;29277:19;;4275:130:14::2;28896:406:15::0;4275:130:14::2;4435:10;4414:32;::::0;;;:20:::2;:32;::::0;;;;;;;4447:7:::2;::::0;::::2;;4414:41:::0;;;;;;;:53;;4459:8;;4414:32;:53:::2;::::0;4459:8;;4414:53:::2;:::i;:::-;::::0;;;-1:-1:-1;;4179:296:14::2;4483:38;4493:10;4505:8;4515:5;4483:9;:38::i;:::-;4546:8;4530:12;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;4563:12:14::2;::::0;:27:::2;::::0;-1:-1:-1;;;;;4563:12:14;;::::2;::::0;:27;::::2;;;::::0;4585:4;;4563:12:::2;:27:::0;:12;:27;4585:4;4563:12;:27;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;4617:12:14::2;::::0;4602:34:::2;::::0;13796:25:15;;;-1:-1:-1;;;;;4617:12:14;;::::2;::::0;4602:34:::2;::::0;13784:2:15;13769:18;4602:34:14::2;;;;;;;4648:53;::::0;-1:-1:-1;;;11652:33:15;;11710:2;11701:12;4648:53:14::2;::::0;;;;::::2;::::0;;13796:25:15;;;4648:53:14;4658:10:::2;::::0;4648:53:::2;::::0;13784:2:15;13769:18;4648:53:14::2;;;;;;;4710:19;4724:4;4710:13;:19::i;:::-;3448:1287;;;3354:1381:::0;;:::o;3510:177:13:-;3577:7;3609:13;3423:12;;;3347:94;3609:13;3601:5;:21;3593:69;;;;-1:-1:-1;;;3593:69:13;;18282:2:15;3593:69:13;;;18264:21:15;18321:2;18301:18;;;18294:30;18360:34;18340:18;;;18333:62;-1:-1:-1;;;18411:18:15;;;18404:33;18454:19;;3593:69:13;18080:399:15;3593:69:13;-1:-1:-1;3676:5:13;3510:177::o;6128:100:14:-;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;6199:23:14::1;:13;6215:7:::0;;6199:23:::1;:::i;5643:365::-:0;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5724:18:14;::::1;5716:56;;;::::0;-1:-1:-1;;;5716:56:14;;21411:2:15;5716:56:14::1;::::0;::::1;21393:21:15::0;21450:2;21430:18;;;21423:30;21489:27;21469:18;;;21462:55;21534:18;;5716:56:14::1;21209:349:15::0;5716:56:14::1;5818:8;5795:19;:17;:19::i;:::-;:31;;:47;;;;;5841:1;5830:8;:12;5795:47;5779:120;;;::::0;-1:-1:-1;;;5779:120:14;;27868:2:15;5779:120:14::1;::::0;::::1;27850:21:15::0;27907:2;27887:18;;;27880:30;27946:34;27926:18;;;27919:62;-1:-1:-1;;;27997:18:15;;;27990:37;28044:19;;5779:120:14::1;27666:403:15::0;5779:120:14::1;5908:29;5918:2;5922:8;5932:4;5908:9;:29::i;:::-;5951:51;::::0;-1:-1:-1;;;12404:28:15;;12457:2;12448:12;5951:51:14::1;::::0;;;;::::1;::::0;;13796:25:15;;;5951:51:14;5964:10:::1;::::0;5951:51:::1;::::0;13784:2:15;13769:18;5951:51:14::1;;;;;;;;5643:365:::0;;:::o;6077:118:13:-;6141:7;6164:20;6176:7;6164:11;:20::i;:::-;:25;;6077:118;-1:-1:-1;;6077:118:13:o;8162:178:14:-;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;8257:7:14::1;::::0;;::::1;::::0;;::::1;8241:24;::::0;;;:15:::1;:24;::::0;;;;;;;:31;;-1:-1:-1;;8241:31:14::1;::::0;::::1;;;::::0;;8285:7;;;;::::1;8279:14:::0;;:5:::1;:14:::0;;;;:22;;;8325:9:::1;:7;:9::i;:::-;8314:7;::::0;8308:26:::1;8314:7:::0;;::::1;8308:14;::::0;;;:5:::1;:14;::::0;;;;:26;::::1;::::0;;-1:-1:-1;;8162:178:14:o;5212:211:13:-;5276:7;-1:-1:-1;;;;;5300:19:13;;5292:75;;;;-1:-1:-1;;;5292:75:13;;22170:2:15;5292:75:13;;;22152:21:15;22209:2;22189:18;;;22182:30;22248:34;22228:18;;;22221:62;-1:-1:-1;;;22299:18:15;;;22292:41;22350:19;;5292:75:13;21968:407:15;5292:75:13;-1:-1:-1;;;;;;5389:19:13;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;5389:27:13;;5212:211::o;1721:103:0:-;1116:7;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;1786:30:::1;1813:1;1786:18;:30::i;:::-;1721:103::o:0;7347:128:14:-;7446:23;;;;:14;:23;;;;;7439:30;;7418:12;;7446:23;7439:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7347:128;;;:::o;6658:147::-;-1:-1:-1;;;;;;;;;;;;;;;;;6779:20:14;6791:7;6779:11;:20::i;6409:98:13:-;6465:13;6494:7;6487:14;;;;;:::i;8047:274::-;-1:-1:-1;;;;;8138:24:13;;736:10:7;8138:24:13;;8130:63;;;;-1:-1:-1;;;8130:63:13;;24462:2:15;8130:63:13;;;24444:21:15;24501:2;24481:18;;;24474:30;24540:28;24520:18;;;24513:56;24586:18;;8130:63:13;24260:350:15;8130:63:13;736:10:7;8202:32:13;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;8202:42:13;;;;;;;;;;;;:53;;-1:-1:-1;;8202:53:13;;;;;;;;;;8267:48;;13598:41:15;;;8202:42:13;;736:10:7;8267:48:13;;13571:18:15;8267:48:13;13458:187:15;7749:126:14;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;7826:4:14::1;:12:::0;;;;7845:15:::1;:24:::0;;-1:-1:-1;;7845:24:14::1;::::0;::::1;;::::0;;;::::1;::::0;;7749:126::o;6234:181::-;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;1778:1:1::1;2376:7;;:19;;2368:63;;;::::0;-1:-1:-1;;;2368:63:1;;29509:2:15;2368:63:1::1;::::0;::::1;29491:21:15::0;29548:2;29528:18;;;29521:30;29587:33;29567:18;;;29560:61;29638:18;;2368:63:1::1;29307:355:15::0;2368:63:1::1;1778:1;2509:7;:18:::0;6317:49:14::2;::::0;6299:12:::2;::::0;6317:10:::2;::::0;6340:21:::2;::::0;6299:12;6317:49;6299:12;6317:49;6340:21;6317:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6298:68;;;6381:7;6373:36;;;::::0;-1:-1:-1;;;6373:36:14;;25988:2:15;6373:36:14::2;::::0;::::2;25970:21:15::0;26027:2;26007:18;;;26000:30;-1:-1:-1;;;26046:18:15;;;26039:46;26102:18;;6373:36:14::2;25786:340:15::0;9054:311:13;9191:28;9201:4;9207:2;9211:7;9191:9;:28::i;:::-;9242:48;9265:4;9271:2;9275:7;9284:5;9242:22;:48::i;:::-;9226:133;;;;-1:-1:-1;;;9226:133:13;;;;;;;:::i;:::-;9054:311;;;;:::o;4741:435:14:-;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;4823:1:14::1;4812:8;:12;4804:59;;;::::0;-1:-1:-1;;;4804:59:14;;16054:2:15;4804:59:14::1;::::0;::::1;16036:21:15::0;16093:2;16073:18;;;16066:30;16132:34;16112:18;;;16105:62;-1:-1:-1;;;16183:18:15;;;16176:32;16225:19;;4804:59:14::1;15852:398:15::0;4804:59:14::1;4894:12;;4880:11;;:26;4872:59;;;::::0;-1:-1:-1;;;4872:59:14;;16863:2:15;4872:59:14::1;::::0;::::1;16845:21:15::0;16902:2;16882:18;;;16875:30;-1:-1:-1;;;16921:18:15;;;16914:50;16981:18;;4872:59:14::1;16661:344:15::0;4872:59:14::1;4978:17;4965:8;4949:13;3423:12:13::0;;;3347:94;4949:13:14::1;:24;;;;:::i;:::-;4948:47;;4940:78;;;::::0;-1:-1:-1;;;4940:78:14;;22582:2:15;4940:78:14::1;::::0;::::1;22564:21:15::0;22621:2;22601:18;;;22594:30;-1:-1:-1;;;22640:18:15;;;22633:48;22698:18;;4940:78:14::1;22380:342:15::0;4940:78:14::1;5027:38;5037:10;5049:8;5059:5;5027:9;:38::i;:::-;5090:8;5074:12;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;5112:58:14::1;::::0;11385:25:15;11373:38;;11436:2;11427:12;5112:58:14::1;::::0;;;;::::1;::::0;;13796:25:15;;;5112:58:14;5122:10:::1;::::0;5112:58:::1;::::0;13784:2:15;13769:18;5112:58:14::1;;;;;;;4741:435:::0;:::o;8403:513::-;8501:13;8542:16;8550:7;8542;:16::i;:::-;8526:97;;;;-1:-1:-1;;;8526:97:14;;24046:2:15;8526:97:14;;;24028:21:15;24085:2;24065:18;;;24058:30;24124:34;24104:18;;;24097:62;-1:-1:-1;;;24175:18:15;;;24168:45;24230:19;;8526:97:14;23844:411:15;8526:97:14;8632:21;8656:10;:8;:10::i;:::-;8632:34;;8677:29;8698:7;8677:20;:29::i;:::-;8673:238;;;8748:1;8730:7;8724:21;:25;:93;;;;;;;;;;;;;;;;;8776:7;8785:25;8802:7;8785:16;:25::i;:::-;8759:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8724:93;8717:100;8403:513;-1:-1:-1;;;8403:513:14:o;8673:238::-;8879:1;8853:15;8847:29;;;;;:::i;:::-;;;:33;:56;;;;;;;;;;;;;;;;;8883:15;8847:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8840:63;8403:513;-1:-1:-1;;;8403:513:14:o;8673:238::-;8519:397;8403:513;;;:::o;6811:322::-;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;6951:8:14::1;:15;6932:8;:15;:34;6924:93;;;::::0;-1:-1:-1;;;6924:93:14;;30285:2:15;6924:93:14::1;::::0;::::1;30267:21:15::0;30324:2;30304:18;;;30297:30;30363:34;30343:18;;;30336:62;-1:-1:-1;;;30414:18:15;;;30407:44;30468:19;;6924:93:14::1;30083:410:15::0;6924:93:14::1;7029:9;7024:104;7048:8;:15;7044:1;:19;7024:104;;;7109:8;7118:1;7109:11;;;;;;;;:::i;:::-;;;;;;;7079:14;:27;7094:8;7103:1;7094:11;;;;;;;;:::i;:::-;;;;;;;7079:27;;;;;;;;;;;;;:41;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;7065:3:14;::::1;::::0;::::1;:::i;:::-;;;;7024:104;;16160:113:13::0;16209:7;16251:16;;16232;;:35;;;;:::i;:::-;16225:42;;16160:113;:::o;7139:202:14:-;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;7247:23:14::1;::::0;;;:14:::1;:23;::::0;;;;:30;;::::1;::::0;::::1;:::i;:::-;:37:::0;;-1:-1:-1;7243:93:14::1;;7295:23;::::0;;;:14:::1;:23;::::0;;;;;;;:33;;::::1;::::0;;::::1;::::0;::::1;:::i;7243:93::-;7139:202:::0;;:::o;6545:107::-;6603:7;6626:20;6640:5;6626:13;:20::i;5438:174::-;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;5527:1:14::1;5521:3;:7;5513:61;;;::::0;-1:-1:-1;;;5513:61:14;;19863:2:15;5513:61:14::1;::::0;::::1;19845:21:15::0;19902:2;19882:18;;;19875:30;19941:34;19921:18;;;19914:62;-1:-1:-1;;;19992:18:15;;;19985:39;20041:19;;5513:61:14::1;19661:405:15::0;5513:61:14::1;5581:19;:25:::0;5438:174::o;8059:97::-;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;8130:20:14;;::::1;::::0;:15:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;1979:201:0:-:0;1116:7;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2068:22:0;::::1;2060:73;;;::::0;-1:-1:-1;;;2060:73:0;;15236:2:15;2060:73:0::1;::::0;::::1;15218:21:15::0;15275:2;15255:18;;;15248:30;15314:34;15294:18;;;15287:62;-1:-1:-1;;;15365:18:15;;;15358:36;15411:19;;2060:73:0::1;15034:402:15::0;2060:73:0::1;2144:28;2163:8;2144:18;:28::i;:::-;1979:201:::0;:::o;9215:182:14:-;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;9300:9:14::1;9295:97;9319:8;:15;9315:1;:19;9295:97;;;9380:4;9350:14;:27;9365:8;9374:1;9365:11;;;;;;;;:::i;:::-;;;;;;;9350:27;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;9336:3;;;;;:::i;:::-;;;;9295:97;;2291:675:::0;1116:7:0;1143:6;-1:-1:-1;;;;;1143:6:0;736:10:7;1290:23:0;1282:68;;;;-1:-1:-1;;;1282:68:0;;;;;;;:::i;:::-;2515:1:14::1;2500:12;:16;2492:57;;;::::0;-1:-1:-1;;;2492:57:14;;17567:2:15;2492:57:14::1;::::0;::::1;17549:21:15::0;17606:2;17586:18;;;17579:30;17645;17625:18;;;17618:58;17693:18;;2492:57:14::1;17365:352:15::0;2492:57:14::1;2575:1;2564:8;:12;;;2556:49;;;::::0;-1:-1:-1;;;2556:49:14;;14883:2:15;2556:49:14::1;::::0;::::1;14865:21:15::0;14922:2;14902:18;;;14895:30;14961:26;14941:18;;;14934:54;15005:18;;2556:49:14::1;14681:348:15::0;2556:49:14::1;3423:12:13::0;;2620:18:14::1;:35;;2612:85;;;::::0;-1:-1:-1;;;2612:85:14;;16457:2:15;2612:85:14::1;::::0;::::1;16439:21:15::0;16496:2;16476:18;;;16469:30;16535:34;16515:18;;;16508:62;-1:-1:-1;;;16586:18:15;;;16579:35;16631:19;;2612:85:14::1;16255:401:15::0;2612:85:14::1;2719:70;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;2719:70:14;;;::::1;;::::0;;::::1;::::0;;;2706:10:::1;:83:::0;;-1:-1:-1;;2706:83:14;;;;;;;::::1;;::::0;;;2798:19:::1;:34:::0;;;;2839:11:::1;:26:::0;2872:7:::1;:18:::0;;-1:-1:-1;;2872:18:14::1;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;2897:12:14::1;:16:::0;2922:17:::1;:38:::0;2291:675::o;9604:210:13:-;9661:4;9689:16;;9678:7;:27;9674:135;;-1:-1:-1;9733:12:13;;-1:-1:-1;9723:22:13;9604:210::o;9674:135::-;-1:-1:-1;9785:16:13;;-1:-1:-1;9775:26:13;9604:210::o;9674:135::-;9604:210;;;:::o;13490:172::-;13587:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;13587:29:13;-1:-1:-1;;;;;13587:29:13;;;;;;;;;13628:28;;13587:24;;13628:28;;;;;;;13490:172;;;:::o;11855:1529::-;11952:35;11990:20;12002:7;11990:11;:20::i;:::-;12061:18;;11952:58;;-1:-1:-1;12019:22:13;;-1:-1:-1;;;;;12045:34:13;736:10:7;-1:-1:-1;;;;;12045:34:13;;:81;;;-1:-1:-1;736:10:7;12090:20:13;12102:7;12090:11;:20::i;:::-;-1:-1:-1;;;;;12090:36:13;;12045:81;:142;;;-1:-1:-1;12154:18:13;;12137:50;;736:10:7;8384:186:13;:::i;12137:50::-;12019:169;;12213:17;12197:101;;;;-1:-1:-1;;;12197:101:13;;24817:2:15;12197:101:13;;;24799:21:15;24856:2;24836:18;;;24829:30;24895:34;24875:18;;;24868:62;-1:-1:-1;;;24946:18:15;;;24939:48;25004:19;;12197:101:13;24615:414:15;12197:101:13;12345:4;-1:-1:-1;;;;;12323:26:13;:13;:18;;;-1:-1:-1;;;;;12323:26:13;;12307:98;;;;-1:-1:-1;;;12307:98:13;;22929:2:15;12307:98:13;;;22911:21:15;22968:2;22948:18;;;22941:30;23007:34;22987:18;;;22980:62;-1:-1:-1;;;23058:18:15;;;23051:36;23104:19;;12307:98:13;22727:402:15;12307:98:13;-1:-1:-1;;;;;12420:16:13;;12412:66;;;;-1:-1:-1;;;12412:66:13;;18686:2:15;12412:66:13;;;18668:21:15;18725:2;18705:18;;;18698:30;18764:34;18744:18;;;18737:62;-1:-1:-1;;;18815:18:15;;;18808:35;18860:19;;12412:66:13;18484:401:15;12412:66:13;12587:49;12604:1;12608:7;12617:13;:18;;;12587:8;:49::i;:::-;-1:-1:-1;;;;;12645:18:13;;;;;;:12;:18;;;;;:31;;12675:1;;12645:18;:31;;12675:1;;-1:-1:-1;;;;;12645:31:13;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;12645:31:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;12683:16:13;;-1:-1:-1;12683:16:13;;;:12;:16;;;;;:29;;-1:-1:-1;;;12683:16:13;;:29;;-1:-1:-1;;12683:29:13;;:::i;:::-;;;-1:-1:-1;;;;;12683:29:13;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12742:43:13;;;;;;;;-1:-1:-1;;;;;12742:43:13;;;;;-1:-1:-1;;;;;12768:15:13;12742:43;;;;;;;;;-1:-1:-1;12719:20:13;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;12719:66:13;-1:-1:-1;;;;;;12719:66:13;;;;;;;;;;;13035:11;12731:7;-1:-1:-1;13035:11:13;:::i;:::-;13098:1;13057:24;;;:11;:24;;;;;:29;13013:33;;-1:-1:-1;;;;;;13057:29:13;13053:236;;13115:20;13123:11;13115:7;:20::i;:::-;13111:171;;;13175:97;;;;;;;;13202:18;;-1:-1:-1;;;;;13175:97:13;;;;;;13233:28;;;;-1:-1:-1;;;;;13175:97:13;;;;;;;;;-1:-1:-1;13148:24:13;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;13148:124:13;-1:-1:-1;;;;;;13148:124:13;;;;;;;;;;;;13111:171;13321:7;13317:2;-1:-1:-1;;;;;13302:27:13;13311:4;-1:-1:-1;;;;;13302:27:13;;;;;;;;;;;11945:1439;;;11855:1529;;;:::o;13816:846::-;13906:24;;13945:12;13937:49;;;;-1:-1:-1;;;13937:49:13;;21058:2:15;13937:49:13;;;21040:21:15;21097:2;21077:18;;;21070:30;21136:26;21116:18;;;21109:54;21180:18;;13937:49:13;20856:348:15;13937:49:13;13993:16;14043:1;14012:28;14032:8;14012:17;:28;:::i;:::-;:32;;;;:::i;:::-;13993:51;-1:-1:-1;14066:18:13;14083:1;14066:14;:18;:::i;:::-;14055:8;:29;14051:81;;;14106:18;14123:1;14106:14;:18;:::i;:::-;14095:29;;14051:81;14247:17;14255:8;14247:7;:17::i;:::-;14239:68;;;;-1:-1:-1;;;14239:68:13;;28691:2:15;14239:68:13;;;28673:21:15;28730:2;28710:18;;;28703:30;28769:34;28749:18;;;28742:62;-1:-1:-1;;;28820:18:15;;;28813:36;28866:19;;14239:68:13;28489:402:15;14239:68:13;14331:17;14314:297;14355:8;14350:1;:13;14314:297;;14414:1;14383:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;14383:19:13;14379:225;;14429:31;14463:14;14475:1;14463:11;:14::i;:::-;14505:89;;;;;;;;14532:14;;-1:-1:-1;;;;;14505:89:13;;;;;;14559:24;;;;-1:-1:-1;;;;;14505:89:13;;;;;;;;;-1:-1:-1;14488:14:13;;;:11;:14;;;;;;;:106;;;;;;;;;-1:-1:-1;;;14488:106:13;-1:-1:-1;;;;;;14488:106:13;;;;;;;;;;;;-1:-1:-1;14379:225:13;14365:3;;;;:::i;:::-;;;;14314:297;;;-1:-1:-1;14644:12:13;:8;14655:1;14644:12;:::i;:::-;14617:24;:39;-1:-1:-1;;;13816:846:13:o;7881:172:14:-;8001:4;;8017:28;;-1:-1:-1;;8034:10:14;10611:2:15;10607:15;10603:53;8017:28:14;;;10591:66:15;7954:4:14;;7974:73;;7993:6;;8001:4;10673:12:15;;8017:28:14;;;;;;;;;;;;8007:39;;;;;;7974:18;:73::i;9820:113:13:-;9895:32;9905:2;9909:8;9895:32;;;;;;;;;;;;9923:3;9895:9;:32::i;5182:250:14:-;5235:19;5257:17;5269:5;5257:9;:17;:::i;:::-;5235:39;-1:-1:-1;5285:15:14;;5281:146;;5311:41;;5319:10;;5311:41;;;;;5340:11;;5311:41;;;;5340:11;5319:10;5311:41;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5366:53:14;;-1:-1:-1;;;12136:27:15;;12188:2;12179:12;5366:53:14;;;;;;;;13796:25:15;;;5366:53:14;5379:10;;5366:53;;13784:2:15;13769:18;5366:53:14;13650:177:15;5675:348:13;-1:-1:-1;;;;;;;;;;;;;;;;;5792:16:13;5800:7;5792;:16::i;:::-;5784:71;;;;-1:-1:-1;;;5784:71:13;;15643:2:15;5784:71:13;;;15625:21:15;15682:2;15662:18;;;15655:30;15721:34;15701:18;;;15694:62;-1:-1:-1;;;15772:18:15;;;15765:40;15822:19;;5784:71:13;15441:406:15;5784:71:13;5905:1;5868:20;;;:11;:20;;;;;:25;-1:-1:-1;;;;;5868:25:13;:39;5864:89;;-1:-1:-1;5925:20:13;;;;:11;:20;;;;;;;;;5918:27;;;;;;;;;-1:-1:-1;;;;;5918:27:13;;;;-1:-1:-1;;;5918:27:13;;-1:-1:-1;;;;;5918:27:13;;;;;;5675:348::o;5864:89::-;5960:57;;-1:-1:-1;;;5960:57:13;;29869:2:15;5960:57:13;;;29851:21:15;29908:2;29888:18;;;29881:30;29947:34;29927:18;;;29920:62;-1:-1:-1;;;29998:18:15;;;29991:45;30053:19;;5960:57:13;29667:411:15;7560:181:14;7667:7;;;;7600:6;7676:14;;;:5;:14;;;;;;;;;7650:41;;7600:6;;;;7650:41;;7667:7;;7676:14;7650:41;12664:3:15;12642:16;;;;-1:-1:-1;;;;;;12638:43:15;12626:56;;12707:1;12698:11;;12691:27;12743:2;12734:12;;12471:281;7650:41:14;;;;;;;;;;;;;7640:52;;;;;;7632:61;;7615:78;;7723:11;;7714:6;:20;;;;:::i;:::-;7700:35;;;7560:181;:::o;2340:191:0:-;2414:16;2433:6;;-1:-1:-1;;;;;2450:17:0;;;-1:-1:-1;;;;;;2450:17:0;;;;;;2483:40;;2433:6;;;;;;;2483:40;;2414:16;2483:40;2403:128;2340:191;:::o;15205:690:13:-;15342:4;-1:-1:-1;;;;;15359:13:13;;1505:19:6;:23;15355:535:13;;15398:72;;-1:-1:-1;;;15398:72:13;;-1:-1:-1;;;;;15398:36:13;;;;;:72;;736:10:7;;15449:4:13;;15455:7;;15464:5;;15398:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15398:72:13;;;;;;;;-1:-1:-1;;15398:72:13;;;;;;;;;;;;:::i;:::-;;;15385:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15629:13:13;;15625:215;;15662:61;;-1:-1:-1;;;15662:61:13;;;;;;;:::i;15625:215::-;15808:6;15802:13;15793:6;15789:2;15785:15;15778:38;15385:464;-1:-1:-1;;;;;;15520:55:13;-1:-1:-1;;;15520:55:13;;-1:-1:-1;15513:62:13;;15355:535;-1:-1:-1;15878:4:13;15355:535;15205:690;;;;;;:::o;6014:108:14:-;6074:13;6103;6096:20;;;;;:::i;8979:179::-;9089:7;;;;9047:4;9073:24;;;:15;:24;;;;;;;;;9111:41;;9129:23;;;;:14;:23;;;;;;;;9111:41;;342:723:8;398:13;619:10;615:53;;-1:-1:-1;;646:10:8;;;;;;;;;;;;-1:-1:-1;;;646:10:8;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:8;;-1:-1:-1;798:2:8;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;-1:-1:-1;;;;;844:17:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:8;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:8;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;932:56:8;;;;;;;;-1:-1:-1;1003:11:8;1012:2;1003:11;;:::i;:::-;;;872:154;;5429:240:13;5490:7;-1:-1:-1;;;;;5522:19:13;;5506:102;;;;-1:-1:-1;;;5506:102:13;;19445:2:15;5506:102:13;;;19427:21:15;19484:2;19464:18;;;19457:30;19523:34;19503:18;;;19496:62;-1:-1:-1;;;19574:18:15;;;19567:47;19631:19;;5506:102:13;19243:413:15;5506:102:13;-1:-1:-1;;;;;;5630:19:13;;;;;:12;:19;;;;;:32;-1:-1:-1;;;5630:32:13;;-1:-1:-1;;;;;5630:32:13;;5429:240::o;1180:190:10:-;1305:4;1358;1329:25;1342:5;1349:4;1329:12;:25::i;:::-;:33;;1180:190;-1:-1:-1;;;;1180:190:10:o;10296:1327:13:-;10416:20;10440:3;:37;;10465:12;;10440:37;;;10446:16;;10440:37;10416:62;-1:-1:-1;;;;;;10493:16:13;;10485:62;;;;-1:-1:-1;;;10485:62:13;;27466:2:15;10485:62:13;;;27448:21:15;27505:2;27485:18;;;27478:30;27544:34;27524:18;;;27517:62;-1:-1:-1;;;27595:18:15;;;27588:31;27636:19;;10485:62:13;27264:397:15;10485:62:13;10684:21;10692:12;10684:7;:21::i;:::-;10683:22;10675:64;;;;-1:-1:-1;;;10675:64:13;;26753:2:15;10675:64:13;;;26735:21:15;26792:2;26772:18;;;26765:30;26831:31;26811:18;;;26804:59;26880:18;;10675:64:13;26551:353:15;10675:64:13;-1:-1:-1;;;;;10853:16:13;;10820:30;10853:16;;;:12;:16;;;;;;;;;10820:49;;;;;;;;;-1:-1:-1;;;;;10820:49:13;;;;;-1:-1:-1;;;10820:49:13;;;;;;;;;;;10895:119;;;;;;;;10915:19;;10820:49;;10895:119;;;10915:39;;10945:8;;10915:39;:::i;:::-;-1:-1:-1;;;;;10895:119:13;;;;;10998:8;10963:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;10895:119:13;;;;;;-1:-1:-1;;;;;10876:16:13;;;;;;:12;:16;;;;;;;:138;;;;;;;;;-1:-1:-1;;;10876:138:13;;;;;;;;;;;11052:12;;11071:365;11095:8;11091:1;:12;11071:365;;;11147:43;;;;;;;;-1:-1:-1;;;;;11147:43:13;;;;;;-1:-1:-1;;;;;11173:15:13;11147:43;;;;;;;;;-1:-1:-1;11119:25:13;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;11119:71:13;-1:-1:-1;;;;;;11119:71:13;;;;;;;;;;;;;;;11204:38;;11131:12;;-1:-1:-1;11204:38:13;;-1:-1:-1;;11204:38:13;11269:59;11300:1;11304:2;11308:12;11322:5;11269:22;:59::i;:::-;11251:150;;;;-1:-1:-1;;;11251:150:13;;;;;;;:::i;:::-;11414:14;;;;:::i;:::-;;;;11105:3;;;;;:::i;:::-;;;;11071:365;;;;11448:3;11444:107;;;11462:16;:31;;;11444:107;;;11516:12;:27;;;11444:107;10409:1214;;;10296:1327;;;;:::o;1731:675:10:-;1814:7;1857:4;1814:7;1872:497;1896:5;:12;1892:1;:16;1872:497;;;1930:20;1953:5;1959:1;1953:8;;;;;;;;:::i;:::-;;;;;;;1930:31;;1996:12;1980;:28;1976:382;;2482:13;2532:15;;;2568:4;2561:15;;;2615:4;2599:21;;2108:57;;1976:382;;;2482:13;2532:15;;;2568:4;2561:15;;;2615:4;2599:21;;2285:57;;1976:382;-1:-1:-1;1910:3:10;;;;:::i;:::-;;;;1872:497;;;-1:-1:-1;2386:12:10;1731:675;-1:-1:-1;;;1731:675:10:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:15;78:5;-1:-1:-1;;;;;104:6:15;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:15;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:15;;532:42;;522:70;;588:1;585;578:12;603:854;655:5;708:3;701:4;693:6;689:17;685:27;675:55;;726:1;723;716:12;675:55;762:6;749:20;788:4;812:60;828:43;868:2;828:43;:::i;:::-;812:60;:::i;:::-;894:3;918:2;913:3;906:15;946:2;941:3;937:12;930:19;;981:2;973:6;969:15;1033:3;1028:2;1022;1019:1;1015:10;1007:6;1003:23;999:32;996:41;993:61;;;1050:1;1047;1040:12;993:61;1072:1;1093;1103:325;1119:2;1114:3;1111:11;1103:325;;;1200:3;1187:17;-1:-1:-1;;;;;1223:11:15;1220:35;1217:55;;;1268:1;1265;1258:12;1217:55;1297:56;1349:3;1344:2;1330:11;1322:6;1318:24;1314:33;1297:56;:::i;:::-;1285:69;;-1:-1:-1;1374:12:15;;;;1406;;;;1141:1;1132:11;1103:325;;;-1:-1:-1;1446:5:15;;603:854;-1:-1:-1;;;;;;;;603:854:15:o;1462:160::-;1527:20;;1583:13;;1576:21;1566:32;;1556:60;;1612:1;1609;1602:12;1627:220;1669:5;1722:3;1715:4;1707:6;1703:17;1699:27;1689:55;;1740:1;1737;1730:12;1689:55;1762:79;1837:3;1828:6;1815:20;1808:4;1800:6;1796:17;1762:79;:::i;1852:163::-;1919:20;;1979:10;1968:22;;1958:33;;1948:61;;2005:1;2002;1995:12;2020:186;2079:6;2132:2;2120:9;2111:7;2107:23;2103:32;2100:52;;;2148:1;2145;2138:12;2100:52;2171:29;2190:9;2171:29;:::i;2211:260::-;2279:6;2287;2340:2;2328:9;2319:7;2315:23;2311:32;2308:52;;;2356:1;2353;2346:12;2308:52;2379:29;2398:9;2379:29;:::i;:::-;2369:39;;2427:38;2461:2;2450:9;2446:18;2427:38;:::i;:::-;2417:48;;2211:260;;;;;:::o;2476:328::-;2553:6;2561;2569;2622:2;2610:9;2601:7;2597:23;2593:32;2590:52;;;2638:1;2635;2628:12;2590:52;2661:29;2680:9;2661:29;:::i;:::-;2651:39;;2709:38;2743:2;2732:9;2728:18;2709:38;:::i;:::-;2699:48;;2794:2;2783:9;2779:18;2766:32;2756:42;;2476:328;;;;;:::o;2809:537::-;2904:6;2912;2920;2928;2981:3;2969:9;2960:7;2956:23;2952:33;2949:53;;;2998:1;2995;2988:12;2949:53;3021:29;3040:9;3021:29;:::i;:::-;3011:39;;3069:38;3103:2;3092:9;3088:18;3069:38;:::i;:::-;3059:48;;3154:2;3143:9;3139:18;3126:32;3116:42;;3209:2;3198:9;3194:18;3181:32;-1:-1:-1;;;;;3228:6:15;3225:30;3222:50;;;3268:1;3265;3258:12;3222:50;3291:49;3332:7;3323:6;3312:9;3308:22;3291:49;:::i;:::-;3281:59;;;2809:537;;;;;;;:::o;3351:254::-;3416:6;3424;3477:2;3465:9;3456:7;3452:23;3448:32;3445:52;;;3493:1;3490;3483:12;3445:52;3516:29;3535:9;3516:29;:::i;:::-;3506:39;;3564:35;3595:2;3584:9;3580:18;3564:35;:::i;3610:254::-;3678:6;3686;3739:2;3727:9;3718:7;3714:23;3710:32;3707:52;;;3755:1;3752;3745:12;3707:52;3778:29;3797:9;3778:29;:::i;:::-;3768:39;3854:2;3839:18;;;;3826:32;;-1:-1:-1;;;3610:254:15:o;3869:972::-;3962:6;3970;4023:2;4011:9;4002:7;3998:23;3994:32;3991:52;;;4039:1;4036;4029:12;3991:52;4079:9;4066:23;-1:-1:-1;;;;;4104:6:15;4101:30;4098:50;;;4144:1;4141;4134:12;4098:50;4167:22;;4220:4;4212:13;;4208:27;-1:-1:-1;4198:55:15;;4249:1;4246;4239:12;4198:55;4285:2;4272:16;4307:4;4331:60;4347:43;4387:2;4347:43;:::i;4331:60::-;4413:3;4437:2;4432:3;4425:15;4465:2;4460:3;4456:12;4449:19;;4496:2;4492;4488:11;4544:7;4539:2;4533;4530:1;4526:10;4522:2;4518:19;4514:28;4511:41;4508:61;;;4565:1;4562;4555:12;4508:61;4587:1;4578:10;;4597:163;4611:2;4608:1;4605:9;4597:163;;;4668:17;;4656:30;;4629:1;4622:9;;;;;4706:12;;;;4738;;4597:163;;;-1:-1:-1;4779:5:15;4816:18;;;;4803:32;;-1:-1:-1;;;;;;3869:972:15:o;4846:902::-;4930:6;4961:2;5004;4992:9;4983:7;4979:23;4975:32;4972:52;;;5020:1;5017;5010:12;4972:52;5060:9;5047:23;-1:-1:-1;;;;;5085:6:15;5082:30;5079:50;;;5125:1;5122;5115:12;5079:50;5148:22;;5201:4;5193:13;;5189:27;-1:-1:-1;5179:55:15;;5230:1;5227;5220:12;5179:55;5266:2;5253:16;5289:60;5305:43;5345:2;5305:43;:::i;5289:60::-;5371:3;5395:2;5390:3;5383:15;5423:2;5418:3;5414:12;5407:19;;5454:2;5450;5446:11;5502:7;5497:2;5491;5488:1;5484:10;5480:2;5476:19;5472:28;5469:41;5466:61;;;5523:1;5520;5513:12;5466:61;5545:1;5536:10;;5555:163;5569:2;5566:1;5563:9;5555:163;;;5626:17;;5614:30;;5587:1;5580:9;;;;;5664:12;;;;5696;;5555:163;;;-1:-1:-1;5737:5:15;4846:902;-1:-1:-1;;;;;;;4846:902:15:o;5753:1162::-;5879:6;5887;5940:2;5928:9;5919:7;5915:23;5911:32;5908:52;;;5956:1;5953;5946:12;5908:52;5996:9;5983:23;-1:-1:-1;;;;;6066:2:15;6058:6;6055:14;6052:34;;;6082:1;6079;6072:12;6052:34;6120:6;6109:9;6105:22;6095:32;;6165:7;6158:4;6154:2;6150:13;6146:27;6136:55;;6187:1;6184;6177:12;6136:55;6223:2;6210:16;6245:4;6269:60;6285:43;6325:2;6285:43;:::i;6269:60::-;6351:3;6375:2;6370:3;6363:15;6403:2;6398:3;6394:12;6387:19;;6434:2;6430;6426:11;6482:7;6477:2;6471;6468:1;6464:10;6460:2;6456:19;6452:28;6449:41;6446:61;;;6503:1;6500;6493:12;6446:61;6525:1;6516:10;;6535:168;6549:2;6546:1;6543:9;6535:168;;;6606:22;6624:3;6606:22;:::i;:::-;6594:35;;6567:1;6560:9;;;;;6649:12;;;;6681;;6535:168;;;-1:-1:-1;6722:5:15;-1:-1:-1;;6765:18:15;;6752:32;;-1:-1:-1;;6796:16:15;;;6793:36;;;6825:1;6822;6815:12;6793:36;;6848:61;6901:7;6890:8;6879:9;6875:24;6848:61;:::i;:::-;6838:71;;;5753:1162;;;;;:::o;6920:248::-;6985:6;6993;7046:2;7034:9;7025:7;7021:23;7017:32;7014:52;;;7062:1;7059;7052:12;7014:52;7085:26;7101:9;7085:26;:::i;7173:248::-;7238:6;7246;7299:2;7287:9;7278:7;7274:23;7270:32;7267:52;;;7315:1;7312;7305:12;7267:52;7351:9;7338:23;7328:33;;7380:35;7411:2;7400:9;7396:18;7380:35;:::i;7426:245::-;7484:6;7537:2;7525:9;7516:7;7512:23;7508:32;7505:52;;;7553:1;7550;7543:12;7505:52;7592:9;7579:23;7611:30;7635:5;7611:30;:::i;7676:249::-;7745:6;7798:2;7786:9;7777:7;7773:23;7769:32;7766:52;;;7814:1;7811;7804:12;7766:52;7846:9;7840:16;7865:30;7889:5;7865:30;:::i;7930:592::-;8001:6;8009;8062:2;8050:9;8041:7;8037:23;8033:32;8030:52;;;8078:1;8075;8068:12;8030:52;8118:9;8105:23;-1:-1:-1;;;;;8188:2:15;8180:6;8177:14;8174:34;;;8204:1;8201;8194:12;8174:34;8242:6;8231:9;8227:22;8217:32;;8287:7;8280:4;8276:2;8272:13;8268:27;8258:55;;8309:1;8306;8299:12;8258:55;8349:2;8336:16;8375:2;8367:6;8364:14;8361:34;;;8391:1;8388;8381:12;8361:34;8436:7;8431:2;8422:6;8418:2;8414:15;8410:24;8407:37;8404:57;;;8457:1;8454;8447:12;8404:57;8488:2;8480:11;;;;;8510:6;;-1:-1:-1;7930:592:15;;-1:-1:-1;;;;7930:592:15:o;8527:450::-;8596:6;8649:2;8637:9;8628:7;8624:23;8620:32;8617:52;;;8665:1;8662;8655:12;8617:52;8705:9;8692:23;-1:-1:-1;;;;;8730:6:15;8727:30;8724:50;;;8770:1;8767;8760:12;8724:50;8793:22;;8846:4;8838:13;;8834:27;-1:-1:-1;8824:55:15;;8875:1;8872;8865:12;8824:55;8898:73;8963:7;8958:2;8945:16;8940:2;8936;8932:11;8898:73;:::i;8982:180::-;9041:6;9094:2;9082:9;9073:7;9069:23;9065:32;9062:52;;;9110:1;9107;9100:12;9062:52;-1:-1:-1;9133:23:15;;8982:180;-1:-1:-1;8982:180:15:o;9167:388::-;9244:6;9252;9305:2;9293:9;9284:7;9280:23;9276:32;9273:52;;;9321:1;9318;9311:12;9273:52;9357:9;9344:23;9334:33;;9418:2;9407:9;9403:18;9390:32;-1:-1:-1;;;;;9437:6:15;9434:30;9431:50;;;9477:1;9474;9467:12;9431:50;9500:49;9541:7;9532:6;9521:9;9517:22;9500:49;:::i;9560:635::-;9661:6;9669;9677;9685;9693;9701;9754:3;9742:9;9733:7;9729:23;9725:33;9722:53;;;9771:1;9768;9761:12;9722:53;9807:9;9794:23;9784:33;;9867:2;9856:9;9852:18;9839:32;-1:-1:-1;;;;;9904:5:15;9900:30;9893:5;9890:41;9880:69;;9945:1;9942;9935:12;9880:69;9968:5;-1:-1:-1;9992:37:15;10025:2;10010:18;;9992:37;:::i;:::-;9982:47;;10076:2;10065:9;10061:18;10048:32;10038:42;;10127:3;10116:9;10112:19;10099:33;10089:43;;10151:38;10184:3;10173:9;10169:19;10151:38;:::i;:::-;10141:48;;9560:635;;;;;;;;:::o;10200:257::-;10241:3;10279:5;10273:12;10306:6;10301:3;10294:19;10322:63;10378:6;10371:4;10366:3;10362:14;10355:4;10348:5;10344:16;10322:63;:::i;:::-;10439:2;10418:15;-1:-1:-1;;10414:29:15;10405:39;;;;10446:4;10401:50;;10200:257;-1:-1:-1;;10200:257:15:o;10696:470::-;10875:3;10913:6;10907:13;10929:53;10975:6;10970:3;10963:4;10955:6;10951:17;10929:53;:::i;:::-;11045:13;;11004:16;;;;11067:57;11045:13;11004:16;11101:4;11089:17;;11067:57;:::i;:::-;11140:20;;10696:470;-1:-1:-1;;;;10696:470:15:o;12965:488::-;-1:-1:-1;;;;;13234:15:15;;;13216:34;;13286:15;;13281:2;13266:18;;13259:43;13333:2;13318:18;;13311:34;;;13381:3;13376:2;13361:18;;13354:31;;;13159:4;;13402:45;;13427:19;;13419:6;13402:45;:::i;:::-;13394:53;12965:488;-1:-1:-1;;;;;;12965:488:15:o;13832:217::-;13979:2;13968:9;13961:21;13942:4;13999:44;14039:2;14028:9;14024:18;14016:6;13999:44;:::i;23134:356::-;23336:2;23318:21;;;23355:18;;;23348:30;23414:34;23409:2;23394:18;;23387:62;23481:2;23466:18;;23134:356::o;26131:415::-;26333:2;26315:21;;;26372:2;26352:18;;;26345:30;26411:34;26406:2;26391:18;;26384:62;-1:-1:-1;;;26477:2:15;26462:18;;26455:49;26536:3;26521:19;;26131:415::o;31949:275::-;32020:2;32014:9;32085:2;32066:13;;-1:-1:-1;;32062:27:15;32050:40;;-1:-1:-1;;;;;32105:34:15;;32141:22;;;32102:62;32099:88;;;32167:18;;:::i;:::-;32203:2;32196:22;31949:275;;-1:-1:-1;31949:275:15:o;32229:183::-;32289:4;-1:-1:-1;;;;;32314:6:15;32311:30;32308:56;;;32344:18;;:::i;:::-;-1:-1:-1;32389:1:15;32385:14;32401:4;32381:25;;32229:183::o;32417:253::-;32457:3;-1:-1:-1;;;;;32546:2:15;32543:1;32539:10;32576:2;32573:1;32569:10;32607:3;32603:2;32599:12;32594:3;32591:21;32588:47;;;32615:18;;:::i;32675:128::-;32715:3;32746:1;32742:6;32739:1;32736:13;32733:39;;;32752:18;;:::i;:::-;-1:-1:-1;32788:9:15;;32675:128::o;32808:120::-;32848:1;32874;32864:35;;32879:18;;:::i;:::-;-1:-1:-1;32913:9:15;;32808:120::o;32933:168::-;32973:7;33039:1;33035;33031:6;33027:14;33024:1;33021:21;33016:1;33009:9;33002:17;32998:45;32995:71;;;33046:18;;:::i;:::-;-1:-1:-1;33086:9:15;;32933:168::o;33106:246::-;33146:4;-1:-1:-1;;;;;33259:10:15;;;;33229;;33281:12;;;33278:38;;;33296:18;;:::i;:::-;33333:13;;33106:246;-1:-1:-1;;;33106:246:15:o;33357:125::-;33397:4;33425:1;33422;33419:8;33416:34;;;33430:18;;:::i;:::-;-1:-1:-1;33467:9:15;;33357:125::o;33487:258::-;33559:1;33569:113;33583:6;33580:1;33577:13;33569:113;;;33659:11;;;33653:18;33640:11;;;33633:39;33605:2;33598:10;33569:113;;;33700:6;33697:1;33694:13;33691:48;;;-1:-1:-1;;33735:1:15;33717:16;;33710:27;33487:258::o;33750:380::-;33829:1;33825:12;;;;33872;;;33893:61;;33947:4;33939:6;33935:17;33925:27;;33893:61;34000:2;33992:6;33989:14;33969:18;33966:38;33963:161;;;34046:10;34041:3;34037:20;34034:1;34027:31;34081:4;34078:1;34071:15;34109:4;34106:1;34099:15;34135:135;34174:3;-1:-1:-1;;34195:17:15;;34192:43;;;34215:18;;:::i;:::-;-1:-1:-1;34262:1:15;34251:13;;34135:135::o;34275:112::-;34307:1;34333;34323:35;;34338:18;;:::i;:::-;-1:-1:-1;34372:9:15;;34275:112::o;34392:127::-;34453:10;34448:3;34444:20;34441:1;34434:31;34484:4;34481:1;34474:15;34508:4;34505:1;34498:15;34524:127;34585:10;34580:3;34576:20;34573:1;34566:31;34616:4;34613:1;34606:15;34640:4;34637:1;34630:15;34656:127;34717:10;34712:3;34708:20;34705:1;34698:31;34748:4;34745:1;34738:15;34772:4;34769:1;34762:15;34788:127;34849:10;34844:3;34840:20;34837:1;34830:31;34880:4;34877:1;34870:15;34904:4;34901:1;34894:15;34920:131;-1:-1:-1;;;;;;34994:32:15;;34984:43;;34974:71;;35041:1;35038;35031:12
Swarm Source
ipfs://67943ee0e4013f84580f3103e5f79222264dd935299597286b4aca0672f8a2aa
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.