Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
252 BabyBunnyClub
Holders
74
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 BabyBunnyClubLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
BabyBunnyClub
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-06 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; /** * @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); } } } } /** * @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; } } /** * @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); } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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); } /** * @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; } } /** * @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; } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @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); } /** * @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); } /** * @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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public 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 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 {} } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } contract BabyBunnyClub is ERC721Enumerable, Ownable { using Strings for uint256; uint256 public constant PizzapNFT_GIFT = 120; uint256 public constant PizzapNFT_PRIVATE = 180; uint256 public constant PizzapNFT_PUBLIC = 9700; uint256 public constant PizzapNFT_MAX = PizzapNFT_GIFT + PizzapNFT_PRIVATE + PizzapNFT_PUBLIC; uint256 public constant PizzapNFT_PRICE = 0.05 ether; uint256 public constant PizzapNFT_PER_MINT = 5; mapping(address => bool) public presalerList; mapping(address => uint256) public presalerListAmount; mapping(address => bool) public presalerListMinted; mapping(string => bool) private _usedNonces; string private _contractURI; string private _tokenBaseURI = "https://ipfs.io/ipfs/QmRuWpVhPzaj2X8ZY4EoNXV1S4n6bPfpmapK1mT1CodoAN/"; uint256 public giftedAmount; uint256 public publicAmountMinted; uint256 public privateAmountMinted; uint256 public privateAmountSet; uint256 public presalePurchaseLimit = 10; bool public presaleLive; bool public saleLive; bool public locked; constructor() ERC721("BabyBunnyClub", "BabyBunnyClub") { } modifier notLocked { require(!locked, "Contract metadata methods are locked"); _; } function addToPresaleList(address[] calldata entries, uint256[] calldata amounts) external onlyOwner { require((entries.length == amounts.length) && (entries.length > 0), "INPUT_ERROR"); uint256 total_amounts = 0; for (uint256 i = 0; i < amounts.length; i++) { total_amounts += amounts[i]; } require(privateAmountSet + total_amounts <= PizzapNFT_PRIVATE, "EXCEED_PRIVATE"); for(uint256 i = 0; i < entries.length; i++) { address entry = entries[i]; uint256 amount = amounts[i]; require(entry != address(0), "NULL_ADDRESS"); require(amount > 0 , "ZERO_VALUE"); require(amount <= presalePurchaseLimit , "EXCEED_PRESALE"); require(!presalerList[entry], "DUPLICATE_ENTRY"); presalerList[entry] = true; presalerListAmount[entry] = amount; } privateAmountSet += total_amounts; } function removeFromPresaleList(address[] calldata entries) external onlyOwner { for(uint256 i = 0; i < entries.length; i++) { address entry = entries[i]; require(entry != address(0), "NULL_ADDRESS"); require(presalerList[entry] == true, "INPUT_ERROR"); presalerList[entry] = false; privateAmountSet -= presalerListAmount[entry]; presalerListAmount[entry] = 0; } } function hashTransaction(address sender, uint256 qty, string memory nonce) private pure returns(bytes32) { bytes32 hash = keccak256(abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(sender, qty, nonce))) ); return hash; } function buy(bytes32 hash, string memory nonce, uint256 tokenQuantity) external payable { require(saleLive, "SALE_CLOSED"); require(!presaleLive, "ONLY_PRESALE"); require(!_usedNonces[nonce], "HASH_USED"); require(hashTransaction(msg.sender, tokenQuantity, nonce) == hash, "HASH_FAIL"); require(totalSupply() < PizzapNFT_MAX, "OUT_OF_STOCK"); require(publicAmountMinted + tokenQuantity <= PizzapNFT_PUBLIC, "EXCEED_PUBLIC"); require(tokenQuantity <= PizzapNFT_PER_MINT, "EXCEED_PizzapNFT_PER_MINT"); require(PizzapNFT_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH"); for(uint256 i = 0; i < tokenQuantity; i++) { publicAmountMinted++; _safeMint(msg.sender, totalSupply() + 1); } _usedNonces[nonce] = true; } function presaleBuy() external { require(!saleLive && presaleLive, "PRESALE_CLOSED"); require(presalerList[msg.sender], "NOT_QUALIFIED"); require(!presalerListMinted[msg.sender], "ALREADY_MINTED"); require(totalSupply() < PizzapNFT_MAX, "OUT_OF_STOCK"); uint256 tokenQuantity = presalerListAmount[msg.sender]; for (uint256 i = 0; i < tokenQuantity; i++) { privateAmountMinted++; _safeMint(msg.sender, totalSupply() + 1); } presalerListMinted[msg.sender] = true; } function gift(address[] calldata receivers, uint256[] calldata quantities) external onlyOwner { require(receivers.length == quantities.length,"GIFT_INPUT_ERR"); uint256 total_quantities = 0; for (uint256 i = 0; i < quantities.length; i++) { total_quantities += quantities[i]; } require(totalSupply() + total_quantities <= PizzapNFT_MAX, "MAX_MINT"); require(giftedAmount + total_quantities <= PizzapNFT_GIFT, "GIFTS_EMPTY"); for (uint256 i = 0; i < receivers.length; i++) { require(quantities[i] > 0 , "ZERO_VALUE"); for (uint256 j = 0; j < quantities[i]; j++) { giftedAmount++; _safeMint(receivers[i], totalSupply() + 1); } } } function withdraw() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } // Owner functions for enabling presale, sale, revealing and setting the provenance hash function lockMetadata() external onlyOwner { locked = true; } function togglePresaleStatus() external onlyOwner { presaleLive = !presaleLive; } function toggleSaleStatus() external onlyOwner { saleLive = !saleLive; } function setContractURI(string calldata URI) external onlyOwner notLocked { _contractURI = URI; } function setBaseURI(string calldata URI) external onlyOwner notLocked { _tokenBaseURI = URI; } function contractURI() public view returns (string memory) { return _contractURI; } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), "Cannot query non-existent token"); return string(abi.encodePacked(_tokenBaseURI, tokenId.toString())); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PizzapNFT_GIFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PizzapNFT_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PizzapNFT_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PizzapNFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PizzapNFT_PRIVATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PizzapNFT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"addToPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"giftedAmount","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":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"presaleBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePurchaseLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerListAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerListMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateAmountSet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61010060405260446080818152906200327d60a03980516200002a9160109160209091019062000115565b50600a6015553480156200003d57600080fd5b50604080518082018252600d8082526c2130b13ca13ab7373ca1b63ab160991b602080840182815285518087019096529285528401528151919291620000869160009162000115565b5080516200009c90600190602084019062000115565b505050620000b9620000b3620000bf60201b60201c565b620000c3565b620001f8565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012390620001bb565b90600052602060002090601f01602090048101928262000147576000855562000192565b82601f106200016257805160ff191683800117855562000192565b8280016001018555821562000192579182015b828111156200019257825182559160200191906001019062000175565b50620001a0929150620001a4565b5090565b5b80821115620001a05760008155600101620001a5565b600181811c90821680620001d057607f821691505b60208210811415620001f257634e487b7160e01b600052602260045260246000fd5b50919050565b61307580620002086000396000f3fe6080604052600436106102935760003560e01c806383a9e0491161015a578063b88d4fde116100c1578063e50981971161007a578063e509819714610784578063e8a3d48514610799578063e985e9c5146107ae578063f2fde38b146107f7578063f474307014610817578063fb4a6b731461082d57600080fd5b8063b88d4fde146106dd578063c87b56dd146106fd578063ceb72f071461071d578063cf30901214610732578063db41e8b314610752578063e081b7811461076557600080fd5b80639cf2e8d6116101135780639cf2e8d614610627578063a22cb46514610657578063a6b82e5614610677578063ae21ec721461068d578063b179e060146106a8578063b5ba705d146106c857600080fd5b806383a9e0491461058f5780638da5cb5b146105a9578063938e3d7b146105c7578063940f1ada146105e757806395d89b41146105fd578063989bdbb61461061257600080fd5b80633ccfd60b116101fe5780635e391090116101b75780635e391090146104e55780636352211e1461050557806370a0823114610525578063715018a6146105455780637705f9b51461055a5780637bffb4ce1461057a57600080fd5b80633ccfd60b1461044557806342842e0e1461045a5780634e2f38be1461047a5780634f6ccce71461048f57806355f804b3146104af57806359a12ad5146104cf57600080fd5b806318160ddd1161025057806318160ddd1461038e5780631b57190e146103ad57806323b872dd146103c35780632712d40b146103e35780632f745c59146103f85780633c997c1f1461041857600080fd5b806301ffc9a71461029857806302568b72146102cd578063049c5c49146102fd57806306fdde0314610314578063081812fc14610336578063095ea7b31461036e575b600080fd5b3480156102a457600080fd5b506102b86102b33660046127fb565b610843565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102b86102e836600461283b565b600d6020526000908152604090205460ff1681565b34801561030957600080fd5b5061031261086e565b005b34801561032057600080fd5b506103296108be565b6040516102c491906128ae565b34801561034257600080fd5b506103566103513660046128c1565b610950565b6040516001600160a01b0390911681526020016102c4565b34801561037a57600080fd5b506103126103893660046128da565b6109e5565b34801561039a57600080fd5b506008545b6040519081526020016102c4565b3480156103b957600080fd5b5061039f60115481565b3480156103cf57600080fd5b506103126103de366004612904565b610afb565b3480156103ef57600080fd5b50610312610b2c565b34801561040457600080fd5b5061039f6104133660046128da565b610cf7565b34801561042457600080fd5b5061039f61043336600461283b565b600c6020526000908152604090205481565b34801561045157600080fd5b50610312610d8d565b34801561046657600080fd5b50610312610475366004612904565b610de6565b34801561048657600080fd5b5061039f60b481565b34801561049b57600080fd5b5061039f6104aa3660046128c1565b610e01565b3480156104bb57600080fd5b506103126104ca366004612940565b610e94565b3480156104db57600080fd5b5061039f60135481565b3480156104f157600080fd5b506103126105003660046129fe565b610ef3565b34801561051157600080fd5b506103566105203660046128c1565b6111ce565b34801561053157600080fd5b5061039f61054036600461283b565b611245565b34801561055157600080fd5b506103126112cc565b34801561056657600080fd5b506103126105753660046129fe565b611302565b34801561058657600080fd5b5061031261155a565b34801561059b57600080fd5b506016546102b89060ff1681565b3480156105b557600080fd5b50600a546001600160a01b0316610356565b3480156105d357600080fd5b506103126105e2366004612940565b611598565b3480156105f357600080fd5b5061039f60125481565b34801561060957600080fd5b506103296115f7565b34801561061e57600080fd5b50610312611606565b34801561063357600080fd5b506102b861064236600461283b565b600b6020526000908152604090205460ff1681565b34801561066357600080fd5b50610312610672366004612a6a565b611643565b34801561068357600080fd5b5061039f6125e481565b34801561069957600080fd5b5061039f66b1a2bc2ec5000081565b3480156106b457600080fd5b506103126106c3366004612aa6565b611708565b3480156106d457600080fd5b5061039f600581565b3480156106e957600080fd5b506103126106f8366004612b74565b611875565b34801561070957600080fd5b506103296107183660046128c1565b6118ad565b34801561072957600080fd5b5061039f607881565b34801561073e57600080fd5b506016546102b89062010000900460ff1681565b610312610760366004612bf0565b611946565b34801561077157600080fd5b506016546102b890610100900460ff1681565b34801561079057600080fd5b5061039f611c30565b3480156107a557600080fd5b50610329611c4c565b3480156107ba57600080fd5b506102b86107c9366004612c54565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561080357600080fd5b5061031261081236600461283b565b611c5b565b34801561082357600080fd5b5061039f60155481565b34801561083957600080fd5b5061039f60145481565b60006001600160e01b0319821663780e9d6360e01b1480610868575061086882611cf3565b92915050565b600a546001600160a01b031633146108a15760405162461bcd60e51b815260040161089890612c87565b60405180910390fd5b6016805461ff001981166101009182900460ff1615909102179055565b6060600080546108cd90612cbc565b80601f01602080910402602001604051908101604052809291908181526020018280546108f990612cbc565b80156109465780601f1061091b57610100808354040283529160200191610946565b820191906000526020600020905b81548152906001019060200180831161092957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109c95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610898565b506000908152600460205260409020546001600160a01b031690565b60006109f0826111ce565b9050806001600160a01b0316836001600160a01b03161415610a5e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610898565b336001600160a01b0382161480610a7a5750610a7a81336107c9565b610aec5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610898565b610af68383611d43565b505050565b610b053382611db1565b610b215760405162461bcd60e51b815260040161089890612cf7565b610af6838383611ea8565b601654610100900460ff16158015610b46575060165460ff165b610b835760405162461bcd60e51b815260206004820152600e60248201526d14149154d0531157d0d313d4d15160921b6044820152606401610898565b336000908152600b602052604090205460ff16610bd25760405162461bcd60e51b815260206004820152600d60248201526c1393d517d45550531251925151609a1b6044820152606401610898565b336000908152600d602052604090205460ff1615610c235760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610898565b6125e4610c3260b46078612d5e565b610c3c9190612d5e565b60085410610c7b5760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b6044820152606401610898565b336000908152600c6020526040812054905b81811015610cd95760138054906000610ca583612d76565b9190505550610cc733610cb760085490565b610cc2906001612d5e565b612053565b80610cd181612d76565b915050610c8d565b5050336000908152600d60205260409020805460ff19166001179055565b6000610d0283611245565b8210610d645760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610898565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610db75760405162461bcd60e51b815260040161089890612c87565b60405133904780156108fc02916000818181858888f19350505050158015610de3573d6000803e3d6000fd5b50565b610af683838360405180602001604052806000815250611875565b6000610e0c60085490565b8210610e6f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610898565b60088281548110610e8257610e82612d91565b90600052602060002001549050919050565b600a546001600160a01b03163314610ebe5760405162461bcd60e51b815260040161089890612c87565b60165462010000900460ff1615610ee75760405162461bcd60e51b815260040161089890612da7565b610af66010838361274c565b600a546001600160a01b03163314610f1d5760405162461bcd60e51b815260040161089890612c87565b8281148015610f2b57508215155b610f655760405162461bcd60e51b815260206004820152600b60248201526a24a7282aaa2fa2a92927a960a91b6044820152606401610898565b6000805b82811015610fa957838382818110610f8357610f83612d91565b9050602002013582610f959190612d5e565b915080610fa181612d76565b915050610f69565b5060b481601454610fba9190612d5e565b1115610ff95760405162461bcd60e51b815260206004820152600e60248201526d4558434545445f5052495641544560901b6044820152606401610898565b60005b848110156111af57600086868381811061101857611018612d91565b905060200201602081019061102d919061283b565b9050600085858481811061104357611043612d91565b60200291909101359150506001600160a01b0382166110935760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610898565b600081116110d05760405162461bcd60e51b815260206004820152600a6024820152695a45524f5f56414c554560b01b6044820152606401610898565b6015548111156111135760405162461bcd60e51b815260206004820152600e60248201526d4558434545445f50524553414c4560901b6044820152606401610898565b6001600160a01b0382166000908152600b602052604090205460ff161561116e5760405162461bcd60e51b815260206004820152600f60248201526e4455504c49434154455f454e54525960881b6044820152606401610898565b6001600160a01b039091166000908152600b60209081526040808320805460ff19166001179055600c909152902055806111a781612d76565b915050610ffc565b5080601460008282546111c29190612d5e565b90915550505050505050565b6000818152600260205260408120546001600160a01b0316806108685760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610898565b60006001600160a01b0382166112b05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610898565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112f65760405162461bcd60e51b815260040161089890612c87565b6113006000612071565b565b600a546001600160a01b0316331461132c5760405162461bcd60e51b815260040161089890612c87565b82811461136c5760405162461bcd60e51b815260206004820152600e60248201526d23a4a32a2fa4a7282aaa2fa2a92960911b6044820152606401610898565b6000805b828110156113b05783838281811061138a5761138a612d91565b905060200201358261139c9190612d5e565b9150806113a881612d76565b915050611370565b506125e46113c060b46078612d5e565b6113ca9190612d5e565b816113d460085490565b6113de9190612d5e565b11156114175760405162461bcd60e51b815260206004820152600860248201526713505617d352539560c21b6044820152606401610898565b6078816011546114279190612d5e565b11156114635760405162461bcd60e51b815260206004820152600b60248201526a47494654535f454d50545960a81b6044820152606401610898565b60005b8481101561155257600084848381811061148257611482612d91565b90506020020135116114c35760405162461bcd60e51b815260206004820152600a6024820152695a45524f5f56414c554560b01b6044820152606401610898565b60005b8484838181106114d8576114d8612d91565b9050602002013581101561153f57601180549060006114f683612d76565b919050555061152d87878481811061151057611510612d91565b9050602002016020810190611525919061283b565b600854610cb7565b8061153781612d76565b9150506114c6565b508061154a81612d76565b915050611466565b505050505050565b600a546001600160a01b031633146115845760405162461bcd60e51b815260040161089890612c87565b6016805460ff19811660ff90911615179055565b600a546001600160a01b031633146115c25760405162461bcd60e51b815260040161089890612c87565b60165462010000900460ff16156115eb5760405162461bcd60e51b815260040161089890612da7565b610af6600f838361274c565b6060600180546108cd90612cbc565b600a546001600160a01b031633146116305760405162461bcd60e51b815260040161089890612c87565b6016805462ff0000191662010000179055565b6001600160a01b03821633141561169c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610898565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146117325760405162461bcd60e51b815260040161089890612c87565b60005b81811015610af657600083838381811061175157611751612d91565b9050602002016020810190611766919061283b565b90506001600160a01b0381166117ad5760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610898565b6001600160a01b0381166000908152600b602052604090205460ff1615156001146118085760405162461bcd60e51b815260206004820152600b60248201526a24a7282aaa2fa2a92927a960a91b6044820152606401610898565b6001600160a01b0381166000908152600b60209081526040808320805460ff19169055600c9091528120546014805491929091611846908490612deb565b90915550506001600160a01b03166000908152600c60205260408120558061186d81612d76565b915050611735565b61187f3383611db1565b61189b5760405162461bcd60e51b815260040161089890612cf7565b6118a7848484846120c3565b50505050565b6000818152600260205260409020546060906001600160a01b03166119145760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610898565b601061191f836120f6565b604051602001611930929190612e1e565b6040516020818303038152906040529050919050565b601654610100900460ff1661198b5760405162461bcd60e51b815260206004820152600b60248201526a14d0531157d0d313d4d15160aa1b6044820152606401610898565b60165460ff16156119cd5760405162461bcd60e51b815260206004820152600c60248201526b4f4e4c595f50524553414c4560a01b6044820152606401610898565b600e826040516119dd9190612ec5565b9081526040519081900360200190205460ff1615611a295760405162461bcd60e51b8152602060048201526009602482015268121054d217d554d15160ba1b6044820152606401610898565b82611a353383856121f4565b14611a6e5760405162461bcd60e51b8152602060048201526009602482015268121054d217d190525360ba1b6044820152606401610898565b6125e4611a7d60b46078612d5e565b611a879190612d5e565b60085410611ac65760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b6044820152606401610898565b6125e481601254611ad79190612d5e565b1115611b155760405162461bcd60e51b815260206004820152600d60248201526c4558434545445f5055424c494360981b6044820152606401610898565b6005811115611b665760405162461bcd60e51b815260206004820152601960248201527f4558434545445f50697a7a61704e46545f5045525f4d494e54000000000000006044820152606401610898565b34611b788266b1a2bc2ec50000612ee1565b1115611bb95760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610898565b60005b81811015611bf85760128054906000611bd483612d76565b9190505550611be633610cb760085490565b80611bf081612d76565b915050611bbc565b506001600e83604051611c0b9190612ec5565b908152604051908190036020019020805491151560ff19909216919091179055505050565b6125e4611c3f60b46078612d5e565b611c499190612d5e565b81565b6060600f80546108cd90612cbc565b600a546001600160a01b03163314611c855760405162461bcd60e51b815260040161089890612c87565b6001600160a01b038116611cea5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610898565b610de381612071565b60006001600160e01b031982166380ac58cd60e01b1480611d2457506001600160e01b03198216635b5e139f60e01b145b8061086857506301ffc9a760e01b6001600160e01b0319831614610868565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d78826111ce565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e2a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610898565b6000611e35836111ce565b9050806001600160a01b0316846001600160a01b03161480611e705750836001600160a01b0316611e6584610950565b6001600160a01b0316145b80611ea057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ebb826111ce565b6001600160a01b031614611f235760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610898565b6001600160a01b038216611f855760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610898565b611f90838383612276565b611f9b600082611d43565b6001600160a01b0383166000908152600360205260408120805460019290611fc4908490612deb565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ff2908490612d5e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61206d82826040518060200160405280600081525061232e565b5050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6120ce848484611ea8565b6120da84848484612361565b6118a75760405162461bcd60e51b815260040161089890612f00565b60608161211a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612144578061212e81612d76565b915061213d9050600a83612f68565b915061211e565b60008167ffffffffffffffff81111561215f5761215f612ae8565b6040519080825280601f01601f191660200182016040528015612189576020820181803683370190505b5090505b8415611ea05761219e600183612deb565b91506121ab600a86612f7c565b6121b6906030612d5e565b60f81b8183815181106121cb576121cb612d91565b60200101906001600160f81b031916908160001a9053506121ed600a86612f68565b945061218d565b60008084848460405160200161220c93929190612f90565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051808303601f19018152919052805160209091012095945050505050565b6001600160a01b0383166122d1576122cc81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6122f4565b816001600160a01b0316836001600160a01b0316146122f4576122f4838261246e565b6001600160a01b03821661230b57610af68161250b565b826001600160a01b0316826001600160a01b031614610af657610af682826125ba565b61233883836125fe565b6123456000848484612361565b610af65760405162461bcd60e51b815260040161089890612f00565b60006001600160a01b0384163b1561246357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123a5903390899088908890600401612fcf565b602060405180830381600087803b1580156123bf57600080fd5b505af19250505080156123ef575060408051601f3d908101601f191682019092526123ec9181019061300c565b60015b612449573d80801561241d576040519150601f19603f3d011682016040523d82523d6000602084013e612422565b606091505b5080516124415760405162461bcd60e51b815260040161089890612f00565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ea0565b506001949350505050565b6000600161247b84611245565b6124859190612deb565b6000838152600760205260409020549091508082146124d8576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061251d90600190612deb565b6000838152600960205260408120546008805493945090928490811061254557612545612d91565b90600052602060002001549050806008838154811061256657612566612d91565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061259e5761259e613029565b6001900381819060005260206000200160009055905550505050565b60006125c583611245565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166126545760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610898565b6000818152600260205260409020546001600160a01b0316156126b95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610898565b6126c560008383612276565b6001600160a01b03821660009081526003602052604081208054600192906126ee908490612d5e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461275890612cbc565b90600052602060002090601f01602090048101928261277a57600085556127c0565b82601f106127935782800160ff198235161785556127c0565b828001600101855582156127c0579182015b828111156127c05782358255916020019190600101906127a5565b506127cc9291506127d0565b5090565b5b808211156127cc57600081556001016127d1565b6001600160e01b031981168114610de357600080fd5b60006020828403121561280d57600080fd5b8135612818816127e5565b9392505050565b80356001600160a01b038116811461283657600080fd5b919050565b60006020828403121561284d57600080fd5b6128188261281f565b60005b83811015612871578181015183820152602001612859565b838111156118a75750506000910152565b6000815180845261289a816020860160208601612856565b601f01601f19169290920160200192915050565b6020815260006128186020830184612882565b6000602082840312156128d357600080fd5b5035919050565b600080604083850312156128ed57600080fd5b6128f68361281f565b946020939093013593505050565b60008060006060848603121561291957600080fd5b6129228461281f565b92506129306020850161281f565b9150604084013590509250925092565b6000806020838503121561295357600080fd5b823567ffffffffffffffff8082111561296b57600080fd5b818501915085601f83011261297f57600080fd5b81358181111561298e57600080fd5b8660208285010111156129a057600080fd5b60209290920196919550909350505050565b60008083601f8401126129c457600080fd5b50813567ffffffffffffffff8111156129dc57600080fd5b6020830191508360208260051b85010111156129f757600080fd5b9250929050565b60008060008060408587031215612a1457600080fd5b843567ffffffffffffffff80821115612a2c57600080fd5b612a38888389016129b2565b90965094506020870135915080821115612a5157600080fd5b50612a5e878288016129b2565b95989497509550505050565b60008060408385031215612a7d57600080fd5b612a868361281f565b915060208301358015158114612a9b57600080fd5b809150509250929050565b60008060208385031215612ab957600080fd5b823567ffffffffffffffff811115612ad057600080fd5b612adc858286016129b2565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612b1957612b19612ae8565b604051601f8501601f19908116603f01168101908282118183101715612b4157612b41612ae8565b81604052809350858152868686011115612b5a57600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215612b8a57600080fd5b612b938561281f565b9350612ba16020860161281f565b925060408501359150606085013567ffffffffffffffff811115612bc457600080fd5b8501601f81018713612bd557600080fd5b612be487823560208401612afe565b91505092959194509250565b600080600060608486031215612c0557600080fd5b83359250602084013567ffffffffffffffff811115612c2357600080fd5b8401601f81018613612c3457600080fd5b612c4386823560208401612afe565b925050604084013590509250925092565b60008060408385031215612c6757600080fd5b612c708361281f565b9150612c7e6020840161281f565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612cd057607f821691505b60208210811415612cf157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612d7157612d71612d48565b500190565b6000600019821415612d8a57612d8a612d48565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60208082526024908201527f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60408201526318dad95960e21b606082015260800190565b600082821015612dfd57612dfd612d48565b500390565b60008151612e14818560208601612856565b9290920192915050565b600080845481600182811c915080831680612e3a57607f831692505b6020808410821415612e5a57634e487b7160e01b86526022600452602486fd5b818015612e6e5760018114612e7f57612eac565b60ff19861689528489019650612eac565b60008b81526020902060005b86811015612ea45781548b820152908501908301612e8b565b505084890196505b505050505050612ebc8185612e02565b95945050505050565b60008251612ed7818460208701612856565b9190910192915050565b6000816000190483118215151615612efb57612efb612d48565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612f7757612f77612f52565b500490565b600082612f8b57612f8b612f52565b500690565b6bffffffffffffffffffffffff198460601b16815282601482015260008251612fc0816034850160208701612856565b91909101603401949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061300290830184612882565b9695505050505050565b60006020828403121561301e57600080fd5b8151612818816127e5565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220bb1e28f2fe3d5f25a05e8965a1c8881fad73d865c5f77f6b4a2d291ad807cbfa64736f6c6343000809003368747470733a2f2f697066732e696f2f697066732f516d527557705668507a616a3258385a5934456f4e58563153346e36625066706d61704b316d5431436f646f414e2f
Deployed Bytecode
0x6080604052600436106102935760003560e01c806383a9e0491161015a578063b88d4fde116100c1578063e50981971161007a578063e509819714610784578063e8a3d48514610799578063e985e9c5146107ae578063f2fde38b146107f7578063f474307014610817578063fb4a6b731461082d57600080fd5b8063b88d4fde146106dd578063c87b56dd146106fd578063ceb72f071461071d578063cf30901214610732578063db41e8b314610752578063e081b7811461076557600080fd5b80639cf2e8d6116101135780639cf2e8d614610627578063a22cb46514610657578063a6b82e5614610677578063ae21ec721461068d578063b179e060146106a8578063b5ba705d146106c857600080fd5b806383a9e0491461058f5780638da5cb5b146105a9578063938e3d7b146105c7578063940f1ada146105e757806395d89b41146105fd578063989bdbb61461061257600080fd5b80633ccfd60b116101fe5780635e391090116101b75780635e391090146104e55780636352211e1461050557806370a0823114610525578063715018a6146105455780637705f9b51461055a5780637bffb4ce1461057a57600080fd5b80633ccfd60b1461044557806342842e0e1461045a5780634e2f38be1461047a5780634f6ccce71461048f57806355f804b3146104af57806359a12ad5146104cf57600080fd5b806318160ddd1161025057806318160ddd1461038e5780631b57190e146103ad57806323b872dd146103c35780632712d40b146103e35780632f745c59146103f85780633c997c1f1461041857600080fd5b806301ffc9a71461029857806302568b72146102cd578063049c5c49146102fd57806306fdde0314610314578063081812fc14610336578063095ea7b31461036e575b600080fd5b3480156102a457600080fd5b506102b86102b33660046127fb565b610843565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102b86102e836600461283b565b600d6020526000908152604090205460ff1681565b34801561030957600080fd5b5061031261086e565b005b34801561032057600080fd5b506103296108be565b6040516102c491906128ae565b34801561034257600080fd5b506103566103513660046128c1565b610950565b6040516001600160a01b0390911681526020016102c4565b34801561037a57600080fd5b506103126103893660046128da565b6109e5565b34801561039a57600080fd5b506008545b6040519081526020016102c4565b3480156103b957600080fd5b5061039f60115481565b3480156103cf57600080fd5b506103126103de366004612904565b610afb565b3480156103ef57600080fd5b50610312610b2c565b34801561040457600080fd5b5061039f6104133660046128da565b610cf7565b34801561042457600080fd5b5061039f61043336600461283b565b600c6020526000908152604090205481565b34801561045157600080fd5b50610312610d8d565b34801561046657600080fd5b50610312610475366004612904565b610de6565b34801561048657600080fd5b5061039f60b481565b34801561049b57600080fd5b5061039f6104aa3660046128c1565b610e01565b3480156104bb57600080fd5b506103126104ca366004612940565b610e94565b3480156104db57600080fd5b5061039f60135481565b3480156104f157600080fd5b506103126105003660046129fe565b610ef3565b34801561051157600080fd5b506103566105203660046128c1565b6111ce565b34801561053157600080fd5b5061039f61054036600461283b565b611245565b34801561055157600080fd5b506103126112cc565b34801561056657600080fd5b506103126105753660046129fe565b611302565b34801561058657600080fd5b5061031261155a565b34801561059b57600080fd5b506016546102b89060ff1681565b3480156105b557600080fd5b50600a546001600160a01b0316610356565b3480156105d357600080fd5b506103126105e2366004612940565b611598565b3480156105f357600080fd5b5061039f60125481565b34801561060957600080fd5b506103296115f7565b34801561061e57600080fd5b50610312611606565b34801561063357600080fd5b506102b861064236600461283b565b600b6020526000908152604090205460ff1681565b34801561066357600080fd5b50610312610672366004612a6a565b611643565b34801561068357600080fd5b5061039f6125e481565b34801561069957600080fd5b5061039f66b1a2bc2ec5000081565b3480156106b457600080fd5b506103126106c3366004612aa6565b611708565b3480156106d457600080fd5b5061039f600581565b3480156106e957600080fd5b506103126106f8366004612b74565b611875565b34801561070957600080fd5b506103296107183660046128c1565b6118ad565b34801561072957600080fd5b5061039f607881565b34801561073e57600080fd5b506016546102b89062010000900460ff1681565b610312610760366004612bf0565b611946565b34801561077157600080fd5b506016546102b890610100900460ff1681565b34801561079057600080fd5b5061039f611c30565b3480156107a557600080fd5b50610329611c4c565b3480156107ba57600080fd5b506102b86107c9366004612c54565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561080357600080fd5b5061031261081236600461283b565b611c5b565b34801561082357600080fd5b5061039f60155481565b34801561083957600080fd5b5061039f60145481565b60006001600160e01b0319821663780e9d6360e01b1480610868575061086882611cf3565b92915050565b600a546001600160a01b031633146108a15760405162461bcd60e51b815260040161089890612c87565b60405180910390fd5b6016805461ff001981166101009182900460ff1615909102179055565b6060600080546108cd90612cbc565b80601f01602080910402602001604051908101604052809291908181526020018280546108f990612cbc565b80156109465780601f1061091b57610100808354040283529160200191610946565b820191906000526020600020905b81548152906001019060200180831161092957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109c95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610898565b506000908152600460205260409020546001600160a01b031690565b60006109f0826111ce565b9050806001600160a01b0316836001600160a01b03161415610a5e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610898565b336001600160a01b0382161480610a7a5750610a7a81336107c9565b610aec5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610898565b610af68383611d43565b505050565b610b053382611db1565b610b215760405162461bcd60e51b815260040161089890612cf7565b610af6838383611ea8565b601654610100900460ff16158015610b46575060165460ff165b610b835760405162461bcd60e51b815260206004820152600e60248201526d14149154d0531157d0d313d4d15160921b6044820152606401610898565b336000908152600b602052604090205460ff16610bd25760405162461bcd60e51b815260206004820152600d60248201526c1393d517d45550531251925151609a1b6044820152606401610898565b336000908152600d602052604090205460ff1615610c235760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610898565b6125e4610c3260b46078612d5e565b610c3c9190612d5e565b60085410610c7b5760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b6044820152606401610898565b336000908152600c6020526040812054905b81811015610cd95760138054906000610ca583612d76565b9190505550610cc733610cb760085490565b610cc2906001612d5e565b612053565b80610cd181612d76565b915050610c8d565b5050336000908152600d60205260409020805460ff19166001179055565b6000610d0283611245565b8210610d645760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610898565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610db75760405162461bcd60e51b815260040161089890612c87565b60405133904780156108fc02916000818181858888f19350505050158015610de3573d6000803e3d6000fd5b50565b610af683838360405180602001604052806000815250611875565b6000610e0c60085490565b8210610e6f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610898565b60088281548110610e8257610e82612d91565b90600052602060002001549050919050565b600a546001600160a01b03163314610ebe5760405162461bcd60e51b815260040161089890612c87565b60165462010000900460ff1615610ee75760405162461bcd60e51b815260040161089890612da7565b610af66010838361274c565b600a546001600160a01b03163314610f1d5760405162461bcd60e51b815260040161089890612c87565b8281148015610f2b57508215155b610f655760405162461bcd60e51b815260206004820152600b60248201526a24a7282aaa2fa2a92927a960a91b6044820152606401610898565b6000805b82811015610fa957838382818110610f8357610f83612d91565b9050602002013582610f959190612d5e565b915080610fa181612d76565b915050610f69565b5060b481601454610fba9190612d5e565b1115610ff95760405162461bcd60e51b815260206004820152600e60248201526d4558434545445f5052495641544560901b6044820152606401610898565b60005b848110156111af57600086868381811061101857611018612d91565b905060200201602081019061102d919061283b565b9050600085858481811061104357611043612d91565b60200291909101359150506001600160a01b0382166110935760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610898565b600081116110d05760405162461bcd60e51b815260206004820152600a6024820152695a45524f5f56414c554560b01b6044820152606401610898565b6015548111156111135760405162461bcd60e51b815260206004820152600e60248201526d4558434545445f50524553414c4560901b6044820152606401610898565b6001600160a01b0382166000908152600b602052604090205460ff161561116e5760405162461bcd60e51b815260206004820152600f60248201526e4455504c49434154455f454e54525960881b6044820152606401610898565b6001600160a01b039091166000908152600b60209081526040808320805460ff19166001179055600c909152902055806111a781612d76565b915050610ffc565b5080601460008282546111c29190612d5e565b90915550505050505050565b6000818152600260205260408120546001600160a01b0316806108685760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610898565b60006001600160a01b0382166112b05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610898565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112f65760405162461bcd60e51b815260040161089890612c87565b6113006000612071565b565b600a546001600160a01b0316331461132c5760405162461bcd60e51b815260040161089890612c87565b82811461136c5760405162461bcd60e51b815260206004820152600e60248201526d23a4a32a2fa4a7282aaa2fa2a92960911b6044820152606401610898565b6000805b828110156113b05783838281811061138a5761138a612d91565b905060200201358261139c9190612d5e565b9150806113a881612d76565b915050611370565b506125e46113c060b46078612d5e565b6113ca9190612d5e565b816113d460085490565b6113de9190612d5e565b11156114175760405162461bcd60e51b815260206004820152600860248201526713505617d352539560c21b6044820152606401610898565b6078816011546114279190612d5e565b11156114635760405162461bcd60e51b815260206004820152600b60248201526a47494654535f454d50545960a81b6044820152606401610898565b60005b8481101561155257600084848381811061148257611482612d91565b90506020020135116114c35760405162461bcd60e51b815260206004820152600a6024820152695a45524f5f56414c554560b01b6044820152606401610898565b60005b8484838181106114d8576114d8612d91565b9050602002013581101561153f57601180549060006114f683612d76565b919050555061152d87878481811061151057611510612d91565b9050602002016020810190611525919061283b565b600854610cb7565b8061153781612d76565b9150506114c6565b508061154a81612d76565b915050611466565b505050505050565b600a546001600160a01b031633146115845760405162461bcd60e51b815260040161089890612c87565b6016805460ff19811660ff90911615179055565b600a546001600160a01b031633146115c25760405162461bcd60e51b815260040161089890612c87565b60165462010000900460ff16156115eb5760405162461bcd60e51b815260040161089890612da7565b610af6600f838361274c565b6060600180546108cd90612cbc565b600a546001600160a01b031633146116305760405162461bcd60e51b815260040161089890612c87565b6016805462ff0000191662010000179055565b6001600160a01b03821633141561169c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610898565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146117325760405162461bcd60e51b815260040161089890612c87565b60005b81811015610af657600083838381811061175157611751612d91565b9050602002016020810190611766919061283b565b90506001600160a01b0381166117ad5760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610898565b6001600160a01b0381166000908152600b602052604090205460ff1615156001146118085760405162461bcd60e51b815260206004820152600b60248201526a24a7282aaa2fa2a92927a960a91b6044820152606401610898565b6001600160a01b0381166000908152600b60209081526040808320805460ff19169055600c9091528120546014805491929091611846908490612deb565b90915550506001600160a01b03166000908152600c60205260408120558061186d81612d76565b915050611735565b61187f3383611db1565b61189b5760405162461bcd60e51b815260040161089890612cf7565b6118a7848484846120c3565b50505050565b6000818152600260205260409020546060906001600160a01b03166119145760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610898565b601061191f836120f6565b604051602001611930929190612e1e565b6040516020818303038152906040529050919050565b601654610100900460ff1661198b5760405162461bcd60e51b815260206004820152600b60248201526a14d0531157d0d313d4d15160aa1b6044820152606401610898565b60165460ff16156119cd5760405162461bcd60e51b815260206004820152600c60248201526b4f4e4c595f50524553414c4560a01b6044820152606401610898565b600e826040516119dd9190612ec5565b9081526040519081900360200190205460ff1615611a295760405162461bcd60e51b8152602060048201526009602482015268121054d217d554d15160ba1b6044820152606401610898565b82611a353383856121f4565b14611a6e5760405162461bcd60e51b8152602060048201526009602482015268121054d217d190525360ba1b6044820152606401610898565b6125e4611a7d60b46078612d5e565b611a879190612d5e565b60085410611ac65760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b6044820152606401610898565b6125e481601254611ad79190612d5e565b1115611b155760405162461bcd60e51b815260206004820152600d60248201526c4558434545445f5055424c494360981b6044820152606401610898565b6005811115611b665760405162461bcd60e51b815260206004820152601960248201527f4558434545445f50697a7a61704e46545f5045525f4d494e54000000000000006044820152606401610898565b34611b788266b1a2bc2ec50000612ee1565b1115611bb95760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610898565b60005b81811015611bf85760128054906000611bd483612d76565b9190505550611be633610cb760085490565b80611bf081612d76565b915050611bbc565b506001600e83604051611c0b9190612ec5565b908152604051908190036020019020805491151560ff19909216919091179055505050565b6125e4611c3f60b46078612d5e565b611c499190612d5e565b81565b6060600f80546108cd90612cbc565b600a546001600160a01b03163314611c855760405162461bcd60e51b815260040161089890612c87565b6001600160a01b038116611cea5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610898565b610de381612071565b60006001600160e01b031982166380ac58cd60e01b1480611d2457506001600160e01b03198216635b5e139f60e01b145b8061086857506301ffc9a760e01b6001600160e01b0319831614610868565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d78826111ce565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e2a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610898565b6000611e35836111ce565b9050806001600160a01b0316846001600160a01b03161480611e705750836001600160a01b0316611e6584610950565b6001600160a01b0316145b80611ea057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ebb826111ce565b6001600160a01b031614611f235760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610898565b6001600160a01b038216611f855760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610898565b611f90838383612276565b611f9b600082611d43565b6001600160a01b0383166000908152600360205260408120805460019290611fc4908490612deb565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ff2908490612d5e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61206d82826040518060200160405280600081525061232e565b5050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6120ce848484611ea8565b6120da84848484612361565b6118a75760405162461bcd60e51b815260040161089890612f00565b60608161211a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612144578061212e81612d76565b915061213d9050600a83612f68565b915061211e565b60008167ffffffffffffffff81111561215f5761215f612ae8565b6040519080825280601f01601f191660200182016040528015612189576020820181803683370190505b5090505b8415611ea05761219e600183612deb565b91506121ab600a86612f7c565b6121b6906030612d5e565b60f81b8183815181106121cb576121cb612d91565b60200101906001600160f81b031916908160001a9053506121ed600a86612f68565b945061218d565b60008084848460405160200161220c93929190612f90565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051808303601f19018152919052805160209091012095945050505050565b6001600160a01b0383166122d1576122cc81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6122f4565b816001600160a01b0316836001600160a01b0316146122f4576122f4838261246e565b6001600160a01b03821661230b57610af68161250b565b826001600160a01b0316826001600160a01b031614610af657610af682826125ba565b61233883836125fe565b6123456000848484612361565b610af65760405162461bcd60e51b815260040161089890612f00565b60006001600160a01b0384163b1561246357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123a5903390899088908890600401612fcf565b602060405180830381600087803b1580156123bf57600080fd5b505af19250505080156123ef575060408051601f3d908101601f191682019092526123ec9181019061300c565b60015b612449573d80801561241d576040519150601f19603f3d011682016040523d82523d6000602084013e612422565b606091505b5080516124415760405162461bcd60e51b815260040161089890612f00565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ea0565b506001949350505050565b6000600161247b84611245565b6124859190612deb565b6000838152600760205260409020549091508082146124d8576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061251d90600190612deb565b6000838152600960205260408120546008805493945090928490811061254557612545612d91565b90600052602060002001549050806008838154811061256657612566612d91565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061259e5761259e613029565b6001900381819060005260206000200160009055905550505050565b60006125c583611245565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166126545760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610898565b6000818152600260205260409020546001600160a01b0316156126b95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610898565b6126c560008383612276565b6001600160a01b03821660009081526003602052604081208054600192906126ee908490612d5e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461275890612cbc565b90600052602060002090601f01602090048101928261277a57600085556127c0565b82601f106127935782800160ff198235161785556127c0565b828001600101855582156127c0579182015b828111156127c05782358255916020019190600101906127a5565b506127cc9291506127d0565b5090565b5b808211156127cc57600081556001016127d1565b6001600160e01b031981168114610de357600080fd5b60006020828403121561280d57600080fd5b8135612818816127e5565b9392505050565b80356001600160a01b038116811461283657600080fd5b919050565b60006020828403121561284d57600080fd5b6128188261281f565b60005b83811015612871578181015183820152602001612859565b838111156118a75750506000910152565b6000815180845261289a816020860160208601612856565b601f01601f19169290920160200192915050565b6020815260006128186020830184612882565b6000602082840312156128d357600080fd5b5035919050565b600080604083850312156128ed57600080fd5b6128f68361281f565b946020939093013593505050565b60008060006060848603121561291957600080fd5b6129228461281f565b92506129306020850161281f565b9150604084013590509250925092565b6000806020838503121561295357600080fd5b823567ffffffffffffffff8082111561296b57600080fd5b818501915085601f83011261297f57600080fd5b81358181111561298e57600080fd5b8660208285010111156129a057600080fd5b60209290920196919550909350505050565b60008083601f8401126129c457600080fd5b50813567ffffffffffffffff8111156129dc57600080fd5b6020830191508360208260051b85010111156129f757600080fd5b9250929050565b60008060008060408587031215612a1457600080fd5b843567ffffffffffffffff80821115612a2c57600080fd5b612a38888389016129b2565b90965094506020870135915080821115612a5157600080fd5b50612a5e878288016129b2565b95989497509550505050565b60008060408385031215612a7d57600080fd5b612a868361281f565b915060208301358015158114612a9b57600080fd5b809150509250929050565b60008060208385031215612ab957600080fd5b823567ffffffffffffffff811115612ad057600080fd5b612adc858286016129b2565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612b1957612b19612ae8565b604051601f8501601f19908116603f01168101908282118183101715612b4157612b41612ae8565b81604052809350858152868686011115612b5a57600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215612b8a57600080fd5b612b938561281f565b9350612ba16020860161281f565b925060408501359150606085013567ffffffffffffffff811115612bc457600080fd5b8501601f81018713612bd557600080fd5b612be487823560208401612afe565b91505092959194509250565b600080600060608486031215612c0557600080fd5b83359250602084013567ffffffffffffffff811115612c2357600080fd5b8401601f81018613612c3457600080fd5b612c4386823560208401612afe565b925050604084013590509250925092565b60008060408385031215612c6757600080fd5b612c708361281f565b9150612c7e6020840161281f565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612cd057607f821691505b60208210811415612cf157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612d7157612d71612d48565b500190565b6000600019821415612d8a57612d8a612d48565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60208082526024908201527f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60408201526318dad95960e21b606082015260800190565b600082821015612dfd57612dfd612d48565b500390565b60008151612e14818560208601612856565b9290920192915050565b600080845481600182811c915080831680612e3a57607f831692505b6020808410821415612e5a57634e487b7160e01b86526022600452602486fd5b818015612e6e5760018114612e7f57612eac565b60ff19861689528489019650612eac565b60008b81526020902060005b86811015612ea45781548b820152908501908301612e8b565b505084890196505b505050505050612ebc8185612e02565b95945050505050565b60008251612ed7818460208701612856565b9190910192915050565b6000816000190483118215151615612efb57612efb612d48565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612f7757612f77612f52565b500490565b600082612f8b57612f8b612f52565b500690565b6bffffffffffffffffffffffff198460601b16815282601482015260008251612fc0816034850160208701612856565b91909101603401949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061300290830184612882565b9695505050505050565b60006020828403121561301e57600080fd5b8151612818816127e5565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220bb1e28f2fe3d5f25a05e8965a1c8881fad73d865c5f77f6b4a2d291ad807cbfa64736f6c63430008090033
Deployed Bytecode Sourcemap
42025:6552:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35875:224;;;;;;;;;;-1:-1:-1;35875:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35875:224:0;;;;;;;;42606:50;;;;;;;;;;-1:-1:-1;42606:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;47870:86;;;;;;;;;;;;;:::i;:::-;;23879:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25438:221::-;;;;;;;;;;-1:-1:-1;25438:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2083:32:1;;;2065:51;;2053:2;2038:18;25438:221:0;1919:203:1;24961:411:0;;;;;;;;;;-1:-1:-1;24961:411:0;;;;;:::i;:::-;;:::i;36515:113::-;;;;;;;;;;-1:-1:-1;36603:10:0;:17;36515:113;;;2532:25:1;;;2520:2;2505:18;36515:113:0;2386:177:1;42863:27:0;;;;;;;;;;;;;;;;26328:339;;;;;;;;;;-1:-1:-1;26328:339:0;;;;;:::i;:::-;;:::i;46055:578::-;;;;;;;;;;;;;:::i;36183:256::-;;;;;;;;;;-1:-1:-1;36183:256:0;;;;;:::i;:::-;;:::i;42546:53::-;;;;;;;;;;-1:-1:-1;42546:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;47461:109;;;;;;;;;;;;;:::i;26738:185::-;;;;;;;;;;-1:-1:-1;26738:185:0;;;;;:::i;:::-;;:::i;42169:47::-;;;;;;;;;;;;42213:3;42169:47;;36705:233;;;;;;;;;;-1:-1:-1;36705:233:0;;;;;:::i;:::-;;:::i;48091:108::-;;;;;;;;;;-1:-1:-1;48091:108:0;;;;;:::i;:::-;;:::i;42937:34::-;;;;;;;;;;;;;;;;43339:987;;;;;;;;;;-1:-1:-1;43339:987:0;;;;;:::i;:::-;;:::i;23573:239::-;;;;;;;;;;-1:-1:-1;23573:239:0;;;;;:::i;:::-;;:::i;23303:208::-;;;;;;;;;;-1:-1:-1;23303:208:0;;;;;:::i;:::-;;:::i;12385:94::-;;;;;;;;;;;;;:::i;46645:804::-;;;;;;;;;;-1:-1:-1;46645:804:0;;;;;:::i;:::-;;:::i;47763:95::-;;;;;;;;;;;;;:::i;43063:23::-;;;;;;;;;;-1:-1:-1;43063:23:0;;;;;;;;11734:87;;;;;;;;;;-1:-1:-1;11807:6:0;;-1:-1:-1;;;;;11807:6:0;11734:87;;47968:111;;;;;;;;;;-1:-1:-1;47968:111:0;;;;;:::i;:::-;;:::i;42897:33::-;;;;;;;;;;;;;;;;24048:104;;;;;;;;;;;;;:::i;47676:75::-;;;;;;;;;;;;;:::i;42495:44::-;;;;;;;;;;-1:-1:-1;42495:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25731:295;;;;;;;;;;-1:-1:-1;25731:295:0;;;;;:::i;:::-;;:::i;42223:47::-;;;;;;;;;;;;42266:4;42223:47;;42377:52;;;;;;;;;;;;42419:10;42377:52;;44334:492;;;;;;;;;;-1:-1:-1;44334:492:0;;;;;:::i;:::-;;:::i;42436:46::-;;;;;;;;;;;;42481:1;42436:46;;26994:328;;;;;;;;;;-1:-1:-1;26994:328:0;;;;;:::i;:::-;;:::i;48320:254::-;;;;;;;;;;-1:-1:-1;48320:254:0;;;;;:::i;:::-;;:::i;42118:44::-;;;;;;;;;;;;42159:3;42118:44;;43120:18;;;;;;;;;;-1:-1:-1;43120:18:0;;;;;;;;;;;45178:865;;;;;;:::i;:::-;;:::i;43093:20::-;;;;;;;;;;-1:-1:-1;43093:20:0;;;;;;;;;;;42277:93;;;;;;;;;;;;;:::i;48211:97::-;;;;;;;;;;;;;:::i;26097:164::-;;;;;;;;;;-1:-1:-1;26097:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26218:25:0;;;26194:4;26218:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26097:164;12634:192;;;;;;;;;;-1:-1:-1;12634:192:0;;;;;:::i;:::-;;:::i;43016:40::-;;;;;;;;;;;;;;;;42978:31;;;;;;;;;;;;;;;;35875:224;35977:4;-1:-1:-1;;;;;;36001:50:0;;-1:-1:-1;;;36001:50:0;;:90;;;36055:36;36079:11;36055:23;:36::i;:::-;35994:97;35875:224;-1:-1:-1;;35875:224:0:o;47870:86::-;11807:6;;-1:-1:-1;;;;;11807:6:0;8699:10;11954:23;11946:68;;;;-1:-1:-1;;;11946:68:0;;;;;;;:::i;:::-;;;;;;;;;47940:8:::1;::::0;;-1:-1:-1;;47928:20:0;::::1;47940:8;::::0;;;::::1;;;47939:9;47928:20:::0;;::::1;;::::0;;47870:86::o;23879:100::-;23933:13;23966:5;23959:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23879:100;:::o;25438:221::-;25514:7;28921:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28921:16:0;25534:73;;;;-1:-1:-1;;;25534:73:0;;8685:2:1;25534:73:0;;;8667:21:1;8724:2;8704:18;;;8697:30;8763:34;8743:18;;;8736:62;-1:-1:-1;;;8814:18:1;;;8807:42;8866:19;;25534:73:0;8483:408:1;25534:73:0;-1:-1:-1;25627:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25627:24:0;;25438:221::o;24961:411::-;25042:13;25058:23;25073:7;25058:14;:23::i;:::-;25042:39;;25106:5;-1:-1:-1;;;;;25100:11:0;:2;-1:-1:-1;;;;;25100:11:0;;;25092:57;;;;-1:-1:-1;;;25092:57:0;;9098:2:1;25092:57:0;;;9080:21:1;9137:2;9117:18;;;9110:30;9176:34;9156:18;;;9149:62;-1:-1:-1;;;9227:18:1;;;9220:31;9268:19;;25092:57:0;8896:397:1;25092:57:0;8699:10;-1:-1:-1;;;;;25184:21:0;;;;:62;;-1:-1:-1;25209:37:0;25226:5;8699:10;26097:164;:::i;25209:37::-;25162:168;;;;-1:-1:-1;;;25162:168:0;;9500:2:1;25162:168:0;;;9482:21:1;9539:2;9519:18;;;9512:30;9578:34;9558:18;;;9551:62;9649:26;9629:18;;;9622:54;9693:19;;25162:168:0;9298:420:1;25162:168:0;25343:21;25352:2;25356:7;25343:8;:21::i;:::-;25031:341;24961:411;;:::o;26328:339::-;26523:41;8699:10;26556:7;26523:18;:41::i;:::-;26515:103;;;;-1:-1:-1;;;26515:103:0;;;;;;;:::i;:::-;26631:28;26641:4;26647:2;26651:7;26631:9;:28::i;46055:578::-;46107:8;;;;;;;46106:9;:24;;;;-1:-1:-1;46119:11:0;;;;46106:24;46098:51;;;;-1:-1:-1;;;46098:51:0;;10343:2:1;46098:51:0;;;10325:21:1;10382:2;10362:18;;;10355:30;-1:-1:-1;;;10401:18:1;;;10394:44;10455:18;;46098:51:0;10141:338:1;46098:51:0;46181:10;46168:24;;;;:12;:24;;;;;;;;46160:50;;;;-1:-1:-1;;;46160:50:0;;10686:2:1;46160:50:0;;;10668:21:1;10725:2;10705:18;;;10698:30;-1:-1:-1;;;10744:18:1;;;10737:43;10797:18;;46160:50:0;10484:337:1;46160:50:0;46249:10;46230:30;;;;:18;:30;;;;;;;;46229:31;46221:58;;;;-1:-1:-1;;;46221:58:0;;11028:2:1;46221:58:0;;;11010:21:1;11067:2;11047:18;;;11040:30;-1:-1:-1;;;11086:18:1;;;11079:44;11140:18;;46221:58:0;10826:338:1;46221:58:0;42266:4;42317:34;42213:3;42159;42317:34;:::i;:::-;:53;;;;:::i;:::-;36603:10;:17;46298:29;46290:54;;;;-1:-1:-1;;;46290:54:0;;11636:2:1;46290:54:0;;;11618:21:1;11675:2;11655:18;;;11648:30;-1:-1:-1;;;11694:18:1;;;11687:42;11746:18;;46290:54:0;11434:336:1;46290:54:0;46409:10;46365:22;46390:30;;;:18;:30;;;;;;;46431:147;46455:13;46451:1;:17;46431:147;;;46490:19;:21;;;:19;:21;;;:::i;:::-;;;;;;46526:40;46536:10;46548:13;36603:10;:17;;36515:113;46548:13;:17;;46564:1;46548:17;:::i;:::-;46526:9;:40::i;:::-;46470:3;;;;:::i;:::-;;;;46431:147;;;-1:-1:-1;;46607:10:0;46588:30;;;;:18;:30;;;;;:37;;-1:-1:-1;;46588:37:0;46621:4;46588:37;;;46055:578::o;36183:256::-;36280:7;36316:23;36333:5;36316:16;:23::i;:::-;36308:5;:31;36300:87;;;;-1:-1:-1;;;36300:87:0;;12117:2:1;36300:87:0;;;12099:21:1;12156:2;12136:18;;;12129:30;12195:34;12175:18;;;12168:62;-1:-1:-1;;;12246:18:1;;;12239:41;12297:19;;36300:87:0;11915:407:1;36300:87:0;-1:-1:-1;;;;;;36405:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36183:256::o;47461:109::-;11807:6;;-1:-1:-1;;;;;11807:6:0;8699:10;11954:23;11946:68;;;;-1:-1:-1;;;11946:68:0;;;;;;;:::i;:::-;47511:51:::1;::::0;47519:10:::1;::::0;47540:21:::1;47511:51:::0;::::1;;;::::0;::::1;::::0;;;47540:21;47519:10;47511:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;47461:109::o:0;26738:185::-;26876:39;26893:4;26899:2;26903:7;26876:39;;;;;;;;;;;;:16;:39::i;36705:233::-;36780:7;36816:30;36603:10;:17;;36515:113;36816:30;36808:5;:38;36800:95;;;;-1:-1:-1;;;36800:95:0;;12529:2:1;36800:95:0;;;12511:21:1;12568:2;12548:18;;;12541:30;12607:34;12587:18;;;12580:62;-1:-1:-1;;;12658:18:1;;;12651:42;12710:19;;36800:95:0;12327:408:1;36800:95:0;36913:10;36924:5;36913:17;;;;;;;;:::i;:::-;;;;;;;;;36906:24;;36705:233;;;:::o;48091:108::-;11807:6;;-1:-1:-1;;;;;11807:6:0;8699:10;11954:23;11946:68;;;;-1:-1:-1;;;11946:68:0;;;;;;;:::i;:::-;43260:6:::1;::::0;;;::::1;;;43259:7;43251:56;;;;-1:-1:-1::0;;;43251:56:0::1;;;;;;;:::i;:::-;48172:19:::2;:13;48188:3:::0;;48172:19:::2;:::i;43339:987::-:0;11807:6;;-1:-1:-1;;;;;11807:6:0;8699:10;11954:23;11946:68;;;;-1:-1:-1;;;11946:68:0;;;;;;;:::i;:::-;43460:32;;::::1;43459:58:::0;::::1;;;-1:-1:-1::0;43498:18:0;;;43459:58:::1;43451:82;;;::::0;-1:-1:-1;;;43451:82:0;;13479:2:1;43451:82:0::1;::::0;::::1;13461:21:1::0;13518:2;13498:18;;;13491:30;-1:-1:-1;;;13537:18:1;;;13530:41;13588:18;;43451:82:0::1;13277:335:1::0;43451:82:0::1;43544:22;43586:9:::0;43581:99:::1;43601:18:::0;;::::1;43581:99;;;43658:7;;43666:1;43658:10;;;;;;;:::i;:::-;;;;;;;43641:27;;;;;:::i;:::-;::::0;-1:-1:-1;43621:3:0;::::1;::::0;::::1;:::i;:::-;;;;43581:99;;;;42213:3;43717:13;43698:16;;:32;;;;:::i;:::-;:53;;43690:80;;;::::0;-1:-1:-1;;;43690:80:0;;13819:2:1;43690:80:0::1;::::0;::::1;13801:21:1::0;13858:2;13838:18;;;13831:30;-1:-1:-1;;;13877:18:1;;;13870:44;13931:18;;43690:80:0::1;13617:338:1::0;43690:80:0::1;43787:9;43783:475;43802:18:::0;;::::1;43783:475;;;43842:13;43858:7;;43866:1;43858:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;43842:26;;43883:14;43900:7;;43908:1;43900:10;;;;;;;:::i;:::-;;;::::0;;;::::1;;::::0;-1:-1:-1;;;;;;;43933:19:0;::::1;43925:44;;;::::0;-1:-1:-1;;;43925:44:0;;14162:2:1;43925:44:0::1;::::0;::::1;14144:21:1::0;14201:2;14181:18;;;14174:30;-1:-1:-1;;;14220:18:1;;;14213:42;14272:18;;43925:44:0::1;13960:336:1::0;43925:44:0::1;44001:1;43992:6;:10;43984:34;;;::::0;-1:-1:-1;;;43984:34:0;;14503:2:1;43984:34:0::1;::::0;::::1;14485:21:1::0;14542:2;14522:18;;;14515:30;-1:-1:-1;;;14561:18:1;;;14554:40;14611:18;;43984:34:0::1;14301:334:1::0;43984:34:0::1;44051:20;;44041:6;:30;;44033:58;;;::::0;-1:-1:-1;;;44033:58:0;;14842:2:1;44033:58:0::1;::::0;::::1;14824:21:1::0;14881:2;14861:18;;;14854:30;-1:-1:-1;;;14900:18:1;;;14893:44;14954:18;;44033:58:0::1;14640:338:1::0;44033:58:0::1;-1:-1:-1::0;;;;;44115:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;::::1;;44114:20;44106:48;;;::::0;-1:-1:-1;;;44106:48:0;;15185:2:1;44106:48:0::1;::::0;::::1;15167:21:1::0;15224:2;15204:18;;;15197:30;-1:-1:-1;;;15243:18:1;;;15236:45;15298:18;;44106:48:0::1;14983:339:1::0;44106:48:0::1;-1:-1:-1::0;;;;;44171:19:0;;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;;:26;;-1:-1:-1;;44171:26:0::1;44193:4;44171:26;::::0;;44212:18:::1;:25:::0;;;;;:34;43822:3;::::1;::::0;::::1;:::i;:::-;;;;43783:475;;;;44290:13;44268:16;;:35;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;43339:987:0:o;23573:239::-;23645:7;23681:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23681:16:0;23716:19;23708:73;;;;-1:-1:-1;;;23708:73:0;;15529:2:1;23708:73:0;;;15511:21:1;15568:2;15548:18;;;15541:30;15607:34;15587:18;;;15580:62;-1:-1:-1;;;15658:18:1;;;15651:39;15707:19;;23708:73:0;15327:405:1;23303:208:0;23375:7;-1:-1:-1;;;;;23403:19:0;;23395:74;;;;-1:-1:-1;;;23395:74:0;;15939:2:1;23395:74:0;;;15921:21:1;15978:2;15958:18;;;15951:30;16017:34;15997:18;;;15990:62;-1:-1:-1;;;16068:18:1;;;16061:40;16118:19;;23395:74:0;15737:406:1;23395:74:0;-1:-1:-1;;;;;;23487:16:0;;;;;:9;:16;;;;;;;23303:208::o;12385:94::-;11807:6;;-1:-1:-1;;;;;11807:6:0;8699:10;11954:23;11946:68;;;;-1:-1:-1;;;11946:68:0;;;;;;;:::i;:::-;12450:21:::1;12468:1;12450:9;:21::i;:::-;12385:94::o:0;46645:804::-;11807:6;;-1:-1:-1;;;;;11807:6:0;8699:10;11954:23;11946:68;;;;-1:-1:-1;;;11946:68:0;;;;;;;:::i;:::-;46758:37;;::::1;46750:63;;;::::0;-1:-1:-1;;;46750:63:0;;16350:2:1;46750:63:0::1;::::0;::::1;16332:21:1::0;16389:2;16369:18;;;16362:30;-1:-1:-1;;;16408:18:1;;;16401:44;16462:18;;46750:63:0::1;16148:338:1::0;46750:63:0::1;46824:25;46869:9:::0;46864:108:::1;46884:21:::0;;::::1;46864:108;;;46947:10;;46958:1;46947:13;;;;;;;:::i;:::-;;;;;;;46927:33;;;;;:::i;:::-;::::0;-1:-1:-1;46907:3:0;::::1;::::0;::::1;:::i;:::-;;;;46864:108;;;-1:-1:-1::0;42266:4:0::1;42317:34;42213:3;42159;42317:34;:::i;:::-;:53;;;;:::i;:::-;47006:16;46990:13;36603:10:::0;:17;;36515:113;46990:13:::1;:32;;;;:::i;:::-;:49;;46982:70;;;::::0;-1:-1:-1;;;46982:70:0;;16693:2:1;46982:70:0::1;::::0;::::1;16675:21:1::0;16732:1;16712:18;;;16705:29;-1:-1:-1;;;16750:18:1;;;16743:38;16798:18;;46982:70:0::1;16491:331:1::0;46982:70:0::1;42159:3;47086:16;47071:12;;:31;;;;:::i;:::-;:49;;47063:73;;;::::0;-1:-1:-1;;;47063:73:0;;17029:2:1;47063:73:0::1;::::0;::::1;17011:21:1::0;17068:2;17048:18;;;17041:30;-1:-1:-1;;;17087:18:1;;;17080:41;17138:18;;47063:73:0::1;16827:335:1::0;47063:73:0::1;47164:9;47159:283;47179:20:::0;;::::1;47159:283;;;47245:1;47229:10;;47240:1;47229:13;;;;;;;:::i;:::-;;;;;;;:17;47221:41;;;::::0;-1:-1:-1;;;47221:41:0;;14503:2:1;47221:41:0::1;::::0;::::1;14485:21:1::0;14542:2;14522:18;;;14515:30;-1:-1:-1;;;14561:18:1;;;14554:40;14611:18;;47221:41:0::1;14301:334:1::0;47221:41:0::1;47282:9;47277:154;47301:10;;47312:1;47301:13;;;;;;;:::i;:::-;;;;;;;47297:1;:17;47277:154;;;47340:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;;;;;;47373:42;47383:9;;47393:1;47383:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;36603:10:::0;:17;47397:13:::1;36515:113:::0;47373:42:::1;47316:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47277:154;;;-1:-1:-1::0;47201:3:0;::::1;::::0;::::1;:::i;:::-;;;;47159:283;;;;46739:710;46645:804:::0;;;;:::o;47763:95::-;11807:6;;-1:-1:-1;;;;;11807:6:0;8699:10;11954:23;11946:68;;;;-1:-1:-1;;;11946:68:0;;;;;;;:::i;:::-;47839:11:::1;::::0;;-1:-1:-1;;47824:26:0;::::1;47839:11;::::0;;::::1;47838:12;47824:26;::::0;;47763:95::o;47968:111::-;11807:6;;-1:-1:-1;;;;;11807:6:0;8699:10;11954:23;11946:68;;;;-1:-1:-1;;;11946:68:0;;;;;;;:::i;:::-;43260:6:::1;::::0;;;::::1;;;43259:7;43251:56;;;;-1:-1:-1::0;;;43251:56:0::1;;;;;;;:::i;:::-;48053:18:::2;:12;48068:3:::0;;48053:18:::2;:::i;24048:104::-:0;24104:13;24137:7;24130:14;;;;;:::i;47676:75::-;11807:6;;-1:-1:-1;;;;;11807:6:0;8699:10;11954:23;11946:68;;;;-1:-1:-1;;;11946:68:0;;;;;;;:::i;:::-;47730:6:::1;:13:::0;;-1:-1:-1;;47730:13:0::1;::::0;::::1;::::0;;47676:75::o;25731:295::-;-1:-1:-1;;;;;25834:24:0;;8699:10;25834:24;;25826:62;;;;-1:-1:-1;;;25826:62:0;;17369:2:1;25826:62:0;;;17351:21:1;17408:2;17388:18;;;17381:30;17447:27;17427:18;;;17420:55;17492:18;;25826:62:0;17167:349:1;25826:62:0;8699:10;25901:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25901:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25901:53:0;;;;;;;;;;25970:48;;540:41:1;;;25901:42:0;;8699:10;25970:48;;513:18:1;25970:48:0;;;;;;;25731:295;;:::o;44334:492::-;11807:6;;-1:-1:-1;;;;;11807:6:0;8699:10;11954:23;11946:68;;;;-1:-1:-1;;;11946:68:0;;;;;;;:::i;:::-;44427:9:::1;44423:396;44442:18:::0;;::::1;44423:396;;;44482:13;44498:7;;44506:1;44498:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;44482:26:::0;-1:-1:-1;;;;;;44531:19:0;::::1;44523:44;;;::::0;-1:-1:-1;;;44523:44:0;;14162:2:1;44523:44:0::1;::::0;::::1;14144:21:1::0;14201:2;14181:18;;;14174:30;-1:-1:-1;;;14220:18:1;;;14213:42;14272:18;;44523:44:0::1;13960:336:1::0;44523:44:0::1;-1:-1:-1::0;;;;;44590:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;::::1;;:27;;:19:::0;:27:::1;44582:51;;;::::0;-1:-1:-1;;;44582:51:0;;13479:2:1;44582:51:0::1;::::0;::::1;13461:21:1::0;13518:2;13498:18;;;13491:30;-1:-1:-1;;;13537:18:1;;;13530:41;13588:18;;44582:51:0::1;13277:335:1::0;44582:51:0::1;-1:-1:-1::0;;;;;44662:19:0;::::1;44684:5;44662:19:::0;;;:12:::1;:19;::::0;;;;;;;:27;;-1:-1:-1;;44662:27:0::1;::::0;;44724:18:::1;:25:::0;;;;;;44704:16:::1;:45:::0;;44724:25;;44704:16;;:45:::1;::::0;44724:25;;44704:45:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;44764:25:0::1;44792:1;44764:25:::0;;;:18:::1;:25;::::0;;;;:29;44462:3;::::1;::::0;::::1;:::i;:::-;;;;44423:396;;26994:328:::0;27169:41;8699:10;27202:7;27169:18;:41::i;:::-;27161:103;;;;-1:-1:-1;;;27161:103:0;;;;;;;:::i;:::-;27275:39;27289:4;27295:2;27299:7;27308:5;27275:13;:39::i;:::-;26994:328;;;;:::o;48320:254::-;28897:4;28921:16;;;:7;:16;;;;;;48393:13;;-1:-1:-1;;;;;28921:16:0;48419:60;;;;-1:-1:-1;;;48419:60:0;;17853:2:1;48419:60:0;;;17835:21:1;17892:2;17872:18;;;17865:30;17931:33;17911:18;;;17904:61;17982:18;;48419:60:0;17651:355:1;48419:60:0;48531:13;48546:18;:7;:16;:18::i;:::-;48514:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48500:66;;48320:254;;;:::o;45178:865::-;45286:8;;;;;;;45278:32;;;;-1:-1:-1;;;45278:32:0;;19708:2:1;45278:32:0;;;19690:21:1;19747:2;19727:18;;;19720:30;-1:-1:-1;;;19766:18:1;;;19759:41;19817:18;;45278:32:0;19506:335:1;45278:32:0;45330:11;;;;45329:12;45321:37;;;;-1:-1:-1;;;45321:37:0;;20048:2:1;45321:37:0;;;20030:21:1;20087:2;20067:18;;;20060:30;-1:-1:-1;;;20106:18:1;;;20099:42;20158:18;;45321:37:0;19846:336:1;45321:37:0;45378:11;45390:5;45378:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;45377:19;45369:41;;;;-1:-1:-1;;;45369:41:0;;20670:2:1;45369:41:0;;;20652:21:1;20709:1;20689:18;;;20682:29;-1:-1:-1;;;20727:18:1;;;20720:39;20776:18;;45369:41:0;20468:332:1;45369:41:0;45482:4;45429:49;45445:10;45457:13;45472:5;45429:15;:49::i;:::-;:57;45421:79;;;;-1:-1:-1;;;45421:79:0;;21007:2:1;45421:79:0;;;20989:21:1;21046:1;21026:18;;;21019:29;-1:-1:-1;;;21064:18:1;;;21057:39;21113:18;;45421:79:0;20805:332:1;45421:79:0;42266:4;42317:34;42213:3;42159;42317:34;:::i;:::-;:53;;;;:::i;:::-;36603:10;:17;45519:29;45511:54;;;;-1:-1:-1;;;45511:54:0;;11636:2:1;45511:54:0;;;11618:21:1;11675:2;11655:18;;;11648:30;-1:-1:-1;;;11694:18:1;;;11687:42;11746:18;;45511:54:0;11434:336:1;45511:54:0;42266:4;45605:13;45584:18;;:34;;;;:::i;:::-;:54;;45576:80;;;;-1:-1:-1;;;45576:80:0;;21344:2:1;45576:80:0;;;21326:21:1;21383:2;21363:18;;;21356:30;-1:-1:-1;;;21402:18:1;;;21395:43;21455:18;;45576:80:0;21142:337:1;45576:80:0;42481:1;45675:13;:35;;45667:73;;;;-1:-1:-1;;;45667:73:0;;21686:2:1;45667:73:0;;;21668:21:1;21725:2;21705:18;;;21698:30;21764:27;21744:18;;;21737:55;21809:18;;45667:73:0;21484:349:1;45667:73:0;45794:9;45759:31;45777:13;42419:10;45759:31;:::i;:::-;:44;;45751:73;;;;-1:-1:-1;;;45751:73:0;;22213:2:1;45751:73:0;;;22195:21:1;22252:2;22232:18;;;22225:30;-1:-1:-1;;;22271:18:1;;;22264:46;22327:18;;45751:73:0;22011:340:1;45751:73:0;45849:9;45845:145;45868:13;45864:1;:17;45845:145;;;45903:18;:20;;;:18;:20;;;:::i;:::-;;;;;;45938:40;45948:10;45960:13;36603:10;:17;;36515:113;45938:40;45883:3;;;;:::i;:::-;;;;45845:145;;;;46031:4;46010:11;46022:5;46010:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;-1:-1:-1;;46010:25:0;;;;;;;;;-1:-1:-1;;;45178:865:0:o;42277:93::-;42266:4;42317:34;42213:3;42159;42317:34;:::i;:::-;:53;;;;:::i;:::-;42277:93;:::o;48211:97::-;48255:13;48288:12;48281:19;;;;;:::i;12634:192::-;11807:6;;-1:-1:-1;;;;;11807:6:0;8699:10;11954:23;11946:68;;;;-1:-1:-1;;;11946:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12723:22:0;::::1;12715:73;;;::::0;-1:-1:-1;;;12715:73:0;;22558:2:1;12715:73:0::1;::::0;::::1;22540:21:1::0;22597:2;22577:18;;;22570:30;22636:34;22616:18;;;22609:62;-1:-1:-1;;;22687:18:1;;;22680:36;22733:19;;12715:73:0::1;22356:402:1::0;12715:73:0::1;12799:19;12809:8;12799:9;:19::i;22934:305::-:0;23036:4;-1:-1:-1;;;;;;23073:40:0;;-1:-1:-1;;;23073:40:0;;:105;;-1:-1:-1;;;;;;;23130:48:0;;-1:-1:-1;;;23130:48:0;23073:105;:158;;;-1:-1:-1;;;;;;;;;;14573:40:0;;;23195:36;14464:157;32814:174;32889:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32889:29:0;-1:-1:-1;;;;;32889:29:0;;;;;;;;:24;;32943:23;32889:24;32943:14;:23::i;:::-;-1:-1:-1;;;;;32934:46:0;;;;;;;;;;;32814:174;;:::o;29126:348::-;29219:4;28921:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28921:16:0;29236:73;;;;-1:-1:-1;;;29236:73:0;;22965:2:1;29236:73:0;;;22947:21:1;23004:2;22984:18;;;22977:30;23043:34;23023:18;;;23016:62;-1:-1:-1;;;23094:18:1;;;23087:42;23146:19;;29236:73:0;22763:408:1;29236:73:0;29320:13;29336:23;29351:7;29336:14;:23::i;:::-;29320:39;;29389:5;-1:-1:-1;;;;;29378:16:0;:7;-1:-1:-1;;;;;29378:16:0;;:51;;;;29422:7;-1:-1:-1;;;;;29398:31:0;:20;29410:7;29398:11;:20::i;:::-;-1:-1:-1;;;;;29398:31:0;;29378:51;:87;;;-1:-1:-1;;;;;;26218:25:0;;;26194:4;26218:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29433:32;29370:96;29126:348;-1:-1:-1;;;;29126:348:0:o;32118:578::-;32277:4;-1:-1:-1;;;;;32250:31:0;:23;32265:7;32250:14;:23::i;:::-;-1:-1:-1;;;;;32250:31:0;;32242:85;;;;-1:-1:-1;;;32242:85:0;;23378:2:1;32242:85:0;;;23360:21:1;23417:2;23397:18;;;23390:30;23456:34;23436:18;;;23429:62;-1:-1:-1;;;23507:18:1;;;23500:39;23556:19;;32242:85:0;23176:405:1;32242:85:0;-1:-1:-1;;;;;32346:16:0;;32338:65;;;;-1:-1:-1;;;32338:65:0;;23788:2:1;32338:65:0;;;23770:21:1;23827:2;23807:18;;;23800:30;23866:34;23846:18;;;23839:62;-1:-1:-1;;;23917:18:1;;;23910:34;23961:19;;32338:65:0;23586:400:1;32338:65:0;32416:39;32437:4;32443:2;32447:7;32416:20;:39::i;:::-;32520:29;32537:1;32541:7;32520:8;:29::i;:::-;-1:-1:-1;;;;;32562:15:0;;;;;;:9;:15;;;;;:20;;32581:1;;32562:15;:20;;32581:1;;32562:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32593:13:0;;;;;;:9;:13;;;;;:18;;32610:1;;32593:13;:18;;32610:1;;32593:18;:::i;:::-;;;;-1:-1:-1;;32622:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32622:21:0;-1:-1:-1;;;;;32622:21:0;;;;;;;;;32661:27;;32622:16;;32661:27;;;;;;;32118:578;;;:::o;29816:110::-;29892:26;29902:2;29906:7;29892:26;;;;;;;;;;;;:9;:26::i;:::-;29816:110;;:::o;12834:173::-;12909:6;;;-1:-1:-1;;;;;12926:17:0;;;-1:-1:-1;;;;;;12926:17:0;;;;;;;12959:40;;12909:6;;;12926:17;12909:6;;12959:40;;12890:16;;12959:40;12879:128;12834:173;:::o;28204:315::-;28361:28;28371:4;28377:2;28381:7;28361:9;:28::i;:::-;28408:48;28431:4;28437:2;28441:7;28450:5;28408:22;:48::i;:::-;28400:111;;;;-1:-1:-1;;;28400:111:0;;;;;;;:::i;9063:723::-;9119:13;9340:10;9336:53;;-1:-1:-1;;9367:10:0;;;;;;;;;;;;-1:-1:-1;;;9367:10:0;;;;;9063:723::o;9336:53::-;9414:5;9399:12;9455:78;9462:9;;9455:78;;9488:8;;;;:::i;:::-;;-1:-1:-1;9511:10:0;;-1:-1:-1;9519:2:0;9511:10;;:::i;:::-;;;9455:78;;;9543:19;9575:6;9565:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9565:17:0;;9543:39;;9593:154;9600:10;;9593:154;;9627:11;9637:1;9627:11;;:::i;:::-;;-1:-1:-1;9696:10:0;9704:2;9696:5;:10;:::i;:::-;9683:24;;:2;:24;:::i;:::-;9670:39;;9653:6;9660;9653:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9653:56:0;;;;;;;;-1:-1:-1;9724:11:0;9733:2;9724:11;;:::i;:::-;;;9593:154;;44838:328;44934:7;44956:12;45088:6;45096:3;45101:5;45071:36;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;45071:36:0;;;;;;;;;;45061:47;;45071:36;45061:47;;;;25493:66:1;44981:128:0;;;25481:79:1;;;;25576:12;;;25569:28;25613:12;;44981:128:0;;;;;;-1:-1:-1;;44981:128:0;;;;;;44971:151;;44981:128;44971:151;;;;;44838:328;-1:-1:-1;;;;;44838:328:0:o;37551:589::-;-1:-1:-1;;;;;37757:18:0;;37753:187;;37792:40;37824:7;38967:10;:17;;38940:24;;;;:15;:24;;;;;:44;;;38995:24;;;;;;;;;;;;38863:164;37792:40;37753:187;;;37862:2;-1:-1:-1;;;;;37854:10:0;:4;-1:-1:-1;;;;;37854:10:0;;37850:90;;37881:47;37914:4;37920:7;37881:32;:47::i;:::-;-1:-1:-1;;;;;37954:16:0;;37950:183;;37987:45;38024:7;37987:36;:45::i;37950:183::-;38060:4;-1:-1:-1;;;;;38054:10:0;:2;-1:-1:-1;;;;;38054:10:0;;38050:83;;38081:40;38109:2;38113:7;38081:27;:40::i;30153:321::-;30283:18;30289:2;30293:7;30283:5;:18::i;:::-;30334:54;30365:1;30369:2;30373:7;30382:5;30334:22;:54::i;:::-;30312:154;;;;-1:-1:-1;;;30312:154:0;;;;;;;:::i;33553:799::-;33708:4;-1:-1:-1;;;;;33729:13:0;;1069:20;1117:8;33725:620;;33765:72;;-1:-1:-1;;;33765:72:0;;-1:-1:-1;;;;;33765:36:0;;;;;:72;;8699:10;;33816:4;;33822:7;;33831:5;;33765:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33765:72:0;;;;;;;;-1:-1:-1;;33765:72:0;;;;;;;;;;;;:::i;:::-;;;33761:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34007:13:0;;34003:272;;34050:60;;-1:-1:-1;;;34050:60:0;;;;;;;:::i;34003:272::-;34225:6;34219:13;34210:6;34206:2;34202:15;34195:38;33761:529;-1:-1:-1;;;;;;33888:51:0;-1:-1:-1;;;33888:51:0;;-1:-1:-1;33881:58:0;;33725:620;-1:-1:-1;34329:4:0;33553:799;;;;;;:::o;39654:988::-;39920:22;39970:1;39945:22;39962:4;39945:16;:22::i;:::-;:26;;;;:::i;:::-;39982:18;40003:26;;;:17;:26;;;;;;39920:51;;-1:-1:-1;40136:28:0;;;40132:328;;-1:-1:-1;;;;;40203:18:0;;40181:19;40203:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40254:30;;;;;;:44;;;40371:30;;:17;:30;;;;;:43;;;40132:328;-1:-1:-1;40556:26:0;;;;:17;:26;;;;;;;;40549:33;;;-1:-1:-1;;;;;40600:18:0;;;;;:12;:18;;;;;:34;;;;;;;40593:41;39654:988::o;40937:1079::-;41215:10;:17;41190:22;;41215:21;;41235:1;;41215:21;:::i;:::-;41247:18;41268:24;;;:15;:24;;;;;;41641:10;:26;;41190:46;;-1:-1:-1;41268:24:0;;41190:46;;41641:26;;;;;;:::i;:::-;;;;;;;;;41619:48;;41705:11;41680:10;41691;41680:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;41785:28;;;:15;:28;;;;;;;:41;;;41957:24;;;;;41950:31;41992:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41008:1008;;;40937:1079;:::o;38441:221::-;38526:14;38543:20;38560:2;38543:16;:20::i;:::-;-1:-1:-1;;;;;38574:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38619:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38441:221:0:o;30810:382::-;-1:-1:-1;;;;;30890:16:0;;30882:61;;;;-1:-1:-1;;;30882:61:0;;26729:2:1;30882:61:0;;;26711:21:1;;;26748:18;;;26741:30;26807:34;26787:18;;;26780:62;26859:18;;30882:61:0;26527:356:1;30882:61:0;28897:4;28921:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28921:16:0;:30;30954:58;;;;-1:-1:-1;;;30954:58:0;;27090:2:1;30954:58:0;;;27072:21:1;27129:2;27109:18;;;27102:30;27168;27148:18;;;27141:58;27216:18;;30954:58:0;26888:352:1;30954:58:0;31025:45;31054:1;31058:2;31062:7;31025:20;:45::i;:::-;-1:-1:-1;;;;;31083:13:0;;;;;;:9;:13;;;;;:18;;31100:1;;31083:13;:18;;31100:1;;31083:18;:::i;:::-;;;;-1:-1:-1;;31112:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31112:21:0;-1:-1:-1;;;;;31112:21:0;;;;;;;;31151:33;;31112:16;;;31151:33;;31112:16;;31151:33;30810:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;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;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:186::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;921:29;940:9;921:29;:::i;961:258::-;1033:1;1043:113;1057:6;1054:1;1051:13;1043:113;;;1133:11;;;1127:18;1114:11;;;1107:39;1079:2;1072:10;1043:113;;;1174:6;1171:1;1168:13;1165:48;;;-1:-1:-1;;1209:1:1;1191:16;;1184:27;961:258::o;1224:269::-;1277:3;1315:5;1309:12;1342:6;1337:3;1330:19;1358:63;1414:6;1407:4;1402:3;1398:14;1391:4;1384:5;1380:16;1358:63;:::i;:::-;1475:2;1454:15;-1:-1:-1;;1450:29:1;1441:39;;;;1482:4;1437:50;;1224:269;-1:-1:-1;;1224:269:1:o;1498:231::-;1647:2;1636:9;1629:21;1610:4;1667:56;1719:2;1708:9;1704:18;1696:6;1667:56;:::i;1734:180::-;1793:6;1846:2;1834:9;1825:7;1821:23;1817:32;1814:52;;;1862:1;1859;1852:12;1814:52;-1:-1:-1;1885:23:1;;1734:180;-1:-1:-1;1734:180:1:o;2127:254::-;2195:6;2203;2256:2;2244:9;2235:7;2231:23;2227:32;2224:52;;;2272:1;2269;2262:12;2224:52;2295:29;2314:9;2295:29;:::i;:::-;2285:39;2371:2;2356:18;;;;2343:32;;-1:-1:-1;;;2127:254:1:o;2568:328::-;2645:6;2653;2661;2714:2;2702:9;2693:7;2689:23;2685:32;2682:52;;;2730:1;2727;2720:12;2682:52;2753:29;2772:9;2753:29;:::i;:::-;2743:39;;2801:38;2835:2;2824:9;2820:18;2801:38;:::i;:::-;2791:48;;2886:2;2875:9;2871:18;2858:32;2848:42;;2568:328;;;;;:::o;2901:592::-;2972:6;2980;3033:2;3021:9;3012:7;3008:23;3004:32;3001:52;;;3049:1;3046;3039:12;3001:52;3089:9;3076:23;3118:18;3159:2;3151:6;3148:14;3145:34;;;3175:1;3172;3165:12;3145:34;3213:6;3202:9;3198:22;3188:32;;3258:7;3251:4;3247:2;3243:13;3239:27;3229:55;;3280:1;3277;3270:12;3229:55;3320:2;3307:16;3346:2;3338:6;3335:14;3332:34;;;3362:1;3359;3352:12;3332:34;3407:7;3402:2;3393:6;3389:2;3385:15;3381:24;3378:37;3375:57;;;3428:1;3425;3418:12;3375:57;3459:2;3451:11;;;;;3481:6;;-1:-1:-1;2901:592:1;;-1:-1:-1;;;;2901:592:1:o;3498:367::-;3561:8;3571:6;3625:3;3618:4;3610:6;3606:17;3602:27;3592:55;;3643:1;3640;3633:12;3592:55;-1:-1:-1;3666:20:1;;3709:18;3698:30;;3695:50;;;3741:1;3738;3731:12;3695:50;3778:4;3770:6;3766:17;3754:29;;3838:3;3831:4;3821:6;3818:1;3814:14;3806:6;3802:27;3798:38;3795:47;3792:67;;;3855:1;3852;3845:12;3792:67;3498:367;;;;;:::o;3870:773::-;3992:6;4000;4008;4016;4069:2;4057:9;4048:7;4044:23;4040:32;4037:52;;;4085:1;4082;4075:12;4037:52;4125:9;4112:23;4154:18;4195:2;4187:6;4184:14;4181:34;;;4211:1;4208;4201:12;4181:34;4250:70;4312:7;4303:6;4292:9;4288:22;4250:70;:::i;:::-;4339:8;;-1:-1:-1;4224:96:1;-1:-1:-1;4427:2:1;4412:18;;4399:32;;-1:-1:-1;4443:16:1;;;4440:36;;;4472:1;4469;4462:12;4440:36;;4511:72;4575:7;4564:8;4553:9;4549:24;4511:72;:::i;:::-;3870:773;;;;-1:-1:-1;4602:8:1;-1:-1:-1;;;;3870:773:1:o;4648:347::-;4713:6;4721;4774:2;4762:9;4753:7;4749:23;4745:32;4742:52;;;4790:1;4787;4780:12;4742:52;4813:29;4832:9;4813:29;:::i;:::-;4803:39;;4892:2;4881:9;4877:18;4864:32;4939:5;4932:13;4925:21;4918:5;4915:32;4905:60;;4961:1;4958;4951:12;4905:60;4984:5;4974:15;;;4648:347;;;;;:::o;5000:437::-;5086:6;5094;5147:2;5135:9;5126:7;5122:23;5118:32;5115:52;;;5163:1;5160;5153:12;5115:52;5203:9;5190:23;5236:18;5228:6;5225:30;5222:50;;;5268:1;5265;5258:12;5222:50;5307:70;5369:7;5360:6;5349:9;5345:22;5307:70;:::i;:::-;5396:8;;5281:96;;-1:-1:-1;5000:437:1;-1:-1:-1;;;;5000:437:1:o;5442:127::-;5503:10;5498:3;5494:20;5491:1;5484:31;5534:4;5531:1;5524:15;5558:4;5555:1;5548:15;5574:631;5638:5;5668:18;5709:2;5701:6;5698:14;5695:40;;;5715:18;;:::i;:::-;5790:2;5784:9;5758:2;5844:15;;-1:-1:-1;;5840:24:1;;;5866:2;5836:33;5832:42;5820:55;;;5890:18;;;5910:22;;;5887:46;5884:72;;;5936:18;;:::i;:::-;5976:10;5972:2;5965:22;6005:6;5996:15;;6035:6;6027;6020:22;6075:3;6066:6;6061:3;6057:16;6054:25;6051:45;;;6092:1;6089;6082:12;6051:45;6142:6;6137:3;6130:4;6122:6;6118:17;6105:44;6197:1;6190:4;6181:6;6173;6169:19;6165:30;6158:41;;;;5574:631;;;;;:::o;6210:666::-;6305:6;6313;6321;6329;6382:3;6370:9;6361:7;6357:23;6353:33;6350:53;;;6399:1;6396;6389:12;6350:53;6422:29;6441:9;6422:29;:::i;:::-;6412:39;;6470:38;6504:2;6493:9;6489:18;6470:38;:::i;:::-;6460:48;;6555:2;6544:9;6540:18;6527:32;6517:42;;6610:2;6599:9;6595:18;6582:32;6637:18;6629:6;6626:30;6623:50;;;6669:1;6666;6659:12;6623:50;6692:22;;6745:4;6737:13;;6733:27;-1:-1:-1;6723:55:1;;6774:1;6771;6764:12;6723:55;6797:73;6862:7;6857:2;6844:16;6839:2;6835;6831:11;6797:73;:::i;:::-;6787:83;;;6210:666;;;;;;;:::o;6881:586::-;6968:6;6976;6984;7037:2;7025:9;7016:7;7012:23;7008:32;7005:52;;;7053:1;7050;7043:12;7005:52;7089:9;7076:23;7066:33;;7150:2;7139:9;7135:18;7122:32;7177:18;7169:6;7166:30;7163:50;;;7209:1;7206;7199:12;7163:50;7232:22;;7285:4;7277:13;;7273:27;-1:-1:-1;7263:55:1;;7314:1;7311;7304:12;7263:55;7337:73;7402:7;7397:2;7384:16;7379:2;7375;7371:11;7337:73;:::i;:::-;7327:83;;;7457:2;7446:9;7442:18;7429:32;7419:42;;6881:586;;;;;:::o;7472:260::-;7540:6;7548;7601:2;7589:9;7580:7;7576:23;7572:32;7569:52;;;7617:1;7614;7607:12;7569:52;7640:29;7659:9;7640:29;:::i;:::-;7630:39;;7688:38;7722:2;7711:9;7707:18;7688:38;:::i;:::-;7678:48;;7472:260;;;;;:::o;7737:356::-;7939:2;7921:21;;;7958:18;;;7951:30;8017:34;8012:2;7997:18;;7990:62;8084:2;8069:18;;7737:356::o;8098:380::-;8177:1;8173:12;;;;8220;;;8241:61;;8295:4;8287:6;8283:17;8273:27;;8241:61;8348:2;8340:6;8337:14;8317:18;8314:38;8311:161;;;8394:10;8389:3;8385:20;8382:1;8375:31;8429:4;8426:1;8419:15;8457:4;8454:1;8447:15;8311:161;;8098:380;;;:::o;9723:413::-;9925:2;9907:21;;;9964:2;9944:18;;;9937:30;10003:34;9998:2;9983:18;;9976:62;-1:-1:-1;;;10069:2:1;10054:18;;10047:47;10126:3;10111:19;;9723:413::o;11169:127::-;11230:10;11225:3;11221:20;11218:1;11211:31;11261:4;11258:1;11251:15;11285:4;11282:1;11275:15;11301:128;11341:3;11372:1;11368:6;11365:1;11362:13;11359:39;;;11378:18;;:::i;:::-;-1:-1:-1;11414:9:1;;11301:128::o;11775:135::-;11814:3;-1:-1:-1;;11835:17:1;;11832:43;;;11855:18;;:::i;:::-;-1:-1:-1;11902:1:1;11891:13;;11775:135::o;12740:127::-;12801:10;12796:3;12792:20;12789:1;12782:31;12832:4;12829:1;12822:15;12856:4;12853:1;12846:15;12872:400;13074:2;13056:21;;;13113:2;13093:18;;;13086:30;13152:34;13147:2;13132:18;;13125:62;-1:-1:-1;;;13218:2:1;13203:18;;13196:34;13262:3;13247:19;;12872:400::o;17521:125::-;17561:4;17589:1;17586;17583:8;17580:34;;;17594:18;;:::i;:::-;-1:-1:-1;17631:9:1;;17521:125::o;18137:185::-;18179:3;18217:5;18211:12;18232:52;18277:6;18272:3;18265:4;18258:5;18254:16;18232:52;:::i;:::-;18300:16;;;;;18137:185;-1:-1:-1;;18137:185:1:o;18327:1174::-;18503:3;18532:1;18565:6;18559:13;18595:3;18617:1;18645:9;18641:2;18637:18;18627:28;;18705:2;18694:9;18690:18;18727;18717:61;;18771:4;18763:6;18759:17;18749:27;;18717:61;18797:2;18845;18837:6;18834:14;18814:18;18811:38;18808:165;;;-1:-1:-1;;;18872:33:1;;18928:4;18925:1;18918:15;18958:4;18879:3;18946:17;18808:165;18989:18;19016:104;;;;19134:1;19129:320;;;;18982:467;;19016:104;-1:-1:-1;;19049:24:1;;19037:37;;19094:16;;;;-1:-1:-1;19016:104:1;;19129:320;18084:1;18077:14;;;18121:4;18108:18;;19224:1;19238:165;19252:6;19249:1;19246:13;19238:165;;;19330:14;;19317:11;;;19310:35;19373:16;;;;19267:10;;19238:165;;;19242:3;;19432:6;19427:3;19423:16;19416:23;;18982:467;;;;;;;19465:30;19491:3;19483:6;19465:30;:::i;:::-;19458:37;18327:1174;-1:-1:-1;;;;;18327:1174:1:o;20187:276::-;20318:3;20356:6;20350:13;20372:53;20418:6;20413:3;20406:4;20398:6;20394:17;20372:53;:::i;:::-;20441:16;;;;;20187:276;-1:-1:-1;;20187:276:1:o;21838:168::-;21878:7;21944:1;21940;21936:6;21932:14;21929:1;21926:21;21921:1;21914:9;21907:17;21903:45;21900:71;;;21951:18;;:::i;:::-;-1:-1:-1;21991:9:1;;21838:168::o;23991:414::-;24193:2;24175:21;;;24232:2;24212:18;;;24205:30;24271:34;24266:2;24251:18;;24244:62;-1:-1:-1;;;24337:2:1;24322:18;;24315:48;24395:3;24380:19;;23991:414::o;24410:127::-;24471:10;24466:3;24462:20;24459:1;24452:31;24502:4;24499:1;24492:15;24526:4;24523:1;24516:15;24542:120;24582:1;24608;24598:35;;24613:18;;:::i;:::-;-1:-1:-1;24647:9:1;;24542:120::o;24667:112::-;24699:1;24725;24715:35;;24730:18;;:::i;:::-;-1:-1:-1;24764:9:1;;24667:112::o;24784:462::-;25026:26;25022:31;25013:6;25009:2;25005:15;25001:53;24996:3;24989:66;25085:6;25080:2;25075:3;25071:12;25064:28;24971:3;25121:6;25115:13;25137:62;25192:6;25187:2;25182:3;25178:12;25171:4;25163:6;25159:17;25137:62;:::i;:::-;25219:16;;;;25237:2;25215:25;;24784:462;-1:-1:-1;;;;24784:462:1:o;25636:500::-;-1:-1:-1;;;;;25905:15:1;;;25887:34;;25957:15;;25952:2;25937:18;;25930:43;26004:2;25989:18;;25982:34;;;26052:3;26047:2;26032:18;;26025:31;;;25830:4;;26073:57;;26110:19;;26102:6;26073:57;:::i;:::-;26065:65;25636:500;-1:-1:-1;;;;;;25636:500:1:o;26141:249::-;26210:6;26263:2;26251:9;26242:7;26238:23;26234:32;26231:52;;;26279:1;26276;26269:12;26231:52;26311:9;26305:16;26330:30;26354:5;26330:30;:::i;26395:127::-;26456:10;26451:3;26447:20;26444:1;26437:31;26487:4;26484:1;26477:15;26511:4;26508:1;26501:15
Swarm Source
ipfs://bb1e28f2fe3d5f25a05e8965a1c8881fad73d865c5f77f6b4a2d291ad807cbfa
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.