NFT
Overview
TokenID
4183
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ToolsOfRock
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
No with 200 runs
Other Settings:
byzantium EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "./IMintTicket.sol"; /* ________________ _,.......,_ .nNNNNNNNNNNNNNNNNP’ .nnNNNNNNNNNNNNnn.. ANNC*’ 7NNNN|’’’’’’’ (NNN*’ 7NNNNN `*NNNn. (NNNN. dNNNN’ qNNN) JNNNN* `NNNn `*@*’ NNNNN `*@*’ dNNNN’ ,ANNN) ,NNNN’ ..-^^^-.. NNNNN ,NNNNN’ dNNNN’ / . \ .NNNNP _..nNNNN*’ NNNNN ( /|\ ) NNNNNnnNNNNN*’ ,NNNN’ ‘ / | \ ’ NNNN* \NNNNb dNNNN’ \ \'.'/ / ,NNNN’ \NNNN. NNNNN ' \|/ ' NNNNC \NNNN. .JNNNNNL. \ ' / .JNNNNNL. \NNNN. . dNNNNNNNNNN| ‘. .’ .NNNNNNNNNN| `NNNNn. ^\Nn ' `NNNNn. .NND `*NNNNNnnn....nnNP’ `*@NNNNNNNNN**’ */ contract ToolsOfRock is ERC721, ERC721Enumerable, ERC721Burnable, Ownable { using Counters for Counters.Counter; IMintTicket private mintTicketContractInstance; Counters.Counter private _tokenIdCounter; uint256 public maxTokenSupply; uint256 public maxTokensPerTicket; uint256 public constant MAX_MINTS_PER_TXN = 16; uint256 public mintPrice = 69000000 gwei; // 0.069 ETH bool public preSaleIsActive = false; bool public saleIsActive = false; string public baseURI; string public provenance; uint256 public startingIndexBlock; uint256 public startingIndex; address[5] private _shareholders; uint[5] private _shares; event PaymentReleased(address to, uint256 amount); constructor(string memory name, string memory symbol, uint256 maxTorSupply, address mintTicketContractAddress) ERC721(name, symbol) { maxTokenSupply = maxTorSupply; _shareholders[0] = 0x689018A9e2073d9A8530dA969B735F313636553b; // JJ _shareholders[1] = 0xDc8Eb8d2D1babD956136b57B0B9F49b433c019e3; // Treasure-Seeker _shareholders[2] = 0x7Dcb39fe010A205f16ee3249F04b24d74C4f44F1; // Belfort _shareholders[3] = 0x74a2acae9B92781Cbb1CCa3bc667c05313e14850; // Cam _shareholders[4] = 0xD9D2E67b1695492B870165FD852CF07576f911B3; // Jagger _shares[0] = 6270; _shares[1] = 1250; _shares[2] = 1180; _shares[3] = 650; _shares[4] = 650; mintTicketContractInstance = IMintTicket(mintTicketContractAddress); maxTokensPerTicket = 4; } function setMaxTokenSupply(uint256 maxTorSupply) public onlyOwner { maxTokenSupply = maxTorSupply; } function setMintPrice(uint256 newPrice) public onlyOwner { mintPrice = newPrice; } function setMaxTokensPerTicket(uint256 maxTokensPerMintTicket) public onlyOwner { maxTokensPerTicket = maxTokensPerMintTicket; } function setTicketContractAddress(address mintTicketContractAddress) public onlyOwner { mintTicketContractInstance = IMintTicket(mintTicketContractAddress); } function withdrawForGiveaway(uint256 amount, address payable to) public onlyOwner { Address.sendValue(to, amount); emit PaymentReleased(to, amount); } function withdraw(uint256 amount) public onlyOwner { require(address(this).balance >= amount, "Insufficient balance"); uint256 totalShares = 10000; for (uint256 i = 0; i < 5; i++) { uint256 payment = amount * _shares[i] / totalShares; Address.sendValue(payable(_shareholders[i]), payment); emit PaymentReleased(_shareholders[i], payment); } } /* * Mint reserved NFTs for giveaways, devs, etc. */ function reserveMint(uint256 reservedAmount) public onlyOwner { uint256 supply = _tokenIdCounter.current(); for (uint256 i = 1; i <= reservedAmount; i++) { _safeMint(msg.sender, supply + i); _tokenIdCounter.increment(); } } /* * Mint reserved NFTs for giveaways, devs, etc. */ function reserveMint(uint256 reservedAmount, address mintAddress) public onlyOwner { uint256 supply = _tokenIdCounter.current(); for (uint256 i = 1; i <= reservedAmount; i++) { _safeMint(mintAddress, supply + i); _tokenIdCounter.increment(); } } /* * Pause sale if active, make active if paused. */ function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } /* * Pause pre-sale if active, make active if paused. */ function flipPreSaleState() public onlyOwner { preSaleIsActive = !preSaleIsActive; } /* * Mint TOR NFTs, woo! */ function mintTOR(uint256 numberOfTokens) public payable { require(saleIsActive, "Sale must be active to mint TOR NFTs"); require(numberOfTokens <= MAX_MINTS_PER_TXN, "You can only mint 16 TOR NFTs at a time"); require(totalSupply() + numberOfTokens <= maxTokenSupply, "Purchase would exceed max available NFTs"); require(mintPrice * numberOfTokens <= msg.value, "Ether value sent is not correct"); for(uint256 i = 0; i < numberOfTokens; i++) { uint256 mintIndex = _tokenIdCounter.current() + 1; if (mintIndex <= maxTokenSupply) { _safeMint(msg.sender, mintIndex); _tokenIdCounter.increment(); } } } /* * Mint TOR NFTs using tickets */ function mintUsingTicket(uint256 numberOfTokens) public payable { require(preSaleIsActive, "Pre-sale must be active to mint TOR NFTs using tickets"); uint256 numberOfPassesNeeded = ((numberOfTokens + maxTokensPerTicket - 1) / maxTokensPerTicket); require(mintPrice * (numberOfTokens - numberOfPassesNeeded) <= msg.value, "Ether value sent is not correct"); require(numberOfPassesNeeded <= mintTicketContractInstance.balanceOf(msg.sender), "You do not have enough passes to mint these many tokens"); for(uint256 i = 0; i < numberOfPassesNeeded; i++) { // First, burn all passes to avoid re-entrancy attacks uint256 tokenIdToBurn = mintTicketContractInstance.tokenOfOwnerByIndex(msg.sender, 0); mintTicketContractInstance.burn(tokenIdToBurn); } for(uint256 i = 0; i < numberOfTokens; i++) { // Now, mint the required number of tokens _safeMint(msg.sender, _tokenIdCounter.current() + 1); _tokenIdCounter.increment(); } // If we haven't set the starting index, set the starting index block. if (startingIndexBlock == 0) { startingIndexBlock = block.number; } } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setBaseURI(string memory newBaseURI) public onlyOwner { baseURI = newBaseURI; } /** * Set the starting index for the collection. */ function setStartingIndex() public onlyOwner { require(startingIndex == 0, "Starting index is already set"); require(startingIndexBlock != 0, "Starting index block must be set"); startingIndex = uint(blockhash(startingIndexBlock)) % maxTokenSupply; // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes). if (block.number - startingIndexBlock > 255) { startingIndex = uint(blockhash(block.number - 1)) % maxTokenSupply; } // Prevent default sequence. if (startingIndex == 0) { startingIndex = 1; } } /** * Set the starting index block for the collection. Usually, this will be set after the first sale mint. */ function emergencySetStartingIndexBlock() public onlyOwner { require(startingIndex == 0, "Starting index is already set"); startingIndexBlock = block.number; } /* * Set provenance once it's calculated. */ function setProvenanceHash(string memory provenanceHash) public onlyOwner { provenance = provenanceHash; } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; /* ________________ _,.......,_ .nNNNNNNNNNNNNNNNNP’ .nnNNNNNNNNNNNNnn.. ANNC*’ 7NNNN|’’’’’’’ (NNN*’ 7NNNNN `*NNNn. (NNNN. dNNNN’ qNNN) JNNNN* `NNNn `*@*’ NNNNN `*@*’ dNNNN’ ,ANNN) ,NNNN’ ..-^^^-.. NNNNN ,NNNNN’ dNNNN’ / . \ .NNNNP _..nNNNN*’ NNNNN ( /|\ ) NNNNNnnNNNNN*’ ,NNNN’ ‘ / | \ ’ NNNN* \NNNNb dNNNN’ \ \'.'/ / ,NNNN’ \NNNN. NNNNN ' \|/ ' NNNNC \NNNN. .JNNNNNL. \ ' / .JNNNNNL. \NNNN. . dNNNNNNNNNN| ‘. .’ .NNNNNNNNNN| `NNNNn. ^\Nn ' `NNNNn. .NND `*NNNNNnnn....nnNP’ `*@NNNNNNNNN**’ */ interface IMintTicket { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) external; /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC721.sol"; import "../../../utils/Context.sol"; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev 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); }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "byzantium", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxTorSupply","type":"uint256"},{"internalType":"address","name":"mintTicketContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINTS_PER_TXN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerTicket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintTOR","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintUsingTicket","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reservedAmount","type":"uint256"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reservedAmount","type":"uint256"},{"internalType":"address","name":"mintAddress","type":"address"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTorSupply","type":"uint256"}],"name":"setMaxTokenSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTokensPerMintTicket","type":"uint256"}],"name":"setMaxTokensPerTicket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mintTicketContractAddress","type":"address"}],"name":"setTicketContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"to","type":"address"}],"name":"withdrawForGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405266f5232269808000600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055503480156200005257600080fd5b5060405162006229380380620062298339818101604052810190620000789190620005e2565b838381600090805190602001906200009292919062000486565b508060019080519060200190620000ab92919062000486565b5050506000620000c96200047e640100000000026401000000009004565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600d8190555073689018a9e2073d9a8530da969b735f313636553b60156000600581106200019c576200019b62000800565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073dc8eb8d2d1babd956136b57b0b9f49b433c019e3601560016005811062000208576200020762000800565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737dcb39fe010a205f16ee3249f04b24d74c4f44f1601560026005811062000274576200027362000800565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507374a2acae9b92781cbb1cca3bc667c05313e148506015600360058110620002e057620002df62000800565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d9d2e67b1695492b870165fd852cf07576f911b360156004600581106200034c576200034b62000800565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061187e601a600060058110620003a657620003a562000800565b5b01819055506104e2601a600160058110620003c657620003c562000800565b5b018190555061049c601a600260058110620003e657620003e562000800565b5b018190555061028a601a60036005811062000406576200040562000800565b5b018190555061028a601a60046005811062000426576200042562000800565b5b018190555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004600e8190555050505050620008b7565b600033905090565b828054620004949062000765565b90600052602060002090601f016020900481019282620004b8576000855562000504565b82601f10620004d357805160ff191683800117855562000504565b8280016001018555821562000504579182015b8281111562000503578251825591602001919060010190620004e6565b5b50905062000513919062000517565b5090565b5b808211156200053257600081600090555060010162000518565b5090565b60006200054d6200054784620006bb565b62000692565b9050828152602081018484840111156200056c576200056b62000863565b5b620005798482856200072f565b509392505050565b600081519050620005928162000883565b92915050565b600082601f830112620005b057620005af6200085e565b5b8151620005c284826020860162000536565b91505092915050565b600081519050620005dc816200089d565b92915050565b60008060008060808587031215620005ff57620005fe6200086d565b5b600085015167ffffffffffffffff81111562000620576200061f62000868565b5b6200062e8782880162000598565b945050602085015167ffffffffffffffff81111562000652576200065162000868565b5b620006608782880162000598565b93505060406200067387828801620005cb565b9250506060620006868782880162000581565b91505092959194509250565b60006200069e620006b1565b9050620006ac82826200079b565b919050565b6000604051905090565b600067ffffffffffffffff821115620006d957620006d86200082f565b5b620006e48262000872565b9050602081019050919050565b6000620006fe8262000705565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200074f57808201518184015260208101905062000732565b838111156200075f576000848401525b50505050565b600060028204905060018216806200077e57607f821691505b60208210811415620007955762000794620007d1565b5b50919050565b620007a68262000872565b810181811067ffffffffffffffff82111715620007c857620007c76200082f565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200088e81620006f1565b81146200089a57600080fd5b50565b620008a88162000725565b8114620008b457600080fd5b50565b61596280620008c76000396000f3fe60806040526004361061029a576000357c0100000000000000000000000000000000000000000000000000000000900480636817c76c1161016c578063b88d4fde116100de578063e986655011610097578063e98665501461097e578063eb8d244414610995578063f0325549146109c0578063f2fde38b146109d7578063f4a0a52814610a00578063fd71547e14610a295761029a565b8063b88d4fde1461085a578063c87b56dd14610883578063cb774d47146108c0578063dfe93fa3146108eb578063e36d649814610916578063e985e9c5146109415761029a565b80638da5cb5b116101305780638da5cb5b1461075e5780638ee5955b1461078957806392826b48146107b457806395d89b41146107dd578063a22cb46514610808578063b07ed982146108315761029a565b80636817c76c1461069d5780636c0360eb146106c857806370a08231146106f3578063715018a6146107305780637d17fcbe146107475761029a565b80632e1a7d4d116102105780634f6ccce7116101c95780634f6ccce71461057d57806350f7c204146105ba57806355f804b3146105e557806360b02f701461060e5780636352211e14610637578063667df116146106745761029a565b80632e1a7d4d146104855780632f745c59146104ae57806334918dfd146104eb57806342842e0e1461050257806342966c681461052b5780634d7313a4146105545761029a565b80630f7309e8116102625780630f7309e81461038957806310969523146103b45780631342ff4c146103dd57806318160ddd146104065780631f0234d81461043157806323b872dd1461045c5761029a565b806301ffc9a71461029f57806306fdde03146102dc578063081812fc14610307578063095ea7b3146103445780630b3a7a0a1461036d575b600080fd5b3480156102ab57600080fd5b506102c660048036038101906102c19190613fd9565b610a45565b6040516102d3919061479c565b60405180910390f35b3480156102e857600080fd5b506102f1610a57565b6040516102fe91906147b7565b60405180910390f35b34801561031357600080fd5b5061032e6004803603810190610329919061407c565b610ae9565b60405161033b91906146ba565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190613f99565b610b6e565b005b6103876004803603810190610382919061407c565b610c86565b005b34801561039557600080fd5b5061039e61105a565b6040516103ab91906147b7565b60405180910390f35b3480156103c057600080fd5b506103db60048036038101906103d69190614033565b6110e8565b005b3480156103e957600080fd5b5061040460048036038101906103ff919061407c565b61117e565b005b34801561041257600080fd5b5061041b61124d565b6040516104289190614b99565b60405180910390f35b34801561043d57600080fd5b5061044661125a565b604051610453919061479c565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190613e83565b61126d565b005b34801561049157600080fd5b506104ac60048036038101906104a7919061407c565b6112cd565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190613f99565b6114ac565b6040516104e29190614b99565b60405180910390f35b3480156104f757600080fd5b50610500611551565b005b34801561050e57600080fd5b5061052960048036038101906105249190613e83565b6115f9565b005b34801561053757600080fd5b50610552600480360381019061054d919061407c565b611619565b005b34801561056057600080fd5b5061057b60048036038101906105769190614116565b611675565b005b34801561058957600080fd5b506105a4600480360381019061059f919061407c565b611738565b6040516105b19190614b99565b60405180910390f35b3480156105c657600080fd5b506105cf6117a9565b6040516105dc9190614b99565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190614033565b6117af565b005b34801561061a57600080fd5b50610635600480360381019061063091906140d6565b611845565b005b34801561064357600080fd5b5061065e6004803603810190610659919061407c565b611915565b60405161066b91906146ba565b60405180910390f35b34801561068057600080fd5b5061069b6004803603810190610696919061407c565b6119c7565b005b3480156106a957600080fd5b506106b2611a4d565b6040516106bf9190614b99565b60405180910390f35b3480156106d457600080fd5b506106dd611a53565b6040516106ea91906147b7565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190613e16565b611ae1565b6040516107279190614b99565b60405180910390f35b34801561073c57600080fd5b50610745611b99565b005b34801561075357600080fd5b5061075c611cd6565b005b34801561076a57600080fd5b50610773611da0565b60405161078091906146ba565b60405180910390f35b34801561079557600080fd5b5061079e611dca565b6040516107ab9190614b99565b60405180910390f35b3480156107c057600080fd5b506107db60048036038101906107d69190613e16565b611dd0565b005b3480156107e957600080fd5b506107f2611e90565b6040516107ff91906147b7565b60405180910390f35b34801561081457600080fd5b5061082f600480360381019061082a9190613f59565b611f22565b005b34801561083d57600080fd5b506108586004803603810190610853919061407c565b6120a3565b005b34801561086657600080fd5b50610881600480360381019061087c9190613ed6565b612129565b005b34801561088f57600080fd5b506108aa60048036038101906108a5919061407c565b61218b565b6040516108b791906147b7565b60405180910390f35b3480156108cc57600080fd5b506108d5612232565b6040516108e29190614b99565b60405180910390f35b3480156108f757600080fd5b50610900612238565b60405161090d9190614b99565b60405180910390f35b34801561092257600080fd5b5061092b61223d565b6040516109389190614b99565b60405180910390f35b34801561094d57600080fd5b5061096860048036038101906109639190613e43565b612243565b604051610975919061479c565b60405180910390f35b34801561098a57600080fd5b506109936122d7565b005b3480156109a157600080fd5b506109aa61244b565b6040516109b7919061479c565b60405180910390f35b3480156109cc57600080fd5b506109d561245e565b005b3480156109e357600080fd5b506109fe60048036038101906109f99190613e16565b612506565b005b348015610a0c57600080fd5b50610a276004803603810190610a22919061407c565b6126b2565b005b610a436004803603810190610a3e919061407c565b612738565b005b6000610a50826128cd565b9050919050565b606060008054610a6690614eae565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9290614eae565b8015610adf5780601f10610ab457610100808354040283529160200191610adf565b820191906000526020600020905b815481529060010190602001808311610ac257829003601f168201915b5050505050905090565b6000610af482612947565b610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90614a59565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7982611915565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be190614ad9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c096129b3565b73ffffffffffffffffffffffffffffffffffffffff161480610c385750610c3781610c326129b3565b612243565b5b610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90614979565b60405180910390fd5b610c8183836129bb565b505050565b601060009054906101000a900460ff16610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90614999565b60405180910390fd5b6000600e546001600e5484610cea9190614c89565b610cf49190614d6a565b610cfe9190614cdf565b9050348183610d0d9190614d6a565b600f54610d1a9190614d10565b1115610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d52906148d9565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610dd291906146ba565b60206040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906140a9565b811115610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b906147d9565b60405180910390fd5b60005b81811015610ffa576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c593360006040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610eeb92919061474a565b60206040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b91906140a9565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610fb49190614b99565b600060405180830381600087803b158015610fce57600080fd5b505af1158015610fe2573d6000803e3d6000fd5b50505050508080610ff290614f11565b915050610e67565b5060005b8281101561104257611025336001611016600c612a74565b6110209190614c89565b612a82565b61102f600c612aa0565b808061103a90614f11565b915050610ffe565b506000601354141561105657436013819055505b5050565b6012805461106790614eae565b80601f016020809104026020016040519081016040528092919081815260200182805461109390614eae565b80156110e05780601f106110b5576101008083540402835291602001916110e0565b820191906000526020600020905b8154815290600101906020018083116110c357829003601f168201915b505050505081565b6110f06129b3565b73ffffffffffffffffffffffffffffffffffffffff1661110e611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90614a79565b60405180910390fd5b806012908051906020019061117a929190613c00565b5050565b6111866129b3565b73ffffffffffffffffffffffffffffffffffffffff166111a4611da0565b73ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614a79565b60405180910390fd5b6000611206600c612a74565b90506000600190505b8281116112485761122b3382846112269190614c89565b612a82565b611235600c612aa0565b808061124090614f11565b91505061120f565b505050565b6000600880549050905090565b601060009054906101000a900460ff1681565b61127e6112786129b3565b82612ab6565b6112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b490614b19565b60405180910390fd5b6112c8838383612b94565b505050565b6112d56129b3565b73ffffffffffffffffffffffffffffffffffffffff166112f3611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614a79565b60405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff163110156113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a906148b9565b60405180910390fd5b6000612710905060005b60058110156114a757600082601a83600581106113cd576113cc615047565b5b0154856113da9190614d10565b6113e49190614cdf565b9050611425601583600581106113fd576113fc615047565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612df0565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0566015836005811061145a57611459615047565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260405161148b929190614773565b60405180910390a150808061149f90614f11565b9150506113ad565b505050565b60006114b783611ae1565b82106114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef906147f9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115596129b3565b73ffffffffffffffffffffffffffffffffffffffff16611577611da0565b73ffffffffffffffffffffffffffffffffffffffff16146115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c490614a79565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b61161483838360405180602001604052806000815250612129565b505050565b61162a6116246129b3565b82612ab6565b611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090614b59565b60405180910390fd5b61167281612efb565b50565b61167d6129b3565b73ffffffffffffffffffffffffffffffffffffffff1661169b611da0565b73ffffffffffffffffffffffffffffffffffffffff16146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e890614a79565b60405180910390fd5b6116fb8183612df0565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056818360405161172c9291906146d5565b60405180910390a15050565b600061174261124d565b8210611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a90614b39565b60405180910390fd5b6008828154811061179757611796615047565b5b90600052602060002001549050919050565b600d5481565b6117b76129b3565b73ffffffffffffffffffffffffffffffffffffffff166117d5611da0565b73ffffffffffffffffffffffffffffffffffffffff161461182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182290614a79565b60405180910390fd5b8060119080519060200190611841929190613c00565b5050565b61184d6129b3565b73ffffffffffffffffffffffffffffffffffffffff1661186b611da0565b73ffffffffffffffffffffffffffffffffffffffff16146118c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b890614a79565b60405180910390fd5b60006118cd600c612a74565b90506000600190505b83811161190f576118f28382846118ed9190614c89565b612a82565b6118fc600c612aa0565b808061190790614f11565b9150506118d6565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b5906149d9565b60405180910390fd5b80915050919050565b6119cf6129b3565b73ffffffffffffffffffffffffffffffffffffffff166119ed611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a90614a79565b60405180910390fd5b80600e8190555050565b600f5481565b60118054611a6090614eae565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8c90614eae565b8015611ad95780601f10611aae57610100808354040283529160200191611ad9565b820191906000526020600020905b815481529060010190602001808311611abc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b49906149b9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ba16129b3565b73ffffffffffffffffffffffffffffffffffffffff16611bbf611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0c90614a79565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611cde6129b3565b73ffffffffffffffffffffffffffffffffffffffff16611cfc611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4990614a79565b60405180910390fd5b600060145414611d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8e90614959565b60405180910390fd5b43601381905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b611dd86129b3565b73ffffffffffffffffffffffffffffffffffffffff16611df6611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4390614a79565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054611e9f90614eae565b80601f0160208091040260200160405190810160405280929190818152602001828054611ecb90614eae565b8015611f185780601f10611eed57610100808354040283529160200191611f18565b820191906000526020600020905b815481529060010190602001808311611efb57829003601f168201915b5050505050905090565b611f2a6129b3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8f90614899565b60405180910390fd5b8060056000611fa56129b3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120526129b3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612097919061479c565b60405180910390a35050565b6120ab6129b3565b73ffffffffffffffffffffffffffffffffffffffff166120c9611da0565b73ffffffffffffffffffffffffffffffffffffffff161461211f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211690614a79565b60405180910390fd5b80600d8190555050565b61213a6121346129b3565b83612ab6565b612179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217090614b19565b60405180910390fd5b6121858484848461300c565b50505050565b606061219682612947565b6121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90614ab9565b60405180910390fd5b60006121df613068565b905060008151116121ff576040518060200160405280600081525061222a565b80612209846130fa565b60405160200161221a929190614681565b6040516020818303038152906040525b915050919050565b60145481565b601081565b60135481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122df6129b3565b73ffffffffffffffffffffffffffffffffffffffff166122fd611da0565b73ffffffffffffffffffffffffffffffffffffffff1614612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a90614a79565b60405180910390fd5b600060145414612398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238f90614959565b60405180910390fd5b600060135414156123de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d590614af9565b60405180910390fd5b600d5460135440600190046123f39190614f5a565b60148190555060ff601354436124099190614d6a565b111561243557600d5460014361241f9190614d6a565b406001900461242e9190614f5a565b6014819055505b600060145414156124495760016014819055505b565b601060019054906101000a900460ff1681565b6124666129b3565b73ffffffffffffffffffffffffffffffffffffffff16612484611da0565b73ffffffffffffffffffffffffffffffffffffffff16146124da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d190614a79565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b61250e6129b3565b73ffffffffffffffffffffffffffffffffffffffff1661252c611da0565b73ffffffffffffffffffffffffffffffffffffffff1614612582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257990614a79565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e990614839565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6126ba6129b3565b73ffffffffffffffffffffffffffffffffffffffff166126d8611da0565b73ffffffffffffffffffffffffffffffffffffffff161461272e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272590614a79565b60405180910390fd5b80600f8190555050565b601060019054906101000a900460ff16612787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277e906149f9565b60405180910390fd5b60108111156127cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c290614b79565b60405180910390fd5b600d54816127d761124d565b6127e19190614c89565b1115612822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281990614a39565b60405180910390fd5b3481600f546128319190614d10565b1115612872576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612869906148d9565b60405180910390fd5b60005b818110156128c9576000600161288b600c612a74565b6128959190614c89565b9050600d5481116128b5576128aa3382612a82565b6128b4600c612aa0565b5b5080806128c190614f11565b915050612875565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612940575061293f8261327a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a2e83611915565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b612a9c82826040518060200160405280600081525061335c565b5050565b6001816000016000828254019250508190555050565b6000612ac182612947565b612b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af790614939565b60405180910390fd5b6000612b0b83611915565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b7a57508373ffffffffffffffffffffffffffffffffffffffff16612b6284610ae9565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b8b5750612b8a8185612243565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bb482611915565b73ffffffffffffffffffffffffffffffffffffffff1614612c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0190614a99565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7190614879565b60405180910390fd5b612c858383836133b7565b612c906000826129bb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ce09190614d6a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d379190614c89565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b803073ffffffffffffffffffffffffffffffffffffffff16311015612e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4190614919565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612e70906146a5565b60006040518083038185875af1925050503d8060008114612ead576040519150601f19603f3d011682016040523d82523d6000602084013e612eb2565b606091505b5050905080612ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eed906148f9565b60405180910390fd5b505050565b6000612f0682611915565b9050612f14816000846133b7565b612f1f6000836129bb565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f6f9190614d6a565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b613017848484612b94565b613023848484846133c7565b613062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305990614819565b60405180910390fd5b50505050565b60606011805461307790614eae565b80601f01602080910402602001604051908101604052809291908181526020018280546130a390614eae565b80156130f05780601f106130c5576101008083540402835291602001916130f0565b820191906000526020600020905b8154815290600101906020018083116130d357829003601f168201915b5050505050905090565b60606000821415613142576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613275565b600082905060005b6000821461317457808061315d90614f11565b915050600a8261316d9190614cdf565b915061314a565b60008167ffffffffffffffff8111156131905761318f615076565b5b6040519080825280601f01601f1916602001820160405280156131c25781602001600182028036833780820191505090505b5090505b6000851461326e576001826131db9190614d6a565b9150600a856131ea9190614f5a565b60306131f69190614c89565b7f01000000000000000000000000000000000000000000000000000000000000000281838151811061322b5761322a615047565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132679190614cdf565b94506131c6565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061334557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613355575061335482613596565b5b9050919050565b6133668383613600565b61337360008484846133c7565b6133b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a990614819565b60405180910390fd5b505050565b6133c28383836137ce565b505050565b60006133e88473ffffffffffffffffffffffffffffffffffffffff166138e2565b15613589578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134116129b3565b8786866040518563ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161344f94939291906146fe565b602060405180830381600087803b15801561346957600080fd5b505af192505050801561349a57506040513d601f19601f820116820180604052508101906134979190614006565b60015b61351d573d80600081146134ca576040519150601f19603f3d011682016040523d82523d6000602084013e6134cf565b606091505b50600081511415613515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350c90614819565b60405180910390fd5b805181602001fd5b63150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061358e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366790614a19565b60405180910390fd5b61367981612947565b156136b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b090614859565b60405180910390fd5b6136c5600083836133b7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137159190614c89565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6137d98383836138f5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561381c57613817816138fa565b61385b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461385a576138598382613943565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561389e5761389981613ab0565b6138dd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146138dc576138db8282613b81565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161395084611ae1565b61395a9190614d6a565b9050600060076000848152602001908152602001600020549050818114613a3f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613ac49190614d6a565b9050600060096000848152602001908152602001600020549050600060088381548110613af457613af3615047565b5b906000526020600020015490508060088381548110613b1657613b15615047565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613b6557613b64615018565b5b6001900381819060005260206000200160009055905550505050565b6000613b8c83611ae1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613c0c90614eae565b90600052602060002090601f016020900481019282613c2e5760008555613c75565b82601f10613c4757805160ff1916838001178555613c75565b82800160010185558215613c75579182015b82811115613c74578251825591602001919060010190613c59565b5b509050613c829190613c86565b5090565b5b80821115613c9f576000816000905550600101613c87565b5090565b6000613cb6613cb184614bd9565b614bb4565b905082815260208101848484011115613cd257613cd16150aa565b5b613cdd848285614e6c565b509392505050565b6000613cf8613cf384614c0a565b614bb4565b905082815260208101848484011115613d1457613d136150aa565b5b613d1f848285614e6c565b509392505050565b600081359050613d36816158b9565b92915050565b600081359050613d4b816158d0565b92915050565b600081359050613d60816158e7565b92915050565b600081359050613d75816158fe565b92915050565b600081519050613d8a816158fe565b92915050565b600082601f830112613da557613da46150a5565b5b8135613db5848260208601613ca3565b91505092915050565b600082601f830112613dd357613dd26150a5565b5b8135613de3848260208601613ce5565b91505092915050565b600081359050613dfb81615915565b92915050565b600081519050613e1081615915565b92915050565b600060208284031215613e2c57613e2b6150b4565b5b6000613e3a84828501613d27565b91505092915050565b60008060408385031215613e5a57613e596150b4565b5b6000613e6885828601613d27565b9250506020613e7985828601613d27565b9150509250929050565b600080600060608486031215613e9c57613e9b6150b4565b5b6000613eaa86828701613d27565b9350506020613ebb86828701613d27565b9250506040613ecc86828701613dec565b9150509250925092565b60008060008060808587031215613ef057613eef6150b4565b5b6000613efe87828801613d27565b9450506020613f0f87828801613d27565b9350506040613f2087828801613dec565b925050606085013567ffffffffffffffff811115613f4157613f406150af565b5b613f4d87828801613d90565b91505092959194509250565b60008060408385031215613f7057613f6f6150b4565b5b6000613f7e85828601613d27565b9250506020613f8f85828601613d51565b9150509250929050565b60008060408385031215613fb057613faf6150b4565b5b6000613fbe85828601613d27565b9250506020613fcf85828601613dec565b9150509250929050565b600060208284031215613fef57613fee6150b4565b5b6000613ffd84828501613d66565b91505092915050565b60006020828403121561401c5761401b6150b4565b5b600061402a84828501613d7b565b91505092915050565b600060208284031215614049576140486150b4565b5b600082013567ffffffffffffffff811115614067576140666150af565b5b61407384828501613dbe565b91505092915050565b600060208284031215614092576140916150b4565b5b60006140a084828501613dec565b91505092915050565b6000602082840312156140bf576140be6150b4565b5b60006140cd84828501613e01565b91505092915050565b600080604083850312156140ed576140ec6150b4565b5b60006140fb85828601613dec565b925050602061410c85828601613d27565b9150509250929050565b6000806040838503121561412d5761412c6150b4565b5b600061413b85828601613dec565b925050602061414c85828601613d3c565b9150509250929050565b61415f81614e24565b82525050565b61416e81614d9e565b82525050565b61417d81614dc2565b82525050565b600061418e82614c3b565b6141988185614c51565b93506141a8818560208601614e7b565b6141b1816150b9565b840191505092915050565b6141c581614e36565b82525050565b60006141d682614c46565b6141e08185614c6d565b93506141f0818560208601614e7b565b6141f9816150b9565b840191505092915050565b600061420f82614c46565b6142198185614c7e565b9350614229818560208601614e7b565b80840191505092915050565b6000614242603783614c6d565b915061424d826150ca565b604082019050919050565b6000614265602b83614c6d565b915061427082615119565b604082019050919050565b6000614288603283614c6d565b915061429382615168565b604082019050919050565b60006142ab602683614c6d565b91506142b6826151b7565b604082019050919050565b60006142ce601c83614c6d565b91506142d982615206565b602082019050919050565b60006142f1602483614c6d565b91506142fc8261522f565b604082019050919050565b6000614314601983614c6d565b915061431f8261527e565b602082019050919050565b6000614337601483614c6d565b9150614342826152a7565b602082019050919050565b600061435a601f83614c6d565b9150614365826152d0565b602082019050919050565b600061437d603a83614c6d565b9150614388826152f9565b604082019050919050565b60006143a0601d83614c6d565b91506143ab82615348565b602082019050919050565b60006143c3602c83614c6d565b91506143ce82615371565b604082019050919050565b60006143e6601d83614c6d565b91506143f1826153c0565b602082019050919050565b6000614409603883614c6d565b9150614414826153e9565b604082019050919050565b600061442c603683614c6d565b915061443782615438565b604082019050919050565b600061444f602a83614c6d565b915061445a82615487565b604082019050919050565b6000614472602983614c6d565b915061447d826154d6565b604082019050919050565b6000614495602483614c6d565b91506144a082615525565b604082019050919050565b60006144b8602083614c6d565b91506144c382615574565b602082019050919050565b60006144db602883614c6d565b91506144e68261559d565b604082019050919050565b60006144fe602c83614c6d565b9150614509826155ec565b604082019050919050565b6000614521602083614c6d565b915061452c8261563b565b602082019050919050565b6000614544602983614c6d565b915061454f82615664565b604082019050919050565b6000614567602f83614c6d565b9150614572826156b3565b604082019050919050565b600061458a602183614c6d565b915061459582615702565b604082019050919050565b60006145ad602083614c6d565b91506145b882615751565b602082019050919050565b60006145d0600083614c62565b91506145db8261577a565b600082019050919050565b60006145f3603183614c6d565b91506145fe8261577d565b604082019050919050565b6000614616602c83614c6d565b9150614621826157cc565b604082019050919050565b6000614639603083614c6d565b91506146448261581b565b604082019050919050565b600061465c602783614c6d565b91506146678261586a565b604082019050919050565b61467b81614e1a565b82525050565b600061468d8285614204565b91506146998284614204565b91508190509392505050565b60006146b0826145c3565b9150819050919050565b60006020820190506146cf6000830184614165565b92915050565b60006040820190506146ea6000830185614156565b6146f76020830184614672565b9392505050565b60006080820190506147136000830187614165565b6147206020830186614165565b61472d6040830185614672565b818103606083015261473f8184614183565b905095945050505050565b600060408201905061475f6000830185614165565b61476c60208301846141bc565b9392505050565b60006040820190506147886000830185614165565b6147956020830184614672565b9392505050565b60006020820190506147b16000830184614174565b92915050565b600060208201905081810360008301526147d181846141cb565b905092915050565b600060208201905081810360008301526147f281614235565b9050919050565b6000602082019050818103600083015261481281614258565b9050919050565b600060208201905081810360008301526148328161427b565b9050919050565b600060208201905081810360008301526148528161429e565b9050919050565b60006020820190508181036000830152614872816142c1565b9050919050565b60006020820190508181036000830152614892816142e4565b9050919050565b600060208201905081810360008301526148b281614307565b9050919050565b600060208201905081810360008301526148d28161432a565b9050919050565b600060208201905081810360008301526148f28161434d565b9050919050565b6000602082019050818103600083015261491281614370565b9050919050565b6000602082019050818103600083015261493281614393565b9050919050565b60006020820190508181036000830152614952816143b6565b9050919050565b60006020820190508181036000830152614972816143d9565b9050919050565b60006020820190508181036000830152614992816143fc565b9050919050565b600060208201905081810360008301526149b28161441f565b9050919050565b600060208201905081810360008301526149d281614442565b9050919050565b600060208201905081810360008301526149f281614465565b9050919050565b60006020820190508181036000830152614a1281614488565b9050919050565b60006020820190508181036000830152614a32816144ab565b9050919050565b60006020820190508181036000830152614a52816144ce565b9050919050565b60006020820190508181036000830152614a72816144f1565b9050919050565b60006020820190508181036000830152614a9281614514565b9050919050565b60006020820190508181036000830152614ab281614537565b9050919050565b60006020820190508181036000830152614ad28161455a565b9050919050565b60006020820190508181036000830152614af28161457d565b9050919050565b60006020820190508181036000830152614b12816145a0565b9050919050565b60006020820190508181036000830152614b32816145e6565b9050919050565b60006020820190508181036000830152614b5281614609565b9050919050565b60006020820190508181036000830152614b728161462c565b9050919050565b60006020820190508181036000830152614b928161464f565b9050919050565b6000602082019050614bae6000830184614672565b92915050565b6000614bbe614bcf565b9050614bca8282614ee0565b919050565b6000604051905090565b600067ffffffffffffffff821115614bf457614bf3615076565b5b614bfd826150b9565b9050602081019050919050565b600067ffffffffffffffff821115614c2557614c24615076565b5b614c2e826150b9565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c9482614e1a565b9150614c9f83614e1a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cd457614cd3614f8b565b5b828201905092915050565b6000614cea82614e1a565b9150614cf583614e1a565b925082614d0557614d04614fba565b5b828204905092915050565b6000614d1b82614e1a565b9150614d2683614e1a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d5f57614d5e614f8b565b5b828202905092915050565b6000614d7582614e1a565b9150614d8083614e1a565b925082821015614d9357614d92614f8b565b5b828203905092915050565b6000614da982614dfa565b9050919050565b6000614dbb82614dfa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614e2f82614e48565b9050919050565b6000614e4182614e1a565b9050919050565b6000614e5382614e5a565b9050919050565b6000614e6582614dfa565b9050919050565b82818337600083830152505050565b60005b83811015614e99578082015181840152602081019050614e7e565b83811115614ea8576000848401525b50505050565b60006002820490506001821680614ec657607f821691505b60208210811415614eda57614ed9614fe9565b5b50919050565b614ee9826150b9565b810181811067ffffffffffffffff82111715614f0857614f07615076565b5b80604052505050565b6000614f1c82614e1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f4f57614f4e614f8b565b5b600182019050919050565b6000614f6582614e1a565b9150614f7083614e1a565b925082614f8057614f7f614fba565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f596f7520646f206e6f74206861766520656e6f7567682070617373657320746f60008201527f206d696e74207468657365206d616e7920746f6b656e73000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f5072652d73616c65206d7573742062652061637469766520746f206d696e742060008201527f544f52204e465473207573696e67207469636b65747300000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420544f522060008201527f4e46547300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f507572636861736520776f756c6420657863656564206d617820617661696c6160008201527f626c65204e465473000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f596f752063616e206f6e6c79206d696e7420313620544f52204e46547320617460008201527f20612074696d6500000000000000000000000000000000000000000000000000602082015250565b6158c281614d9e565b81146158cd57600080fd5b50565b6158d981614db0565b81146158e457600080fd5b50565b6158f081614dc2565b81146158fb57600080fd5b50565b61590781614dce565b811461591257600080fd5b50565b61591e81614e1a565b811461592957600080fd5b5056fea2646970667358221220ac2b2620f90f5e3bf6584146dc8df8105b8b0faebf9733ff0b28179243b653d164736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000021340000000000000000000000002f7445cf648fd1d4d299e4bd0a550df697de055b000000000000000000000000000000000000000000000000000000000000000b546f6f6c734f66526f636b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003544f520000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061029a576000357c0100000000000000000000000000000000000000000000000000000000900480636817c76c1161016c578063b88d4fde116100de578063e986655011610097578063e98665501461097e578063eb8d244414610995578063f0325549146109c0578063f2fde38b146109d7578063f4a0a52814610a00578063fd71547e14610a295761029a565b8063b88d4fde1461085a578063c87b56dd14610883578063cb774d47146108c0578063dfe93fa3146108eb578063e36d649814610916578063e985e9c5146109415761029a565b80638da5cb5b116101305780638da5cb5b1461075e5780638ee5955b1461078957806392826b48146107b457806395d89b41146107dd578063a22cb46514610808578063b07ed982146108315761029a565b80636817c76c1461069d5780636c0360eb146106c857806370a08231146106f3578063715018a6146107305780637d17fcbe146107475761029a565b80632e1a7d4d116102105780634f6ccce7116101c95780634f6ccce71461057d57806350f7c204146105ba57806355f804b3146105e557806360b02f701461060e5780636352211e14610637578063667df116146106745761029a565b80632e1a7d4d146104855780632f745c59146104ae57806334918dfd146104eb57806342842e0e1461050257806342966c681461052b5780634d7313a4146105545761029a565b80630f7309e8116102625780630f7309e81461038957806310969523146103b45780631342ff4c146103dd57806318160ddd146104065780631f0234d81461043157806323b872dd1461045c5761029a565b806301ffc9a71461029f57806306fdde03146102dc578063081812fc14610307578063095ea7b3146103445780630b3a7a0a1461036d575b600080fd5b3480156102ab57600080fd5b506102c660048036038101906102c19190613fd9565b610a45565b6040516102d3919061479c565b60405180910390f35b3480156102e857600080fd5b506102f1610a57565b6040516102fe91906147b7565b60405180910390f35b34801561031357600080fd5b5061032e6004803603810190610329919061407c565b610ae9565b60405161033b91906146ba565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190613f99565b610b6e565b005b6103876004803603810190610382919061407c565b610c86565b005b34801561039557600080fd5b5061039e61105a565b6040516103ab91906147b7565b60405180910390f35b3480156103c057600080fd5b506103db60048036038101906103d69190614033565b6110e8565b005b3480156103e957600080fd5b5061040460048036038101906103ff919061407c565b61117e565b005b34801561041257600080fd5b5061041b61124d565b6040516104289190614b99565b60405180910390f35b34801561043d57600080fd5b5061044661125a565b604051610453919061479c565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190613e83565b61126d565b005b34801561049157600080fd5b506104ac60048036038101906104a7919061407c565b6112cd565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190613f99565b6114ac565b6040516104e29190614b99565b60405180910390f35b3480156104f757600080fd5b50610500611551565b005b34801561050e57600080fd5b5061052960048036038101906105249190613e83565b6115f9565b005b34801561053757600080fd5b50610552600480360381019061054d919061407c565b611619565b005b34801561056057600080fd5b5061057b60048036038101906105769190614116565b611675565b005b34801561058957600080fd5b506105a4600480360381019061059f919061407c565b611738565b6040516105b19190614b99565b60405180910390f35b3480156105c657600080fd5b506105cf6117a9565b6040516105dc9190614b99565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190614033565b6117af565b005b34801561061a57600080fd5b50610635600480360381019061063091906140d6565b611845565b005b34801561064357600080fd5b5061065e6004803603810190610659919061407c565b611915565b60405161066b91906146ba565b60405180910390f35b34801561068057600080fd5b5061069b6004803603810190610696919061407c565b6119c7565b005b3480156106a957600080fd5b506106b2611a4d565b6040516106bf9190614b99565b60405180910390f35b3480156106d457600080fd5b506106dd611a53565b6040516106ea91906147b7565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190613e16565b611ae1565b6040516107279190614b99565b60405180910390f35b34801561073c57600080fd5b50610745611b99565b005b34801561075357600080fd5b5061075c611cd6565b005b34801561076a57600080fd5b50610773611da0565b60405161078091906146ba565b60405180910390f35b34801561079557600080fd5b5061079e611dca565b6040516107ab9190614b99565b60405180910390f35b3480156107c057600080fd5b506107db60048036038101906107d69190613e16565b611dd0565b005b3480156107e957600080fd5b506107f2611e90565b6040516107ff91906147b7565b60405180910390f35b34801561081457600080fd5b5061082f600480360381019061082a9190613f59565b611f22565b005b34801561083d57600080fd5b506108586004803603810190610853919061407c565b6120a3565b005b34801561086657600080fd5b50610881600480360381019061087c9190613ed6565b612129565b005b34801561088f57600080fd5b506108aa60048036038101906108a5919061407c565b61218b565b6040516108b791906147b7565b60405180910390f35b3480156108cc57600080fd5b506108d5612232565b6040516108e29190614b99565b60405180910390f35b3480156108f757600080fd5b50610900612238565b60405161090d9190614b99565b60405180910390f35b34801561092257600080fd5b5061092b61223d565b6040516109389190614b99565b60405180910390f35b34801561094d57600080fd5b5061096860048036038101906109639190613e43565b612243565b604051610975919061479c565b60405180910390f35b34801561098a57600080fd5b506109936122d7565b005b3480156109a157600080fd5b506109aa61244b565b6040516109b7919061479c565b60405180910390f35b3480156109cc57600080fd5b506109d561245e565b005b3480156109e357600080fd5b506109fe60048036038101906109f99190613e16565b612506565b005b348015610a0c57600080fd5b50610a276004803603810190610a22919061407c565b6126b2565b005b610a436004803603810190610a3e919061407c565b612738565b005b6000610a50826128cd565b9050919050565b606060008054610a6690614eae565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9290614eae565b8015610adf5780601f10610ab457610100808354040283529160200191610adf565b820191906000526020600020905b815481529060010190602001808311610ac257829003601f168201915b5050505050905090565b6000610af482612947565b610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90614a59565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7982611915565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be190614ad9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c096129b3565b73ffffffffffffffffffffffffffffffffffffffff161480610c385750610c3781610c326129b3565b612243565b5b610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90614979565b60405180910390fd5b610c8183836129bb565b505050565b601060009054906101000a900460ff16610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90614999565b60405180910390fd5b6000600e546001600e5484610cea9190614c89565b610cf49190614d6a565b610cfe9190614cdf565b9050348183610d0d9190614d6a565b600f54610d1a9190614d10565b1115610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d52906148d9565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610dd291906146ba565b60206040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906140a9565b811115610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b906147d9565b60405180910390fd5b60005b81811015610ffa576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c593360006040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610eeb92919061474a565b60206040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b91906140a9565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610fb49190614b99565b600060405180830381600087803b158015610fce57600080fd5b505af1158015610fe2573d6000803e3d6000fd5b50505050508080610ff290614f11565b915050610e67565b5060005b8281101561104257611025336001611016600c612a74565b6110209190614c89565b612a82565b61102f600c612aa0565b808061103a90614f11565b915050610ffe565b506000601354141561105657436013819055505b5050565b6012805461106790614eae565b80601f016020809104026020016040519081016040528092919081815260200182805461109390614eae565b80156110e05780601f106110b5576101008083540402835291602001916110e0565b820191906000526020600020905b8154815290600101906020018083116110c357829003601f168201915b505050505081565b6110f06129b3565b73ffffffffffffffffffffffffffffffffffffffff1661110e611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90614a79565b60405180910390fd5b806012908051906020019061117a929190613c00565b5050565b6111866129b3565b73ffffffffffffffffffffffffffffffffffffffff166111a4611da0565b73ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614a79565b60405180910390fd5b6000611206600c612a74565b90506000600190505b8281116112485761122b3382846112269190614c89565b612a82565b611235600c612aa0565b808061124090614f11565b91505061120f565b505050565b6000600880549050905090565b601060009054906101000a900460ff1681565b61127e6112786129b3565b82612ab6565b6112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b490614b19565b60405180910390fd5b6112c8838383612b94565b505050565b6112d56129b3565b73ffffffffffffffffffffffffffffffffffffffff166112f3611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614a79565b60405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff163110156113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a906148b9565b60405180910390fd5b6000612710905060005b60058110156114a757600082601a83600581106113cd576113cc615047565b5b0154856113da9190614d10565b6113e49190614cdf565b9050611425601583600581106113fd576113fc615047565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612df0565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0566015836005811061145a57611459615047565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260405161148b929190614773565b60405180910390a150808061149f90614f11565b9150506113ad565b505050565b60006114b783611ae1565b82106114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef906147f9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115596129b3565b73ffffffffffffffffffffffffffffffffffffffff16611577611da0565b73ffffffffffffffffffffffffffffffffffffffff16146115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c490614a79565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b61161483838360405180602001604052806000815250612129565b505050565b61162a6116246129b3565b82612ab6565b611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090614b59565b60405180910390fd5b61167281612efb565b50565b61167d6129b3565b73ffffffffffffffffffffffffffffffffffffffff1661169b611da0565b73ffffffffffffffffffffffffffffffffffffffff16146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e890614a79565b60405180910390fd5b6116fb8183612df0565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056818360405161172c9291906146d5565b60405180910390a15050565b600061174261124d565b8210611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a90614b39565b60405180910390fd5b6008828154811061179757611796615047565b5b90600052602060002001549050919050565b600d5481565b6117b76129b3565b73ffffffffffffffffffffffffffffffffffffffff166117d5611da0565b73ffffffffffffffffffffffffffffffffffffffff161461182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182290614a79565b60405180910390fd5b8060119080519060200190611841929190613c00565b5050565b61184d6129b3565b73ffffffffffffffffffffffffffffffffffffffff1661186b611da0565b73ffffffffffffffffffffffffffffffffffffffff16146118c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b890614a79565b60405180910390fd5b60006118cd600c612a74565b90506000600190505b83811161190f576118f28382846118ed9190614c89565b612a82565b6118fc600c612aa0565b808061190790614f11565b9150506118d6565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b5906149d9565b60405180910390fd5b80915050919050565b6119cf6129b3565b73ffffffffffffffffffffffffffffffffffffffff166119ed611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a90614a79565b60405180910390fd5b80600e8190555050565b600f5481565b60118054611a6090614eae565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8c90614eae565b8015611ad95780601f10611aae57610100808354040283529160200191611ad9565b820191906000526020600020905b815481529060010190602001808311611abc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b49906149b9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ba16129b3565b73ffffffffffffffffffffffffffffffffffffffff16611bbf611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0c90614a79565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611cde6129b3565b73ffffffffffffffffffffffffffffffffffffffff16611cfc611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4990614a79565b60405180910390fd5b600060145414611d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8e90614959565b60405180910390fd5b43601381905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b611dd86129b3565b73ffffffffffffffffffffffffffffffffffffffff16611df6611da0565b73ffffffffffffffffffffffffffffffffffffffff1614611e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4390614a79565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054611e9f90614eae565b80601f0160208091040260200160405190810160405280929190818152602001828054611ecb90614eae565b8015611f185780601f10611eed57610100808354040283529160200191611f18565b820191906000526020600020905b815481529060010190602001808311611efb57829003601f168201915b5050505050905090565b611f2a6129b3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8f90614899565b60405180910390fd5b8060056000611fa56129b3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120526129b3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612097919061479c565b60405180910390a35050565b6120ab6129b3565b73ffffffffffffffffffffffffffffffffffffffff166120c9611da0565b73ffffffffffffffffffffffffffffffffffffffff161461211f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211690614a79565b60405180910390fd5b80600d8190555050565b61213a6121346129b3565b83612ab6565b612179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217090614b19565b60405180910390fd5b6121858484848461300c565b50505050565b606061219682612947565b6121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90614ab9565b60405180910390fd5b60006121df613068565b905060008151116121ff576040518060200160405280600081525061222a565b80612209846130fa565b60405160200161221a929190614681565b6040516020818303038152906040525b915050919050565b60145481565b601081565b60135481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122df6129b3565b73ffffffffffffffffffffffffffffffffffffffff166122fd611da0565b73ffffffffffffffffffffffffffffffffffffffff1614612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a90614a79565b60405180910390fd5b600060145414612398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238f90614959565b60405180910390fd5b600060135414156123de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d590614af9565b60405180910390fd5b600d5460135440600190046123f39190614f5a565b60148190555060ff601354436124099190614d6a565b111561243557600d5460014361241f9190614d6a565b406001900461242e9190614f5a565b6014819055505b600060145414156124495760016014819055505b565b601060019054906101000a900460ff1681565b6124666129b3565b73ffffffffffffffffffffffffffffffffffffffff16612484611da0565b73ffffffffffffffffffffffffffffffffffffffff16146124da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d190614a79565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b61250e6129b3565b73ffffffffffffffffffffffffffffffffffffffff1661252c611da0565b73ffffffffffffffffffffffffffffffffffffffff1614612582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257990614a79565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e990614839565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6126ba6129b3565b73ffffffffffffffffffffffffffffffffffffffff166126d8611da0565b73ffffffffffffffffffffffffffffffffffffffff161461272e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272590614a79565b60405180910390fd5b80600f8190555050565b601060019054906101000a900460ff16612787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277e906149f9565b60405180910390fd5b60108111156127cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c290614b79565b60405180910390fd5b600d54816127d761124d565b6127e19190614c89565b1115612822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281990614a39565b60405180910390fd5b3481600f546128319190614d10565b1115612872576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612869906148d9565b60405180910390fd5b60005b818110156128c9576000600161288b600c612a74565b6128959190614c89565b9050600d5481116128b5576128aa3382612a82565b6128b4600c612aa0565b5b5080806128c190614f11565b915050612875565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612940575061293f8261327a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a2e83611915565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b612a9c82826040518060200160405280600081525061335c565b5050565b6001816000016000828254019250508190555050565b6000612ac182612947565b612b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af790614939565b60405180910390fd5b6000612b0b83611915565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b7a57508373ffffffffffffffffffffffffffffffffffffffff16612b6284610ae9565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b8b5750612b8a8185612243565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bb482611915565b73ffffffffffffffffffffffffffffffffffffffff1614612c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0190614a99565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7190614879565b60405180910390fd5b612c858383836133b7565b612c906000826129bb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ce09190614d6a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d379190614c89565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b803073ffffffffffffffffffffffffffffffffffffffff16311015612e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4190614919565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612e70906146a5565b60006040518083038185875af1925050503d8060008114612ead576040519150601f19603f3d011682016040523d82523d6000602084013e612eb2565b606091505b5050905080612ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eed906148f9565b60405180910390fd5b505050565b6000612f0682611915565b9050612f14816000846133b7565b612f1f6000836129bb565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f6f9190614d6a565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b613017848484612b94565b613023848484846133c7565b613062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305990614819565b60405180910390fd5b50505050565b60606011805461307790614eae565b80601f01602080910402602001604051908101604052809291908181526020018280546130a390614eae565b80156130f05780601f106130c5576101008083540402835291602001916130f0565b820191906000526020600020905b8154815290600101906020018083116130d357829003601f168201915b5050505050905090565b60606000821415613142576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613275565b600082905060005b6000821461317457808061315d90614f11565b915050600a8261316d9190614cdf565b915061314a565b60008167ffffffffffffffff8111156131905761318f615076565b5b6040519080825280601f01601f1916602001820160405280156131c25781602001600182028036833780820191505090505b5090505b6000851461326e576001826131db9190614d6a565b9150600a856131ea9190614f5a565b60306131f69190614c89565b7f01000000000000000000000000000000000000000000000000000000000000000281838151811061322b5761322a615047565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132679190614cdf565b94506131c6565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061334557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613355575061335482613596565b5b9050919050565b6133668383613600565b61337360008484846133c7565b6133b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a990614819565b60405180910390fd5b505050565b6133c28383836137ce565b505050565b60006133e88473ffffffffffffffffffffffffffffffffffffffff166138e2565b15613589578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134116129b3565b8786866040518563ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161344f94939291906146fe565b602060405180830381600087803b15801561346957600080fd5b505af192505050801561349a57506040513d601f19601f820116820180604052508101906134979190614006565b60015b61351d573d80600081146134ca576040519150601f19603f3d011682016040523d82523d6000602084013e6134cf565b606091505b50600081511415613515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350c90614819565b60405180910390fd5b805181602001fd5b63150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061358e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366790614a19565b60405180910390fd5b61367981612947565b156136b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b090614859565b60405180910390fd5b6136c5600083836133b7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137159190614c89565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6137d98383836138f5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561381c57613817816138fa565b61385b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461385a576138598382613943565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561389e5761389981613ab0565b6138dd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146138dc576138db8282613b81565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161395084611ae1565b61395a9190614d6a565b9050600060076000848152602001908152602001600020549050818114613a3f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613ac49190614d6a565b9050600060096000848152602001908152602001600020549050600060088381548110613af457613af3615047565b5b906000526020600020015490508060088381548110613b1657613b15615047565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613b6557613b64615018565b5b6001900381819060005260206000200160009055905550505050565b6000613b8c83611ae1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613c0c90614eae565b90600052602060002090601f016020900481019282613c2e5760008555613c75565b82601f10613c4757805160ff1916838001178555613c75565b82800160010185558215613c75579182015b82811115613c74578251825591602001919060010190613c59565b5b509050613c829190613c86565b5090565b5b80821115613c9f576000816000905550600101613c87565b5090565b6000613cb6613cb184614bd9565b614bb4565b905082815260208101848484011115613cd257613cd16150aa565b5b613cdd848285614e6c565b509392505050565b6000613cf8613cf384614c0a565b614bb4565b905082815260208101848484011115613d1457613d136150aa565b5b613d1f848285614e6c565b509392505050565b600081359050613d36816158b9565b92915050565b600081359050613d4b816158d0565b92915050565b600081359050613d60816158e7565b92915050565b600081359050613d75816158fe565b92915050565b600081519050613d8a816158fe565b92915050565b600082601f830112613da557613da46150a5565b5b8135613db5848260208601613ca3565b91505092915050565b600082601f830112613dd357613dd26150a5565b5b8135613de3848260208601613ce5565b91505092915050565b600081359050613dfb81615915565b92915050565b600081519050613e1081615915565b92915050565b600060208284031215613e2c57613e2b6150b4565b5b6000613e3a84828501613d27565b91505092915050565b60008060408385031215613e5a57613e596150b4565b5b6000613e6885828601613d27565b9250506020613e7985828601613d27565b9150509250929050565b600080600060608486031215613e9c57613e9b6150b4565b5b6000613eaa86828701613d27565b9350506020613ebb86828701613d27565b9250506040613ecc86828701613dec565b9150509250925092565b60008060008060808587031215613ef057613eef6150b4565b5b6000613efe87828801613d27565b9450506020613f0f87828801613d27565b9350506040613f2087828801613dec565b925050606085013567ffffffffffffffff811115613f4157613f406150af565b5b613f4d87828801613d90565b91505092959194509250565b60008060408385031215613f7057613f6f6150b4565b5b6000613f7e85828601613d27565b9250506020613f8f85828601613d51565b9150509250929050565b60008060408385031215613fb057613faf6150b4565b5b6000613fbe85828601613d27565b9250506020613fcf85828601613dec565b9150509250929050565b600060208284031215613fef57613fee6150b4565b5b6000613ffd84828501613d66565b91505092915050565b60006020828403121561401c5761401b6150b4565b5b600061402a84828501613d7b565b91505092915050565b600060208284031215614049576140486150b4565b5b600082013567ffffffffffffffff811115614067576140666150af565b5b61407384828501613dbe565b91505092915050565b600060208284031215614092576140916150b4565b5b60006140a084828501613dec565b91505092915050565b6000602082840312156140bf576140be6150b4565b5b60006140cd84828501613e01565b91505092915050565b600080604083850312156140ed576140ec6150b4565b5b60006140fb85828601613dec565b925050602061410c85828601613d27565b9150509250929050565b6000806040838503121561412d5761412c6150b4565b5b600061413b85828601613dec565b925050602061414c85828601613d3c565b9150509250929050565b61415f81614e24565b82525050565b61416e81614d9e565b82525050565b61417d81614dc2565b82525050565b600061418e82614c3b565b6141988185614c51565b93506141a8818560208601614e7b565b6141b1816150b9565b840191505092915050565b6141c581614e36565b82525050565b60006141d682614c46565b6141e08185614c6d565b93506141f0818560208601614e7b565b6141f9816150b9565b840191505092915050565b600061420f82614c46565b6142198185614c7e565b9350614229818560208601614e7b565b80840191505092915050565b6000614242603783614c6d565b915061424d826150ca565b604082019050919050565b6000614265602b83614c6d565b915061427082615119565b604082019050919050565b6000614288603283614c6d565b915061429382615168565b604082019050919050565b60006142ab602683614c6d565b91506142b6826151b7565b604082019050919050565b60006142ce601c83614c6d565b91506142d982615206565b602082019050919050565b60006142f1602483614c6d565b91506142fc8261522f565b604082019050919050565b6000614314601983614c6d565b915061431f8261527e565b602082019050919050565b6000614337601483614c6d565b9150614342826152a7565b602082019050919050565b600061435a601f83614c6d565b9150614365826152d0565b602082019050919050565b600061437d603a83614c6d565b9150614388826152f9565b604082019050919050565b60006143a0601d83614c6d565b91506143ab82615348565b602082019050919050565b60006143c3602c83614c6d565b91506143ce82615371565b604082019050919050565b60006143e6601d83614c6d565b91506143f1826153c0565b602082019050919050565b6000614409603883614c6d565b9150614414826153e9565b604082019050919050565b600061442c603683614c6d565b915061443782615438565b604082019050919050565b600061444f602a83614c6d565b915061445a82615487565b604082019050919050565b6000614472602983614c6d565b915061447d826154d6565b604082019050919050565b6000614495602483614c6d565b91506144a082615525565b604082019050919050565b60006144b8602083614c6d565b91506144c382615574565b602082019050919050565b60006144db602883614c6d565b91506144e68261559d565b604082019050919050565b60006144fe602c83614c6d565b9150614509826155ec565b604082019050919050565b6000614521602083614c6d565b915061452c8261563b565b602082019050919050565b6000614544602983614c6d565b915061454f82615664565b604082019050919050565b6000614567602f83614c6d565b9150614572826156b3565b604082019050919050565b600061458a602183614c6d565b915061459582615702565b604082019050919050565b60006145ad602083614c6d565b91506145b882615751565b602082019050919050565b60006145d0600083614c62565b91506145db8261577a565b600082019050919050565b60006145f3603183614c6d565b91506145fe8261577d565b604082019050919050565b6000614616602c83614c6d565b9150614621826157cc565b604082019050919050565b6000614639603083614c6d565b91506146448261581b565b604082019050919050565b600061465c602783614c6d565b91506146678261586a565b604082019050919050565b61467b81614e1a565b82525050565b600061468d8285614204565b91506146998284614204565b91508190509392505050565b60006146b0826145c3565b9150819050919050565b60006020820190506146cf6000830184614165565b92915050565b60006040820190506146ea6000830185614156565b6146f76020830184614672565b9392505050565b60006080820190506147136000830187614165565b6147206020830186614165565b61472d6040830185614672565b818103606083015261473f8184614183565b905095945050505050565b600060408201905061475f6000830185614165565b61476c60208301846141bc565b9392505050565b60006040820190506147886000830185614165565b6147956020830184614672565b9392505050565b60006020820190506147b16000830184614174565b92915050565b600060208201905081810360008301526147d181846141cb565b905092915050565b600060208201905081810360008301526147f281614235565b9050919050565b6000602082019050818103600083015261481281614258565b9050919050565b600060208201905081810360008301526148328161427b565b9050919050565b600060208201905081810360008301526148528161429e565b9050919050565b60006020820190508181036000830152614872816142c1565b9050919050565b60006020820190508181036000830152614892816142e4565b9050919050565b600060208201905081810360008301526148b281614307565b9050919050565b600060208201905081810360008301526148d28161432a565b9050919050565b600060208201905081810360008301526148f28161434d565b9050919050565b6000602082019050818103600083015261491281614370565b9050919050565b6000602082019050818103600083015261493281614393565b9050919050565b60006020820190508181036000830152614952816143b6565b9050919050565b60006020820190508181036000830152614972816143d9565b9050919050565b60006020820190508181036000830152614992816143fc565b9050919050565b600060208201905081810360008301526149b28161441f565b9050919050565b600060208201905081810360008301526149d281614442565b9050919050565b600060208201905081810360008301526149f281614465565b9050919050565b60006020820190508181036000830152614a1281614488565b9050919050565b60006020820190508181036000830152614a32816144ab565b9050919050565b60006020820190508181036000830152614a52816144ce565b9050919050565b60006020820190508181036000830152614a72816144f1565b9050919050565b60006020820190508181036000830152614a9281614514565b9050919050565b60006020820190508181036000830152614ab281614537565b9050919050565b60006020820190508181036000830152614ad28161455a565b9050919050565b60006020820190508181036000830152614af28161457d565b9050919050565b60006020820190508181036000830152614b12816145a0565b9050919050565b60006020820190508181036000830152614b32816145e6565b9050919050565b60006020820190508181036000830152614b5281614609565b9050919050565b60006020820190508181036000830152614b728161462c565b9050919050565b60006020820190508181036000830152614b928161464f565b9050919050565b6000602082019050614bae6000830184614672565b92915050565b6000614bbe614bcf565b9050614bca8282614ee0565b919050565b6000604051905090565b600067ffffffffffffffff821115614bf457614bf3615076565b5b614bfd826150b9565b9050602081019050919050565b600067ffffffffffffffff821115614c2557614c24615076565b5b614c2e826150b9565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c9482614e1a565b9150614c9f83614e1a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cd457614cd3614f8b565b5b828201905092915050565b6000614cea82614e1a565b9150614cf583614e1a565b925082614d0557614d04614fba565b5b828204905092915050565b6000614d1b82614e1a565b9150614d2683614e1a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d5f57614d5e614f8b565b5b828202905092915050565b6000614d7582614e1a565b9150614d8083614e1a565b925082821015614d9357614d92614f8b565b5b828203905092915050565b6000614da982614dfa565b9050919050565b6000614dbb82614dfa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614e2f82614e48565b9050919050565b6000614e4182614e1a565b9050919050565b6000614e5382614e5a565b9050919050565b6000614e6582614dfa565b9050919050565b82818337600083830152505050565b60005b83811015614e99578082015181840152602081019050614e7e565b83811115614ea8576000848401525b50505050565b60006002820490506001821680614ec657607f821691505b60208210811415614eda57614ed9614fe9565b5b50919050565b614ee9826150b9565b810181811067ffffffffffffffff82111715614f0857614f07615076565b5b80604052505050565b6000614f1c82614e1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f4f57614f4e614f8b565b5b600182019050919050565b6000614f6582614e1a565b9150614f7083614e1a565b925082614f8057614f7f614fba565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f596f7520646f206e6f74206861766520656e6f7567682070617373657320746f60008201527f206d696e74207468657365206d616e7920746f6b656e73000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f5072652d73616c65206d7573742062652061637469766520746f206d696e742060008201527f544f52204e465473207573696e67207469636b65747300000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420544f522060008201527f4e46547300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f507572636861736520776f756c6420657863656564206d617820617661696c6160008201527f626c65204e465473000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f596f752063616e206f6e6c79206d696e7420313620544f52204e46547320617460008201527f20612074696d6500000000000000000000000000000000000000000000000000602082015250565b6158c281614d9e565b81146158cd57600080fd5b50565b6158d981614db0565b81146158e457600080fd5b50565b6158f081614dc2565b81146158fb57600080fd5b50565b61590781614dce565b811461591257600080fd5b50565b61591e81614e1a565b811461592957600080fd5b5056fea2646970667358221220ac2b2620f90f5e3bf6584146dc8df8105b8b0faebf9733ff0b28179243b653d164736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000021340000000000000000000000002f7445cf648fd1d4d299e4bd0a550df697de055b000000000000000000000000000000000000000000000000000000000000000b546f6f6c734f66526f636b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003544f520000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): ToolsOfRock
Arg [1] : symbol (string): TOR
Arg [2] : maxTorSupply (uint256): 8500
Arg [3] : mintTicketContractAddress (address): 0x2f7445CF648Fd1D4d299E4BD0a550df697De055B
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002134
Arg [3] : 0000000000000000000000002f7445cf648fd1d4d299e4bd0a550df697de055b
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [5] : 546f6f6c734f66526f636b000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 544f520000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ 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.