Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
5,555 PECFREN
Holders
1,194
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 PECFRENLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PECFriends
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-07 */ // File: utils/MerkleProof.sol pragma solidity ^0.8.0; library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // File: utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: security/ReentrancyGuard.sol pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: ERC721A.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: PECFriends.sol pragma solidity ^0.8.0; contract PECFriends is Ownable, ERC721A, ReentrancyGuard { enum MintType { Round1WL, Round2WL, Round2Pub, Round3WL, Round3Pub } mapping (MintType => mapping (address => uint256)) public roundMintedNumber; uint32 public constant EXPIRE_SECONDS = 172800; // 2 day /** * @dev Config start time of each turn */ mapping (MintType => uint32) public startTimes; function setStartTimes(MintType mintType, uint32 _startTime) external onlyOwner { startTimes[mintType] = _startTime; } function isSaleOn(MintType mintType) public view returns (bool) { if (startTimes[mintType] == 0) { return false; } uint32 expireTime = 0; if (mintType == MintType.Round1WL || mintType == MintType.Round2WL || mintType == MintType.Round3WL) { expireTime = startTimes[mintType] + EXPIRE_SECONDS; } if (expireTime != 0 && block.timestamp >= expireTime) { return false; } return block.timestamp >= startTimes[mintType]; } /** * @dev Config merkle root of each turn */ mapping (MintType => bytes32) public merkleRoots; function setMerkleRoot(MintType mintType, bytes32 _merkleRoot) external onlyOwner { merkleRoots[mintType] = _merkleRoot; } function verifyProof(MintType mintType, bytes32[] memory _merkleProof) internal view returns (bool) { if (mintType == MintType.Round2Pub || mintType == MintType.Round3Pub) { return true; } bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); return MerkleProof.verify(_merkleProof, merkleRoots[mintType], leaf); } function maxMintNumber(MintType mintType) public view returns (uint256) { uint256 mintedNumber = 0; if (mintType == MintType.Round1WL) { mintedNumber = roundMintedNumber[MintType.Round1WL][msg.sender]; } else if (mintType == MintType.Round2WL || mintType == MintType.Round2Pub) { mintedNumber = roundMintedNumber[MintType.Round2WL][msg.sender] + roundMintedNumber[MintType.Round2Pub][msg.sender]; } else if (mintType == MintType.Round3WL || mintType == MintType.Round3Pub) { mintedNumber = roundMintedNumber[MintType.Round3WL][msg.sender] + roundMintedNumber[MintType.Round3Pub][msg.sender]; } uint maxMintNumberOfAddress; if (mintType == MintType.Round1WL) { maxMintNumberOfAddress = 1; } else { maxMintNumberOfAddress = 2; } return maxMintNumberOfAddress - mintedNumber; } function mintPrice() public view returns (uint256) { uint32 round3StartTime = startTimes[MintType.Round3WL]; if (round3StartTime != 0 && block.timestamp >= round3StartTime) { return 0.06 ether; } uint32 round2StartTime = startTimes[MintType.Round2WL]; if (round2StartTime != 0 && block.timestamp >= round2StartTime) { return 0.03 ether; } return 0; } function roundMax(MintType mintType) public pure returns (uint256) { if (mintType == MintType.Round1WL) { return 1000; } else if (mintType == MintType.Round2WL || mintType == MintType.Round2Pub) { return 4000; } else if (mintType == MintType.Round3WL || mintType == MintType.Round3Pub) { return 9000; } return 0; } constructor() ERC721A("PECFriends", "PECFREN", 2, 9000) {} modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function mint(MintType mintType, uint256 quantity, bytes32[] calldata proof) external callerIsUser payable { require(quantity > 0, "Number of tokens can not be less than or equal to 0"); require(isSaleOn(mintType), "sale has not started yet"); require(totalSupply() + quantity <= roundMax(mintType), "can not mint this many in the round"); require(totalSupply() + quantity <= collectionSize, "reached max supply"); require(mintPrice() * quantity == msg.value, "Sent ether value is incorrect"); require( quantity <= maxMintNumber(mintType), "can not mint this many" ); require(verifyProof(mintType, proof), "Not in the whitelist"); _safeMint(msg.sender, quantity); roundMintedNumber[mintType][msg.sender] += quantity; } // metadata URI string private _baseTokenURI; function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant { _setOwnersExplicit(quantity); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return ownershipOf(tokenId); } function reserveTokens(address[] memory _owners) public onlyOwner { require(totalSupply() + _owners.length <= collectionSize, "reached max supply"); uint i; for (i = 0; i < _owners.length; i++) { address to = _owners[i]; _safeMint(to, 1); } } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EXPIRE_SECONDS","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PECFriends.MintType","name":"mintType","type":"uint8"}],"name":"isSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PECFriends.MintType","name":"mintType","type":"uint8"}],"name":"maxMintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PECFriends.MintType","name":"","type":"uint8"}],"name":"merkleRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PECFriends.MintType","name":"mintType","type":"uint8"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PECFriends.MintType","name":"mintType","type":"uint8"}],"name":"roundMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"enum PECFriends.MintType","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"roundMintedNumber","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":"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PECFriends.MintType","name":"mintType","type":"uint8"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PECFriends.MintType","name":"mintType","type":"uint8"},{"internalType":"uint32","name":"_startTime","type":"uint32"}],"name":"setStartTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PECFriends.MintType","name":"","type":"uint8"}],"name":"startTimes","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600060015560006008553480156200001b57600080fd5b506040518060400160405280600a815260200169504543467269656e647360b01b815250604051806040016040528060078152602001662822a1a32922a760c91b81525060026123286200007e620000786200010f60201b60201c565b62000113565b60008111620000aa5760405162461bcd60e51b8152600401620000a19062000250565b60405180910390fd5b60008211620000cd5760405162461bcd60e51b8152600401620000a19062000209565b8351620000e290600290602087019062000163565b508251620000f890600390602086019062000163565b5060a09190915260805250506001600955620002db565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000171906200029e565b90600052602060002090601f016020900481019282620001955760008555620001e0565b82601f10620001b057805160ff1916838001178555620001e0565b82800160010185558215620001e0579182015b82811115620001e0578251825591602001919060010190620001c3565b50620001ee929150620001f2565b5090565b5b80821115620001ee5760008155600101620001f3565b60208082526027908201527f455243373231413a206d61782062617463682073697a65206d757374206265206040820152666e6f6e7a65726f60c81b606082015260800190565b6020808252602e908201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060408201526d6e6f6e7a65726f20737570706c7960901b606082015260800190565b600281046001821680620002b357607f821691505b60208210811415620002d557634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516136836200032460003960008181611dd501528181611dff01526122f20152600081816114f60152818161164301528181611c5b0152611c8d01526136836000f3fe60806040526004361061021a5760003560e01c8063715018a611610123578063aad2946f116100ab578063d7224ba01161006f578063d7224ba014610620578063da39f8cf14610635578063dc33e68114610648578063e985e9c514610668578063f2fde38b146106885761021a565b8063aad2946f1461058b578063b88d4fde146105a0578063c87b56dd146105c0578063cd17919e146105e0578063ced4a5f2146106005761021a565b80639231ab2a116100f25780639231ab2a146104e957806395d89b41146105165780639f57f5a01461052b578063a084d0581461054b578063a22cb4651461056b5761021a565b8063715018a61461047f57806372b00677146104945780637354fc7e146104b45780638da5cb5b146104d45761021a565b80633ccfd60b116101a657806354d77e0e1161017557806354d77e0e146103ea57806355f804b31461040a5780636352211e1461042a5780636817c76c1461044a57806370a082311461045f5761021a565b80633ccfd60b1461037557806341e5fb401461038a57806342842e0e146103aa5780634f6ccce7146103ca5761021a565b806318160ddd116101ed57806318160ddd146102c657806323b872dd146102e85780632d20fb60146103085780632f745c5914610328578063331ee446146103485761021a565b806301ffc9a71461021f57806306fdde0314610255578063081812fc14610277578063095ea7b3146102a4575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612902565b6106a8565b60405161024c9190612b9b565b60405180910390f35b34801561026157600080fd5b5061026a61070b565b60405161024c9190612baf565b34801561028357600080fd5b50610297610292366004612aac565b61079e565b60405161024c9190612b4a565b3480156102b057600080fd5b506102c46102bf36600461282c565b6107ea565b005b3480156102d257600080fd5b506102db610883565b60405161024c9190612ba6565b3480156102f457600080fd5b506102c4610303366004612700565b610889565b34801561031457600080fd5b506102c4610323366004612aac565b610894565b34801561033457600080fd5b506102db61034336600461282c565b61090c565b34801561035457600080fd5b5061036861036336600461293a565b610a07565b60405161024c9190613443565b34801561038157600080fd5b506102c4610a1f565b34801561039657600080fd5b506102db6103a536600461293a565b610a91565b3480156103b657600080fd5b506102c46103c5366004612700565b610aa3565b3480156103d657600080fd5b506102db6103e5366004612aac565b610abe565b3480156103f657600080fd5b506102c461040536600461296f565b610aea565b34801561041657600080fd5b506102c4610425366004612a40565b610b82565b34801561043657600080fd5b50610297610445366004612aac565b610bcd565b34801561045657600080fd5b506102db610bdf565b34801561046b57600080fd5b506102db61047a3660046126b4565b610ca3565b34801561048b57600080fd5b506102c4610cf0565b3480156104a057600080fd5b506102c46104af366004612a0d565b610d3b565b3480156104c057600080fd5b5061023f6104cf36600461293a565b610dee565b3480156104e057600080fd5b50610297610fcc565b3480156104f557600080fd5b50610509610504366004612aac565b610fdb565b60405161024c919061341a565b34801561052257600080fd5b5061026a610fec565b34801561053757600080fd5b506102db61054636600461293a565b610ffb565b34801561055757600080fd5b506102db61056636600461293a565b611217565b34801561057757600080fd5b506102c46105863660046127f2565b611307565b34801561059757600080fd5b506103686113d5565b3480156105ac57600080fd5b506102c46105bb36600461273b565b6113dc565b3480156105cc57600080fd5b5061026a6105db366004612aac565b611415565b3480156105ec57600080fd5b506102db6105fb366004612954565b611498565b34801561060c57600080fd5b506102c461061b366004612855565b6114b5565b34801561062c57600080fd5b506102db61159d565b6102c461064336600461298a565b6115a3565b34801561065457600080fd5b506102db6106633660046126b4565b6117de565b34801561067457600080fd5b5061023f6106833660046126ce565b6117e9565b34801561069457600080fd5b506102c46106a33660046126b4565b611817565b60006001600160e01b031982166380ac58cd60e01b14806106d957506001600160e01b03198216635b5e139f60e01b145b806106f457506001600160e01b0319821663780e9d6360e01b145b80610703575061070382611888565b90505b919050565b60606002805461071a9061358b565b80601f01602080910402602001604051908101604052809291908181526020018280546107469061358b565b80156107935780601f1061076857610100808354040283529160200191610793565b820191906000526020600020905b81548152906001019060200180831161077657829003601f168201915b505050505090505b90565b60006107a9826118a1565b6107ce5760405162461bcd60e51b81526004016107c59061338b565b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107f582610bcd565b9050806001600160a01b0316836001600160a01b031614156108295760405162461bcd60e51b81526004016107c5906130f1565b806001600160a01b031661083b6118a8565b6001600160a01b031614806108575750610857816106836118a8565b6108735760405162461bcd60e51b81526004016107c590612e2e565b61087e8383836118ac565b505050565b60015490565b61087e838383611908565b61089c6118a8565b6001600160a01b03166108ad610fcc565b6001600160a01b0316146108d35760405162461bcd60e51b81526004016107c590612fb6565b600260095414156108f65760405162461bcd60e51b81526004016107c5906132c2565b600260095561090481611c1a565b506001600955565b600061091783610ca3565b82106109355760405162461bcd60e51b81526004016107c590612bc2565b600061093f610883565b905060008060005b838110156109e8576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561099957805192505b876001600160a01b0316836001600160a01b031614156109d557868414156109c757509350610a0192505050565b836109d1816135c6565b9450505b50806109e0816135c6565b915050610947565b5060405162461bcd60e51b81526004016107c59061322e565b92915050565b600b6020526000908152604090205463ffffffff1681565b610a276118a8565b6001600160a01b0316610a38610fcc565b6001600160a01b031614610a5e5760405162461bcd60e51b81526004016107c590612fb6565b6040514790339082156108fc029083906000818181858888f19350505050158015610a8d573d6000803e3d6000fd5b5050565b600c6020526000908152604090205481565b61087e838383604051806020016040528060008152506113dc565b6000610ac8610883565b8210610ae65760405162461bcd60e51b81526004016107c590612ce7565b5090565b610af26118a8565b6001600160a01b0316610b03610fcc565b6001600160a01b031614610b295760405162461bcd60e51b81526004016107c590612fb6565b80600c6000846004811115610b4e57634e487b7160e01b600052602160045260246000fd5b6004811115610b6d57634e487b7160e01b600052602160045260246000fd5b81526020810191909152604001600020555050565b610b8a6118a8565b6001600160a01b0316610b9b610fcc565b6001600160a01b031614610bc15760405162461bcd60e51b81526004016107c590612fb6565b61087e600d83836125e2565b6000610bd882611da4565b5192915050565b60036000908152600b6020527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e5463ffffffff168015801590610c2857508063ffffffff164210155b15610c3d5766d529ae9e86000091505061079b565b6001600052600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf5463ffffffff168015801590610c8457508063ffffffff164210155b15610c9a57666a94d74f4300009250505061079b565b60009250505090565b60006001600160a01b038216610ccb5760405162461bcd60e51b81526004016107c590612ef9565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b610cf86118a8565b6001600160a01b0316610d09610fcc565b6001600160a01b031614610d2f5760405162461bcd60e51b81526004016107c590612fb6565b610d396000611eb6565b565b610d436118a8565b6001600160a01b0316610d54610fcc565b6001600160a01b031614610d7a5760405162461bcd60e51b81526004016107c590612fb6565b80600b6000846004811115610d9f57634e487b7160e01b600052602160045260246000fd5b6004811115610dbe57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505050565b6000600b6000836004811115610e1457634e487b7160e01b600052602160045260246000fd5b6004811115610e3357634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000205463ffffffff16610e5657506000610706565b600080836004811115610e7957634e487b7160e01b600052602160045260246000fd5b1480610ea457506001836004811115610ea257634e487b7160e01b600052602160045260246000fd5b145b80610ece57506003836004811115610ecc57634e487b7160e01b600052602160045260246000fd5b145b15610f3e576202a300600b6000856004811115610efb57634e487b7160e01b600052602160045260246000fd5b6004811115610f1a57634e487b7160e01b600052602160045260246000fd5b8152602081019190915260400160002054610f3b919063ffffffff166134b7565b90505b63ffffffff811615801590610f5957508063ffffffff164210155b15610f68576000915050610706565b600b6000846004811115610f8c57634e487b7160e01b600052602160045260246000fd5b6004811115610fab57634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000205463ffffffff164210159392505050565b6000546001600160a01b031690565b610fe3612662565b61070382611da4565b60606003805461071a9061358b565b6000808083600481111561101f57634e487b7160e01b600052602160045260246000fd5b141561105a57503360009081527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e360205260409020546111d0565b600183600481111561107c57634e487b7160e01b600052602160045260246000fd5b14806110a7575060028360048111156110a557634e487b7160e01b600052602160045260246000fd5b145b15611117573360009081527fbff4442b8ed600beeb8e26b1279a0f0d14c6edfaec26d968ee13c86f7d4c2ba860209081526040808320547fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc790925290912054611110919061349f565b90506111d0565b600383600481111561113957634e487b7160e01b600052602160045260246000fd5b14806111645750600483600481111561116257634e487b7160e01b600052602160045260246000fd5b145b156111d0573360009081527fe1eb2b2161a492c07c5a334e48012567cba93ec021043f53c1955516a3c5a84160209081526040808320547fa856840544dc26124927add067d799967eac11be13e14d82cc281ea46fa39759909252909120546111cd919061349f565b90505b6000808460048111156111f357634e487b7160e01b600052602160045260246000fd5b141561120157506001611205565b5060025b61120f8282613531565b949350505050565b60008082600481111561123a57634e487b7160e01b600052602160045260246000fd5b141561124957506103e8610706565b600182600481111561126b57634e487b7160e01b600052602160045260246000fd5b14806112965750600282600481111561129457634e487b7160e01b600052602160045260246000fd5b145b156112a45750610fa0610706565b60038260048111156112c657634e487b7160e01b600052602160045260246000fd5b14806112f1575060048260048111156112ef57634e487b7160e01b600052602160045260246000fd5b145b156112ff5750612328610706565b506000919050565b61130f6118a8565b6001600160a01b0316826001600160a01b031614156113405760405162461bcd60e51b81526004016107c59061303a565b806007600061134d6118a8565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556113916118a8565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113c99190612b9b565b60405180910390a35050565b6202a30081565b6113e7848484611908565b6113f384848484611f06565b61140f5760405162461bcd60e51b81526004016107c590613133565b50505050565b6060611420826118a1565b61143c5760405162461bcd60e51b81526004016107c590612feb565b6000611446612021565b905060008151116114665760405180602001604052806000815250611491565b8061147084612030565b604051602001611481929190612b1b565b6040516020818303038152906040525b9392505050565b600a60209081526000928352604080842090915290825290205481565b6114bd6118a8565b6001600160a01b03166114ce610fcc565b6001600160a01b0316146114f45760405162461bcd60e51b81526004016107c590612fb6565b7f0000000000000000000000000000000000000000000000000000000000000000815161151f610883565b611529919061349f565b11156115475760405162461bcd60e51b81526004016107c590612f44565b60005b8151811015610a8d57600082828151811061157557634e487b7160e01b600052603260045260246000fd5b6020026020010151905061158a81600161214a565b5080611595816135c6565b91505061154a565b60085481565b3233146115c25760405162461bcd60e51b81526004016107c590612df7565b600083116115e25760405162461bcd60e51b81526004016107c590612c04565b6115eb84610dee565b6116075760405162461bcd60e51b81526004016107c590612d6f565b61161084611217565b83611619610883565b611623919061349f565b11156116415760405162461bcd60e51b81526004016107c590613348565b7f00000000000000000000000000000000000000000000000000000000000000008361166b610883565b611675919061349f565b11156116935760405162461bcd60e51b81526004016107c590612f44565b348361169d610bdf565b6116a791906134ea565b146116c45760405162461bcd60e51b81526004016107c590612ec2565b6116cd84610ffb565b8311156116ec5760405162461bcd60e51b81526004016107c5906131fe565b6117298483838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061216492505050565b6117455760405162461bcd60e51b81526004016107c5906130c3565b61174f338461214a565b82600a600086600481111561177457634e487b7160e01b600052602160045260246000fd5b600481111561179357634e487b7160e01b600052602160045260246000fd5b81526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008282546117d3919061349f565b909155505050505050565b600061070382612247565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61181f6118a8565b6001600160a01b0316611830610fcc565b6001600160a01b0316146118565760405162461bcd60e51b81526004016107c590612fb6565b6001600160a01b03811661187c5760405162461bcd60e51b81526004016107c590612c57565b61188581611eb6565b50565b6001600160e01b031981166301ffc9a760e01b14919050565b6001541190565b3390565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061191382611da4565b9050600081600001516001600160a01b031661192d6118a8565b6001600160a01b0316148061196257506119456118a8565b6001600160a01b03166119578461079e565b6001600160a01b0316145b8061197657508151611976906106836118a8565b9050806119955760405162461bcd60e51b81526004016107c590613071565b846001600160a01b031682600001516001600160a01b0316146119ca5760405162461bcd60e51b81526004016107c590612f70565b6001600160a01b0384166119f05760405162461bcd60e51b81526004016107c590612d2a565b6119fd858585600161140f565b611a0d60008484600001516118ac565b6001600160a01b0385166000908152600560205260408120805460019290611a3f9084906001600160801b0316613509565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611a8b9185911661347d565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b0267ffffffffffffffff60a01b19929093166001600160a01b03199091161716179055611b2084600161349f565b6000818152600460205260409020549091506001600160a01b0316611bc457611b48816118a1565b15611bc45760408051808201825284516001600160a01b0390811682526020808701516001600160401b0390811682850190815260008781526004909352949091209251835494516001600160a01b031990951692169190911767ffffffffffffffff60a01b1916600160a01b93909116929092029190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c12868686600161140f565b505050505050565b60085481611c3a5760405162461bcd60e51b81526004016107c590612e8b565b60006001611c48848461349f565b611c529190613531565b9050611c7f60017f0000000000000000000000000000000000000000000000000000000000000000613531565b811115611cb457611cb160017f0000000000000000000000000000000000000000000000000000000000000000613531565b90505b611cbd816118a1565b611cd95760405162461bcd60e51b81526004016107c59061327c565b815b818111611d90576000818152600460205260409020546001600160a01b0316611d7e576000611d0982611da4565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b0390811685840190815260008881526004909652939094209151825493516001600160a01b031990941691161767ffffffffffffffff60a01b1916600160a01b9290931691909102919091179055505b80611d88816135c6565b915050611cdb565b50611d9c81600161349f565b600855505050565b611dac612662565b611db5826118a1565b611dd15760405162461bcd60e51b81526004016107c590612c9d565b60007f00000000000000000000000000000000000000000000000000000000000000008310611e3257611e247f000000000000000000000000000000000000000000000000000000000000000084613531565b611e2f90600161349f565b90505b825b818110611e9d576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611e8a579250610706915050565b5080611e9581613574565b915050611e34565b5060405162461bcd60e51b81526004016107c5906132f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611f1a846001600160a01b031661229b565b1561201657836001600160a01b031663150b7a02611f366118a8565b8786866040518563ffffffff1660e01b8152600401611f589493929190612b5e565b602060405180830381600087803b158015611f7257600080fd5b505af1925050508015611fa2575060408051601f3d908101601f19168201909252611f9f9181019061291e565b60015b611ffc573d808015611fd0576040519150601f19603f3d011682016040523d82523d6000602084013e611fd5565b606091505b508051611ff45760405162461bcd60e51b81526004016107c590613133565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061120f565b506001949350505050565b6060600d805461071a9061358b565b60608161205557506040805180820190915260018152600360fc1b6020820152610706565b8160005b811561207f5780612069816135c6565b91506120789050600a836134d6565b9150612059565b6000816001600160401b038111156120a757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120d1576020820181803683370190505b5090505b841561120f576120e6600183613531565b91506120f3600a866135e1565b6120fe90603061349f565b60f81b81838151811061212157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612143600a866134d6565b94506120d5565b610a8d8282604051806020016040528060008152506122a1565b6000600283600481111561218857634e487b7160e01b600052602160045260246000fd5b14806121b3575060048360048111156121b157634e487b7160e01b600052602160045260246000fd5b145b156121c057506001610a01565b6000336040516020016121d39190612af0565b60405160208183030381529060405280519060200120905061120f83600c600087600481111561221357634e487b7160e01b600052602160045260246000fd5b600481111561223257634e487b7160e01b600052602160045260246000fd5b81526020019081526020016000205483612514565b60006001600160a01b03821661226f5760405162461bcd60e51b81526004016107c590612da6565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b3b151590565b6001546001600160a01b0384166122ca5760405162461bcd60e51b81526004016107c5906131bd565b6122d3816118a1565b156122f05760405162461bcd60e51b81526004016107c590613186565b7f00000000000000000000000000000000000000000000000000000000000000008311156123305760405162461bcd60e51b81526004016107c5906133d8565b61233d600085838661140f565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b909104169181019190915281518083019092528051909190819061239990879061347d565b6001600160801b031681526020018583602001516123b7919061347d565b6001600160801b039081169091526001600160a01b03808816600081815260056020908152604080832087518154988401518816600160801b029088166fffffffffffffffffffffffffffffffff199099169890981790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b0267ffffffffffffffff60a01b19959093166001600160a01b031990941693909317939093161790915582905b858110156125015760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46124c56000888488611f06565b6124e15760405162461bcd60e51b81526004016107c590613133565b816124eb816135c6565b92505080806124f9906135c6565b915050612478565b506001819055611c12600087858861140f565b600082612521858461252a565b14949350505050565b600081815b84518110156125da57600085828151811061255a57634e487b7160e01b600052603260045260246000fd5b6020026020010151905080831161259b57828160405160200161257e929190612b0d565b6040516020818303038152906040528051906020012092506125c7565b80836040516020016125ae929190612b0d565b6040516020818303038152906040528051906020012092505b50806125d2816135c6565b91505061252f565b509392505050565b8280546125ee9061358b565b90600052602060002090601f0160209004810192826126105760008555612656565b82601f106126295782800160ff19823516178555612656565b82800160010185558215612656579182015b8281111561265657823582559160200191906001019061263b565b50610ae6929150612679565b604080518082019091526000808252602082015290565b5b80821115610ae6576000815560010161267a565b80356001600160a01b038116811461070657600080fd5b80356005811061070657600080fd5b6000602082840312156126c5578081fd5b6114918261268e565b600080604083850312156126e0578081fd5b6126e98361268e565b91506126f76020840161268e565b90509250929050565b600080600060608486031215612714578081fd5b61271d8461268e565b925061272b6020850161268e565b9150604084013590509250925092565b60008060008060808587031215612750578081fd5b6127598561268e565b9350602061276881870161268e565b93506040860135925060608601356001600160401b038082111561278a578384fd5b818801915088601f83011261279d578384fd5b8135818111156127af576127af613621565b6127c1601f8201601f19168501613454565b915080825289848285010111156127d6578485fd5b8084840185840137810190920192909252939692955090935050565b60008060408385031215612804578182fd5b61280d8361268e565b915060208301358015158114612821578182fd5b809150509250929050565b6000806040838503121561283e578182fd5b6128478361268e565b946020939093013593505050565b60006020808385031215612867578182fd5b82356001600160401b038082111561287d578384fd5b818501915085601f830112612890578384fd5b8135818111156128a2576128a2613621565b83810291506128b2848301613454565b8181528481019084860184860187018a10156128cc578788fd5b8795505b838610156128f5576128e18161268e565b8352600195909501949186019186016128d0565b5098975050505050505050565b600060208284031215612913578081fd5b813561149181613637565b60006020828403121561292f578081fd5b815161149181613637565b60006020828403121561294b578081fd5b611491826126a5565b60008060408385031215612966578182fd5b6126e9836126a5565b60008060408385031215612981578182fd5b612847836126a5565b6000806000806060858703121561299f578182fd5b6129a8856126a5565b93506020850135925060408501356001600160401b03808211156129ca578384fd5b818701915087601f8301126129dd578384fd5b8135818111156129eb578485fd5b88602080830285010111156129fe578485fd5b95989497505060200194505050565b60008060408385031215612a1f578182fd5b612a28836126a5565b9150602083013563ffffffff81168114612821578182fd5b60008060208385031215612a52578182fd5b82356001600160401b0380821115612a68578384fd5b818501915085601f830112612a7b578384fd5b813581811115612a89578485fd5b866020828501011115612a9a578485fd5b60209290920196919550909350505050565b600060208284031215612abd578081fd5b5035919050565b60008151808452612adc816020860160208601613548565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b918252602082015260400190565b60008351612b2d818460208801613548565b835190830190612b41818360208801613548565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b9190830184612ac4565b9695505050505050565b901515815260200190565b90815260200190565b6000602082526114916020830184612ac4565b60208082526022908201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526033908201527f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c6573736040820152720207468616e206f7220657175616c20746f203606c1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b60208082526023908201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756040820152626e647360e81b606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526018908201527f73616c6520686173206e6f742073746172746564207965740000000000000000604082015260600190565b60208082526031908201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260408201527020746865207a65726f206164647265737360781b606082015260800190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b60208082526018908201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604082015260600190565b6020808252601d908201527f53656e742065746865722076616c756520697320696e636f7272656374000000604082015260600190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746040820152651037bbb732b960d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b602080825260149082015273139bdd081a5b881d1a19481dda1a5d195b1a5cdd60621b604082015260600190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201526132b960f11b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526016908201527563616e206e6f74206d696e742074686973206d616e7960501b604082015260600190565b6020808252602e908201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060408201526d0deeedccae440c4f240d2dcc8caf60931b606082015260800190565b60208082526026908201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360408201526506c65616e75760d41b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602f908201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560408201526e1037bbb732b91037b3103a37b5b2b760891b606082015260800190565b60208082526023908201527f63616e206e6f74206d696e742074686973206d616e7920696e2074686520726f6040820152621d5b9960ea1b606082015260800190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201526c3c34b9ba32b73a103a37b5b2b760991b606082015260800190565b60208082526022908201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696040820152610ced60f31b606082015260800190565b81516001600160a01b031681526020918201516001600160401b03169181019190915260400190565b63ffffffff91909116815260200190565b6040518181016001600160401b038111828210171561347557613475613621565b604052919050565b60006001600160801b03808316818516808303821115612b4157612b416135f5565b600082198211156134b2576134b26135f5565b500190565b600063ffffffff808316818516808303821115612b4157612b416135f5565b6000826134e5576134e561360b565b500490565b6000816000190483118215151615613504576135046135f5565b500290565b60006001600160801b0383811690831681811015613529576135296135f5565b039392505050565b600082821015613543576135436135f5565b500390565b60005b8381101561356357818101518382015260200161354b565b8381111561140f5750506000910152565b600081613583576135836135f5565b506000190190565b60028104600182168061359f57607f821691505b602082108114156135c057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135da576135da6135f5565b5060010190565b6000826135f0576135f061360b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461188557600080fdfea26469706673582212207bd4d816cce01044e593675d74ac923c854e2959c7bfdcabd19d196baf3e25f264736f6c63430008000033
Deployed Bytecode
0x60806040526004361061021a5760003560e01c8063715018a611610123578063aad2946f116100ab578063d7224ba01161006f578063d7224ba014610620578063da39f8cf14610635578063dc33e68114610648578063e985e9c514610668578063f2fde38b146106885761021a565b8063aad2946f1461058b578063b88d4fde146105a0578063c87b56dd146105c0578063cd17919e146105e0578063ced4a5f2146106005761021a565b80639231ab2a116100f25780639231ab2a146104e957806395d89b41146105165780639f57f5a01461052b578063a084d0581461054b578063a22cb4651461056b5761021a565b8063715018a61461047f57806372b00677146104945780637354fc7e146104b45780638da5cb5b146104d45761021a565b80633ccfd60b116101a657806354d77e0e1161017557806354d77e0e146103ea57806355f804b31461040a5780636352211e1461042a5780636817c76c1461044a57806370a082311461045f5761021a565b80633ccfd60b1461037557806341e5fb401461038a57806342842e0e146103aa5780634f6ccce7146103ca5761021a565b806318160ddd116101ed57806318160ddd146102c657806323b872dd146102e85780632d20fb60146103085780632f745c5914610328578063331ee446146103485761021a565b806301ffc9a71461021f57806306fdde0314610255578063081812fc14610277578063095ea7b3146102a4575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612902565b6106a8565b60405161024c9190612b9b565b60405180910390f35b34801561026157600080fd5b5061026a61070b565b60405161024c9190612baf565b34801561028357600080fd5b50610297610292366004612aac565b61079e565b60405161024c9190612b4a565b3480156102b057600080fd5b506102c46102bf36600461282c565b6107ea565b005b3480156102d257600080fd5b506102db610883565b60405161024c9190612ba6565b3480156102f457600080fd5b506102c4610303366004612700565b610889565b34801561031457600080fd5b506102c4610323366004612aac565b610894565b34801561033457600080fd5b506102db61034336600461282c565b61090c565b34801561035457600080fd5b5061036861036336600461293a565b610a07565b60405161024c9190613443565b34801561038157600080fd5b506102c4610a1f565b34801561039657600080fd5b506102db6103a536600461293a565b610a91565b3480156103b657600080fd5b506102c46103c5366004612700565b610aa3565b3480156103d657600080fd5b506102db6103e5366004612aac565b610abe565b3480156103f657600080fd5b506102c461040536600461296f565b610aea565b34801561041657600080fd5b506102c4610425366004612a40565b610b82565b34801561043657600080fd5b50610297610445366004612aac565b610bcd565b34801561045657600080fd5b506102db610bdf565b34801561046b57600080fd5b506102db61047a3660046126b4565b610ca3565b34801561048b57600080fd5b506102c4610cf0565b3480156104a057600080fd5b506102c46104af366004612a0d565b610d3b565b3480156104c057600080fd5b5061023f6104cf36600461293a565b610dee565b3480156104e057600080fd5b50610297610fcc565b3480156104f557600080fd5b50610509610504366004612aac565b610fdb565b60405161024c919061341a565b34801561052257600080fd5b5061026a610fec565b34801561053757600080fd5b506102db61054636600461293a565b610ffb565b34801561055757600080fd5b506102db61056636600461293a565b611217565b34801561057757600080fd5b506102c46105863660046127f2565b611307565b34801561059757600080fd5b506103686113d5565b3480156105ac57600080fd5b506102c46105bb36600461273b565b6113dc565b3480156105cc57600080fd5b5061026a6105db366004612aac565b611415565b3480156105ec57600080fd5b506102db6105fb366004612954565b611498565b34801561060c57600080fd5b506102c461061b366004612855565b6114b5565b34801561062c57600080fd5b506102db61159d565b6102c461064336600461298a565b6115a3565b34801561065457600080fd5b506102db6106633660046126b4565b6117de565b34801561067457600080fd5b5061023f6106833660046126ce565b6117e9565b34801561069457600080fd5b506102c46106a33660046126b4565b611817565b60006001600160e01b031982166380ac58cd60e01b14806106d957506001600160e01b03198216635b5e139f60e01b145b806106f457506001600160e01b0319821663780e9d6360e01b145b80610703575061070382611888565b90505b919050565b60606002805461071a9061358b565b80601f01602080910402602001604051908101604052809291908181526020018280546107469061358b565b80156107935780601f1061076857610100808354040283529160200191610793565b820191906000526020600020905b81548152906001019060200180831161077657829003601f168201915b505050505090505b90565b60006107a9826118a1565b6107ce5760405162461bcd60e51b81526004016107c59061338b565b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107f582610bcd565b9050806001600160a01b0316836001600160a01b031614156108295760405162461bcd60e51b81526004016107c5906130f1565b806001600160a01b031661083b6118a8565b6001600160a01b031614806108575750610857816106836118a8565b6108735760405162461bcd60e51b81526004016107c590612e2e565b61087e8383836118ac565b505050565b60015490565b61087e838383611908565b61089c6118a8565b6001600160a01b03166108ad610fcc565b6001600160a01b0316146108d35760405162461bcd60e51b81526004016107c590612fb6565b600260095414156108f65760405162461bcd60e51b81526004016107c5906132c2565b600260095561090481611c1a565b506001600955565b600061091783610ca3565b82106109355760405162461bcd60e51b81526004016107c590612bc2565b600061093f610883565b905060008060005b838110156109e8576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561099957805192505b876001600160a01b0316836001600160a01b031614156109d557868414156109c757509350610a0192505050565b836109d1816135c6565b9450505b50806109e0816135c6565b915050610947565b5060405162461bcd60e51b81526004016107c59061322e565b92915050565b600b6020526000908152604090205463ffffffff1681565b610a276118a8565b6001600160a01b0316610a38610fcc565b6001600160a01b031614610a5e5760405162461bcd60e51b81526004016107c590612fb6565b6040514790339082156108fc029083906000818181858888f19350505050158015610a8d573d6000803e3d6000fd5b5050565b600c6020526000908152604090205481565b61087e838383604051806020016040528060008152506113dc565b6000610ac8610883565b8210610ae65760405162461bcd60e51b81526004016107c590612ce7565b5090565b610af26118a8565b6001600160a01b0316610b03610fcc565b6001600160a01b031614610b295760405162461bcd60e51b81526004016107c590612fb6565b80600c6000846004811115610b4e57634e487b7160e01b600052602160045260246000fd5b6004811115610b6d57634e487b7160e01b600052602160045260246000fd5b81526020810191909152604001600020555050565b610b8a6118a8565b6001600160a01b0316610b9b610fcc565b6001600160a01b031614610bc15760405162461bcd60e51b81526004016107c590612fb6565b61087e600d83836125e2565b6000610bd882611da4565b5192915050565b60036000908152600b6020527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e5463ffffffff168015801590610c2857508063ffffffff164210155b15610c3d5766d529ae9e86000091505061079b565b6001600052600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf5463ffffffff168015801590610c8457508063ffffffff164210155b15610c9a57666a94d74f4300009250505061079b565b60009250505090565b60006001600160a01b038216610ccb5760405162461bcd60e51b81526004016107c590612ef9565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b610cf86118a8565b6001600160a01b0316610d09610fcc565b6001600160a01b031614610d2f5760405162461bcd60e51b81526004016107c590612fb6565b610d396000611eb6565b565b610d436118a8565b6001600160a01b0316610d54610fcc565b6001600160a01b031614610d7a5760405162461bcd60e51b81526004016107c590612fb6565b80600b6000846004811115610d9f57634e487b7160e01b600052602160045260246000fd5b6004811115610dbe57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505050565b6000600b6000836004811115610e1457634e487b7160e01b600052602160045260246000fd5b6004811115610e3357634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000205463ffffffff16610e5657506000610706565b600080836004811115610e7957634e487b7160e01b600052602160045260246000fd5b1480610ea457506001836004811115610ea257634e487b7160e01b600052602160045260246000fd5b145b80610ece57506003836004811115610ecc57634e487b7160e01b600052602160045260246000fd5b145b15610f3e576202a300600b6000856004811115610efb57634e487b7160e01b600052602160045260246000fd5b6004811115610f1a57634e487b7160e01b600052602160045260246000fd5b8152602081019190915260400160002054610f3b919063ffffffff166134b7565b90505b63ffffffff811615801590610f5957508063ffffffff164210155b15610f68576000915050610706565b600b6000846004811115610f8c57634e487b7160e01b600052602160045260246000fd5b6004811115610fab57634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000205463ffffffff164210159392505050565b6000546001600160a01b031690565b610fe3612662565b61070382611da4565b60606003805461071a9061358b565b6000808083600481111561101f57634e487b7160e01b600052602160045260246000fd5b141561105a57503360009081527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e360205260409020546111d0565b600183600481111561107c57634e487b7160e01b600052602160045260246000fd5b14806110a7575060028360048111156110a557634e487b7160e01b600052602160045260246000fd5b145b15611117573360009081527fbff4442b8ed600beeb8e26b1279a0f0d14c6edfaec26d968ee13c86f7d4c2ba860209081526040808320547fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc790925290912054611110919061349f565b90506111d0565b600383600481111561113957634e487b7160e01b600052602160045260246000fd5b14806111645750600483600481111561116257634e487b7160e01b600052602160045260246000fd5b145b156111d0573360009081527fe1eb2b2161a492c07c5a334e48012567cba93ec021043f53c1955516a3c5a84160209081526040808320547fa856840544dc26124927add067d799967eac11be13e14d82cc281ea46fa39759909252909120546111cd919061349f565b90505b6000808460048111156111f357634e487b7160e01b600052602160045260246000fd5b141561120157506001611205565b5060025b61120f8282613531565b949350505050565b60008082600481111561123a57634e487b7160e01b600052602160045260246000fd5b141561124957506103e8610706565b600182600481111561126b57634e487b7160e01b600052602160045260246000fd5b14806112965750600282600481111561129457634e487b7160e01b600052602160045260246000fd5b145b156112a45750610fa0610706565b60038260048111156112c657634e487b7160e01b600052602160045260246000fd5b14806112f1575060048260048111156112ef57634e487b7160e01b600052602160045260246000fd5b145b156112ff5750612328610706565b506000919050565b61130f6118a8565b6001600160a01b0316826001600160a01b031614156113405760405162461bcd60e51b81526004016107c59061303a565b806007600061134d6118a8565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556113916118a8565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113c99190612b9b565b60405180910390a35050565b6202a30081565b6113e7848484611908565b6113f384848484611f06565b61140f5760405162461bcd60e51b81526004016107c590613133565b50505050565b6060611420826118a1565b61143c5760405162461bcd60e51b81526004016107c590612feb565b6000611446612021565b905060008151116114665760405180602001604052806000815250611491565b8061147084612030565b604051602001611481929190612b1b565b6040516020818303038152906040525b9392505050565b600a60209081526000928352604080842090915290825290205481565b6114bd6118a8565b6001600160a01b03166114ce610fcc565b6001600160a01b0316146114f45760405162461bcd60e51b81526004016107c590612fb6565b7f0000000000000000000000000000000000000000000000000000000000002328815161151f610883565b611529919061349f565b11156115475760405162461bcd60e51b81526004016107c590612f44565b60005b8151811015610a8d57600082828151811061157557634e487b7160e01b600052603260045260246000fd5b6020026020010151905061158a81600161214a565b5080611595816135c6565b91505061154a565b60085481565b3233146115c25760405162461bcd60e51b81526004016107c590612df7565b600083116115e25760405162461bcd60e51b81526004016107c590612c04565b6115eb84610dee565b6116075760405162461bcd60e51b81526004016107c590612d6f565b61161084611217565b83611619610883565b611623919061349f565b11156116415760405162461bcd60e51b81526004016107c590613348565b7f00000000000000000000000000000000000000000000000000000000000023288361166b610883565b611675919061349f565b11156116935760405162461bcd60e51b81526004016107c590612f44565b348361169d610bdf565b6116a791906134ea565b146116c45760405162461bcd60e51b81526004016107c590612ec2565b6116cd84610ffb565b8311156116ec5760405162461bcd60e51b81526004016107c5906131fe565b6117298483838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061216492505050565b6117455760405162461bcd60e51b81526004016107c5906130c3565b61174f338461214a565b82600a600086600481111561177457634e487b7160e01b600052602160045260246000fd5b600481111561179357634e487b7160e01b600052602160045260246000fd5b81526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008282546117d3919061349f565b909155505050505050565b600061070382612247565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61181f6118a8565b6001600160a01b0316611830610fcc565b6001600160a01b0316146118565760405162461bcd60e51b81526004016107c590612fb6565b6001600160a01b03811661187c5760405162461bcd60e51b81526004016107c590612c57565b61188581611eb6565b50565b6001600160e01b031981166301ffc9a760e01b14919050565b6001541190565b3390565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061191382611da4565b9050600081600001516001600160a01b031661192d6118a8565b6001600160a01b0316148061196257506119456118a8565b6001600160a01b03166119578461079e565b6001600160a01b0316145b8061197657508151611976906106836118a8565b9050806119955760405162461bcd60e51b81526004016107c590613071565b846001600160a01b031682600001516001600160a01b0316146119ca5760405162461bcd60e51b81526004016107c590612f70565b6001600160a01b0384166119f05760405162461bcd60e51b81526004016107c590612d2a565b6119fd858585600161140f565b611a0d60008484600001516118ac565b6001600160a01b0385166000908152600560205260408120805460019290611a3f9084906001600160801b0316613509565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611a8b9185911661347d565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b0267ffffffffffffffff60a01b19929093166001600160a01b03199091161716179055611b2084600161349f565b6000818152600460205260409020549091506001600160a01b0316611bc457611b48816118a1565b15611bc45760408051808201825284516001600160a01b0390811682526020808701516001600160401b0390811682850190815260008781526004909352949091209251835494516001600160a01b031990951692169190911767ffffffffffffffff60a01b1916600160a01b93909116929092029190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c12868686600161140f565b505050505050565b60085481611c3a5760405162461bcd60e51b81526004016107c590612e8b565b60006001611c48848461349f565b611c529190613531565b9050611c7f60017f0000000000000000000000000000000000000000000000000000000000002328613531565b811115611cb457611cb160017f0000000000000000000000000000000000000000000000000000000000002328613531565b90505b611cbd816118a1565b611cd95760405162461bcd60e51b81526004016107c59061327c565b815b818111611d90576000818152600460205260409020546001600160a01b0316611d7e576000611d0982611da4565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b0390811685840190815260008881526004909652939094209151825493516001600160a01b031990941691161767ffffffffffffffff60a01b1916600160a01b9290931691909102919091179055505b80611d88816135c6565b915050611cdb565b50611d9c81600161349f565b600855505050565b611dac612662565b611db5826118a1565b611dd15760405162461bcd60e51b81526004016107c590612c9d565b60007f00000000000000000000000000000000000000000000000000000000000000028310611e3257611e247f000000000000000000000000000000000000000000000000000000000000000284613531565b611e2f90600161349f565b90505b825b818110611e9d576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611e8a579250610706915050565b5080611e9581613574565b915050611e34565b5060405162461bcd60e51b81526004016107c5906132f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611f1a846001600160a01b031661229b565b1561201657836001600160a01b031663150b7a02611f366118a8565b8786866040518563ffffffff1660e01b8152600401611f589493929190612b5e565b602060405180830381600087803b158015611f7257600080fd5b505af1925050508015611fa2575060408051601f3d908101601f19168201909252611f9f9181019061291e565b60015b611ffc573d808015611fd0576040519150601f19603f3d011682016040523d82523d6000602084013e611fd5565b606091505b508051611ff45760405162461bcd60e51b81526004016107c590613133565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061120f565b506001949350505050565b6060600d805461071a9061358b565b60608161205557506040805180820190915260018152600360fc1b6020820152610706565b8160005b811561207f5780612069816135c6565b91506120789050600a836134d6565b9150612059565b6000816001600160401b038111156120a757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120d1576020820181803683370190505b5090505b841561120f576120e6600183613531565b91506120f3600a866135e1565b6120fe90603061349f565b60f81b81838151811061212157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612143600a866134d6565b94506120d5565b610a8d8282604051806020016040528060008152506122a1565b6000600283600481111561218857634e487b7160e01b600052602160045260246000fd5b14806121b3575060048360048111156121b157634e487b7160e01b600052602160045260246000fd5b145b156121c057506001610a01565b6000336040516020016121d39190612af0565b60405160208183030381529060405280519060200120905061120f83600c600087600481111561221357634e487b7160e01b600052602160045260246000fd5b600481111561223257634e487b7160e01b600052602160045260246000fd5b81526020019081526020016000205483612514565b60006001600160a01b03821661226f5760405162461bcd60e51b81526004016107c590612da6565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b3b151590565b6001546001600160a01b0384166122ca5760405162461bcd60e51b81526004016107c5906131bd565b6122d3816118a1565b156122f05760405162461bcd60e51b81526004016107c590613186565b7f00000000000000000000000000000000000000000000000000000000000000028311156123305760405162461bcd60e51b81526004016107c5906133d8565b61233d600085838661140f565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b909104169181019190915281518083019092528051909190819061239990879061347d565b6001600160801b031681526020018583602001516123b7919061347d565b6001600160801b039081169091526001600160a01b03808816600081815260056020908152604080832087518154988401518816600160801b029088166fffffffffffffffffffffffffffffffff199099169890981790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b0267ffffffffffffffff60a01b19959093166001600160a01b031990941693909317939093161790915582905b858110156125015760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46124c56000888488611f06565b6124e15760405162461bcd60e51b81526004016107c590613133565b816124eb816135c6565b92505080806124f9906135c6565b915050612478565b506001819055611c12600087858861140f565b600082612521858461252a565b14949350505050565b600081815b84518110156125da57600085828151811061255a57634e487b7160e01b600052603260045260246000fd5b6020026020010151905080831161259b57828160405160200161257e929190612b0d565b6040516020818303038152906040528051906020012092506125c7565b80836040516020016125ae929190612b0d565b6040516020818303038152906040528051906020012092505b50806125d2816135c6565b91505061252f565b509392505050565b8280546125ee9061358b565b90600052602060002090601f0160209004810192826126105760008555612656565b82601f106126295782800160ff19823516178555612656565b82800160010185558215612656579182015b8281111561265657823582559160200191906001019061263b565b50610ae6929150612679565b604080518082019091526000808252602082015290565b5b80821115610ae6576000815560010161267a565b80356001600160a01b038116811461070657600080fd5b80356005811061070657600080fd5b6000602082840312156126c5578081fd5b6114918261268e565b600080604083850312156126e0578081fd5b6126e98361268e565b91506126f76020840161268e565b90509250929050565b600080600060608486031215612714578081fd5b61271d8461268e565b925061272b6020850161268e565b9150604084013590509250925092565b60008060008060808587031215612750578081fd5b6127598561268e565b9350602061276881870161268e565b93506040860135925060608601356001600160401b038082111561278a578384fd5b818801915088601f83011261279d578384fd5b8135818111156127af576127af613621565b6127c1601f8201601f19168501613454565b915080825289848285010111156127d6578485fd5b8084840185840137810190920192909252939692955090935050565b60008060408385031215612804578182fd5b61280d8361268e565b915060208301358015158114612821578182fd5b809150509250929050565b6000806040838503121561283e578182fd5b6128478361268e565b946020939093013593505050565b60006020808385031215612867578182fd5b82356001600160401b038082111561287d578384fd5b818501915085601f830112612890578384fd5b8135818111156128a2576128a2613621565b83810291506128b2848301613454565b8181528481019084860184860187018a10156128cc578788fd5b8795505b838610156128f5576128e18161268e565b8352600195909501949186019186016128d0565b5098975050505050505050565b600060208284031215612913578081fd5b813561149181613637565b60006020828403121561292f578081fd5b815161149181613637565b60006020828403121561294b578081fd5b611491826126a5565b60008060408385031215612966578182fd5b6126e9836126a5565b60008060408385031215612981578182fd5b612847836126a5565b6000806000806060858703121561299f578182fd5b6129a8856126a5565b93506020850135925060408501356001600160401b03808211156129ca578384fd5b818701915087601f8301126129dd578384fd5b8135818111156129eb578485fd5b88602080830285010111156129fe578485fd5b95989497505060200194505050565b60008060408385031215612a1f578182fd5b612a28836126a5565b9150602083013563ffffffff81168114612821578182fd5b60008060208385031215612a52578182fd5b82356001600160401b0380821115612a68578384fd5b818501915085601f830112612a7b578384fd5b813581811115612a89578485fd5b866020828501011115612a9a578485fd5b60209290920196919550909350505050565b600060208284031215612abd578081fd5b5035919050565b60008151808452612adc816020860160208601613548565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b918252602082015260400190565b60008351612b2d818460208801613548565b835190830190612b41818360208801613548565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b9190830184612ac4565b9695505050505050565b901515815260200190565b90815260200190565b6000602082526114916020830184612ac4565b60208082526022908201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526033908201527f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c6573736040820152720207468616e206f7220657175616c20746f203606c1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b60208082526023908201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756040820152626e647360e81b606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526018908201527f73616c6520686173206e6f742073746172746564207965740000000000000000604082015260600190565b60208082526031908201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260408201527020746865207a65726f206164647265737360781b606082015260800190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b60208082526018908201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604082015260600190565b6020808252601d908201527f53656e742065746865722076616c756520697320696e636f7272656374000000604082015260600190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746040820152651037bbb732b960d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b602080825260149082015273139bdd081a5b881d1a19481dda1a5d195b1a5cdd60621b604082015260600190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201526132b960f11b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526016908201527563616e206e6f74206d696e742074686973206d616e7960501b604082015260600190565b6020808252602e908201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060408201526d0deeedccae440c4f240d2dcc8caf60931b606082015260800190565b60208082526026908201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360408201526506c65616e75760d41b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602f908201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560408201526e1037bbb732b91037b3103a37b5b2b760891b606082015260800190565b60208082526023908201527f63616e206e6f74206d696e742074686973206d616e7920696e2074686520726f6040820152621d5b9960ea1b606082015260800190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201526c3c34b9ba32b73a103a37b5b2b760991b606082015260800190565b60208082526022908201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696040820152610ced60f31b606082015260800190565b81516001600160a01b031681526020918201516001600160401b03169181019190915260400190565b63ffffffff91909116815260200190565b6040518181016001600160401b038111828210171561347557613475613621565b604052919050565b60006001600160801b03808316818516808303821115612b4157612b416135f5565b600082198211156134b2576134b26135f5565b500190565b600063ffffffff808316818516808303821115612b4157612b416135f5565b6000826134e5576134e561360b565b500490565b6000816000190483118215151615613504576135046135f5565b500290565b60006001600160801b0383811690831681811015613529576135296135f5565b039392505050565b600082821015613543576135436135f5565b500390565b60005b8381101561356357818101518382015260200161354b565b8381111561140f5750506000910152565b600081613583576135836135f5565b506000190190565b60028104600182168061359f57607f821691505b602082108114156135c057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135da576135da6135f5565b5060010190565b6000826135f0576135f061360b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461188557600080fdfea26469706673582212207bd4d816cce01044e593675d74ac923c854e2959c7bfdcabd19d196baf3e25f264736f6c63430008000033
Deployed Bytecode Sourcemap
42569:5716:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27947:370;;;;;;;;;;-1:-1:-1;27947:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29673:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31198:204::-;;;;;;;;;;-1:-1:-1;31198:204:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30761:379::-;;;;;;;;;;-1:-1:-1;30761:379:0;;;;;:::i;:::-;;:::i;:::-;;26508:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32048:142::-;;;;;;;;;;-1:-1:-1;32048:142:0;;;;;:::i;:::-;;:::i;47427:124::-;;;;;;;;;;-1:-1:-1;47427:124:0;;;;;:::i;:::-;;:::i;27139:744::-;;;;;;;;;;-1:-1:-1;27139:744:0;;;;;:::i;:::-;;:::i;42917:46::-;;;;;;;;;;-1:-1:-1;42917:46:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48140:140::-;;;;;;;;;;;;;:::i;43711:48::-;;;;;;;;;;-1:-1:-1;43711:48:0;;;;;:::i;:::-;;:::i;32253:157::-;;;;;;;;;;-1:-1:-1;32253:157:0;;;;;:::i;:::-;;:::i;26671:177::-;;;;;;;;;;-1:-1:-1;26671:177:0;;;;;:::i;:::-;;:::i;43766:136::-;;;;;;;;;;-1:-1:-1;43766:136:0;;;;;:::i;:::-;;:::i;47313:106::-;;;;;;;;;;-1:-1:-1;47313:106:0;;;;;:::i;:::-;;:::i;29496:118::-;;;;;;;;;;-1:-1:-1;29496:118:0;;;;;:::i;:::-;;:::i;45228:444::-;;;;;;;;;;;;;:::i;28373:211::-;;;;;;;;;;-1:-1:-1;28373:211:0;;;;;:::i;:::-;;:::i;41874:94::-;;;;;;;;;;;;;:::i;42970:132::-;;;;;;;;;;-1:-1:-1;42970:132:0;;;;;:::i;:::-;;:::i;43108:532::-;;;;;;;;;;-1:-1:-1;43108:532:0;;;;;:::i;:::-;;:::i;41223:87::-;;;;;;;;;;;;;:::i;47680:135::-;;;;;;;;;;-1:-1:-1;47680:135:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29828:98::-;;;;;;;;;;;;;:::i;44286:934::-;;;;;;;;;;-1:-1:-1;44286:934:0;;;;;:::i;:::-;;:::i;45680:403::-;;;;;;;;;;-1:-1:-1;45680:403:0;;;;;:::i;:::-;;:::i;31466:274::-;;;;;;;;;;-1:-1:-1;31466:274:0;;;;;:::i;:::-;;:::i;42791:46::-;;;;;;;;;;;;;:::i;32473:311::-;;;;;;;;;;-1:-1:-1;32473:311:0;;;;;:::i;:::-;;:::i;29989:394::-;;;;;;;;;;-1:-1:-1;29989:394:0;;;;;:::i;:::-;;:::i;42709:75::-;;;;;;;;;;-1:-1:-1;42709:75:0;;;;;:::i;:::-;;:::i;47823:309::-;;;;;;;;;;-1:-1:-1;47823:309:0;;;;;:::i;:::-;;:::i;36888:43::-;;;;;;;;;;;;;:::i;46286:839::-;;;;;;:::i;:::-;;:::i;47559:113::-;;;;;;;;;;-1:-1:-1;47559:113:0;;;;;:::i;:::-;;:::i;31803:186::-;;;;;;;;;;-1:-1:-1;31803:186:0;;;;;:::i;:::-;;:::i;42123:192::-;;;;;;;;;;-1:-1:-1;42123:192:0;;;;;:::i;:::-;;:::i;27947:370::-;28074:4;-1:-1:-1;;;;;;28104:40:0;;-1:-1:-1;;;28104:40:0;;:99;;-1:-1:-1;;;;;;;28155:48:0;;-1:-1:-1;;;28155:48:0;28104:99;:160;;;-1:-1:-1;;;;;;;28214:50:0;;-1:-1:-1;;;28214:50:0;28104:160;:207;;;;28275:36;28299:11;28275:23;:36::i;:::-;28090:221;;27947:370;;;;:::o;29673:94::-;29727:13;29756:5;29749:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29673:94;;:::o;31198:204::-;31266:7;31290:16;31298:7;31290;:16::i;:::-;31282:74;;;;-1:-1:-1;;;31282:74:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;31372:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31372:24:0;;31198:204::o;30761:379::-;30830:13;30846:24;30862:7;30846:15;:24::i;:::-;30830:40;;30891:5;-1:-1:-1;;;;;30885:11:0;:2;-1:-1:-1;;;;;30885:11:0;;;30877:58;;;;-1:-1:-1;;;30877:58:0;;;;;;;:::i;:::-;30976:5;-1:-1:-1;;;;;30960:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;30960:21:0;;:62;;;;30985:37;31002:5;31009:12;:10;:12::i;30985:37::-;30944:153;;;;-1:-1:-1;;;30944:153:0;;;;;;;:::i;:::-;31106:28;31115:2;31119:7;31128:5;31106:8;:28::i;:::-;30761:379;;;:::o;26508:94::-;26584:12;;26508:94;:::o;32048:142::-;32156:28;32166:4;32172:2;32176:7;32156:9;:28::i;47427:124::-;41454:12;:10;:12::i;:::-;-1:-1:-1;;;;;41443:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;41443:23:0;;41435:68;;;;-1:-1:-1;;;41435:68:0;;;;;;;:::i;:::-;22447:1:::1;23043:7;;:19;;23035:63;;;;-1:-1:-1::0;;;23035:63:0::1;;;;;;;:::i;:::-;22447:1;23176:7;:18:::0;47515:28:::2;47534:8:::0;47515:18:::2;:28::i;:::-;-1:-1:-1::0;22403:1:0::1;23355:7;:22:::0;47427:124::o;27139:744::-;27248:7;27283:16;27293:5;27283:9;:16::i;:::-;27275:5;:24;27267:71;;;;-1:-1:-1;;;27267:71:0;;;;;;;:::i;:::-;27345:22;27370:13;:11;:13::i;:::-;27345:38;;27390:19;27420:25;27470:9;27465:350;27489:14;27485:1;:18;27465:350;;;27519:31;27553:14;;;:11;:14;;;;;;;;;27519:48;;;;;;;;;-1:-1:-1;;;;;27519:48:0;;;;;-1:-1:-1;;;27519:48:0;;;-1:-1:-1;;;;;27519:48:0;;;;;;;;27580:28;27576:89;;27641:14;;;-1:-1:-1;27576:89:0;27698:5;-1:-1:-1;;;;;27677:26:0;:17;-1:-1:-1;;;;;27677:26:0;;27673:135;;;27735:5;27720:11;:20;27716:59;;;-1:-1:-1;27762:1:0;-1:-1:-1;27755:8:0;;-1:-1:-1;;;27755:8:0;27716:59;27785:13;;;;:::i;:::-;;;;27673:135;-1:-1:-1;27505:3:0;;;;:::i;:::-;;;;27465:350;;;;27821:56;;-1:-1:-1;;;27821:56:0;;;;;;;:::i;27139:744::-;;;;;:::o;42917:46::-;;;;;;;;;;;;;;;:::o;48140:140::-;41454:12;:10;:12::i;:::-;-1:-1:-1;;;;;41443:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;41443:23:0;;41435:68;;;;-1:-1:-1;;;41435:68:0;;;;;;;:::i;:::-;48235:37:::1;::::0;48203:21:::1;::::0;48243:10:::1;::::0;48235:37;::::1;;;::::0;48203:21;;48188:12:::1;48235:37:::0;48188:12;48235:37;48203:21;48243:10;48235:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;41514:1;48140:140::o:0;43711:48::-;;;;;;;;;;;;;:::o;32253:157::-;32365:39;32382:4;32388:2;32392:7;32365:39;;;;;;;;;;;;:16;:39::i;26671:177::-;26738:7;26770:13;:11;:13::i;:::-;26762:5;:21;26754:69;;;;-1:-1:-1;;;26754:69:0;;;;;;;:::i;:::-;-1:-1:-1;26837:5:0;26671:177::o;43766:136::-;41454:12;:10;:12::i;:::-;-1:-1:-1;;;;;41443:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;41443:23:0;;41435:68;;;;-1:-1:-1;;;41435:68:0;;;;;;;:::i;:::-;43883:11:::1;43859;:21;43871:8;43859:21;;;;;;-1:-1:-1::0;;;43859:21:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;43859:21:0::1;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;43859:21:0;:35;-1:-1:-1;;43766:136:0:o;47313:106::-;41454:12;:10;:12::i;:::-;-1:-1:-1;;;;;41443:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;41443:23:0;;41435:68;;;;-1:-1:-1;;;41435:68:0;;;;;;;:::i;:::-;47388:23:::1;:13;47404:7:::0;;47388:23:::1;:::i;29496:118::-:0;29560:7;29583:20;29595:7;29583:11;:20::i;:::-;:25;;29496:118;-1:-1:-1;;29496:118:0:o;45228:444::-;45326:17;45270:7;45315:29;;;:10;:29;;;;;;45359:20;;;;;:58;;;45402:15;45383:34;;:15;:34;;45359:58;45355:108;;;45441:10;45434:17;;;;;45355:108;45509:17;45473:22;45498:29;:10;:29;;;;;;45542:20;;;;;:58;;;45585:15;45566:34;;:15;:34;;45542:58;45538:108;;;45624:10;45617:17;;;;;;45538:108;45663:1;45656:8;;;;45228:444;:::o;28373:211::-;28437:7;-1:-1:-1;;;;;28461:19:0;;28453:75;;;;-1:-1:-1;;;28453:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;28550:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;28550:27:0;;28373:211::o;41874:94::-;41454:12;:10;:12::i;:::-;-1:-1:-1;;;;;41443:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;41443:23:0;;41435:68;;;;-1:-1:-1;;;41435:68:0;;;;;;;:::i;:::-;41939:21:::1;41957:1;41939:9;:21::i;:::-;41874:94::o:0;42970:132::-;41454:12;:10;:12::i;:::-;-1:-1:-1;;;;;41443:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;41443:23:0;;41435:68;;;;-1:-1:-1;;;41435:68:0;;;;;;;:::i;:::-;43084:10:::1;43061;:20;43072:8;43061:20;;;;;;-1:-1:-1::0;;;43061:20:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;43061:20:0::1;;;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;42970:132:::0;;:::o;43108:532::-;43166:4;43187:10;:20;43198:8;43187:20;;;;;;-1:-1:-1;;;43187:20:0;;;;;;;;;;;;;;;-1:-1:-1;;;43187:20:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43187:20:0;;;;43183:70;;-1:-1:-1;43236:5:0;43229:12;;43183:70;43263:17;;43299:8;:29;;;;;;-1:-1:-1;;;43299:29:0;;;;;;;;;;:62;;;-1:-1:-1;43344:17:0;43332:8;:29;;;;;;-1:-1:-1;;;43332:29:0;;;;;;;;;;43299:62;:95;;;-1:-1:-1;43377:17:0;43365:8;:29;;;;;;-1:-1:-1;;;43365:29:0;;;;;;;;;;43299:95;43295:178;;;42831:6;43424:10;:20;43435:8;43424:20;;;;;;-1:-1:-1;;;43424:20:0;;;;;;;;;;;;;;;-1:-1:-1;;;43424:20:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43424:20:0;;:37;;;:20;;:37;:::i;:::-;43411:50;;43295:178;43487:15;;;;;;;:48;;;43525:10;43506:29;;:15;:29;;43487:48;43483:93;;;43559:5;43552:12;;;;;43483:93;43612:10;:20;43623:8;43612:20;;;;;;-1:-1:-1;;;43612:20:0;;;;;;;;;;;;;;;-1:-1:-1;;;43612:20:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43612:20:0;;;;43593:15;:39;;;43108:532;-1:-1:-1;;;43108:532:0:o;41223:87::-;41269:7;41296:6;-1:-1:-1;;;;;41296:6:0;41223:87;:::o;47680:135::-;47746:21;;:::i;:::-;47787:20;47799:7;47787:11;:20::i;29828:98::-;29884:13;29913:7;29906:14;;;;;:::i;44286:934::-;44349:7;;;44408:8;:29;;;;;;-1:-1:-1;;;44408:29:0;;;;;;;;;;44404:559;;;-1:-1:-1;44506:10:0;44469:36;:48;;;:36;;:48;:36;:48;;;44404:559;;;44551:17;44539:8;:29;;;;;;-1:-1:-1;;;44539:29:0;;;;;;;;;;:63;;;-1:-1:-1;44584:18:0;44572:8;:30;;;;;;-1:-1:-1;;;44572:30:0;;;;;;;;;;44539:63;44535:428;;;44723:10;44685:37;:49;;;:37;;:49;;;:37;:49;;;;44634:36;:48;;;;;;;:100;;44685:49;44634:100;:::i;:::-;44619:115;;44535:428;;;44768:17;44756:8;:29;;;;;;-1:-1:-1;;;44756:29:0;;;;;;;;;;:63;;;-1:-1:-1;44801:18:0;44789:8;:30;;;;;;-1:-1:-1;;;44789:30:0;;;;;;;;;;44756:63;44752:211;;;44940:10;44902:37;:49;;;:37;;:49;;;:37;:49;;;;44851:36;:48;;;;;;;:100;;44902:49;44851:100;:::i;:::-;44836:115;;44752:211;44973:27;;45015:8;:29;;;;;;-1:-1:-1;;;45015:29:0;;;;;;;;;;45011:147;;;-1:-1:-1;45086:1:0;45011:147;;;-1:-1:-1;45145:1:0;45011:147;45175:37;45200:12;45175:22;:37;:::i;:::-;45168:44;44286:934;-1:-1:-1;;;;44286:934:0:o;45680:403::-;45738:7;;45762:8;:29;;;;;;-1:-1:-1;;;45762:29:0;;;;;;;;;;45758:299;;;-1:-1:-1;45815:4:0;45808:11;;45758:299;45853:17;45841:8;:29;;;;;;-1:-1:-1;;;45841:29:0;;;;;;;;;;:63;;;-1:-1:-1;45886:18:0;45874:8;:30;;;;;;-1:-1:-1;;;45874:30:0;;;;;;;;;;45841:63;45837:220;;;-1:-1:-1;45928:4:0;45921:11;;45837:220;45966:17;45954:8;:29;;;;;;-1:-1:-1;;;45954:29:0;;;;;;;;;;:63;;;-1:-1:-1;45999:18:0;45987:8;:30;;;;;;-1:-1:-1;;;45987:30:0;;;;;;;;;;45954:63;45950:107;;;-1:-1:-1;46041:4:0;46034:11;;45950:107;-1:-1:-1;46074:1:0;45680:403;;;:::o;31466:274::-;31569:12;:10;:12::i;:::-;-1:-1:-1;;;;;31557:24:0;:8;-1:-1:-1;;;;;31557:24:0;;;31549:63;;;;-1:-1:-1;;;31549:63:0;;;;;;;:::i;:::-;31666:8;31621:18;:32;31640:12;:10;:12::i;:::-;-1:-1:-1;;;;;31621:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;31621:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;31621:53:0;;;;;;;;;;;31701:12;:10;:12::i;:::-;-1:-1:-1;;;;;31686:48:0;;31725:8;31686:48;;;;;;:::i;:::-;;;;;;;;31466:274;;:::o;42791:46::-;42831:6;42791:46;:::o;32473:311::-;32610:28;32620:4;32626:2;32630:7;32610:9;:28::i;:::-;32661:48;32684:4;32690:2;32694:7;32703:5;32661:22;:48::i;:::-;32645:133;;;;-1:-1:-1;;;32645:133:0;;;;;;;:::i;:::-;32473:311;;;;:::o;29989:394::-;30087:13;30128:16;30136:7;30128;:16::i;:::-;30112:97;;;;-1:-1:-1;;;30112:97:0;;;;;;;:::i;:::-;30218:21;30242:10;:8;:10::i;:::-;30218:34;;30297:1;30279:7;30273:21;:25;:104;;;;;;;;;;;;;;;;;30334:7;30343:18;:7;:16;:18::i;:::-;30317:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30273:104;30259:118;29989:394;-1:-1:-1;;;29989:394:0:o;42709:75::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;47823:309::-;41454:12;:10;:12::i;:::-;-1:-1:-1;;;;;41443:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;41443:23:0;;41435:68;;;;-1:-1:-1;;;41435:68:0;;;;;;;:::i;:::-;47942:14:::1;47924:7;:14;47908:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:48;;47900:79;;;;-1:-1:-1::0;;;47900:79:0::1;;;;;;;:::i;:::-;47990:6;48007:118;48023:7;:14;48019:1;:18;48007:118;;;48059:10;48072:7;48080:1;48072:10;;;;;;-1:-1:-1::0;;;48072:10:0::1;;;;;;;;;;;;;;;48059:23;;48097:16;48107:2;48111:1;48097:9;:16::i;:::-;-1:-1:-1::0;48039:3:0;::::1;::::0;::::1;:::i;:::-;;;;48007:118;;36888:43:::0;;;;:::o;46286:839::-;46200:9;46213:10;46200:23;46192:66;;;;-1:-1:-1;;;46192:66:0;;;;;;;:::i;:::-;46423:1:::1;46412:8;:12;46404:76;;;;-1:-1:-1::0;;;46404:76:0::1;;;;;;;:::i;:::-;46499:18;46508:8;46499;:18::i;:::-;46491:55;;;;-1:-1:-1::0;;;46491:55:0::1;;;;;;;:::i;:::-;46593:18;46602:8;46593;:18::i;:::-;46581:8;46565:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:46;;46557:94;;;;-1:-1:-1::0;;;46557:94:0::1;;;;;;;:::i;:::-;46698:14;46686:8;46670:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;46662:73;;;;-1:-1:-1::0;;;46662:73:0::1;;;;;;;:::i;:::-;46780:9;46768:8;46754:11;:9;:11::i;:::-;:22;;;;:::i;:::-;:35;46746:77;;;;-1:-1:-1::0;;;46746:77:0::1;;;;;;;:::i;:::-;46868:23;46882:8;46868:13;:23::i;:::-;46856:8;:35;;46834:107;;;;-1:-1:-1::0;;;46834:107:0::1;;;;;;;:::i;:::-;46960:28;46972:8;46982:5;;46960:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;46960:11:0::1;::::0;-1:-1:-1;;;46960:28:0:i:1;:::-;46952:61;;;;-1:-1:-1::0;;;46952:61:0::1;;;;;;;:::i;:::-;47024:31;47034:10;47046:8;47024:9;:31::i;:::-;47109:8;47066:17;:27;47084:8;47066:27;;;;;;-1:-1:-1::0;;;47066:27:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;47066:27:0::1;;;;;;;;;;;;;;;;;;;;:39;47094:10;-1:-1:-1::0;;;;;47066:39:0::1;-1:-1:-1::0;;;;;47066:39:0::1;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;46286:839:0:o;47559:113::-;47617:7;47644:20;47658:5;47644:13;:20::i;31803:186::-;-1:-1:-1;;;;;31948:25:0;;;31925:4;31948:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31803:186::o;42123:192::-;41454:12;:10;:12::i;:::-;-1:-1:-1;;;;;41443:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;41443:23:0;;41435:68;;;;-1:-1:-1;;;41435:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42212:22:0;::::1;42204:73;;;;-1:-1:-1::0;;;42204:73:0::1;;;;;;;:::i;:::-;42288:19;42298:8;42288:9;:19::i;:::-;42123:192:::0;:::o;14115:157::-;-1:-1:-1;;;;;;14224:40:0;;-1:-1:-1;;;14224:40:0;14115:157;;;:::o;33023:105::-;33110:12;;-1:-1:-1;33100:22:0;33023:105::o;23990:98::-;24070:10;23990:98;:::o;36710:172::-;36807:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;36807:29:0;-1:-1:-1;;;;;36807:29:0;;;;;;;;;36848:28;;36807:24;;36848:28;;;;;;;36710:172;;;:::o;35075:1529::-;35172:35;35210:20;35222:7;35210:11;:20::i;:::-;35172:58;;35239:22;35281:13;:18;;;-1:-1:-1;;;;;35265:34:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;35265:34:0;;:81;;;;35334:12;:10;:12::i;:::-;-1:-1:-1;;;;;35310:36:0;:20;35322:7;35310:11;:20::i;:::-;-1:-1:-1;;;;;35310:36:0;;35265:81;:142;;;-1:-1:-1;35374:18:0;;35357:50;;35394:12;:10;:12::i;35357:50::-;35239:169;;35433:17;35417:101;;;;-1:-1:-1;;;35417:101:0;;;;;;;:::i;:::-;35565:4;-1:-1:-1;;;;;35543:26:0;:13;:18;;;-1:-1:-1;;;;;35543:26:0;;35527:98;;;;-1:-1:-1;;;35527:98:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35640:16:0;;35632:66;;;;-1:-1:-1;;;35632:66:0;;;;;;;:::i;:::-;35707:43;35729:4;35735:2;35739:7;35748:1;35707:21;:43::i;:::-;35807:49;35824:1;35828:7;35837:13;:18;;;35807:8;:49::i;:::-;-1:-1:-1;;;;;35865:18:0;;;;;;:12;:18;;;;;:31;;35895:1;;35865:18;:31;;35895:1;;-1:-1:-1;;;;;35865:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;35865:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35903:16:0;;-1:-1:-1;35903:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;35903:16:0;;:29;;-1:-1:-1;;35903:29:0;;:::i;:::-;;;-1:-1:-1;;;;;35903:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35962:43:0;;;;;;;;-1:-1:-1;;;;;35962:43:0;;;;;-1:-1:-1;;;;;35988:15:0;35962:43;;;;;;;;;-1:-1:-1;35939:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;35939:66:0;-1:-1:-1;;;;35939:66:0;;;;-1:-1:-1;;;;;;35939:66:0;;;;;;;;36255:11;35951:7;-1:-1:-1;36255:11:0;:::i;:::-;36318:1;36277:24;;;:11;:24;;;;;:29;36233:33;;-1:-1:-1;;;;;;36277:29:0;36273:236;;36335:20;36343:11;36335:7;:20::i;:::-;36331:171;;;36395:97;;;;;;;;36422:18;;-1:-1:-1;;;;;36395:97:0;;;;;;36453:28;;;;-1:-1:-1;;;;;36395:97:0;;;;;;;;;-1:-1:-1;36368:24:0;;;:11;:24;;;;;;;:124;;;;;;-1:-1:-1;;;;;;36368:124:0;;;;;;;;;-1:-1:-1;;;;36368:124:0;-1:-1:-1;;;36368:124:0;;;;;;;;;;;;;;36331:171;36541:7;36537:2;-1:-1:-1;;;;;36522:27:0;36531:4;-1:-1:-1;;;;;36522:27:0;;;;;;;;;;;36556:42;36577:4;36583:2;36587:7;36596:1;36556:20;:42::i;:::-;35075:1529;;;;;;:::o;37036:846::-;37126:24;;37165:12;37157:49;;;;-1:-1:-1;;;37157:49:0;;;;;;;:::i;:::-;37213:16;37263:1;37232:28;37252:8;37232:17;:28;:::i;:::-;:32;;;;:::i;:::-;37213:51;-1:-1:-1;37286:18:0;37303:1;37286:14;:18;:::i;:::-;37275:8;:29;37271:81;;;37326:18;37343:1;37326:14;:18;:::i;:::-;37315:29;;37271:81;37467:17;37475:8;37467:7;:17::i;:::-;37459:68;;;;-1:-1:-1;;;37459:68:0;;;;;;;:::i;:::-;37551:17;37534:297;37575:8;37570:1;:13;37534:297;;37634:1;37603:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;37603:19:0;37599:225;;37649:31;37683:14;37695:1;37683:11;:14::i;:::-;37725:89;;;;;;;;37752:14;;-1:-1:-1;;;;;37725:89:0;;;;;;37779:24;;;;-1:-1:-1;;;;;37725:89:0;;;;;;;;;-1:-1:-1;37708:14:0;;;:11;:14;;;;;;;:106;;;;;;-1:-1:-1;;;;;;37708:106:0;;;;;;-1:-1:-1;;;;37708:106:0;-1:-1:-1;;;37708:106:0;;;;;;;;;;;;;;-1:-1:-1;37599:225:0;37585:3;;;;:::i;:::-;;;;37534:297;;;-1:-1:-1;37864:12:0;:8;37875:1;37864:12;:::i;:::-;37837:24;:39;-1:-1:-1;;;37036:846:0:o;28836:606::-;28912:21;;:::i;:::-;28953:16;28961:7;28953;:16::i;:::-;28945:71;;;;-1:-1:-1;;;28945:71:0;;;;;;;:::i;:::-;29025:26;29073:12;29062:7;:23;29058:93;;29117:22;29127:12;29117:7;:22;:::i;:::-;:26;;29142:1;29117:26;:::i;:::-;29096:47;;29058:93;29179:7;29159:212;29196:18;29188:4;:26;29159:212;;29233:31;29267:17;;;:11;:17;;;;;;;;;29233:51;;;;;;;;;-1:-1:-1;;;;;29233:51:0;;;;;-1:-1:-1;;;29233:51:0;;;-1:-1:-1;;;;;29233:51:0;;;;;;;;29297:28;29293:71;;29345:9;-1:-1:-1;29338:16:0;;-1:-1:-1;;29338:16:0;29293:71;-1:-1:-1;29216:6:0;;;;:::i;:::-;;;;29159:212;;;;29379:57;;-1:-1:-1;;;29379:57:0;;;;;;;:::i;42323:173::-;42379:16;42398:6;;-1:-1:-1;;;;;42415:17:0;;;-1:-1:-1;;;;;;42415:17:0;;;;;;42448:40;;42398:6;;;;;;;42448:40;;42379:16;42448:40;42323:173;;:::o;38425:690::-;38562:4;38579:15;:2;-1:-1:-1;;;;;38579:13:0;;:15::i;:::-;38575:535;;;38634:2;-1:-1:-1;;;;;38618:36:0;;38655:12;:10;:12::i;:::-;38669:4;38675:7;38684:5;38618:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38618:72:0;;;;;;;;-1:-1:-1;;38618:72:0;;;;;;;;;;;;:::i;:::-;;;38605:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38849:13:0;;38845:215;;38882:61;;-1:-1:-1;;;38882:61:0;;;;;;;:::i;38845:215::-;39028:6;39022:13;39013:6;39009:2;39005:15;38998:38;38605:464;-1:-1:-1;;;;;;38740:55:0;-1:-1:-1;;;38740:55:0;;-1:-1:-1;38733:62:0;;38575:535;-1:-1:-1;39098:4:0;38425:690;;;;;;:::o;47191:114::-;47251:13;47284;47277:20;;;;;:::i;1971:723::-;2027:13;2248:10;2244:53;;-1:-1:-1;2275:10:0;;;;;;;;;;;;-1:-1:-1;;;2275:10:0;;;;;;2244:53;2322:5;2307:12;2363:78;2370:9;;2363:78;;2396:8;;;;:::i;:::-;;-1:-1:-1;2419:10:0;;-1:-1:-1;2427:2:0;2419:10;;:::i;:::-;;;2363:78;;;2451:19;2483:6;-1:-1:-1;;;;;2473:17:0;;;;;-1:-1:-1;;;2473:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2473:17:0;;2451:39;;2501:154;2508:10;;2501:154;;2535:11;2545:1;2535:11;;:::i;:::-;;-1:-1:-1;2604:10:0;2612:2;2604:5;:10;:::i;:::-;2591:24;;:2;:24;:::i;:::-;2578:39;;2561:6;2568;2561:14;;;;;;-1:-1:-1;;;2561:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;2561:56:0;;;;;;;;-1:-1:-1;2632:11:0;2641:2;2632:11;;:::i;:::-;;;2501:154;;33134:98;33199:27;33209:2;33213:8;33199:27;;;;;;;;;;;;:9;:27::i;43908:370::-;44002:4;44035:18;44023:8;:30;;;;;;-1:-1:-1;;;44023:30:0;;;;;;;;;;:64;;;-1:-1:-1;44069:18:0;44057:8;:30;;;;;;-1:-1:-1;;;44057:30:0;;;;;;;;;;44023:64;44019:108;;;-1:-1:-1;44111:4:0;44104:11;;44019:108;44137:12;44179:10;44162:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;44152:39;;;;;;44137:54;;44209:61;44228:12;44242:11;:21;44254:8;44242:21;;;;;;-1:-1:-1;;;44242:21:0;;;;;;;;;;;;;;;-1:-1:-1;;;44242:21:0;;;;;;;;;;;;;;;;;;;;;44265:4;44209:18;:61::i;28590:240::-;28651:7;-1:-1:-1;;;;;28683:19:0;;28667:102;;;;-1:-1:-1;;;28667:102:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;28791:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;28791:32:0;;-1:-1:-1;;;;;28791:32:0;;28590:240::o;4470:387::-;4793:20;4841:8;;;4470:387::o;33571:1272::-;33699:12;;-1:-1:-1;;;;;33726:16:0;;33718:62;;;;-1:-1:-1;;;33718:62:0;;;;;;;:::i;:::-;33917:21;33925:12;33917:7;:21::i;:::-;33916:22;33908:64;;;;-1:-1:-1;;;33908:64:0;;;;;;;:::i;:::-;33999:12;33987:8;:24;;33979:71;;;;-1:-1:-1;;;33979:71:0;;;;;;;:::i;:::-;34059:61;34089:1;34093:2;34097:12;34111:8;34059:21;:61::i;:::-;-1:-1:-1;;;;;34162:16:0;;34129:30;34162:16;;;:12;:16;;;;;;;;;34129:49;;;;;;;;;-1:-1:-1;;;;;34129:49:0;;;;;-1:-1:-1;;;34129:49:0;;;;;;;;;;;34204:119;;;;;;;;34224:19;;34129:49;;34204:119;;;34224:39;;34254:8;;34224:39;:::i;:::-;-1:-1:-1;;;;;34204:119:0;;;;;34307:8;34272:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;34204:119:0;;;;;;-1:-1:-1;;;;;34185:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;;;-1:-1:-1;;;34185:138:0;;;;-1:-1:-1;;34185:138:0;;;;;;;;;;;;;;;;;34358:43;;;;;;;;;;-1:-1:-1;;;;;34384:15:0;34358:43;;;;;;;;34330:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;34330:71:0;-1:-1:-1;;;;34330:71:0;;;;-1:-1:-1;;;;;;34330:71:0;;;;;;;;;;;;;;;34342:12;;34454:281;34478:8;34474:1;:12;34454:281;;;34507:38;;34532:12;;-1:-1:-1;;;;;34507:38:0;;;34524:1;;34507:38;;34524:1;;34507:38;34572:59;34603:1;34607:2;34611:12;34625:5;34572:22;:59::i;:::-;34554:150;;;;-1:-1:-1;;;34554:150:0;;;;;;;:::i;:::-;34713:14;;;;:::i;:::-;;;;34488:3;;;;;:::i;:::-;;;;34454:281;;;-1:-1:-1;34743:12:0;:27;;;34777:60;34806:1;34810:2;34814:12;34828:8;34777:20;:60::i;426:190::-;551:4;604;575:25;588:5;595:4;575:12;:25::i;:::-;:33;;426:190;-1:-1:-1;;;;426:190:0:o;978:701::-;1061:7;1104:4;1061:7;1119:523;1143:5;:12;1139:1;:16;1119:523;;;1177:20;1200:5;1206:1;1200:8;;;;;;-1:-1:-1;;;1200:8:0;;;;;;;;;;;;;;;1177:31;;1243:12;1227;:28;1223:408;;1397:12;1411;1380:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1370:55;;;;;;1355:70;;1223:408;;;1587:12;1601;1570:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1560:55;;;;;;1545:70;;1223:408;-1:-1:-1;1157:3:0;;;;:::i;:::-;;;;1119:523;;;-1:-1:-1;1659:12:0;978:701;-1:-1:-1;;;978:701:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:175:1;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:152;271:20;;320:1;310:12;;300:2;;336:1;333;326:12;351:198;;463:2;451:9;442:7;438:23;434:32;431:2;;;484:6;476;469:22;431:2;512:31;533:9;512:31;:::i;554:274::-;;;683:2;671:9;662:7;658:23;654:32;651:2;;;704:6;696;689:22;651:2;732:31;753:9;732:31;:::i;:::-;722:41;;782:40;818:2;807:9;803:18;782:40;:::i;:::-;772:50;;641:187;;;;;:::o;833:342::-;;;;979:2;967:9;958:7;954:23;950:32;947:2;;;1000:6;992;985:22;947:2;1028:31;1049:9;1028:31;:::i;:::-;1018:41;;1078:40;1114:2;1103:9;1099:18;1078:40;:::i;:::-;1068:50;;1165:2;1154:9;1150:18;1137:32;1127:42;;937:238;;;;;:::o;1180:1028::-;;;;;1352:3;1340:9;1331:7;1327:23;1323:33;1320:2;;;1374:6;1366;1359:22;1320:2;1402:31;1423:9;1402:31;:::i;:::-;1392:41;;1452:2;1473:40;1509:2;1498:9;1494:18;1473:40;:::i;:::-;1463:50;;1560:2;1549:9;1545:18;1532:32;1522:42;;1615:2;1604:9;1600:18;1587:32;-1:-1:-1;;;;;1679:2:1;1671:6;1668:14;1665:2;;;1700:6;1692;1685:22;1665:2;1743:6;1732:9;1728:22;1718:32;;1788:7;1781:4;1777:2;1773:13;1769:27;1759:2;;1815:6;1807;1800:22;1759:2;1856;1843:16;1878:2;1874;1871:10;1868:2;;;1884:18;;:::i;:::-;1926:52;1968:2;1949:13;;-1:-1:-1;;1945:27:1;1941:36;;1926:52;:::i;:::-;1913:65;;2001:2;1994:5;1987:17;2041:7;2036:2;2031;2027;2023:11;2019:20;2016:33;2013:2;;;2067:6;2059;2052:22;2013:2;2127;2122;2118;2114:11;2109:2;2102:5;2098:14;2085:45;2150:14;;2146:23;;;2139:39;;;;1310:898;;;;-1:-1:-1;1310:898:1;;-1:-1:-1;;1310:898:1:o;2213:369::-;;;2339:2;2327:9;2318:7;2314:23;2310:32;2307:2;;;2360:6;2352;2345:22;2307:2;2388:31;2409:9;2388:31;:::i;:::-;2378:41;;2469:2;2458:9;2454:18;2441:32;2516:5;2509:13;2502:21;2495:5;2492:32;2482:2;;2543:6;2535;2528:22;2482:2;2571:5;2561:15;;;2297:285;;;;;:::o;2587:266::-;;;2716:2;2704:9;2695:7;2691:23;2687:32;2684:2;;;2737:6;2729;2722:22;2684:2;2765:31;2786:9;2765:31;:::i;:::-;2755:41;2843:2;2828:18;;;;2815:32;;-1:-1:-1;;;2674:179:1:o;2858:1010::-;;2973:2;3016;3004:9;2995:7;2991:23;2987:32;2984:2;;;3037:6;3029;3022:22;2984:2;3082:9;3069:23;-1:-1:-1;;;;;3152:2:1;3144:6;3141:14;3138:2;;;3173:6;3165;3158:22;3138:2;3216:6;3205:9;3201:22;3191:32;;3261:7;3254:4;3250:2;3246:13;3242:27;3232:2;;3288:6;3280;3273:22;3232:2;3329;3316:16;3351:2;3347;3344:10;3341:2;;;3357:18;;:::i;:::-;3404:2;3400;3396:11;3386:21;;3427:27;3450:2;3446;3442:11;3427:27;:::i;:::-;3488:15;;;3519:12;;;;3551:11;;;3581;;;3577:20;;3574:33;-1:-1:-1;3571:2:1;;;3625:6;3617;3610:22;3571:2;3652:6;3643:15;;3667:171;3681:2;3678:1;3675:9;3667:171;;;3738:25;3759:3;3738:25;:::i;:::-;3726:38;;3699:1;3692:9;;;;;3784:12;;;;3816;;3667:171;;;-1:-1:-1;3857:5:1;2953:915;-1:-1:-1;;;;;;;;2953:915:1:o;3873:257::-;;3984:2;3972:9;3963:7;3959:23;3955:32;3952:2;;;4005:6;3997;3990:22;3952:2;4049:9;4036:23;4068:32;4094:5;4068:32;:::i;4135:261::-;;4257:2;4245:9;4236:7;4232:23;4228:32;4225:2;;;4278:6;4270;4263:22;4225:2;4315:9;4309:16;4334:32;4360:5;4334:32;:::i;4401:218::-;;4526:2;4514:9;4505:7;4501:23;4497:32;4494:2;;;4547:6;4539;4532:22;4494:2;4575:38;4603:9;4575:38;:::i;4624:294::-;;;4766:2;4754:9;4745:7;4741:23;4737:32;4734:2;;;4787:6;4779;4772:22;4734:2;4815:38;4843:9;4815:38;:::i;4923:286::-;;;5065:2;5053:9;5044:7;5040:23;5036:32;5033:2;;;5086:6;5078;5071:22;5033:2;5114:38;5142:9;5114:38;:::i;5214:830::-;;;;;5408:2;5396:9;5387:7;5383:23;5379:32;5376:2;;;5429:6;5421;5414:22;5376:2;5457:38;5485:9;5457:38;:::i;:::-;5447:48;;5542:2;5531:9;5527:18;5514:32;5504:42;;5597:2;5586:9;5582:18;5569:32;-1:-1:-1;;;;;5661:2:1;5653:6;5650:14;5647:2;;;5682:6;5674;5667:22;5647:2;5725:6;5714:9;5710:22;5700:32;;5770:7;5763:4;5759:2;5755:13;5751:27;5741:2;;5797:6;5789;5782:22;5741:2;5842;5829:16;5868:2;5860:6;5857:14;5854:2;;;5889:6;5881;5874:22;5854:2;5948:7;5943:2;5937;5929:6;5925:15;5921:2;5917:24;5913:33;5910:46;5907:2;;;5974:6;5966;5959:22;5907:2;5366:678;;;;-1:-1:-1;;6010:2:1;6002:11;;-1:-1:-1;;;5366:678:1:o;6049:392::-;;;6190:2;6178:9;6169:7;6165:23;6161:32;6158:2;;;6211:6;6203;6196:22;6158:2;6239:38;6267:9;6239:38;:::i;:::-;6229:48;;6327:2;6316:9;6312:18;6299:32;6371:10;6364:5;6360:22;6353:5;6350:33;6340:2;;6402:6;6394;6387:22;6446:642;;;6578:2;6566:9;6557:7;6553:23;6549:32;6546:2;;;6599:6;6591;6584:22;6546:2;6644:9;6631:23;-1:-1:-1;;;;;6714:2:1;6706:6;6703:14;6700:2;;;6735:6;6727;6720:22;6700:2;6778:6;6767:9;6763:22;6753:32;;6823:7;6816:4;6812:2;6808:13;6804:27;6794:2;;6850:6;6842;6835:22;6794:2;6895;6882:16;6921:2;6913:6;6910:14;6907:2;;;6942:6;6934;6927:22;6907:2;6992:7;6987:2;6978:6;6974:2;6970:15;6966:24;6963:37;6960:2;;;7018:6;7010;7003:22;6960:2;7054;7046:11;;;;;7076:6;;-1:-1:-1;6536:552:1;;-1:-1:-1;;;;6536:552:1:o;7093:190::-;;7205:2;7193:9;7184:7;7180:23;7176:32;7173:2;;;7226:6;7218;7211:22;7173:2;-1:-1:-1;7254:23:1;;7163:120;-1:-1:-1;7163:120:1:o;7288:259::-;;7369:5;7363:12;7396:6;7391:3;7384:19;7412:63;7468:6;7461:4;7456:3;7452:14;7445:4;7438:5;7434:16;7412:63;:::i;:::-;7529:2;7508:15;-1:-1:-1;;7504:29:1;7495:39;;;;7536:4;7491:50;;7339:208;-1:-1:-1;;7339:208:1:o;7552:229::-;7701:2;7697:15;;;;-1:-1:-1;;7693:53:1;7681:66;;7772:2;7763:12;;7671:110::o;7786:247::-;7943:19;;;7987:2;7978:12;;7971:28;8024:2;8015:12;;7933:100::o;8038:470::-;;8255:6;8249:13;8271:53;8317:6;8312:3;8305:4;8297:6;8293:17;8271:53;:::i;:::-;8387:13;;8346:16;;;;8409:57;8387:13;8346:16;8443:4;8431:17;;8409:57;:::i;:::-;8482:20;;8225:283;-1:-1:-1;;;;8225:283:1:o;8513:203::-;-1:-1:-1;;;;;8677:32:1;;;;8659:51;;8647:2;8632:18;;8614:102::o;8721:490::-;-1:-1:-1;;;;;8990:15:1;;;8972:34;;9042:15;;9037:2;9022:18;;9015:43;9089:2;9074:18;;9067:34;;;9137:3;9132:2;9117:18;;9110:31;;;8721:490;;9158:47;;9185:19;;9177:6;9158:47;:::i;:::-;9150:55;8924:287;-1:-1:-1;;;;;;8924:287:1:o;9216:187::-;9381:14;;9374:22;9356:41;;9344:2;9329:18;;9311:92::o;9408:177::-;9554:25;;;9542:2;9527:18;;9509:76::o;9590:221::-;;9739:2;9728:9;9721:21;9759:46;9801:2;9790:9;9786:18;9778:6;9759:46;:::i;9816:398::-;10018:2;10000:21;;;10057:2;10037:18;;;10030:30;10096:34;10091:2;10076:18;;10069:62;-1:-1:-1;;;10162:2:1;10147:18;;10140:32;10204:3;10189:19;;9990:224::o;10219:415::-;10421:2;10403:21;;;10460:2;10440:18;;;10433:30;10499:34;10494:2;10479:18;;10472:62;-1:-1:-1;;;10565:2:1;10550:18;;10543:49;10624:3;10609:19;;10393:241::o;10639:402::-;10841:2;10823:21;;;10880:2;10860:18;;;10853:30;10919:34;10914:2;10899:18;;10892:62;-1:-1:-1;;;10985:2:1;10970:18;;10963:36;11031:3;11016:19;;10813:228::o;11046:406::-;11248:2;11230:21;;;11287:2;11267:18;;;11260:30;11326:34;11321:2;11306:18;;11299:62;-1:-1:-1;;;11392:2:1;11377:18;;11370:40;11442:3;11427:19;;11220:232::o;11457:399::-;11659:2;11641:21;;;11698:2;11678:18;;;11671:30;11737:34;11732:2;11717:18;;11710:62;-1:-1:-1;;;11803:2:1;11788:18;;11781:33;11846:3;11831:19;;11631:225::o;11861:401::-;12063:2;12045:21;;;12102:2;12082:18;;;12075:30;12141:34;12136:2;12121:18;;12114:62;-1:-1:-1;;;12207:2:1;12192:18;;12185:35;12252:3;12237:19;;12035:227::o;12267:348::-;12469:2;12451:21;;;12508:2;12488:18;;;12481:30;12547:26;12542:2;12527:18;;12520:54;12606:2;12591:18;;12441:174::o;12620:413::-;12822:2;12804:21;;;12861:2;12841:18;;;12834:30;12900:34;12895:2;12880:18;;12873:62;-1:-1:-1;;;12966:2:1;12951:18;;12944:47;13023:3;13008:19;;12794:239::o;13038:354::-;13240:2;13222:21;;;13279:2;13259:18;;;13252:30;13318:32;13313:2;13298:18;;13291:60;13383:2;13368:18;;13212:180::o;13397:421::-;13599:2;13581:21;;;13638:2;13618:18;;;13611:30;13677:34;13672:2;13657:18;;13650:62;13748:27;13743:2;13728:18;;13721:55;13808:3;13793:19;;13571:247::o;13823:348::-;14025:2;14007:21;;;14064:2;14044:18;;;14037:30;14103:26;14098:2;14083:18;;14076:54;14162:2;14147:18;;13997:174::o;14176:353::-;14378:2;14360:21;;;14417:2;14397:18;;;14390:30;14456:31;14451:2;14436:18;;14429:59;14520:2;14505:18;;14350:179::o;14534:407::-;14736:2;14718:21;;;14775:2;14755:18;;;14748:30;14814:34;14809:2;14794:18;;14787:62;-1:-1:-1;;;14880:2:1;14865:18;;14858:41;14931:3;14916:19;;14708:233::o;14946:342::-;15148:2;15130:21;;;15187:2;15167:18;;;15160:30;-1:-1:-1;;;15221:2:1;15206:18;;15199:48;15279:2;15264:18;;15120:168::o;15293:402::-;15495:2;15477:21;;;15534:2;15514:18;;;15507:30;15573:34;15568:2;15553:18;;15546:62;-1:-1:-1;;;15639:2:1;15624:18;;15617:36;15685:3;15670:19;;15467:228::o;15700:356::-;15902:2;15884:21;;;15921:18;;;15914:30;15980:34;15975:2;15960:18;;15953:62;16047:2;16032:18;;15874:182::o;16061:411::-;16263:2;16245:21;;;16302:2;16282:18;;;16275:30;16341:34;16336:2;16321:18;;16314:62;-1:-1:-1;;;16407:2:1;16392:18;;16385:45;16462:3;16447:19;;16235:237::o;16477:350::-;16679:2;16661:21;;;16718:2;16698:18;;;16691:30;16757:28;16752:2;16737:18;;16730:56;16818:2;16803:18;;16651:176::o;16832:414::-;17034:2;17016:21;;;17073:2;17053:18;;;17046:30;17112:34;17107:2;17092:18;;17085:62;-1:-1:-1;;;17178:2:1;17163:18;;17156:48;17236:3;17221:19;;17006:240::o;17251:344::-;17453:2;17435:21;;;17492:2;17472:18;;;17465:30;-1:-1:-1;;;17526:2:1;17511:18;;17504:50;17586:2;17571:18;;17425:170::o;17600:398::-;17802:2;17784:21;;;17841:2;17821:18;;;17814:30;17880:34;17875:2;17860:18;;17853:62;-1:-1:-1;;;17946:2:1;17931:18;;17924:32;17988:3;17973:19;;17774:224::o;18003:415::-;18205:2;18187:21;;;18244:2;18224:18;;;18217:30;18283:34;18278:2;18263:18;;18256:62;-1:-1:-1;;;18349:2:1;18334:18;;18327:49;18408:3;18393:19;;18177:241::o;18423:353::-;18625:2;18607:21;;;18664:2;18644:18;;;18637:30;18703:31;18698:2;18683:18;;18676:59;18767:2;18752:18;;18597:179::o;18781:397::-;18983:2;18965:21;;;19022:2;19002:18;;;18995:30;19061:34;19056:2;19041:18;;19034:62;-1:-1:-1;;;19127:2:1;19112:18;;19105:31;19168:3;19153:19;;18955:223::o;19183:346::-;19385:2;19367:21;;;19424:2;19404:18;;;19397:30;-1:-1:-1;;;19458:2:1;19443:18;;19436:52;19520:2;19505:18;;19357:172::o;19534:410::-;19736:2;19718:21;;;19775:2;19755:18;;;19748:30;19814:34;19809:2;19794:18;;19787:62;-1:-1:-1;;;19880:2:1;19865:18;;19858:44;19934:3;19919:19;;19708:236::o;19949:402::-;20151:2;20133:21;;;20190:2;20170:18;;;20163:30;20229:34;20224:2;20209:18;;20202:62;-1:-1:-1;;;20295:2:1;20280:18;;20273:36;20341:3;20326:19;;20123:228::o;20356:355::-;20558:2;20540:21;;;20597:2;20577:18;;;20570:30;20636:33;20631:2;20616:18;;20609:61;20702:2;20687:18;;20530:181::o;20716:411::-;20918:2;20900:21;;;20957:2;20937:18;;;20930:30;20996:34;20991:2;20976:18;;20969:62;-1:-1:-1;;;21062:2:1;21047:18;;21040:45;21117:3;21102:19;;20890:237::o;21132:399::-;21334:2;21316:21;;;21373:2;21353:18;;;21346:30;21412:34;21407:2;21392:18;;21385:62;-1:-1:-1;;;21478:2:1;21463:18;;21456:33;21521:3;21506:19;;21306:225::o;21536:409::-;21738:2;21720:21;;;21777:2;21757:18;;;21750:30;21816:34;21811:2;21796:18;;21789:62;-1:-1:-1;;;21882:2:1;21867:18;;21860:43;21935:3;21920:19;;21710:235::o;21950:398::-;22152:2;22134:21;;;22191:2;22171:18;;;22164:30;22230:34;22225:2;22210:18;;22203:62;-1:-1:-1;;;22296:2:1;22281:18;;22274:32;22338:3;22323:19;;22124:224::o;22353:360::-;22583:13;;-1:-1:-1;;;;;22579:39:1;22561:58;;22679:4;22667:17;;;22661:24;-1:-1:-1;;;;;22657:49:1;22635:20;;;22628:79;;;;22549:2;22534:18;;22516:197::o;22900:192::-;23074:10;23062:23;;;;23044:42;;23032:2;23017:18;;22999:93::o;23097:251::-;23167:2;23161:9;23197:17;;;-1:-1:-1;;;;;23229:34:1;;23265:22;;;23226:62;23223:2;;;23291:18;;:::i;:::-;23327:2;23320:22;23141:207;;-1:-1:-1;23141:207:1:o;23353:253::-;;-1:-1:-1;;;;;23482:2:1;23479:1;23475:10;23512:2;23509:1;23505:10;23543:3;23539:2;23535:12;23530:3;23527:21;23524:2;;;23551:18;;:::i;23611:128::-;;23682:1;23678:6;23675:1;23672:13;23669:2;;;23688:18;;:::i;:::-;-1:-1:-1;23724:9:1;;23659:80::o;23744:228::-;;23811:10;23848:2;23845:1;23841:10;23878:2;23875:1;23871:10;23909:3;23905:2;23901:12;23896:3;23893:21;23890:2;;;23917:18;;:::i;23977:120::-;;24043:1;24033:2;;24048:18;;:::i;:::-;-1:-1:-1;24082:9:1;;24023:74::o;24102:168::-;;24208:1;24204;24200:6;24196:14;24193:1;24190:21;24185:1;24178:9;24171:17;24167:45;24164:2;;;24215:18;;:::i;:::-;-1:-1:-1;24255:9:1;;24154:116::o;24275:246::-;;-1:-1:-1;;;;;24428:10:1;;;;24398;;24450:12;;;24447:2;;;24465:18;;:::i;:::-;24502:13;;24324:197;-1:-1:-1;;;24324:197:1:o;24526:125::-;;24594:1;24591;24588:8;24585:2;;;24599:18;;:::i;:::-;-1:-1:-1;24636:9:1;;24575:76::o;24656:258::-;24728:1;24738:113;24752:6;24749:1;24746:13;24738:113;;;24828:11;;;24822:18;24809:11;;;24802:39;24774:2;24767:10;24738:113;;;24869:6;24866:1;24863:13;24860:2;;;-1:-1:-1;;24904:1:1;24886:16;;24879:27;24709:205::o;24919:136::-;;24986:5;24976:2;;24995:18;;:::i;:::-;-1:-1:-1;;;25031:18:1;;24966:89::o;25060:380::-;25145:1;25135:12;;25192:1;25182:12;;;25203:2;;25257:4;25249:6;25245:17;25235:27;;25203:2;25310;25302:6;25299:14;25279:18;25276:38;25273:2;;;25356:10;25351:3;25347:20;25344:1;25337:31;25391:4;25388:1;25381:15;25419:4;25416:1;25409:15;25273:2;;25115:325;;;:::o;25445:135::-;;-1:-1:-1;;25505:17:1;;25502:2;;;25525:18;;:::i;:::-;-1:-1:-1;25572:1:1;25561:13;;25492:88::o;25585:112::-;;25643:1;25633:2;;25648:18;;:::i;:::-;-1:-1:-1;25682:9:1;;25623:74::o;25702:127::-;25763:10;25758:3;25754:20;25751:1;25744:31;25794:4;25791:1;25784:15;25818:4;25815:1;25808:15;25834:127;25895:10;25890:3;25886:20;25883:1;25876:31;25926:4;25923:1;25916:15;25950:4;25947:1;25940:15;25966:127;26027:10;26022:3;26018:20;26015:1;26008:31;26058:4;26055:1;26048:15;26082:4;26079:1;26072:15;26098:133;-1:-1:-1;;;;;;26174:32:1;;26164:43;;26154:2;;26221:1;26218;26211:12
Swarm Source
ipfs://7bd4d816cce01044e593675d74ac923c854e2959c7bfdcabd19d196baf3e25f2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.