Overview
ETH Balance
0.15 ETH
Eth Value
$495.33 (@ $3,302.23/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Whitelist Sale | 14476646 | 1024 days ago | IN | 0.05 ETH | 0.00926403 | ||||
Whitelist Sale | 14476638 | 1024 days ago | IN | 0.1 ETH | 0.02348051 | ||||
Update Whitelist | 14476552 | 1024 days ago | IN | 0 ETH | 0.00694319 | ||||
Update Whitelist | 14469874 | 1025 days ago | IN | 0 ETH | 0.04036428 | ||||
Update Public Sa... | 14469847 | 1025 days ago | IN | 0 ETH | 0.0030417 | ||||
Update Whitelist... | 14469837 | 1025 days ago | IN | 0 ETH | 0.00420791 |
Loading...
Loading
Contract Name:
Symbio
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-27 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (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); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. 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 virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/Symbio.sol pragma solidity ^0.8.11; contract Symbio is ERC721, Ownable { string _baseTokenURI = "https://metadata.symbio.gg/"; struct Symbiote { // General records uint256 tier; uint256 total_staked; uint256 stake_started_at; uint256 rewards_claimed_at; uint256 total_rewards_unclaimed; uint256 total_rewards_claimed; } Symbiote[] public symbiotes; // Total supply uint256 public totalSupply; // Total supply by tier uint256[6] public totalSupplyByTier; // Max supply uint256 public maxSupply = 19998; // max supply by tier uint256[6] public maxSupplyByTier = [3333, 3333, 3333, 3333, 3333, 3333]; // actual phase uint256 private actualPhase = 0; // max supply by tier on phase uint256[6][10] public maxSupplyByTierOnPhase; // phase => tier => max // Whitelist mapping(address => uint) public whitelist; // Whitelist Sale Time uint256[2] public whitelistSaleTime; // Only Owners Sale Time uint256[2] public ownerSaleTime; // Public Sale Time uint256[2] public publicSaleTime; // value of usd token to mint by tier uint[6] public mintValueByTier = [0.05 ether, 0.10 ether, 0.20 ether, 1.00 ether, 2.00 ether, 10.00 ether]; // Maximum of Mint Per Tx uint256 public maxMintsPerTx = 3; // Yield multiply by 10000 uint256 public yield = 110; constructor() ERC721("Symbio", "SYMBIO"){ // First symbiote index 0 symbiotes.push(Symbiote(0, 0, 0, 0, 0, 0)); maxSupplyByTierOnPhase[0] = [ 33, 13, 3, 0, 0, 0]; maxSupplyByTierOnPhase[1] = [ 333, 33, 13, 3, 0, 0]; maxSupplyByTierOnPhase[2] = [1333, 333, 33, 13, 3, 0]; maxSupplyByTierOnPhase[3] = [2333, 1333, 333, 33, 13, 3]; maxSupplyByTierOnPhase[4] = [3333, 2333, 1333, 333, 33, 13]; maxSupplyByTierOnPhase[5] = [3333, 3333, 2333, 1333, 333, 33]; maxSupplyByTierOnPhase[6] = [3333, 3333, 3333, 2333, 1333, 333]; maxSupplyByTierOnPhase[7] = [3333, 3333, 3333, 3333, 2333, 1333]; maxSupplyByTierOnPhase[8] = [3333, 3333, 3333, 3333, 3333, 2333]; maxSupplyByTierOnPhase[9] = [3333, 3333, 3333, 3333, 3333, 3333]; } function publicSale(uint _tier, uint256 _amount) public payable{ require(publicSaleTime[0] <= block.timestamp && publicSaleTime[1] > block.timestamp, "Public sale not started!"); mint(_tier, _amount); } function ownerSale(uint _tier, uint256 _amount) public payable{ require(ownerSaleTime[0] <= block.timestamp && ownerSaleTime[1] > block.timestamp, "Owner sale not started!"); require(balanceOf(msg.sender) > 0, "You are not a owner."); mint(_tier, _amount); } function whitelistSale(uint _tier, uint256 _amount) public payable{ require(whitelistSaleTime[0] <= block.timestamp && whitelistSaleTime[1] > block.timestamp, "Whitelist sale not started!"); require(whitelist[msg.sender] > 0, "You are not on whitelist."); require(whitelist[msg.sender] >= _amount, "You can not mint this amount."); whitelist[msg.sender] -= _amount; mint(_tier, _amount); } function updateWhitelist(address[] memory _addresses, uint _amount) public onlyOwner{ for(uint256 i = 0; i < _addresses.length; i++){ whitelist[_addresses[i]] = _amount; } } function updateWhitelistSale(uint256 _startTime, uint256 _endTime) public onlyOwner{ whitelistSaleTime[0] = _startTime; whitelistSaleTime[1] = _endTime; } function updateOwnerSale(uint256 _startTime, uint256 _endTime) public onlyOwner{ ownerSaleTime[0] = _startTime; ownerSaleTime[1] = _endTime; } function updatePublicSale(uint256 _startTime, uint256 _endTime) public onlyOwner{ publicSaleTime[0] = _startTime; publicSaleTime[1] = _endTime; } function mint(uint _tier, uint256 _amount) internal { require(maxMintsPerTx >= _amount, "Over maximum mints per TX!"); require(_tier < mintValueByTier.length, "Tier not exists!"); uint256 _mintValue = mintValueByTier[_tier]; require(msg.value == _mintValue * _amount, "Invalid value sent!"); require(maxSupply >= (totalSupply + _amount), "Not enough symbio remaining!"); require(maxSupplyByTier[_tier] >= (totalSupplyByTier[_tier] + _amount), "Not enough symbio of this tier remaining!"); require(maxSupplyByTierOnPhase[actualPhase][_tier] >= (totalSupplyByTier[_tier] + _amount), "Not enough symbio of this tier remaining in this phase!"); for(uint256 i = 0; i < _amount; i++){ // Create a new symbiote symbiotes.push(Symbiote(_tier, _mintValue, block.timestamp, 0, 0, 0)); // Mint _mint(msg.sender, totalSupply + 1 + i); } // Update supply totalSupply += _amount; totalSupplyByTier[_tier] += _amount; } function setMintValueByTier(uint256 _tier, uint256 _value) public onlyOwner higherOrEqualZero(_value) { mintValueByTier[_tier] = _value; } function setMaxSupplyByTierOnPhase(uint256[6] memory _valuesByTier, uint256 _phase) public onlyOwner { maxSupplyByTierOnPhase[_phase] = _valuesByTier; } function setMaxMintsPerTx(uint256 _value) public onlyOwner { maxMintsPerTx = _value; } function setYield(uint256 _value) public onlyOwner { yield = _value; } function claimRewards(uint256 _tokenId, address payable _address) public isOwner(_tokenId){ // Get rewards unclaimed uint256 _total_rewards_unclaimed = updateAndGetTotalRewardsUnclaimed(_tokenId); require(address(this).balance > _total_rewards_unclaimed, "Balance of contract not enoght, try later!"); if(_total_rewards_unclaimed > 0){ //Update total rewards unclaimed symbiotes[_tokenId].total_rewards_unclaimed = 0; // Update total rewards claimed symbiotes[_tokenId].total_rewards_claimed += _total_rewards_unclaimed; _address.transfer(_total_rewards_unclaimed); emit ClaimRewards(_tokenId, _total_rewards_unclaimed); } } function updateAndGetTotalRewardsUnclaimed(uint256 _tokenId) public returns(uint256){ //Update total rewards unclaimed symbiotes[_tokenId].total_rewards_unclaimed = getTotalRewardsUnclaimed(_tokenId); //Update reward claimed at symbiotes[_tokenId].rewards_claimed_at = block.timestamp; //Return total rewards unclaimed return symbiotes[_tokenId].total_rewards_unclaimed; } function getTotalRewardsUnclaimed(uint256 _tokenId) public view returns(uint256){ // Set total rewards unclaimed uint256 totalRewardsUnclaimed = symbiotes[_tokenId].total_rewards_unclaimed + calculeStakeBalance(_tokenId); return totalRewardsUnclaimed; } function calculeStakeBalance(uint256 _tokenId) public view returns(uint256){ uint256 totalReward; uint256 timeStakingBySeconds; uint256 actualTime; actualTime = block.timestamp; timeStakingBySeconds = 0; // Calculate total brains staked if(symbiotes[_tokenId].rewards_claimed_at > 0){ timeStakingBySeconds = actualTime - symbiotes[_tokenId].rewards_claimed_at; }else{ timeStakingBySeconds = actualTime - symbiotes[_tokenId].stake_started_at; } totalReward = (yield * symbiotes[_tokenId].total_staked * timeStakingBySeconds) / 864000000; // Filter to 0 if(totalReward < 0){ totalReward = 0; } return totalReward; } function withdraw(uint256 amount) public onlyOwner { require(amount <= address(this).balance, "Amount should be equal or lower of balance."); payable(msg.sender).transfer(amount); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } /* * Events */ /* * Modifiers */ // Check owner of this symbiote is the same of msg sender modifier isOwner(uint256 _symbioteId) { require(msg.sender == ownerOf(_symbioteId), "Must be the owner of the symbiote"); _; } // check if number is higher or equal zero modifier higherOrEqualZero(uint256 _value) { require(_value >= 0, "Value need be higher or equal zero"); _; } /* * Event */ event ClaimRewards(uint256 _tokenId, uint256 value); }
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":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"calculeStakeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address payable","name":"_address","type":"address"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTotalRewardsUnclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupplyByTier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupplyByTierOnPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintValueByTier","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":"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":[{"internalType":"uint256","name":"_tier","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tier","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"publicSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"uint256","name":"_value","type":"uint256"}],"name":"setMaxMintsPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[6]","name":"_valuesByTier","type":"uint256[6]"},{"internalType":"uint256","name":"_phase","type":"uint256"}],"name":"setMaxSupplyByTierOnPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tier","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMintValueByTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"symbiotes","outputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256","name":"total_staked","type":"uint256"},{"internalType":"uint256","name":"stake_started_at","type":"uint256"},{"internalType":"uint256","name":"rewards_claimed_at","type":"uint256"},{"internalType":"uint256","name":"total_rewards_unclaimed","type":"uint256"},{"internalType":"uint256","name":"total_rewards_claimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"","type":"uint256"}],"name":"totalSupplyByTier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"updateAndGetTotalRewardsUnclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"updateOwnerSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"updatePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"updateWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tier","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"whitelistSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c0604052601b60808190527f68747470733a2f2f6d657461646174612e73796d62696f2e67672f000000000060a0908152620000409160079190620005e2565b50614e1e6010556040805160c081018252610d0580825260208201819052918101829052606081018290526080810182905260a08101919091526200008a90601190600662000671565b5060006017556040805160c08101825266b1a2bc2ec50000815267016345785d8a000060208201526702c68af0bb14000091810191909152670de0b6b3a76400006060820152671bc16d674ec800006080820152678ac7230489e8000060a0820152620000fc90605b906006620006a8565b506003606155606e6062553480156200011457600080fd5b506040518060400160405280600681526020016553796d62696f60d01b8152506040518060400160405280600681526020016553594d42494f60d01b81525081600090805190602001906200016b929190620005e2565b50805162000181906001906020840190620005e2565b5050506200019e620001986200058c60201b60201c565b62000590565b6040805160c08082018352600080835260208084018281528486018381526060808701858152608080890187815260a0808b0189815260088054600181018255908b529b5160069c8d027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee381019190915597517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee489015595517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee588015592517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee6870155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee786015592517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee8909401939093558751958601885260218652600d93860193909352600396850196909652908301829052938201819052928101929092526200030e91601891620006e4565b506040805160c08101825261014d815260216020820152600d918101919091526003606082015260006080820181905260a08201526200035390601e90600662000671565b506040805160c081018252610535815261014d6020820152602191810191909152600d606082015260036080820152600060a08201526200039990602490600662000671565b506040805160c08101825261091d8152610535602082015261014d9181019190915260216060820152600d6080820152600360a0820152620003e090602a90600662000671565b506040805160c081018252610d05815261091d60208201526105359181019190915261014d606082015260216080820152600d60a08201526200042890603090600662000671565b506040805160c081018252610d05808252602082015261091d91810191909152610535606082015261014d6080820152602160a08201526200046f90603690600662000671565b506040805160c081018252610d05808252602082018190529181019190915261091d6060820152610535608082015261014d60a0820152620004b690603c90600662000671565b506040805160c081018252610d0580825260208201819052918101829052606081019190915261091d608082015261053560a0820152620004fc90604290600662000671565b506040805160c081018252610d058082526020820181905291810182905260608101829052608081019190915261091d60a08201526200054190604890600662000671565b506040805160c081018252610d0580825260208201819052918101829052606081018290526080810182905260a08101919091526200058590604e90600662000671565b506200076e565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620005f09062000731565b90600052602060002090601f0160209004810192826200061457600085556200065f565b82601f106200062f57805160ff19168380011785556200065f565b828001600101855582156200065f579182015b828111156200065f57825182559160200191906001019062000642565b506200066d9291506200071a565b5090565b82600681019282156200065f579160200282015b828111156200065f578251829061ffff1690559160200191906001019062000685565b82600681019282156200065f579160200282015b828111156200065f57825182906001600160401b0316905591602001919060010190620006bc565b82600681019282156200065f579160200282015b828111156200065f578251829060ff16905591602001919060010190620006f8565b5b808211156200066d57600081556001016200071b565b600181811c908216806200074657607f821691505b602082108114156200076857634e487b7160e01b600052602260045260246000fd5b50919050565b612bc3806200077e6000396000f3fe60806040526004361061020d5760003560e01c806301ffc9a71461021257806306fdde03146102475780630782eecc14610269578063081812fc1461028b578063095ea7b3146102c35780630caad391146102e35780631168386a146103115780631326434f14610331578063174da4a21461035157806318160ddd1461037157806323b872dd1461038757806328593984146103a75780632e1a7d4d146103bd5780632f96bd69146103dd5780633c1c9795146103f057806342842e0e1461043d57806346f89c451461045d5780634b47dc961461047057806355f804b314610490578063569202e0146104b05780636352211e146104d05780636830e894146104f05780636c7b69cb1461051057806370a0823114610530578063715018a614610550578063817a536b146105655780638da5cb5b146105855780638ee158531461059a57806395d89b41146105ba5780639669ae89146105cf5780639b19251a146105ef578063a22cb4651461061c578063b88d4fde1461063c578063b92907d01461065c578063c87b56dd1461067c578063cb4b202f1461069c578063d5abeb01146106bc578063d89678ad146106d2578063daf7d3a3146106f2578063dc30158b14610705578063e42da3b41461071b578063e985e9c51461073b578063ecaf90771461075b578063ef803cf21461077b578063f0fa78121461079b578063f2fde38b146107bb575b600080fd5b34801561021e57600080fd5b5061023261022d36600461244e565b6107db565b60405190151581526020015b60405180910390f35b34801561025357600080fd5b5061025c61082d565b60405161023e91906124c3565b34801561027557600080fd5b506102896102843660046124d6565b6108bf565b005b34801561029757600080fd5b506102ab6102a63660046124f8565b610907565b6040516001600160a01b03909116815260200161023e565b3480156102cf57600080fd5b506102896102de366004612526565b61098f565b3480156102ef57600080fd5b506103036102fe3660046124f8565b610aa0565b60405190815260200161023e565b34801561031d57600080fd5b5061030361032c3660046124f8565b610ab7565b34801561033d57600080fd5b5061028961034c366004612598565b610af9565b34801561035d57600080fd5b5061028961036c3660046124f8565b610b4e565b34801561037d57600080fd5b5061030360095481565b34801561039357600080fd5b506102896103a236600461261a565b610b82565b3480156103b357600080fd5b5061030360625481565b3480156103c957600080fd5b506102896103d83660046124f8565b610bb3565b6102896103eb3660046124d6565b610c77565b3480156103fc57600080fd5b5061041061040b3660046124f8565b610cdb565b604080519687526020870195909552938501929092526060840152608083015260a082015260c00161023e565b34801561044957600080fd5b5061028961045836600461261a565b610d21565b61028961046b3660046124d6565b610d3c565b34801561047c57600080fd5b5061030361048b3660046124f8565b610e7f565b34801561049c57600080fd5b506102896104ab3660046126b2565b610e8f565b3480156104bc57600080fd5b506103036104cb3660046124f8565b610ed1565b3480156104dc57600080fd5b506102ab6104eb3660046124f8565b610ee1565b3480156104fc57600080fd5b5061030361050b3660046124f8565b610f58565b34801561051c57600080fd5b5061028961052b3660046126fa565b610fe0565b34801561053c57600080fd5b5061030361054b36600461272a565b6111a3565b34801561055c57600080fd5b5061028961122a565b34801561057157600080fd5b506102896105803660046124d6565b611265565b34801561059157600080fd5b506102ab6112a2565b3480156105a657600080fd5b506102896105b53660046124d6565b6112b1565b3480156105c657600080fd5b5061025c6112fc565b3480156105db57600080fd5b506102896105ea3660046124d6565b61130b565b3480156105fb57600080fd5b5061030361060a36600461272a565b60546020526000908152604090205481565b34801561062857600080fd5b50610289610637366004612747565b611348565b34801561064857600080fd5b5061028961065736600461277a565b611353565b34801561066857600080fd5b506103036106773660046124f8565b611385565b34801561068857600080fd5b5061025c6106973660046124f8565b611395565b3480156106a857600080fd5b506102896106b73660046127f9565b61145f565b3480156106c857600080fd5b5061030360105481565b3480156106de57600080fd5b506103036106ed3660046124d6565b6114f0565b6102896107003660046124d6565b61151b565b34801561071157600080fd5b5061030360615481565b34801561072757600080fd5b506102896107363660046124f8565b6115c3565b34801561074757600080fd5b506102326107563660046128b0565b6115f7565b34801561076757600080fd5b506103036107763660046124f8565b611625565b34801561078757600080fd5b506103036107963660046124f8565b61171e565b3480156107a757600080fd5b506103036107b63660046124f8565b61172e565b3480156107c757600080fd5b506102896107d636600461272a565b61173e565b60006001600160e01b031982166380ac58cd60e01b148061080c57506001600160e01b03198216635b5e139f60e01b145b8061082757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461083c906128de565b80601f0160208091040260200160405190810160405280929190818152602001828054610868906128de565b80156108b55780601f1061088a576101008083540402835291602001916108b5565b820191906000526020600020905b81548152906001019060200180831161089857829003601f168201915b5050505050905090565b336108c86112a2565b6001600160a01b0316146108f75760405162461bcd60e51b81526004016108ee90612919565b60405180910390fd5b6059828155819060015b01555050565b6000610912826117de565b6109735760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108ee565b506000908152600460205260409020546001600160a01b031690565b600061099a82610ee1565b9050806001600160a01b0316836001600160a01b03161415610a085760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108ee565b336001600160a01b0382161480610a245750610a2481336115f7565b610a915760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016108ee565b610a9b83836117fb565b505050565b60558160028110610ab057600080fd5b0154905081565b600080610ac383611625565b60088481548110610ad657610ad661294e565b906000526020600020906006020160040154610af2919061297a565b9392505050565b33610b026112a2565b6001600160a01b031614610b285760405162461bcd60e51b81526004016108ee90612919565b81601882600a8110610b3c57610b3c61294e565b60060201906006610a9b929190612372565b33610b576112a2565b6001600160a01b031614610b7d5760405162461bcd60e51b81526004016108ee90612919565b606155565b610b8c3382611869565b610ba85760405162461bcd60e51b81526004016108ee90612992565b610a9b838383611933565b33610bbc6112a2565b6001600160a01b031614610be25760405162461bcd60e51b81526004016108ee90612919565b47811115610c465760405162461bcd60e51b815260206004820152602b60248201527f416d6f756e742073686f756c6420626520657175616c206f72206c6f7765722060448201526a37b3103130b630b731b29760a91b60648201526084016108ee565b604051339082156108fc029083906000818181858888f19350505050158015610c73573d6000803e3d6000fd5b5050565b6059544210801590610c8a5750605a5442105b610cd15760405162461bcd60e51b81526020600482015260186024820152775075626c69632073616c65206e6f7420737461727465642160401b60448201526064016108ee565b610c738282611ac1565b60088181548110610ceb57600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501549395509193909286565b610a9b83838360405180602001604052806000815250611353565b6055544210801590610d4f575060565442105b610d995760405162461bcd60e51b815260206004820152601b60248201527a57686974656c6973742073616c65206e6f7420737461727465642160281b60448201526064016108ee565b33600090815260546020526040902054610df15760405162461bcd60e51b81526020600482015260196024820152782cb7ba9030b932903737ba1037b7103bb434ba32b634b9ba1760391b60448201526064016108ee565b33600090815260546020526040902054811115610e505760405162461bcd60e51b815260206004820152601d60248201527f596f752063616e206e6f74206d696e74207468697320616d6f756e742e00000060448201526064016108ee565b3360009081526054602052604081208054839290610e6f9084906129e3565b90915550610c7390508282611ac1565b60118160068110610ab057600080fd5b33610e986112a2565b6001600160a01b031614610ebe5760405162461bcd60e51b81526004016108ee90612919565b8051610c739060079060208401906123b0565b600a8160068110610ab057600080fd5b6000818152600260205260408120546001600160a01b0316806108275760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108ee565b6000610f6382610ab7565b60088381548110610f7657610f7661294e565b9060005260206000209060060201600401819055504260088381548110610f9f57610f9f61294e565b90600052602060002090600602016003018190555060088281548110610fc757610fc761294e565b9060005260206000209060060201600401549050919050565b81610fea81610ee1565b6001600160a01b0316336001600160a01b0316146110545760405162461bcd60e51b815260206004820152602160248201527f4d75737420626520746865206f776e6572206f66207468652073796d62696f746044820152606560f81b60648201526084016108ee565b600061105f84610f58565b90508047116110c35760405162461bcd60e51b815260206004820152602a60248201527f42616c616e6365206f6620636f6e7472616374206e6f7420656e6f6768742c20604482015269747279206c617465722160b01b60648201526084016108ee565b801561119d576000600885815481106110de576110de61294e565b90600052602060002090600602016004018190555080600885815481106111075761110761294e565b90600052602060002090600602016005016000828254611127919061297a565b90915550506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611162573d6000803e3d6000fd5b5060408051858152602081018390527f8b0944629ca33aba8dd5f33f7f8220efe77a2d5548a1651362c856c5ea586a65910160405180910390a15b50505050565b60006001600160a01b03821661120e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108ee565b506001600160a01b031660009081526003602052604090205490565b336112336112a2565b6001600160a01b0316146112595760405162461bcd60e51b81526004016108ee90612919565b6112636000611ef8565b565b3361126e6112a2565b6001600160a01b0316146112945760405162461bcd60e51b81526004016108ee90612919565b605782815581906001610901565b6006546001600160a01b031690565b336112ba6112a2565b6001600160a01b0316146112e05760405162461bcd60e51b81526004016108ee90612919565b8081605b84600681106112f5576112f561294e565b0155505050565b60606001805461083c906128de565b336113146112a2565b6001600160a01b03161461133a5760405162461bcd60e51b81526004016108ee90612919565b605582815581906001610901565b610c73338383611f4a565b61135d3383611869565b6113795760405162461bcd60e51b81526004016108ee90612992565b61119d84848484612015565b605b8160068110610ab057600080fd5b60606113a0826117de565b6114045760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108ee565b600061140e612048565b9050600081511161142e5760405180602001604052806000815250610af2565b8061143884612057565b6040516020016114499291906129fa565b6040516020818303038152906040529392505050565b336114686112a2565b6001600160a01b03161461148e5760405162461bcd60e51b81526004016108ee90612919565b60005b8251811015610a9b5781605460008584815181106114b1576114b161294e565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806114e890612a29565b915050611491565b601882600a811061150057600080fd5b60060201816006811061151257600080fd5b01549150829050565b605754421080159061152e575060585442105b6115745760405162461bcd60e51b81526020600482015260176024820152764f776e65722073616c65206e6f7420737461727465642160481b60448201526064016108ee565b600061157f336111a3565b11610cd15760405162461bcd60e51b81526020600482015260146024820152732cb7ba9030b932903737ba10309037bbb732b91760611b60448201526064016108ee565b336115cc6112a2565b6001600160a01b0316146115f25760405162461bcd60e51b81526004016108ee90612919565b606255565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600080600080429050600091506000600886815481106116475761164761294e565b906000526020600020906006020160030154111561169657600885815481106116725761167261294e565b9060005260206000209060060201600301548161168f91906129e3565b91506116c9565b600885815481106116a9576116a961294e565b906000526020600020906006020160020154816116c691906129e3565b91505b63337f980082600887815481106116e2576116e261294e565b9060005260206000209060060201600101546062546117019190612a44565b61170b9190612a44565b6117159190612a79565b95945050505050565b60578160028110610ab057600080fd5b60598160028110610ab057600080fd5b336117476112a2565b6001600160a01b03161461176d5760405162461bcd60e51b81526004016108ee90612919565b6001600160a01b0381166117d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ee565b6117db81611ef8565b50565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061183082610ee1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611874826117de565b6118d55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108ee565b60006118e083610ee1565b9050806001600160a01b0316846001600160a01b0316148061191b5750836001600160a01b031661191084610907565b6001600160a01b0316145b8061192b575061192b81856115f7565b949350505050565b826001600160a01b031661194682610ee1565b6001600160a01b0316146119ae5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108ee565b6001600160a01b038216611a105760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108ee565b611a1b6000826117fb565b6001600160a01b0383166000908152600360205260408120805460019290611a449084906129e3565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a7290849061297a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020612b4e83398151915291a4505050565b806061541015611b105760405162461bcd60e51b815260206004820152601a6024820152794f766572206d6178696d756d206d696e7473207065722054582160301b60448201526064016108ee565b60068210611b535760405162461bcd60e51b815260206004820152601060248201526f54696572206e6f74206578697374732160801b60448201526064016108ee565b6000605b8360068110611b6857611b6861294e565b01549050611b768282612a44565b3414611bba5760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642076616c75652073656e742160681b60448201526064016108ee565b81600954611bc8919061297a565b6010541015611c185760405162461bcd60e51b815260206004820152601c60248201527b4e6f7420656e6f7567682073796d62696f2072656d61696e696e672160201b60448201526064016108ee565b81600a8460068110611c2c57611c2c61294e565b0154611c38919061297a565b60118460068110611c4b57611c4b61294e565b01541015611c9b5760405162461bcd60e51b81526020600482015260296024820152600080516020612b6e833981519152604482015268656d61696e696e672160b81b60648201526084016108ee565b81600a8460068110611caf57611caf61294e565b0154611cbb919061297a565b6018601754600a8110611cd057611cd061294e565b600602018460068110611ce557611ce561294e565b01541015611d435760405162461bcd60e51b81526020600482015260376024820152600080516020612b6e833981519152604482015276656d61696e696e6720696e20746869732070686173652160481b60648201526084016108ee565b60005b82811015611eb1576040805160c08101825285815260208101848152429282019283526000606083018181526080840182815260a0850183815260088054600180820183559190955295517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360069095029485015593517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee484015594517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee682015592517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee7840155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee890920191909155600954611e9f9133918491611e90919061297a565b611e9a919061297a565b612154565b80611ea981612a29565b915050611d46565b508160096000828254611ec4919061297a565b90915550829050600a8460068110611ede57611ede61294e565b016000828254611eee919061297a565b9091555050505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611fa85760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016108ee565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612020848484611933565b61202c84848484612274565b61119d5760405162461bcd60e51b81526004016108ee90612a8d565b60606007805461083c906128de565b60608161207b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120a5578061208f81612a29565b915061209e9050600a83612a79565b915061207f565b6000816001600160401b038111156120bf576120bf612552565b6040519080825280601f01601f1916602001820160405280156120e9576020820181803683370190505b5090505b841561192b576120fe6001836129e3565b915061210b600a86612adf565b61211690603061297a565b60f81b81838151811061212b5761212b61294e565b60200101906001600160f81b031916908160001a90535061214d600a86612a79565b94506120ed565b6001600160a01b0382166121aa5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108ee565b6121b3816117de565b156121ff5760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016108ee565b6001600160a01b038216600090815260036020526040812080546001929061222890849061297a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020612b4e833981519152908290a45050565b60006001600160a01b0384163b1561236757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122b8903390899088908890600401612af3565b6020604051808303816000875af19250505080156122f3575060408051601f3d908101601f191682019092526122f091810190612b30565b60015b61234d573d808015612321576040519150601f19603f3d011682016040523d82523d6000602084013e612326565b606091505b5080516123455760405162461bcd60e51b81526004016108ee90612a8d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061192b565b506001949350505050565b82600681019282156123a0579160200282015b828111156123a0578251825591602001919060010190612385565b506123ac929150612423565b5090565b8280546123bc906128de565b90600052602060002090601f0160209004810192826123de57600085556123a0565b82601f106123f757805160ff19168380011785556123a0565b828001600101855582156123a057918201828111156123a0578251825591602001919060010190612385565b5b808211156123ac5760008155600101612424565b6001600160e01b0319811681146117db57600080fd5b60006020828403121561246057600080fd5b8135610af281612438565b60005b8381101561248657818101518382015260200161246e565b8381111561119d5750506000910152565b600081518084526124af81602086016020860161246b565b601f01601f19169290920160200192915050565b602081526000610af26020830184612497565b600080604083850312156124e957600080fd5b50508035926020909101359150565b60006020828403121561250a57600080fd5b5035919050565b6001600160a01b03811681146117db57600080fd5b6000806040838503121561253957600080fd5b823561254481612511565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561259057612590612552565b604052919050565b60008060e083850312156125ab57600080fd5b83601f8401126125ba57600080fd5b60405160c081016001600160401b03811182821017156125dc576125dc612552565b6040528060c08501868111156125f157600080fd5b855b8181101561260b5780358352602092830192016125f3565b50919691359550909350505050565b60008060006060848603121561262f57600080fd5b833561263a81612511565b9250602084013561264a81612511565b929592945050506040919091013590565b60006001600160401b0383111561267457612674612552565b612687601f8401601f1916602001612568565b905082815283838301111561269b57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156126c457600080fd5b81356001600160401b038111156126da57600080fd5b8201601f810184136126eb57600080fd5b61192b8482356020840161265b565b6000806040838503121561270d57600080fd5b82359150602083013561271f81612511565b809150509250929050565b60006020828403121561273c57600080fd5b8135610af281612511565b6000806040838503121561275a57600080fd5b823561276581612511565b91506020830135801515811461271f57600080fd5b6000806000806080858703121561279057600080fd5b843561279b81612511565b935060208501356127ab81612511565b92506040850135915060608501356001600160401b038111156127cd57600080fd5b8501601f810187136127de57600080fd5b6127ed8782356020840161265b565b91505092959194509250565b6000806040838503121561280c57600080fd5b82356001600160401b038082111561282357600080fd5b818501915085601f83011261283757600080fd5b813560208282111561284b5761284b612552565b8160051b925061285c818401612568565b828152928401810192818101908985111561287657600080fd5b948201945b848610156128a0578535935061289084612511565b838252948201949082019061287b565b9997909101359750505050505050565b600080604083850312156128c357600080fd5b82356128ce81612511565b9150602083013561271f81612511565b600181811c908216806128f257607f821691505b6020821081141561291357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561298d5761298d612964565b500190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000828210156129f5576129f5612964565b500390565b60008351612a0c81846020880161246b565b835190830190612a2081836020880161246b565b01949350505050565b6000600019821415612a3d57612a3d612964565b5060010190565b6000816000190483118215151615612a5e57612a5e612964565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612a8857612a88612a63565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612aee57612aee612a63565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b2690830184612497565b9695505050505050565b600060208284031215612b4257600080fd5b8151610af28161243856feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef4e6f7420656e6f7567682073796d62696f206f66207468697320746965722072a264697066735822122014fad96f138df9b6cc3a41b28d362beca705a1bb86599762551dae54e5b3c25c64736f6c634300080b0033
Deployed Bytecode
0x60806040526004361061020d5760003560e01c806301ffc9a71461021257806306fdde03146102475780630782eecc14610269578063081812fc1461028b578063095ea7b3146102c35780630caad391146102e35780631168386a146103115780631326434f14610331578063174da4a21461035157806318160ddd1461037157806323b872dd1461038757806328593984146103a75780632e1a7d4d146103bd5780632f96bd69146103dd5780633c1c9795146103f057806342842e0e1461043d57806346f89c451461045d5780634b47dc961461047057806355f804b314610490578063569202e0146104b05780636352211e146104d05780636830e894146104f05780636c7b69cb1461051057806370a0823114610530578063715018a614610550578063817a536b146105655780638da5cb5b146105855780638ee158531461059a57806395d89b41146105ba5780639669ae89146105cf5780639b19251a146105ef578063a22cb4651461061c578063b88d4fde1461063c578063b92907d01461065c578063c87b56dd1461067c578063cb4b202f1461069c578063d5abeb01146106bc578063d89678ad146106d2578063daf7d3a3146106f2578063dc30158b14610705578063e42da3b41461071b578063e985e9c51461073b578063ecaf90771461075b578063ef803cf21461077b578063f0fa78121461079b578063f2fde38b146107bb575b600080fd5b34801561021e57600080fd5b5061023261022d36600461244e565b6107db565b60405190151581526020015b60405180910390f35b34801561025357600080fd5b5061025c61082d565b60405161023e91906124c3565b34801561027557600080fd5b506102896102843660046124d6565b6108bf565b005b34801561029757600080fd5b506102ab6102a63660046124f8565b610907565b6040516001600160a01b03909116815260200161023e565b3480156102cf57600080fd5b506102896102de366004612526565b61098f565b3480156102ef57600080fd5b506103036102fe3660046124f8565b610aa0565b60405190815260200161023e565b34801561031d57600080fd5b5061030361032c3660046124f8565b610ab7565b34801561033d57600080fd5b5061028961034c366004612598565b610af9565b34801561035d57600080fd5b5061028961036c3660046124f8565b610b4e565b34801561037d57600080fd5b5061030360095481565b34801561039357600080fd5b506102896103a236600461261a565b610b82565b3480156103b357600080fd5b5061030360625481565b3480156103c957600080fd5b506102896103d83660046124f8565b610bb3565b6102896103eb3660046124d6565b610c77565b3480156103fc57600080fd5b5061041061040b3660046124f8565b610cdb565b604080519687526020870195909552938501929092526060840152608083015260a082015260c00161023e565b34801561044957600080fd5b5061028961045836600461261a565b610d21565b61028961046b3660046124d6565b610d3c565b34801561047c57600080fd5b5061030361048b3660046124f8565b610e7f565b34801561049c57600080fd5b506102896104ab3660046126b2565b610e8f565b3480156104bc57600080fd5b506103036104cb3660046124f8565b610ed1565b3480156104dc57600080fd5b506102ab6104eb3660046124f8565b610ee1565b3480156104fc57600080fd5b5061030361050b3660046124f8565b610f58565b34801561051c57600080fd5b5061028961052b3660046126fa565b610fe0565b34801561053c57600080fd5b5061030361054b36600461272a565b6111a3565b34801561055c57600080fd5b5061028961122a565b34801561057157600080fd5b506102896105803660046124d6565b611265565b34801561059157600080fd5b506102ab6112a2565b3480156105a657600080fd5b506102896105b53660046124d6565b6112b1565b3480156105c657600080fd5b5061025c6112fc565b3480156105db57600080fd5b506102896105ea3660046124d6565b61130b565b3480156105fb57600080fd5b5061030361060a36600461272a565b60546020526000908152604090205481565b34801561062857600080fd5b50610289610637366004612747565b611348565b34801561064857600080fd5b5061028961065736600461277a565b611353565b34801561066857600080fd5b506103036106773660046124f8565b611385565b34801561068857600080fd5b5061025c6106973660046124f8565b611395565b3480156106a857600080fd5b506102896106b73660046127f9565b61145f565b3480156106c857600080fd5b5061030360105481565b3480156106de57600080fd5b506103036106ed3660046124d6565b6114f0565b6102896107003660046124d6565b61151b565b34801561071157600080fd5b5061030360615481565b34801561072757600080fd5b506102896107363660046124f8565b6115c3565b34801561074757600080fd5b506102326107563660046128b0565b6115f7565b34801561076757600080fd5b506103036107763660046124f8565b611625565b34801561078757600080fd5b506103036107963660046124f8565b61171e565b3480156107a757600080fd5b506103036107b63660046124f8565b61172e565b3480156107c757600080fd5b506102896107d636600461272a565b61173e565b60006001600160e01b031982166380ac58cd60e01b148061080c57506001600160e01b03198216635b5e139f60e01b145b8061082757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461083c906128de565b80601f0160208091040260200160405190810160405280929190818152602001828054610868906128de565b80156108b55780601f1061088a576101008083540402835291602001916108b5565b820191906000526020600020905b81548152906001019060200180831161089857829003601f168201915b5050505050905090565b336108c86112a2565b6001600160a01b0316146108f75760405162461bcd60e51b81526004016108ee90612919565b60405180910390fd5b6059828155819060015b01555050565b6000610912826117de565b6109735760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108ee565b506000908152600460205260409020546001600160a01b031690565b600061099a82610ee1565b9050806001600160a01b0316836001600160a01b03161415610a085760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108ee565b336001600160a01b0382161480610a245750610a2481336115f7565b610a915760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016108ee565b610a9b83836117fb565b505050565b60558160028110610ab057600080fd5b0154905081565b600080610ac383611625565b60088481548110610ad657610ad661294e565b906000526020600020906006020160040154610af2919061297a565b9392505050565b33610b026112a2565b6001600160a01b031614610b285760405162461bcd60e51b81526004016108ee90612919565b81601882600a8110610b3c57610b3c61294e565b60060201906006610a9b929190612372565b33610b576112a2565b6001600160a01b031614610b7d5760405162461bcd60e51b81526004016108ee90612919565b606155565b610b8c3382611869565b610ba85760405162461bcd60e51b81526004016108ee90612992565b610a9b838383611933565b33610bbc6112a2565b6001600160a01b031614610be25760405162461bcd60e51b81526004016108ee90612919565b47811115610c465760405162461bcd60e51b815260206004820152602b60248201527f416d6f756e742073686f756c6420626520657175616c206f72206c6f7765722060448201526a37b3103130b630b731b29760a91b60648201526084016108ee565b604051339082156108fc029083906000818181858888f19350505050158015610c73573d6000803e3d6000fd5b5050565b6059544210801590610c8a5750605a5442105b610cd15760405162461bcd60e51b81526020600482015260186024820152775075626c69632073616c65206e6f7420737461727465642160401b60448201526064016108ee565b610c738282611ac1565b60088181548110610ceb57600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501549395509193909286565b610a9b83838360405180602001604052806000815250611353565b6055544210801590610d4f575060565442105b610d995760405162461bcd60e51b815260206004820152601b60248201527a57686974656c6973742073616c65206e6f7420737461727465642160281b60448201526064016108ee565b33600090815260546020526040902054610df15760405162461bcd60e51b81526020600482015260196024820152782cb7ba9030b932903737ba1037b7103bb434ba32b634b9ba1760391b60448201526064016108ee565b33600090815260546020526040902054811115610e505760405162461bcd60e51b815260206004820152601d60248201527f596f752063616e206e6f74206d696e74207468697320616d6f756e742e00000060448201526064016108ee565b3360009081526054602052604081208054839290610e6f9084906129e3565b90915550610c7390508282611ac1565b60118160068110610ab057600080fd5b33610e986112a2565b6001600160a01b031614610ebe5760405162461bcd60e51b81526004016108ee90612919565b8051610c739060079060208401906123b0565b600a8160068110610ab057600080fd5b6000818152600260205260408120546001600160a01b0316806108275760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108ee565b6000610f6382610ab7565b60088381548110610f7657610f7661294e565b9060005260206000209060060201600401819055504260088381548110610f9f57610f9f61294e565b90600052602060002090600602016003018190555060088281548110610fc757610fc761294e565b9060005260206000209060060201600401549050919050565b81610fea81610ee1565b6001600160a01b0316336001600160a01b0316146110545760405162461bcd60e51b815260206004820152602160248201527f4d75737420626520746865206f776e6572206f66207468652073796d62696f746044820152606560f81b60648201526084016108ee565b600061105f84610f58565b90508047116110c35760405162461bcd60e51b815260206004820152602a60248201527f42616c616e6365206f6620636f6e7472616374206e6f7420656e6f6768742c20604482015269747279206c617465722160b01b60648201526084016108ee565b801561119d576000600885815481106110de576110de61294e565b90600052602060002090600602016004018190555080600885815481106111075761110761294e565b90600052602060002090600602016005016000828254611127919061297a565b90915550506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611162573d6000803e3d6000fd5b5060408051858152602081018390527f8b0944629ca33aba8dd5f33f7f8220efe77a2d5548a1651362c856c5ea586a65910160405180910390a15b50505050565b60006001600160a01b03821661120e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108ee565b506001600160a01b031660009081526003602052604090205490565b336112336112a2565b6001600160a01b0316146112595760405162461bcd60e51b81526004016108ee90612919565b6112636000611ef8565b565b3361126e6112a2565b6001600160a01b0316146112945760405162461bcd60e51b81526004016108ee90612919565b605782815581906001610901565b6006546001600160a01b031690565b336112ba6112a2565b6001600160a01b0316146112e05760405162461bcd60e51b81526004016108ee90612919565b8081605b84600681106112f5576112f561294e565b0155505050565b60606001805461083c906128de565b336113146112a2565b6001600160a01b03161461133a5760405162461bcd60e51b81526004016108ee90612919565b605582815581906001610901565b610c73338383611f4a565b61135d3383611869565b6113795760405162461bcd60e51b81526004016108ee90612992565b61119d84848484612015565b605b8160068110610ab057600080fd5b60606113a0826117de565b6114045760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108ee565b600061140e612048565b9050600081511161142e5760405180602001604052806000815250610af2565b8061143884612057565b6040516020016114499291906129fa565b6040516020818303038152906040529392505050565b336114686112a2565b6001600160a01b03161461148e5760405162461bcd60e51b81526004016108ee90612919565b60005b8251811015610a9b5781605460008584815181106114b1576114b161294e565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806114e890612a29565b915050611491565b601882600a811061150057600080fd5b60060201816006811061151257600080fd5b01549150829050565b605754421080159061152e575060585442105b6115745760405162461bcd60e51b81526020600482015260176024820152764f776e65722073616c65206e6f7420737461727465642160481b60448201526064016108ee565b600061157f336111a3565b11610cd15760405162461bcd60e51b81526020600482015260146024820152732cb7ba9030b932903737ba10309037bbb732b91760611b60448201526064016108ee565b336115cc6112a2565b6001600160a01b0316146115f25760405162461bcd60e51b81526004016108ee90612919565b606255565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600080600080429050600091506000600886815481106116475761164761294e565b906000526020600020906006020160030154111561169657600885815481106116725761167261294e565b9060005260206000209060060201600301548161168f91906129e3565b91506116c9565b600885815481106116a9576116a961294e565b906000526020600020906006020160020154816116c691906129e3565b91505b63337f980082600887815481106116e2576116e261294e565b9060005260206000209060060201600101546062546117019190612a44565b61170b9190612a44565b6117159190612a79565b95945050505050565b60578160028110610ab057600080fd5b60598160028110610ab057600080fd5b336117476112a2565b6001600160a01b03161461176d5760405162461bcd60e51b81526004016108ee90612919565b6001600160a01b0381166117d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ee565b6117db81611ef8565b50565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061183082610ee1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611874826117de565b6118d55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108ee565b60006118e083610ee1565b9050806001600160a01b0316846001600160a01b0316148061191b5750836001600160a01b031661191084610907565b6001600160a01b0316145b8061192b575061192b81856115f7565b949350505050565b826001600160a01b031661194682610ee1565b6001600160a01b0316146119ae5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108ee565b6001600160a01b038216611a105760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108ee565b611a1b6000826117fb565b6001600160a01b0383166000908152600360205260408120805460019290611a449084906129e3565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a7290849061297a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020612b4e83398151915291a4505050565b806061541015611b105760405162461bcd60e51b815260206004820152601a6024820152794f766572206d6178696d756d206d696e7473207065722054582160301b60448201526064016108ee565b60068210611b535760405162461bcd60e51b815260206004820152601060248201526f54696572206e6f74206578697374732160801b60448201526064016108ee565b6000605b8360068110611b6857611b6861294e565b01549050611b768282612a44565b3414611bba5760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642076616c75652073656e742160681b60448201526064016108ee565b81600954611bc8919061297a565b6010541015611c185760405162461bcd60e51b815260206004820152601c60248201527b4e6f7420656e6f7567682073796d62696f2072656d61696e696e672160201b60448201526064016108ee565b81600a8460068110611c2c57611c2c61294e565b0154611c38919061297a565b60118460068110611c4b57611c4b61294e565b01541015611c9b5760405162461bcd60e51b81526020600482015260296024820152600080516020612b6e833981519152604482015268656d61696e696e672160b81b60648201526084016108ee565b81600a8460068110611caf57611caf61294e565b0154611cbb919061297a565b6018601754600a8110611cd057611cd061294e565b600602018460068110611ce557611ce561294e565b01541015611d435760405162461bcd60e51b81526020600482015260376024820152600080516020612b6e833981519152604482015276656d61696e696e6720696e20746869732070686173652160481b60648201526084016108ee565b60005b82811015611eb1576040805160c08101825285815260208101848152429282019283526000606083018181526080840182815260a0850183815260088054600180820183559190955295517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360069095029485015593517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee484015594517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee682015592517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee7840155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee890920191909155600954611e9f9133918491611e90919061297a565b611e9a919061297a565b612154565b80611ea981612a29565b915050611d46565b508160096000828254611ec4919061297a565b90915550829050600a8460068110611ede57611ede61294e565b016000828254611eee919061297a565b9091555050505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611fa85760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016108ee565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612020848484611933565b61202c84848484612274565b61119d5760405162461bcd60e51b81526004016108ee90612a8d565b60606007805461083c906128de565b60608161207b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120a5578061208f81612a29565b915061209e9050600a83612a79565b915061207f565b6000816001600160401b038111156120bf576120bf612552565b6040519080825280601f01601f1916602001820160405280156120e9576020820181803683370190505b5090505b841561192b576120fe6001836129e3565b915061210b600a86612adf565b61211690603061297a565b60f81b81838151811061212b5761212b61294e565b60200101906001600160f81b031916908160001a90535061214d600a86612a79565b94506120ed565b6001600160a01b0382166121aa5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108ee565b6121b3816117de565b156121ff5760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016108ee565b6001600160a01b038216600090815260036020526040812080546001929061222890849061297a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020612b4e833981519152908290a45050565b60006001600160a01b0384163b1561236757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122b8903390899088908890600401612af3565b6020604051808303816000875af19250505080156122f3575060408051601f3d908101601f191682019092526122f091810190612b30565b60015b61234d573d808015612321576040519150601f19603f3d011682016040523d82523d6000602084013e612326565b606091505b5080516123455760405162461bcd60e51b81526004016108ee90612a8d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061192b565b506001949350505050565b82600681019282156123a0579160200282015b828111156123a0578251825591602001919060010190612385565b506123ac929150612423565b5090565b8280546123bc906128de565b90600052602060002090601f0160209004810192826123de57600085556123a0565b82601f106123f757805160ff19168380011785556123a0565b828001600101855582156123a057918201828111156123a0578251825591602001919060010190612385565b5b808211156123ac5760008155600101612424565b6001600160e01b0319811681146117db57600080fd5b60006020828403121561246057600080fd5b8135610af281612438565b60005b8381101561248657818101518382015260200161246e565b8381111561119d5750506000910152565b600081518084526124af81602086016020860161246b565b601f01601f19169290920160200192915050565b602081526000610af26020830184612497565b600080604083850312156124e957600080fd5b50508035926020909101359150565b60006020828403121561250a57600080fd5b5035919050565b6001600160a01b03811681146117db57600080fd5b6000806040838503121561253957600080fd5b823561254481612511565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561259057612590612552565b604052919050565b60008060e083850312156125ab57600080fd5b83601f8401126125ba57600080fd5b60405160c081016001600160401b03811182821017156125dc576125dc612552565b6040528060c08501868111156125f157600080fd5b855b8181101561260b5780358352602092830192016125f3565b50919691359550909350505050565b60008060006060848603121561262f57600080fd5b833561263a81612511565b9250602084013561264a81612511565b929592945050506040919091013590565b60006001600160401b0383111561267457612674612552565b612687601f8401601f1916602001612568565b905082815283838301111561269b57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156126c457600080fd5b81356001600160401b038111156126da57600080fd5b8201601f810184136126eb57600080fd5b61192b8482356020840161265b565b6000806040838503121561270d57600080fd5b82359150602083013561271f81612511565b809150509250929050565b60006020828403121561273c57600080fd5b8135610af281612511565b6000806040838503121561275a57600080fd5b823561276581612511565b91506020830135801515811461271f57600080fd5b6000806000806080858703121561279057600080fd5b843561279b81612511565b935060208501356127ab81612511565b92506040850135915060608501356001600160401b038111156127cd57600080fd5b8501601f810187136127de57600080fd5b6127ed8782356020840161265b565b91505092959194509250565b6000806040838503121561280c57600080fd5b82356001600160401b038082111561282357600080fd5b818501915085601f83011261283757600080fd5b813560208282111561284b5761284b612552565b8160051b925061285c818401612568565b828152928401810192818101908985111561287657600080fd5b948201945b848610156128a0578535935061289084612511565b838252948201949082019061287b565b9997909101359750505050505050565b600080604083850312156128c357600080fd5b82356128ce81612511565b9150602083013561271f81612511565b600181811c908216806128f257607f821691505b6020821081141561291357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561298d5761298d612964565b500190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000828210156129f5576129f5612964565b500390565b60008351612a0c81846020880161246b565b835190830190612a2081836020880161246b565b01949350505050565b6000600019821415612a3d57612a3d612964565b5060010190565b6000816000190483118215151615612a5e57612a5e612964565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612a8857612a88612a63565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612aee57612aee612a63565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b2690830184612497565b9695505050505050565b600060208284031215612b4257600080fd5b8151610af28161243856feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef4e6f7420656e6f7567682073796d62696f206f66207468697320746965722072a264697066735822122014fad96f138df9b6cc3a41b28d362beca705a1bb86599762551dae54e5b3c25c64736f6c634300080b0033
Deployed Bytecode Sourcemap
36250:8483:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21219:305;;;;;;;;;;-1:-1:-1;21219:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;21219:305:0;;;;;;;;22164:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39921:158::-;;;;;;;;;;-1:-1:-1;39921:158:0;;;;;:::i;:::-;;:::i;:::-;;23723:221;;;;;;;;;;-1:-1:-1;23723:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1945:32:1;;;1927:51;;1915:2;1900:18;23723:221:0;1781:203:1;23246:411:0;;;;;;;;;;-1:-1:-1;23246:411:0;;;;;:::i;:::-;;:::i;37153:35::-;;;;;;;;;;-1:-1:-1;37153:35:0;;;;;:::i;:::-;;:::i;:::-;;;2591:25:1;;;2579:2;2564:18;37153:35:0;2445:177:1;42802:273:0;;;;;;;;;;-1:-1:-1;42802:273:0;;;;;:::i;:::-;;:::i;41329:160::-;;;;;;;;;;-1:-1:-1;41329:160:0;;;;;:::i;:::-;;:::i;41495:94::-;;;;;;;;;;-1:-1:-1;41495:94:0;;;;;:::i;:::-;;:::i;36635:26::-;;;;;;;;;;;;;;;;24473:339;;;;;;;;;;-1:-1:-1;24473:339:0;;;;;:::i;:::-;;:::i;37573:26::-;;;;;;;;;;;;;;;;43804:194;;;;;;;;;;-1:-1:-1;43804:194:0;;;;;:::i;:::-;;:::i;38448:217::-;;;;;;:::i;:::-;;:::i;36582:27::-;;;;;;;;;;-1:-1:-1;36582:27:0;;;;;:::i;:::-;;:::i;:::-;;;;4609:25:1;;;4665:2;4650:18;;4643:34;;;;4693:18;;;4686:34;;;;4751:2;4736:18;;4729:34;4794:3;4779:19;;4772:35;4838:3;4823:19;;4816:35;4596:3;4581:19;36582:27:0;4322:535:1;24883:185:0;;;;;;;;;;-1:-1:-1;24883:185:0;;;;;:::i;:::-;;:::i;38955:421::-;;;;;;:::i;:::-;;:::i;36818:72::-;;;;;;;;;;-1:-1:-1;36818:72:0;;;;;:::i;:::-;;:::i;44114:94::-;;;;;;;;;;-1:-1:-1;44114:94:0;;;;;:::i;:::-;;:::i;36695:35::-;;;;;;;;;;-1:-1:-1;36695:35:0;;;;;:::i;:::-;;:::i;21858:239::-;;;;;;;;;;-1:-1:-1;21858:239:0;;;;;:::i;:::-;;:::i;42387:409::-;;;;;;;;;;-1:-1:-1;42387:409:0;;;;;:::i;:::-;;:::i;41679:702::-;;;;;;;;;;-1:-1:-1;41679:702:0;;;;;:::i;:::-;;:::i;21588:208::-;;;;;;;;;;-1:-1:-1;21588:208:0;;;;;:::i;:::-;;:::i;35368:103::-;;;;;;;;;;;;;:::i;39760:155::-;;;;;;;;;;-1:-1:-1;39760:155:0;;;;;:::i;:::-;;:::i;34717:87::-;;;;;;;;;;;;;:::i;41177:146::-;;;;;;;;;;-1:-1:-1;41177:146:0;;;;;:::i;:::-;;:::i;22333:104::-;;;;;;;;;;;;;:::i;39587:167::-;;;;;;;;;;-1:-1:-1;39587:167:0;;;;;:::i;:::-;;:::i;37079:41::-;;;;;;;;;;-1:-1:-1;37079:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;24016:155;;;;;;;;;;-1:-1:-1;24016:155:0;;;;;:::i;:::-;;:::i;25139:328::-;;;;;;;;;;-1:-1:-1;25139:328:0;;;;;:::i;:::-;;:::i;37362:106::-;;;;;;;;;;-1:-1:-1;37362:106:0;;;;;:::i;:::-;;:::i;22508:334::-;;;;;;;;;;-1:-1:-1;22508:334:0;;;;;:::i;:::-;;:::i;39382:199::-;;;;;;;;;;-1:-1:-1;39382:199:0;;;;;:::i;:::-;;:::i;36754:32::-;;;;;;;;;;;;;;;;36988:44;;;;;;;;;;-1:-1:-1;36988:44:0;;;;;:::i;:::-;;:::i;38671:278::-;;;;;;:::i;:::-;;:::i;37504:32::-;;;;;;;;;;;;;;;;41595:78;;;;;;;;;;-1:-1:-1;41595:78:0;;;;;:::i;:::-;;:::i;24242:164::-;;;;;;;;;;-1:-1:-1;24242:164:0;;;;;:::i;:::-;;:::i;43081:717::-;;;;;;;;;;-1:-1:-1;43081:717:0;;;;;:::i;:::-;;:::i;37223:31::-;;;;;;;;;;-1:-1:-1;37223:31:0;;;;;:::i;:::-;;:::i;37284:32::-;;;;;;;;;;-1:-1:-1;37284:32:0;;;;;:::i;:::-;;:::i;35626:201::-;;;;;;;;;;-1:-1:-1;35626:201:0;;;;;:::i;:::-;;:::i;21219:305::-;21321:4;-1:-1:-1;;;;;;21358:40:0;;-1:-1:-1;;;21358:40:0;;:105;;-1:-1:-1;;;;;;;21415:48:0;;-1:-1:-1;;;21415:48:0;21358:105;:158;;;-1:-1:-1;;;;;;;;;;19776:40:0;;;21480:36;21338:178;21219:305;-1:-1:-1;;21219:305:0:o;22164:100::-;22218:13;22251:5;22244:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22164:100;:::o;39921:158::-;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;;;;;;;;;40008:14:::1;:30:::0;;;40065:8;;40060:1:::1;40045:17;;:28:::0;-1:-1:-1;;39921:158:0:o;23723:221::-;23799:7;23827:16;23835:7;23827;:16::i;:::-;23819:73;;;;-1:-1:-1;;;23819:73:0;;10100:2:1;23819:73:0;;;10082:21:1;10139:2;10119:18;;;10112:30;10178:34;10158:18;;;10151:62;-1:-1:-1;;;10229:18:1;;;10222:42;10281:19;;23819:73:0;9898:408:1;23819:73:0;-1:-1:-1;23912:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23912:24:0;;23723:221::o;23246:411::-;23327:13;23343:23;23358:7;23343:14;:23::i;:::-;23327:39;;23391:5;-1:-1:-1;;;;;23385:11:0;:2;-1:-1:-1;;;;;23385:11:0;;;23377:57;;;;-1:-1:-1;;;23377:57:0;;10513:2:1;23377:57:0;;;10495:21:1;10552:2;10532:18;;;10525:30;10591:34;10571:18;;;10564:62;-1:-1:-1;;;10642:18:1;;;10635:31;10683:19;;23377:57:0;10311:397:1;23377:57:0;16550:10;-1:-1:-1;;;;;23469:21:0;;;;:62;;-1:-1:-1;23494:37:0;23511:5;16550:10;24242:164;:::i;23494:37::-;23447:168;;;;-1:-1:-1;;;23447:168:0;;10915:2:1;23447:168:0;;;10897:21:1;10954:2;10934:18;;;10927:30;10993:34;10973:18;;;10966:62;-1:-1:-1;;;11044:18:1;;;11037:54;11108:19;;23447:168:0;10713:420:1;23447:168:0;23628:21;23637:2;23641:7;23628:8;:21::i;:::-;23316:341;23246:411;;:::o;37153:35::-;;;;;;;;;;;;;;;-1:-1:-1;37153:35:0;:::o;42802:273::-;42874:7;42925:29;43003;43023:8;43003:19;:29::i;:::-;42957:9;42967:8;42957:19;;;;;;;;:::i;:::-;;;;;;;;;;;:43;;;:75;;;;:::i;:::-;42925:107;42802:273;-1:-1:-1;;;42802:273:0:o;41329:160::-;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;41470:13:::1;41437:22;41460:6;41437:30;;;;;;;:::i;:::-;;;;:46;;;;;;;:::i;41495:94::-:0;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;41561:13:::1;:22:::0;41495:94::o;24473:339::-;24668:41;16550:10;24701:7;24668:18;:41::i;:::-;24660:103;;;;-1:-1:-1;;;24660:103:0;;;;;;;:::i;:::-;24776:28;24786:4;24792:2;24796:7;24776:9;:28::i;43804:194::-;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;43880:21:::1;43870:6;:31;;43862:87;;;::::0;-1:-1:-1;;;43862:87:0;;12023:2:1;43862:87:0::1;::::0;::::1;12005:21:1::0;12062:2;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;-1:-1:-1;;;12152:18:1;;;12145:41;12203:19;;43862:87:0::1;11821:407:1::0;43862:87:0::1;43956:36;::::0;43964:10:::1;::::0;43956:36;::::1;;;::::0;43985:6;;43956:36:::1;::::0;;;43985:6;43964:10;43956:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;43804:194:::0;:::o;38448:217::-;38526:14;:17;38547:15;-1:-1:-1;38526:36:0;;;:75;;-1:-1:-1;38566:17:0;;38586:15;-1:-1:-1;38526:75:0;38518:112;;;;-1:-1:-1;;;38518:112:0;;12435:2:1;38518:112:0;;;12417:21:1;12474:2;12454:18;;;12447:30;-1:-1:-1;;;12493:18:1;;;12486:54;12557:18;;38518:112:0;12233:348:1;38518:112:0;38639:20;38644:5;38651:7;38639:4;:20::i;36582:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36582:27:0;;;;;:::o;24883:185::-;25021:39;25038:4;25044:2;25048:7;25021:39;;;;;;;;;;;;:16;:39::i;38955:421::-;39036:17;:20;39060:15;-1:-1:-1;39036:39:0;;;:81;;-1:-1:-1;39079:20:0;;39102:15;-1:-1:-1;39036:81:0;39028:121;;;;-1:-1:-1;;;39028:121:0;;12788:2:1;39028:121:0;;;12770:21:1;12827:2;12807:18;;;12800:30;-1:-1:-1;;;12846:18:1;;;12839:57;12913:18;;39028:121:0;12586:351:1;39028:121:0;39174:10;39188:1;39164:21;;;:9;:21;;;;;;39156:63;;;;-1:-1:-1;;;39156:63:0;;13144:2:1;39156:63:0;;;13126:21:1;13183:2;13163:18;;;13156:30;-1:-1:-1;;;13202:18:1;;;13195:55;13267:18;;39156:63:0;12942:349:1;39156:63:0;39244:10;39234:21;;;;:9;:21;;;;;;:32;-1:-1:-1;39234:32:0;39226:74;;;;-1:-1:-1;;;39226:74:0;;13498:2:1;39226:74:0;;;13480:21:1;13537:2;13517:18;;;13510:30;13576:31;13556:18;;;13549:59;13625:18;;39226:74:0;13296:353:1;39226:74:0;39319:10;39309:21;;;;:9;:21;;;;;:32;;39334:7;;39309:21;:32;;39334:7;;39309:32;:::i;:::-;;;;-1:-1:-1;39350:20:0;;-1:-1:-1;39355:5:0;39362:7;39350:4;:20::i;36818:72::-;;;;;;;;;;;44114:94;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;44180:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;36695:35::-:0;;;;;;;;;;;21858:239;21930:7;21966:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21966:16:0;22001:19;21993:73;;;;-1:-1:-1;;;21993:73:0;;13986:2:1;21993:73:0;;;13968:21:1;14025:2;14005:18;;;13998:30;14064:34;14044:18;;;14037:62;-1:-1:-1;;;14115:18:1;;;14108:39;14164:19;;21993:73:0;13784:405:1;42387:409:0;42463:7;42562:34;42587:8;42562:24;:34::i;:::-;42516:9;42526:8;42516:19;;;;;;;;:::i;:::-;;;;;;;;;;;:43;;:80;;;;42678:15;42637:9;42647:8;42637:19;;;;;;;;:::i;:::-;;;;;;;;;;;:38;;:56;;;;42747:9;42757:8;42747:19;;;;;;;;:::i;:::-;;;;;;;;;;;:43;;;42740:50;;42387:409;;;:::o;41679:702::-;41760:8;44401:20;44409:11;44401:7;:20::i;:::-;-1:-1:-1;;;;;44387:34:0;:10;-1:-1:-1;;;;;44387:34:0;;44379:80;;;;-1:-1:-1;;;44379:80:0;;14396:2:1;44379:80:0;;;14378:21:1;14435:2;14415:18;;;14408:30;14474:34;14454:18;;;14447:62;-1:-1:-1;;;14525:18:1;;;14518:31;14566:19;;44379:80:0;14194:397:1;44379:80:0;41806:32:::1;41841:43;41875:8;41841:33;:43::i;:::-;41806:78;;41925:24;41901:21;:48;41893:103;;;::::0;-1:-1:-1;;;41893:103:0;;14798:2:1;41893:103:0::1;::::0;::::1;14780:21:1::0;14837:2;14817:18;;;14810:30;14876:34;14856:18;;;14849:62;-1:-1:-1;;;14927:18:1;;;14920:40;14977:19;;41893:103:0::1;14596:406:1::0;41893:103:0::1;42008:28:::0;;42005:371:::1;;42132:1;42086:9;42096:8;42086:19;;;;;;;;:::i;:::-;;;;;;;;;;;:43;;:47;;;;42228:24;42183:9;42193:8;42183:19;;;;;;;;:::i;:::-;;;;;;;;;;;:41;;;:69;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42263:43:0::1;::::0;-1:-1:-1;;;;;42263:17:0;::::1;::::0;:43;::::1;;;::::0;42281:24;;42263:43:::1;::::0;;;42281:24;42263:17;:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;42320:48:0::1;::::0;;15181:25:1;;;15237:2;15222:18;;15215:34;;;42320:48:0::1;::::0;15154:18:1;42320:48:0::1;;;;;;;42005:371;41769:612;41679:702:::0;;;:::o;21588:208::-;21660:7;-1:-1:-1;;;;;21688:19:0;;21680:74;;;;-1:-1:-1;;;21680:74:0;;15462:2:1;21680:74:0;;;15444:21:1;15501:2;15481:18;;;15474:30;15540:34;15520:18;;;15513:62;-1:-1:-1;;;15591:18:1;;;15584:40;15641:19;;21680:74:0;15260:406:1;21680:74:0;-1:-1:-1;;;;;;21772:16:0;;;;;:9;:16;;;;;;;21588:208::o;35368:103::-;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;35433:30:::1;35460:1;35433:18;:30::i;:::-;35368:103::o:0;39760:155::-;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;39846:13:::1;:29:::0;;;39901:8;;39896:1:::1;39882:16;::::0;34717:87;34790:6;;-1:-1:-1;;;;;34790:6:0;;34717:87::o;41177:146::-;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;41271:6;41311::::2;41286:15;41302:5;41286:22;;;;;;;:::i;:::-;;:31:::0;-1:-1:-1;;;41177:146:0:o;22333:104::-;22389:13;22422:7;22415:14;;;;;:::i;39587:167::-;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;39677:17:::1;:33:::0;;;39740:8;;39735:1:::1;39717:20;::::0;24016:155;24111:52;16550:10;24144:8;24154;24111:18;:52::i;25139:328::-;25314:41;16550:10;25347:7;25314:18;:41::i;:::-;25306:103;;;;-1:-1:-1;;;25306:103:0;;;;;;;:::i;:::-;25420:39;25434:4;25440:2;25444:7;25453:5;25420:13;:39::i;37362:106::-;;;;;;;;;;;22508:334;22581:13;22615:16;22623:7;22615;:16::i;:::-;22607:76;;;;-1:-1:-1;;;22607:76:0;;16276:2:1;22607:76:0;;;16258:21:1;16315:2;16295:18;;;16288:30;16354:34;16334:18;;;16327:62;-1:-1:-1;;;16405:18:1;;;16398:45;16460:19;;22607:76:0;16074:411:1;22607:76:0;22696:21;22720:10;:8;:10::i;:::-;22696:34;;22772:1;22754:7;22748:21;:25;:86;;;;;;;;;;;;;;;;;22800:7;22809:18;:7;:16;:18::i;:::-;22783:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22741:93;22508:334;-1:-1:-1;;;22508:334:0:o;39382:199::-;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;39479:9:::1;39475:101;39498:10;:17;39494:1;:21;39475:101;;;39559:7;39532:9;:24;39542:10;39553:1;39542:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;39532:24:0::1;-1:-1:-1::0;;;;;39532:24:0::1;;;;;;;;;;;;:34;;;;39517:3;;;;;:::i;:::-;;;;39475:101;;36988:44:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36988:44:0;;-1:-1:-1;36988:44:0:o;38671:278::-;38748:13;:16;38768:15;-1:-1:-1;38748:35:0;;;:73;;-1:-1:-1;38787:16:0;;38806:15;-1:-1:-1;38748:73:0;38740:109;;;;-1:-1:-1;;;38740:109:0;;17307:2:1;38740:109:0;;;17289:21:1;17346:2;17326:18;;;17319:30;-1:-1:-1;;;17365:18:1;;;17358:53;17428:18;;38740:109:0;17105:347:1;38740:109:0;38888:1;38864:21;38874:10;38864:9;:21::i;:::-;:25;38856:58;;;;-1:-1:-1;;;38856:58:0;;17659:2:1;38856:58:0;;;17641:21:1;17698:2;17678:18;;;17671:30;-1:-1:-1;;;17717:18:1;;;17710:50;17777:18;;38856:58:0;17457:344:1;41595:78:0;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;41653:5:::1;:14:::0;41595:78::o;24242:164::-;-1:-1:-1;;;;;24363:25:0;;;24339:4;24363:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24242:164::o;43081:717::-;43148:7;43163:19;43189:28;43224:18;43264:15;43251:28;;43309:1;43286:24;;43401:1;43360:9;43370:8;43360:19;;;;;;;;:::i;:::-;;;;;;;;;;;:38;;;:42;43357:230;;;43448:9;43458:8;43448:19;;;;;;;;:::i;:::-;;;;;;;;;;;:38;;;43435:10;:51;;;;:::i;:::-;43412:74;;43357:230;;;43543:9;43553:8;43543:19;;;;;;;;:::i;:::-;;;;;;;;;;;:36;;;43530:10;:49;;;;:::i;:::-;43507:72;;43357:230;43677:9;43653:20;43618:9;43628:8;43618:19;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;43610:5;;:40;;;;:::i;:::-;:63;;;;:::i;:::-;43609:77;;;;:::i;:::-;43595:91;43781:11;-1:-1:-1;;;;;43081:717:0:o;37223:31::-;;;;;;;;;;;37284:32;;;;;;;;;;;35626:201;16550:10;34937:7;:5;:7::i;:::-;-1:-1:-1;;;;;34937:23:0;;34929:68;;;;-1:-1:-1;;;34929:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35715:22:0;::::1;35707:73;;;::::0;-1:-1:-1;;;35707:73:0;;18438:2:1;35707:73:0::1;::::0;::::1;18420:21:1::0;18477:2;18457:18;;;18450:30;18516:34;18496:18;;;18489:62;-1:-1:-1;;;18567:18:1;;;18560:36;18613:19;;35707:73:0::1;18236:402:1::0;35707:73:0::1;35791:28;35810:8;35791:18;:28::i;:::-;35626:201:::0;:::o;26977:127::-;27042:4;27066:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27066:16:0;:30;;;26977:127::o;30959:174::-;31034:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31034:29:0;-1:-1:-1;;;;;31034:29:0;;;;;;;;:24;;31088:23;31034:24;31088:14;:23::i;:::-;-1:-1:-1;;;;;31079:46:0;;;;;;;;;;;30959:174;;:::o;27271:348::-;27364:4;27389:16;27397:7;27389;:16::i;:::-;27381:73;;;;-1:-1:-1;;;27381:73:0;;18845:2:1;27381:73:0;;;18827:21:1;18884:2;18864:18;;;18857:30;18923:34;18903:18;;;18896:62;-1:-1:-1;;;18974:18:1;;;18967:42;19026:19;;27381:73:0;18643:408:1;27381:73:0;27465:13;27481:23;27496:7;27481:14;:23::i;:::-;27465:39;;27534:5;-1:-1:-1;;;;;27523:16:0;:7;-1:-1:-1;;;;;27523:16:0;;:51;;;;27567:7;-1:-1:-1;;;;;27543:31:0;:20;27555:7;27543:11;:20::i;:::-;-1:-1:-1;;;;;27543:31:0;;27523:51;:87;;;;27578:32;27595:5;27602:7;27578:16;:32::i;:::-;27515:96;27271:348;-1:-1:-1;;;;27271:348:0:o;30263:578::-;30422:4;-1:-1:-1;;;;;30395:31:0;:23;30410:7;30395:14;:23::i;:::-;-1:-1:-1;;;;;30395:31:0;;30387:85;;;;-1:-1:-1;;;30387:85:0;;19258:2:1;30387:85:0;;;19240:21:1;19297:2;19277:18;;;19270:30;19336:34;19316:18;;;19309:62;-1:-1:-1;;;19387:18:1;;;19380:39;19436:19;;30387:85:0;19056:405:1;30387:85:0;-1:-1:-1;;;;;30491:16:0;;30483:65;;;;-1:-1:-1;;;30483:65:0;;19668:2:1;30483:65:0;;;19650:21:1;19707:2;19687:18;;;19680:30;19746:34;19726:18;;;19719:62;-1:-1:-1;;;19797:18:1;;;19790:34;19841:19;;30483:65:0;19466:400:1;30483:65:0;30665:29;30682:1;30686:7;30665:8;:29::i;:::-;-1:-1:-1;;;;;30707:15:0;;;;;;:9;:15;;;;;:20;;30726:1;;30707:15;:20;;30726:1;;30707:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30738:13:0;;;;;;:9;:13;;;;;:18;;30755:1;;30738:13;:18;;30755:1;;30738:18;:::i;:::-;;;;-1:-1:-1;;30767:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30767:21:0;-1:-1:-1;;;;;30767:21:0;;;;;;;;;30806:27;;30767:16;;30806:27;;;;-1:-1:-1;;;;;;;;;;;30806:27:0;;30263:578;;;:::o;40085:1086::-;40169:7;40152:13;;:24;;40144:63;;;;-1:-1:-1;;;40144:63:0;;20073:2:1;40144:63:0;;;20055:21:1;20112:2;20092:18;;;20085:30;-1:-1:-1;;;20131:18:1;;;20124:56;20197:18;;40144:63:0;19871:350:1;40144:63:0;40230:22;40222:5;:30;40214:59;;;;-1:-1:-1;;;40214:59:0;;20428:2:1;40214:59:0;;;20410:21:1;20467:2;20447:18;;;20440:30;-1:-1:-1;;;20486:18:1;;;20479:46;20542:18;;40214:59:0;20226:340:1;40214:59:0;40282:18;40303:15;40319:5;40303:22;;;;;;;:::i;:::-;;;;-1:-1:-1;40355:20:0;40368:7;40303:22;40355:20;:::i;:::-;40342:9;:33;40334:65;;;;-1:-1:-1;;;40334:65:0;;20773:2:1;40334:65:0;;;20755:21:1;20812:2;20792:18;;;20785:30;-1:-1:-1;;;20831:18:1;;;20824:49;20890:18;;40334:65:0;20571:343:1;40334:65:0;40477:7;40463:11;;:21;;;;:::i;:::-;40416:9;;:69;;40408:123;;;;-1:-1:-1;;;40408:123:0;;21121:2:1;40408:123:0;;;21103:21:1;21160:2;21140:18;;;21133:30;-1:-1:-1;;;21179:18:1;;;21172:58;21247:18;;40408:123:0;20919:352:1;40408:123:0;40620:7;40593:17;40611:5;40593:24;;;;;;;:::i;:::-;;;:34;;;;:::i;:::-;40546:15;40562:5;40546:22;;;;;;;:::i;:::-;;;:82;;40538:136;;;;-1:-1:-1;;;40538:136:0;;21478:2:1;40538:136:0;;;21460:21:1;21517:2;21497:18;;;21490:30;-1:-1:-1;;;;;;;;;;;21536:18:1;;;21529:62;-1:-1:-1;;;21607:18:1;;;21600:39;21656:19;;40538:136:0;21276:405:1;40538:136:0;40763:7;40736:17;40754:5;40736:24;;;;;;;:::i;:::-;;;:34;;;;:::i;:::-;40689:22;40712:11;;40689:35;;;;;;;:::i;:::-;;;;40725:5;40689:42;;;;;;;:::i;:::-;;;:82;;40681:150;;;;-1:-1:-1;;;40681:150:0;;21888:2:1;40681:150:0;;;21870:21:1;21927:2;21907:18;;;21900:30;-1:-1:-1;;;;;;;;;;;21946:18:1;;;21939:62;-1:-1:-1;;;22017:18:1;;;22010:53;22080:19;;40681:150:0;21686:419:1;40681:150:0;40844:9;40840:218;40863:7;40859:1;:11;40840:218;;;40932:53;;;;;;;;;;;;;;;;;40960:15;40932:53;;;;;;-1:-1:-1;40932:53:0;;;;;;;;;;;;;;;;;;40917:9;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41030:11;;41012:38;;41018:10;;41048:1;;41030:15;;:11;:15;:::i;:::-;:19;;;;:::i;:::-;41012:5;:38::i;:::-;40872:3;;;;:::i;:::-;;;;40840:218;;;;41116:7;41088:11;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;41158:7:0;;-1:-1:-1;41130:17:0;41148:5;41130:24;;;;;;;:::i;:::-;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;40085:1086:0:o;35987:191::-;36080:6;;;-1:-1:-1;;;;;36097:17:0;;;-1:-1:-1;;;;;;36097:17:0;;;;;;;36130:40;;36080:6;;;36097:17;36080:6;;36130:40;;36061:16;;36130:40;36050:128;35987:191;:::o;31275:315::-;31430:8;-1:-1:-1;;;;;31421:17:0;:5;-1:-1:-1;;;;;31421:17:0;;;31413:55;;;;-1:-1:-1;;;31413:55:0;;22312:2:1;31413:55:0;;;22294:21:1;22351:2;22331:18;;;22324:30;-1:-1:-1;;;22370:18:1;;;22363:55;22435:18;;31413:55:0;22110:349:1;31413:55:0;-1:-1:-1;;;;;31479:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31479:46:0;;;;;;;;;;31541:41;;540::1;;;31541::0;;513:18:1;31541:41:0;;;;;;;31275:315;;;:::o;26349:::-;26506:28;26516:4;26522:2;26526:7;26506:9;:28::i;:::-;26553:48;26576:4;26582:2;26586:7;26595:5;26553:22;:48::i;:::-;26545:111;;;;-1:-1:-1;;;26545:111:0;;;;;;;:::i;44004:105::-;44064:13;44091;44084:20;;;;;:::i;17047:723::-;17103:13;17324:10;17320:53;;-1:-1:-1;;17351:10:0;;;;;;;;;;;;-1:-1:-1;;;17351:10:0;;;;;17047:723::o;17320:53::-;17398:5;17383:12;17439:78;17446:9;;17439:78;;17472:8;;;;:::i;:::-;;-1:-1:-1;17495:10:0;;-1:-1:-1;17503:2:0;17495:10;;:::i;:::-;;;17439:78;;;17527:19;17559:6;-1:-1:-1;;;;;17549:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17549:17:0;;17527:39;;17577:154;17584:10;;17577:154;;17611:11;17621:1;17611:11;;:::i;:::-;;-1:-1:-1;17680:10:0;17688:2;17680:5;:10;:::i;:::-;17667:24;;:2;:24;:::i;:::-;17654:39;;17637:6;17644;17637:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17637:56:0;;;;;;;;-1:-1:-1;17708:11:0;17717:2;17708:11;;:::i;:::-;;;17577:154;;28955:382;-1:-1:-1;;;;;29035:16:0;;29027:61;;;;-1:-1:-1;;;29027:61:0;;23202:2:1;29027:61:0;;;23184:21:1;;;23221:18;;;23214:30;23280:34;23260:18;;;23253:62;23332:18;;29027:61:0;23000:356:1;29027:61:0;29108:16;29116:7;29108;:16::i;:::-;29107:17;29099:58;;;;-1:-1:-1;;;29099:58:0;;23563:2:1;29099:58:0;;;23545:21:1;23602:2;23582:18;;;23575:30;-1:-1:-1;;;23621:18:1;;;23614:58;23689:18;;29099:58:0;23361:352:1;29099:58:0;-1:-1:-1;;;;;29228:13:0;;;;;;:9;:13;;;;;:18;;29245:1;;29228:13;:18;;29245:1;;29228:18;:::i;:::-;;;;-1:-1:-1;;29257:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29257:21:0;-1:-1:-1;;;;;29257:21:0;;;;;;;;29296:33;;29257:16;;;-1:-1:-1;;;;;;;;;;;29296:33:0;29257:16;;29296:33;28955:382;;:::o;32155:799::-;32310:4;-1:-1:-1;;;;;32331:13:0;;8785:20;8833:8;32327:620;;32367:72;;-1:-1:-1;;;32367:72:0;;-1:-1:-1;;;;;32367:36:0;;;;;:72;;16550:10;;32418:4;;32424:7;;32433:5;;32367:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32367:72:0;;;;;;;;-1:-1:-1;;32367:72:0;;;;;;;;;;;;:::i;:::-;;;32363:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32609:13:0;;32605:272;;32652:60;;-1:-1:-1;;;32652:60:0;;;;;;;:::i;32605:272::-;32827:6;32821:13;32812:6;32808:2;32804:15;32797:38;32363:529;-1:-1:-1;;;;;;32490:51:0;-1:-1:-1;;;32490:51:0;;-1:-1:-1;32483:58:0;;32327:620;-1:-1:-1;32931:4:0;32155:799;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:248::-;1411:6;1419;1472:2;1460:9;1451:7;1447:23;1443:32;1440:52;;;1488:1;1485;1478:12;1440:52;-1:-1:-1;;1511:23:1;;;1581:2;1566:18;;;1553:32;;-1:-1:-1;1343:248:1:o;1596:180::-;1655:6;1708:2;1696:9;1687:7;1683:23;1679:32;1676:52;;;1724:1;1721;1714:12;1676:52;-1:-1:-1;1747:23:1;;1596:180;-1:-1:-1;1596:180:1:o;1989:131::-;-1:-1:-1;;;;;2064:31:1;;2054:42;;2044:70;;2110:1;2107;2100:12;2125:315;2193:6;2201;2254:2;2242:9;2233:7;2229:23;2225:32;2222:52;;;2270:1;2267;2260:12;2222:52;2309:9;2296:23;2328:31;2353:5;2328:31;:::i;:::-;2378:5;2430:2;2415:18;;;;2402:32;;-1:-1:-1;;;2125:315:1:o;2627:127::-;2688:10;2683:3;2679:20;2676:1;2669:31;2719:4;2716:1;2709:15;2743:4;2740:1;2733:15;2759:275;2830:2;2824:9;2895:2;2876:13;;-1:-1:-1;;2872:27:1;2860:40;;-1:-1:-1;;;;;2915:34:1;;2951:22;;;2912:62;2909:88;;;2977:18;;:::i;:::-;3013:2;3006:22;2759:275;;-1:-1:-1;2759:275:1:o;3039:817::-;3130:6;3138;3191:3;3179:9;3170:7;3166:23;3162:33;3159:53;;;3208:1;3205;3198:12;3159:53;3257:7;3250:4;3239:9;3235:20;3231:34;3221:62;;3279:1;3276;3269:12;3221:62;3312:2;3306:9;3354:3;3342:16;;-1:-1:-1;;;;;3373:34:1;;3409:22;;;3370:62;3367:88;;;3435:18;;:::i;:::-;3471:2;3464:22;3506:6;3550:3;3535:19;;3566;;;3563:39;;;3598:1;3595;3588:12;3563:39;3622:9;3640:146;3656:6;3651:3;3648:15;3640:146;;;3724:17;;3712:30;;3771:4;3762:14;;;;3673;3640:146;;;-1:-1:-1;3805:6:1;;3830:20;;;-1:-1:-1;3039:817:1;;-1:-1:-1;;;;3039:817:1:o;3861:456::-;3938:6;3946;3954;4007:2;3995:9;3986:7;3982:23;3978:32;3975:52;;;4023:1;4020;4013:12;3975:52;4062:9;4049:23;4081:31;4106:5;4081:31;:::i;:::-;4131:5;-1:-1:-1;4188:2:1;4173:18;;4160:32;4201:33;4160:32;4201:33;:::i;:::-;3861:456;;4253:7;;-1:-1:-1;;;4307:2:1;4292:18;;;;4279:32;;3861:456::o;4862:407::-;4927:5;-1:-1:-1;;;;;4950:30:1;;4947:56;;;4983:18;;:::i;:::-;5021:57;5066:2;5045:15;;-1:-1:-1;;5041:29:1;5072:4;5037:40;5021:57;:::i;:::-;5012:66;;5101:6;5094:5;5087:21;5141:3;5132:6;5127:3;5123:16;5120:25;5117:45;;;5158:1;5155;5148:12;5117:45;5207:6;5202:3;5195:4;5188:5;5184:16;5171:43;5261:1;5254:4;5245:6;5238:5;5234:18;5230:29;5223:40;4862:407;;;;;:::o;5274:451::-;5343:6;5396:2;5384:9;5375:7;5371:23;5367:32;5364:52;;;5412:1;5409;5402:12;5364:52;5439:23;;-1:-1:-1;;;;;5474:30:1;;5471:50;;;5517:1;5514;5507:12;5471:50;5540:22;;5593:4;5585:13;;5581:27;-1:-1:-1;5571:55:1;;5622:1;5619;5612:12;5571:55;5645:74;5711:7;5706:2;5693:16;5688:2;5684;5680:11;5645:74;:::i;5730:323::-;5806:6;5814;5867:2;5855:9;5846:7;5842:23;5838:32;5835:52;;;5883:1;5880;5873:12;5835:52;5919:9;5906:23;5896:33;;5979:2;5968:9;5964:18;5951:32;5992:31;6017:5;5992:31;:::i;:::-;6042:5;6032:15;;;5730:323;;;;;:::o;6058:247::-;6117:6;6170:2;6158:9;6149:7;6145:23;6141:32;6138:52;;;6186:1;6183;6176:12;6138:52;6225:9;6212:23;6244:31;6269:5;6244:31;:::i;6310:416::-;6375:6;6383;6436:2;6424:9;6415:7;6411:23;6407:32;6404:52;;;6452:1;6449;6442:12;6404:52;6491:9;6478:23;6510:31;6535:5;6510:31;:::i;:::-;6560:5;-1:-1:-1;6617:2:1;6602:18;;6589:32;6659:15;;6652:23;6640:36;;6630:64;;6690:1;6687;6680:12;6731:795;6826:6;6834;6842;6850;6903:3;6891:9;6882:7;6878:23;6874:33;6871:53;;;6920:1;6917;6910:12;6871:53;6959:9;6946:23;6978:31;7003:5;6978:31;:::i;:::-;7028:5;-1:-1:-1;7085:2:1;7070:18;;7057:32;7098:33;7057:32;7098:33;:::i;:::-;7150:7;-1:-1:-1;7204:2:1;7189:18;;7176:32;;-1:-1:-1;7259:2:1;7244:18;;7231:32;-1:-1:-1;;;;;7275:30:1;;7272:50;;;7318:1;7315;7308:12;7272:50;7341:22;;7394:4;7386:13;;7382:27;-1:-1:-1;7372:55:1;;7423:1;7420;7413:12;7372:55;7446:74;7512:7;7507:2;7494:16;7489:2;7485;7481:11;7446:74;:::i;:::-;7436:84;;;6731:795;;;;;;;:::o;7531:1091::-;7624:6;7632;7685:2;7673:9;7664:7;7660:23;7656:32;7653:52;;;7701:1;7698;7691:12;7653:52;7728:23;;-1:-1:-1;;;;;7800:14:1;;;7797:34;;;7827:1;7824;7817:12;7797:34;7865:6;7854:9;7850:22;7840:32;;7910:7;7903:4;7899:2;7895:13;7891:27;7881:55;;7932:1;7929;7922:12;7881:55;7968:2;7955:16;7990:4;8013:2;8009;8006:10;8003:36;;;8019:18;;:::i;:::-;8065:2;8062:1;8058:10;8048:20;;8088:28;8112:2;8108;8104:11;8088:28;:::i;:::-;8150:15;;;8220:11;;;8216:20;;;8181:12;;;;8248:19;;;8245:39;;;8280:1;8277;8270:12;8245:39;8304:11;;;;8324:217;8340:6;8335:3;8332:15;8324:217;;;8420:3;8407:17;8394:30;;8437:31;8462:5;8437:31;:::i;:::-;8481:18;;;8357:12;;;;8519;;;;8324:217;;;8560:5;8597:18;;;;8584:32;;-1:-1:-1;;;;;;;7531:1091:1:o;8627:388::-;8695:6;8703;8756:2;8744:9;8735:7;8731:23;8727:32;8724:52;;;8772:1;8769;8762:12;8724:52;8811:9;8798:23;8830:31;8855:5;8830:31;:::i;:::-;8880:5;-1:-1:-1;8937:2:1;8922:18;;8909:32;8950:33;8909:32;8950:33;:::i;9020:380::-;9099:1;9095:12;;;;9142;;;9163:61;;9217:4;9209:6;9205:17;9195:27;;9163:61;9270:2;9262:6;9259:14;9239:18;9236:38;9233:161;;;9316:10;9311:3;9307:20;9304:1;9297:31;9351:4;9348:1;9341:15;9379:4;9376:1;9369:15;9233:161;;9020:380;;;:::o;9405:356::-;9607:2;9589:21;;;9626:18;;;9619:30;9685:34;9680:2;9665:18;;9658:62;9752:2;9737:18;;9405:356::o;9766:127::-;9827:10;9822:3;9818:20;9815:1;9808:31;9858:4;9855:1;9848:15;9882:4;9879:1;9872:15;11138:127;11199:10;11194:3;11190:20;11187:1;11180:31;11230:4;11227:1;11220:15;11254:4;11251:1;11244:15;11270:128;11310:3;11341:1;11337:6;11334:1;11331:13;11328:39;;;11347:18;;:::i;:::-;-1:-1:-1;11383:9:1;;11270:128::o;11403:413::-;11605:2;11587:21;;;11644:2;11624:18;;;11617:30;11683:34;11678:2;11663:18;;11656:62;-1:-1:-1;;;11749:2:1;11734:18;;11727:47;11806:3;11791:19;;11403:413::o;13654:125::-;13694:4;13722:1;13719;13716:8;13713:34;;;13727:18;;:::i;:::-;-1:-1:-1;13764:9:1;;13654:125::o;16490:470::-;16669:3;16707:6;16701:13;16723:53;16769:6;16764:3;16757:4;16749:6;16745:17;16723:53;:::i;:::-;16839:13;;16798:16;;;;16861:57;16839:13;16798:16;16895:4;16883:17;;16861:57;:::i;:::-;16934:20;;16490:470;-1:-1:-1;;;;16490:470:1:o;16965:135::-;17004:3;-1:-1:-1;;17025:17:1;;17022:43;;;17045:18;;:::i;:::-;-1:-1:-1;17092:1:1;17081:13;;16965:135::o;17806:168::-;17846:7;17912:1;17908;17904:6;17900:14;17897:1;17894:21;17889:1;17882:9;17875:17;17871:45;17868:71;;;17919:18;;:::i;:::-;-1:-1:-1;17959:9:1;;17806:168::o;17979:127::-;18040:10;18035:3;18031:20;18028:1;18021:31;18071:4;18068:1;18061:15;18095:4;18092:1;18085:15;18111:120;18151:1;18177;18167:35;;18182:18;;:::i;:::-;-1:-1:-1;18216:9:1;;18111:120::o;22464:414::-;22666:2;22648:21;;;22705:2;22685:18;;;22678:30;22744:34;22739:2;22724:18;;22717:62;-1:-1:-1;;;22810:2:1;22795:18;;22788:48;22868:3;22853:19;;22464:414::o;22883:112::-;22915:1;22941;22931:35;;22946:18;;:::i;:::-;-1:-1:-1;22980:9:1;;22883:112::o;23718:489::-;-1:-1:-1;;;;;23987:15:1;;;23969:34;;24039:15;;24034:2;24019:18;;24012:43;24086:2;24071:18;;24064:34;;;24134:3;24129:2;24114:18;;24107:31;;;23912:4;;24155:46;;24181:19;;24173:6;24155:46;:::i;:::-;24147:54;23718:489;-1:-1:-1;;;;;;23718:489:1:o;24212:249::-;24281:6;24334:2;24322:9;24313:7;24309:23;24305:32;24302:52;;;24350:1;24347;24340:12;24302:52;24382:9;24376:16;24401:30;24425:5;24401:30;:::i
Swarm Source
ipfs://14fad96f138df9b6cc3a41b28d362beca705a1bb86599762551dae54e5b3c25c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,307.19 | 0.15 | $496.08 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.