ERC-721
NFT
Overview
Max Total Supply
5,555 LO
Holders
2,936
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 LOLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LO
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-03 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; /** * @title LoFi Originals * @author The Core Devs (@TheCoreDevs) */ // File: contracts/Ownable.sol /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. * * Source: openzeppelin */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(msg.sender); } /** * @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() == msg.sender, "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() external 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) external 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: Strings.sol /** * Source: Openzeppelin */ /** * @dev String operations. */ library Strings { /** * @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); } } // File: ECDSA.sol // OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol) /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File: Address.sol0 /** * Source: Openzeppelin */ /** * @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; } } // File: IERC721Receiver.sol /** * @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: IERC165.sol // https://eips.ethereum.org/EIPS/eip-165 interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); } // File: IERC2981.sol /** * Source: Openzeppelin */ /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: ERC165.sol /** * Source: Openzeppelin */ /** * @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: IERC721.sol // https://eips.ethereum.org/EIPS/eip-721, http://erc721.org/ /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. interface IERC721 is IERC165 { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) external view returns (uint256); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) external view returns (address); /// @notice Transfers the ownership of an NFT from one address to another address /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. When transfer is complete, this function /// checks if `_to` is a smart contract (code size > 0). If so, it calls /// `onERC721Received` on `_to` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "". /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function safeTransferFrom(address _from, address _to, uint256 _tokenId) external; /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom(address _from, address _to, uint256 _tokenId) external; /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _approved The new approved NFT controller /// @param _tokenId The NFT to approve function approve(address _approved, uint256 _tokenId) external; /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @notice Get the approved address for a single NFT /// @dev Throws if `_tokenId` is not a valid NFT. /// @param _tokenId The NFT to find the approved address for /// @return The approved address for this NFT, or the zero address if there is none function getApproved(uint256 _tokenId) external view returns (address); /// @notice Query if an address is an authorized operator for another address /// @param _owner The address that owns the NFTs /// @param _operator The address that acts on behalf of the owner /// @return True if `_operator` is an approved operator for `_owner`, false otherwise function isApprovedForAll(address _owner, address _operator) external view returns (bool); } // File: IERC721Metadata.sol /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: ERC721.sol /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension * Made for efficiancy! */ contract ERC721 is ERC165, IERC721, IERC721Metadata, Ownable { using Address for address; using Strings for uint256; uint16 public totalSupply; address public proxyRegistryAddress; string public baseURI; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping owner address to token count mapping(address => uint256) internal _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(address _openseaProxyRegistry, string memory _baseURI) { proxyRegistryAddress = _openseaProxyRegistry; baseURI = _baseURI; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) external view override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() external pure override returns (string memory) { return "Lofi Originals"; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() external pure override returns (string memory) { return "LO"; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) external view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(baseURI, tokenId.toString(), ".json")); } function setBaseURI(string memory uri) external onlyOwner { baseURI = uri; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) external override { address owner = _owners[tokenId]; require(to != owner, "ERC721: approval to current owner"); require( msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) external override { _setApprovalForAll(msg.sender, operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { // Whitelist OpenSea proxy contract for easy trading. ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(owner)) == operator) { return true; } return _operatorApprovals[owner][operator]; } function setOpenseaProxyRegistry(address addr) external onlyOwner { proxyRegistryAddress = addr; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) external override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = _owners[tokenId]; return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(uint256 amount, address to, uint tokenId) internal { _balances[to] += amount; for (uint i; i < amount; i++) { tokenId++; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } totalSupply += uint16(amount); require( _checkOnERC721Received(address(0), to, tokenId, ""), "ERC721: transfer to non ERC721Receiver implementer" ); // checking it once will make sure that the address can recieve NFTs } function _mint(address to, uint tokenId) internal { _balances[to]++; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); totalSupply++; require( _checkOnERC721Received(address(0), to, tokenId, ""), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(_owners[tokenId] == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from]--; _balances[to]++; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) internal returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(msg.sender, 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; } } } contract OwnableDelegateProxy {} contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } // File: LO.sol contract LO is Ownable, IERC2981, ERC721 { bool private _onlyWhiteList; bool private _mintingEnabled; uint private EIP2981RoyaltyPercent; mapping (address => uint8) public amountPreMinted; mapping (address => uint8) public amountMinted; constructor( uint _royalty, address _openseaProxyRegistry, string memory _tempBaseURI ) ERC721(_openseaProxyRegistry, _tempBaseURI) { EIP2981RoyaltyPercent = _royalty; } function mintFromReserve(uint amount, address to) external onlyOwner { uint tokenId = totalSupply; require(amount + tokenId < 5556); _mint(amount, to, tokenId); } function batchMintFromReserve(uint[] memory amount, address[] memory to) external onlyOwner { uint length = amount.length; require(length == to.length, "array length missmatch"); uint tokenId = totalSupply; uint total; uint cAmount; address cTo; for (uint i; i < length; i++) { assembly { cAmount := mload(add(add(amount, 0x20), mul(i, 0x20))) cTo := mload(add(add(to, 0x20), mul(i, 0x20))) } require(!Address.isContract(cTo), "Cannot mint to contracts!"); _balances[cTo] += cAmount; for (uint f; f < cAmount; f++) { tokenId++; _owners[tokenId] = cTo; emit Transfer(address(0), cTo, tokenId); } total += cAmount; } require(tokenId < 5556, "Exceeds reserve!"); totalSupply += uint16(total); } function mint(uint256 amount) external payable { require(_mintingEnabled, "Minting is not enabled!"); uint tokenId = totalSupply; require(amount + tokenId < 5556, "Request exceeds max supply!"); require(amount + amountMinted[msg.sender] < 3 && amount != 0, "Request exceeds max per wallet!"); require(msg.value == amount * 9e16, "ETH Amount is not correct!"); amountMinted[msg.sender] += uint8(amount); _mint(amount, msg.sender, tokenId); } function famMint(bytes calldata sig) external payable { require(_onlyWhiteList, "Minting is not enabled!"); require(_checkFamSig(msg.sender, sig), "User not whitelisted!"); uint tokenId = totalSupply + 1; require(tokenId < 5556, "Request exceeds max supply!"); require(amountPreMinted[msg.sender] == 0, "Request exceeds max per wallet!"); require(msg.value == 9e16, "ETH Amount is not correct!"); amountPreMinted[msg.sender]++; _mint(msg.sender, tokenId); } function ogMint(bytes calldata sig, uint256 amount) external payable { require(_onlyWhiteList, "Minting is not enabled!"); require(_checkOgSig(msg.sender, sig), "User not whitelisted!"); uint tokenId = totalSupply; require(amount + tokenId < 5556, "Request exceeds max supply!"); require(amount + amountPreMinted[msg.sender] < 3 && amount != 0, "Request exceeds max per wallet!"); require(msg.value == amount * 9e16, "ETH Amount is not correct!"); amountPreMinted[msg.sender] += uint8(amount); _mint(amount, msg.sender, tokenId); } function _checkOgSig(address _wallet, bytes memory _signature) private view returns(bool) { return ECDSA.recover( ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(_wallet, "OG"))), _signature ) == owner(); } function _checkFamSig(address _wallet, bytes memory _signature) private view returns(bool) { return ECDSA.recover( ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(_wallet, "FAM"))), _signature ) == owner(); } function getOgMsg(address _wallet) external pure returns(bytes32) { return keccak256(abi.encodePacked(_wallet, "OG")); } function getFamMsg(address _wallet) external pure returns(bytes32) { return keccak256(abi.encodePacked(_wallet, "FAM")); } function getSalesStatus() external view returns(bool onlyWhitelist, bool mintingEnabled) { onlyWhitelist = _onlyWhiteList; mintingEnabled = _mintingEnabled; } /** * @notice returns royalty info for EIP2981 supporting marketplaces * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint tokenId, uint salePrice) external view override returns(address receiver, uint256 royaltyAmount) { require(_exists(tokenId), "Royality querry for non-existant token!"); return(owner(), salePrice * EIP2981RoyaltyPercent / 10000); } /** * @notice sets the royalty percentage for EIP2981 supporting marketplaces * @dev percentage is in bassis points (parts per 10,000). Example: 5% = 500, 0.5% = 50 * @param amount - percent amount */ function setRoyaltyPercent(uint256 amount) external onlyOwner { EIP2981RoyaltyPercent = amount; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } function withdraw() onlyOwner external { uint bal = address(this).balance; bool success; (success, ) = payable(msg.sender).call{value: (bal * 92) / 100, gas: 3000}(""); require(success, "Transfer to contract owner failed!"); (success, ) = payable(0xFab795b3e736C4323103a3ADAa901cc5a43646fE).call{value: ((bal * 8) / 100), gas: 3000}(""); require(success, "Transfer to core devs failed!"); } /** * @notice toggles pre sale * @dev enables the pre sale functions. NEVER USE THIS AFTER ENABLING THE PUBLIC SALE FUNCTIONS UNLESS ITS NECESSARY */ function togglePresale() external onlyOwner { _onlyWhiteList = !_onlyWhiteList; } /** * @notice toggles the public sale * @dev enables/disables public sale functions and disables pre sale functions */ function togglePublicSale() external onlyOwner { _onlyWhiteList = false; _mintingEnabled = !_mintingEnabled; } function tokensOfOwner(address owner) external view returns(uint[] memory) { uint[] memory tokens = new uint[](_balances[owner]); uint y = totalSupply + 1; uint x; for (uint i = 1; i < y; i++) { if (ownerOf(i) == owner) { tokens[x] = i; x++; } } return tokens; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_royalty","type":"uint256"},{"internalType":"address","name":"_openseaProxyRegistry","type":"address"},{"internalType":"string","name":"_tempBaseURI","type":"string"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"amountMinted","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountPreMinted","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"address[]","name":"to","type":"address[]"}],"name":"batchMintFromReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"famMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getFamMsg","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getOgMsg","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getSalesStatus","outputs":[{"internalType":"bool","name":"onlyWhitelist","type":"bool"},{"internalType":"bool","name":"mintingEnabled","type":"bool"}],"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":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintFromReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ogMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setOpenseaProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRoyaltyPercent","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":"pure","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200416338038062004163833981016040819052620000349162000179565b8181620000413362000083565b600180546001600160a01b0319166001600160a01b038416179055805162000071906002906020840190620000d3565b50505060089290925550620002d69050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000e19062000283565b90600052602060002090601f01602090048101928262000105576000855562000150565b82601f106200012057805160ff191683800117855562000150565b8280016001018555821562000150579182015b828111156200015057825182559160200191906001019062000133565b506200015e92915062000162565b5090565b5b808211156200015e576000815560010162000163565b6000806000606084860312156200018f57600080fd5b8351602080860151919450906001600160a01b0381168114620001b157600080fd5b60408601519093506001600160401b0380821115620001cf57600080fd5b818701915087601f830112620001e457600080fd5b815181811115620001f957620001f9620002c0565b604051601f8201601f19908116603f01168101908382118183101715620002245762000224620002c0565b816040528281528a868487010111156200023d57600080fd5b600093505b8284101562000261578484018601518185018701529285019262000242565b82841115620002735760008684830101525b8096505050505050509250925092565b600181811c908216806200029857607f821691505b60208210811415620002ba57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613e7d80620002e66000396000f3fe60806040526004361061026a5760003560e01c8063715018a611610153578063adb03e4f116100cb578063c87b56dd1161007f578063e222c7f911610064578063e222c7f914610783578063e985e9c514610798578063f2fde38b146107b857600080fd5b8063c87b56dd14610743578063cd7c03261461076357600080fd5b8063b88d4fde116100b0578063b88d4fde146106e3578063bd2f524414610703578063c5fcf2341461072357600080fd5b8063adb03e4f146106a3578063b30760dc146106c357600080fd5b806395d89b41116101225780639a4fc640116101075780639a4fc64014610650578063a0712d6814610670578063a22cb4651461068357600080fd5b806395d89b41146105ea578063984f39131461063057600080fd5b8063715018a6146105575780638462151c1461056c5780638b2c92ab146105995780638da5cb5b146105cc57600080fd5b806335fb7469116101e657806355f804b3116101b55780636352211e1161019a5780636352211e146104f45780636c0360eb1461051457806370a082311461052957600080fd5b806355f804b3146104c1578063607019b9146104e157600080fd5b806335fb7469146104495780633ccfd60b1461045c57806342842e0e14610471578063438a67e71461049157600080fd5b806318160ddd1161023d57806323b872dd1161022257806323b872dd146103d55780632a55205a146103f5578063343937431461043457600080fd5b806318160ddd1461034d57806320d45c4c1461039357600080fd5b806301ffc9a71461026f57806306fdde03146102a4578063081812fc146102f3578063095ea7b31461032b575b600080fd5b34801561027b57600080fd5b5061028f61028a366004613706565b6107d8565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5060408051808201909152600e81527f4c6f6669204f726967696e616c7300000000000000000000000000000000000060208201525b60405161029b9190613a84565b3480156102ff57600080fd5b5061031361030e366004613834565b610834565b6040516001600160a01b03909116815260200161029b565b34801561033757600080fd5b5061034b61034636600461361a565b6108df565b005b34801561035957600080fd5b506000546103809074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff909116815260200161029b565b34801561039f57600080fd5b506103c36103ae3660046134c9565b60096020526000908152604090205460ff1681565b60405160ff909116815260200161029b565b3480156103e157600080fd5b5061034b6103f0366004613526565b610a0e565b34801561040157600080fd5b50610415610410366004613872565b610a95565b604080516001600160a01b03909316835260208301919091520161029b565b34801561044057600080fd5b5061034b610b54565b61034b610457366004613740565b610bef565b34801561046857600080fd5b5061034b610e47565b34801561047d57600080fd5b5061034b61048c366004613526565b611055565b34801561049d57600080fd5b506103c36104ac3660046134c9565b600a6020526000908152604090205460ff1681565b3480156104cd57600080fd5b5061034b6104dc3660046137eb565b611070565b61034b6104ef366004613782565b6110ec565b34801561050057600080fd5b5061031361050f366004613834565b611366565b34801561052057600080fd5b506102e66113f1565b34801561053557600080fd5b506105496105443660046134c9565b61147f565b60405190815260200161029b565b34801561056357600080fd5b5061034b611519565b34801561057857600080fd5b5061058c6105873660046134c9565b61158e565b60405161029b9190613a40565b3480156105a557600080fd5b5060075460ff8082169161010090041660408051921515835290151560208301520161029b565b3480156105d857600080fd5b506000546001600160a01b0316610313565b3480156105f657600080fd5b5060408051808201909152600281527f4c4f00000000000000000000000000000000000000000000000000000000000060208201526102e6565b34801561063c57600080fd5b5061034b61064b366004613646565b611699565b34801561065c57600080fd5b5061034b61066b366004613834565b611969565b61034b61067e366004613834565b6119d7565b34801561068f57600080fd5b5061034b61069e3660046135e7565b611bc4565b3480156106af57600080fd5b5061034b6106be36600461384d565b611bcf565b3480156106cf57600080fd5b506105496106de3660046134c9565b611c79565b3480156106ef57600080fd5b5061034b6106fe366004613567565b611cf2565b34801561070f57600080fd5b5061034b61071e3660046134c9565b611d7a565b34801561072f57600080fd5b5061054961073e3660046134c9565b611e1d565b34801561074f57600080fd5b506102e661075e366004613834565b611e7d565b34801561076f57600080fd5b50600154610313906001600160a01b031681565b34801561078f57600080fd5b5061034b611f3c565b3480156107a457600080fd5b5061028f6107b33660046134ed565b612000565b3480156107c457600080fd5b5061034b6107d33660046134c9565b6120e7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061082e575061082e826121d8565b92915050565b6000818152600360205260408120546001600160a01b03166108c35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000818152600360205260409020546001600160a01b039081169083168114156109715760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016108ba565b336001600160a01b038216148061098d575061098d8133612000565b6109ff5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108ba565b610a0983836122bb565b505050565b610a183382612341565b610a8a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108ba565b610a09838383612426565b60008281526003602052604081205481906001600160a01b0316610b215760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e210000000000000000000000000000000000000000000000000060648201526084016108ba565b6000546001600160a01b031661271060085485610b3e9190613b81565b610b489190613b6d565b915091505b9250929050565b33610b676000546001600160a01b031690565b6001600160a01b031614610bbd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b60075460ff16610c415760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c65642100000000000000000060448201526064016108ba565b610c813383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061260192505050565b610ccd5760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c697374656421000000000000000000000060448201526064016108ba565b60008054610cf89074010000000000000000000000000000000000000000900461ffff166001613b0a565b61ffff1690506115b48110610d4f5760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108ba565b3360009081526009602052604090205460ff1615610daf5760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c6574210060448201526064016108ba565b3467013fbe85edc9000014610e065760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108ba565b336000908152600960205260408120805460ff1691610e2483613ce5565b91906101000a81548160ff021916908360ff16021790555050610a0933826126a4565b33610e5a6000546001600160a01b031690565b6001600160a01b031614610eb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b476000336064610ec184605c613b81565b610ecb9190613b6d565b604051610bb891906000818181858888f193505050503d8060008114610f0d576040519150601f19603f3d011682016040523d82523d6000602084013e610f12565b606091505b50508091505080610f8b5760405162461bcd60e51b815260206004820152602260248201527f5472616e7366657220746f20636f6e7472616374206f776e6572206661696c6560448201527f642100000000000000000000000000000000000000000000000000000000000060648201526084016108ba565b73fab795b3e736c4323103a3adaa901cc5a43646fe6064610fad846008613b81565b610fb79190613b6d565b604051610bb891906000818181858888f193505050503d8060008114610ff9576040519150601f19603f3d011682016040523d82523d6000602084013e610ffe565b606091505b505080915050806110515760405162461bcd60e51b815260206004820152601d60248201527f5472616e7366657220746f20636f72652064657673206661696c65642100000060448201526064016108ba565b5050565b610a0983838360405180602001604052806000815250611cf2565b336110836000546001600160a01b031690565b6001600160a01b0316146110d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b80516110519060029060208401906132fd565b60075460ff1661113e5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c65642100000000000000000060448201526064016108ba565b61117e3384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061280f92505050565b6111ca5760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c697374656421000000000000000000000060448201526064016108ba565b60005474010000000000000000000000000000000000000000900461ffff166115b46111f68284613b30565b106112435760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108ba565b336000908152600960205260409020546003906112639060ff1684613b30565b10801561126f57508115155b6112bb5760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c6574210060448201526064016108ba565b6112cd8267013fbe85edc90000613b81565b341461131b5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108ba565b336000908152600960205260408120805484929061133d90849060ff16613b48565b92506101000a81548160ff021916908360ff160217905550611360823383612884565b50505050565b6000818152600360205260408120546001600160a01b03168061082e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016108ba565b600280546113fe90613c36565b80601f016020809104026020016040519081016040528092919081815260200182805461142a90613c36565b80156114775780601f1061144c57610100808354040283529160200191611477565b820191906000526020600020905b81548152906001019060200180831161145a57829003601f168201915b505050505081565b60006001600160a01b0382166114fd5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016108ba565b506001600160a01b031660009081526004602052604090205490565b3361152c6000546001600160a01b031690565b6001600160a01b0316146115825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b61158c6000612a12565b565b6001600160a01b0381166000908152600460205260408120546060919067ffffffffffffffff8111156115c3576115c3613dd5565b6040519080825280602002602001820160405280156115ec578160200160208202803683370190505b50600080549192509061161c9074010000000000000000000000000000000000000000900461ffff166001613b0a565b61ffff169050600060015b8281101561168f57856001600160a01b031661164282611366565b6001600160a01b0316141561167d578084838151811061166457611664613da6565b60209081029190910101528161167981613cac565b9250505b8061168781613cac565b915050611627565b5091949350505050565b336116ac6000546001600160a01b031690565b6001600160a01b0316146117025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b8151815181146117545760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e677468206d6973736d617463680000000000000000000060448201526064016108ba565b6000805474010000000000000000000000000000000000000000900461ffff16908080805b858110156118d5576020810260208901015192506020810260208801015191506117a3823b151590565b156117f05760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74206d696e7420746f20636f6e747261637473210000000000000060448201526064016108ba565b6001600160a01b03821660009081526004602052604081208054859290611818908490613b30565b90915550600090505b838110156118b6578561183381613cac565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929950899350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4806118ae81613cac565b915050611821565b506118c18385613b30565b9350806118cd81613cac565b915050611779565b506115b484106119275760405162461bcd60e51b815260206004820152601060248201527f457863656564732072657365727665210000000000000000000000000000000060448201526064016108ba565b82600060148282829054906101000a900461ffff166119469190613b0a565b92506101000a81548161ffff021916908361ffff16021790555050505050505050565b3361197c6000546001600160a01b031690565b6001600160a01b0316146119d25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b600855565b600754610100900460ff16611a2e5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c65642100000000000000000060448201526064016108ba565b60005474010000000000000000000000000000000000000000900461ffff166115b4611a5a8284613b30565b10611aa75760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108ba565b336000908152600a6020526040902054600390611ac79060ff1684613b30565b108015611ad357508115155b611b1f5760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c6574210060448201526064016108ba565b611b318267013fbe85edc90000613b81565b3414611b7f5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108ba565b336000908152600a602052604081208054849290611ba190849060ff16613b48565b92506101000a81548160ff021916908360ff160217905550611051823383612884565b611051338383612a7a565b33611be26000546001600160a01b031690565b6001600160a01b031614611c385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b60005474010000000000000000000000000000000000000000900461ffff166115b4611c648285613b30565b10611c6e57600080fd5b610a09838383612884565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660208201527f46414d000000000000000000000000000000000000000000000000000000000060348201526000906037015b604051602081830303815290604052805190602001209050919050565b611cfc3383612341565b611d6e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108ba565b61136084848484612b67565b33611d8d6000546001600160a01b031690565b6001600160a01b031614611de35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660208201527f4f470000000000000000000000000000000000000000000000000000000000006034820152600090603601611cd5565b6000818152600360205260409020546060906001600160a01b0316611f0a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016108ba565b6002611f1583612bf0565b604051602001611f269291906138fa565b6040516020818303038152906040529050919050565b33611f4f6000546001600160a01b031690565b6001600160a01b031614611fa55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b600780546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821681900460ff1615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909116179055565b6001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561206657600080fd5b505afa15801561207a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209e91906137ce565b6001600160a01b031614156120b757600191505061082e565b50506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b336120fa6000546001600160a01b031690565b6001600160a01b0316146121505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b6001600160a01b0381166121cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108ba565b6121d581612a12565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061226b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061082e57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461082e565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061230882611366565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166123cb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016108ba565b6000828152600360205260409020546001600160a01b0390811690841681148061240e5750836001600160a01b031661240384610834565b6001600160a01b0316145b8061241e575061241e8185612000565b949350505050565b6000818152600360205260409020546001600160a01b038481169116146124b55760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016108ba565b6001600160a01b0382166125305760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108ba565b61253b6000826122bb565b6001600160a01b038316600090815260046020526040812080549161255f83613c01565b90915550506001600160a01b038216600090815260046020526040812080549161258883613cac565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b1660208201527f46414d000000000000000000000000000000000000000000000000000000000060348201526001600160a01b03909116906126939061268d906037015b60405160208183030381529060405280519060200120612d22565b84612d5d565b6001600160a01b0316149392505050565b6001600160a01b03821660009081526004602052604081208054916126c883613cac565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46000805474010000000000000000000000000000000000000000900461ffff1690601461276683613c8a565b91906101000a81548161ffff021916908361ffff1602179055505061279d6000838360405180602001604052806000815250612d81565b6110515760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108ba565b600080546040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b1660208201527f4f4700000000000000000000000000000000000000000000000000000000000060348201526001600160a01b03909116906126939061268d90603601612672565b6001600160a01b038216600090815260046020526040812080548592906128ac908490613b30565b90915550600090505b8381101561294a57816128c781613cac565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929550859350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061294281613cac565b9150506128b5565b5082600060148282829054906101000a900461ffff1661296a9190613b0a565b92506101000a81548161ffff021916908361ffff1602179055506129a06000838360405180602001604052806000815250612d81565b610a095760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108ba565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415612adc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108ba565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612b72848484612426565b612b7e84848484612d81565b6113605760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108ba565b606081612c3057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c5a5780612c4481613cac565b9150612c539050600a83613b6d565b9150612c34565b60008167ffffffffffffffff811115612c7557612c75613dd5565b6040519080825280601f01601f191660200182016040528015612c9f576020820181803683370190505b5090505b841561241e57612cb4600183613bbe565b9150612cc1600a86613d05565b612ccc906030613b30565b60f81b818381518110612ce157612ce1613da6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d1b600a86613b6d565b9450612ca3565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01611cd5565b6000806000612d6c8585612f4c565b91509150612d7981612fb9565b509392505050565b60006001600160a01b0384163b15612f41576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612dde903390899088908890600401613a04565b602060405180830381600087803b158015612df857600080fd5b505af1925050508015612e46575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612e4391810190613723565b60015b612ef6573d808015612e74576040519150601f19603f3d011682016040523d82523d6000602084013e612e79565b606091505b508051612eee5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108ba565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061241e565b506001949350505050565b600080825160411415612f835760208301516040840151606085015160001a612f77878285856131aa565b94509450505050610b4d565b825160401415612fad5760208301516040840151612fa28683836132b5565b935093505050610b4d565b50600090506002610b4d565b6000816004811115612fcd57612fcd613d77565b1415612fd65750565b6001816004811115612fea57612fea613d77565b14156130385760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108ba565b600281600481111561304c5761304c613d77565b141561309a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108ba565b60038160048111156130ae576130ae613d77565b14156131225760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108ba565b600481600481111561313657613136613d77565b14156121d55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108ba565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156131e157506000905060036132ac565b8460ff16601b141580156131f957508460ff16601c14155b1561320a57506000905060046132ac565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561325e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166132a5576000600192509250506132ac565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016132ef878288856131aa565b935093505050935093915050565b82805461330990613c36565b90600052602060002090601f01602090048101928261332b5760008555613371565b82601f1061334457805160ff1916838001178555613371565b82800160010185558215613371579182015b82811115613371578251825591602001919060010190613356565b5061337d929150613381565b5090565b5b8082111561337d5760008155600101613382565b600067ffffffffffffffff8311156133b0576133b0613dd5565b6133e160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613a97565b90508281528383830111156133f557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261341d57600080fd5b8135602061343261342d83613ae6565b613a97565b80838252828201915082860187848660051b890101111561345257600080fd5b60005b8581101561347a57813561346881613e04565b84529284019290840190600101613455565b5090979650505050505050565b60008083601f84011261349957600080fd5b50813567ffffffffffffffff8111156134b157600080fd5b602083019150836020828501011115610b4d57600080fd5b6000602082840312156134db57600080fd5b81356134e681613e04565b9392505050565b6000806040838503121561350057600080fd5b823561350b81613e04565b9150602083013561351b81613e04565b809150509250929050565b60008060006060848603121561353b57600080fd5b833561354681613e04565b9250602084013561355681613e04565b929592945050506040919091013590565b6000806000806080858703121561357d57600080fd5b843561358881613e04565b9350602085013561359881613e04565b925060408501359150606085013567ffffffffffffffff8111156135bb57600080fd5b8501601f810187136135cc57600080fd5b6135db87823560208401613396565b91505092959194509250565b600080604083850312156135fa57600080fd5b823561360581613e04565b91506020830135801515811461351b57600080fd5b6000806040838503121561362d57600080fd5b823561363881613e04565b946020939093013593505050565b6000806040838503121561365957600080fd5b823567ffffffffffffffff8082111561367157600080fd5b818501915085601f83011261368557600080fd5b8135602061369561342d83613ae6565b8083825282820191508286018a848660051b89010111156136b557600080fd5b600096505b848710156136d85780358352600196909601959183019183016136ba565b50965050860135925050808211156136ef57600080fd5b506136fc8582860161340c565b9150509250929050565b60006020828403121561371857600080fd5b81356134e681613e19565b60006020828403121561373557600080fd5b81516134e681613e19565b6000806020838503121561375357600080fd5b823567ffffffffffffffff81111561376a57600080fd5b61377685828601613487565b90969095509350505050565b60008060006040848603121561379757600080fd5b833567ffffffffffffffff8111156137ae57600080fd5b6137ba86828701613487565b909790965060209590950135949350505050565b6000602082840312156137e057600080fd5b81516134e681613e04565b6000602082840312156137fd57600080fd5b813567ffffffffffffffff81111561381457600080fd5b8201601f8101841361382557600080fd5b61241e84823560208401613396565b60006020828403121561384657600080fd5b5035919050565b6000806040838503121561386057600080fd5b82359150602083013561351b81613e04565b6000806040838503121561388557600080fd5b50508035926020909101359150565b600081518084526138ac816020860160208601613bd5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516138f0818560208601613bd5565b9290920192915050565b600080845481600182811c91508083168061391657607f831692505b602080841082141561394f577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156139635760018114613992576139bf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506139bf565b60008b81526020902060005b868110156139b75781548b82015290850190830161399e565b505084890196505b5050505050506139fb6139d282866138de565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613a366080830184613894565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613a7857835183529284019291840191600101613a5c565b50909695505050505050565b6020815260006134e66020830184613894565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613ade57613ade613dd5565b604052919050565b600067ffffffffffffffff821115613b0057613b00613dd5565b5060051b60200190565b600061ffff808316818516808303821115613b2757613b27613d19565b01949350505050565b60008219821115613b4357613b43613d19565b500190565b600060ff821660ff84168060ff03821115613b6557613b65613d19565b019392505050565b600082613b7c57613b7c613d48565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bb957613bb9613d19565b500290565b600082821015613bd057613bd0613d19565b500390565b60005b83811015613bf0578181015183820152602001613bd8565b838111156113605750506000910152565b600081613c1057613c10613d19565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680613c4a57607f821691505b60208210811415613c84577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600061ffff80831681811415613ca257613ca2613d19565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cde57613cde613d19565b5060010190565b600060ff821660ff811415613cfc57613cfc613d19565b60010192915050565b600082613d1457613d14613d48565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b03811681146121d557600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146121d557600080fdfea2646970667358221220c7fc9be07d44a2042a8ce16bf2ccabeee956134582ff5daf73c60e092ec9941d64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000028a0000000000000000000000004d027fdb3022fb33601276fda40f390d70bc19470000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d6267506e7232563977426f3144414d6d6e727642655672547532366568763950775a546b5a686f57716257782f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061026a5760003560e01c8063715018a611610153578063adb03e4f116100cb578063c87b56dd1161007f578063e222c7f911610064578063e222c7f914610783578063e985e9c514610798578063f2fde38b146107b857600080fd5b8063c87b56dd14610743578063cd7c03261461076357600080fd5b8063b88d4fde116100b0578063b88d4fde146106e3578063bd2f524414610703578063c5fcf2341461072357600080fd5b8063adb03e4f146106a3578063b30760dc146106c357600080fd5b806395d89b41116101225780639a4fc640116101075780639a4fc64014610650578063a0712d6814610670578063a22cb4651461068357600080fd5b806395d89b41146105ea578063984f39131461063057600080fd5b8063715018a6146105575780638462151c1461056c5780638b2c92ab146105995780638da5cb5b146105cc57600080fd5b806335fb7469116101e657806355f804b3116101b55780636352211e1161019a5780636352211e146104f45780636c0360eb1461051457806370a082311461052957600080fd5b806355f804b3146104c1578063607019b9146104e157600080fd5b806335fb7469146104495780633ccfd60b1461045c57806342842e0e14610471578063438a67e71461049157600080fd5b806318160ddd1161023d57806323b872dd1161022257806323b872dd146103d55780632a55205a146103f5578063343937431461043457600080fd5b806318160ddd1461034d57806320d45c4c1461039357600080fd5b806301ffc9a71461026f57806306fdde03146102a4578063081812fc146102f3578063095ea7b31461032b575b600080fd5b34801561027b57600080fd5b5061028f61028a366004613706565b6107d8565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5060408051808201909152600e81527f4c6f6669204f726967696e616c7300000000000000000000000000000000000060208201525b60405161029b9190613a84565b3480156102ff57600080fd5b5061031361030e366004613834565b610834565b6040516001600160a01b03909116815260200161029b565b34801561033757600080fd5b5061034b61034636600461361a565b6108df565b005b34801561035957600080fd5b506000546103809074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff909116815260200161029b565b34801561039f57600080fd5b506103c36103ae3660046134c9565b60096020526000908152604090205460ff1681565b60405160ff909116815260200161029b565b3480156103e157600080fd5b5061034b6103f0366004613526565b610a0e565b34801561040157600080fd5b50610415610410366004613872565b610a95565b604080516001600160a01b03909316835260208301919091520161029b565b34801561044057600080fd5b5061034b610b54565b61034b610457366004613740565b610bef565b34801561046857600080fd5b5061034b610e47565b34801561047d57600080fd5b5061034b61048c366004613526565b611055565b34801561049d57600080fd5b506103c36104ac3660046134c9565b600a6020526000908152604090205460ff1681565b3480156104cd57600080fd5b5061034b6104dc3660046137eb565b611070565b61034b6104ef366004613782565b6110ec565b34801561050057600080fd5b5061031361050f366004613834565b611366565b34801561052057600080fd5b506102e66113f1565b34801561053557600080fd5b506105496105443660046134c9565b61147f565b60405190815260200161029b565b34801561056357600080fd5b5061034b611519565b34801561057857600080fd5b5061058c6105873660046134c9565b61158e565b60405161029b9190613a40565b3480156105a557600080fd5b5060075460ff8082169161010090041660408051921515835290151560208301520161029b565b3480156105d857600080fd5b506000546001600160a01b0316610313565b3480156105f657600080fd5b5060408051808201909152600281527f4c4f00000000000000000000000000000000000000000000000000000000000060208201526102e6565b34801561063c57600080fd5b5061034b61064b366004613646565b611699565b34801561065c57600080fd5b5061034b61066b366004613834565b611969565b61034b61067e366004613834565b6119d7565b34801561068f57600080fd5b5061034b61069e3660046135e7565b611bc4565b3480156106af57600080fd5b5061034b6106be36600461384d565b611bcf565b3480156106cf57600080fd5b506105496106de3660046134c9565b611c79565b3480156106ef57600080fd5b5061034b6106fe366004613567565b611cf2565b34801561070f57600080fd5b5061034b61071e3660046134c9565b611d7a565b34801561072f57600080fd5b5061054961073e3660046134c9565b611e1d565b34801561074f57600080fd5b506102e661075e366004613834565b611e7d565b34801561076f57600080fd5b50600154610313906001600160a01b031681565b34801561078f57600080fd5b5061034b611f3c565b3480156107a457600080fd5b5061028f6107b33660046134ed565b612000565b3480156107c457600080fd5b5061034b6107d33660046134c9565b6120e7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061082e575061082e826121d8565b92915050565b6000818152600360205260408120546001600160a01b03166108c35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000818152600360205260409020546001600160a01b039081169083168114156109715760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016108ba565b336001600160a01b038216148061098d575061098d8133612000565b6109ff5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108ba565b610a0983836122bb565b505050565b610a183382612341565b610a8a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108ba565b610a09838383612426565b60008281526003602052604081205481906001600160a01b0316610b215760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e210000000000000000000000000000000000000000000000000060648201526084016108ba565b6000546001600160a01b031661271060085485610b3e9190613b81565b610b489190613b6d565b915091505b9250929050565b33610b676000546001600160a01b031690565b6001600160a01b031614610bbd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b60075460ff16610c415760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c65642100000000000000000060448201526064016108ba565b610c813383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061260192505050565b610ccd5760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c697374656421000000000000000000000060448201526064016108ba565b60008054610cf89074010000000000000000000000000000000000000000900461ffff166001613b0a565b61ffff1690506115b48110610d4f5760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108ba565b3360009081526009602052604090205460ff1615610daf5760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c6574210060448201526064016108ba565b3467013fbe85edc9000014610e065760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108ba565b336000908152600960205260408120805460ff1691610e2483613ce5565b91906101000a81548160ff021916908360ff16021790555050610a0933826126a4565b33610e5a6000546001600160a01b031690565b6001600160a01b031614610eb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b476000336064610ec184605c613b81565b610ecb9190613b6d565b604051610bb891906000818181858888f193505050503d8060008114610f0d576040519150601f19603f3d011682016040523d82523d6000602084013e610f12565b606091505b50508091505080610f8b5760405162461bcd60e51b815260206004820152602260248201527f5472616e7366657220746f20636f6e7472616374206f776e6572206661696c6560448201527f642100000000000000000000000000000000000000000000000000000000000060648201526084016108ba565b73fab795b3e736c4323103a3adaa901cc5a43646fe6064610fad846008613b81565b610fb79190613b6d565b604051610bb891906000818181858888f193505050503d8060008114610ff9576040519150601f19603f3d011682016040523d82523d6000602084013e610ffe565b606091505b505080915050806110515760405162461bcd60e51b815260206004820152601d60248201527f5472616e7366657220746f20636f72652064657673206661696c65642100000060448201526064016108ba565b5050565b610a0983838360405180602001604052806000815250611cf2565b336110836000546001600160a01b031690565b6001600160a01b0316146110d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b80516110519060029060208401906132fd565b60075460ff1661113e5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c65642100000000000000000060448201526064016108ba565b61117e3384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061280f92505050565b6111ca5760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c697374656421000000000000000000000060448201526064016108ba565b60005474010000000000000000000000000000000000000000900461ffff166115b46111f68284613b30565b106112435760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108ba565b336000908152600960205260409020546003906112639060ff1684613b30565b10801561126f57508115155b6112bb5760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c6574210060448201526064016108ba565b6112cd8267013fbe85edc90000613b81565b341461131b5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108ba565b336000908152600960205260408120805484929061133d90849060ff16613b48565b92506101000a81548160ff021916908360ff160217905550611360823383612884565b50505050565b6000818152600360205260408120546001600160a01b03168061082e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016108ba565b600280546113fe90613c36565b80601f016020809104026020016040519081016040528092919081815260200182805461142a90613c36565b80156114775780601f1061144c57610100808354040283529160200191611477565b820191906000526020600020905b81548152906001019060200180831161145a57829003601f168201915b505050505081565b60006001600160a01b0382166114fd5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016108ba565b506001600160a01b031660009081526004602052604090205490565b3361152c6000546001600160a01b031690565b6001600160a01b0316146115825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b61158c6000612a12565b565b6001600160a01b0381166000908152600460205260408120546060919067ffffffffffffffff8111156115c3576115c3613dd5565b6040519080825280602002602001820160405280156115ec578160200160208202803683370190505b50600080549192509061161c9074010000000000000000000000000000000000000000900461ffff166001613b0a565b61ffff169050600060015b8281101561168f57856001600160a01b031661164282611366565b6001600160a01b0316141561167d578084838151811061166457611664613da6565b60209081029190910101528161167981613cac565b9250505b8061168781613cac565b915050611627565b5091949350505050565b336116ac6000546001600160a01b031690565b6001600160a01b0316146117025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b8151815181146117545760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e677468206d6973736d617463680000000000000000000060448201526064016108ba565b6000805474010000000000000000000000000000000000000000900461ffff16908080805b858110156118d5576020810260208901015192506020810260208801015191506117a3823b151590565b156117f05760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74206d696e7420746f20636f6e747261637473210000000000000060448201526064016108ba565b6001600160a01b03821660009081526004602052604081208054859290611818908490613b30565b90915550600090505b838110156118b6578561183381613cac565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929950899350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4806118ae81613cac565b915050611821565b506118c18385613b30565b9350806118cd81613cac565b915050611779565b506115b484106119275760405162461bcd60e51b815260206004820152601060248201527f457863656564732072657365727665210000000000000000000000000000000060448201526064016108ba565b82600060148282829054906101000a900461ffff166119469190613b0a565b92506101000a81548161ffff021916908361ffff16021790555050505050505050565b3361197c6000546001600160a01b031690565b6001600160a01b0316146119d25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b600855565b600754610100900460ff16611a2e5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c65642100000000000000000060448201526064016108ba565b60005474010000000000000000000000000000000000000000900461ffff166115b4611a5a8284613b30565b10611aa75760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108ba565b336000908152600a6020526040902054600390611ac79060ff1684613b30565b108015611ad357508115155b611b1f5760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c6574210060448201526064016108ba565b611b318267013fbe85edc90000613b81565b3414611b7f5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108ba565b336000908152600a602052604081208054849290611ba190849060ff16613b48565b92506101000a81548160ff021916908360ff160217905550611051823383612884565b611051338383612a7a565b33611be26000546001600160a01b031690565b6001600160a01b031614611c385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b60005474010000000000000000000000000000000000000000900461ffff166115b4611c648285613b30565b10611c6e57600080fd5b610a09838383612884565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660208201527f46414d000000000000000000000000000000000000000000000000000000000060348201526000906037015b604051602081830303815290604052805190602001209050919050565b611cfc3383612341565b611d6e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108ba565b61136084848484612b67565b33611d8d6000546001600160a01b031690565b6001600160a01b031614611de35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660208201527f4f470000000000000000000000000000000000000000000000000000000000006034820152600090603601611cd5565b6000818152600360205260409020546060906001600160a01b0316611f0a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016108ba565b6002611f1583612bf0565b604051602001611f269291906138fa565b6040516020818303038152906040529050919050565b33611f4f6000546001600160a01b031690565b6001600160a01b031614611fa55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b600780546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821681900460ff1615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909116179055565b6001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561206657600080fd5b505afa15801561207a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209e91906137ce565b6001600160a01b031614156120b757600191505061082e565b50506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b336120fa6000546001600160a01b031690565b6001600160a01b0316146121505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b6001600160a01b0381166121cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108ba565b6121d581612a12565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061226b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061082e57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461082e565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061230882611366565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166123cb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016108ba565b6000828152600360205260409020546001600160a01b0390811690841681148061240e5750836001600160a01b031661240384610834565b6001600160a01b0316145b8061241e575061241e8185612000565b949350505050565b6000818152600360205260409020546001600160a01b038481169116146124b55760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016108ba565b6001600160a01b0382166125305760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108ba565b61253b6000826122bb565b6001600160a01b038316600090815260046020526040812080549161255f83613c01565b90915550506001600160a01b038216600090815260046020526040812080549161258883613cac565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b1660208201527f46414d000000000000000000000000000000000000000000000000000000000060348201526001600160a01b03909116906126939061268d906037015b60405160208183030381529060405280519060200120612d22565b84612d5d565b6001600160a01b0316149392505050565b6001600160a01b03821660009081526004602052604081208054916126c883613cac565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46000805474010000000000000000000000000000000000000000900461ffff1690601461276683613c8a565b91906101000a81548161ffff021916908361ffff1602179055505061279d6000838360405180602001604052806000815250612d81565b6110515760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108ba565b600080546040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b1660208201527f4f4700000000000000000000000000000000000000000000000000000000000060348201526001600160a01b03909116906126939061268d90603601612672565b6001600160a01b038216600090815260046020526040812080548592906128ac908490613b30565b90915550600090505b8381101561294a57816128c781613cac565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929550859350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061294281613cac565b9150506128b5565b5082600060148282829054906101000a900461ffff1661296a9190613b0a565b92506101000a81548161ffff021916908361ffff1602179055506129a06000838360405180602001604052806000815250612d81565b610a095760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108ba565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415612adc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108ba565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612b72848484612426565b612b7e84848484612d81565b6113605760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108ba565b606081612c3057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c5a5780612c4481613cac565b9150612c539050600a83613b6d565b9150612c34565b60008167ffffffffffffffff811115612c7557612c75613dd5565b6040519080825280601f01601f191660200182016040528015612c9f576020820181803683370190505b5090505b841561241e57612cb4600183613bbe565b9150612cc1600a86613d05565b612ccc906030613b30565b60f81b818381518110612ce157612ce1613da6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d1b600a86613b6d565b9450612ca3565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01611cd5565b6000806000612d6c8585612f4c565b91509150612d7981612fb9565b509392505050565b60006001600160a01b0384163b15612f41576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612dde903390899088908890600401613a04565b602060405180830381600087803b158015612df857600080fd5b505af1925050508015612e46575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612e4391810190613723565b60015b612ef6573d808015612e74576040519150601f19603f3d011682016040523d82523d6000602084013e612e79565b606091505b508051612eee5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108ba565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061241e565b506001949350505050565b600080825160411415612f835760208301516040840151606085015160001a612f77878285856131aa565b94509450505050610b4d565b825160401415612fad5760208301516040840151612fa28683836132b5565b935093505050610b4d565b50600090506002610b4d565b6000816004811115612fcd57612fcd613d77565b1415612fd65750565b6001816004811115612fea57612fea613d77565b14156130385760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108ba565b600281600481111561304c5761304c613d77565b141561309a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108ba565b60038160048111156130ae576130ae613d77565b14156131225760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108ba565b600481600481111561313657613136613d77565b14156121d55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108ba565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156131e157506000905060036132ac565b8460ff16601b141580156131f957508460ff16601c14155b1561320a57506000905060046132ac565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561325e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166132a5576000600192509250506132ac565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016132ef878288856131aa565b935093505050935093915050565b82805461330990613c36565b90600052602060002090601f01602090048101928261332b5760008555613371565b82601f1061334457805160ff1916838001178555613371565b82800160010185558215613371579182015b82811115613371578251825591602001919060010190613356565b5061337d929150613381565b5090565b5b8082111561337d5760008155600101613382565b600067ffffffffffffffff8311156133b0576133b0613dd5565b6133e160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613a97565b90508281528383830111156133f557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261341d57600080fd5b8135602061343261342d83613ae6565b613a97565b80838252828201915082860187848660051b890101111561345257600080fd5b60005b8581101561347a57813561346881613e04565b84529284019290840190600101613455565b5090979650505050505050565b60008083601f84011261349957600080fd5b50813567ffffffffffffffff8111156134b157600080fd5b602083019150836020828501011115610b4d57600080fd5b6000602082840312156134db57600080fd5b81356134e681613e04565b9392505050565b6000806040838503121561350057600080fd5b823561350b81613e04565b9150602083013561351b81613e04565b809150509250929050565b60008060006060848603121561353b57600080fd5b833561354681613e04565b9250602084013561355681613e04565b929592945050506040919091013590565b6000806000806080858703121561357d57600080fd5b843561358881613e04565b9350602085013561359881613e04565b925060408501359150606085013567ffffffffffffffff8111156135bb57600080fd5b8501601f810187136135cc57600080fd5b6135db87823560208401613396565b91505092959194509250565b600080604083850312156135fa57600080fd5b823561360581613e04565b91506020830135801515811461351b57600080fd5b6000806040838503121561362d57600080fd5b823561363881613e04565b946020939093013593505050565b6000806040838503121561365957600080fd5b823567ffffffffffffffff8082111561367157600080fd5b818501915085601f83011261368557600080fd5b8135602061369561342d83613ae6565b8083825282820191508286018a848660051b89010111156136b557600080fd5b600096505b848710156136d85780358352600196909601959183019183016136ba565b50965050860135925050808211156136ef57600080fd5b506136fc8582860161340c565b9150509250929050565b60006020828403121561371857600080fd5b81356134e681613e19565b60006020828403121561373557600080fd5b81516134e681613e19565b6000806020838503121561375357600080fd5b823567ffffffffffffffff81111561376a57600080fd5b61377685828601613487565b90969095509350505050565b60008060006040848603121561379757600080fd5b833567ffffffffffffffff8111156137ae57600080fd5b6137ba86828701613487565b909790965060209590950135949350505050565b6000602082840312156137e057600080fd5b81516134e681613e04565b6000602082840312156137fd57600080fd5b813567ffffffffffffffff81111561381457600080fd5b8201601f8101841361382557600080fd5b61241e84823560208401613396565b60006020828403121561384657600080fd5b5035919050565b6000806040838503121561386057600080fd5b82359150602083013561351b81613e04565b6000806040838503121561388557600080fd5b50508035926020909101359150565b600081518084526138ac816020860160208601613bd5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516138f0818560208601613bd5565b9290920192915050565b600080845481600182811c91508083168061391657607f831692505b602080841082141561394f577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156139635760018114613992576139bf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506139bf565b60008b81526020902060005b868110156139b75781548b82015290850190830161399e565b505084890196505b5050505050506139fb6139d282866138de565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613a366080830184613894565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613a7857835183529284019291840191600101613a5c565b50909695505050505050565b6020815260006134e66020830184613894565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613ade57613ade613dd5565b604052919050565b600067ffffffffffffffff821115613b0057613b00613dd5565b5060051b60200190565b600061ffff808316818516808303821115613b2757613b27613d19565b01949350505050565b60008219821115613b4357613b43613d19565b500190565b600060ff821660ff84168060ff03821115613b6557613b65613d19565b019392505050565b600082613b7c57613b7c613d48565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bb957613bb9613d19565b500290565b600082821015613bd057613bd0613d19565b500390565b60005b83811015613bf0578181015183820152602001613bd8565b838111156113605750506000910152565b600081613c1057613c10613d19565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680613c4a57607f821691505b60208210811415613c84577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600061ffff80831681811415613ca257613ca2613d19565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cde57613cde613d19565b5060010190565b600060ff821660ff811415613cfc57613cfc613d19565b60010192915050565b600082613d1457613d14613d48565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b03811681146121d557600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146121d557600080fdfea2646970667358221220c7fc9be07d44a2042a8ce16bf2ccabeee956134582ff5daf73c60e092ec9941d64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000028a0000000000000000000000004d027fdb3022fb33601276fda40f390d70bc19470000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d6267506e7232563977426f3144414d6d6e727642655672547532366568763950775a546b5a686f57716257782f00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _royalty (uint256): 650
Arg [1] : _openseaProxyRegistry (address): 0x4D027fDb3022fB33601276fDA40F390D70BC1947
Arg [2] : _tempBaseURI (string): https://ipfs.io/ipfs/QmbgPnr2V9wBo1DAMmnrvBeVrTu26ehv9PwZTkZhoWqbWx/
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000028a
Arg [1] : 0000000000000000000000004d027fdb3022fb33601276fda40f390d70bc1947
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [4] : 68747470733a2f2f697066732e696f2f697066732f516d6267506e7232563977
Arg [5] : 426f3144414d6d6e727642655672547532366568763950775a546b5a686f5771
Arg [6] : 6257782f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
33517:7254:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39108:241;;;;;;;;;;-1:-1:-1;39108:241:0;;;;;:::i;:::-;;:::i;:::-;;;13596:14:1;;13589:22;13571:41;;13559:2;13544:18;39108:241:0;;;;;;;;23778:105;;;;;;;;;;-1:-1:-1;23852:23:0;;;;;;;;;;;;;;;;;23778:105;;;;;;;:::i;24997:213::-;;;;;;;;;;-1:-1:-1;24997:213:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11909:55:1;;;11891:74;;11879:2;11864:18;24997:213:0;11745:226:1;24537:394:0;;;;;;;;;;-1:-1:-1;24537:394:0;;;;;:::i;:::-;;:::i;:::-;;22067:25;;;;;;;;;;-1:-1:-1;22067:25:0;;;;;;;;;;;;;;26050:6:1;26038:19;;;26020:38;;26008:2;25993:18;22067:25:0;25876:188:1;33681:49:0;;;;;;;;;;-1:-1:-1;33681:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26423:4:1;26411:17;;;26393:36;;26381:2;26366:18;33681:49:0;26251:184:1;26087:331:0;;;;;;;;;;-1:-1:-1;26087:331:0;;;;;:::i;:::-;;:::i;38395:279::-;;;;;;;;;;-1:-1:-1;38395:279:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;12684:55:1;;;12666:74;;12771:2;12756:18;;12749:34;;;;12639:18;38395:279:0;12492:297:1;39997:95:0;;;;;;;;;;;;;:::i;35727:536::-;;;;;;:::i;:::-;;:::i;39357:459::-;;;;;;;;;;;;;:::i;26489:179::-;;;;;;;;;;-1:-1:-1;26489:179:0;;;;;:::i;:::-;;:::i;33737:46::-;;;;;;;;;;-1:-1:-1;33737:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;24385:90;;;;;;;;;;-1:-1:-1;24385:90:0;;;;;:::i;:::-;;:::i;36271:610::-;;;;;;:::i;:::-;;:::i;23480:231::-;;;;;;;;;;-1:-1:-1;23480:231:0;;;;;:::i;:::-;;:::i;22145:21::-;;;;;;;;;;;;;:::i;23216:202::-;;;;;;;;;;-1:-1:-1;23216:202:0;;;;;:::i;:::-;;:::i;:::-;;;14042:25:1;;;14030:2;14015:18;23216:202:0;13896:177:1;1754:96:0;;;;;;;;;;;;;:::i;40383:385::-;;;;;;;;;;-1:-1:-1;40383:385:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37719:181::-;;;;;;;;;;-1:-1:-1;37835:14:0;;;;;;;;37877:15;;;37719:181;;;13810:14:1;;13803:22;13785:41;;13869:14;;13862:22;13857:2;13842:18;;13835:50;13758:18;37719:181:0;13623:268:1;1105:87:0;;;;;;;;;;-1:-1:-1;1151:7:0;1178:6;-1:-1:-1;;;;;1178:6:0;1105:87;;23952:95;;;;;;;;;;-1:-1:-1;24028:11:0;;;;;;;;;;;;;;;;;23952:95;;34217:984;;;;;;;;;;-1:-1:-1;34217:984:0;;;;;:::i;:::-;;:::i;38925:111::-;;;;;;;;;;-1:-1:-1;38925:111:0;;;;;:::i;:::-;;:::i;35209:510::-;;;;;;:::i;:::-;;:::i;25282:147::-;;;;;;;;;;-1:-1:-1;25282:147:0;;;;;:::i;:::-;;:::i;34015:194::-;;;;;;;;;;-1:-1:-1;34015:194:0;;;;;:::i;:::-;;:::i;37575:136::-;;;;;;;;;;-1:-1:-1;37575:136:0;;;;;:::i;:::-;;:::i;26739:318::-;;;;;;;;;;-1:-1:-1;26739:318:0;;;;;:::i;:::-;;:::i;25908:112::-;;;;;;;;;;-1:-1:-1;25908:112:0;;;;;:::i;:::-;;:::i;37433:134::-;;;;;;;;;;-1:-1:-1;37433:134:0;;;;;:::i;:::-;;:::i;24118:259::-;;;;;;;;;;-1:-1:-1;24118:259:0;;;;;:::i;:::-;;:::i;22101:35::-;;;;;;;;;;-1:-1:-1;22101:35:0;;;;-1:-1:-1;;;;;22101:35:0;;;40242:133;;;;;;;;;;;;;:::i;25500:400::-;;;;;;;;;;-1:-1:-1;25500:400:0;;;;;:::i;:::-;;:::i;2005:194::-;;;;;;;;;;-1:-1:-1;2005:194:0;;;;;:::i;:::-;;:::i;39108:241::-;39210:4;39247:41;;;39262:26;39247:41;;:94;;;39305:36;39329:11;39305:23;:36::i;:::-;39227:114;39108:241;-1:-1:-1;;39108:241:0:o;24997:213::-;25065:7;28587:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28587:16:0;25085:73;;;;-1:-1:-1;;;25085:73:0;;23011:2:1;25085:73:0;;;22993:21:1;23050:2;23030:18;;;23023:30;23089:34;23069:18;;;23062:62;23160:14;23140:18;;;23133:42;23192:19;;25085:73:0;;;;;;;;;-1:-1:-1;25178:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25178:24:0;;24997:213::o;24537:394::-;24612:13;24628:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24628:16:0;;;;24663:11;;;;;24655:57;;;;-1:-1:-1;;;24655:57:0;;24201:2:1;24655:57:0;;;24183:21:1;24240:2;24220:18;;;24213:30;24279:34;24259:18;;;24252:62;24350:3;24330:18;;;24323:31;24371:19;;24655:57:0;23999:397:1;24655:57:0;24747:10;-1:-1:-1;;;;;24747:19:0;;;;:58;;;24770:35;24787:5;24794:10;24770:16;:35::i;:::-;24725:164;;;;-1:-1:-1;;;24725:164:0;;20609:2:1;24725:164:0;;;20591:21:1;20648:2;20628:18;;;20621:30;20687:34;20667:18;;;20660:62;20758:26;20738:18;;;20731:54;20802:19;;24725:164:0;20407:420:1;24725:164:0;24902:21;24911:2;24915:7;24902:8;:21::i;:::-;24601:330;24537:394;;:::o;26087:331::-;26276:39;26295:10;26307:7;26276:18;:39::i;:::-;26268:101;;;;-1:-1:-1;;;26268:101:0;;24954:2:1;26268:101:0;;;24936:21:1;24993:2;24973:18;;;24966:30;25032:34;25012:18;;;25005:62;25103:19;25083:18;;;25076:47;25140:19;;26268:101:0;24752:413:1;26268:101:0;26382:28;26392:4;26398:2;26402:7;26382:9;:28::i;38395:279::-;38477:16;28587;;;:7;:16;;;;;;38477;;-1:-1:-1;;;;;28587:16:0;38529:68;;;;-1:-1:-1;;;38529:68:0;;22603:2:1;38529:68:0;;;22585:21:1;22642:2;22622:18;;;22615:30;22681:34;22661:18;;;22654:62;22752:9;22732:18;;;22725:37;22779:19;;38529:68:0;22401:403:1;38529:68:0;1151:7;1178:6;-1:-1:-1;;;;;1178:6:0;38660:5;38636:21;;38624:9;:33;;;;:::i;:::-;:41;;;;:::i;:::-;38608:58;;;;38395:279;;;;;;:::o;39997:95::-;1336:10;1325:7;1151;1178:6;-1:-1:-1;;;;;1178:6:0;;1105:87;1325:7;-1:-1:-1;;;;;1325:21:0;;1317:66;;;;-1:-1:-1;;;1317:66:0;;23424:2:1;1317:66:0;;;23406:21:1;;;23443:18;;;23436:30;23502:34;23482:18;;;23475:62;23554:18;;1317:66:0;23222:356:1;1317:66:0;40070:14:::1;::::0;;40052:32;;::::1;40070:14;::::0;;::::1;40069:15;40052:32;::::0;;39997:95::o;35727:536::-;35800:14;;;;35792:50;;;;-1:-1:-1;;;35792:50:0;;18726:2:1;35792:50:0;;;18708:21:1;18765:2;18745:18;;;18738:30;18804:25;18784:18;;;18777:53;18847:18;;35792:50:0;18524:347:1;35792:50:0;35861:29;35874:10;35886:3;;35861:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35861:12:0;;-1:-1:-1;;;35861:29:0:i;:::-;35853:63;;;;-1:-1:-1;;;35853:63:0;;25372:2:1;35853:63:0;;;25354:21:1;25411:2;25391:18;;;25384:30;25450:23;25430:18;;;25423:51;25491:18;;35853:63:0;25170:345:1;35853:63:0;35927:12;35942:11;;:15;;:11;;;;;35956:1;35942:15;:::i;:::-;35927:30;;;;35986:4;35976:7;:14;35968:54;;;;-1:-1:-1;;;35968:54:0;;25722:2:1;35968:54:0;;;25704:21:1;25761:2;25741:18;;;25734:30;25800:29;25780:18;;;25773:57;25847:18;;35968:54:0;25520:351:1;35968:54:0;36057:10;36041:27;;;;:15;:27;;;;;;;;:32;36033:76;;;;-1:-1:-1;;;36033:76:0;;20249:2:1;36033:76:0;;;20231:21:1;20288:2;20268:18;;;20261:30;20327:33;20307:18;;;20300:61;20378:18;;36033:76:0;20047:355:1;36033:76:0;36128:9;36141:4;36128:17;36120:56;;;;-1:-1:-1;;;36120:56:0;;19078:2:1;36120:56:0;;;19060:21:1;19117:2;19097:18;;;19090:30;19156:28;19136:18;;;19129:56;19202:18;;36120:56:0;18876:350:1;36120:56:0;36205:10;36189:27;;;;:15;:27;;;;;:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;36229:26;36235:10;36247:7;36229:5;:26::i;39357:459::-;1336:10;1325:7;1151;1178:6;-1:-1:-1;;;;;1178:6:0;;1105:87;1325:7;-1:-1:-1;;;;;1325:21:0;;1317:66;;;;-1:-1:-1;;;1317:66:0;;23424:2:1;1317:66:0;;;23406:21:1;;;23443:18;;;23436:30;23502:34;23482:18;;;23475:62;23554:18;;1317:66:0;23222:356:1;1317:66:0;39418:21:::1;39407:8;39495:10;39532:3;39520:8;39418:21:::0;39526:2:::1;39520:8;:::i;:::-;39519:16;;;;:::i;:::-;39487:64;::::0;39542:4:::1;::::0;39487:64;::::1;::::0;;;;;39542:4;39487:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39473:78;;;;;39570:7;39562:54;;;::::0;-1:-1:-1;;;39562:54:0;;17206:2:1;39562:54:0::1;::::0;::::1;17188:21:1::0;17245:2;17225:18;;;17218:30;17284:34;17264:18;;;17257:62;17355:4;17335:18;;;17328:32;17377:19;;39562:54:0::1;17004:398:1::0;39562:54:0::1;39649:42;39718:3;39707:7;:3:::0;39713:1:::1;39707:7;:::i;:::-;39706:15;;;;:::i;:::-;39641:97;::::0;39729:4:::1;::::0;39641:97;::::1;::::0;;;;;39729:4;39641:97:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39627:111;;;;;39757:7;39749:49;;;::::0;-1:-1:-1;;;39749:49:0;;18368:2:1;39749:49:0::1;::::0;::::1;18350:21:1::0;18407:2;18387:18;;;18380:30;18446:31;18426:18;;;18419:59;18495:18;;39749:49:0::1;18166:353:1::0;39749:49:0::1;39396:420;;39357:459::o:0;26489:179::-;26621:39;26638:4;26644:2;26648:7;26621:39;;;;;;;;;;;;:16;:39::i;24385:90::-;1336:10;1325:7;1151;1178:6;-1:-1:-1;;;;;1178:6:0;;1105:87;1325:7;-1:-1:-1;;;;;1325:21:0;;1317:66;;;;-1:-1:-1;;;1317:66:0;;23424:2:1;1317:66:0;;;23406:21:1;;;23443:18;;;23436:30;23502:34;23482:18;;;23475:62;23554:18;;1317:66:0;23222:356:1;1317:66:0;24454:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;36271:610::-:0;36359:14;;;;36351:50;;;;-1:-1:-1;;;36351:50:0;;18726:2:1;36351:50:0;;;18708:21:1;18765:2;18745:18;;;18738:30;18804:25;18784:18;;;18777:53;18847:18;;36351:50:0;18524:347:1;36351:50:0;36420:28;36432:10;36444:3;;36420:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36420:11:0;;-1:-1:-1;;;36420:28:0:i;:::-;36412:62;;;;-1:-1:-1;;;36412:62:0;;25372:2:1;36412:62:0;;;25354:21:1;25411:2;25391:18;;;25384:30;25450:23;25430:18;;;25423:51;25491:18;;36412:62:0;25170:345:1;36412:62:0;36485:12;36500:11;;;;;;36549:4;36530:16;36500:11;36530:6;:16;:::i;:::-;:23;36522:63;;;;-1:-1:-1;;;36522:63:0;;25722:2:1;36522:63:0;;;25704:21:1;25761:2;25741:18;;;25734:30;25800:29;25780:18;;;25773:57;25847:18;;36522:63:0;25520:351:1;36522:63:0;36629:10;36613:27;;;;:15;:27;;;;;;36643:1;;36604:36;;36613:27;;36604:6;:36;:::i;:::-;:40;:55;;;;-1:-1:-1;36648:11:0;;;36604:55;36596:99;;;;-1:-1:-1;;;36596:99:0;;20249:2:1;36596:99:0;;;20231:21:1;20288:2;20268:18;;;20261:30;20327:33;20307:18;;;20300:61;20378:18;;36596:99:0;20047:355:1;36596:99:0;36727:13;:6;36736:4;36727:13;:::i;:::-;36714:9;:26;36706:65;;;;-1:-1:-1;;;36706:65:0;;19078:2:1;36706:65:0;;;19060:21:1;19117:2;19097:18;;;19090:30;19156:28;19136:18;;;19129:56;19202:18;;36706:65:0;18876:350:1;36706:65:0;36800:10;36784:27;;;;:15;:27;;;;;:44;;36821:6;;36784:27;:44;;36821:6;;36784:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36839:34;36845:6;36853:10;36865:7;36839:5;:34::i;:::-;36340:541;36271:610;;;:::o;23480:231::-;23544:7;23580:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23580:16:0;23615:19;23607:73;;;;-1:-1:-1;;;23607:73:0;;21445:2:1;23607:73:0;;;21427:21:1;21484:2;21464:18;;;21457:30;21523:34;21503:18;;;21496:62;21594:11;21574:18;;;21567:39;21623:19;;23607:73:0;21243:405:1;22145:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23216:202::-;23282:7;-1:-1:-1;;;;;23310:19:0;;23302:74;;;;-1:-1:-1;;;23302:74:0;;21034:2:1;23302:74:0;;;21016:21:1;21073:2;21053:18;;;21046:30;21112:34;21092:18;;;21085:62;21183:12;21163:18;;;21156:40;21213:19;;23302:74:0;20832:406:1;23302:74:0;-1:-1:-1;;;;;;23394:16:0;;;;;:9;:16;;;;;;;23216:202::o;1754:96::-;1336:10;1325:7;1151;1178:6;-1:-1:-1;;;;;1178:6:0;;1105:87;1325:7;-1:-1:-1;;;;;1325:21:0;;1317:66;;;;-1:-1:-1;;;1317:66:0;;23424:2:1;1317:66:0;;;23406:21:1;;;23443:18;;;23436:30;23502:34;23482:18;;;23475:62;23554:18;;1317:66:0;23222:356:1;1317:66:0;1821:21:::1;1839:1;1821:9;:21::i;:::-;1754:96::o:0;40383:385::-;-1:-1:-1;;;;;40503:16:0;;40469:20;40503:16;;;:9;:16;;;;;;40443:13;;40469:20;40492:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40492:28:0;-1:-1:-1;40531:6:0;40540:11;;40469:51;;-1:-1:-1;40531:6:0;40540:15;;:11;;;;;40554:1;40540:15;:::i;:::-;40531:24;;;-1:-1:-1;40566:6:0;40599:1;40585:150;40606:1;40602;:5;40585:150;;;40647:5;-1:-1:-1;;;;;40633:19:0;:10;40641:1;40633:7;:10::i;:::-;-1:-1:-1;;;;;40633:19:0;;40629:95;;;40685:1;40673:6;40680:1;40673:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;40705:3;;;;:::i;:::-;;;;40629:95;40609:3;;;;:::i;:::-;;;;40585:150;;;-1:-1:-1;40754:6:0;;40383:385;-1:-1:-1;;;;40383:385:0:o;34217:984::-;1336:10;1325:7;1151;1178:6;-1:-1:-1;;;;;1178:6:0;;1105:87;1325:7;-1:-1:-1;;;;;1325:21:0;;1317:66;;;;-1:-1:-1;;;1317:66:0;;23424:2:1;1317:66:0;;;23406:21:1;;;23443:18;;;23436:30;23502:34;23482:18;;;23475:62;23554:18;;1317:66:0;23222:356:1;1317:66:0;34334:13;;34376:9;;34366:19;::::1;34358:54;;;::::0;-1:-1:-1;;;34358:54:0;;24603:2:1;34358:54:0::1;::::0;::::1;24585:21:1::0;24642:2;24622:18;;;24615:30;24681:24;24661:18;;;24654:52;24723:18;;34358:54:0::1;24401:346:1::0;34358:54:0::1;34425:12;34440:11:::0;;;;::::1;;;::::0;34425:12;;;34532:565:::1;34549:6;34545:1;:10;34532:565;;;34654:4;34651:1;34647:12;34640:4;34632:6;34628:17;34624:36;34618:43;34607:54;;34718:4;34715:1;34711:12;34704:4;34700:2;34696:13;34692:32;34686:39;34679:46;;34765:23;34784:3;12012:20:::0;12060:8;;;11689:387;34765:23:::1;34764:24;34756:62;;;::::0;-1:-1:-1;;;34756:62:0;;16039:2:1;34756:62:0::1;::::0;::::1;16021:21:1::0;16078:2;16058:18;;;16051:30;16117:27;16097:18;;;16090:55;16162:18;;34756:62:0::1;15837:349:1::0;34756:62:0::1;-1:-1:-1::0;;;;;34835:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;:25;;34853:7;;34835:14;:25:::1;::::0;34853:7;;34835:25:::1;:::i;:::-;::::0;;;-1:-1:-1;34882:6:0::1;::::0;-1:-1:-1;34877:176:0::1;34894:7;34890:1;:11;34877:176;;;34927:9:::0;::::1;::::0;::::1;:::i;:::-;34957:16;::::0;;;:7:::1;:16;::::0;;;;;:22;;;::::1;-1:-1:-1::0;;;;;34957:22:0;::::1;::::0;;::::1;::::0;;;35003:34;;34957:16;;-1:-1:-1;34957:16:0;;-1:-1:-1;34957:22:0;35003:34:::1;::::0;34957:16;;35003:34:::1;34903:3:::0;::::1;::::0;::::1;:::i;:::-;;;;34877:176;;;-1:-1:-1::0;35069:16:0::1;35078:7:::0;35069:16;::::1;:::i;:::-;::::0;-1:-1:-1;34557:3:0;::::1;::::0;::::1;:::i;:::-;;;;34532:565;;;;35127:4;35117:7;:14;35109:43;;;::::0;-1:-1:-1;;;35109:43:0;;22258:2:1;35109:43:0::1;::::0;::::1;22240:21:1::0;22297:2;22277:18;;;22270:30;22336:18;22316;;;22309:46;22372:18;;35109:43:0::1;22056:340:1::0;35109:43:0::1;35187:5;35165:11;;:28;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34309:892;;;;;34217:984:::0;;:::o;38925:111::-;1336:10;1325:7;1151;1178:6;-1:-1:-1;;;;;1178:6:0;;1105:87;1325:7;-1:-1:-1;;;;;1325:21:0;;1317:66;;;;-1:-1:-1;;;1317:66:0;;23424:2:1;1317:66:0;;;23406:21:1;;;23443:18;;;23436:30;23502:34;23482:18;;;23475:62;23554:18;;1317:66:0;23222:356:1;1317:66:0;38998:21:::1;:30:::0;38925:111::o;35209:510::-;35275:15;;;;;;;35267:51;;;;-1:-1:-1;;;35267:51:0;;18726:2:1;35267:51:0;;;18708:21:1;18765:2;18745:18;;;18738:30;18804:25;18784:18;;;18777:53;18847:18;;35267:51:0;18524:347:1;35267:51:0;35329:12;35344:11;;;;;;35393:4;35374:16;35344:11;35374:6;:16;:::i;:::-;:23;35366:63;;;;-1:-1:-1;;;35366:63:0;;25722:2:1;35366:63:0;;;25704:21:1;25761:2;25741:18;;;25734:30;25800:29;25780:18;;;25773:57;25847:18;;35366:63:0;25520:351:1;35366:63:0;35470:10;35457:24;;;;:12;:24;;;;;;35484:1;;35448:33;;35457:24;;35448:6;:33;:::i;:::-;:37;:52;;;;-1:-1:-1;35489:11:0;;;35448:52;35440:96;;;;-1:-1:-1;;;35440:96:0;;20249:2:1;35440:96:0;;;20231:21:1;20288:2;20268:18;;;20261:30;20327:33;20307:18;;;20300:61;20378:18;;35440:96:0;20047:355:1;35440:96:0;35568:13;:6;35577:4;35568:13;:::i;:::-;35555:9;:26;35547:65;;;;-1:-1:-1;;;35547:65:0;;19078:2:1;35547:65:0;;;19060:21:1;19117:2;19097:18;;;19090:30;19156:28;19136:18;;;19129:56;19202:18;;35547:65:0;18876:350:1;35547:65:0;35638:10;35625:24;;;;:12;:24;;;;;:41;;35659:6;;35625:24;:41;;35659:6;;35625:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35677:34;35683:6;35691:10;35703:7;35677:5;:34::i;25282:147::-;25371:50;25390:10;25402:8;25412;25371:18;:50::i;34015:194::-;1336:10;1325:7;1151;1178:6;-1:-1:-1;;;;;1178:6:0;;1105:87;1325:7;-1:-1:-1;;;;;1325:21:0;;1317:66;;;;-1:-1:-1;;;1317:66:0;;23424:2:1;1317:66:0;;;23406:21:1;;;23443:18;;;23436:30;23502:34;23482:18;;;23475:62;23554:18;;1317:66:0;23222:356:1;1317:66:0;34095:12:::1;34110:11:::0;;;::::1;;;34159:4;34140:16;34110:11:::0;34140:6;:16:::1;:::i;:::-;:23;34132:32;;;::::0;::::1;;34175:26;34181:6;34189:2;34193:7;34175:5;:26::i;37575:136::-:0;37670:32;;9181:66:1;9168:2;9164:15;;;9160:88;37670:32:0;;;9148:101:1;9279:5;9265:12;;;9258:27;37633:7:0;;9301:12:1;;37670:32:0;;;;;;;;;;;;;37660:43;;;;;;37653:50;;37575:136;;;:::o;26739:318::-;26906:39;26925:10;26937:7;26906:18;:39::i;:::-;26898:101;;;;-1:-1:-1;;;26898:101:0;;24954:2:1;26898:101:0;;;24936:21:1;24993:2;24973:18;;;24966:30;25032:34;25012:18;;;25005:62;25103:19;25083:18;;;25076:47;25140:19;;26898:101:0;24752:413:1;26898:101:0;27010:39;27024:4;27030:2;27034:7;27043:5;27010:13;:39::i;25908:112::-;1336:10;1325:7;1151;1178:6;-1:-1:-1;;;;;1178:6:0;;1105:87;1325:7;-1:-1:-1;;;;;1325:21:0;;1317:66;;;;-1:-1:-1;;;1317:66:0;;23424:2:1;1317:66:0;;;23406:21:1;;;23443:18;;;23436:30;23502:34;23482:18;;;23475:62;23554:18;;1317:66:0;23222:356:1;1317:66:0;25985:20:::1;:27:::0;;;::::1;-1:-1:-1::0;;;;;25985:27:0;;;::::1;::::0;;;::::1;::::0;;25908:112::o;37433:134::-;37527:31;;9587:66:1;9574:2;9570:15;;;9566:88;37527:31:0;;;9554:101:1;9685:4;9671:12;;;9664:26;37490:7:0;;9706:12:1;;37527:31:0;9324:400:1;24118:259:0;28563:4;28587:16;;;:7;:16;;;;;;24185:13;;-1:-1:-1;;;;;28587:16:0;24211:76;;;;-1:-1:-1;;;24211:76:0;;23785:2:1;24211:76:0;;;23767:21:1;23824:2;23804:18;;;23797:30;23863:34;23843:18;;;23836:62;23934:17;23914:18;;;23907:45;23969:19;;24211:76:0;23583:411:1;24211:76:0;24331:7;24340:18;:7;:16;:18::i;:::-;24314:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24300:69;;24118:259;;;:::o;40242:133::-;1336:10;1325:7;1151;1178:6;-1:-1:-1;;;;;1178:6:0;;1105:87;1325:7;-1:-1:-1;;;;;1325:21:0;;1317:66;;;;-1:-1:-1;;;1317:66:0;;23424:2:1;1317:66:0;;;23406:21:1;;;23443:18;;;23436:30;23502:34;23482:18;;;23475:62;23554:18;;1317:66:0;23222:356:1;1317:66:0;40300:14:::1;:22:::0;;::::1;::::0;;::::1;40352:15:::0;;::::1;40300:22;40352:15;40351:16;40333:34;::::0;;;;::::1;::::0;;40242:133::o;25500:400::-;25713:20;;25757:28;;;;;-1:-1:-1;;;;;11909:55:1;;;25757:28:0;;;11891:74:1;25589:4:0;;25713:20;;;25749:49;;;;25713:20;;25757:21;;11864:18:1;;25757:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25749:49:0;;25745:93;;;25822:4;25815:11;;;;;25745:93;-1:-1:-1;;;;;;;25857:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25500:400::o;2005:194::-;1336:10;1325:7;1151;1178:6;-1:-1:-1;;;;;1178:6:0;;1105:87;1325:7;-1:-1:-1;;;;;1325:21:0;;1317:66;;;;-1:-1:-1;;;1317:66:0;;23424:2:1;1317:66:0;;;23406:21:1;;;23443:18;;;23436:30;23502:34;23482:18;;;23475:62;23554:18;;1317:66:0;23222:356:1;1317:66:0;-1:-1:-1;;;;;2096:22:0;::::1;2088:73;;;::::0;-1:-1:-1;;;2088:73:0;;16393:2:1;2088:73:0::1;::::0;::::1;16375:21:1::0;16432:2;16412:18;;;16405:30;16471:34;16451:18;;;16444:62;16542:8;16522:18;;;16515:36;16568:19;;2088:73:0::1;16191:402:1::0;2088:73:0::1;2172:19;2182:8;2172:9;:19::i;:::-;2005:194:::0;:::o;22847:305::-;22949:4;22986:40;;;23001:25;22986:40;;:105;;-1:-1:-1;23043:48:0;;;23058:33;23043:48;22986:105;:158;;;-1:-1:-1;15156:25:0;15141:40;;;;23108:36;15032:157;31362:174;31437:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;31437:29:0;;;;;;;;:24;;31491:23;31437:24;31491:14;:23::i;:::-;-1:-1:-1;;;;;31482:46:0;;;;;;;;;;;31362:174;;:::o;28792:341::-;28885:4;28587:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28587:16:0;28902:73;;;;-1:-1:-1;;;28902:73:0;;19836:2:1;28902:73:0;;;19818:21:1;19875:2;19855:18;;;19848:30;19914:34;19894:18;;;19887:62;19985:14;19965:18;;;19958:42;20017:19;;28902:73:0;19634:408:1;28902:73:0;28986:13;29002:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29002:16:0;;;;29037;;;;;:51;;;29081:7;-1:-1:-1;;;;;29057:31:0;:20;29069:7;29057:11;:20::i;:::-;-1:-1:-1;;;;;29057:31:0;;29037:51;:87;;;;29092:32;29109:5;29116:7;29092:16;:32::i;:::-;29029:96;28792:341;-1:-1:-1;;;;28792:341:0:o;30733:511::-;30865:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;30865:24:0;;;:16;;:24;30857:74;;;;-1:-1:-1;;;30857:74:0;;16800:2:1;30857:74:0;;;16782:21:1;16839:2;16819:18;;;16812:30;16878:34;16858:18;;;16851:62;16949:7;16929:18;;;16922:35;16974:19;;30857:74:0;16598:401:1;30857:74:0;-1:-1:-1;;;;;30950:16:0;;30942:65;;;;-1:-1:-1;;;30942:65:0;;17609:2:1;30942:65:0;;;17591:21:1;17648:2;17628:18;;;17621:30;17687:34;17667:18;;;17660:62;17758:6;17738:18;;;17731:34;17782:19;;30942:65:0;17407:400:1;30942:65:0;31072:29;31089:1;31093:7;31072:8;:29::i;:::-;-1:-1:-1;;;;;31114:15:0;;;;;;:9;:15;;;;;:17;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;31142:13:0;;;;;;:9;:13;;;;;:15;;;;;;:::i;:::-;;;;-1:-1:-1;;31170:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;31170:21:0;;;;;;;;;31209:27;;31170:16;;31209:27;;;;;;;30733:511;;;:::o;37160:265::-;37245:4;1178:6;;37336:32;;9181:66:1;9168:2;9164:15;;;9160:88;37336:32:0;;;9148:101:1;9279:5;9265:12;;;9258:27;-1:-1:-1;;;;;1178:6:0;;;;37269:137;;37297:73;;9301:12:1;;37336:32:0;;;;;;;;;;;;;37326:43;;;;;;37297:28;:73::i;:::-;37385:10;37269:13;:137::i;:::-;-1:-1:-1;;;;;37269:148:0;;;37160:265;-1:-1:-1;;;37160:265:0:o;30031:365::-;-1:-1:-1;;;;;30094:13:0;;;;;;:9;:13;;;;;:15;;;;;;:::i;:::-;;;;-1:-1:-1;;30120:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;30120:21:0;;;;;;;;30157:33;;30120:16;;;30157:33;;30120:16;;30157:33;30203:11;:13;;;;;;;;:11;:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;30259:51;30290:1;30294:2;30298:7;30259:51;;;;;;;;;;;;:22;:51::i;:::-;30237:151;;;;-1:-1:-1;;;30237:151:0;;15620:2:1;30237:151:0;;;15602:21:1;15659:2;15639:18;;;15632:30;15698:34;15678:18;;;15671:62;15769:20;15749:18;;;15742:48;15807:19;;30237:151:0;15418:414:1;36889:263:0;36973:4;1178:6;;37064:31;;9587:66:1;9574:2;9570:15;;;9566:88;37064:31:0;;;9554:101:1;9685:4;9671:12;;;9664:26;-1:-1:-1;;;;;1178:6:0;;;;36997:136;;37025:72;;9706:12:1;;37064:31:0;9324:400:1;29469:554:0;-1:-1:-1;;;;;29548:13:0;;;;;;:9;:13;;;;;:23;;29565:6;;29548:13;:23;;29565:6;;29548:23;:::i;:::-;;;;-1:-1:-1;29589:6:0;;-1:-1:-1;29584:157:0;29601:6;29597:1;:10;29584:157;;;29629:9;;;;:::i;:::-;29655:16;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;29655:21:0;;;;;;;;29696:33;;29655:16;;-1:-1:-1;29655:16:0;;-1:-1:-1;29655:21:0;29696:33;;29655:16;;29696:33;29609:3;;;;:::i;:::-;;;;29584:157;;;;29775:6;29753:11;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29817:51;29848:1;29852:2;29856:7;29817:51;;;;;;;;;;;;:22;:51::i;:::-;29795:151;;;;-1:-1:-1;;;29795:151:0;;15620:2:1;29795:151:0;;;15602:21:1;15659:2;15639:18;;;15632:30;15698:34;15678:18;;;15671:62;15769:20;15749:18;;;15742:48;15807:19;;29795:151:0;15418:414:1;2207:173:0;2263:16;2282:6;;-1:-1:-1;;;;;2299:17:0;;;;;;;;;;2332:40;;2282:6;;;;;;;2332:40;;2263:16;2332:40;2252:128;2207:173;:::o;31678:315::-;31833:8;-1:-1:-1;;;;;31824:17:0;:5;-1:-1:-1;;;;;31824:17:0;;;31816:55;;;;-1:-1:-1;;;31816:55:0;;18014:2:1;31816:55:0;;;17996:21:1;18053:2;18033:18;;;18026:30;18092:27;18072:18;;;18065:55;18137:18;;31816:55:0;17812:349:1;31816:55:0;-1:-1:-1;;;;;31882:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;31944:41;;13571::1;;;31944::0;;13544:18:1;31944:41:0;;;;;;;31678:315;;;:::o;27939:::-;28096:28;28106:4;28112:2;28116:7;28096:9;:28::i;:::-;28143:48;28166:4;28172:2;28176:7;28185:5;28143:22;:48::i;:::-;28135:111;;;;-1:-1:-1;;;28135:111:0;;15620:2:1;28135:111:0;;;15602:21:1;15659:2;15639:18;;;15632:30;15698:34;15678:18;;;15671:62;15769:20;15749:18;;;15742:48;15807:19;;28135:111:0;15418:414:1;2609:723:0;2665:13;2886:10;2882:53;;-1:-1:-1;;2913:10:0;;;;;;;;;;;;;;;;;;2609:723::o;2882:53::-;2960:5;2945:12;3001:78;3008:9;;3001:78;;3034:8;;;;:::i;:::-;;-1:-1:-1;3057:10:0;;-1:-1:-1;3065:2:0;3057:10;;:::i;:::-;;;3001:78;;;3089:19;3121:6;3111:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3111:17:0;;3089:39;;3139:154;3146:10;;3139:154;;3173:11;3183:1;3173:11;;:::i;:::-;;-1:-1:-1;3242:10:0;3250:2;3242:5;:10;:::i;:::-;3229:24;;:2;:24;:::i;:::-;3216:39;;3199:6;3206;3199:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3270:11:0;3279:2;3270:11;;:::i;:::-;;;3139:154;;10668:269;10870:58;;11392:66:1;10870:58:0;;;11380:79:1;11475:12;;;11468:28;;;10737:7:0;;11512:12:1;;10870:58:0;11150:380:1;7669:231:0;7747:7;7768:17;7787:18;7809:27;7820:4;7826:9;7809:10;:27::i;:::-;7767:69;;;;7847:18;7859:5;7847:11;:18::i;:::-;-1:-1:-1;7883:9:0;7669:231;-1:-1:-1;;;7669:231:0:o;32558:798::-;32714:4;-1:-1:-1;;;;;32735:13:0;;12012:20;12060:8;32731:618;;32771:70;;;;;-1:-1:-1;;;;;32771:36:0;;;;;:70;;32808:10;;32820:4;;32826:7;;32835:5;;32771:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32771:70:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32767:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33011:13:0;;33007:272;;33054:60;;-1:-1:-1;;;33054:60:0;;15620:2:1;33054:60:0;;;15602:21:1;15659:2;15639:18;;;15632:30;15698:34;15678:18;;;15671:62;15769:20;15749:18;;;15742:48;15807:19;;33054:60:0;15418:414:1;33007:272:0;33229:6;33223:13;33214:6;33210:2;33206:15;33199:38;32767:527;32892:51;;32902:41;32892:51;;-1:-1:-1;32885:58:0;;32731:618;-1:-1:-1;33333:4:0;32558:798;;;;;;:::o;5559:1308::-;5640:7;5649:12;5874:9;:16;5894:2;5874:22;5870:990;;;6170:4;6155:20;;6149:27;6220:4;6205:20;;6199:27;6278:4;6263:20;;6257:27;5913:9;6249:36;6321:25;6332:4;6249:36;6149:27;6199;6321:10;:25::i;:::-;6314:32;;;;;;;;;5870:990;6368:9;:16;6388:2;6368:22;6364:496;;;6643:4;6628:20;;6622:27;6694:4;6679:20;;6673:27;6736:23;6747:4;6622:27;6673;6736:10;:23::i;:::-;6729:30;;;;;;;;6364:496;-1:-1:-1;6808:1:0;;-1:-1:-1;6812:35:0;6792:56;;3830:643;3908:20;3899:5;:29;;;;;;;;:::i;:::-;;3895:571;;;3830:643;:::o;3895:571::-;4006:29;3997:5;:38;;;;;;;;:::i;:::-;;3993:473;;;4052:34;;-1:-1:-1;;;4052:34:0;;14907:2:1;4052:34:0;;;14889:21:1;14946:2;14926:18;;;14919:30;14985:26;14965:18;;;14958:54;15029:18;;4052:34:0;14705:348:1;3993:473:0;4117:35;4108:5;:44;;;;;;;;:::i;:::-;;4104:362;;;4169:41;;-1:-1:-1;;;4169:41:0;;15260:2:1;4169:41:0;;;15242:21:1;15299:2;15279:18;;;15272:30;15338:33;15318:18;;;15311:61;15389:18;;4169:41:0;15058:355:1;4104:362:0;4241:30;4232:5;:39;;;;;;;;:::i;:::-;;4228:238;;;4288:44;;-1:-1:-1;;;4288:44:0;;19433:2:1;4288:44:0;;;19415:21:1;19472:2;19452:18;;;19445:30;19511:34;19491:18;;;19484:62;19582:4;19562:18;;;19555:32;19604:19;;4288:44:0;19231:398:1;4228:238:0;4363:30;4354:5;:39;;;;;;;;:::i;:::-;;4350:116;;;4410:44;;-1:-1:-1;;;4410:44:0;;21855:2:1;4410:44:0;;;21837:21:1;21894:2;21874:18;;;21867:30;21933:34;21913:18;;;21906:62;22004:4;21984:18;;;21977:32;22026:19;;4410:44:0;21653:398:1;8736:1632:0;8867:7;;9801:66;9788:79;;9784:163;;;-1:-1:-1;9900:1:0;;-1:-1:-1;9904:30:0;9884:51;;9784:163;9961:1;:7;;9966:2;9961:7;;:18;;;;;9972:1;:7;;9977:2;9972:7;;9961:18;9957:102;;;-1:-1:-1;10012:1:0;;-1:-1:-1;10016:30:0;9996:51;;9957:102;10173:24;;;10156:14;10173:24;;;;;;;;;14305:25:1;;;14378:4;14366:17;;14346:18;;;14339:45;;;;14400:18;;;14393:34;;;14443:18;;;14436:34;;;10173:24:0;;14277:19:1;;10173:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10173:24:0;;;;;;-1:-1:-1;;;;;;;10212:20:0;;10208:103;;10265:1;10269:29;10249:50;;;;;;;10208:103;10331:6;-1:-1:-1;10339:20:0;;-1:-1:-1;8736:1632:0;;;;;;;;:::o;8163:391::-;8277:7;;8386:66;8378:75;;8480:3;8476:12;;;8490:2;8472:21;8521:25;8532:4;8472:21;8541:1;8378:75;8521:10;:25::i;:::-;8514:32;;;;;;8163:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:45;;;368:1;365;358:12;327:45;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;14:465;;;;;:::o;484:748::-;538:5;591:3;584:4;576:6;572:17;568:27;558:55;;609:1;606;599:12;558:55;645:6;632:20;671:4;695:60;711:43;751:2;711:43;:::i;:::-;695:60;:::i;:::-;777:3;801:2;796:3;789:15;829:2;824:3;820:12;813:19;;864:2;856:6;852:15;916:3;911:2;905;902:1;898:10;890:6;886:23;882:32;879:41;876:61;;;933:1;930;923:12;876:61;955:1;965:238;979:2;976:1;973:9;965:238;;;1050:3;1037:17;1067:31;1092:5;1067:31;:::i;:::-;1111:18;;1149:12;;;;1181;;;;997:1;990:9;965:238;;;-1:-1:-1;1221:5:1;;484:748;-1:-1:-1;;;;;;;484:748:1:o;1237:347::-;1288:8;1298:6;1352:3;1345:4;1337:6;1333:17;1329:27;1319:55;;1370:1;1367;1360:12;1319:55;-1:-1:-1;1393:20:1;;1436:18;1425:30;;1422:50;;;1468:1;1465;1458:12;1422:50;1505:4;1497:6;1493:17;1481:29;;1557:3;1550:4;1541:6;1533;1529:19;1525:30;1522:39;1519:59;;;1574:1;1571;1564:12;1589:247;1648:6;1701:2;1689:9;1680:7;1676:23;1672:32;1669:52;;;1717:1;1714;1707:12;1669:52;1756:9;1743:23;1775:31;1800:5;1775:31;:::i;:::-;1825:5;1589:247;-1:-1:-1;;;1589:247:1:o;1841:388::-;1909:6;1917;1970:2;1958:9;1949:7;1945:23;1941:32;1938:52;;;1986:1;1983;1976:12;1938:52;2025:9;2012:23;2044:31;2069:5;2044:31;:::i;:::-;2094:5;-1:-1:-1;2151:2:1;2136:18;;2123:32;2164:33;2123:32;2164:33;:::i;:::-;2216:7;2206:17;;;1841:388;;;;;:::o;2234:456::-;2311:6;2319;2327;2380:2;2368:9;2359:7;2355:23;2351:32;2348:52;;;2396:1;2393;2386:12;2348:52;2435:9;2422:23;2454:31;2479:5;2454:31;:::i;:::-;2504:5;-1:-1:-1;2561:2:1;2546:18;;2533:32;2574:33;2533:32;2574:33;:::i;:::-;2234:456;;2626:7;;-1:-1:-1;;;2680:2:1;2665:18;;;;2652:32;;2234:456::o;2695:794::-;2790:6;2798;2806;2814;2867:3;2855:9;2846:7;2842:23;2838:33;2835:53;;;2884:1;2881;2874:12;2835:53;2923:9;2910:23;2942:31;2967:5;2942:31;:::i;:::-;2992:5;-1:-1:-1;3049:2:1;3034:18;;3021:32;3062:33;3021:32;3062:33;:::i;:::-;3114:7;-1:-1:-1;3168:2:1;3153:18;;3140:32;;-1:-1:-1;3223:2:1;3208:18;;3195:32;3250:18;3239:30;;3236:50;;;3282:1;3279;3272:12;3236:50;3305:22;;3358:4;3350:13;;3346:27;-1:-1:-1;3336:55:1;;3387:1;3384;3377:12;3336:55;3410:73;3475:7;3470:2;3457:16;3452:2;3448;3444:11;3410:73;:::i;:::-;3400:83;;;2695:794;;;;;;;:::o;3494:416::-;3559:6;3567;3620:2;3608:9;3599:7;3595:23;3591:32;3588:52;;;3636:1;3633;3626:12;3588:52;3675:9;3662:23;3694:31;3719:5;3694:31;:::i;:::-;3744:5;-1:-1:-1;3801:2:1;3786:18;;3773:32;3843:15;;3836:23;3824:36;;3814:64;;3874:1;3871;3864:12;3915:315;3983:6;3991;4044:2;4032:9;4023:7;4019:23;4015:32;4012:52;;;4060:1;4057;4050:12;4012:52;4099:9;4086:23;4118:31;4143:5;4118:31;:::i;:::-;4168:5;4220:2;4205:18;;;;4192:32;;-1:-1:-1;;;3915:315:1:o;4235:1151::-;4353:6;4361;4414:2;4402:9;4393:7;4389:23;4385:32;4382:52;;;4430:1;4427;4420:12;4382:52;4470:9;4457:23;4499:18;4540:2;4532:6;4529:14;4526:34;;;4556:1;4553;4546:12;4526:34;4594:6;4583:9;4579:22;4569:32;;4639:7;4632:4;4628:2;4624:13;4620:27;4610:55;;4661:1;4658;4651:12;4610:55;4697:2;4684:16;4719:4;4743:60;4759:43;4799:2;4759:43;:::i;4743:60::-;4825:3;4849:2;4844:3;4837:15;4877:2;4872:3;4868:12;4861:19;;4908:2;4904;4900:11;4956:7;4951:2;4945;4942:1;4938:10;4934:2;4930:19;4926:28;4923:41;4920:61;;;4977:1;4974;4967:12;4920:61;4999:1;4990:10;;5009:163;5023:2;5020:1;5017:9;5009:163;;;5080:17;;5068:30;;5041:1;5034:9;;;;;5118:12;;;;5150;;5009:163;;;-1:-1:-1;5191:5:1;-1:-1:-1;;5234:18:1;;5221:32;;-1:-1:-1;;5265:16:1;;;5262:36;;;5294:1;5291;5284:12;5262:36;;5317:63;5372:7;5361:8;5350:9;5346:24;5317:63;:::i;:::-;5307:73;;;4235:1151;;;;;:::o;5391:245::-;5449:6;5502:2;5490:9;5481:7;5477:23;5473:32;5470:52;;;5518:1;5515;5508:12;5470:52;5557:9;5544:23;5576:30;5600:5;5576:30;:::i;5641:249::-;5710:6;5763:2;5751:9;5742:7;5738:23;5734:32;5731:52;;;5779:1;5776;5769:12;5731:52;5811:9;5805:16;5830:30;5854:5;5830:30;:::i;5895:409::-;5965:6;5973;6026:2;6014:9;6005:7;6001:23;5997:32;5994:52;;;6042:1;6039;6032:12;5994:52;6082:9;6069:23;6115:18;6107:6;6104:30;6101:50;;;6147:1;6144;6137:12;6101:50;6186:58;6236:7;6227:6;6216:9;6212:22;6186:58;:::i;:::-;6263:8;;6160:84;;-1:-1:-1;5895:409:1;-1:-1:-1;;;;5895:409:1:o;6309:477::-;6388:6;6396;6404;6457:2;6445:9;6436:7;6432:23;6428:32;6425:52;;;6473:1;6470;6463:12;6425:52;6513:9;6500:23;6546:18;6538:6;6535:30;6532:50;;;6578:1;6575;6568:12;6532:50;6617:58;6667:7;6658:6;6647:9;6643:22;6617:58;:::i;:::-;6694:8;;6591:84;;-1:-1:-1;6776:2:1;6761:18;;;;6748:32;;6309:477;-1:-1:-1;;;;6309:477:1:o;6791:280::-;6890:6;6943:2;6931:9;6922:7;6918:23;6914:32;6911:52;;;6959:1;6956;6949:12;6911:52;6991:9;6985:16;7010:31;7035:5;7010:31;:::i;7076:450::-;7145:6;7198:2;7186:9;7177:7;7173:23;7169:32;7166:52;;;7214:1;7211;7204:12;7166:52;7254:9;7241:23;7287:18;7279:6;7276:30;7273:50;;;7319:1;7316;7309:12;7273:50;7342:22;;7395:4;7387:13;;7383:27;-1:-1:-1;7373:55:1;;7424:1;7421;7414:12;7373:55;7447:73;7512:7;7507:2;7494:16;7489:2;7485;7481:11;7447:73;:::i;7531:180::-;7590:6;7643:2;7631:9;7622:7;7618:23;7614:32;7611:52;;;7659:1;7656;7649:12;7611:52;-1:-1:-1;7682:23:1;;7531:180;-1:-1:-1;7531:180:1:o;7716:315::-;7784:6;7792;7845:2;7833:9;7824:7;7820:23;7816:32;7813:52;;;7861:1;7858;7851:12;7813:52;7897:9;7884:23;7874:33;;7957:2;7946:9;7942:18;7929:32;7970:31;7995:5;7970:31;:::i;8036:248::-;8104:6;8112;8165:2;8153:9;8144:7;8140:23;8136:32;8133:52;;;8181:1;8178;8171:12;8133:52;-1:-1:-1;;8204:23:1;;;8274:2;8259:18;;;8246:32;;-1:-1:-1;8036:248:1:o;8289:316::-;8330:3;8368:5;8362:12;8395:6;8390:3;8383:19;8411:63;8467:6;8460:4;8455:3;8451:14;8444:4;8437:5;8433:16;8411:63;:::i;:::-;8519:2;8507:15;8524:66;8503:88;8494:98;;;;8594:4;8490:109;;8289:316;-1:-1:-1;;8289:316:1:o;8610:185::-;8652:3;8690:5;8684:12;8705:52;8750:6;8745:3;8738:4;8731:5;8727:16;8705:52;:::i;:::-;8773:16;;;;;8610:185;-1:-1:-1;;8610:185:1:o;9729:1416::-;10006:3;10035:1;10068:6;10062:13;10098:3;10120:1;10148:9;10144:2;10140:18;10130:28;;10208:2;10197:9;10193:18;10230;10220:61;;10274:4;10266:6;10262:17;10252:27;;10220:61;10300:2;10348;10340:6;10337:14;10317:18;10314:38;10311:222;;;10387:77;10382:3;10375:90;10488:4;10485:1;10478:15;10518:4;10513:3;10506:17;10311:222;10549:18;10576:162;;;;10752:1;10747:320;;;;10542:525;;10576:162;10624:66;10613:9;10609:82;10604:3;10597:95;10721:6;10716:3;10712:16;10705:23;;10576:162;;10747:320;27040:1;27033:14;;;27077:4;27064:18;;10842:1;10856:165;10870:6;10867:1;10864:13;10856:165;;;10948:14;;10935:11;;;10928:35;10991:16;;;;10885:10;;10856:165;;;10860:3;;11050:6;11045:3;11041:16;11034:23;;10542:525;;;;;;;11083:56;11108:30;11134:3;11126:6;11108:30;:::i;:::-;8872:7;8860:20;;8905:1;8896:11;;8800:113;11083:56;11076:63;9729:1416;-1:-1:-1;;;;;9729:1416:1:o;11976:511::-;12170:4;-1:-1:-1;;;;;12280:2:1;12272:6;12268:15;12257:9;12250:34;12332:2;12324:6;12320:15;12315:2;12304:9;12300:18;12293:43;;12372:6;12367:2;12356:9;12352:18;12345:34;12415:3;12410:2;12399:9;12395:18;12388:31;12436:45;12476:3;12465:9;12461:19;12453:6;12436:45;:::i;:::-;12428:53;11976:511;-1:-1:-1;;;;;;11976:511:1:o;12794:632::-;12965:2;13017:21;;;13087:13;;12990:18;;;13109:22;;;12936:4;;12965:2;13188:15;;;;13162:2;13147:18;;;12936:4;13231:169;13245:6;13242:1;13239:13;13231:169;;;13306:13;;13294:26;;13375:15;;;;13340:12;;;;13267:1;13260:9;13231:169;;;-1:-1:-1;13417:3:1;;12794:632;-1:-1:-1;;;;;;12794:632:1:o;14481:219::-;14630:2;14619:9;14612:21;14593:4;14650:44;14690:2;14679:9;14675:18;14667:6;14650:44;:::i;26440:334::-;26511:2;26505:9;26567:2;26557:13;;26572:66;26553:86;26541:99;;26670:18;26655:34;;26691:22;;;26652:62;26649:88;;;26717:18;;:::i;:::-;26753:2;26746:22;26440:334;;-1:-1:-1;26440:334:1:o;26779:183::-;26839:4;26872:18;26864:6;26861:30;26858:56;;;26894:18;;:::i;:::-;-1:-1:-1;26939:1:1;26935:14;26951:4;26931:25;;26779:183::o;27093:224::-;27132:3;27160:6;27193:2;27190:1;27186:10;27223:2;27220:1;27216:10;27254:3;27250:2;27246:12;27241:3;27238:21;27235:47;;;27262:18;;:::i;:::-;27298:13;;27093:224;-1:-1:-1;;;;27093:224:1:o;27322:128::-;27362:3;27393:1;27389:6;27386:1;27383:13;27380:39;;;27399:18;;:::i;:::-;-1:-1:-1;27435:9:1;;27322:128::o;27455:204::-;27493:3;27529:4;27526:1;27522:12;27561:4;27558:1;27554:12;27596:3;27590:4;27586:14;27581:3;27578:23;27575:49;;;27604:18;;:::i;:::-;27640:13;;27455:204;-1:-1:-1;;;27455:204:1:o;27664:120::-;27704:1;27730;27720:35;;27735:18;;:::i;:::-;-1:-1:-1;27769:9:1;;27664:120::o;27789:228::-;27829:7;27955:1;27887:66;27883:74;27880:1;27877:81;27872:1;27865:9;27858:17;27854:105;27851:131;;;27962:18;;:::i;:::-;-1:-1:-1;28002:9:1;;27789:228::o;28022:125::-;28062:4;28090:1;28087;28084:8;28081:34;;;28095:18;;:::i;:::-;-1:-1:-1;28132:9:1;;28022:125::o;28152:258::-;28224:1;28234:113;28248:6;28245:1;28242:13;28234:113;;;28324:11;;;28318:18;28305:11;;;28298:39;28270:2;28263:10;28234:113;;;28365:6;28362:1;28359:13;28356:48;;;-1:-1:-1;;28400:1:1;28382:16;;28375:27;28152:258::o;28415:196::-;28454:3;28482:5;28472:39;;28491:18;;:::i;:::-;-1:-1:-1;28538:66:1;28527:78;;28415:196::o;28616:437::-;28695:1;28691:12;;;;28738;;;28759:61;;28813:4;28805:6;28801:17;28791:27;;28759:61;28866:2;28858:6;28855:14;28835:18;28832:38;28829:218;;;28903:77;28900:1;28893:88;29004:4;29001:1;28994:15;29032:4;29029:1;29022:15;28829:218;;28616:437;;;:::o;29058:197::-;29096:3;29124:6;29165:2;29158:5;29154:14;29192:2;29183:7;29180:15;29177:41;;;29198:18;;:::i;:::-;29247:1;29234:15;;29058:197;-1:-1:-1;;;29058:197:1:o;29260:195::-;29299:3;29330:66;29323:5;29320:77;29317:103;;;29400:18;;:::i;:::-;-1:-1:-1;29447:1:1;29436:13;;29260:195::o;29460:175::-;29497:3;29541:4;29534:5;29530:16;29570:4;29561:7;29558:17;29555:43;;;29578:18;;:::i;:::-;29627:1;29614:15;;29460:175;-1:-1:-1;;29460:175:1:o;29640:112::-;29672:1;29698;29688:35;;29703:18;;:::i;:::-;-1:-1:-1;29737:9:1;;29640:112::o;29757:184::-;29809:77;29806:1;29799:88;29906:4;29903:1;29896:15;29930:4;29927:1;29920:15;29946:184;29998:77;29995:1;29988:88;30095:4;30092:1;30085:15;30119:4;30116:1;30109:15;30135:184;30187:77;30184:1;30177:88;30284:4;30281:1;30274:15;30308:4;30305:1;30298:15;30324:184;30376:77;30373:1;30366:88;30473:4;30470:1;30463:15;30497:4;30494:1;30487:15;30513:184;30565:77;30562:1;30555:88;30662:4;30659:1;30652:15;30686:4;30683:1;30676:15;30702:154;-1:-1:-1;;;;;30781:5:1;30777:54;30770:5;30767:65;30757:93;;30846:1;30843;30836:12;30861:177;30946:66;30939:5;30935:78;30928:5;30925:89;30915:117;;31028:1;31025;31018:12
Swarm Source
ipfs://c7fc9be07d44a2042a8ce16bf2ccabeee956134582ff5daf73c60e092ec9941d
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.