Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
78 NANOKO
Holders
33
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 NANOKOLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Nanoko
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-15 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: Contract test/ERC721T/IERC721Batch.sol pragma solidity ^0.8.0; interface IERC721Batch { function isOwnerOf( address account, uint[] calldata tokenIds ) external view returns( bool ); function transferBatch( address from, address to, uint[] calldata tokenIds, bytes calldata data ) external; function walletOfOwner( address account ) external view returns( uint[] memory ); } // File: Contract test/ERC721T/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: Contract test/ERC721T/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: Contract test/ERC721T/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: Contract test/ERC721T/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: Contract test/ERC721T/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: Contract test/ERC721T/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 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); } // File: Contract test/ERC721T/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: Contract test/ERC721T/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: Contract test/ERC721T/ERC721T.sol pragma solidity ^0.8.0; /**************************************** * @author: squeebo_nft * * @team: GoldenX * **************************************** * Blimpie-ERC721 provides low-gas * * mints + transfers * ****************************************/ abstract contract ERC721T is Context, ERC165, IERC721, IERC721Metadata { using Address for address; string private _name; string private _symbol; mapping(uint => address) internal _tokenApprovals; mapping(address => mapping(address => bool)) internal _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } //public function balanceOf(address owner) public view virtual override returns( uint ); function name() external view virtual override returns (string memory) { return _name; } function ownerOf(uint tokenId) public view virtual override returns (address); function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } function symbol() external view virtual override returns (string memory) { return _symbol; } /* function totalSupply() public view virtual returns (uint) { return _owners.length - (_offset + _burned); } */ function approve(address to, uint tokenId) external virtual override { address owner = 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); } function getApproved(uint tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } function setApprovalForAll(address operator, bool approved) external virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } function transferFrom( address from, address to, uint 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); } function safeTransferFrom( address from, address to, uint tokenId ) external virtual override { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom( address from, address to, uint tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } //internal function _approve(address to, uint tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } function _checkOnERC721Received( address from, address to, uint tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function _exists(uint tokenId) internal view virtual returns (bool); function _isApprovedOrOwner(address spender, uint tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _safeTransfer( address from, address to, uint tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } function _transfer(address from, address to, uint tokenId) internal virtual; } // File: Contract test/ERC721T/ERC721EnumerableT.sol pragma solidity ^0.8.0; /**************************************** * @author: squeebo_nft * **************************************** * Blimpie-ERC721 provides low-gas * * mints + transfers * ****************************************/ abstract contract ERC721EnumerableT is ERC721T, IERC721Batch, IERC721Enumerable { function balanceOf( address owner ) public view virtual override( IERC721, ERC721T ) returns( uint ); function isOwnerOf( address account, uint[] calldata tokenIds ) external view virtual override returns( bool ); function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721T) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } function tokenOfOwnerByIndex(address owner, uint index) public view virtual override returns( uint tokenId ); function tokenByIndex(uint index) external view virtual override returns (uint) { require(index < totalSupply(), "ERC721Enumerable: global index out of bounds"); return index; } function totalSupply() public view virtual override returns( uint ); function transferBatch( address from, address to, uint[] calldata tokenIds, bytes calldata data ) external override{ for(uint i; i < tokenIds.length; ++i ){ safeTransferFrom( from, to, tokenIds[i], data ); } } function walletOfOwner( address account ) external view virtual override returns( uint[] memory ){ uint quantity = balanceOf( account ); uint[] memory wallet = new uint[]( quantity ); for( uint i; i < quantity; ++i ){ wallet[i] = tokenOfOwnerByIndex( account, i ); } return wallet; } } // File: Contract test/ERC721T/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Contract test/ERC721T/Delegated.sol pragma solidity ^0.8.0; /*********************** * @author: squeebo_nft * ************************/ contract Delegated is Ownable { mapping(address => bool) internal _delegates; constructor(){ _delegates[owner()] = true; } modifier onlyDelegates { require(_delegates[msg.sender], "Invalid delegate" ); _; } //onlyOwner function isDelegate( address addr ) external view onlyOwner returns ( bool ){ return _delegates[addr]; } function setDelegate( address addr, bool isDelegate_ ) external onlyOwner{ _delegates[addr] = isDelegate_; } function transferOwnership(address newOwner) public virtual override onlyOwner { _delegates[newOwner] = true; super.transferOwnership( newOwner ); } } // File: Contract test/ERC721T/Nanoko.sol pragma solidity ^0.8.0; /**************************************** * TOS-ERC721 provides low-gas * * mints + transfers * ****************************************/ contract Nanoko is ERC721EnumerableT, Delegated, ReentrancyGuard { using Strings for uint; bool public revealed = false; string public notRevealedUri = ""; uint public MAX_SUPPLY = 7777; uint public PRICE = 0.1 ether; uint public MAX_QTY = 5; // Max mint amount per wallet address[] public nanokos; bool public isMintActive = false; bool public isWhitelistMintActive = false; mapping(address => uint) public whitelistCount; mapping(address => uint) private _balances; mapping(address => uint) public mintCount; mapping(address => bool) public isOG; string private _tokenURIPrefix; string private _tokenURISuffix = ".json"; constructor() ERC721T("Nanokoverse", "NANOKO"){ } //------------------------------------------------------------------------------------------- // View Parts /** * @dev Returns the number of tokens in ``owners``'s account. */ function balanceOf(address account) public view override returns (uint) { require(account != address(0), "Nanoko: balance query for the zero address"); return _balances[account]; } /** * @dev Returns the bool of tokens if``owner``'s account contains the tokenIds. */ function isOwnerOf( address account, uint[] calldata tokenIds ) external view override returns( bool ){ for(uint i; i < tokenIds.length; ++i ){ if( nanokos[ tokenIds[i] ] != account ) return false; } return true; } /** * @dev Returns the owner of the `tokenId` token. */ function ownerOf( uint tokenId ) public override view returns( address owner_ ){ address owner = nanokos[tokenId]; require(owner != address(0), "Nanoko: query for nonexistent token"); return owner; } /** * @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(uint index) external view override returns (uint index_) { require(index < totalSupply(), "Nanoko: global index out of bounds"); return index; } /** * @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, uint index) public view override returns (uint tokenId_) { uint count; for(uint i; i < nanokos.length; ++i){ if(owner == nanokos[i]){ if( count == index ) return i; else ++count; } } revert("ERC721Enumerable: owner index out of bounds"); } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint tokenId) external view override returns (string memory) { require(_exists(tokenId), "Nanoko: URI query for nonexistent token"); if(revealed == false) { return notRevealedUri; } return string(abi.encodePacked(_tokenURIPrefix, tokenId.toString(), _tokenURISuffix)); } /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() public view override returns( uint totalSupply_ ){ return nanokos.length; } /** * @dev Returns the list of tokenIds stored by the owner's account. */ function walletOfOwner( address account ) external view override returns( uint[] memory ){ uint quantity = balanceOf( account ); uint[] memory wallet = new uint[]( quantity ); for( uint i; i < quantity; ++i ){ wallet[i] = tokenOfOwnerByIndex( account, i ); } return wallet; } /** * @dev Returns the balance amount of the Contract address. */ function getBalanceOfContract() external view returns (uint256) { return address(this).balance; } //------------------------------------------------------------------------------------------- // Mint Part /** * @dev mints token based on the number of qty specified. */ function mint( uint quantity ) external payable nonReentrant { require(isMintActive, "Nanoko: Minting needs to be enabled"); require(quantity + mintCount[msg.sender] <= MAX_QTY, "Nanoko: You can't mint that much"); require (msg.value >= PRICE * quantity, "Nanoko: Ether sent is not correct"); uint supply = totalSupply(); require(supply + quantity <= MAX_SUPPLY, "Nanoko: Mint exceeds supply" ); for(uint i; i < quantity; ++i){ _mint( msg.sender, supply++ ); } mintCount[msg.sender] += quantity; } function whitelistMint(uint quantity) external payable nonReentrant { require(isWhitelistMintActive, "Nanoko: Whitelist needs to be enabled"); require(quantity <= whitelistCount[msg.sender],"Nanoko: You do not have enough whitelist access"); uint price = isOG[msg.sender] ? 0.05 ether : 0.07 ether; require (msg.value >= price * quantity, "Nanoko: Ether sent is not correct"); uint supply = totalSupply(); require(supply + quantity <= MAX_SUPPLY, "Nanoko: Mint exceeds supply" ); for(uint i; i < quantity; ++i){ _mint( msg.sender, supply++ ); } whitelistCount[msg.sender] -= quantity; } //------------------------------------------------------------------------------------------- // OnlyOwner/Delegate Parts /** * @dev Withdraws an amount from the contract balance. */ function withdrawAll() public onlyOwner { // This will payout the owner 100% of the contract balance. // Do not remove this otherwise you will not be able to withdraw the funds. // ============================================================================= uint amount = address(this).balance; payable(0xa2800c3D21948e22315e573B8Ec582606CbfC8E0).call{value: amount / 100 * 23}(""); payable(0x0ed819ccaECFc5527B606f00fD3c3b640146977d).call{value: amount / 100 * 36}(""); payable(0x2e8931A6A02eC56eEf941E29bb0b5121dE3FA128).call{value: amount / 200 * 71}(""); payable(0x3744D9468F991E110A16BE720484FE53c7fe9b73).call{value: amount / 200 * 11}(""); // require(os); // ============================================================================= }// /** * @dev Allows team to mint the token without restriction. */ function teamMint(uint[] calldata quantity, address[] calldata recipient) external onlyOwner{ require(quantity.length == recipient.length, "Nanoko: Must provide equal quantities and recipients" ); uint totalQuantity; uint supply = nanokos.length; for(uint i; i < quantity.length; ++i){ totalQuantity += quantity[i]; } require( supply + totalQuantity < MAX_SUPPLY, "Nanoko: Mint/order exceeds supply" ); for(uint i; i < recipient.length; ++i){ for(uint j; j < quantity[i]; ++j){ uint tokenId = supply++; _mint( recipient[i], tokenId); } } } /** * @dev Owner/Delegate sets holder list and access list. */ function setWhitelistCount(address[] calldata accounts, uint[] calldata quantities) external onlyOwner{ require(accounts.length == quantities.length); for(uint i; i < accounts.length; ++i){ whitelistCount[ accounts[i] ] = quantities[i]; } } function setOGList(address[] calldata accounts) external onlyOwner{ for(uint i; i < accounts.length; ++i){ isOG[ accounts[i] ] = true; } } /** * @dev Owner sets the Staking contract address. */ function flipRevealState() external onlyDelegates { revealed = !revealed; } /** * @dev Owner sets the Staking contract address. */ function setUnrevealURI(string calldata notRevealUri_) external onlyDelegates { notRevealedUri = notRevealUri_; } /** * @dev Owner/Delegate flip the Minting flag. */ function flipMintState() external onlyDelegates { isMintActive = !isMintActive; } function flipWhitelistState() external onlyDelegates{ isWhitelistMintActive = !isWhitelistMintActive; } /** * @dev Owner/Delegates sets the BaseURI of IPFS. */ function setBaseURI(string calldata prefix, string calldata suffix) external onlyDelegates{ _tokenURIPrefix = prefix; _tokenURISuffix = suffix; } //------------------------------------------------------------------------------------------- // Internal Parts /** * @dev increment and decrement balances based on address from and to. */ function _beforeTokenTransfer(address from, address to) internal { if( from != address(0) ) --_balances[ from ]; if( to != address(0) ) ++_balances[ to ]; } /** * @dev returns bool if the tokenId exist. */ function _exists(uint tokenId) internal view override returns (bool) { return tokenId < nanokos.length && nanokos[tokenId] != address(0); } /** * @dev mints token based address and tokenId */ function _mint(address to, uint tokenId) internal { _beforeTokenTransfer(address(0), to); nanokos.push(to); emit Transfer(address(0), to, tokenId); } /** * @dev transfer tokenId to other address. */ function _transfer(address from, address to, uint tokenId) internal override { require(nanokos[tokenId] == from, "Nanoko: transfer of token that is not owned"); // Clear approvals from the previous owner _approve(address(0), tokenId); _beforeTokenTransfer(from, to); nanokos[tokenId] = to; emit Transfer(from, to, tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_QTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipRevealState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistState","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":[],"name":"getBalanceOfContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOG","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nanokos","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"},{"internalType":"string","name":"suffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"setOGList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"notRevealUri_","type":"string"}],"name":"setUnrevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"setWhitelistCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"index_","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":"tokenId_","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":"totalSupply_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferBatch","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6007805460ff1916905560a06040819052600060808190526200002591600891620001ac565b50611e6160095567016345785d8a0000600a556005600b819055600d805461ffff191690556040805180820190915281815264173539b7b760d91b6020909101908152620000779160139190620001ac565b503480156200008557600080fd5b50604080518082018252600b81526a4e616e6f6b6f766572736560a81b6020808301918252835180850190945260068452654e414e4f4b4f60d01b908401528151919291620000d791600091620001ac565b508051620000ed906001906020840190620001ac565b5050506200010a620001046200015660201b60201c565b6200015a565b600160056000620001236004546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560016006556200028f565b3390565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ba9062000252565b90600052602060002090601f016020900481019282620001de576000855562000229565b82601f10620001f957805160ff191683800117855562000229565b8280016001018555821562000229579182015b82811115620002295782518255916020019190600101906200020c565b50620002379291506200023b565b5090565b5b808211156200023757600081556001016200023c565b600181811c908216806200026757607f821691505b602082108114156200028957634e487b7160e01b600052602260045260246000fd5b50919050565b61374f806200029f6000396000f3fe6080604052600436106103085760003560e01c80636790a9de1161019a578063a22cb465116100e1578063e985e9c51161008a578063f6fa26ab11610064578063f6fa26ab14610888578063fa72de451461089d578063fabd1d2d146108bd57600080fd5b8063e985e9c5146107f2578063ed9ec8881461083b578063f2fde38b1461086857600080fd5b8063c83271f5116100bb578063c83271f514610775578063c87b56dd146107a5578063def87272146107c557600080fd5b8063a22cb46514610715578063b534a5c414610735578063b88d4fde1461075557600080fd5b80638d859f3e1161014357806397bc411c1161011d57806397bc411c146106c25780639a882570146106e2578063a0712d681461070257600080fd5b80638d859f3e146106795780638da5cb5b1461068f57806395d89b41146106ad57600080fd5b806372b0f6261161017457806372b0f62614610631578063853828b614610651578063868ff4a21461066657600080fd5b80636790a9de146105dc57806370a08231146105fc578063715018a61461061c57600080fd5b80632714ce921161025e5780634d44660c1161020757806359c74f29116101e157806359c74f291461058d5780635b92ac0d146105a25780636352211e146105bc57600080fd5b80634d44660c146105335780634f6ccce714610553578063518302271461057357600080fd5b806342842e0e1161023857806342842e0e146104c6578063438b6300146104e65780634a994eef1461051357600080fd5b80632714ce921461047b5780632f745c591461049057806332cb6b0c146104b057600080fd5b8063095ea7b3116102c0578063229688851161029a578063229688851461042857806323b872dd1461043b5780632533c7cd1461045b57600080fd5b8063095ea7b3146103d157806318160ddd146103f35780631c96cae91461041257600080fd5b806307779627116102f15780630777962714610364578063081812fc14610384578063081c8c44146103bc57600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004613201565b6108dc565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b50610357610938565b604051610339919061349a565b34801561037057600080fd5b5061032d61037f366004612e85565b6109ca565b34801561039057600080fd5b506103a461039f3660046132d1565b610a4f565b6040516001600160a01b039091168152602001610339565b3480156103c857600080fd5b50610357610ae8565b3480156103dd57600080fd5b506103f16103ec366004613129565b610b76565b005b3480156103ff57600080fd5b50600c545b604051908152602001610339565b34801561041e57600080fd5b50610404600b5481565b34801561043457600080fd5b5047610404565b34801561044757600080fd5b506103f1610456366004612f64565b610ca8565b34801561046757600080fd5b506103f1610476366004613195565b610d2f565b34801561048757600080fd5b506103f1610f5e565b34801561049c57600080fd5b506104046104ab366004613129565b610fd1565b3480156104bc57600080fd5b5061040460095481565b3480156104d257600080fd5b506103f16104e1366004612f64565b6110af565b3480156104f257600080fd5b50610506610501366004612e85565b6110ca565b6040516103399190613456565b34801561051f57600080fd5b506103f161052e3660046130ed565b61116a565b34801561053f57600080fd5b5061032d61054e36600461309a565b6111ef565b34801561055f57600080fd5b5061040461056e3660046132d1565b611271565b34801561057f57600080fd5b5060075461032d9060ff1681565b34801561059957600080fd5b506103f16112f4565b3480156105ae57600080fd5b50600d5461032d9060ff1681565b3480156105c857600080fd5b506103a46105d73660046132d1565b611367565b3480156105e857600080fd5b506103f16105f7366004613271565b611407565b34801561060857600080fd5b50610404610617366004612e85565b611486565b34801561062857600080fd5b506103f1611520565b34801561063d57600080fd5b506103f161064c366004613195565b611586565b34801561065d57600080fd5b506103f1611665565b6103f16106743660046132d1565b611885565b34801561068557600080fd5b50610404600a5481565b34801561069b57600080fd5b506004546001600160a01b03166103a4565b3480156106b957600080fd5b50610357611b5e565b3480156106ce57600080fd5b506103f16106dd36600461323b565b611b6d565b3480156106ee57600080fd5b506103f16106fd366004613153565b611bd8565b6103f16107103660046132d1565b611ca2565b34801561072157600080fd5b506103f16107303660046130ed565b611f20565b34801561074157600080fd5b506103f1610750366004612ed3565b611fe5565b34801561076157600080fd5b506103f1610770366004612fa0565b61205a565b34801561078157600080fd5b5061032d610790366004612e85565b60116020526000908152604090205460ff1681565b3480156107b157600080fd5b506103576107c03660046132d1565b6120e2565b3480156107d157600080fd5b506104046107e0366004612e85565b600e6020526000908152604090205481565b3480156107fe57600080fd5b5061032d61080d366004612ea0565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b34801561084757600080fd5b50610404610856366004612e85565b60106020526000908152604090205481565b34801561087457600080fd5b506103f1610883366004612e85565b612230565b34801561089457600080fd5b506103f16122b9565b3480156108a957600080fd5b506103a46108b83660046132d1565b612352565b3480156108c957600080fd5b50600d5461032d90610100900460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061093257506109328261237c565b92915050565b6060600080546109479061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546109739061358e565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b6004546000906001600160a01b03163314610a2c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b506001600160a01b03811660009081526005602052604090205460ff165b919050565b6000610a5a8261245f565b610acc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a23565b506000908152600260205260409020546001600160a01b031690565b60088054610af59061358e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b219061358e565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b505050505081565b6000610b8182611367565b9050806001600160a01b0316836001600160a01b03161415610c0b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b336001600160a01b0382161480610c275750610c27813361080d565b610c995760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a23565b610ca383836124a9565b505050565b610cb2338261252f565b610d245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a23565b610ca383838361262a565b6004546001600160a01b03163314610d895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b828114610dfe5760405162461bcd60e51b815260206004820152603460248201527f4e616e6f6b6f3a204d7573742070726f7669646520657175616c207175616e7460448201527f697469657320616e6420726563697069656e74730000000000000000000000006064820152608401610a23565b600c54600090815b85811015610e4457868682818110610e2057610e2061368d565b9050602002013583610e3291906134ad565b9250610e3d816135e2565b9050610e06565b50600954610e5283836134ad565b10610ec55760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a204d696e742f6f72646572206578636565647320737570706c60448201527f79000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b60005b83811015610f555760005b878783818110610ee557610ee561368d565b90506020020135811015610f4457600083610eff816135e2565b94509050610f33878785818110610f1857610f1861368d565b9050602002016020810190610f2d9190612e85565b8261276a565b50610f3d816135e2565b9050610ed3565b50610f4e816135e2565b9050610ec8565b50505050505050565b3360009081526005602052604090205460ff16610fbd5760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b6007805460ff19811660ff90911615179055565b60008060005b600c5481101561104057600c8181548110610ff457610ff461368d565b6000918252602090912001546001600160a01b038681169116141561103057838214156110245791506109329050565b61102d826135e2565b91505b611039816135e2565b9050610fd7565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a23565b610ca38383836040518060200160405280600081525061205a565b606060006110d783611486565b905060008167ffffffffffffffff8111156110f4576110f46136bc565b60405190808252806020026020018201604052801561111d578160200160208202803683370190505b50905060005b82811015611162576111358582610fd1565b8282815181106111475761114761368d565b602090810291909101015261115b816135e2565b9050611123565b509392505050565b6004546001600160a01b031633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6000805b8281101561126457846001600160a01b0316600c8585848181106112195761121961368d565b90506020020135815481106112305761123061368d565b6000918252602090912001546001600160a01b03161461125457600091505061126a565b61125d816135e2565b90506111f3565b50600190505b9392505050565b600061127c600c5490565b82106112f05760405162461bcd60e51b815260206004820152602260248201527f4e616e6f6b6f3a20676c6f62616c20696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b5090565b3360009081526005602052604090205460ff166113535760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b600d805460ff19811660ff90911615179055565b600080600c838154811061137d5761137d61368d565b6000918252602090912001546001600160a01b03169050806109325760405162461bcd60e51b815260206004820152602360248201527f4e616e6f6b6f3a20717565727920666f72206e6f6e6578697374656e7420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610a23565b3360009081526005602052604090205460ff166114665760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b61147260128585612d50565b5061147f60138383612d50565b5050505050565b60006001600160a01b0382166115045760405162461bcd60e51b815260206004820152602a60248201527f4e616e6f6b6f3a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a23565b506001600160a01b03166000908152600f602052604090205490565b6004546001600160a01b0316331461157a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6115846000612809565b565b6004546001600160a01b031633146115e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b8281146115ec57600080fd5b60005b8381101561147f578282828181106116095761160961368d565b90506020020135600e60008787858181106116265761162661368d565b905060200201602081019061163b9190612e85565b6001600160a01b0316815260208101919091526040016000205561165e816135e2565b90506115ef565b6004546001600160a01b031633146116bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b4773a2800c3d21948e22315e573b8ec582606cbfc8e06116e06064836134c5565b6116eb9060176134d9565b604051600081818185875af1925050503d8060008114611727576040519150601f19603f3d011682016040523d82523d6000602084013e61172c565b606091505b50730ed819ccaecfc5527b606f00fd3c3b640146977d915061175190506064836134c5565b61175c9060246134d9565b604051600081818185875af1925050503d8060008114611798576040519150601f19603f3d011682016040523d82523d6000602084013e61179d565b606091505b50732e8931a6a02ec56eef941e29bb0b5121de3fa12891506117c2905060c8836134c5565b6117cd9060476134d9565b604051600081818185875af1925050503d8060008114611809576040519150601f19603f3d011682016040523d82523d6000602084013e61180e565b606091505b50733744d9468f991e110a16be720484fe53c7fe9b739150611833905060c8836134c5565b61183e90600b6134d9565b604051600081818185875af1925050503d806000811461187a576040519150601f19603f3d011682016040523d82523d6000602084013e61187f565b606091505b50505050565b600260065414156118d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a23565b6002600655600d54610100900460ff1661195a5760405162461bcd60e51b815260206004820152602560248201527f4e616e6f6b6f3a2057686974656c697374206e6565647320746f20626520656e60448201527f61626c65640000000000000000000000000000000000000000000000000000006064820152608401610a23565b336000908152600e60205260409020548111156119df5760405162461bcd60e51b815260206004820152602f60248201527f4e616e6f6b6f3a20596f7520646f206e6f74206861766520656e6f756768207760448201527f686974656c6973742061636365737300000000000000000000000000000000006064820152608401610a23565b3360009081526011602052604081205460ff16611a035766f8b0a10e470000611a0c565b66b1a2bc2ec500005b66ffffffffffffff169050611a2182826134d9565b341015611a965760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a2045746865722073656e74206973206e6f7420636f7272656360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b6000611aa1600c5490565b600954909150611ab184836134ad565b1115611aff5760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610a23565b60005b83811015611b2f57611b1f3383611b18816135e2565b945061276a565b611b28816135e2565b9050611b02565b50336000908152600e602052604081208054859290611b4f908490613516565b90915550506001600655505050565b6060600180546109479061358e565b3360009081526005602052604090205460ff16611bcc5760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b610ca360088383612d50565b6004546001600160a01b03163314611c325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b60005b81811015610ca357600160116000858585818110611c5557611c5561368d565b9050602002016020810190611c6a9190612e85565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611c9b816135e2565b9050611c35565b60026006541415611cf55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a23565b6002600655600d5460ff16611d725760405162461bcd60e51b815260206004820152602360248201527f4e616e6f6b6f3a204d696e74696e67206e6565647320746f20626520656e616260448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610a23565b600b5433600090815260106020526040902054611d8f90836134ad565b1115611ddd5760405162461bcd60e51b815260206004820181905260248201527f4e616e6f6b6f3a20596f752063616e2774206d696e742074686174206d7563686044820152606401610a23565b80600a54611deb91906134d9565b341015611e605760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a2045746865722073656e74206973206e6f7420636f7272656360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b6000611e6b600c5490565b600954909150611e7b83836134ad565b1115611ec95760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610a23565b60005b82811015611ef257611ee23383611b18816135e2565b611eeb816135e2565b9050611ecc565b503360009081526010602052604081208054849290611f129084906134ad565b909155505060016006555050565b6001600160a01b038216331415611f795760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a23565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005b83811015610f555761204a87878787858181106120075761200761368d565b9050602002013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061205a92505050565b612053816135e2565b9050611fe8565b612064338361252f565b6120d65760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a23565b61187f84848484612873565b60606120ed8261245f565b61215f5760405162461bcd60e51b815260206004820152602760248201527f4e616e6f6b6f3a2055524920717565727920666f72206e6f6e6578697374656e60448201527f7420746f6b656e000000000000000000000000000000000000000000000000006064820152608401610a23565b60075460ff166121fb57600880546121769061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546121a29061358e565b80156121ef5780601f106121c4576101008083540402835291602001916121ef565b820191906000526020600020905b8154815290600101906020018083116121d257829003601f168201915b50505050509050919050565b6012612206836128fc565b601360405160200161221a939291906133e7565b6040516020818303038152906040529050919050565b6004546001600160a01b0316331461228a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b0381166000908152600560205260409020805460ff191660011790556122b681612a2e565b50565b3360009081526005602052604090205460ff166123185760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b600c818154811061236257600080fd5b6000918252602090912001546001600160a01b0316905081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061240f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061093257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610932565b600c5460009082108015610932575060006001600160a01b0316600c838154811061248c5761248c61368d565b6000918252602090912001546001600160a01b0316141592915050565b600081815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906124f682611367565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061253a8261245f565b6125ac5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a23565b60006125b783611367565b9050806001600160a01b0316846001600160a01b031614806125f25750836001600160a01b03166125e784610a4f565b6001600160a01b0316145b8061262257506001600160a01b0380821660009081526003602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316600c82815481106126475761264761368d565b6000918252602090912001546001600160a01b0316146126cf5760405162461bcd60e51b815260206004820152602b60248201527f4e616e6f6b6f3a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e65640000000000000000000000000000000000000000006064820152608401610a23565b6126da6000826124a9565b6126e48383612b0d565b81600c82815481106126f8576126f861368d565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b612775600083612b0d565b600c805460018101825560009182527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600480546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61287e84848461262a565b61288a84848484612b85565b61187f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a23565b60608161293c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156129665780612950816135e2565b915061295f9050600a836134c5565b9150612940565b60008167ffffffffffffffff811115612981576129816136bc565b6040519080825280601f01601f1916602001820160405280156129ab576020820181803683370190505b5090505b8415612622576129c0600183613516565b91506129cd600a8661361b565b6129d89060306134ad565b60f81b8183815181106129ed576129ed61368d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a27600a866134c5565b94506129af565b6004546001600160a01b03163314612a885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b038116612b045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a23565b6122b681612809565b6001600160a01b03821615612b47576001600160a01b0382166000908152600f602052604081208054909190612b4290613559565b909155505b6001600160a01b03811615612b81576001600160a01b0381166000908152600f602052604081208054909190612b7c906135e2565b909155505b5050565b60006001600160a01b0384163b15612d45576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612be290339089908890889060040161341a565b602060405180830381600087803b158015612bfc57600080fd5b505af1925050508015612c4a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612c479181019061321e565b60015b612cfa573d808015612c78576040519150601f19603f3d011682016040523d82523d6000602084013e612c7d565b606091505b508051612cf25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a23565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612622565b506001949350505050565b828054612d5c9061358e565b90600052602060002090601f016020900481019282612d7e5760008555612dc4565b82601f10612d975782800160ff19823516178555612dc4565b82800160010185558215612dc4579182015b82811115612dc4578235825591602001919060010190612da9565b506112f09291505b808211156112f05760008155600101612dcc565b80356001600160a01b0381168114610a4a57600080fd5b60008083601f840112612e0957600080fd5b50813567ffffffffffffffff811115612e2157600080fd5b6020830191508360208260051b8501011115612e3c57600080fd5b9250929050565b60008083601f840112612e5557600080fd5b50813567ffffffffffffffff811115612e6d57600080fd5b602083019150836020828501011115612e3c57600080fd5b600060208284031215612e9757600080fd5b61126a82612de0565b60008060408385031215612eb357600080fd5b612ebc83612de0565b9150612eca60208401612de0565b90509250929050565b60008060008060008060808789031215612eec57600080fd5b612ef587612de0565b9550612f0360208801612de0565b9450604087013567ffffffffffffffff80821115612f2057600080fd5b612f2c8a838b01612df7565b90965094506060890135915080821115612f4557600080fd5b50612f5289828a01612e43565b979a9699509497509295939492505050565b600080600060608486031215612f7957600080fd5b612f8284612de0565b9250612f9060208501612de0565b9150604084013590509250925092565b60008060008060808587031215612fb657600080fd5b612fbf85612de0565b9350612fcd60208601612de0565b925060408501359150606085013567ffffffffffffffff80821115612ff157600080fd5b818701915087601f83011261300557600080fd5b813581811115613017576130176136bc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561305d5761305d6136bc565b816040528281528a602084870101111561307657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000604084860312156130af57600080fd5b6130b884612de0565b9250602084013567ffffffffffffffff8111156130d457600080fd5b6130e086828701612df7565b9497909650939450505050565b6000806040838503121561310057600080fd5b61310983612de0565b91506020830135801515811461311e57600080fd5b809150509250929050565b6000806040838503121561313c57600080fd5b61314583612de0565b946020939093013593505050565b6000806020838503121561316657600080fd5b823567ffffffffffffffff81111561317d57600080fd5b61318985828601612df7565b90969095509350505050565b600080600080604085870312156131ab57600080fd5b843567ffffffffffffffff808211156131c357600080fd5b6131cf88838901612df7565b909650945060208701359150808211156131e857600080fd5b506131f587828801612df7565b95989497509550505050565b60006020828403121561321357600080fd5b813561126a816136eb565b60006020828403121561323057600080fd5b815161126a816136eb565b6000806020838503121561324e57600080fd5b823567ffffffffffffffff81111561326557600080fd5b61318985828601612e43565b6000806000806040858703121561328757600080fd5b843567ffffffffffffffff8082111561329f57600080fd5b6132ab88838901612e43565b909650945060208701359150808211156132c457600080fd5b506131f587828801612e43565b6000602082840312156132e357600080fd5b5035919050565b6000815180845261330281602086016020860161352d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600181811c908083168061334e57607f831692505b6020808410821415613389577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561339d57600181146133ae576133db565b60ff198616895284890196506133db565b60008881526020902060005b868110156133d35781548b8201529085019083016133ba565b505084890196505b50505050505092915050565b60006133f38286613334565b845161340381836020890161352d565b61340f81830186613334565b979650505050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261344c60808301846132ea565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561348e57835183529284019291840191600101613472565b50909695505050505050565b60208152600061126a60208301846132ea565b600082198211156134c0576134c061362f565b500190565b6000826134d4576134d461365e565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135115761351161362f565b500290565b6000828210156135285761352861362f565b500390565b60005b83811015613548578181015183820152602001613530565b8381111561187f5750506000910152565b6000816135685761356861362f565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c908216806135a257607f821691505b602082108114156135dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136145761361461362f565b5060010190565b60008261362a5761362a61365e565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146122b657600080fdfea2646970667358221220de36d23f95df564c19ef90ebb23c743f1de1a5b32fc916afbdcd1dd8b254faad64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106103085760003560e01c80636790a9de1161019a578063a22cb465116100e1578063e985e9c51161008a578063f6fa26ab11610064578063f6fa26ab14610888578063fa72de451461089d578063fabd1d2d146108bd57600080fd5b8063e985e9c5146107f2578063ed9ec8881461083b578063f2fde38b1461086857600080fd5b8063c83271f5116100bb578063c83271f514610775578063c87b56dd146107a5578063def87272146107c557600080fd5b8063a22cb46514610715578063b534a5c414610735578063b88d4fde1461075557600080fd5b80638d859f3e1161014357806397bc411c1161011d57806397bc411c146106c25780639a882570146106e2578063a0712d681461070257600080fd5b80638d859f3e146106795780638da5cb5b1461068f57806395d89b41146106ad57600080fd5b806372b0f6261161017457806372b0f62614610631578063853828b614610651578063868ff4a21461066657600080fd5b80636790a9de146105dc57806370a08231146105fc578063715018a61461061c57600080fd5b80632714ce921161025e5780634d44660c1161020757806359c74f29116101e157806359c74f291461058d5780635b92ac0d146105a25780636352211e146105bc57600080fd5b80634d44660c146105335780634f6ccce714610553578063518302271461057357600080fd5b806342842e0e1161023857806342842e0e146104c6578063438b6300146104e65780634a994eef1461051357600080fd5b80632714ce921461047b5780632f745c591461049057806332cb6b0c146104b057600080fd5b8063095ea7b3116102c0578063229688851161029a578063229688851461042857806323b872dd1461043b5780632533c7cd1461045b57600080fd5b8063095ea7b3146103d157806318160ddd146103f35780631c96cae91461041257600080fd5b806307779627116102f15780630777962714610364578063081812fc14610384578063081c8c44146103bc57600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004613201565b6108dc565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b50610357610938565b604051610339919061349a565b34801561037057600080fd5b5061032d61037f366004612e85565b6109ca565b34801561039057600080fd5b506103a461039f3660046132d1565b610a4f565b6040516001600160a01b039091168152602001610339565b3480156103c857600080fd5b50610357610ae8565b3480156103dd57600080fd5b506103f16103ec366004613129565b610b76565b005b3480156103ff57600080fd5b50600c545b604051908152602001610339565b34801561041e57600080fd5b50610404600b5481565b34801561043457600080fd5b5047610404565b34801561044757600080fd5b506103f1610456366004612f64565b610ca8565b34801561046757600080fd5b506103f1610476366004613195565b610d2f565b34801561048757600080fd5b506103f1610f5e565b34801561049c57600080fd5b506104046104ab366004613129565b610fd1565b3480156104bc57600080fd5b5061040460095481565b3480156104d257600080fd5b506103f16104e1366004612f64565b6110af565b3480156104f257600080fd5b50610506610501366004612e85565b6110ca565b6040516103399190613456565b34801561051f57600080fd5b506103f161052e3660046130ed565b61116a565b34801561053f57600080fd5b5061032d61054e36600461309a565b6111ef565b34801561055f57600080fd5b5061040461056e3660046132d1565b611271565b34801561057f57600080fd5b5060075461032d9060ff1681565b34801561059957600080fd5b506103f16112f4565b3480156105ae57600080fd5b50600d5461032d9060ff1681565b3480156105c857600080fd5b506103a46105d73660046132d1565b611367565b3480156105e857600080fd5b506103f16105f7366004613271565b611407565b34801561060857600080fd5b50610404610617366004612e85565b611486565b34801561062857600080fd5b506103f1611520565b34801561063d57600080fd5b506103f161064c366004613195565b611586565b34801561065d57600080fd5b506103f1611665565b6103f16106743660046132d1565b611885565b34801561068557600080fd5b50610404600a5481565b34801561069b57600080fd5b506004546001600160a01b03166103a4565b3480156106b957600080fd5b50610357611b5e565b3480156106ce57600080fd5b506103f16106dd36600461323b565b611b6d565b3480156106ee57600080fd5b506103f16106fd366004613153565b611bd8565b6103f16107103660046132d1565b611ca2565b34801561072157600080fd5b506103f16107303660046130ed565b611f20565b34801561074157600080fd5b506103f1610750366004612ed3565b611fe5565b34801561076157600080fd5b506103f1610770366004612fa0565b61205a565b34801561078157600080fd5b5061032d610790366004612e85565b60116020526000908152604090205460ff1681565b3480156107b157600080fd5b506103576107c03660046132d1565b6120e2565b3480156107d157600080fd5b506104046107e0366004612e85565b600e6020526000908152604090205481565b3480156107fe57600080fd5b5061032d61080d366004612ea0565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b34801561084757600080fd5b50610404610856366004612e85565b60106020526000908152604090205481565b34801561087457600080fd5b506103f1610883366004612e85565b612230565b34801561089457600080fd5b506103f16122b9565b3480156108a957600080fd5b506103a46108b83660046132d1565b612352565b3480156108c957600080fd5b50600d5461032d90610100900460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061093257506109328261237c565b92915050565b6060600080546109479061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546109739061358e565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b6004546000906001600160a01b03163314610a2c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b506001600160a01b03811660009081526005602052604090205460ff165b919050565b6000610a5a8261245f565b610acc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a23565b506000908152600260205260409020546001600160a01b031690565b60088054610af59061358e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b219061358e565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b505050505081565b6000610b8182611367565b9050806001600160a01b0316836001600160a01b03161415610c0b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b336001600160a01b0382161480610c275750610c27813361080d565b610c995760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a23565b610ca383836124a9565b505050565b610cb2338261252f565b610d245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a23565b610ca383838361262a565b6004546001600160a01b03163314610d895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b828114610dfe5760405162461bcd60e51b815260206004820152603460248201527f4e616e6f6b6f3a204d7573742070726f7669646520657175616c207175616e7460448201527f697469657320616e6420726563697069656e74730000000000000000000000006064820152608401610a23565b600c54600090815b85811015610e4457868682818110610e2057610e2061368d565b9050602002013583610e3291906134ad565b9250610e3d816135e2565b9050610e06565b50600954610e5283836134ad565b10610ec55760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a204d696e742f6f72646572206578636565647320737570706c60448201527f79000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b60005b83811015610f555760005b878783818110610ee557610ee561368d565b90506020020135811015610f4457600083610eff816135e2565b94509050610f33878785818110610f1857610f1861368d565b9050602002016020810190610f2d9190612e85565b8261276a565b50610f3d816135e2565b9050610ed3565b50610f4e816135e2565b9050610ec8565b50505050505050565b3360009081526005602052604090205460ff16610fbd5760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b6007805460ff19811660ff90911615179055565b60008060005b600c5481101561104057600c8181548110610ff457610ff461368d565b6000918252602090912001546001600160a01b038681169116141561103057838214156110245791506109329050565b61102d826135e2565b91505b611039816135e2565b9050610fd7565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a23565b610ca38383836040518060200160405280600081525061205a565b606060006110d783611486565b905060008167ffffffffffffffff8111156110f4576110f46136bc565b60405190808252806020026020018201604052801561111d578160200160208202803683370190505b50905060005b82811015611162576111358582610fd1565b8282815181106111475761114761368d565b602090810291909101015261115b816135e2565b9050611123565b509392505050565b6004546001600160a01b031633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6000805b8281101561126457846001600160a01b0316600c8585848181106112195761121961368d565b90506020020135815481106112305761123061368d565b6000918252602090912001546001600160a01b03161461125457600091505061126a565b61125d816135e2565b90506111f3565b50600190505b9392505050565b600061127c600c5490565b82106112f05760405162461bcd60e51b815260206004820152602260248201527f4e616e6f6b6f3a20676c6f62616c20696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b5090565b3360009081526005602052604090205460ff166113535760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b600d805460ff19811660ff90911615179055565b600080600c838154811061137d5761137d61368d565b6000918252602090912001546001600160a01b03169050806109325760405162461bcd60e51b815260206004820152602360248201527f4e616e6f6b6f3a20717565727920666f72206e6f6e6578697374656e7420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610a23565b3360009081526005602052604090205460ff166114665760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b61147260128585612d50565b5061147f60138383612d50565b5050505050565b60006001600160a01b0382166115045760405162461bcd60e51b815260206004820152602a60248201527f4e616e6f6b6f3a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a23565b506001600160a01b03166000908152600f602052604090205490565b6004546001600160a01b0316331461157a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6115846000612809565b565b6004546001600160a01b031633146115e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b8281146115ec57600080fd5b60005b8381101561147f578282828181106116095761160961368d565b90506020020135600e60008787858181106116265761162661368d565b905060200201602081019061163b9190612e85565b6001600160a01b0316815260208101919091526040016000205561165e816135e2565b90506115ef565b6004546001600160a01b031633146116bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b4773a2800c3d21948e22315e573b8ec582606cbfc8e06116e06064836134c5565b6116eb9060176134d9565b604051600081818185875af1925050503d8060008114611727576040519150601f19603f3d011682016040523d82523d6000602084013e61172c565b606091505b50730ed819ccaecfc5527b606f00fd3c3b640146977d915061175190506064836134c5565b61175c9060246134d9565b604051600081818185875af1925050503d8060008114611798576040519150601f19603f3d011682016040523d82523d6000602084013e61179d565b606091505b50732e8931a6a02ec56eef941e29bb0b5121de3fa12891506117c2905060c8836134c5565b6117cd9060476134d9565b604051600081818185875af1925050503d8060008114611809576040519150601f19603f3d011682016040523d82523d6000602084013e61180e565b606091505b50733744d9468f991e110a16be720484fe53c7fe9b739150611833905060c8836134c5565b61183e90600b6134d9565b604051600081818185875af1925050503d806000811461187a576040519150601f19603f3d011682016040523d82523d6000602084013e61187f565b606091505b50505050565b600260065414156118d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a23565b6002600655600d54610100900460ff1661195a5760405162461bcd60e51b815260206004820152602560248201527f4e616e6f6b6f3a2057686974656c697374206e6565647320746f20626520656e60448201527f61626c65640000000000000000000000000000000000000000000000000000006064820152608401610a23565b336000908152600e60205260409020548111156119df5760405162461bcd60e51b815260206004820152602f60248201527f4e616e6f6b6f3a20596f7520646f206e6f74206861766520656e6f756768207760448201527f686974656c6973742061636365737300000000000000000000000000000000006064820152608401610a23565b3360009081526011602052604081205460ff16611a035766f8b0a10e470000611a0c565b66b1a2bc2ec500005b66ffffffffffffff169050611a2182826134d9565b341015611a965760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a2045746865722073656e74206973206e6f7420636f7272656360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b6000611aa1600c5490565b600954909150611ab184836134ad565b1115611aff5760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610a23565b60005b83811015611b2f57611b1f3383611b18816135e2565b945061276a565b611b28816135e2565b9050611b02565b50336000908152600e602052604081208054859290611b4f908490613516565b90915550506001600655505050565b6060600180546109479061358e565b3360009081526005602052604090205460ff16611bcc5760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b610ca360088383612d50565b6004546001600160a01b03163314611c325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b60005b81811015610ca357600160116000858585818110611c5557611c5561368d565b9050602002016020810190611c6a9190612e85565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611c9b816135e2565b9050611c35565b60026006541415611cf55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a23565b6002600655600d5460ff16611d725760405162461bcd60e51b815260206004820152602360248201527f4e616e6f6b6f3a204d696e74696e67206e6565647320746f20626520656e616260448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610a23565b600b5433600090815260106020526040902054611d8f90836134ad565b1115611ddd5760405162461bcd60e51b815260206004820181905260248201527f4e616e6f6b6f3a20596f752063616e2774206d696e742074686174206d7563686044820152606401610a23565b80600a54611deb91906134d9565b341015611e605760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a2045746865722073656e74206973206e6f7420636f7272656360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b6000611e6b600c5490565b600954909150611e7b83836134ad565b1115611ec95760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610a23565b60005b82811015611ef257611ee23383611b18816135e2565b611eeb816135e2565b9050611ecc565b503360009081526010602052604081208054849290611f129084906134ad565b909155505060016006555050565b6001600160a01b038216331415611f795760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a23565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005b83811015610f555761204a87878787858181106120075761200761368d565b9050602002013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061205a92505050565b612053816135e2565b9050611fe8565b612064338361252f565b6120d65760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a23565b61187f84848484612873565b60606120ed8261245f565b61215f5760405162461bcd60e51b815260206004820152602760248201527f4e616e6f6b6f3a2055524920717565727920666f72206e6f6e6578697374656e60448201527f7420746f6b656e000000000000000000000000000000000000000000000000006064820152608401610a23565b60075460ff166121fb57600880546121769061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546121a29061358e565b80156121ef5780601f106121c4576101008083540402835291602001916121ef565b820191906000526020600020905b8154815290600101906020018083116121d257829003601f168201915b50505050509050919050565b6012612206836128fc565b601360405160200161221a939291906133e7565b6040516020818303038152906040529050919050565b6004546001600160a01b0316331461228a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b0381166000908152600560205260409020805460ff191660011790556122b681612a2e565b50565b3360009081526005602052604090205460ff166123185760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b600c818154811061236257600080fd5b6000918252602090912001546001600160a01b0316905081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061240f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061093257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610932565b600c5460009082108015610932575060006001600160a01b0316600c838154811061248c5761248c61368d565b6000918252602090912001546001600160a01b0316141592915050565b600081815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906124f682611367565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061253a8261245f565b6125ac5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a23565b60006125b783611367565b9050806001600160a01b0316846001600160a01b031614806125f25750836001600160a01b03166125e784610a4f565b6001600160a01b0316145b8061262257506001600160a01b0380821660009081526003602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316600c82815481106126475761264761368d565b6000918252602090912001546001600160a01b0316146126cf5760405162461bcd60e51b815260206004820152602b60248201527f4e616e6f6b6f3a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e65640000000000000000000000000000000000000000006064820152608401610a23565b6126da6000826124a9565b6126e48383612b0d565b81600c82815481106126f8576126f861368d565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b612775600083612b0d565b600c805460018101825560009182527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600480546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61287e84848461262a565b61288a84848484612b85565b61187f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a23565b60608161293c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156129665780612950816135e2565b915061295f9050600a836134c5565b9150612940565b60008167ffffffffffffffff811115612981576129816136bc565b6040519080825280601f01601f1916602001820160405280156129ab576020820181803683370190505b5090505b8415612622576129c0600183613516565b91506129cd600a8661361b565b6129d89060306134ad565b60f81b8183815181106129ed576129ed61368d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a27600a866134c5565b94506129af565b6004546001600160a01b03163314612a885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b038116612b045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a23565b6122b681612809565b6001600160a01b03821615612b47576001600160a01b0382166000908152600f602052604081208054909190612b4290613559565b909155505b6001600160a01b03811615612b81576001600160a01b0381166000908152600f602052604081208054909190612b7c906135e2565b909155505b5050565b60006001600160a01b0384163b15612d45576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612be290339089908890889060040161341a565b602060405180830381600087803b158015612bfc57600080fd5b505af1925050508015612c4a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612c479181019061321e565b60015b612cfa573d808015612c78576040519150601f19603f3d011682016040523d82523d6000602084013e612c7d565b606091505b508051612cf25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a23565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612622565b506001949350505050565b828054612d5c9061358e565b90600052602060002090601f016020900481019282612d7e5760008555612dc4565b82601f10612d975782800160ff19823516178555612dc4565b82800160010185558215612dc4579182015b82811115612dc4578235825591602001919060010190612da9565b506112f09291505b808211156112f05760008155600101612dcc565b80356001600160a01b0381168114610a4a57600080fd5b60008083601f840112612e0957600080fd5b50813567ffffffffffffffff811115612e2157600080fd5b6020830191508360208260051b8501011115612e3c57600080fd5b9250929050565b60008083601f840112612e5557600080fd5b50813567ffffffffffffffff811115612e6d57600080fd5b602083019150836020828501011115612e3c57600080fd5b600060208284031215612e9757600080fd5b61126a82612de0565b60008060408385031215612eb357600080fd5b612ebc83612de0565b9150612eca60208401612de0565b90509250929050565b60008060008060008060808789031215612eec57600080fd5b612ef587612de0565b9550612f0360208801612de0565b9450604087013567ffffffffffffffff80821115612f2057600080fd5b612f2c8a838b01612df7565b90965094506060890135915080821115612f4557600080fd5b50612f5289828a01612e43565b979a9699509497509295939492505050565b600080600060608486031215612f7957600080fd5b612f8284612de0565b9250612f9060208501612de0565b9150604084013590509250925092565b60008060008060808587031215612fb657600080fd5b612fbf85612de0565b9350612fcd60208601612de0565b925060408501359150606085013567ffffffffffffffff80821115612ff157600080fd5b818701915087601f83011261300557600080fd5b813581811115613017576130176136bc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561305d5761305d6136bc565b816040528281528a602084870101111561307657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000604084860312156130af57600080fd5b6130b884612de0565b9250602084013567ffffffffffffffff8111156130d457600080fd5b6130e086828701612df7565b9497909650939450505050565b6000806040838503121561310057600080fd5b61310983612de0565b91506020830135801515811461311e57600080fd5b809150509250929050565b6000806040838503121561313c57600080fd5b61314583612de0565b946020939093013593505050565b6000806020838503121561316657600080fd5b823567ffffffffffffffff81111561317d57600080fd5b61318985828601612df7565b90969095509350505050565b600080600080604085870312156131ab57600080fd5b843567ffffffffffffffff808211156131c357600080fd5b6131cf88838901612df7565b909650945060208701359150808211156131e857600080fd5b506131f587828801612df7565b95989497509550505050565b60006020828403121561321357600080fd5b813561126a816136eb565b60006020828403121561323057600080fd5b815161126a816136eb565b6000806020838503121561324e57600080fd5b823567ffffffffffffffff81111561326557600080fd5b61318985828601612e43565b6000806000806040858703121561328757600080fd5b843567ffffffffffffffff8082111561329f57600080fd5b6132ab88838901612e43565b909650945060208701359150808211156132c457600080fd5b506131f587828801612e43565b6000602082840312156132e357600080fd5b5035919050565b6000815180845261330281602086016020860161352d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600181811c908083168061334e57607f831692505b6020808410821415613389577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561339d57600181146133ae576133db565b60ff198616895284890196506133db565b60008881526020902060005b868110156133d35781548b8201529085019083016133ba565b505084890196505b50505050505092915050565b60006133f38286613334565b845161340381836020890161352d565b61340f81830186613334565b979650505050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261344c60808301846132ea565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561348e57835183529284019291840191600101613472565b50909695505050505050565b60208152600061126a60208301846132ea565b600082198211156134c0576134c061362f565b500190565b6000826134d4576134d461365e565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135115761351161362f565b500290565b6000828210156135285761352861362f565b500390565b60005b83811015613548578181015183820152602001613530565b8381111561187f5750506000910152565b6000816135685761356861362f565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c908216806135a257607f821691505b602082108114156135dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136145761361461362f565b5060010190565b60008261362a5761362a61365e565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146122b657600080fdfea2646970667358221220de36d23f95df564c19ef90ebb23c743f1de1a5b32fc916afbdcd1dd8b254faad64736f6c63430008070033
Deployed Bytecode Sourcemap
34114:9583:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29521:225;;;;;;;;;;-1:-1:-1;29521:225:0;;;;;:::i;:::-;;:::i;:::-;;;12416:14:1;;12409:22;12391:41;;12379:2;12364:18;29521:225:0;;;;;;;;24289:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33449:112::-;;;;;;;;;;-1:-1:-1;33449:112:0;;;;;:::i;:::-;;:::i;25469:216::-;;;;;;;;;;-1:-1:-1;25469:216:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11031:55:1;;;11013:74;;11001:2;10986:18;25469:216:0;10867:226:1;34248:33:0;;;;;;;;;;;;;:::i;25058:403::-;;;;;;;;;;-1:-1:-1;25058:403:0;;;;;:::i;:::-;;:::i;:::-;;37278:106;;;;;;;;;;-1:-1:-1;37364:7:0;:14;37278:106;;;22748:25:1;;;22736:2;22721:18;37278:106:0;22602:177:1;34365:28:0;;;;;;;;;;;;;;;;37862:105;;;;;;;;;;-1:-1:-1;37940:21:0;37862:105;;26168:334;;;;;;;;;;-1:-1:-1;26168:334:0;;;;;:::i;:::-;;:::i;40457:625::-;;;;;;;;;;-1:-1:-1;40457:625:0;;;;;:::i;:::-;;:::i;41657:85::-;;;;;;;;;;;;;:::i;36415:360::-;;;;;;;;;;-1:-1:-1;36415:360:0;;;;;:::i;:::-;;:::i;34288:31::-;;;;;;;;;;;;;;;;26510:184;;;;;;;;;;-1:-1:-1;26510:184:0;;;;;:::i;:::-;;:::i;37471:312::-;;;;;;;;;;-1:-1:-1;37471:312:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33567:116::-;;;;;;;;;;-1:-1:-1;33567:116:0;;;;;:::i;:::-;;:::i;35361:250::-;;;;;;;;;;-1:-1:-1;35361:250:0;;;;;:::i;:::-;;:::i;36063:179::-;;;;;;;;;;-1:-1:-1;36063:179:0;;;;;:::i;:::-;;:::i;34215:28::-;;;;;;;;;;-1:-1:-1;34215:28:0;;;;;;;;42000:89;;;;;;;;;;;;;:::i;34463:32::-;;;;;;;;;;-1:-1:-1;34463:32:0;;;;;;;;35680:217;;;;;;;;;;-1:-1:-1;35680:217:0;;;;;:::i;:::-;;:::i;42275:158::-;;;;;;;;;;-1:-1:-1;42275:158:0;;;;;:::i;:::-;;:::i;35069:193::-;;;;;;;;;;-1:-1:-1;35069:193:0;;;;;:::i;:::-;;:::i;32399:94::-;;;;;;;;;;;;;:::i;41160:265::-;;;;;;;;;;-1:-1:-1;41160:265:0;;;;;:::i;:::-;;:::i;39564:809::-;;;;;;;;;;;;;:::i;38716:645::-;;;;;;:::i;:::-;;:::i;34324:36::-;;;;;;;;;;;;;;;;31748:87;;;;;;;;;;-1:-1:-1;31821:6:0;;-1:-1:-1;;;;;31821:6:0;31748:87;;24798:106;;;;;;;;;;;;;:::i;41812:123::-;;;;;;;;;;-1:-1:-1;41812:123:0;;;;;:::i;:::-;;:::i;41431:158::-;;;;;;;;;;-1:-1:-1;41431:158:0;;;;;:::i;:::-;;:::i;38161:549::-;;;;;;:::i;:::-;;:::i;25865:295::-;;;;;;;;;;-1:-1:-1;25865:295:0;;;;;:::i;:::-;;:::i;30155:245::-;;;;;;;;;;-1:-1:-1;30155:245:0;;;;;:::i;:::-;;:::i;26702:325::-;;;;;;;;;;-1:-1:-1;26702:325:0;;;;;:::i;:::-;;:::i;34692:36::-;;;;;;;;;;-1:-1:-1;34692:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36870:322;;;;;;;;;;-1:-1:-1;36870:322:0;;;;;:::i;:::-;;:::i;34548:46::-;;;;;;;;;;-1:-1:-1;34548:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;25693:164;;;;;;;;;;-1:-1:-1;25693:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25814:25:0;;;25790:4;25814:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25693:164;34646:41;;;;;;;;;;-1:-1:-1;34646:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;33689:161;;;;;;;;;;-1:-1:-1;33689:161:0;;;;;:::i;:::-;;:::i;42095:111::-;;;;;;;;;;;;;:::i;34432:24::-;;;;;;;;;;-1:-1:-1;34432:24:0;;;;;:::i;:::-;;:::i;34500:41::-;;;;;;;;;;-1:-1:-1;34500:41:0;;;;;;;;;;;29521:225;29624:4;29648:50;;;29663:35;29648:50;;:90;;;29702:36;29726:11;29702:23;:36::i;:::-;29641:97;29521:225;-1:-1:-1;;29521:225:0:o;24289:102::-;24345:13;24378:5;24371:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24289:102;:::o;33449:112::-;31821:6;;33519:4;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;;;;;;;;;-1:-1:-1;;;;;;33539:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;::::1;;32039:1;33449:112:::0;;;:::o;25469:216::-;25542:7;25570:16;25578:7;25570;:16::i;:::-;25562:73;;;;-1:-1:-1;;;25562:73:0;;19267:2:1;25562:73:0;;;19249:21:1;19306:2;19286:18;;;19279:30;19345:34;19325:18;;;19318:62;19416:14;19396:18;;;19389:42;19448:19;;25562:73:0;19065:408:1;25562:73:0;-1:-1:-1;25653:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25653:24:0;;25469:216::o;34248:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25058:403::-;25138:13;25154:16;25162:7;25154;:16::i;:::-;25138:32;;25195:5;-1:-1:-1;;;;;25189:11:0;:2;-1:-1:-1;;;;;25189:11:0;;;25181:57;;;;-1:-1:-1;;;25181:57:0;;20041:2:1;25181:57:0;;;20023:21:1;20080:2;20060:18;;;20053:30;20119:34;20099:18;;;20092:62;20190:3;20170:18;;;20163:31;20211:19;;25181:57:0;19839:397:1;25181:57:0;23232:10;-1:-1:-1;;;;;25273:21:0;;;;:62;;-1:-1:-1;25298:37:0;25315:5;23232:10;25693:164;:::i;25298:37::-;25251:168;;;;-1:-1:-1;;;25251:168:0;;18036:2:1;25251:168:0;;;18018:21:1;18075:2;18055:18;;;18048:30;18114:34;18094:18;;;18087:62;18185:26;18165:18;;;18158:54;18229:19;;25251:168:0;17834:420:1;25251:168:0;25432:21;25441:2;25445:7;25432:8;:21::i;:::-;25127:334;25058:403;;:::o;26168:334::-;26360:41;23232:10;26393:7;26360:18;:41::i;:::-;26352:103;;;;-1:-1:-1;;;26352:103:0;;20443:2:1;26352:103:0;;;20425:21:1;20482:2;20462:18;;;20455:30;20521:34;20501:18;;;20494:62;20592:19;20572:18;;;20565:47;20629:19;;26352:103:0;20241:413:1;26352:103:0;26466:28;26476:4;26482:2;26486:7;26466:9;:28::i;40457:625::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;40564:35;;::::1;40556:101;;;::::0;-1:-1:-1;;;40556:101:0;;16492:2:1;40556:101:0::1;::::0;::::1;16474:21:1::0;16531:2;16511:18;;;16504:30;16570:34;16550:18;;;16543:62;16641:22;16621:18;;;16614:50;16681:19;;40556:101:0::1;16290:416:1::0;40556:101:0::1;40705:7;:14:::0;40666:18:::1;::::0;;40726:82:::1;40738:19:::0;;::::1;40726:82;;;40789:8;;40798:1;40789:11;;;;;;;:::i;:::-;;;;;;;40772:28;;;;;:::i;:::-;::::0;-1:-1:-1;40759:3:0::1;::::0;::::1;:::i;:::-;;;40726:82;;;-1:-1:-1::0;40848:10:0::1;::::0;40823:22:::1;40832:13:::0;40823:6;:22:::1;:::i;:::-;:35;40814:83;;;::::0;-1:-1:-1;;;40814:83:0;;18461:2:1;40814:83:0::1;::::0;::::1;18443:21:1::0;18500:2;18480:18;;;18473:30;18539:34;18519:18;;;18512:62;18610:3;18590:18;;;18583:31;18631:19;;40814:83:0::1;18259:397:1::0;40814:83:0::1;40910:6;40906:171;40918:20:::0;;::::1;40906:171;;;40957:6;40953:117;40969:8;;40978:1;40969:11;;;;;;;:::i;:::-;;;;;;;40965:1;:15;40953:117;;;40997:12;41012:8:::0;::::1;::::0;::::1;:::i;:::-;;;40997:23;;41031:29;41038:9;;41048:1;41038:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41052:7;41031:5;:29::i;:::-;-1:-1:-1::0;40982:3:0::1;::::0;::::1;:::i;:::-;;;40953:117;;;-1:-1:-1::0;40940:3:0::1;::::0;::::1;:::i;:::-;;;40906:171;;;;40549:533;;40457:625:::0;;;;:::o;41657:85::-;33381:10;33370:22;;;;:10;:22;;;;;;;;33362:52;;;;-1:-1:-1;;;33362:52:0;;13271:2:1;33362:52:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:18;13329;;;13322:46;13385:18;;33362:52:0;13069:340:1;33362:52:0;41728:8:::1;::::0;;-1:-1:-1;;41716:20:0;::::1;41728:8;::::0;;::::1;41727:9;41716:20;::::0;;41657:85::o;36415:360::-;36501:13;36523:10;36544:6;36540:170;36556:7;:14;36552:18;;36540:170;;;36597:7;36605:1;36597:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36588:19:0;;;36597:10;;36588:19;36585:118;;;36632:5;36623;:14;36619:74;;;36658:1;-1:-1:-1;36651:8:0;;-1:-1:-1;36651:8:0;36619:74;36686:7;;;:::i;:::-;;;36619:74;36572:3;;;:::i;:::-;;;36540:170;;;-1:-1:-1;36716:53:0;;-1:-1:-1;;;36716:53:0;;13616:2:1;36716:53:0;;;13598:21:1;13655:2;13635:18;;;13628:30;13694:34;13674:18;;;13667:62;13765:13;13745:18;;;13738:41;13796:19;;36716:53:0;13414:407:1;26510:184:0;26647:39;26664:4;26670:2;26674:7;26647:39;;;;;;;;;;;;:16;:39::i;37471:312::-;37545:13;37567;37583:20;37594:7;37583:9;:20::i;:::-;37567:36;;37610:20;37645:8;37633:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37633:22:0;;37610:45;;37667:6;37662:96;37679:8;37675:1;:12;37662:96;;;37717:33;37738:7;37747:1;37717:19;:33::i;:::-;37705:6;37712:1;37705:9;;;;;;;;:::i;:::-;;;;;;;;;;:45;37689:3;;;:::i;:::-;;;37662:96;;;-1:-1:-1;37771:6:0;37471:312;-1:-1:-1;;;37471:312:0:o;33567:116::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;-1:-1:-1;;;;;33647:16:0;;;::::1;;::::0;;;:10:::1;:16;::::0;;;;:30;;-1:-1:-1;;33647:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33567:116::o;35361:250::-;35457:4;35474:6;35470:116;35482:19;;;35470:116;;;35547:7;-1:-1:-1;;;;;35521:33:0;:7;35530:8;;35539:1;35530:11;;;;;;;:::i;:::-;;;;;;;35521:22;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;35521:22:0;:33;35517:61;;35573:5;35566:12;;;;;35517:61;35503:3;;;:::i;:::-;;;35470:116;;;;35601:4;35594:11;;35361:250;;;;;;:::o;36063:179::-;36129:11;36165:13;37364:7;:14;;37278:106;36165:13;36157:5;:21;36149:68;;;;-1:-1:-1;;;36149:68:0;;21993:2:1;36149:68:0;;;21975:21:1;22032:2;22012:18;;;22005:30;22071:34;22051:18;;;22044:62;22142:4;22122:18;;;22115:32;22164:19;;36149:68:0;21791:398:1;36149:68:0;-1:-1:-1;36231:5:0;36063:179::o;42000:89::-;33381:10;33370:22;;;;:10;:22;;;;;;;;33362:52;;;;-1:-1:-1;;;33362:52:0;;13271:2:1;33362:52:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:18;13329;;;13322:46;13385:18;;33362:52:0;13069:340:1;33362:52:0;42071:12:::1;::::0;;-1:-1:-1;;42055:28:0;::::1;42071:12;::::0;;::::1;42070:13;42055:28;::::0;;42000:89::o;35680:217::-;35743:14;35766:13;35782:7;35790;35782:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;35782:16:0;;-1:-1:-1;35813:19:0;35805:67;;;;-1:-1:-1;;;35805:67:0;;15260:2:1;35805:67:0;;;15242:21:1;15299:2;15279:18;;;15272:30;15338:34;15318:18;;;15311:62;15409:5;15389:18;;;15382:33;15432:19;;35805:67:0;15058:399:1;42275:158:0;33381:10;33370:22;;;;:10;:22;;;;;;;;33362:52;;;;-1:-1:-1;;;33362:52:0;;13271:2:1;33362:52:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:18;13329;;;13322:46;13385:18;;33362:52:0;13069:340:1;33362:52:0;42372:24:::1;:15;42390:6:::0;;42372:24:::1;:::i;:::-;-1:-1:-1::0;42403:24:0::1;:15;42421:6:::0;;42403:24:::1;:::i;:::-;;42275:158:::0;;;;:::o;35069:193::-;35135:4;-1:-1:-1;;;;;35156:21:0;;35148:76;;;;-1:-1:-1;;;35148:76:0;;21222:2:1;35148:76:0;;;21204:21:1;21261:2;21241:18;;;21234:30;21300:34;21280:18;;;21273:62;21371:12;21351:18;;;21344:40;21401:19;;35148:76:0;21020:406:1;35148:76:0;-1:-1:-1;;;;;;35238:18:0;;;;;:9;:18;;;;;;;35069:193::o;32399:94::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;32464:21:::1;32482:1;32464:9;:21::i;:::-;32399:94::o:0;41160:265::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;41277:36;;::::1;41269:45;;;::::0;::::1;;41325:6;41321:99;41333:19:::0;;::::1;41321:99;;;41399:10;;41410:1;41399:13;;;;;;;:::i;:::-;;;;;;;41367:14;:29;41383:8;;41392:1;41383:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41367:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41367:29:0;:45;41354:3:::1;::::0;::::1;:::i;:::-;;;41321:99;;39564:809:::0;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;39859:21:::1;39901:42;39957:12;39966:3;39859:21:::0;39957:12:::1;:::i;:::-;:17;::::0;39972:2:::1;39957:17;:::i;:::-;39893:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;39994:42:0::1;::::0;-1:-1:-1;40050:12:0::1;::::0;-1:-1:-1;40059:3:0::1;40050:6:::0;:12:::1;:::i;:::-;:17;::::0;40065:2:::1;40050:17;:::i;:::-;39986:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40087:42:0::1;::::0;-1:-1:-1;40143:12:0::1;::::0;-1:-1:-1;40152:3:0::1;40143:6:::0;:12:::1;:::i;:::-;:17;::::0;40158:2:::1;40143:17;:::i;:::-;40079:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40180:42:0::1;::::0;-1:-1:-1;40236:12:0::1;::::0;-1:-1:-1;40245:3:0::1;40236:6:::0;:12:::1;:::i;:::-;:17;::::0;40251:2:::1;40236:17;:::i;:::-;40172:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39604:769;39564:809::o:0;38716:645::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;21633:2:1;2402:63:0;;;21615:21:1;21672:2;21652:18;;;21645:30;21711:33;21691:18;;;21684:61;21762:18;;2402:63:0;21431:355:1;2402:63:0;1812:1;2543:7;:18;38799:21:::1;::::0;::::1;::::0;::::1;;;38791:71;;;::::0;-1:-1:-1;;;38791:71:0;;14854:2:1;38791:71:0::1;::::0;::::1;14836:21:1::0;14893:2;14873:18;;;14866:30;14932:34;14912:18;;;14905:62;15003:7;14983:18;;;14976:35;15028:19;;38791:71:0::1;14652:401:1::0;38791:71:0::1;38904:10;38889:26;::::0;;;:14:::1;:26;::::0;;;;;38877:38;::::1;;38869:97;;;::::0;-1:-1:-1;;;38869:97:0;;16076:2:1;38869:97:0::1;::::0;::::1;16058:21:1::0;16115:2;16095:18;;;16088:30;16154:34;16134:18;;;16127:62;16225:17;16205:18;;;16198:45;16260:19;;38869:97:0::1;15874:411:1::0;38869:97:0::1;38991:10;38973;38986:16:::0;;;:4:::1;:16;::::0;;;;;::::1;;:42;;39018:10;38986:42;;;39005:10;38986:42;38973:55;;::::0;-1:-1:-1;39057:16:0::1;39065:8:::0;38973:55;39057:16:::1;:::i;:::-;39044:9;:29;;39035:76;;;::::0;-1:-1:-1;;;39035:76:0;;12869:2:1;39035:76:0::1;::::0;::::1;12851:21:1::0;12908:2;12888:18;;;12881:30;12947:34;12927:18;;;12920:62;13018:3;12998:18;;;12991:31;13039:19;;39035:76:0::1;12667:397:1::0;39035:76:0::1;39118:11;39132:13;37364:7:::0;:14;;37278:106;39132:13:::1;39181:10;::::0;39118:27;;-1:-1:-1;39160:17:0::1;39169:8:::0;39118:27;39160:17:::1;:::i;:::-;:31;;39152:72;;;::::0;-1:-1:-1;;;39152:72:0;;17680:2:1;39152:72:0::1;::::0;::::1;17662:21:1::0;17719:2;17699:18;;;17692:30;17758:29;17738:18;;;17731:57;17805:18;;39152:72:0::1;17478:351:1::0;39152:72:0::1;39237:6;39233:76;39249:8;39245:1;:12;39233:76;;;39272:29;39279:10;39291:8:::0;::::1;::::0;::::1;:::i;:::-;;;39272:5;:29::i;:::-;39259:3;::::0;::::1;:::i;:::-;;;39233:76;;;-1:-1:-1::0;39332:10:0::1;39317:26;::::0;;;:14:::1;:26;::::0;;;;:38;;39347:8;;39317:26;:38:::1;::::0;39347:8;;39317:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;1768:1:0;2722:7;:22;-1:-1:-1;;;38716:645:0:o;24798:106::-;24856:13;24889:7;24882:14;;;;;:::i;41812:123::-;33381:10;33370:22;;;;:10;:22;;;;;;;;33362:52;;;;-1:-1:-1;;;33362:52:0;;13271:2:1;33362:52:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:18;13329;;;13322:46;13385:18;;33362:52:0;13069:340:1;33362:52:0;41899:30:::1;:14;41916:13:::0;;41899:30:::1;:::i;41431:158::-:0;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;41508:6:::1;41504:80;41516:19:::0;;::::1;41504:80;;;41572:4;41550;:19;41556:8;;41565:1;41556:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41550:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41550:19:0;:26;;-1:-1:-1;;41550:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41537:3:::1;::::0;::::1;:::i;:::-;;;41504:80;;38161:549:::0;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;21633:2:1;2402:63:0;;;21615:21:1;21672:2;21652:18;;;21645:30;21711:33;21691:18;;;21684:61;21762:18;;2402:63:0;21431:355:1;2402:63:0;1812:1;2543:7;:18;38237:12:::1;::::0;::::1;;38229:60;;;::::0;-1:-1:-1;;;38229:60:0;;18863:2:1;38229:60:0::1;::::0;::::1;18845:21:1::0;18902:2;18882:18;;;18875:30;18941:34;18921:18;;;18914:62;19012:5;18992:18;;;18985:33;19035:19;;38229:60:0::1;18661:399:1::0;38229:60:0::1;38340:7;::::0;38325:10:::1;38315:21;::::0;;;:9:::1;:21;::::0;;;;;38304:32:::1;::::0;:8;:32:::1;:::i;:::-;:43;;38296:88;;;::::0;-1:-1:-1;;;38296:88:0;;20861:2:1;38296:88:0::1;::::0;::::1;20843:21:1::0;;;20880:18;;;20873:30;20939:34;20919:18;;;20912:62;20991:18;;38296:88:0::1;20659:356:1::0;38296:88:0::1;38421:8;38413:5;;:16;;;;:::i;:::-;38400:9;:29;;38391:76;;;::::0;-1:-1:-1;;;38391:76:0;;12869:2:1;38391:76:0::1;::::0;::::1;12851:21:1::0;12908:2;12888:18;;;12881:30;12947:34;12927:18;;;12920:62;13018:3;12998:18;;;12991:31;13039:19;;38391:76:0::1;12667:397:1::0;38391:76:0::1;38476:11;38490:13;37364:7:::0;:14;;37278:106;38490:13:::1;38539:10;::::0;38476:27;;-1:-1:-1;38518:17:0::1;38527:8:::0;38476:27;38518:17:::1;:::i;:::-;:31;;38510:72;;;::::0;-1:-1:-1;;;38510:72:0;;17680:2:1;38510:72:0::1;::::0;::::1;17662:21:1::0;17719:2;17699:18;;;17692:30;17758:29;17738:18;;;17731:57;17805:18;;38510:72:0::1;17478:351:1::0;38510:72:0::1;38593:6;38589:76;38605:8;38601:1;:12;38589:76;;;38628:29;38635:10;38647:8:::0;::::1;::::0;::::1;:::i;38628:29::-;38615:3;::::0;::::1;:::i;:::-;;;38589:76;;;-1:-1:-1::0;38681:10:0::1;38671:21;::::0;;;:9:::1;:21;::::0;;;;:33;;38696:8;;38671:21;:33:::1;::::0;38696:8;;38671:33:::1;:::i;:::-;::::0;;;-1:-1:-1;;1768:1:0;2722:7;:22;-1:-1:-1;;38161:549:0:o;25865:295::-;-1:-1:-1;;;;;25970:24:0;;23232:10;25970:24;;25962:62;;;;-1:-1:-1;;;25962:62:0;;16913:2:1;25962:62:0;;;16895:21:1;16952:2;16932:18;;;16925:30;16991:27;16971:18;;;16964:55;17036:18;;25962:62:0;16711:349:1;25962:62:0;23232:10;26035:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;26035:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;26035:53:0;;;;;;;;;;26104:48;;12391:41:1;;;26035:42:0;;23232:10;26104:48;;12364:18:1;26104:48:0;;;;;;;25865:295;;:::o;30155:245::-;30285:6;30281:112;30293:19;;;30281:112;;;30334:47;30352:4;30358:2;30362:8;;30371:1;30362:11;;;;;;;:::i;:::-;;;;;;;30375:4;;30334:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30334:16:0;;-1:-1:-1;;;30334:47:0:i;:::-;30314:3;;;:::i;:::-;;;30281:112;;26702:325;26874:41;23232:10;26907:7;26874:18;:41::i;:::-;26866:103;;;;-1:-1:-1;;;26866:103:0;;20443:2:1;26866:103:0;;;20425:21:1;20482:2;20462:18;;;20455:30;20521:34;20501:18;;;20494:62;20592:19;20572:18;;;20565:47;20629:19;;26866:103:0;20241:413:1;26866:103:0;26980:39;26994:4;27000:2;27004:7;27013:5;26980:13;:39::i;36870:322::-;36934:13;36964:16;36972:7;36964;:16::i;:::-;36956:68;;;;-1:-1:-1;;;36956:68:0;;22396:2:1;36956:68:0;;;22378:21:1;22435:2;22415:18;;;22408:30;22474:34;22454:18;;;22447:62;22545:9;22525:18;;;22518:37;22572:19;;36956:68:0;22194:403:1;36956:68:0;37036:8;;;;37033:62;;37073:14;37066:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36870:322;;;:::o;37033:62::-;37132:15;37149:18;:7;:16;:18::i;:::-;37169:15;37115:70;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37101:85;;36870:322;;;:::o;33689:161::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;-1:-1:-1;;;;;33775:20:0;::::1;;::::0;;;:10:::1;:20;::::0;;;;:27;;-1:-1:-1;;33775:27:0::1;33798:4;33775:27;::::0;;33809:35:::1;33786:8:::0;33809:23:::1;:35::i;:::-;33689:161:::0;:::o;42095:111::-;33381:10;33370:22;;;;:10;:22;;;;;;;;33362:52;;;;-1:-1:-1;;;33362:52:0;;13271:2:1;33362:52:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:18;13329;;;13322:46;13385:18;;33362:52:0;13069:340:1;33362:52:0;42179:21:::1;::::0;;42154:46;;::::1;42179:21;::::0;;;::::1;;;42178:22;42154:46:::0;;::::1;;::::0;;42095:111::o;34432:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34432:24:0;;-1:-1:-1;34432:24:0;:::o;24485:305::-;24587:4;24624:40;;;24639:25;24624:40;;:105;;-1:-1:-1;24681:48:0;;;24696:33;24681:48;24624:105;:158;;;-1:-1:-1;16045:25:0;16030:40;;;;24746:36;15921:157;42891:147;42984:7;:14;42954:4;;42974:24;;:58;;;;;43030:1;-1:-1:-1;;;;;43002:30:0;:7;43010;43002:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;43002:16:0;:30;;42967:65;42891:147;-1:-1:-1;;42891:147:0:o;27053:164::-;27125:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;27125:29:0;;;;;;;;:24;;27179:16;27125:24;27179:7;:16::i;:::-;-1:-1:-1;;;;;27170:39:0;;;;;;;;;;;27053:164;;:::o;28105:338::-;28195:4;28220:16;28228:7;28220;:16::i;:::-;28212:73;;;;-1:-1:-1;;;28212:73:0;;17267:2:1;28212:73:0;;;17249:21:1;17306:2;17286:18;;;17279:30;17345:34;17325:18;;;17318:62;17416:14;17396:18;;;17389:42;17448:19;;28212:73:0;17065:408:1;28212:73:0;28296:13;28312:16;28320:7;28312;:16::i;:::-;28296:32;;28358:5;-1:-1:-1;;;;;28347:16:0;:7;-1:-1:-1;;;;;28347:16:0;;:51;;;;28391:7;-1:-1:-1;;;;;28367:31:0;:20;28379:7;28367:11;:20::i;:::-;-1:-1:-1;;;;;28367:31:0;;28347:51;:87;;;-1:-1:-1;;;;;;25814:25:0;;;25790:4;25814:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28402:32;28339:96;28105:338;-1:-1:-1;;;;28105:338:0:o;43332:362::-;43444:4;-1:-1:-1;;;;;43424:24:0;:7;43432;43424:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;43424:16:0;:24;43416:80;;;;-1:-1:-1;;;43416:80:0;;15664:2:1;43416:80:0;;;15646:21:1;15703:2;15683:18;;;15676:30;15742:34;15722:18;;;15715:62;15813:13;15793:18;;;15786:41;15844:19;;43416:80:0;15462:407:1;43416:80:0;43553:29;43570:1;43574:7;43553:8;:29::i;:::-;43589:30;43610:4;43616:2;43589:20;:30::i;:::-;43647:2;43628:7;43636;43628:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;-1:-1:-1;;;;;43628:21:0;;;;;;43661:27;;43680:7;;43661:27;;;;;;;;;;43628:16;43661:27;43332:362;;;:::o;43103:167::-;43160:36;43189:1;43193:2;43160:20;:36::i;:::-;43203:7;:16;;;;;;;-1:-1:-1;43203:16:0;;;;;;;;;-1:-1:-1;;;;;43203:16:0;;;;;;;;43231:33;;43256:7;;-1:-1:-1;43231:33:0;;-1:-1:-1;;43231:33:0;43103:167;;:::o;32848:173::-;32923:6;;;-1:-1:-1;;;;;32940:17:0;;;;;;;;;;;32973:40;;32923:6;;;32940:17;32923:6;;32973:40;;32904:16;;32973:40;32893:128;32848:173;:::o;28451:312::-;28605:28;28615:4;28621:2;28625:7;28605:9;:28::i;:::-;28652:48;28675:4;28681:2;28685:7;28694:5;28652:22;:48::i;:::-;28644:111;;;;-1:-1:-1;;;28644:111:0;;14028:2:1;28644:111:0;;;14010:21:1;14067:2;14047:18;;;14040:30;14106:34;14086:18;;;14079:62;14177:20;14157:18;;;14150:48;14215:19;;28644:111:0;13826:414:1;3124:723:0;3180:13;3401:10;3397:53;;-1:-1:-1;;3428:10:0;;;;;;;;;;;;;;;;;;3124:723::o;3397:53::-;3475:5;3460:12;3516:78;3523:9;;3516:78;;3549:8;;;;:::i;:::-;;-1:-1:-1;3572:10:0;;-1:-1:-1;3580:2:0;3572:10;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3626:17:0;;3604:39;;3654:154;3661:10;;3654:154;;3688:11;3698:1;3688:11;;:::i;:::-;;-1:-1:-1;3757:10:0;3765:2;3757:5;:10;:::i;:::-;3744:24;;:2;:24;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3785:11:0;3794:2;3785:11;;:::i;:::-;;;3654:154;;32648:192;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;-1:-1:-1;;;;;32737:22:0;::::1;32729:73;;;::::0;-1:-1:-1;;;32729:73:0;;14447:2:1;32729:73:0::1;::::0;::::1;14429:21:1::0;14486:2;14466:18;;;14459:30;14525:34;14505:18;;;14498:62;14596:8;14576:18;;;14569:36;14622:19;;32729:73:0::1;14245:402:1::0;32729:73:0::1;32813:19;32823:8;32813:9;:19::i;42644:185::-:0;-1:-1:-1;;;;;42720:18:0;;;42716:51;;-1:-1:-1;;;;;42750:17:0;;;;;;:9;:17;;;;;42748:19;;42750:17;;;42748:19;;;:::i;:::-;;;;-1:-1:-1;42716:51:0;-1:-1:-1;;;;;42780:16:0;;;42776:47;;-1:-1:-1;;;;;42808:15:0;;;;;;:9;:15;;;;;42806:17;;42808:15;;;42806:17;;;:::i;:::-;;;;-1:-1:-1;42776:47:0;42644:185;;:::o;27225:796::-;27377:4;-1:-1:-1;;;;;27398:13:0;;6369:20;6417:8;27394:620;;27434:72;;;;;-1:-1:-1;;;;;27434:36:0;;;;;:72;;23232:10;;27485:4;;27491:7;;27500:5;;27434:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27434:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;27430:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27676:13:0;;27672:272;;27719:60;;-1:-1:-1;;;27719:60:0;;14028:2:1;27719:60:0;;;14010:21:1;14067:2;14047:18;;;14040:30;14106:34;14086:18;;;14079:62;14177:20;14157:18;;;14150:48;14215:19;;27719:60:0;13826:414:1;27672:272:0;27894:6;27888:13;27879:6;27875:2;27871:15;27864:38;27430:529;27557:51;;27567:41;27557:51;;-1:-1:-1;27550:58:0;;27394:620;-1:-1:-1;27998:4:0;27225:796;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;215:367;278:8;288:6;342:3;335:4;327:6;323:17;319:27;309:55;;360:1;357;350:12;309:55;-1:-1:-1;383:20:1;;426:18;415:30;;412:50;;;458:1;455;448:12;412:50;495:4;487:6;483:17;471:29;;555:3;548:4;538:6;535:1;531:14;523:6;519:27;515:38;512:47;509:67;;;572:1;569;562:12;509:67;215:367;;;;;:::o;587:347::-;638:8;648:6;702:3;695:4;687:6;683:17;679:27;669:55;;720:1;717;710:12;669:55;-1:-1:-1;743:20:1;;786:18;775:30;;772:50;;;818:1;815;808:12;772:50;855:4;847:6;843:17;831:29;;907:3;900:4;891:6;883;879:19;875:30;872:39;869:59;;;924:1;921;914:12;939:186;998:6;1051:2;1039:9;1030:7;1026:23;1022:32;1019:52;;;1067:1;1064;1057:12;1019:52;1090:29;1109:9;1090:29;:::i;1130:260::-;1198:6;1206;1259:2;1247:9;1238:7;1234:23;1230:32;1227:52;;;1275:1;1272;1265:12;1227:52;1298:29;1317:9;1298:29;:::i;:::-;1288:39;;1346:38;1380:2;1369:9;1365:18;1346:38;:::i;:::-;1336:48;;1130:260;;;;;:::o;1395:894::-;1519:6;1527;1535;1543;1551;1559;1612:3;1600:9;1591:7;1587:23;1583:33;1580:53;;;1629:1;1626;1619:12;1580:53;1652:29;1671:9;1652:29;:::i;:::-;1642:39;;1700:38;1734:2;1723:9;1719:18;1700:38;:::i;:::-;1690:48;;1789:2;1778:9;1774:18;1761:32;1812:18;1853:2;1845:6;1842:14;1839:34;;;1869:1;1866;1859:12;1839:34;1908:70;1970:7;1961:6;1950:9;1946:22;1908:70;:::i;:::-;1997:8;;-1:-1:-1;1882:96:1;-1:-1:-1;2085:2:1;2070:18;;2057:32;;-1:-1:-1;2101:16:1;;;2098:36;;;2130:1;2127;2120:12;2098:36;;2169:60;2221:7;2210:8;2199:9;2195:24;2169:60;:::i;:::-;1395:894;;;;-1:-1:-1;1395:894:1;;-1:-1:-1;1395:894:1;;2248:8;;1395:894;-1:-1:-1;;;1395:894:1:o;2294:328::-;2371:6;2379;2387;2440:2;2428:9;2419:7;2415:23;2411:32;2408:52;;;2456:1;2453;2446:12;2408:52;2479:29;2498:9;2479:29;:::i;:::-;2469:39;;2527:38;2561:2;2550:9;2546:18;2527:38;:::i;:::-;2517:48;;2612:2;2601:9;2597:18;2584:32;2574:42;;2294:328;;;;;:::o;2627:1197::-;2722:6;2730;2738;2746;2799:3;2787:9;2778:7;2774:23;2770:33;2767:53;;;2816:1;2813;2806:12;2767:53;2839:29;2858:9;2839:29;:::i;:::-;2829:39;;2887:38;2921:2;2910:9;2906:18;2887:38;:::i;:::-;2877:48;;2972:2;2961:9;2957:18;2944:32;2934:42;;3027:2;3016:9;3012:18;2999:32;3050:18;3091:2;3083:6;3080:14;3077:34;;;3107:1;3104;3097:12;3077:34;3145:6;3134:9;3130:22;3120:32;;3190:7;3183:4;3179:2;3175:13;3171:27;3161:55;;3212:1;3209;3202:12;3161:55;3248:2;3235:16;3270:2;3266;3263:10;3260:36;;;3276:18;;:::i;:::-;3410:2;3404:9;3472:4;3464:13;;3315:66;3460:22;;;3484:2;3456:31;3452:40;3440:53;;;3508:18;;;3528:22;;;3505:46;3502:72;;;3554:18;;:::i;:::-;3594:10;3590:2;3583:22;3629:2;3621:6;3614:18;3669:7;3664:2;3659;3655;3651:11;3647:20;3644:33;3641:53;;;3690:1;3687;3680:12;3641:53;3746:2;3741;3737;3733:11;3728:2;3720:6;3716:15;3703:46;3791:1;3786:2;3781;3773:6;3769:15;3765:24;3758:35;3812:6;3802:16;;;;;;;2627:1197;;;;;;;:::o;3829:511::-;3924:6;3932;3940;3993:2;3981:9;3972:7;3968:23;3964:32;3961:52;;;4009:1;4006;3999:12;3961:52;4032:29;4051:9;4032:29;:::i;:::-;4022:39;;4112:2;4101:9;4097:18;4084:32;4139:18;4131:6;4128:30;4125:50;;;4171:1;4168;4161:12;4125:50;4210:70;4272:7;4263:6;4252:9;4248:22;4210:70;:::i;:::-;3829:511;;4299:8;;-1:-1:-1;4184:96:1;;-1:-1:-1;;;;3829:511:1:o;4345:347::-;4410:6;4418;4471:2;4459:9;4450:7;4446:23;4442:32;4439:52;;;4487:1;4484;4477:12;4439:52;4510:29;4529:9;4510:29;:::i;:::-;4500:39;;4589:2;4578:9;4574:18;4561:32;4636:5;4629:13;4622:21;4615:5;4612:32;4602:60;;4658:1;4655;4648:12;4602:60;4681:5;4671:15;;;4345:347;;;;;:::o;4697:254::-;4765:6;4773;4826:2;4814:9;4805:7;4801:23;4797:32;4794:52;;;4842:1;4839;4832:12;4794:52;4865:29;4884:9;4865:29;:::i;:::-;4855:39;4941:2;4926:18;;;;4913:32;;-1:-1:-1;;;4697:254:1:o;4956:437::-;5042:6;5050;5103:2;5091:9;5082:7;5078:23;5074:32;5071:52;;;5119:1;5116;5109:12;5071:52;5159:9;5146:23;5192:18;5184:6;5181:30;5178:50;;;5224:1;5221;5214:12;5178:50;5263:70;5325:7;5316:6;5305:9;5301:22;5263:70;:::i;:::-;5352:8;;5237:96;;-1:-1:-1;4956:437:1;-1:-1:-1;;;;4956:437:1:o;5398:773::-;5520:6;5528;5536;5544;5597:2;5585:9;5576:7;5572:23;5568:32;5565:52;;;5613:1;5610;5603:12;5565:52;5653:9;5640:23;5682:18;5723:2;5715:6;5712:14;5709:34;;;5739:1;5736;5729:12;5709:34;5778:70;5840:7;5831:6;5820:9;5816:22;5778:70;:::i;:::-;5867:8;;-1:-1:-1;5752:96:1;-1:-1:-1;5955:2:1;5940:18;;5927:32;;-1:-1:-1;5971:16:1;;;5968:36;;;6000:1;5997;5990:12;5968:36;;6039:72;6103:7;6092:8;6081:9;6077:24;6039:72;:::i;:::-;5398:773;;;;-1:-1:-1;6130:8:1;-1:-1:-1;;;;5398:773:1:o;6954:245::-;7012:6;7065:2;7053:9;7044:7;7040:23;7036:32;7033:52;;;7081:1;7078;7071:12;7033:52;7120:9;7107:23;7139:30;7163:5;7139:30;:::i;7204:249::-;7273:6;7326:2;7314:9;7305:7;7301:23;7297:32;7294:52;;;7342:1;7339;7332:12;7294:52;7374:9;7368:16;7393:30;7417:5;7393:30;:::i;7458:410::-;7529:6;7537;7590:2;7578:9;7569:7;7565:23;7561:32;7558:52;;;7606:1;7603;7596:12;7558:52;7646:9;7633:23;7679:18;7671:6;7668:30;7665:50;;;7711:1;7708;7701:12;7665:50;7750:58;7800:7;7791:6;7780:9;7776:22;7750:58;:::i;7873:719::-;7965:6;7973;7981;7989;8042:2;8030:9;8021:7;8017:23;8013:32;8010:52;;;8058:1;8055;8048:12;8010:52;8098:9;8085:23;8127:18;8168:2;8160:6;8157:14;8154:34;;;8184:1;8181;8174:12;8154:34;8223:58;8273:7;8264:6;8253:9;8249:22;8223:58;:::i;:::-;8300:8;;-1:-1:-1;8197:84:1;-1:-1:-1;8388:2:1;8373:18;;8360:32;;-1:-1:-1;8404:16:1;;;8401:36;;;8433:1;8430;8423:12;8401:36;;8472:60;8524:7;8513:8;8502:9;8498:24;8472:60;:::i;8597:180::-;8656:6;8709:2;8697:9;8688:7;8684:23;8680:32;8677:52;;;8725:1;8722;8715:12;8677:52;-1:-1:-1;8748:23:1;;8597:180;-1:-1:-1;8597:180:1:o;8782:316::-;8823:3;8861:5;8855:12;8888:6;8883:3;8876:19;8904:63;8960:6;8953:4;8948:3;8944:14;8937:4;8930:5;8926:16;8904:63;:::i;:::-;9012:2;9000:15;9017:66;8996:88;8987:98;;;;9087:4;8983:109;;8782:316;-1:-1:-1;;8782:316:1:o;9103:1088::-;9188:12;;9153:3;;9243:1;9263:18;;;;9316;;;;9343:61;;9397:4;9389:6;9385:17;9375:27;;9343:61;9423:2;9471;9463:6;9460:14;9440:18;9437:38;9434:218;;;9508:77;9505:1;9498:88;9609:4;9606:1;9599:15;9637:4;9634:1;9627:15;9434:218;9668:18;9695:162;;;;9871:1;9866:319;;;;9661:524;;9695:162;-1:-1:-1;;9732:9:1;9728:82;9723:3;9716:95;9840:6;9835:3;9831:16;9824:23;;9695:162;;9866:319;22857:1;22850:14;;;22894:4;22881:18;;9960:1;9974:165;9988:6;9985:1;9982:13;9974:165;;;10066:14;;10053:11;;;10046:35;10109:16;;;;10003:10;;9974:165;;;9978:3;;10168:6;10163:3;10159:16;10152:23;;9661:524;;;;;;;9103:1088;;;;:::o;10196:456::-;10417:3;10445:38;10479:3;10471:6;10445:38;:::i;:::-;10512:6;10506:13;10528:52;10573:6;10569:2;10562:4;10554:6;10550:17;10528:52;:::i;:::-;10596:50;10638:6;10634:2;10630:15;10622:6;10596:50;:::i;:::-;10589:57;10196:456;-1:-1:-1;;;;;;;10196:456:1:o;11098:511::-;11292:4;-1:-1:-1;;;;;11402:2:1;11394:6;11390:15;11379:9;11372:34;11454:2;11446:6;11442:15;11437:2;11426:9;11422:18;11415:43;;11494:6;11489:2;11478:9;11474:18;11467:34;11537:3;11532:2;11521:9;11517:18;11510:31;11558:45;11598:3;11587:9;11583:19;11575:6;11558:45;:::i;:::-;11550:53;11098:511;-1:-1:-1;;;;;;11098:511:1:o;11614:632::-;11785:2;11837:21;;;11907:13;;11810:18;;;11929:22;;;11756:4;;11785:2;12008:15;;;;11982:2;11967:18;;;11756:4;12051:169;12065:6;12062:1;12059:13;12051:169;;;12126:13;;12114:26;;12195:15;;;;12160:12;;;;12087:1;12080:9;12051:169;;;-1:-1:-1;12237:3:1;;11614:632;-1:-1:-1;;;;;;11614:632:1:o;12443:219::-;12592:2;12581:9;12574:21;12555:4;12612:44;12652:2;12641:9;12637:18;12629:6;12612:44;:::i;22910:128::-;22950:3;22981:1;22977:6;22974:1;22971:13;22968:39;;;22987:18;;:::i;:::-;-1:-1:-1;23023:9:1;;22910:128::o;23043:120::-;23083:1;23109;23099:35;;23114:18;;:::i;:::-;-1:-1:-1;23148:9:1;;23043:120::o;23168:228::-;23208:7;23334:1;23266:66;23262:74;23259:1;23256:81;23251:1;23244:9;23237:17;23233:105;23230:131;;;23341:18;;:::i;:::-;-1:-1:-1;23381:9:1;;23168:228::o;23401:125::-;23441:4;23469:1;23466;23463:8;23460:34;;;23474:18;;:::i;:::-;-1:-1:-1;23511:9:1;;23401:125::o;23531:258::-;23603:1;23613:113;23627:6;23624:1;23621:13;23613:113;;;23703:11;;;23697:18;23684:11;;;23677:39;23649:2;23642:10;23613:113;;;23744:6;23741:1;23738:13;23735:48;;;-1:-1:-1;;23779:1:1;23761:16;;23754:27;23531:258::o;23794:196::-;23833:3;23861:5;23851:39;;23870:18;;:::i;:::-;-1:-1:-1;23917:66:1;23906:78;;23794:196::o;23995:437::-;24074:1;24070:12;;;;24117;;;24138:61;;24192:4;24184:6;24180:17;24170:27;;24138:61;24245:2;24237:6;24234:14;24214:18;24211:38;24208:218;;;24282:77;24279:1;24272:88;24383:4;24380:1;24373:15;24411:4;24408:1;24401:15;24208:218;;23995:437;;;:::o;24437:195::-;24476:3;24507:66;24500:5;24497:77;24494:103;;;24577:18;;:::i;:::-;-1:-1:-1;24624:1:1;24613:13;;24437:195::o;24637:112::-;24669:1;24695;24685:35;;24700:18;;:::i;:::-;-1:-1:-1;24734:9:1;;24637:112::o;24754:184::-;24806:77;24803:1;24796:88;24903:4;24900:1;24893:15;24927:4;24924:1;24917:15;24943:184;24995:77;24992:1;24985:88;25092:4;25089:1;25082:15;25116:4;25113:1;25106:15;25132:184;25184:77;25181:1;25174:88;25281:4;25278:1;25271:15;25305:4;25302:1;25295:15;25321:184;25373:77;25370:1;25363:88;25470:4;25467:1;25460:15;25494:4;25491:1;25484:15;25510:177;25595:66;25588:5;25584:78;25577:5;25574:89;25564:117;;25677:1;25674;25667:12
Swarm Source
ipfs://de36d23f95df564c19ef90ebb23c743f1de1a5b32fc916afbdcd1dd8b254faad
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.