Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 17294674 | 436 days ago | IN | 0 ETH | 0.16301159 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Shroomies
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-05-19 */ // SPDX-License-Identifier: MIT /** * @author - Roi Di Segni (@sheeeev66 of @thecoredevs) */ pragma solidity ^0.8.7; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: contracts/OperatorFilterer.sol /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); function __initialize_OperatorFilterer(address subscriptionOrRegistrantToCopy, bool subscribe) internal { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } // File: contracts/DefaultOperatorFilterer.sol /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); function __initialize_DefaultOperatorFilterer() internal {__initialize_OperatorFilterer(DEFAULT_SUBSCRIPTION, true);} } // 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 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) internal { 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, DefaultOperatorFilterer { using Address for address; using Strings for uint256; bool public initialized; uint internal idTracker; 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) internal _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @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 "Shroomies"; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() external pure override returns (string memory) { return "SHROOM"; } /** * @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 onlyAllowedOperatorApproval(to) { 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 onlyAllowedOperatorApproval(operator) { _setApprovalForAll(msg.sender, operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) external override onlyAllowedOperator(from) { //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 { // modifier already executed by the called contract safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override onlyAllowedOperator(from) { 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 { for (uint i; i < amount;) { unchecked { ++tokenId; ++i; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } unchecked { _balances[to] += amount; idTracker += 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 } /** * @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); unchecked { --_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; } } } // File: Shroomies.sol contract Shroomies is Ownable, IERC2981, ERC721 { bool public mintingEnabled; bool public wl1Enabled; bool public wl2Enabled; address evolvedContractAddr; IERC721 PAD; uint private pprice; uint private wprice; uint public maxTotalSupply; uint private EIP2981RoyaltyPercent; mapping(address => uint8) public amountMinted; mapping(bytes32 => bool) usedHash; function initialize( address _evolvedContractAddr, IERC721 pad, uint _royalty, uint publicPrice, uint whitelistPrice, uint _maxTotalSupply, string memory _baseURI ) external { require(!initialized, "contract already initialized"); _setOwner(msg.sender); __initialize_DefaultOperatorFilterer(); evolvedContractAddr = _evolvedContractAddr; PAD = pad; EIP2981RoyaltyPercent = _royalty; baseURI = _baseURI; pprice = publicPrice; wprice = whitelistPrice; maxTotalSupply = _maxTotalSupply; initialized = true; } function mint(uint256 amount) external payable { require(mintingEnabled, "Minting is not enabled!"); uint tokenId = idTracker; require(amount + tokenId <= maxTotalSupply, "Request exceeds max supply!"); require(msg.value == amount * pprice, "ETH Amount is not correct!"); _mint(amount, msg.sender, tokenId); } // paid wl function wl1Mint(bytes calldata sig, uint256 amount, uint nonce) external payable { require(wl1Enabled, "Minting is not enabled!"); bytes32 hash = _getW1Msg(msg.sender, amount, nonce); require(_checkSig(hash, sig), "invalid or used sig/hash!"); uint tokenId = idTracker; require(amount + tokenId <= maxTotalSupply, "Request exceeds max supply!"); require(msg.value == amount * wprice, "ETH Amount is not correct!"); require(amount + amountMinted[msg.sender] <= PAD.balanceOf(msg.sender), "address cannot mint more than it owns"); usedHash[hash] = true; amountMinted[msg.sender] += uint8(amount); _mint(amount, msg.sender, tokenId); } // free mint function wl2Mint(bytes calldata sig, uint256 amount, uint nonce) external { require(wl2Enabled, "Minting is not enabled!"); bytes32 hash = _getW2Msg(msg.sender, amount, nonce); require(_checkSig(hash, sig), "invalid or used sig/hash!"); uint tokenId = idTracker; require(amount + tokenId <= maxTotalSupply, "Request exceeds max supply!"); require(amount + amountMinted[msg.sender] <= PAD.balanceOf(msg.sender), "address cannot mint more than it owns"); usedHash[hash] = true; amountMinted[msg.sender] += uint8(amount); _mint(amount, msg.sender, tokenId); } function _checkSig(bytes32 hash, bytes memory _signature) private view returns(bool) { if (usedHash[hash]) return false; return ECDSA.recover( ECDSA.toEthSignedMessageHash(hash), _signature ) == owner(); } function getW1Msg(address _wallet, uint amount, uint nonce) external pure returns(bytes32) { return _getW1Msg(_wallet, amount, nonce); } function _getW1Msg(address _wallet, uint amount, uint nonce) private pure returns(bytes32) { return keccak256(abi.encodePacked("w1", _wallet, amount, nonce)); } function getW2Msg(address _wallet, uint amount, uint nonce) external pure returns(bytes32) { return _getW2Msg(_wallet, amount, nonce); } function _getW2Msg(address _wallet, uint amount, uint nonce) private pure returns(bytes32) { return keccak256(abi.encodePacked("w2", _wallet, amount, nonce)); } /** * @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, gas: 3000}(""); require(success, "Transfer to contract owner failed!"); } /** * @notice toggles minting */ function toggleMinting() external onlyOwner { mintingEnabled = !mintingEnabled; } function toggleW1Mint() external onlyOwner { wl1Enabled = !wl1Enabled; } function toggleW2Mint() external onlyOwner { wl2Enabled = !wl2Enabled; } function toggleAll(bool state) external onlyOwner { wl1Enabled = state; wl2Enabled = state; mintingEnabled = state; } function setEvolvedContract(address addr) external onlyOwner { evolvedContractAddr = addr; } function setMaxTotalSupply(uint newSupply) external onlyOwner { require(newSupply >= idTracker, "max supply cant be less than total supply"); maxTotalSupply = newSupply; } function setPublicPrice(uint price) external onlyOwner { pprice = price; } function setWLPrice(uint price) external onlyOwner { wprice = price; } function setPAD(IERC721 pad) external onlyOwner { PAD = pad; } function getPrices() external view returns (uint publicMint, uint whitelistMint) { publicMint = pprice; whitelistMint = wprice; } function getContractAddrs() external view returns(address evolved, address pad) { evolved = evolvedContractAddr; pad = address(PAD); } function tokensOfOwner(address owner) external view returns(uint[] memory) { uint[] memory tokens = new uint[](_balances[owner]); uint y = idTracker + 1; uint x; for (uint i = 1; i < y;) { if (_owners[i] == owner) { tokens[x] = i; unchecked{ ++x; } } unchecked{ ++i; } } return tokens; } function burnShroomie(uint id, address addr) external { require(msg.sender == evolvedContractAddr, "only evolved contract"); require(_owners[id] == addr, "addr doesnt own id"); unchecked { --_balances[addr]; } delete _owners[id]; delete _tokenApprovals[id]; emit Transfer(addr, address(0), id); } function burnShroomies(uint[] memory ids, address addr) external { require(msg.sender == evolvedContractAddr, "only evolved contract"); uint amount = ids.length; uint cId; for(uint i; i < amount;) { assembly { cId := mload(add(add(ids, 0x20), mul(i, 0x20))) } require(_owners[cId] == addr, "addr doesnt own id "); unchecked { delete _owners[cId]; ++i; } delete _tokenApprovals[cId]; emit Transfer(addr, address(0), cId); } unchecked { _balances[addr] -= amount; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountMinted","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":"id","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"burnShroomie","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"addr","type":"address"}],"name":"burnShroomies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractAddrs","outputs":[{"internalType":"address","name":"evolved","type":"address"},{"internalType":"address","name":"pad","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrices","outputs":[{"internalType":"uint256","name":"publicMint","type":"uint256"},{"internalType":"uint256","name":"whitelistMint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"getW1Msg","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"getW2Msg","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_evolvedContractAddr","type":"address"},{"internalType":"contract IERC721","name":"pad","type":"address"},{"internalType":"uint256","name":"_royalty","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"},{"internalType":"uint256","name":"whitelistPrice","type":"uint256"},{"internalType":"uint256","name":"_maxTotalSupply","type":"uint256"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","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":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"setEvolvedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"setMaxTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"pad","type":"address"}],"name":"setPAD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRoyaltyPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setWLPrice","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":[{"internalType":"bool","name":"state","type":"bool"}],"name":"toggleAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleW1Mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleW2Mint","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":[{"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"},{"inputs":[],"name":"wl1Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"wl1Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wl2Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"wl2Mint","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061369c806100206000396000f3fe6080604052600436106102935760003560e01c8063715018a61161015a578063b88d4fde116100c1578063ca0b7f011161007a578063ca0b7f0114610836578063d83fd51c14610856578063e985e9c514610876578063f2fde38b14610896578063f6a5b8e6146108b6578063f7cc8c1b146108d657600080fd5b8063b88d4fde1461076e578063bce187971461078e578063bd9a548b146107ae578063c2ccb992146107d6578063c6275255146107f6578063c87b56dd1461081657600080fd5b80638da5cb5b116101135780638da5cb5b146106bd57806395d89b41146106d25780639a4fc640146107015780639fd6db1214610721578063a0712d681461073b578063a22cb4651461074e57600080fd5b8063715018a6146105fe578063785b5086146106135780637d55094d14610628578063805434671461063d5780638462151c1461065c578063892ebb421461068957600080fd5b80633bab5670116101fe57806355f804b3116101b757806355f804b3146105545780635acdaa9f146105745780635b351ed8146105945780636352211e146105a95780636c0360eb146105c957806370a08231146105de57600080fd5b80633bab56701461047b5780633ccfd60b1461049b5780633f3e4c11146104b057806341f43434146104d057806342842e0e146104f2578063438a67e71461051257600080fd5b8063158ef93e11610250578063158ef93e146103a557806323b872dd146103c65780632954ddf6146103e65780632a55205a146104065780632ab4d052146104455780632b8a5e0e1461045b57600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc14610308578063095ea7b31461033557806310698f961461035757806310c785ab14610377575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612f4f565b6108e9565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506040805180820190915260098152685368726f6f6d69657360b81b60208201525b6040516102c49190613266565b34801561031457600080fd5b5061032861032336600461303b565b610914565b6040516102c491906131b7565b34801561034157600080fd5b50610355610350366004612df6565b6109a1565b005b34801561036357600080fd5b50610355610372366004612f15565b610b68565b34801561038357600080fd5b50610397610392366004612e22565b610bc3565b6040519081526020016102c4565b3480156103b157600080fd5b506000546102b890600160a01b900460ff1681565b3480156103d257600080fd5b506103556103e1366004612c80565b610bd8565b3480156103f257600080fd5b50610355610401366004612f89565b610d08565b34801561041257600080fd5b50610426610421366004613092565b610f26565b604080516001600160a01b0390931683526020830191909152016102c4565b34801561045157600080fd5b50610397600b5481565b34801561046757600080fd5b5061035561047636600461306d565b610fbd565b34801561048757600080fd5b50610355610496366004612d6e565b6110b5565b3480156104a757600080fd5b506103556111a1565b3480156104bc57600080fd5b506103556104cb36600461303b565b611280565b3480156104dc57600080fd5b506103286daaeb6d7670e522a718067333cd4e81565b3480156104fe57600080fd5b5061035561050d366004612c80565b611318565b34801561051e57600080fd5b5061054261052d366004612c2a565b600d6020526000908152604090205460ff1681565b60405160ff90911681526020016102c4565b34801561056057600080fd5b5061035561056f366004613007565b611338565b34801561058057600080fd5b5061039761058f366004612e22565b61137a565b3480156105a057600080fd5b50610355611387565b3480156105b557600080fd5b506103286105c436600461303b565b6113d3565b3480156105d557600080fd5b506102fb61144a565b3480156105ea57600080fd5b506103976105f9366004612c2a565b6114d8565b34801561060a57600080fd5b5061035561155f565b34801561061f57600080fd5b5061035561159a565b34801561063457600080fd5b506103556115e8565b34801561064957600080fd5b506007546102b890610100900460ff1681565b34801561066857600080fd5b5061067c610677366004612c2a565b61162b565b6040516102c49190613222565b34801561069557600080fd5b506007546008546040516102c492630100000090046001600160a01b039081169216906131cb565b3480156106c957600080fd5b50610328611705565b3480156106de57600080fd5b506040805180820190915260068152655348524f4f4d60d01b60208201526102fb565b34801561070d57600080fd5b5061035561071c36600461303b565b611714565b34801561072d57600080fd5b506007546102b89060ff1681565b61035561074936600461303b565b611748565b34801561075a57600080fd5b50610355610769366004612d40565b6117ce565b34801561077a57600080fd5b50610355610789366004612cc1565b611891565b34801561079a57600080fd5b506103556107a9366004612e57565b6119ca565b3480156107ba57600080fd5b50600954600a54604080519283526020830191909152016102c4565b3480156107e257600080fd5b506007546102b89062010000900460ff1681565b34801561080257600080fd5b5061035561081136600461303b565b611afc565b34801561082257600080fd5b506102fb61083136600461303b565b611b30565b34801561084257600080fd5b50610355610851366004612c2a565b611bd1565b34801561086257600080fd5b50610355610871366004612c2a565b611c2c565b34801561088257600080fd5b506102b8610891366004612c47565b611c7d565b3480156108a257600080fd5b506103556108b1366004612c2a565b611cab565b3480156108c257600080fd5b506103556108d136600461303b565b611d4b565b6103556108e4366004612f89565b611d7f565b60006001600160e01b0319821663152a902d60e11b148061090e575061090e82611e6a565b92915050565b600061091f82611eba565b6109855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610a5957604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906109ea90309085906004016131cb565b60206040518083038186803b158015610a0257600080fd5b505afa158015610a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3a9190612f32565b610a595780604051633b79c77360e21b815260040161097c91906131b7565b6000828152600360205260409020546001600160a01b03908116908416811415610acf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161097c565b336001600160a01b0382161480610aeb5750610aeb8133611c7d565b610b585760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606482015260840161097c565b610b628484611ed7565b50505050565b33610b71611705565b6001600160a01b031614610b975760405162461bcd60e51b815260040161097c90613362565b6007805462ffff00191661010092151592830262ff00001916176201000083021760ff19169091179055565b6000610bd0848484611f45565b949350505050565b826daaeb6d7670e522a718067333cd4e3b15610cd7576001600160a01b038116331415610c3557610c093383611f9b565b610c255760405162461bcd60e51b815260040161097c90613397565b610c3084848461205a565b610b62565b604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c617113490610c6890309033906004016131cb565b60206040518083038186803b158015610c8057600080fd5b505afa158015610c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb89190612f32565b610cd75733604051633b79c77360e21b815260040161097c91906131b7565b610ce13383611f9b565b610cfd5760405162461bcd60e51b815260040161097c90613397565b610b6284848461205a565b60075462010000900460ff16610d305760405162461bcd60e51b815260040161097c906132cb565b6000610d3d3384846121a9565b9050610d7f8186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121e492505050565b610d9b5760405162461bcd60e51b815260040161097c9061341f565b600154600b54610dab8286613482565b1115610dc95760405162461bcd60e51b815260040161097c906133e8565b6008546040516370a0823160e01b81526001600160a01b03909116906370a0823190610df99033906004016131b7565b60206040518083038186803b158015610e1157600080fd5b505afa158015610e25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e499190613054565b336000908152600d6020526040902054610e669060ff1686613482565b1115610ec25760405162461bcd60e51b815260206004820152602560248201527f616464726573732063616e6e6f74206d696e74206d6f7265207468616e206974604482015264206f776e7360d81b606482015260840161097c565b6000828152600e60209081526040808320805460ff19166001179055338352600d90915281208054869290610efb90849060ff1661349a565b92506101000a81548160ff021916908360ff160217905550610f1e843383612285565b505050505050565b600080610f3284611eba565b610f8e5760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201526620746f6b656e2160c81b606482015260840161097c565b610f96611705565b612710600c5485610fa791906134d3565b610fb191906134bf565b915091505b9250929050565b600754630100000090046001600160a01b03163314610fee5760405162461bcd60e51b815260040161097c90613333565b6000828152600360205260409020546001600160a01b0382811691161461104c5760405162461bcd60e51b81526020600482015260126024820152711859191c88191bd95cdb9d081bdddb881a5960721b604482015260640161097c565b6001600160a01b038116600081815260046020908152604080832080546000190190558583526003825280832080546001600160a01b03199081169091556005909252808320805490921690915551849290600080516020613647833981519152908390a45050565b600054600160a01b900460ff161561110f5760405162461bcd60e51b815260206004820152601c60248201527f636f6e747261637420616c726561647920696e697469616c697a656400000000604482015260640161097c565b61111833612344565b611120612394565b600780546301000000600160b81b03191663010000006001600160a01b038a81169190910291909117909155600880546001600160a01b031916918816919091179055600c859055805161117b906002906020840190612b03565b5050600992909255600a55600b5550506000805460ff60a01b1916600160a01b17905550565b336111aa611705565b6001600160a01b0316146111d05760405162461bcd60e51b815260040161097c90613362565b60405147906000903390610bb890849084818181858888f193505050503d8060008114611219576040519150601f19603f3d011682016040523d82523d6000602084013e61121e565b606091505b5050809150508061127c5760405162461bcd60e51b815260206004820152602260248201527f5472616e7366657220746f20636f6e7472616374206f776e6572206661696c65604482015261642160f01b606482015260840161097c565b5050565b33611289611705565b6001600160a01b0316146112af5760405162461bcd60e51b815260040161097c90613362565b6001548110156113135760405162461bcd60e51b815260206004820152602960248201527f6d617820737570706c792063616e74206265206c657373207468616e20746f74604482015268616c20737570706c7960b81b606482015260840161097c565b600b55565b61133383838360405180602001604052806000815250611891565b505050565b33611341611705565b6001600160a01b0316146113675760405162461bcd60e51b815260040161097c90613362565b805161127c906002906020840190612b03565b6000610bd08484846121a9565b33611390611705565b6001600160a01b0316146113b65760405162461bcd60e51b815260040161097c90613362565b6007805461ff001981166101009182900460ff1615909102179055565b6000818152600360205260408120546001600160a01b03168061090e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161097c565b6002805461145790613535565b80601f016020809104026020016040519081016040528092919081815260200182805461148390613535565b80156114d05780601f106114a5576101008083540402835291602001916114d0565b820191906000526020600020905b8154815290600101906020018083116114b357829003601f168201915b505050505081565b60006001600160a01b0382166115435760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161097c565b506001600160a01b031660009081526004602052604090205490565b33611568611705565b6001600160a01b03161461158e5760405162461bcd60e51b815260040161097c90613362565b6115986000612344565b565b336115a3611705565b6001600160a01b0316146115c95760405162461bcd60e51b815260040161097c90613362565b6007805462ff0000198116620100009182900460ff1615909102179055565b336115f1611705565b6001600160a01b0316146116175760405162461bcd60e51b815260040161097c90613362565b6007805460ff19811660ff90911615179055565b6001600160a01b038116600090815260046020526040812054606091906001600160401b0381111561165f5761165f6135f7565b604051908082528060200260200182016040528015611688578160200160208202803683370190505b5090506000600154600161169c9190613482565b9050600060015b828110156116fb576000818152600360205260409020546001600160a01b03878116911614156116f357808483815181106116e0576116e06135e1565b6020026020010181815250508160010191505b6001016116a3565b5091949350505050565b6000546001600160a01b031690565b3361171d611705565b6001600160a01b0316146117435760405162461bcd60e51b815260040161097c90613362565b600c55565b60075460ff1661176a5760405162461bcd60e51b815260040161097c906132cb565b600154600b5461177a8284613482565b11156117985760405162461bcd60e51b815260040161097c906133e8565b6009546117a590836134d3565b34146117c35760405162461bcd60e51b815260040161097c906132fc565b61127c823383612285565b816daaeb6d7670e522a718067333cd4e3b1561188657604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c61711349061181790309085906004016131cb565b60206040518083038186803b15801561182f57600080fd5b505afa158015611843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118679190612f32565b6118865780604051633b79c77360e21b815260040161097c91906131b7565b6113333384846123b3565b836daaeb6d7670e522a718067333cd4e3b15611991576001600160a01b0381163314156118ef576118c23384611f9b565b6118de5760405162461bcd60e51b815260040161097c90613397565b6118ea8585858561247e565b6119c3565b604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c61711349061192290309033906004016131cb565b60206040518083038186803b15801561193a57600080fd5b505afa15801561194e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119729190612f32565b6119915733604051633b79c77360e21b815260040161097c91906131b7565b61199b3384611f9b565b6119b75760405162461bcd60e51b815260040161097c90613397565b6119c38585858561247e565b5050505050565b600754630100000090046001600160a01b031633146119fb5760405162461bcd60e51b815260040161097c90613333565b81516000805b82811015611ad65760208181028601810151600081815260039092526040909120549092506001600160a01b03858116911614611a765760405162461bcd60e51b8152602060048201526013602482015272030b23239103237b2b9b73a1037bbb71034b21606d1b604482015260640161097c565b600082815260036020908152604080832080546001600160a01b03199081169091556005909252808320805490921690915551600192909201918391906001600160a01b03871690600080516020613647833981519152908390a4611a01565b50506001600160a01b039091166000908152600460205260409020805491909103905550565b33611b05611705565b6001600160a01b031614611b2b5760405162461bcd60e51b815260040161097c90613362565b600955565b6060611b3b82611eba565b611b9f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161097c565b6002611baa836124b1565b604051602001611bbb9291906130fc565b6040516020818303038152906040529050919050565b33611bda611705565b6001600160a01b031614611c005760405162461bcd60e51b815260040161097c90613362565b600780546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b33611c35611705565b6001600160a01b031614611c5b5760405162461bcd60e51b815260040161097c90613362565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b33611cb4611705565b6001600160a01b031614611cda5760405162461bcd60e51b815260040161097c90613362565b6001600160a01b038116611d3f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097c565b611d4881612344565b50565b33611d54611705565b6001600160a01b031614611d7a5760405162461bcd60e51b815260040161097c90613362565b600a55565b600754610100900460ff16611da65760405162461bcd60e51b815260040161097c906132cb565b6000611db3338484611f45565b9050611df58186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121e492505050565b611e115760405162461bcd60e51b815260040161097c9061341f565b600154600b54611e218286613482565b1115611e3f5760405162461bcd60e51b815260040161097c906133e8565b600a54611e4c90856134d3565b3414610dc95760405162461bcd60e51b815260040161097c906132fc565b60006001600160e01b031982166380ac58cd60e01b1480611e9b57506001600160e01b03198216635b5e139f60e01b145b8061090e57506301ffc9a760e01b6001600160e01b031983161461090e565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f0c826113d3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60405161773160f01b60208201526001600160601b0319606085901b16602282015260368101839052605681018290526000906076015b6040516020818303038152906040528051906020012090509392505050565b6000611fa682611eba565b6120075760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161097c565b6000828152600360205260409020546001600160a01b0390811690841681148061204a5750836001600160a01b031661203f84610914565b6001600160a01b0316145b80610bd05750610bd08185611c7d565b6000818152600360205260409020546001600160a01b038481169116146120d15760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161097c565b6001600160a01b0382166121335760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161097c565b61213e600082611ed7565b6001600160a01b038084166000818152600460209081526040808320805460001901905593861680835284832080546001019055858352600390915283822080546001600160a01b0319168217905592518493929160008051602061364783398151915291a4505050565b604051613b9960f11b60208201526001600160601b0319606085901b1660228201526036810183905260568101829052600090607601611f7c565b6000828152600e602052604081205460ff16156122035750600061090e565b61220b611705565b6001600160a01b031661227461226e856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b846125ae565b6001600160a01b0316149392505050565b60005b838110156122e657600191820160008181526003602052604080822080546001600160a01b0319166001600160a01b0388169081179091559051929493909301928492909190600080516020613647833981519152908290a4612288565b506001600160a01b03821660009081526004602090815260408083208054870190556001805487019055805191820190528181526123289190849084906125d2565b6113335760405162461bcd60e51b815260040161097c90613279565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611598733cc6cdda760b79bafa08df41ecfa224f810dceb660016126df565b816001600160a01b0316836001600160a01b031614156124115760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604482015260640161097c565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61248984848461205a565b612495848484846125d2565b610b625760405162461bcd60e51b815260040161097c90613279565b6060816124d55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124ff57806124e981613570565b91506124f89050600a836134bf565b91506124d9565b6000816001600160401b03811115612519576125196135f7565b6040519080825280601f01601f191660200182016040528015612543576020820181803683370190505b5090505b8415610bd0576125586001836134f2565b9150612565600a8661358b565b612570906030613482565b60f81b818381518110612585576125856135e1565b60200101906001600160f81b031916908160001a9053506125a7600a866134bf565b9450612547565b60008060006125bd85856127ce565b915091506125ca8161283b565b509392505050565b60006001600160a01b0384163b156126d457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906126169033908990889088906004016131e5565b602060405180830381600087803b15801561263057600080fd5b505af1925050508015612660575060408051601f3d908101601f1916820190925261265d91810190612f6c565b60015b6126ba573d80801561268e576040519150601f19603f3d011682016040523d82523d6000602084013e612693565b606091505b5080516126b25760405162461bcd60e51b815260040161097c90613279565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bd0565b506001949350505050565b6daaeb6d7670e522a718067333cd4e3b1561127c57801561275b57604051633e9f1edf60e11b81526daaeb6d7670e522a718067333cd4e90637d3e3dbe9061272d90309086906004016131cb565b600060405180830381600087803b15801561274757600080fd5b505af1158015610f1e573d6000803e3d6000fd5b6001600160a01b0382161561279d5760405163a0af290360e01b81526daaeb6d7670e522a718067333cd4e9063a0af29039061272d90309086906004016131cb565b604051632210724360e11b81526daaeb6d7670e522a718067333cd4e90634420e4869061272d9030906004016131b7565b6000808251604114156128055760208301516040840151606085015160001a6127f9878285856129f1565b94509450505050610fb6565b82516040141561282f5760208301516040840151612824868383612ad4565b935093505050610fb6565b50600090506002610fb6565b600081600481111561284f5761284f6135cb565b14156128585750565b600181600481111561286c5761286c6135cb565b14156128b55760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640161097c565b60028160048111156128c9576128c96135cb565b14156129175760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161097c565b600381600481111561292b5761292b6135cb565b14156129845760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161097c565b6004816004811115612998576129986135cb565b1415611d485760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161097c565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612a1e5750600090506003612acb565b8460ff16601b14158015612a3657508460ff16601c14155b15612a475750600090506004612acb565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a9b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ac457600060019250925050612acb565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612af5878288856129f1565b935093505050935093915050565b828054612b0f90613535565b90600052602060002090601f016020900481019282612b315760008555612b77565b82601f10612b4a57805160ff1916838001178555612b77565b82800160010185558215612b77579182015b82811115612b77578251825591602001919060010190612b5c565b50612b83929150612b87565b5090565b5b80821115612b835760008155600101612b88565b60006001600160401b03831115612bb557612bb56135f7565b612bc8601f8401601f1916602001613452565b9050828152838383011115612bdc57600080fd5b828260208301376000602084830101529392505050565b8035612bfe8161360d565b919050565b600082601f830112612c1457600080fd5b612c2383833560208501612b9c565b9392505050565b600060208284031215612c3c57600080fd5b8135612c238161360d565b60008060408385031215612c5a57600080fd5b8235612c658161360d565b91506020830135612c758161360d565b809150509250929050565b600080600060608486031215612c9557600080fd5b8335612ca08161360d565b92506020840135612cb08161360d565b929592945050506040919091013590565b60008060008060808587031215612cd757600080fd5b8435612ce28161360d565b93506020850135612cf28161360d565b92506040850135915060608501356001600160401b03811115612d1457600080fd5b8501601f81018713612d2557600080fd5b612d3487823560208401612b9c565b91505092959194509250565b60008060408385031215612d5357600080fd5b8235612d5e8161360d565b91506020830135612c7581613622565b600080600080600080600060e0888a031215612d8957600080fd5b8735612d948161360d565b96506020880135612da48161360d565b955060408801359450606088013593506080880135925060a0880135915060c08801356001600160401b03811115612ddb57600080fd5b612de78a828b01612c03565b91505092959891949750929550565b60008060408385031215612e0957600080fd5b8235612e148161360d565b946020939093013593505050565b600080600060608486031215612e3757600080fd5b8335612e428161360d565b95602085013595506040909401359392505050565b60008060408385031215612e6a57600080fd5b82356001600160401b0380821115612e8157600080fd5b818501915085601f830112612e9557600080fd5b8135602082821115612ea957612ea96135f7565b8160051b9250612eba818401613452565b8281528181019085830185870184018b1015612ed557600080fd5b600096505b84871015612ef8578035835260019690960195918301918301612eda565b509650612f089050878201612bf3565b9450505050509250929050565b600060208284031215612f2757600080fd5b8135612c2381613622565b600060208284031215612f4457600080fd5b8151612c2381613622565b600060208284031215612f6157600080fd5b8135612c2381613630565b600060208284031215612f7e57600080fd5b8151612c2381613630565b60008060008060608587031215612f9f57600080fd5b84356001600160401b0380821115612fb657600080fd5b818701915087601f830112612fca57600080fd5b813581811115612fd957600080fd5b886020828501011115612feb57600080fd5b6020928301999098509187013596604001359550909350505050565b60006020828403121561301957600080fd5b81356001600160401b0381111561302f57600080fd5b610bd084828501612c03565b60006020828403121561304d57600080fd5b5035919050565b60006020828403121561306657600080fd5b5051919050565b6000806040838503121561308057600080fd5b823591506020830135612c758161360d565b600080604083850312156130a557600080fd5b50508035926020909101359150565b600081518084526130cc816020860160208601613509565b601f01601f19169290920160200192915050565b600081516130f2818560208601613509565b9290920192915050565b600080845481600182811c91508083168061311857607f831692505b602080841082141561313857634e487b7160e01b86526022600452602486fd5b81801561314c576001811461315d5761318a565b60ff1986168952848901965061318a565b60008b81526020902060005b868110156131825781548b820152908501908301613169565b505084890196505b5050505050506131ae61319d82866130e0565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613218908301846130b4565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561325a5783518352928401929184019160010161323e565b50909695505050505050565b602081526000612c2360208301846130b4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601790820152764d696e74696e67206973206e6f7420656e61626c65642160481b604082015260600190565b6020808252601a908201527f45544820416d6f756e74206973206e6f7420636f727265637421000000000000604082015260600190565b6020808252601590820152741bdb9b1e48195d9bdb1d99590818dbdb9d1c9858dd605a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601b908201527f526571756573742065786365656473206d617820737570706c79210000000000604082015260600190565b602080825260199082015278696e76616c6964206f722075736564207369672f686173682160381b604082015260600190565b604051601f8201601f191681016001600160401b038111828210171561347a5761347a6135f7565b604052919050565b600082198211156134955761349561359f565b500190565b600060ff821660ff84168060ff038211156134b7576134b761359f565b019392505050565b6000826134ce576134ce6135b5565b500490565b60008160001904831182151516156134ed576134ed61359f565b500290565b6000828210156135045761350461359f565b500390565b60005b8381101561352457818101518382015260200161350c565b83811115610b625750506000910152565b600181811c9082168061354957607f821691505b6020821081141561356a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135845761358461359f565b5060010190565b60008261359a5761359a6135b5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611d4857600080fd5b8015158114611d4857600080fd5b6001600160e01b031981168114611d4857600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a272cbe1083f2a2dcb80943a1938fd082375cd5fb8cb67d3e7b4e8c850892e7264736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102935760003560e01c8063715018a61161015a578063b88d4fde116100c1578063ca0b7f011161007a578063ca0b7f0114610836578063d83fd51c14610856578063e985e9c514610876578063f2fde38b14610896578063f6a5b8e6146108b6578063f7cc8c1b146108d657600080fd5b8063b88d4fde1461076e578063bce187971461078e578063bd9a548b146107ae578063c2ccb992146107d6578063c6275255146107f6578063c87b56dd1461081657600080fd5b80638da5cb5b116101135780638da5cb5b146106bd57806395d89b41146106d25780639a4fc640146107015780639fd6db1214610721578063a0712d681461073b578063a22cb4651461074e57600080fd5b8063715018a6146105fe578063785b5086146106135780637d55094d14610628578063805434671461063d5780638462151c1461065c578063892ebb421461068957600080fd5b80633bab5670116101fe57806355f804b3116101b757806355f804b3146105545780635acdaa9f146105745780635b351ed8146105945780636352211e146105a95780636c0360eb146105c957806370a08231146105de57600080fd5b80633bab56701461047b5780633ccfd60b1461049b5780633f3e4c11146104b057806341f43434146104d057806342842e0e146104f2578063438a67e71461051257600080fd5b8063158ef93e11610250578063158ef93e146103a557806323b872dd146103c65780632954ddf6146103e65780632a55205a146104065780632ab4d052146104455780632b8a5e0e1461045b57600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc14610308578063095ea7b31461033557806310698f961461035757806310c785ab14610377575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612f4f565b6108e9565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506040805180820190915260098152685368726f6f6d69657360b81b60208201525b6040516102c49190613266565b34801561031457600080fd5b5061032861032336600461303b565b610914565b6040516102c491906131b7565b34801561034157600080fd5b50610355610350366004612df6565b6109a1565b005b34801561036357600080fd5b50610355610372366004612f15565b610b68565b34801561038357600080fd5b50610397610392366004612e22565b610bc3565b6040519081526020016102c4565b3480156103b157600080fd5b506000546102b890600160a01b900460ff1681565b3480156103d257600080fd5b506103556103e1366004612c80565b610bd8565b3480156103f257600080fd5b50610355610401366004612f89565b610d08565b34801561041257600080fd5b50610426610421366004613092565b610f26565b604080516001600160a01b0390931683526020830191909152016102c4565b34801561045157600080fd5b50610397600b5481565b34801561046757600080fd5b5061035561047636600461306d565b610fbd565b34801561048757600080fd5b50610355610496366004612d6e565b6110b5565b3480156104a757600080fd5b506103556111a1565b3480156104bc57600080fd5b506103556104cb36600461303b565b611280565b3480156104dc57600080fd5b506103286daaeb6d7670e522a718067333cd4e81565b3480156104fe57600080fd5b5061035561050d366004612c80565b611318565b34801561051e57600080fd5b5061054261052d366004612c2a565b600d6020526000908152604090205460ff1681565b60405160ff90911681526020016102c4565b34801561056057600080fd5b5061035561056f366004613007565b611338565b34801561058057600080fd5b5061039761058f366004612e22565b61137a565b3480156105a057600080fd5b50610355611387565b3480156105b557600080fd5b506103286105c436600461303b565b6113d3565b3480156105d557600080fd5b506102fb61144a565b3480156105ea57600080fd5b506103976105f9366004612c2a565b6114d8565b34801561060a57600080fd5b5061035561155f565b34801561061f57600080fd5b5061035561159a565b34801561063457600080fd5b506103556115e8565b34801561064957600080fd5b506007546102b890610100900460ff1681565b34801561066857600080fd5b5061067c610677366004612c2a565b61162b565b6040516102c49190613222565b34801561069557600080fd5b506007546008546040516102c492630100000090046001600160a01b039081169216906131cb565b3480156106c957600080fd5b50610328611705565b3480156106de57600080fd5b506040805180820190915260068152655348524f4f4d60d01b60208201526102fb565b34801561070d57600080fd5b5061035561071c36600461303b565b611714565b34801561072d57600080fd5b506007546102b89060ff1681565b61035561074936600461303b565b611748565b34801561075a57600080fd5b50610355610769366004612d40565b6117ce565b34801561077a57600080fd5b50610355610789366004612cc1565b611891565b34801561079a57600080fd5b506103556107a9366004612e57565b6119ca565b3480156107ba57600080fd5b50600954600a54604080519283526020830191909152016102c4565b3480156107e257600080fd5b506007546102b89062010000900460ff1681565b34801561080257600080fd5b5061035561081136600461303b565b611afc565b34801561082257600080fd5b506102fb61083136600461303b565b611b30565b34801561084257600080fd5b50610355610851366004612c2a565b611bd1565b34801561086257600080fd5b50610355610871366004612c2a565b611c2c565b34801561088257600080fd5b506102b8610891366004612c47565b611c7d565b3480156108a257600080fd5b506103556108b1366004612c2a565b611cab565b3480156108c257600080fd5b506103556108d136600461303b565b611d4b565b6103556108e4366004612f89565b611d7f565b60006001600160e01b0319821663152a902d60e11b148061090e575061090e82611e6a565b92915050565b600061091f82611eba565b6109855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610a5957604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906109ea90309085906004016131cb565b60206040518083038186803b158015610a0257600080fd5b505afa158015610a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3a9190612f32565b610a595780604051633b79c77360e21b815260040161097c91906131b7565b6000828152600360205260409020546001600160a01b03908116908416811415610acf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161097c565b336001600160a01b0382161480610aeb5750610aeb8133611c7d565b610b585760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606482015260840161097c565b610b628484611ed7565b50505050565b33610b71611705565b6001600160a01b031614610b975760405162461bcd60e51b815260040161097c90613362565b6007805462ffff00191661010092151592830262ff00001916176201000083021760ff19169091179055565b6000610bd0848484611f45565b949350505050565b826daaeb6d7670e522a718067333cd4e3b15610cd7576001600160a01b038116331415610c3557610c093383611f9b565b610c255760405162461bcd60e51b815260040161097c90613397565b610c3084848461205a565b610b62565b604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c617113490610c6890309033906004016131cb565b60206040518083038186803b158015610c8057600080fd5b505afa158015610c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb89190612f32565b610cd75733604051633b79c77360e21b815260040161097c91906131b7565b610ce13383611f9b565b610cfd5760405162461bcd60e51b815260040161097c90613397565b610b6284848461205a565b60075462010000900460ff16610d305760405162461bcd60e51b815260040161097c906132cb565b6000610d3d3384846121a9565b9050610d7f8186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121e492505050565b610d9b5760405162461bcd60e51b815260040161097c9061341f565b600154600b54610dab8286613482565b1115610dc95760405162461bcd60e51b815260040161097c906133e8565b6008546040516370a0823160e01b81526001600160a01b03909116906370a0823190610df99033906004016131b7565b60206040518083038186803b158015610e1157600080fd5b505afa158015610e25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e499190613054565b336000908152600d6020526040902054610e669060ff1686613482565b1115610ec25760405162461bcd60e51b815260206004820152602560248201527f616464726573732063616e6e6f74206d696e74206d6f7265207468616e206974604482015264206f776e7360d81b606482015260840161097c565b6000828152600e60209081526040808320805460ff19166001179055338352600d90915281208054869290610efb90849060ff1661349a565b92506101000a81548160ff021916908360ff160217905550610f1e843383612285565b505050505050565b600080610f3284611eba565b610f8e5760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201526620746f6b656e2160c81b606482015260840161097c565b610f96611705565b612710600c5485610fa791906134d3565b610fb191906134bf565b915091505b9250929050565b600754630100000090046001600160a01b03163314610fee5760405162461bcd60e51b815260040161097c90613333565b6000828152600360205260409020546001600160a01b0382811691161461104c5760405162461bcd60e51b81526020600482015260126024820152711859191c88191bd95cdb9d081bdddb881a5960721b604482015260640161097c565b6001600160a01b038116600081815260046020908152604080832080546000190190558583526003825280832080546001600160a01b03199081169091556005909252808320805490921690915551849290600080516020613647833981519152908390a45050565b600054600160a01b900460ff161561110f5760405162461bcd60e51b815260206004820152601c60248201527f636f6e747261637420616c726561647920696e697469616c697a656400000000604482015260640161097c565b61111833612344565b611120612394565b600780546301000000600160b81b03191663010000006001600160a01b038a81169190910291909117909155600880546001600160a01b031916918816919091179055600c859055805161117b906002906020840190612b03565b5050600992909255600a55600b5550506000805460ff60a01b1916600160a01b17905550565b336111aa611705565b6001600160a01b0316146111d05760405162461bcd60e51b815260040161097c90613362565b60405147906000903390610bb890849084818181858888f193505050503d8060008114611219576040519150601f19603f3d011682016040523d82523d6000602084013e61121e565b606091505b5050809150508061127c5760405162461bcd60e51b815260206004820152602260248201527f5472616e7366657220746f20636f6e7472616374206f776e6572206661696c65604482015261642160f01b606482015260840161097c565b5050565b33611289611705565b6001600160a01b0316146112af5760405162461bcd60e51b815260040161097c90613362565b6001548110156113135760405162461bcd60e51b815260206004820152602960248201527f6d617820737570706c792063616e74206265206c657373207468616e20746f74604482015268616c20737570706c7960b81b606482015260840161097c565b600b55565b61133383838360405180602001604052806000815250611891565b505050565b33611341611705565b6001600160a01b0316146113675760405162461bcd60e51b815260040161097c90613362565b805161127c906002906020840190612b03565b6000610bd08484846121a9565b33611390611705565b6001600160a01b0316146113b65760405162461bcd60e51b815260040161097c90613362565b6007805461ff001981166101009182900460ff1615909102179055565b6000818152600360205260408120546001600160a01b03168061090e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161097c565b6002805461145790613535565b80601f016020809104026020016040519081016040528092919081815260200182805461148390613535565b80156114d05780601f106114a5576101008083540402835291602001916114d0565b820191906000526020600020905b8154815290600101906020018083116114b357829003601f168201915b505050505081565b60006001600160a01b0382166115435760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161097c565b506001600160a01b031660009081526004602052604090205490565b33611568611705565b6001600160a01b03161461158e5760405162461bcd60e51b815260040161097c90613362565b6115986000612344565b565b336115a3611705565b6001600160a01b0316146115c95760405162461bcd60e51b815260040161097c90613362565b6007805462ff0000198116620100009182900460ff1615909102179055565b336115f1611705565b6001600160a01b0316146116175760405162461bcd60e51b815260040161097c90613362565b6007805460ff19811660ff90911615179055565b6001600160a01b038116600090815260046020526040812054606091906001600160401b0381111561165f5761165f6135f7565b604051908082528060200260200182016040528015611688578160200160208202803683370190505b5090506000600154600161169c9190613482565b9050600060015b828110156116fb576000818152600360205260409020546001600160a01b03878116911614156116f357808483815181106116e0576116e06135e1565b6020026020010181815250508160010191505b6001016116a3565b5091949350505050565b6000546001600160a01b031690565b3361171d611705565b6001600160a01b0316146117435760405162461bcd60e51b815260040161097c90613362565b600c55565b60075460ff1661176a5760405162461bcd60e51b815260040161097c906132cb565b600154600b5461177a8284613482565b11156117985760405162461bcd60e51b815260040161097c906133e8565b6009546117a590836134d3565b34146117c35760405162461bcd60e51b815260040161097c906132fc565b61127c823383612285565b816daaeb6d7670e522a718067333cd4e3b1561188657604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c61711349061181790309085906004016131cb565b60206040518083038186803b15801561182f57600080fd5b505afa158015611843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118679190612f32565b6118865780604051633b79c77360e21b815260040161097c91906131b7565b6113333384846123b3565b836daaeb6d7670e522a718067333cd4e3b15611991576001600160a01b0381163314156118ef576118c23384611f9b565b6118de5760405162461bcd60e51b815260040161097c90613397565b6118ea8585858561247e565b6119c3565b604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c61711349061192290309033906004016131cb565b60206040518083038186803b15801561193a57600080fd5b505afa15801561194e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119729190612f32565b6119915733604051633b79c77360e21b815260040161097c91906131b7565b61199b3384611f9b565b6119b75760405162461bcd60e51b815260040161097c90613397565b6119c38585858561247e565b5050505050565b600754630100000090046001600160a01b031633146119fb5760405162461bcd60e51b815260040161097c90613333565b81516000805b82811015611ad65760208181028601810151600081815260039092526040909120549092506001600160a01b03858116911614611a765760405162461bcd60e51b8152602060048201526013602482015272030b23239103237b2b9b73a1037bbb71034b21606d1b604482015260640161097c565b600082815260036020908152604080832080546001600160a01b03199081169091556005909252808320805490921690915551600192909201918391906001600160a01b03871690600080516020613647833981519152908390a4611a01565b50506001600160a01b039091166000908152600460205260409020805491909103905550565b33611b05611705565b6001600160a01b031614611b2b5760405162461bcd60e51b815260040161097c90613362565b600955565b6060611b3b82611eba565b611b9f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161097c565b6002611baa836124b1565b604051602001611bbb9291906130fc565b6040516020818303038152906040529050919050565b33611bda611705565b6001600160a01b031614611c005760405162461bcd60e51b815260040161097c90613362565b600780546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b33611c35611705565b6001600160a01b031614611c5b5760405162461bcd60e51b815260040161097c90613362565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b33611cb4611705565b6001600160a01b031614611cda5760405162461bcd60e51b815260040161097c90613362565b6001600160a01b038116611d3f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097c565b611d4881612344565b50565b33611d54611705565b6001600160a01b031614611d7a5760405162461bcd60e51b815260040161097c90613362565b600a55565b600754610100900460ff16611da65760405162461bcd60e51b815260040161097c906132cb565b6000611db3338484611f45565b9050611df58186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121e492505050565b611e115760405162461bcd60e51b815260040161097c9061341f565b600154600b54611e218286613482565b1115611e3f5760405162461bcd60e51b815260040161097c906133e8565b600a54611e4c90856134d3565b3414610dc95760405162461bcd60e51b815260040161097c906132fc565b60006001600160e01b031982166380ac58cd60e01b1480611e9b57506001600160e01b03198216635b5e139f60e01b145b8061090e57506301ffc9a760e01b6001600160e01b031983161461090e565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f0c826113d3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60405161773160f01b60208201526001600160601b0319606085901b16602282015260368101839052605681018290526000906076015b6040516020818303038152906040528051906020012090509392505050565b6000611fa682611eba565b6120075760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161097c565b6000828152600360205260409020546001600160a01b0390811690841681148061204a5750836001600160a01b031661203f84610914565b6001600160a01b0316145b80610bd05750610bd08185611c7d565b6000818152600360205260409020546001600160a01b038481169116146120d15760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161097c565b6001600160a01b0382166121335760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161097c565b61213e600082611ed7565b6001600160a01b038084166000818152600460209081526040808320805460001901905593861680835284832080546001019055858352600390915283822080546001600160a01b0319168217905592518493929160008051602061364783398151915291a4505050565b604051613b9960f11b60208201526001600160601b0319606085901b1660228201526036810183905260568101829052600090607601611f7c565b6000828152600e602052604081205460ff16156122035750600061090e565b61220b611705565b6001600160a01b031661227461226e856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b846125ae565b6001600160a01b0316149392505050565b60005b838110156122e657600191820160008181526003602052604080822080546001600160a01b0319166001600160a01b0388169081179091559051929493909301928492909190600080516020613647833981519152908290a4612288565b506001600160a01b03821660009081526004602090815260408083208054870190556001805487019055805191820190528181526123289190849084906125d2565b6113335760405162461bcd60e51b815260040161097c90613279565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611598733cc6cdda760b79bafa08df41ecfa224f810dceb660016126df565b816001600160a01b0316836001600160a01b031614156124115760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604482015260640161097c565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61248984848461205a565b612495848484846125d2565b610b625760405162461bcd60e51b815260040161097c90613279565b6060816124d55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124ff57806124e981613570565b91506124f89050600a836134bf565b91506124d9565b6000816001600160401b03811115612519576125196135f7565b6040519080825280601f01601f191660200182016040528015612543576020820181803683370190505b5090505b8415610bd0576125586001836134f2565b9150612565600a8661358b565b612570906030613482565b60f81b818381518110612585576125856135e1565b60200101906001600160f81b031916908160001a9053506125a7600a866134bf565b9450612547565b60008060006125bd85856127ce565b915091506125ca8161283b565b509392505050565b60006001600160a01b0384163b156126d457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906126169033908990889088906004016131e5565b602060405180830381600087803b15801561263057600080fd5b505af1925050508015612660575060408051601f3d908101601f1916820190925261265d91810190612f6c565b60015b6126ba573d80801561268e576040519150601f19603f3d011682016040523d82523d6000602084013e612693565b606091505b5080516126b25760405162461bcd60e51b815260040161097c90613279565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bd0565b506001949350505050565b6daaeb6d7670e522a718067333cd4e3b1561127c57801561275b57604051633e9f1edf60e11b81526daaeb6d7670e522a718067333cd4e90637d3e3dbe9061272d90309086906004016131cb565b600060405180830381600087803b15801561274757600080fd5b505af1158015610f1e573d6000803e3d6000fd5b6001600160a01b0382161561279d5760405163a0af290360e01b81526daaeb6d7670e522a718067333cd4e9063a0af29039061272d90309086906004016131cb565b604051632210724360e11b81526daaeb6d7670e522a718067333cd4e90634420e4869061272d9030906004016131b7565b6000808251604114156128055760208301516040840151606085015160001a6127f9878285856129f1565b94509450505050610fb6565b82516040141561282f5760208301516040840151612824868383612ad4565b935093505050610fb6565b50600090506002610fb6565b600081600481111561284f5761284f6135cb565b14156128585750565b600181600481111561286c5761286c6135cb565b14156128b55760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640161097c565b60028160048111156128c9576128c96135cb565b14156129175760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161097c565b600381600481111561292b5761292b6135cb565b14156129845760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161097c565b6004816004811115612998576129986135cb565b1415611d485760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161097c565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612a1e5750600090506003612acb565b8460ff16601b14158015612a3657508460ff16601c14155b15612a475750600090506004612acb565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a9b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ac457600060019250925050612acb565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612af5878288856129f1565b935093505050935093915050565b828054612b0f90613535565b90600052602060002090601f016020900481019282612b315760008555612b77565b82601f10612b4a57805160ff1916838001178555612b77565b82800160010185558215612b77579182015b82811115612b77578251825591602001919060010190612b5c565b50612b83929150612b87565b5090565b5b80821115612b835760008155600101612b88565b60006001600160401b03831115612bb557612bb56135f7565b612bc8601f8401601f1916602001613452565b9050828152838383011115612bdc57600080fd5b828260208301376000602084830101529392505050565b8035612bfe8161360d565b919050565b600082601f830112612c1457600080fd5b612c2383833560208501612b9c565b9392505050565b600060208284031215612c3c57600080fd5b8135612c238161360d565b60008060408385031215612c5a57600080fd5b8235612c658161360d565b91506020830135612c758161360d565b809150509250929050565b600080600060608486031215612c9557600080fd5b8335612ca08161360d565b92506020840135612cb08161360d565b929592945050506040919091013590565b60008060008060808587031215612cd757600080fd5b8435612ce28161360d565b93506020850135612cf28161360d565b92506040850135915060608501356001600160401b03811115612d1457600080fd5b8501601f81018713612d2557600080fd5b612d3487823560208401612b9c565b91505092959194509250565b60008060408385031215612d5357600080fd5b8235612d5e8161360d565b91506020830135612c7581613622565b600080600080600080600060e0888a031215612d8957600080fd5b8735612d948161360d565b96506020880135612da48161360d565b955060408801359450606088013593506080880135925060a0880135915060c08801356001600160401b03811115612ddb57600080fd5b612de78a828b01612c03565b91505092959891949750929550565b60008060408385031215612e0957600080fd5b8235612e148161360d565b946020939093013593505050565b600080600060608486031215612e3757600080fd5b8335612e428161360d565b95602085013595506040909401359392505050565b60008060408385031215612e6a57600080fd5b82356001600160401b0380821115612e8157600080fd5b818501915085601f830112612e9557600080fd5b8135602082821115612ea957612ea96135f7565b8160051b9250612eba818401613452565b8281528181019085830185870184018b1015612ed557600080fd5b600096505b84871015612ef8578035835260019690960195918301918301612eda565b509650612f089050878201612bf3565b9450505050509250929050565b600060208284031215612f2757600080fd5b8135612c2381613622565b600060208284031215612f4457600080fd5b8151612c2381613622565b600060208284031215612f6157600080fd5b8135612c2381613630565b600060208284031215612f7e57600080fd5b8151612c2381613630565b60008060008060608587031215612f9f57600080fd5b84356001600160401b0380821115612fb657600080fd5b818701915087601f830112612fca57600080fd5b813581811115612fd957600080fd5b886020828501011115612feb57600080fd5b6020928301999098509187013596604001359550909350505050565b60006020828403121561301957600080fd5b81356001600160401b0381111561302f57600080fd5b610bd084828501612c03565b60006020828403121561304d57600080fd5b5035919050565b60006020828403121561306657600080fd5b5051919050565b6000806040838503121561308057600080fd5b823591506020830135612c758161360d565b600080604083850312156130a557600080fd5b50508035926020909101359150565b600081518084526130cc816020860160208601613509565b601f01601f19169290920160200192915050565b600081516130f2818560208601613509565b9290920192915050565b600080845481600182811c91508083168061311857607f831692505b602080841082141561313857634e487b7160e01b86526022600452602486fd5b81801561314c576001811461315d5761318a565b60ff1986168952848901965061318a565b60008b81526020902060005b868110156131825781548b820152908501908301613169565b505084890196505b5050505050506131ae61319d82866130e0565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613218908301846130b4565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561325a5783518352928401929184019160010161323e565b50909695505050505050565b602081526000612c2360208301846130b4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601790820152764d696e74696e67206973206e6f7420656e61626c65642160481b604082015260600190565b6020808252601a908201527f45544820416d6f756e74206973206e6f7420636f727265637421000000000000604082015260600190565b6020808252601590820152741bdb9b1e48195d9bdb1d99590818dbdb9d1c9858dd605a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601b908201527f526571756573742065786365656473206d617820737570706c79210000000000604082015260600190565b602080825260199082015278696e76616c6964206f722075736564207369672f686173682160381b604082015260600190565b604051601f8201601f191681016001600160401b038111828210171561347a5761347a6135f7565b604052919050565b600082198211156134955761349561359f565b500190565b600060ff821660ff84168060ff038211156134b7576134b761359f565b019392505050565b6000826134ce576134ce6135b5565b500490565b60008160001904831182151516156134ed576134ed61359f565b500290565b6000828210156135045761350461359f565b500390565b60005b8381101561352457818101518382015260200161350c565b83811115610b625750506000910152565b600181811c9082168061354957607f821691505b6020821081141561356a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135845761358461359f565b5060010190565b60008261359a5761359a6135b5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611d4857600080fd5b8015158114611d4857600080fd5b6001600160e01b031981168114611d4857600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a272cbe1083f2a2dcb80943a1938fd082375cd5fb8cb67d3e7b4e8c850892e7264736f6c63430008070033
Deployed Bytecode Sourcemap
38187:8499:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43246:241;;;;;;;;;;-1:-1:-1;43246:241:0;;;;;:::i;:::-;;:::i;:::-;;;14563:14:1;;14556:22;14538:41;;14526:2;14511:18;43246:241:0;;;;;;;;29004:100;;;;;;;;;;-1:-1:-1;29078:18:0;;;;;;;;;;;;-1:-1:-1;;;29078:18:0;;;;29004:100;;;;;;;:::i;30254:213::-;;;;;;;;;;-1:-1:-1;30254:213:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29762:426::-;;;;;;;;;;-1:-1:-1;29762:426:0;;;;;:::i;:::-;;:::i;:::-;;44098:149;;;;;;;;;;-1:-1:-1;44098:149:0;;;;;:::i;:::-;;:::i;41366:150::-;;;;;;;;;;-1:-1:-1;41366:150:0;;;;;:::i;:::-;;:::i;:::-;;;14736:25:1;;;14724:2;14709:18;41366:150:0;14590:177:1;27471:23:0;;;;;;;;;;-1:-1:-1;27471:23:0;;;;-1:-1:-1;;;27471:23:0;;;;;;31018:357;;;;;;;;;;-1:-1:-1;31018:357:0;;;;;:::i;:::-;;:::i;40443:644::-;;;;;;;;;;-1:-1:-1;40443:644:0;;;;;:::i;:::-;;:::i;42533:279::-;;;;;;;;;;-1:-1:-1;42533:279:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;13674:32:1;;;13656:51;;13738:2;13723:18;;13716:34;;;;13629:18;42533:279:0;13482:274:1;38445:26:0;;;;;;;;;;;;;;;;45604:377;;;;;;;;;;-1:-1:-1;45604:377:0;;;;;:::i;:::-;;:::i;38617:677::-;;;;;;;;;;-1:-1:-1;38617:677:0;;;;;:::i;:::-;;:::i;43495:254::-;;;;;;;;;;;;;:::i;44370:194::-;;;;;;;;;;-1:-1:-1;44370:194:0;;;;;:::i;:::-;;:::i;2907:143::-;;;;;;;;;;;;3007:42;2907:143;;31446:231;;;;;;;;;;-1:-1:-1;31446:231:0;;;;;:::i;:::-;;:::i;38523:45::-;;;;;;;;;;-1:-1:-1;38523:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27870:4:1;27858:17;;;27840:36;;27828:2;27813:18;38523:45:0;27698:184:1;29610:90:0;;;;;;;;;;-1:-1:-1;29610:90:0;;;;;:::i;:::-;;:::i;41706:150::-;;;;;;;;;;-1:-1:-1;41706:150:0;;;;;:::i;:::-;;:::i;43910:86::-;;;;;;;;;;;;;:::i;28706:231::-;;;;;;;;;;-1:-1:-1;28706:231:0;;;;;:::i;:::-;;:::i;27539:21::-;;;;;;;;;;;;;:::i;28442:202::-;;;;;;;;;;-1:-1:-1;28442:202:0;;;;;:::i;:::-;;:::i;7132:96::-;;;;;;;;;;;;;:::i;44004:86::-;;;;;;;;;;;;;:::i;43807:95::-;;;;;;;;;;;;;:::i;38277:22::-;;;;;;;;;;-1:-1:-1;38277:22:0;;;;;;;;;;;45173:423;;;;;;;;;;-1:-1:-1;45173:423:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45008:157::-;;;;;;;;;;-1:-1:-1;45109:19:0;;45153:3;;45008:157;;;;45109:19;;;-1:-1:-1;;;;;45109:19:0;;;;45153:3;;45008:157;:::i;6483:87::-;;;;;;;;;;;;;:::i;29173:99::-;;;;;;;;;;-1:-1:-1;29249:15:0;;;;;;;;;;;;-1:-1:-1;;;29249:15:0;;;;29173:99;;43063:111;;;;;;;;;;-1:-1:-1;43063:111:0;;;;;:::i;:::-;;:::i;38244:26::-;;;;;;;;;;-1:-1:-1;38244:26:0;;;;;;;;39302:361;;;;;;:::i;:::-;;:::i;30539:185::-;;;;;;;;;;-1:-1:-1;30539:185:0;;;;;:::i;:::-;;:::i;31748:344::-;;;;;;;;;;-1:-1:-1;31748:344:0;;;;;:::i;:::-;;:::i;45989:694::-;;;;;;;;;;-1:-1:-1;45989:694:0;;;;;:::i;:::-;;:::i;44848:152::-;;;;;;;;;;-1:-1:-1;44953:6:0;;44986;;44848:152;;;27619:25:1;;;27675:2;27660:18;;27653:34;;;;27592:18;44848:152:0;27445:248:1;38306:22:0;;;;;;;;;;-1:-1:-1;38306:22:0;;;;;;;;;;;44572:88;;;;;;;;;;-1:-1:-1;44572:88:0;;;;;:::i;:::-;;:::i;29343:259::-;;;;;;;;;;-1:-1:-1;29343:259:0;;;;;:::i;:::-;;:::i;44256:106::-;;;;;;;;;;-1:-1:-1;44256:106:0;;;;;:::i;:::-;;:::i;44764:76::-;;;;;;;;;;-1:-1:-1;44764:76:0;;;;;:::i;:::-;;:::i;30795:156::-;;;;;;;;;;-1:-1:-1;30795:156:0;;;;;:::i;:::-;;:::i;7383:194::-;;;;;;;;;;-1:-1:-1;7383:194:0;;;;;:::i;:::-;;:::i;44672:84::-;;;;;;;;;;-1:-1:-1;44672:84:0;;;;;:::i;:::-;;:::i;39687:730::-;;;;;;:::i;:::-;;:::i;43246:241::-;43348:4;-1:-1:-1;;;;;;43385:41:0;;-1:-1:-1;;;43385:41:0;;:94;;;43443:36;43467:11;43443:23;:36::i;:::-;43365:114;43246:241;-1:-1:-1;;43246:241:0:o;30254:213::-;30322:7;30350:16;30358:7;30350;:16::i;:::-;30342:73;;;;-1:-1:-1;;;30342:73:0;;24745:2:1;30342:73:0;;;24727:21:1;24784:2;24764:18;;;24757:30;24823:34;24803:18;;;24796:62;-1:-1:-1;;;24874:18:1;;;24867:42;24926:19;;30342:73:0;;;;;;;;;-1:-1:-1;30435:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30435:24:0;;30254:213::o;29762:426::-;29854:2;3007:42;4937:45;:49;4933:225;;5008:67;;-1:-1:-1;;;5008:67:0;;3007:42;;5008;;:67;;5059:4;;5066:8;;5008:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5003:144;;5122:8;5103:28;;-1:-1:-1;;;5103:28:0;;;;;;;;:::i;5003:144::-;29869:13:::1;29885:16:::0;;;:7:::1;:16;::::0;;;;;-1:-1:-1;;;;;29885:16:0;;::::1;::::0;29920:11;::::1;::::0;::::1;;29912:57;;;::::0;-1:-1:-1;;;29912:57:0;;25935:2:1;29912:57:0::1;::::0;::::1;25917:21:1::0;25974:2;25954:18;;;25947:30;26013:34;25993:18;;;25986:62;-1:-1:-1;;;26064:18:1;;;26057:31;26105:19;;29912:57:0::1;25733:397:1::0;29912:57:0::1;30004:10;-1:-1:-1::0;;;;;30004:19:0;::::1;;::::0;:58:::1;;;30027:35;30044:5;30051:10;30027:16;:35::i;:::-;29982:164;;;::::0;-1:-1:-1;;;29982:164:0;;21872:2:1;29982:164:0::1;::::0;::::1;21854:21:1::0;21911:2;21891:18;;;21884:30;21950:34;21930:18;;;21923:62;-1:-1:-1;;;22001:18:1;;;21994:54;22065:19;;29982:164:0::1;21670:420:1::0;29982:164:0::1;30159:21;30168:2;30172:7;30159:8;:21::i;:::-;29858:330;29762:426:::0;;;:::o;44098:149::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;44159:10:::1;:18:::0;;-1:-1:-1;;44188:18:0;44159::::1;::::0;::::1;;::::0;;::::1;-1:-1:-1::0;;44188:18:0;;;;::::1;;-1:-1:-1::0;;44217:22:0::1;::::0;;::::1;::::0;;44098:149::o;41366:150::-;41448:7;41475:33;41485:7;41494:6;41502:5;41475:9;:33::i;:::-;41468:40;41366:150;-1:-1:-1;;;;41366:150:0:o;31018:357::-;31155:4;3007:42;4191:45;:49;4187:539;;-1:-1:-1;;;;;4472:18:0;;4480:10;4472:18;4468:85;;;31233:39:::1;31252:10;31264:7;31233:18;:39::i;:::-;31225:101;;;;-1:-1:-1::0;;;31225:101:0::1;;;;;;;:::i;:::-;31339:28;31349:4;31355:2;31359:7;31339:9;:28::i;:::-;4531:7:::0;;4468:85;4572:69;;-1:-1:-1;;;4572:69:0;;3007:42;;4572;;:69;;4623:4;;4630:10;;4572:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4567:148;;4688:10;4669:30;;-1:-1:-1;;;4669:30:0;;;;;;;;:::i;4567:148::-;31233:39:::1;31252:10;31264:7;31233:18;:39::i;:::-;31225:101;;;;-1:-1:-1::0;;;31225:101:0::1;;;;;;;:::i;:::-;31339:28;31349:4;31355:2;31359:7;31339:9;:28::i;40443:644::-:0;40536:10;;;;;;;40528:46;;;;-1:-1:-1;;;40528:46:0;;;;;;;:::i;:::-;40585:12;40600:36;40610:10;40622:6;40630:5;40600:9;:36::i;:::-;40585:51;;40655:20;40665:4;40671:3;;40655:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40655:9:0;;-1:-1:-1;;;40655:20:0:i;:::-;40647:58;;;;-1:-1:-1;;;40647:58:0;;;;;;;:::i;:::-;40731:9;;40779:14;;40759:16;40731:9;40759:6;:16;:::i;:::-;:34;;40751:74;;;;-1:-1:-1;;;40751:74:0;;;;;;;:::i;:::-;40881:3;;:25;;-1:-1:-1;;;40881:25:0;;-1:-1:-1;;;;;40881:3:0;;;;:13;;:25;;40895:10;;40881:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40866:10;40853:24;;;;:12;:24;;;;;;40844:33;;40853:24;;40844:6;:33;:::i;:::-;:62;;40836:112;;;;-1:-1:-1;;;40836:112:0;;23118:2:1;40836:112:0;;;23100:21:1;23157:2;23137:18;;;23130:30;23196:34;23176:18;;;23169:62;-1:-1:-1;;;23247:18:1;;;23240:35;23292:19;;40836:112:0;22916:401:1;40836:112:0;40961:14;;;;:8;:14;;;;;;;;:21;;-1:-1:-1;;40961:21:0;40978:4;40961:21;;;41006:10;40993:24;;:12;:24;;;;;:41;;41027:6;;40961:14;40993:41;;41027:6;;40961:21;40993:41;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41045:34;41051:6;41059:10;41071:7;41045:5;:34::i;:::-;40517:570;;40443:644;;;;:::o;42533:279::-;42615:16;42633:21;42675:16;42683:7;42675;:16::i;:::-;42667:68;;;;-1:-1:-1;;;42667:68:0;;24337:2:1;42667:68:0;;;24319:21:1;24376:2;24356:18;;;24349:30;24415:34;24395:18;;;24388:62;-1:-1:-1;;;24466:18:1;;;24459:37;24513:19;;42667:68:0;24135:403:1;42667:68:0;42753:7;:5;:7::i;:::-;42798:5;42774:21;;42762:9;:33;;;;:::i;:::-;:41;;;;:::i;:::-;42746:58;;;;42533:279;;;;;;:::o;45604:377::-;45691:19;;;;;-1:-1:-1;;;;;45691:19:0;45677:10;:33;45669:67;;;;-1:-1:-1;;;45669:67:0;;;;;;;:::i;:::-;45755:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;45755:19:0;;;:11;;:19;45747:50;;;;-1:-1:-1;;;45747:50:0;;20762:2:1;45747:50:0;;;20744:21:1;20801:2;20781:18;;;20774:30;-1:-1:-1;;;20820:18:1;;;20813:48;20878:18;;45747:50:0;20560:342:1;45747:50:0;-1:-1:-1;;;;;45835:15:0;;;;;;:9;:15;;;;;;;;45833:17;;-1:-1:-1;;45833:17:0;;;45879:11;;;:7;:11;;;;;45872:18;;-1:-1:-1;;;;;;45872:18:0;;;;;;45908:15;:19;;;;;;45901:26;;;;;;;;45943:30;45887:2;;45835:15;-1:-1:-1;;;;;;;;;;;45943:30:0;45835:15;;45943:30;45604:377;;:::o;38617:677::-;38879:11;;-1:-1:-1;;;38879:11:0;;;;38878:12;38870:53;;;;-1:-1:-1;;;38870:53:0;;16193:2:1;38870:53:0;;;16175:21:1;16232:2;16212:18;;;16205:30;16271;16251:18;;;16244:58;16319:18;;38870:53:0;15991:352:1;38870:53:0;38934:21;38944:10;38934:9;:21::i;:::-;38966:38;:36;:38::i;:::-;39015:19;:42;;-1:-1:-1;;;;;;39015:42:0;;-1:-1:-1;;;;;39015:42:0;;;;;;;;;;;;;;39068:3;:9;;-1:-1:-1;;;;;;39068:9:0;;;;;;;;;;39088:21;:32;;;39131:18;;;;:7;;:18;;;;;:::i;:::-;-1:-1:-1;;39160:6:0;:20;;;;39191:6;:23;39225:14;:32;-1:-1:-1;;;39268:18:0;;-1:-1:-1;;;;39268:18:0;-1:-1:-1;;;39268:18:0;;;-1:-1:-1;38617:677:0:o;43495:254::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;43625:51:::1;::::0;43556:21:::1;::::0;43545:8:::1;::::0;43633:10:::1;::::0;43667:4:::1;::::0;43556:21;;43545:8;43625:51;43545:8;43625:51;43556:21;43633:10;43667:4;43625:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43611:65;;;;;43695:7;43687:54;;;::::0;-1:-1:-1;;;43687:54:0;;18142:2:1;43687:54:0::1;::::0;::::1;18124:21:1::0;18181:2;18161:18;;;18154:30;18220:34;18200:18;;;18193:62;-1:-1:-1;;;18271:18:1;;;18264:32;18313:19;;43687:54:0::1;17940:398:1::0;43687:54:0::1;43534:215;;43495:254::o:0;44370:194::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;44464:9:::1;;44451;:22;;44443:76;;;::::0;-1:-1:-1;;;44443:76:0;;23927:2:1;44443:76:0::1;::::0;::::1;23909:21:1::0;23966:2;23946:18;;;23939:30;24005:34;23985:18;;;23978:62;-1:-1:-1;;;24056:18:1;;;24049:39;24105:19;;44443:76:0::1;23725:405:1::0;44443:76:0::1;44530:14;:26:::0;44370:194::o;31446:231::-;31630:39;31647:4;31653:2;31657:7;31630:39;;;;;;;;;;;;:16;:39::i;:::-;31446:231;;;:::o;29610:90::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;29679:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;41706:150::-:0;41788:7;41815:33;41825:7;41834:6;41842:5;41815:9;:33::i;43910:86::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;43978:10:::1;::::0;;-1:-1:-1;;43964:24:0;::::1;43978:10;::::0;;;::::1;;;43977:11;43964:24:::0;;::::1;;::::0;;43910:86::o;28706:231::-;28770:7;28806:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28806:16:0;28841:19;28833:73;;;;-1:-1:-1;;;28833:73:0;;22708:2:1;28833:73:0;;;22690:21:1;22747:2;22727:18;;;22720:30;22786:34;22766:18;;;22759:62;-1:-1:-1;;;22837:18:1;;;22830:39;22886:19;;28833:73:0;22506:405:1;27539:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28442:202::-;28508:7;-1:-1:-1;;;;;28536:19:0;;28528:74;;;;-1:-1:-1;;;28528:74:0;;22297:2:1;28528:74:0;;;22279:21:1;22336:2;22316:18;;;22309:30;22375:34;22355:18;;;22348:62;-1:-1:-1;;;22426:18:1;;;22419:40;22476:19;;28528:74:0;22095:406:1;28528:74:0;-1:-1:-1;;;;;;28620:16:0;;;;;:9;:16;;;;;;;28442:202::o;7132:96::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;7199:21:::1;7217:1;7199:9;:21::i;:::-;7132:96::o:0;44004:86::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;44072:10:::1;::::0;;-1:-1:-1;;44058:24:0;::::1;44072:10:::0;;;;::::1;;;44071:11;44058:24:::0;;::::1;;::::0;;44004:86::o;43807:95::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;43880:14:::1;::::0;;-1:-1:-1;;43862:32:0;::::1;43880:14;::::0;;::::1;43879:15;43862:32;::::0;;43807:95::o;45173:423::-;-1:-1:-1;;;;;45293:16:0;;45259:20;45293:16;;;:9;:16;;;;;;45233:13;;45259:20;-1:-1:-1;;;;;45282:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45282:28:0;;45259:51;;45321:6;45330:9;;45342:1;45330:13;;;;:::i;:::-;45321:22;-1:-1:-1;45354:6:0;45387:1;45373:190;45394:1;45390;:5;45373:190;;;45417:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;45417:19:0;;;:10;;:19;45413:108;;;45469:1;45457:6;45464:1;45457:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;45500:3;;;;;45413:108;45546:3;;45373:190;;;-1:-1:-1;45582:6:0;;45173:423;-1:-1:-1;;;;45173:423:0:o;6483:87::-;6529:7;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87::o;43063:111::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;43136:21:::1;:30:::0;43063:111::o;39302:361::-;39368:14;;;;39360:50;;;;-1:-1:-1;;;39360:50:0;;;;;;;:::i;:::-;39436:9;;39484:14;;39464:16;39436:9;39464:6;:16;:::i;:::-;:34;;39456:74;;;;-1:-1:-1;;;39456:74:0;;;;;;;:::i;:::-;39571:6;;39562:15;;:6;:15;:::i;:::-;39549:9;:28;39541:67;;;;-1:-1:-1;;;39541:67:0;;;;;;;:::i;:::-;39621:34;39627:6;39635:10;39647:7;39621:5;:34::i;30539:185::-;30645:8;3007:42;4937:45;:49;4933:225;;5008:67;;-1:-1:-1;;;5008:67:0;;3007:42;;5008;;:67;;5059:4;;5066:8;;5008:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5003:144;;5122:8;5103:28;;-1:-1:-1;;;5103:28:0;;;;;;;;:::i;5003:144::-;30666:50:::1;30685:10;30697:8;30707;30666:18;:50::i;31748:344::-:0;31916:4;3007:42;4191:45;:49;4187:539;;-1:-1:-1;;;;;4472:18:0;;4480:10;4472:18;4468:85;;;31941:39:::1;31960:10;31972:7;31941:18;:39::i;:::-;31933:101;;;;-1:-1:-1::0;;;31933:101:0::1;;;;;;;:::i;:::-;32045:39;32059:4;32065:2;32069:7;32078:5;32045:13;:39::i;:::-;4531:7:::0;;4468:85;4572:69;;-1:-1:-1;;;4572:69:0;;3007:42;;4572;;:69;;4623:4;;4630:10;;4572:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4567:148;;4688:10;4669:30;;-1:-1:-1;;;4669:30:0;;;;;;;;:::i;4567:148::-;31941:39:::1;31960:10;31972:7;31941:18;:39::i;:::-;31933:101;;;;-1:-1:-1::0;;;31933:101:0::1;;;;;;;:::i;:::-;32045:39;32059:4;32065:2;32069:7;32078:5;32045:13;:39::i;:::-;31748:344:::0;;;;;:::o;45989:694::-;46087:19;;;;;-1:-1:-1;;;;;46087:19:0;46073:10;:33;46065:67;;;;-1:-1:-1;;;46065:67:0;;;;;;;:::i;:::-;46159:10;;46145:11;;46201:401;46217:6;46213:1;:10;46201:401;;;46309:4;46302:12;;;46282:33;;;;46276:40;46353:12;;;;:7;:12;;;;;;;;46276:40;;-1:-1:-1;;;;;;46353:20:0;;;:12;;:20;46345:52;;;;-1:-1:-1;;;46345:52:0;;19304:2:1;46345:52:0;;;19286:21:1;19343:2;19323:18;;;19316:30;-1:-1:-1;;;19362:18:1;;;19355:49;19421:18;;46345:52:0;19102:343:1;46345:52:0;46448:12;;;;:7;:12;;;;;;;;46441:19;;-1:-1:-1;;;;;;46441:19:0;;;;;;46519:15;:20;;;;;;46512:27;;;;;;;;46559:31;46441:19;46479:3;;;;;46456;;46448:12;-1:-1:-1;;;;;46559:31:0;;;-1:-1:-1;;;;;;;;;;;46559:31:0;46448:12;;46559:31;46201:401;;;-1:-1:-1;;;;;;;46639:15:0;;;;;;;:9;:15;;;;;:25;;;;;;;;-1:-1:-1;45989:694:0:o;44572:88::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;44638:6:::1;:14:::0;44572:88::o;29343:259::-;29410:13;29444:16;29452:7;29444;:16::i;:::-;29436:76;;;;-1:-1:-1;;;29436:76:0;;25519:2:1;29436:76:0;;;25501:21:1;25558:2;25538:18;;;25531:30;25597:34;25577:18;;;25570:62;-1:-1:-1;;;25648:18:1;;;25641:45;25703:19;;29436:76:0;25317:411:1;29436:76:0;29556:7;29565:18;:7;:16;:18::i;:::-;29539:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29525:69;;29343:259;;;:::o;44256:106::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;44328:19:::1;:26:::0;;-1:-1:-1;;;;;44328:26:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;44328:26:0;;::::1;::::0;;;::::1;::::0;;44256:106::o;44764:76::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;44823:3:::1;:9:::0;;-1:-1:-1;;;;;;44823:9:0::1;-1:-1:-1::0;;;;;44823:9:0;;;::::1;::::0;;;::::1;::::0;;44764:76::o;30795:156::-;-1:-1:-1;;;;;30908:25:0;;;30884:4;30908:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30795:156::o;7383:194::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7474:22:0;::::1;7466:73;;;::::0;-1:-1:-1;;;7466:73:0;;17329:2:1;7466:73:0::1;::::0;::::1;17311:21:1::0;17368:2;17348:18;;;17341:30;17407:34;17387:18;;;17380:62;-1:-1:-1;;;17458:18:1;;;17451:36;17504:19;;7466:73:0::1;17127:402:1::0;7466:73:0::1;7550:19;7560:8;7550:9;:19::i;:::-;7383:194:::0;:::o;44672:84::-;6714:10;6703:7;:5;:7::i;:::-;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;;;;;;:::i;:::-;44734:6:::1;:14:::0;44672:84::o;39687:730::-;39788:10;;;;;;;39780:46;;;;-1:-1:-1;;;39780:46:0;;;;;;;:::i;:::-;39837:12;39852:36;39862:10;39874:6;39882:5;39852:9;:36::i;:::-;39837:51;;39907:20;39917:4;39923:3;;39907:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39907:9:0;;-1:-1:-1;;;39907:20:0:i;:::-;39899:58;;;;-1:-1:-1;;;39899:58:0;;;;;;;:::i;:::-;39983:9;;40031:14;;40011:16;39983:9;40011:6;:16;:::i;:::-;:34;;40003:74;;;;-1:-1:-1;;;40003:74:0;;;;;;;:::i;:::-;40118:6;;40109:15;;:6;:15;:::i;:::-;40096:9;:28;40088:67;;;;-1:-1:-1;;;40088:67:0;;;;;;;:::i;28073:305::-;28175:4;-1:-1:-1;;;;;;28212:40:0;;-1:-1:-1;;;28212:40:0;;:105;;-1:-1:-1;;;;;;;28269:48:0;;-1:-1:-1;;;28269:48:0;28212:105;:158;;;-1:-1:-1;;;;;;;;;;20520:40:0;;;28334:36;20411:157;33533:127;33598:4;33622:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33622:16:0;:30;;;33533:127::o;36158:174::-;36233:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36233:29:0;-1:-1:-1;;;;;36233:29:0;;;;;;;;:24;;36287:23;36233:24;36287:14;:23::i;:::-;-1:-1:-1;;;;;36278:46:0;;;;;;;;;;;36158:174;;:::o;41524:::-;41643:46;;-1:-1:-1;;;41643:46:0;;;12259:17:1;-1:-1:-1;;;;;;12313:2:1;12309:15;;;12305:53;12292:11;;;12285:74;12375:12;;;12368:28;;;12412:12;;;12405:28;;;41606:7:0;;12449:12:1;;41643:46:0;;;;;;;;;;;;;41633:57;;;;;;41626:64;;41524:174;;;;;:::o;33827:341::-;33920:4;33945:16;33953:7;33945;:16::i;:::-;33937:73;;;;-1:-1:-1;;;33937:73:0;;21109:2:1;33937:73:0;;;21091:21:1;21148:2;21128:18;;;21121:30;21187:34;21167:18;;;21160:62;-1:-1:-1;;;21238:18:1;;;21231:42;21290:19;;33937:73:0;20907:408:1;33937:73:0;34021:13;34037:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34037:16:0;;;;34072;;;;;:51;;;34116:7;-1:-1:-1;;;;;34092:31:0;:20;34104:7;34092:11;:20::i;:::-;-1:-1:-1;;;;;34092:31:0;;34072:51;:87;;;;34127:32;34144:5;34151:7;34127:16;:32::i;35485:555::-;35617:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;35617:24:0;;;:16;;:24;35609:74;;;;-1:-1:-1;;;35609:74:0;;17736:2:1;35609:74:0;;;17718:21:1;17775:2;17755:18;;;17748:30;17814:34;17794:18;;;17787:62;-1:-1:-1;;;17865:18:1;;;17858:35;17910:19;;35609:74:0;17534:401:1;35609:74:0;-1:-1:-1;;;;;35702:16:0;;35694:65;;;;-1:-1:-1;;;35694:65:0;;18545:2:1;35694:65:0;;;18527:21:1;18584:2;18564:18;;;18557:30;18623:34;18603:18;;;18596:62;-1:-1:-1;;;18674:18:1;;;18667:34;18718:19;;35694:65:0;18343:400:1;35694:65:0;35824:29;35841:1;35845:7;35824:8;:29::i;:::-;-1:-1:-1;;;;;35897:15:0;;;;;;;:9;:15;;;;;;;;35895:17;;-1:-1:-1;;35895:17:0;;;35929:13;;;;;;;;;35927:15;;35895:17;35927:15;;;35966:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35966:21:0;;;;;36005:27;;35974:7;;35929:13;35897:15;-1:-1:-1;;;;;;;;;;;36005:27:0;;35485:555;;;:::o;41864:174::-;41983:46;;-1:-1:-1;;;41983:46:0;;;11550:17:1;-1:-1:-1;;;;;;11604:2:1;11600:15;;;11596:53;11583:11;;;11576:74;11666:12;;;11659:28;;;11703:12;;;11696:28;;;41946:7:0;;11740:12:1;;41983:46:0;11264:494:1;41095:263:0;41174:4;41195:14;;;:8;:14;;;;;;;;41191:32;;;-1:-1:-1;41218:5:0;41211:12;;41191:32;41343:7;:5;:7::i;:::-;-1:-1:-1;;;;;41241:109:0;:98;41269:34;41298:4;16249:58;;11121:66:1;16249:58:0;;;11109:79:1;11204:12;;;11197:28;;;16116:7:0;;11241:12:1;;16249:58:0;;;;;;;;;;;;16239:69;;;;;;16232:76;;16047:269;;;;41269:34;41318:10;41241:13;:98::i;:::-;-1:-1:-1;;;;;41241:109:0;;;41095:263;-1:-1:-1;;;41095:263:0:o;34504:644::-;34588:6;34583:219;34600:6;34596:1;:10;34583:219;;;34653:9;;;;34716:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34716:21:0;-1:-1:-1;;;;;34716:21:0;;;;;;;;34757:33;;34653:9;;34681:3;;;;;34653:9;;34716:21;;:16;-1:-1:-1;;;;;;;;;;;34757:33:0;34716:16;;34757:33;34583:219;;;-1:-1:-1;;;;;;34839:13:0;;;;;;:9;:13;;;;;;;;:23;;;;;;-1:-1:-1;34877:19:0;;;;;;34942:51;;;;;;;;;;;;34839:13;34849:2;;34981:7;;34942:22;:51::i;:::-;34920:151;;;;-1:-1:-1;;;34920:151:0;;;;;;;:::i;7585:174::-;7642:16;7661:6;;-1:-1:-1;;;;;7678:17:0;;;-1:-1:-1;;;;;;7678:17:0;;;;;;7711:40;;7661:6;;;;;;;7711:40;;7642:16;7711:40;7631:128;7585:174;:::o;5558:117::-;5616:57;5506:42;5668:4;5616:29;:57::i;36474:315::-;36629:8;-1:-1:-1;;;;;36620:17:0;:5;-1:-1:-1;;;;;36620:17:0;;;36612:55;;;;-1:-1:-1;;;36612:55:0;;18950:2:1;36612:55:0;;;18932:21:1;18989:2;18969:18;;;18962:30;-1:-1:-1;;;19008:18:1;;;19001:55;19073:18;;36612:55:0;18748:349:1;36612:55:0;-1:-1:-1;;;;;36678:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36678:46:0;;;;;;;;;;36740:41;;14538::1;;;36740::0;;14511:18:1;36740:41:0;;;;;;;36474:315;;;:::o;32974:::-;33131:28;33141:4;33147:2;33151:7;33131:9;:28::i;:::-;33178:48;33201:4;33207:2;33211:7;33220:5;33178:22;:48::i;:::-;33170:111;;;;-1:-1:-1;;;33170:111:0;;;;;;;:::i;7988:723::-;8044:13;8265:10;8261:53;;-1:-1:-1;;8292:10:0;;;;;;;;;;;;-1:-1:-1;;;8292:10:0;;;;;7988:723::o;8261:53::-;8339:5;8324:12;8380:78;8387:9;;8380:78;;8413:8;;;;:::i;:::-;;-1:-1:-1;8436:10:0;;-1:-1:-1;8444:2:0;8436:10;;:::i;:::-;;;8380:78;;;8468:19;8500:6;-1:-1:-1;;;;;8490:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8490:17:0;;8468:39;;8518:154;8525:10;;8518:154;;8552:11;8562:1;8552:11;;:::i;:::-;;-1:-1:-1;8621:10:0;8629:2;8621:5;:10;:::i;:::-;8608:24;;:2;:24;:::i;:::-;8595:39;;8578:6;8585;8578:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8578:56:0;;;;;;;;-1:-1:-1;8649:11:0;8658:2;8649:11;;:::i;:::-;;;8518:154;;13048:231;13126:7;13147:17;13166:18;13188:27;13199:4;13205:9;13188:10;:27::i;:::-;13146:69;;;;13226:18;13238:5;13226:11;:18::i;:::-;-1:-1:-1;13262:9:0;13048:231;-1:-1:-1;;;13048:231:0:o;37354:798::-;37510:4;-1:-1:-1;;;;;37531:13:0;;17391:20;17439:8;37527:618;;37567:70;;-1:-1:-1;;;37567:70:0;;-1:-1:-1;;;;;37567:36:0;;;;;:70;;37604:10;;37616:4;;37622:7;;37631:5;;37567:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37567:70:0;;;;;;;;-1:-1:-1;;37567:70:0;;;;;;;;;;;;:::i;:::-;;;37563:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37807:13:0;;37803:272;;37850:60;;-1:-1:-1;;;37850:60:0;;;;;;;:::i;37803:272::-;38025:6;38019:13;38010:6;38006:2;38002:15;37995:38;37563:527;-1:-1:-1;;;;;;37688:51:0;-1:-1:-1;;;37688:51:0;;-1:-1:-1;37681:58:0;;37527:618;-1:-1:-1;38129:4:0;37354:798;;;;;;:::o;3059:952::-;3007:42;3461:45;:49;3457:547;;3531:9;3527:466;;;3561:92;;-1:-1:-1;;;3561:92:0;;3007:42;;3561:45;;:92;;3615:4;;3622:30;;3561:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3527:466;-1:-1:-1;;;;;3698:44:0;;;3694:284;;3767:94;;-1:-1:-1;;;3767:94:0;;3007:42;;3767:47;;:94;;3823:4;;3830:30;;3767:94;;;:::i;3694:284::-;3910:48;;-1:-1:-1;;;3910:48:0;;3007:42;;3910:33;;:48;;3952:4;;3910:48;;;:::i;10938:1308::-;11019:7;11028:12;11253:9;:16;11273:2;11253:22;11249:990;;;11549:4;11534:20;;11528:27;11599:4;11584:20;;11578:27;11657:4;11642:20;;11636:27;11292:9;11628:36;11700:25;11711:4;11628:36;11528:27;11578;11700:10;:25::i;:::-;11693:32;;;;;;;;;11249:990;11747:9;:16;11767:2;11747:22;11743:496;;;12022:4;12007:20;;12001:27;12073:4;12058:20;;12052:27;12115:23;12126:4;12001:27;12052;12115:10;:23::i;:::-;12108:30;;;;;;;;11743:496;-1:-1:-1;12187:1:0;;-1:-1:-1;12191:35:0;12171:56;;9209:643;9287:20;9278:5;:29;;;;;;;;:::i;:::-;;9274:571;;;9209:643;:::o;9274:571::-;9385:29;9376:5;:38;;;;;;;;:::i;:::-;;9372:473;;;9431:34;;-1:-1:-1;;;9431:34:0;;15840:2:1;9431:34:0;;;15822:21:1;15879:2;15859:18;;;15852:30;-1:-1:-1;;;15898:18:1;;;15891:54;15962:18;;9431:34:0;15638:348:1;9372:473:0;9496:35;9487:5;:44;;;;;;;;:::i;:::-;;9483:362;;;9548:41;;-1:-1:-1;;;9548:41:0;;16550:2:1;9548:41:0;;;16532:21:1;16589:2;16569:18;;;16562:30;16628:33;16608:18;;;16601:61;16679:18;;9548:41:0;16348:355:1;9483:362:0;9620:30;9611:5;:39;;;;;;;;:::i;:::-;;9607:238;;;9667:44;;-1:-1:-1;;;9667:44:0;;20359:2:1;9667:44:0;;;20341:21:1;20398:2;20378:18;;;20371:30;20437:34;20417:18;;;20410:62;-1:-1:-1;;;20488:18:1;;;20481:32;20530:19;;9667:44:0;20157:398:1;9607:238:0;9742:30;9733:5;:39;;;;;;;;:::i;:::-;;9729:116;;;9789:44;;-1:-1:-1;;;9789:44:0;;23524:2:1;9789:44:0;;;23506:21:1;23563:2;23543:18;;;23536:30;23602:34;23582:18;;;23575:62;-1:-1:-1;;;23653:18:1;;;23646:32;23695:19;;9789:44:0;23322:398:1;14115:1632:0;14246:7;;-1:-1:-1;;;;;15167:79:0;;15163:163;;;-1:-1:-1;15279:1:0;;-1:-1:-1;15283:30:0;15263:51;;15163:163;15340:1;:7;;15345:2;15340:7;;:18;;;;;15351:1;:7;;15356:2;15351:7;;15340:18;15336:102;;;-1:-1:-1;15391:1:0;;-1:-1:-1;15395:30:0;15375:51;;15336:102;15552:24;;;15535:14;15552:24;;;;;;;;;14999:25:1;;;15072:4;15060:17;;15040:18;;;15033:45;;;;15094:18;;;15087:34;;;15137:18;;;15130:34;;;15552:24:0;;14971:19:1;;15552:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15552:24:0;;-1:-1:-1;;15552:24:0;;;-1:-1:-1;;;;;;;15591:20:0;;15587:103;;15644:1;15648:29;15628:50;;;;;;;15587:103;15710:6;-1:-1:-1;15718:20:0;;-1:-1:-1;14115:1632:0;;;;;;;;:::o;13542:391::-;13656:7;;-1:-1:-1;;;;;13757:75:0;;13859:3;13855:12;;;13869:2;13851:21;13900:25;13911:4;13851:21;13920:1;13757:75;13900:10;:25::i;:::-;13893:32;;;;;;13542:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:134::-;493:20;;522:31;493:20;522:31;:::i;:::-;425:134;;;:::o;564:221::-;607:5;660:3;653:4;645:6;641:17;637:27;627:55;;678:1;675;668:12;627:55;700:79;775:3;766:6;753:20;746:4;738:6;734:17;700:79;:::i;:::-;691:88;564:221;-1:-1:-1;;;564:221:1:o;790:247::-;849:6;902:2;890:9;881:7;877:23;873:32;870:52;;;918:1;915;908:12;870:52;957:9;944:23;976:31;1001:5;976:31;:::i;1042:388::-;1110:6;1118;1171:2;1159:9;1150:7;1146:23;1142:32;1139:52;;;1187:1;1184;1177:12;1139:52;1226:9;1213:23;1245:31;1270:5;1245:31;:::i;:::-;1295:5;-1:-1:-1;1352:2:1;1337:18;;1324:32;1365:33;1324:32;1365:33;:::i;:::-;1417:7;1407:17;;;1042:388;;;;;:::o;1435:456::-;1512:6;1520;1528;1581:2;1569:9;1560:7;1556:23;1552:32;1549:52;;;1597:1;1594;1587:12;1549:52;1636:9;1623:23;1655:31;1680:5;1655:31;:::i;:::-;1705:5;-1:-1:-1;1762:2:1;1747:18;;1734:32;1775:33;1734:32;1775:33;:::i;:::-;1435:456;;1827:7;;-1:-1:-1;;;1881:2:1;1866:18;;;;1853:32;;1435:456::o;1896:794::-;1991:6;1999;2007;2015;2068:3;2056:9;2047:7;2043:23;2039:33;2036:53;;;2085:1;2082;2075:12;2036:53;2124:9;2111:23;2143:31;2168:5;2143:31;:::i;:::-;2193:5;-1:-1:-1;2250:2:1;2235:18;;2222:32;2263:33;2222:32;2263:33;:::i;:::-;2315:7;-1:-1:-1;2369:2:1;2354:18;;2341:32;;-1:-1:-1;2424:2:1;2409:18;;2396:32;-1:-1:-1;;;;;2440:30:1;;2437:50;;;2483:1;2480;2473:12;2437:50;2506:22;;2559:4;2551:13;;2547:27;-1:-1:-1;2537:55:1;;2588:1;2585;2578:12;2537:55;2611:73;2676:7;2671:2;2658:16;2653:2;2649;2645:11;2611:73;:::i;:::-;2601:83;;;1896:794;;;;;;;:::o;2695:382::-;2760:6;2768;2821:2;2809:9;2800:7;2796:23;2792:32;2789:52;;;2837:1;2834;2827:12;2789:52;2876:9;2863:23;2895:31;2920:5;2895:31;:::i;:::-;2945:5;-1:-1:-1;3002:2:1;2987:18;;2974:32;3015:30;2974:32;3015:30;:::i;3082:890::-;3221:6;3229;3237;3245;3253;3261;3269;3322:3;3310:9;3301:7;3297:23;3293:33;3290:53;;;3339:1;3336;3329:12;3290:53;3378:9;3365:23;3397:31;3422:5;3397:31;:::i;:::-;3447:5;-1:-1:-1;3504:2:1;3489:18;;3476:32;3517:33;3476:32;3517:33;:::i;:::-;3569:7;-1:-1:-1;3623:2:1;3608:18;;3595:32;;-1:-1:-1;3674:2:1;3659:18;;3646:32;;-1:-1:-1;3725:3:1;3710:19;;3697:33;;-1:-1:-1;3777:3:1;3762:19;;3749:33;;-1:-1:-1;3833:3:1;3818:19;;3805:33;-1:-1:-1;;;;;3850:30:1;;3847:50;;;3893:1;3890;3883:12;3847:50;3916;3958:7;3949:6;3938:9;3934:22;3916:50;:::i;:::-;3906:60;;;3082:890;;;;;;;;;;:::o;3977:315::-;4045:6;4053;4106:2;4094:9;4085:7;4081:23;4077:32;4074:52;;;4122:1;4119;4112:12;4074:52;4161:9;4148:23;4180:31;4205:5;4180:31;:::i;:::-;4230:5;4282:2;4267:18;;;;4254:32;;-1:-1:-1;;;3977:315:1:o;4297:383::-;4374:6;4382;4390;4443:2;4431:9;4422:7;4418:23;4414:32;4411:52;;;4459:1;4456;4449:12;4411:52;4498:9;4485:23;4517:31;4542:5;4517:31;:::i;:::-;4567:5;4619:2;4604:18;;4591:32;;-1:-1:-1;4670:2:1;4655:18;;;4642:32;;4297:383;-1:-1:-1;;;4297:383:1:o;4685:1033::-;4778:6;4786;4839:2;4827:9;4818:7;4814:23;4810:32;4807:52;;;4855:1;4852;4845:12;4807:52;4895:9;4882:23;-1:-1:-1;;;;;4965:2:1;4957:6;4954:14;4951:34;;;4981:1;4978;4971:12;4951:34;5019:6;5008:9;5004:22;4994:32;;5064:7;5057:4;5053:2;5049:13;5045:27;5035:55;;5086:1;5083;5076:12;5035:55;5122:2;5109:16;5144:4;5167:2;5163;5160:10;5157:36;;;5173:18;;:::i;:::-;5219:2;5216:1;5212:10;5202:20;;5242:28;5266:2;5262;5258:11;5242:28;:::i;:::-;5304:15;;;5335:12;;;;5367:11;;;5397;;;5393:20;;5390:33;-1:-1:-1;5387:53:1;;;5436:1;5433;5426:12;5387:53;5458:1;5449:10;;5468:163;5482:2;5479:1;5476:9;5468:163;;;5539:17;;5527:30;;5500:1;5493:9;;;;;5577:12;;;;5609;;5468:163;;;-1:-1:-1;5650:5:1;-1:-1:-1;5674:38:1;;-1:-1:-1;5693:18:1;;;5674:38;:::i;:::-;5664:48;;;;;;4685:1033;;;;;:::o;5723:241::-;5779:6;5832:2;5820:9;5811:7;5807:23;5803:32;5800:52;;;5848:1;5845;5838:12;5800:52;5887:9;5874:23;5906:28;5928:5;5906:28;:::i;5969:245::-;6036:6;6089:2;6077:9;6068:7;6064:23;6060:32;6057:52;;;6105:1;6102;6095:12;6057:52;6137:9;6131:16;6156:28;6178:5;6156:28;:::i;6219:245::-;6277:6;6330:2;6318:9;6309:7;6305:23;6301:32;6298:52;;;6346:1;6343;6336:12;6298:52;6385:9;6372:23;6404:30;6428:5;6404:30;:::i;6469:249::-;6538:6;6591:2;6579:9;6570:7;6566:23;6562:32;6559:52;;;6607:1;6604;6597:12;6559:52;6639:9;6633:16;6658:30;6682:5;6658:30;:::i;6723:733::-;6811:6;6819;6827;6835;6888:2;6876:9;6867:7;6863:23;6859:32;6856:52;;;6904:1;6901;6894:12;6856:52;6944:9;6931:23;-1:-1:-1;;;;;7014:2:1;7006:6;7003:14;7000:34;;;7030:1;7027;7020:12;7000:34;7068:6;7057:9;7053:22;7043:32;;7113:7;7106:4;7102:2;7098:13;7094:27;7084:55;;7135:1;7132;7125:12;7084:55;7175:2;7162:16;7201:2;7193:6;7190:14;7187:34;;;7217:1;7214;7207:12;7187:34;7264:7;7257:4;7248:6;7244:2;7240:15;7236:26;7233:39;7230:59;;;7285:1;7282;7275:12;7230:59;7316:4;7308:13;;;;7340:6;;-1:-1:-1;7378:20:1;;;7365:34;;7446:2;7431:18;7418:32;;-1:-1:-1;6723:733:1;;-1:-1:-1;;;;6723:733:1:o;7729:322::-;7798:6;7851:2;7839:9;7830:7;7826:23;7822:32;7819:52;;;7867:1;7864;7857:12;7819:52;7907:9;7894:23;-1:-1:-1;;;;;7932:6:1;7929:30;7926:50;;;7972:1;7969;7962:12;7926:50;7995;8037:7;8028:6;8017:9;8013:22;7995:50;:::i;8056:180::-;8115:6;8168:2;8156:9;8147:7;8143:23;8139:32;8136:52;;;8184:1;8181;8174:12;8136:52;-1:-1:-1;8207:23:1;;8056:180;-1:-1:-1;8056:180:1:o;8241:184::-;8311:6;8364:2;8352:9;8343:7;8339:23;8335:32;8332:52;;;8380:1;8377;8370:12;8332:52;-1:-1:-1;8403:16:1;;8241:184;-1:-1:-1;8241:184:1:o;8430:315::-;8498:6;8506;8559:2;8547:9;8538:7;8534:23;8530:32;8527:52;;;8575:1;8572;8565:12;8527:52;8611:9;8598:23;8588:33;;8671:2;8660:9;8656:18;8643:32;8684:31;8709:5;8684:31;:::i;8750:248::-;8818:6;8826;8879:2;8867:9;8858:7;8854:23;8850:32;8847:52;;;8895:1;8892;8885:12;8847:52;-1:-1:-1;;8918:23:1;;;8988:2;8973:18;;;8960:32;;-1:-1:-1;8750:248:1:o;9003:257::-;9044:3;9082:5;9076:12;9109:6;9104:3;9097:19;9125:63;9181:6;9174:4;9169:3;9165:14;9158:4;9151:5;9147:16;9125:63;:::i;:::-;9242:2;9221:15;-1:-1:-1;;9217:29:1;9208:39;;;;9249:4;9204:50;;9003:257;-1:-1:-1;;9003:257:1:o;9265:185::-;9307:3;9345:5;9339:12;9360:52;9405:6;9400:3;9393:4;9386:5;9382:16;9360:52;:::i;:::-;9428:16;;;;;9265:185;-1:-1:-1;;9265:185:1:o;9573:1301::-;9850:3;9879:1;9912:6;9906:13;9942:3;9964:1;9992:9;9988:2;9984:18;9974:28;;10052:2;10041:9;10037:18;10074;10064:61;;10118:4;10110:6;10106:17;10096:27;;10064:61;10144:2;10192;10184:6;10181:14;10161:18;10158:38;10155:165;;;-1:-1:-1;;;10219:33:1;;10275:4;10272:1;10265:15;10305:4;10226:3;10293:17;10155:165;10336:18;10363:104;;;;10481:1;10476:320;;;;10329:467;;10363:104;-1:-1:-1;;10396:24:1;;10384:37;;10441:16;;;;-1:-1:-1;10363:104:1;;10476:320;28240:1;28233:14;;;28277:4;28264:18;;10571:1;10585:165;10599:6;10596:1;10593:13;10585:165;;;10677:14;;10664:11;;;10657:35;10720:16;;;;10614:10;;10585:165;;;10589:3;;10779:6;10774:3;10770:16;10763:23;;10329:467;;;;;;;10812:56;10837:30;10863:3;10855:6;10837:30;:::i;:::-;-1:-1:-1;;;9515:20:1;;9560:1;9551:11;;9455:113;10812:56;10805:63;9573:1301;-1:-1:-1;;;;;9573:1301:1:o;12472:203::-;-1:-1:-1;;;;;12636:32:1;;;;12618:51;;12606:2;12591:18;;12472:203::o;12680:304::-;-1:-1:-1;;;;;12910:15:1;;;12892:34;;12962:15;;12957:2;12942:18;;12935:43;12842:2;12827:18;;12680:304::o;12989:488::-;-1:-1:-1;;;;;13258:15:1;;;13240:34;;13310:15;;13305:2;13290:18;;13283:43;13357:2;13342:18;;13335:34;;;13405:3;13400:2;13385:18;;13378:31;;;13183:4;;13426:45;;13451:19;;13443:6;13426:45;:::i;:::-;13418:53;12989:488;-1:-1:-1;;;;;;12989:488:1:o;13761:632::-;13932:2;13984:21;;;14054:13;;13957:18;;;14076:22;;;13903:4;;13932:2;14155:15;;;;14129:2;14114:18;;;13903:4;14198:169;14212:6;14209:1;14206:13;14198:169;;;14273:13;;14261:26;;14342:15;;;;14307:12;;;;14234:1;14227:9;14198:169;;;-1:-1:-1;14384:3:1;;13761:632;-1:-1:-1;;;;;;13761:632:1:o;15414:219::-;15563:2;15552:9;15545:21;15526:4;15583:44;15623:2;15612:9;15608:18;15600:6;15583:44;:::i;16708:414::-;16910:2;16892:21;;;16949:2;16929:18;;;16922:30;16988:34;16983:2;16968:18;;16961:62;-1:-1:-1;;;17054:2:1;17039:18;;17032:48;17112:3;17097:19;;16708:414::o;19450:347::-;19652:2;19634:21;;;19691:2;19671:18;;;19664:30;-1:-1:-1;;;19725:2:1;19710:18;;19703:53;19788:2;19773:18;;19450:347::o;19802:350::-;20004:2;19986:21;;;20043:2;20023:18;;;20016:30;20082:28;20077:2;20062:18;;20055:56;20143:2;20128:18;;19802:350::o;21320:345::-;21522:2;21504:21;;;21561:2;21541:18;;;21534:30;-1:-1:-1;;;21595:2:1;21580:18;;21573:51;21656:2;21641:18;;21320:345::o;24956:356::-;25158:2;25140:21;;;25177:18;;;25170:30;25236:34;25231:2;25216:18;;25209:62;25303:2;25288:18;;24956:356::o;26135:413::-;26337:2;26319:21;;;26376:2;26356:18;;;26349:30;26415:34;26410:2;26395:18;;26388:62;-1:-1:-1;;;26481:2:1;26466:18;;26459:47;26538:3;26523:19;;26135:413::o;26553:351::-;26755:2;26737:21;;;26794:2;26774:18;;;26767:30;26833:29;26828:2;26813:18;;26806:57;26895:2;26880:18;;26553:351::o;26909:349::-;27111:2;27093:21;;;27150:2;27130:18;;;27123:30;-1:-1:-1;;;27184:2:1;27169:18;;27162:55;27249:2;27234:18;;26909:349::o;27887:275::-;27958:2;27952:9;28023:2;28004:13;;-1:-1:-1;;28000:27:1;27988:40;;-1:-1:-1;;;;;28043:34:1;;28079:22;;;28040:62;28037:88;;;28105:18;;:::i;:::-;28141:2;28134:22;27887:275;;-1:-1:-1;27887:275:1:o;28293:128::-;28333:3;28364:1;28360:6;28357:1;28354:13;28351:39;;;28370:18;;:::i;:::-;-1:-1:-1;28406:9:1;;28293:128::o;28426:204::-;28464:3;28500:4;28497:1;28493:12;28532:4;28529:1;28525:12;28567:3;28561:4;28557:14;28552:3;28549:23;28546:49;;;28575:18;;:::i;:::-;28611:13;;28426:204;-1:-1:-1;;;28426:204:1:o;28635:120::-;28675:1;28701;28691:35;;28706:18;;:::i;:::-;-1:-1:-1;28740:9:1;;28635:120::o;28760:168::-;28800:7;28866:1;28862;28858:6;28854:14;28851:1;28848:21;28843:1;28836:9;28829:17;28825:45;28822:71;;;28873:18;;:::i;:::-;-1:-1:-1;28913:9:1;;28760:168::o;28933:125::-;28973:4;29001:1;28998;28995:8;28992:34;;;29006:18;;:::i;:::-;-1:-1:-1;29043:9:1;;28933:125::o;29063:258::-;29135:1;29145:113;29159:6;29156:1;29153:13;29145:113;;;29235:11;;;29229:18;29216:11;;;29209:39;29181:2;29174:10;29145:113;;;29276:6;29273:1;29270:13;29267:48;;;-1:-1:-1;;29311:1:1;29293:16;;29286:27;29063:258::o;29326:380::-;29405:1;29401:12;;;;29448;;;29469:61;;29523:4;29515:6;29511:17;29501:27;;29469:61;29576:2;29568:6;29565:14;29545:18;29542:38;29539:161;;;29622:10;29617:3;29613:20;29610:1;29603:31;29657:4;29654:1;29647:15;29685:4;29682:1;29675:15;29539:161;;29326:380;;;:::o;29711:135::-;29750:3;-1:-1:-1;;29771:17:1;;29768:43;;;29791:18;;:::i;:::-;-1:-1:-1;29838:1:1;29827:13;;29711:135::o;29851:112::-;29883:1;29909;29899:35;;29914:18;;:::i;:::-;-1:-1:-1;29948:9:1;;29851:112::o;29968:127::-;30029:10;30024:3;30020:20;30017:1;30010:31;30060:4;30057:1;30050:15;30084:4;30081:1;30074:15;30100:127;30161:10;30156:3;30152:20;30149:1;30142:31;30192:4;30189:1;30182:15;30216:4;30213:1;30206:15;30232:127;30293:10;30288:3;30284:20;30281:1;30274:31;30324:4;30321:1;30314:15;30348:4;30345:1;30338:15;30364:127;30425:10;30420:3;30416:20;30413:1;30406:31;30456:4;30453:1;30446:15;30480:4;30477:1;30470:15;30496:127;30557:10;30552:3;30548:20;30545:1;30538:31;30588:4;30585:1;30578:15;30612:4;30609:1;30602:15;30628:131;-1:-1:-1;;;;;30703:31:1;;30693:42;;30683:70;;30749:1;30746;30739:12;30764:118;30850:5;30843:13;30836:21;30829:5;30826:32;30816:60;;30872:1;30869;30862:12;30887:131;-1:-1:-1;;;;;;30961:32:1;;30951:43;;30941:71;;31008:1;31005;30998:12
Swarm Source
ipfs://a272cbe1083f2a2dcb80943a1938fd082375cd5fb8cb67d3e7b4e8c850892e72
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.