Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
7,464 EVOBOTB
Holders
1,843
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 EVOBOTBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BullsOnTheBlockEvo
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-15 */ pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT /** * @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 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 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); } /** * @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); } /** * @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 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 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 {} } /** * @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); } /** * @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(); } } /** * @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); } } abstract contract OGB { function ownerOf(uint256 tokenId) public virtual view returns (address); function safeTransferFrom(address from, address to, uint256 tokenId) public virtual; function isApprovedForAll(address owner, address operator) external virtual view returns (bool); } contract BullsOnTheBlockEvo is ERC721Enumerable, Ownable { OGB private ogb; address public OG_VAULT; string private baseURI; mapping(uint256 => uint256) tokenToTimeVaulted; bool public godsAreReleased = false; bool public evolveIsActive = false; event Evolve(address _from, uint256 _tokenId); event EvolveMultiple(address _from, uint256[] _tokenIds); constructor() ERC721("BullsOnTheBlock Evo","EVOBOTB"){ ogb = OGB(0x3a8778A58993bA4B941f85684D74750043A4bB5f); } function flipSaleState() public onlyOwner { evolveIsActive = !evolveIsActive; } function evolveBull(uint256 _tokenId) public { require(evolveIsActive, "Evolving is not active"); require(ogb.ownerOf(_tokenId) == msg.sender, "You must own the requested ID."); require(ogb.isApprovedForAll(msg.sender, address(this)), "Contract is not approved to transfer your OG Bull."); // Transfer OG Bull to the OG OG_VAULT // Store timestamp in mapping to token ID ogb.safeTransferFrom(msg.sender, OG_VAULT, _tokenId); tokenToTimeVaulted[_tokenId] = block.timestamp; // Mint Evolved Bull _safeMint(msg.sender, _tokenId); emit Evolve(msg.sender, _tokenId); } function evolveNBulls(uint256[] memory _tokenIds) public { require(evolveIsActive, "Evolving is not active"); require(ogb.isApprovedForAll(msg.sender, address(this)), "Contract is not approved to transfer your OG Bull."); require(_tokenIds.length < 21, "Can't evolve more than 20 Bulls at once."); for (uint i = 0; i < _tokenIds.length; i++) { require(ogb.ownerOf(_tokenIds[i]) == msg.sender, "You must own the requested ID"); // Transfer OG Bull to the OG OG_VAULT // Store timestamp in mapping to token ID ogb.safeTransferFrom(msg.sender, OG_VAULT, _tokenIds[i]); tokenToTimeVaulted[_tokenIds[i]] = block.timestamp; // Mint Evolved Bull _safeMint(msg.sender, _tokenIds[i]); } emit EvolveMultiple(msg.sender, _tokenIds); } function isEvolved(uint256 _tokenId) external view returns (bool) { require(_tokenId < 10000, "Token id outside collection bounds!"); return _exists(_tokenId); } function mintPhoenix() external onlyOwner { require(!_exists(10000), "Phoenix already minted."); _safeMint(msg.sender, 10000); } // Hi there, you like to read code and be a nerd just like me? // You're probably wondering what this function is used for... // Only GOD knows! function releaseTheGods() external onlyOwner { require(!godsAreReleased, "Gods have already been released"); for (uint i = 10001; i < 10005; i++) { _safeMint(msg.sender, i); } godsAreReleased = true; } function getTimeVaulted(uint256 tokenId) external view returns (uint256){ require(tokenToTimeVaulted[tokenId] > 0, "Not vaulted yet"); return tokenToTimeVaulted[tokenId]; } function setOGVault(address _address) external onlyOwner { OG_VAULT = _address; } function _baseURI() internal view override returns (string memory) { return baseURI; } function setBaseURI(string memory uri) public onlyOwner { baseURI = uri; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Evolve","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"EvolveMultiple","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":"OG_VAULT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"evolveBull","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"evolveIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"evolveNBulls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTimeVaulted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"godsAreReleased","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isEvolved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPhoenix","outputs":[],"stateMutability":"nonpayable","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":"releaseTheGods","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setOGVault","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":[{"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"}]
Contract Creation Code
60806040526000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280601381526020017f42756c6c734f6e546865426c6f636b2045766f000000000000000000000000008152506040518060400160405280600781526020017f45564f424f5442000000000000000000000000000000000000000000000000008152508160009080519060200190620000cc92919062000231565b508060019080519060200190620000e592919062000231565b50505062000108620000fc6200016360201b60201c565b6200016b60201b60201c565b733a8778a58993ba4b941f85684d74750043a4bb5f600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000346565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023f90620002e1565b90600052602060002090601f016020900481019282620002635760008555620002af565b82601f106200027e57805160ff1916838001178555620002af565b82800160010185558215620002af579182015b82811115620002ae57825182559160200191906001019062000291565b5b509050620002be9190620002c2565b5090565b5b80821115620002dd576000816000905550600101620002c3565b5090565b60006002820490506001821680620002fa57607f821691505b6020821081141562000311576200031062000317565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6149b280620003566000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80634f6ccce71161010f578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd14610544578063e985e9c514610574578063f2fde38b146105a4578063fbe21acf146105c0576101e5565b8063a22cb465146104e6578063a87b263a14610502578063aba6d45c1461051e578063b88d4fde14610528576101e5565b8063715018a6116100de578063715018a614610484578063860f491b1461048e5780638da5cb5b146104aa57806395d89b41146104c8576101e5565b80634f6ccce7146103d857806355f804b3146104085780636352211e1461042457806370a0823114610454576101e5565b806323b872dd11610187578063419a470d11610156578063419a470d1461033e57806342842e0e1461036e578063435ee5871461038a5780634918f947146103a8576101e5565b806323b872dd146102ca5780632d91c502146102e65780632f745c591461030457806334918dfd14610334576101e5565b8063095ea7b3116101c3578063095ea7b314610268578063137118f51461028457806318160ddd146102a25780631cc6f335146102c0576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff91906134aa565b6105dc565b6040516102119190614145565b60405180910390f35b610222610656565b60405161022f9190614160565b60405180910390f35b610252600480360381019061024d919061353d565b6106e8565b60405161025f9190614025565b60405180910390f35b610282600480360381019061027d9190613404565b61076d565b005b61028c610885565b6040516102999190614145565b60405180910390f35b6102aa610898565b6040516102b791906144e2565b60405180910390f35b6102c86108a5565b005b6102e460048036038101906102df91906132fe565b6109be565b005b6102ee610a1e565b6040516102fb9190614145565b60405180910390f35b61031e60048036038101906103199190613404565b610a31565b60405161032b91906144e2565b60405180910390f35b61033c610ad6565b005b6103586004803603810190610353919061353d565b610b7e565b60405161036591906144e2565b60405180910390f35b610388600480360381019061038391906132fe565b610bf0565b005b610392610c10565b60405161039f9190614025565b60405180910390f35b6103c260048036038101906103bd919061353d565b610c36565b6040516103cf9190614145565b60405180910390f35b6103f260048036038101906103ed919061353d565b610c8c565b6040516103ff91906144e2565b60405180910390f35b610422600480360381019061041d91906134fc565b610d23565b005b61043e6004803603810190610439919061353d565b610db9565b60405161044b9190614025565b60405180910390f35b61046e60048036038101906104699190613270565b610e6b565b60405161047b91906144e2565b60405180910390f35b61048c610f23565b005b6104a860048036038101906104a3919061353d565b610fab565b005b6104b261130f565b6040516104bf9190614025565b60405180910390f35b6104d0611339565b6040516104dd9190614160565b60405180910390f35b61050060048036038101906104fb91906133c8565b6113cb565b005b61051c60048036038101906105179190613440565b61154c565b005b610526611a14565b005b610542600480360381019061053d919061334d565b611ae9565b005b61055e6004803603810190610559919061353d565b611b4b565b60405161056b9190614160565b60405180910390f35b61058e600480360381019061058991906132c2565b611bf2565b60405161059b9190614145565b60405180910390f35b6105be60048036038101906105b99190613270565b611c86565b005b6105da60048036038101906105d59190613270565b611d7e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064f575061064e82611e3e565b5b9050919050565b606060008054610665906147a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610691906147a7565b80156106de5780601f106106b3576101008083540402835291602001916106de565b820191906000526020600020905b8154815290600101906020018083116106c157829003601f168201915b5050505050905090565b60006106f382611f20565b610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990614322565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077882610db9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e090614422565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610808611f8c565b73ffffffffffffffffffffffffffffffffffffffff161480610837575061083681610831611f8c565b611bf2565b5b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d90614282565b60405180910390fd5b6108808383611f94565b505050565b600f60009054906101000a900460ff1681565b6000600880549050905090565b6108ad611f8c565b73ffffffffffffffffffffffffffffffffffffffff166108cb61130f565b73ffffffffffffffffffffffffffffffffffffffff1614610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091890614342565b60405180910390fd5b600f60009054906101000a900460ff1615610971576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610968906143e2565b60405180910390fd5b600061271190505b6127158110156109a05761098d338261204d565b8080610998906147d9565b915050610979565b506001600f60006101000a81548160ff021916908315150217905550565b6109cf6109c9611f8c565b8261206b565b610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0590614482565b60405180910390fd5b610a19838383612149565b505050565b600f60019054906101000a900460ff1681565b6000610a3c83610e6b565b8210610a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7490614182565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ade611f8c565b73ffffffffffffffffffffffffffffffffffffffff16610afc61130f565b73ffffffffffffffffffffffffffffffffffffffff1614610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4990614342565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b600080600e60008481526020019081526020016000205411610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90614202565b60405180910390fd5b600e6000838152602001908152602001600020549050919050565b610c0b83838360405180602001604052806000815250611ae9565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006127108210610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390614462565b60405180910390fd5b610c8582611f20565b9050919050565b6000610c96610898565b8210610cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cce906144a2565b60405180910390fd5b60088281548110610d11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610d2b611f8c565b73ffffffffffffffffffffffffffffffffffffffff16610d4961130f565b73ffffffffffffffffffffffffffffffffffffffff1614610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9690614342565b60405180910390fd5b80600d9080519060200190610db5929190612fd4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e59906142c2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed3906142a2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f2b611f8c565b73ffffffffffffffffffffffffffffffffffffffff16610f4961130f565b73ffffffffffffffffffffffffffffffffffffffff1614610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690614342565b60405180910390fd5b610fa960006123a5565b565b600f60019054906101000a900460ff16610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff1906144c2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161106c91906144e2565b60206040518083038186803b15801561108457600080fd5b505afa158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc9190613299565b73ffffffffffffffffffffffffffffffffffffffff1614611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990614442565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161116f929190614040565b60206040518083038186803b15801561118757600080fd5b505afa15801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf9190613481565b6111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f5906143a2565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e33600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161127f93929190614069565b600060405180830381600087803b15801561129957600080fd5b505af11580156112ad573d6000803e3d6000fd5b5050505042600e6000838152602001908152602001600020819055506112d3338261204d565b7fc09feda7adb0a8bbe69c92dbe769d478537a966979f11dff2dda8bc034dba19d338260405161130492919061411c565b60405180910390a150565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611348906147a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611374906147a7565b80156113c15780601f10611396576101008083540402835291602001916113c1565b820191906000526020600020905b8154815290600101906020018083116113a457829003601f168201915b5050505050905090565b6113d3611f8c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143890614242565b60405180910390fd5b806005600061144e611f8c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114fb611f8c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115409190614145565b60405180910390a35050565b600f60019054906101000a900460ff1661159b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611592906144c2565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b81526004016115f8929190614040565b60206040518083038186803b15801561161057600080fd5b505afa158015611624573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116489190613481565b611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e906143a2565b60405180910390fd5b60158151106116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c2906142e2565b60405180910390fd5b60005b81518110156119d7573373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110611765577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161178991906144e2565b60206040518083038186803b1580156117a157600080fd5b505afa1580156117b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d99190613299565b73ffffffffffffffffffffffffffffffffffffffff161461182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690614402565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e33600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168585815181106118ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b81526004016118f093929190614069565b600060405180830381600087803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b5050505042600e6000848481518110611960577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020819055506119c4338383815181106119b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161204d565b80806119cf906147d9565b9150506116ce565b507f84c402511619bfc9ed8455e82496328241db037c2d0e4c46a671e04d300c1bb33382604051611a099291906140ec565b60405180910390a150565b611a1c611f8c565b73ffffffffffffffffffffffffffffffffffffffff16611a3a61130f565b73ffffffffffffffffffffffffffffffffffffffff1614611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8790614342565b60405180910390fd5b611a9b612710611f20565b15611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad2906143c2565b60405180910390fd5b611ae73361271061204d565b565b611afa611af4611f8c565b8361206b565b611b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3090614482565b60405180910390fd5b611b458484848461246b565b50505050565b6060611b5682611f20565b611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90614382565b60405180910390fd5b6000611b9f6124c7565b90506000815111611bbf5760405180602001604052806000815250611bea565b80611bc984612559565b604051602001611bda929190614001565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c8e611f8c565b73ffffffffffffffffffffffffffffffffffffffff16611cac61130f565b73ffffffffffffffffffffffffffffffffffffffff1614611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf990614342565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d69906141c2565b60405180910390fd5b611d7b816123a5565b50565b611d86611f8c565b73ffffffffffffffffffffffffffffffffffffffff16611da461130f565b73ffffffffffffffffffffffffffffffffffffffff1614611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df190614342565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f0957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f195750611f1882612706565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661200783610db9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612067828260405180602001604052806000815250612770565b5050565b600061207682611f20565b6120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac90614262565b60405180910390fd5b60006120c083610db9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061212f57508373ffffffffffffffffffffffffffffffffffffffff16612117846106e8565b73ffffffffffffffffffffffffffffffffffffffff16145b80612140575061213f8185611bf2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661216982610db9565b73ffffffffffffffffffffffffffffffffffffffff16146121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b690614362565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561222f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222690614222565b60405180910390fd5b61223a8383836127cb565b612245600082611f94565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461229591906146bd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122ec9190614636565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612476848484612149565b612482848484846128df565b6124c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b8906141a2565b60405180910390fd5b50505050565b6060600d80546124d6906147a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612502906147a7565b801561254f5780601f106125245761010080835404028352916020019161254f565b820191906000526020600020905b81548152906001019060200180831161253257829003601f168201915b5050505050905090565b606060008214156125a1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612701565b600082905060005b600082146125d35780806125bc906147d9565b915050600a826125cc919061468c565b91506125a9565b60008167ffffffffffffffff811115612615577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126475781602001600182028036833780820191505090505b5090505b600085146126fa5760018261266091906146bd565b9150600a8561266f9190614822565b603061267b9190614636565b60f81b8183815181106126b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126f3919061468c565b945061264b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61277a8383612a76565b61278760008484846128df565b6127c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bd906141a2565b60405180910390fd5b505050565b6127d6838383612c44565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128195761281481612c49565b612858565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612857576128568382612c92565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561289b5761289681612dff565b6128da565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146128d9576128d88282612f42565b5b5b505050565b60006129008473ffffffffffffffffffffffffffffffffffffffff16612fc1565b15612a69578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612929611f8c565b8786866040518563ffffffff1660e01b815260040161294b94939291906140a0565b602060405180830381600087803b15801561296557600080fd5b505af192505050801561299657506040513d601f19601f8201168201806040525081019061299391906134d3565b60015b612a19573d80600081146129c6576040519150601f19603f3d011682016040523d82523d6000602084013e6129cb565b606091505b50600081511415612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a08906141a2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a6e565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612add90614302565b60405180910390fd5b612aef81611f20565b15612b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b26906141e2565b60405180910390fd5b612b3b600083836127cb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b8b9190614636565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c9f84610e6b565b612ca991906146bd565b9050600060076000848152602001908152602001600020549050818114612d8e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e1391906146bd565b9050600060096000848152602001908152602001600020549050600060088381548110612e69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612eb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612f4d83610e6b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612fe0906147a7565b90600052602060002090601f0160209004810192826130025760008555613049565b82601f1061301b57805160ff1916838001178555613049565b82800160010185558215613049579182015b8281111561304857825182559160200191906001019061302d565b5b509050613056919061305a565b5090565b5b8082111561307357600081600090555060010161305b565b5090565b600061308a6130858461452e565b6144fd565b905080838252602082019050828560208602820111156130a957600080fd5b60005b858110156130d957816130bf888261325b565b8452602084019350602083019250506001810190506130ac565b5050509392505050565b60006130f66130f18461455a565b6144fd565b90508281526020810184848401111561310e57600080fd5b613119848285614765565b509392505050565b600061313461312f8461458a565b6144fd565b90508281526020810184848401111561314c57600080fd5b613157848285614765565b509392505050565b60008135905061316e81614920565b92915050565b60008151905061318381614920565b92915050565b600082601f83011261319a57600080fd5b81356131aa848260208601613077565b91505092915050565b6000813590506131c281614937565b92915050565b6000815190506131d781614937565b92915050565b6000813590506131ec8161494e565b92915050565b6000815190506132018161494e565b92915050565b600082601f83011261321857600080fd5b81356132288482602086016130e3565b91505092915050565b600082601f83011261324257600080fd5b8135613252848260208601613121565b91505092915050565b60008135905061326a81614965565b92915050565b60006020828403121561328257600080fd5b60006132908482850161315f565b91505092915050565b6000602082840312156132ab57600080fd5b60006132b984828501613174565b91505092915050565b600080604083850312156132d557600080fd5b60006132e38582860161315f565b92505060206132f48582860161315f565b9150509250929050565b60008060006060848603121561331357600080fd5b60006133218682870161315f565b93505060206133328682870161315f565b92505060406133438682870161325b565b9150509250925092565b6000806000806080858703121561336357600080fd5b60006133718782880161315f565b94505060206133828782880161315f565b93505060406133938782880161325b565b925050606085013567ffffffffffffffff8111156133b057600080fd5b6133bc87828801613207565b91505092959194509250565b600080604083850312156133db57600080fd5b60006133e98582860161315f565b92505060206133fa858286016131b3565b9150509250929050565b6000806040838503121561341757600080fd5b60006134258582860161315f565b92505060206134368582860161325b565b9150509250929050565b60006020828403121561345257600080fd5b600082013567ffffffffffffffff81111561346c57600080fd5b61347884828501613189565b91505092915050565b60006020828403121561349357600080fd5b60006134a1848285016131c8565b91505092915050565b6000602082840312156134bc57600080fd5b60006134ca848285016131dd565b91505092915050565b6000602082840312156134e557600080fd5b60006134f3848285016131f2565b91505092915050565b60006020828403121561350e57600080fd5b600082013567ffffffffffffffff81111561352857600080fd5b61353484828501613231565b91505092915050565b60006020828403121561354f57600080fd5b600061355d8482850161325b565b91505092915050565b60006135728383613fe3565b60208301905092915050565b613587816146f1565b82525050565b6000613598826145ca565b6135a281856145f8565b93506135ad836145ba565b8060005b838110156135de5781516135c58882613566565b97506135d0836145eb565b9250506001810190506135b1565b5085935050505092915050565b6135f481614703565b82525050565b6000613605826145d5565b61360f8185614609565b935061361f818560208601614774565b6136288161490f565b840191505092915050565b600061363e826145e0565b613648818561461a565b9350613658818560208601614774565b6136618161490f565b840191505092915050565b6000613677826145e0565b613681818561462b565b9350613691818560208601614774565b80840191505092915050565b60006136aa602b8361461a565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061371060328361461a565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061377660268361461a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137dc601c8361461a565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061381c600f8361461a565b91507f4e6f74207661756c7465642079657400000000000000000000000000000000006000830152602082019050919050565b600061385c60248361461a565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138c260198361461a565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613902602c8361461a565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061396860388361461a565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006139ce602a8361461a565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a3460298361461a565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a9a60288361461a565b91507f43616e27742065766f6c7665206d6f7265207468616e2032302042756c6c732060008301527f6174206f6e63652e0000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b0060208361461a565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613b40602c8361461a565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ba660208361461a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613be660298361461a565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c4c602f8361461a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613cb260328361461a565b91507f436f6e7472616374206973206e6f7420617070726f76656420746f207472616e60008301527f7366657220796f7572204f472042756c6c2e00000000000000000000000000006020830152604082019050919050565b6000613d1860178361461a565b91507f50686f656e697820616c7265616479206d696e7465642e0000000000000000006000830152602082019050919050565b6000613d58601f8361461a565b91507f476f6473206861766520616c7265616479206265656e2072656c6561736564006000830152602082019050919050565b6000613d98601d8361461a565b91507f596f75206d757374206f776e20746865207265717565737465642049440000006000830152602082019050919050565b6000613dd860218361461a565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e3e601e8361461a565b91507f596f75206d757374206f776e20746865207265717565737465642049442e00006000830152602082019050919050565b6000613e7e60238361461a565b91507f546f6b656e206964206f75747369646520636f6c6c656374696f6e20626f756e60008301527f64732100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ee460318361461a565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613f4a602c8361461a565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613fb060168361461a565b91507f45766f6c76696e67206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b613fec8161475b565b82525050565b613ffb8161475b565b82525050565b600061400d828561366c565b9150614019828461366c565b91508190509392505050565b600060208201905061403a600083018461357e565b92915050565b6000604082019050614055600083018561357e565b614062602083018461357e565b9392505050565b600060608201905061407e600083018661357e565b61408b602083018561357e565b6140986040830184613ff2565b949350505050565b60006080820190506140b5600083018761357e565b6140c2602083018661357e565b6140cf6040830185613ff2565b81810360608301526140e181846135fa565b905095945050505050565b6000604082019050614101600083018561357e565b8181036020830152614113818461358d565b90509392505050565b6000604082019050614131600083018561357e565b61413e6020830184613ff2565b9392505050565b600060208201905061415a60008301846135eb565b92915050565b6000602082019050818103600083015261417a8184613633565b905092915050565b6000602082019050818103600083015261419b8161369d565b9050919050565b600060208201905081810360008301526141bb81613703565b9050919050565b600060208201905081810360008301526141db81613769565b9050919050565b600060208201905081810360008301526141fb816137cf565b9050919050565b6000602082019050818103600083015261421b8161380f565b9050919050565b6000602082019050818103600083015261423b8161384f565b9050919050565b6000602082019050818103600083015261425b816138b5565b9050919050565b6000602082019050818103600083015261427b816138f5565b9050919050565b6000602082019050818103600083015261429b8161395b565b9050919050565b600060208201905081810360008301526142bb816139c1565b9050919050565b600060208201905081810360008301526142db81613a27565b9050919050565b600060208201905081810360008301526142fb81613a8d565b9050919050565b6000602082019050818103600083015261431b81613af3565b9050919050565b6000602082019050818103600083015261433b81613b33565b9050919050565b6000602082019050818103600083015261435b81613b99565b9050919050565b6000602082019050818103600083015261437b81613bd9565b9050919050565b6000602082019050818103600083015261439b81613c3f565b9050919050565b600060208201905081810360008301526143bb81613ca5565b9050919050565b600060208201905081810360008301526143db81613d0b565b9050919050565b600060208201905081810360008301526143fb81613d4b565b9050919050565b6000602082019050818103600083015261441b81613d8b565b9050919050565b6000602082019050818103600083015261443b81613dcb565b9050919050565b6000602082019050818103600083015261445b81613e31565b9050919050565b6000602082019050818103600083015261447b81613e71565b9050919050565b6000602082019050818103600083015261449b81613ed7565b9050919050565b600060208201905081810360008301526144bb81613f3d565b9050919050565b600060208201905081810360008301526144db81613fa3565b9050919050565b60006020820190506144f76000830184613ff2565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614524576145236148e0565b5b8060405250919050565b600067ffffffffffffffff821115614549576145486148e0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614575576145746148e0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156145a5576145a46148e0565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006146418261475b565b915061464c8361475b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561468157614680614853565b5b828201905092915050565b60006146978261475b565b91506146a28361475b565b9250826146b2576146b1614882565b5b828204905092915050565b60006146c88261475b565b91506146d38361475b565b9250828210156146e6576146e5614853565b5b828203905092915050565b60006146fc8261473b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614792578082015181840152602081019050614777565b838111156147a1576000848401525b50505050565b600060028204905060018216806147bf57607f821691505b602082108114156147d3576147d26148b1565b5b50919050565b60006147e48261475b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561481757614816614853565b5b600182019050919050565b600061482d8261475b565b91506148388361475b565b92508261484857614847614882565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614929816146f1565b811461493457600080fd5b50565b61494081614703565b811461494b57600080fd5b50565b6149578161470f565b811461496257600080fd5b50565b61496e8161475b565b811461497957600080fd5b5056fea2646970667358221220f985f98a25577b3d90e64e2322bb78269b639daf19f64c2b000e773c9eab47bb64736f6c63430008000033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80634f6ccce71161010f578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd14610544578063e985e9c514610574578063f2fde38b146105a4578063fbe21acf146105c0576101e5565b8063a22cb465146104e6578063a87b263a14610502578063aba6d45c1461051e578063b88d4fde14610528576101e5565b8063715018a6116100de578063715018a614610484578063860f491b1461048e5780638da5cb5b146104aa57806395d89b41146104c8576101e5565b80634f6ccce7146103d857806355f804b3146104085780636352211e1461042457806370a0823114610454576101e5565b806323b872dd11610187578063419a470d11610156578063419a470d1461033e57806342842e0e1461036e578063435ee5871461038a5780634918f947146103a8576101e5565b806323b872dd146102ca5780632d91c502146102e65780632f745c591461030457806334918dfd14610334576101e5565b8063095ea7b3116101c3578063095ea7b314610268578063137118f51461028457806318160ddd146102a25780631cc6f335146102c0576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff91906134aa565b6105dc565b6040516102119190614145565b60405180910390f35b610222610656565b60405161022f9190614160565b60405180910390f35b610252600480360381019061024d919061353d565b6106e8565b60405161025f9190614025565b60405180910390f35b610282600480360381019061027d9190613404565b61076d565b005b61028c610885565b6040516102999190614145565b60405180910390f35b6102aa610898565b6040516102b791906144e2565b60405180910390f35b6102c86108a5565b005b6102e460048036038101906102df91906132fe565b6109be565b005b6102ee610a1e565b6040516102fb9190614145565b60405180910390f35b61031e60048036038101906103199190613404565b610a31565b60405161032b91906144e2565b60405180910390f35b61033c610ad6565b005b6103586004803603810190610353919061353d565b610b7e565b60405161036591906144e2565b60405180910390f35b610388600480360381019061038391906132fe565b610bf0565b005b610392610c10565b60405161039f9190614025565b60405180910390f35b6103c260048036038101906103bd919061353d565b610c36565b6040516103cf9190614145565b60405180910390f35b6103f260048036038101906103ed919061353d565b610c8c565b6040516103ff91906144e2565b60405180910390f35b610422600480360381019061041d91906134fc565b610d23565b005b61043e6004803603810190610439919061353d565b610db9565b60405161044b9190614025565b60405180910390f35b61046e60048036038101906104699190613270565b610e6b565b60405161047b91906144e2565b60405180910390f35b61048c610f23565b005b6104a860048036038101906104a3919061353d565b610fab565b005b6104b261130f565b6040516104bf9190614025565b60405180910390f35b6104d0611339565b6040516104dd9190614160565b60405180910390f35b61050060048036038101906104fb91906133c8565b6113cb565b005b61051c60048036038101906105179190613440565b61154c565b005b610526611a14565b005b610542600480360381019061053d919061334d565b611ae9565b005b61055e6004803603810190610559919061353d565b611b4b565b60405161056b9190614160565b60405180910390f35b61058e600480360381019061058991906132c2565b611bf2565b60405161059b9190614145565b60405180910390f35b6105be60048036038101906105b99190613270565b611c86565b005b6105da60048036038101906105d59190613270565b611d7e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064f575061064e82611e3e565b5b9050919050565b606060008054610665906147a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610691906147a7565b80156106de5780601f106106b3576101008083540402835291602001916106de565b820191906000526020600020905b8154815290600101906020018083116106c157829003601f168201915b5050505050905090565b60006106f382611f20565b610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990614322565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077882610db9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e090614422565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610808611f8c565b73ffffffffffffffffffffffffffffffffffffffff161480610837575061083681610831611f8c565b611bf2565b5b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d90614282565b60405180910390fd5b6108808383611f94565b505050565b600f60009054906101000a900460ff1681565b6000600880549050905090565b6108ad611f8c565b73ffffffffffffffffffffffffffffffffffffffff166108cb61130f565b73ffffffffffffffffffffffffffffffffffffffff1614610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091890614342565b60405180910390fd5b600f60009054906101000a900460ff1615610971576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610968906143e2565b60405180910390fd5b600061271190505b6127158110156109a05761098d338261204d565b8080610998906147d9565b915050610979565b506001600f60006101000a81548160ff021916908315150217905550565b6109cf6109c9611f8c565b8261206b565b610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0590614482565b60405180910390fd5b610a19838383612149565b505050565b600f60019054906101000a900460ff1681565b6000610a3c83610e6b565b8210610a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7490614182565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ade611f8c565b73ffffffffffffffffffffffffffffffffffffffff16610afc61130f565b73ffffffffffffffffffffffffffffffffffffffff1614610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4990614342565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b600080600e60008481526020019081526020016000205411610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90614202565b60405180910390fd5b600e6000838152602001908152602001600020549050919050565b610c0b83838360405180602001604052806000815250611ae9565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006127108210610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390614462565b60405180910390fd5b610c8582611f20565b9050919050565b6000610c96610898565b8210610cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cce906144a2565b60405180910390fd5b60088281548110610d11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610d2b611f8c565b73ffffffffffffffffffffffffffffffffffffffff16610d4961130f565b73ffffffffffffffffffffffffffffffffffffffff1614610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9690614342565b60405180910390fd5b80600d9080519060200190610db5929190612fd4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e59906142c2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed3906142a2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f2b611f8c565b73ffffffffffffffffffffffffffffffffffffffff16610f4961130f565b73ffffffffffffffffffffffffffffffffffffffff1614610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690614342565b60405180910390fd5b610fa960006123a5565b565b600f60019054906101000a900460ff16610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff1906144c2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161106c91906144e2565b60206040518083038186803b15801561108457600080fd5b505afa158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc9190613299565b73ffffffffffffffffffffffffffffffffffffffff1614611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990614442565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161116f929190614040565b60206040518083038186803b15801561118757600080fd5b505afa15801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf9190613481565b6111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f5906143a2565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e33600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161127f93929190614069565b600060405180830381600087803b15801561129957600080fd5b505af11580156112ad573d6000803e3d6000fd5b5050505042600e6000838152602001908152602001600020819055506112d3338261204d565b7fc09feda7adb0a8bbe69c92dbe769d478537a966979f11dff2dda8bc034dba19d338260405161130492919061411c565b60405180910390a150565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611348906147a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611374906147a7565b80156113c15780601f10611396576101008083540402835291602001916113c1565b820191906000526020600020905b8154815290600101906020018083116113a457829003601f168201915b5050505050905090565b6113d3611f8c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143890614242565b60405180910390fd5b806005600061144e611f8c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114fb611f8c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115409190614145565b60405180910390a35050565b600f60019054906101000a900460ff1661159b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611592906144c2565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b81526004016115f8929190614040565b60206040518083038186803b15801561161057600080fd5b505afa158015611624573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116489190613481565b611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e906143a2565b60405180910390fd5b60158151106116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c2906142e2565b60405180910390fd5b60005b81518110156119d7573373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110611765577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161178991906144e2565b60206040518083038186803b1580156117a157600080fd5b505afa1580156117b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d99190613299565b73ffffffffffffffffffffffffffffffffffffffff161461182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690614402565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e33600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168585815181106118ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b81526004016118f093929190614069565b600060405180830381600087803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b5050505042600e6000848481518110611960577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020819055506119c4338383815181106119b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161204d565b80806119cf906147d9565b9150506116ce565b507f84c402511619bfc9ed8455e82496328241db037c2d0e4c46a671e04d300c1bb33382604051611a099291906140ec565b60405180910390a150565b611a1c611f8c565b73ffffffffffffffffffffffffffffffffffffffff16611a3a61130f565b73ffffffffffffffffffffffffffffffffffffffff1614611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8790614342565b60405180910390fd5b611a9b612710611f20565b15611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad2906143c2565b60405180910390fd5b611ae73361271061204d565b565b611afa611af4611f8c565b8361206b565b611b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3090614482565b60405180910390fd5b611b458484848461246b565b50505050565b6060611b5682611f20565b611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90614382565b60405180910390fd5b6000611b9f6124c7565b90506000815111611bbf5760405180602001604052806000815250611bea565b80611bc984612559565b604051602001611bda929190614001565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c8e611f8c565b73ffffffffffffffffffffffffffffffffffffffff16611cac61130f565b73ffffffffffffffffffffffffffffffffffffffff1614611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf990614342565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d69906141c2565b60405180910390fd5b611d7b816123a5565b50565b611d86611f8c565b73ffffffffffffffffffffffffffffffffffffffff16611da461130f565b73ffffffffffffffffffffffffffffffffffffffff1614611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df190614342565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f0957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f195750611f1882612706565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661200783610db9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612067828260405180602001604052806000815250612770565b5050565b600061207682611f20565b6120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac90614262565b60405180910390fd5b60006120c083610db9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061212f57508373ffffffffffffffffffffffffffffffffffffffff16612117846106e8565b73ffffffffffffffffffffffffffffffffffffffff16145b80612140575061213f8185611bf2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661216982610db9565b73ffffffffffffffffffffffffffffffffffffffff16146121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b690614362565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561222f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222690614222565b60405180910390fd5b61223a8383836127cb565b612245600082611f94565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461229591906146bd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122ec9190614636565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612476848484612149565b612482848484846128df565b6124c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b8906141a2565b60405180910390fd5b50505050565b6060600d80546124d6906147a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612502906147a7565b801561254f5780601f106125245761010080835404028352916020019161254f565b820191906000526020600020905b81548152906001019060200180831161253257829003601f168201915b5050505050905090565b606060008214156125a1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612701565b600082905060005b600082146125d35780806125bc906147d9565b915050600a826125cc919061468c565b91506125a9565b60008167ffffffffffffffff811115612615577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126475781602001600182028036833780820191505090505b5090505b600085146126fa5760018261266091906146bd565b9150600a8561266f9190614822565b603061267b9190614636565b60f81b8183815181106126b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126f3919061468c565b945061264b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61277a8383612a76565b61278760008484846128df565b6127c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bd906141a2565b60405180910390fd5b505050565b6127d6838383612c44565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128195761281481612c49565b612858565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612857576128568382612c92565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561289b5761289681612dff565b6128da565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146128d9576128d88282612f42565b5b5b505050565b60006129008473ffffffffffffffffffffffffffffffffffffffff16612fc1565b15612a69578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612929611f8c565b8786866040518563ffffffff1660e01b815260040161294b94939291906140a0565b602060405180830381600087803b15801561296557600080fd5b505af192505050801561299657506040513d601f19601f8201168201806040525081019061299391906134d3565b60015b612a19573d80600081146129c6576040519150601f19603f3d011682016040523d82523d6000602084013e6129cb565b606091505b50600081511415612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a08906141a2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a6e565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612add90614302565b60405180910390fd5b612aef81611f20565b15612b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b26906141e2565b60405180910390fd5b612b3b600083836127cb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b8b9190614636565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c9f84610e6b565b612ca991906146bd565b9050600060076000848152602001908152602001600020549050818114612d8e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e1391906146bd565b9050600060096000848152602001908152602001600020549050600060088381548110612e69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612eb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612f4d83610e6b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612fe0906147a7565b90600052602060002090601f0160209004810192826130025760008555613049565b82601f1061301b57805160ff1916838001178555613049565b82800160010185558215613049579182015b8281111561304857825182559160200191906001019061302d565b5b509050613056919061305a565b5090565b5b8082111561307357600081600090555060010161305b565b5090565b600061308a6130858461452e565b6144fd565b905080838252602082019050828560208602820111156130a957600080fd5b60005b858110156130d957816130bf888261325b565b8452602084019350602083019250506001810190506130ac565b5050509392505050565b60006130f66130f18461455a565b6144fd565b90508281526020810184848401111561310e57600080fd5b613119848285614765565b509392505050565b600061313461312f8461458a565b6144fd565b90508281526020810184848401111561314c57600080fd5b613157848285614765565b509392505050565b60008135905061316e81614920565b92915050565b60008151905061318381614920565b92915050565b600082601f83011261319a57600080fd5b81356131aa848260208601613077565b91505092915050565b6000813590506131c281614937565b92915050565b6000815190506131d781614937565b92915050565b6000813590506131ec8161494e565b92915050565b6000815190506132018161494e565b92915050565b600082601f83011261321857600080fd5b81356132288482602086016130e3565b91505092915050565b600082601f83011261324257600080fd5b8135613252848260208601613121565b91505092915050565b60008135905061326a81614965565b92915050565b60006020828403121561328257600080fd5b60006132908482850161315f565b91505092915050565b6000602082840312156132ab57600080fd5b60006132b984828501613174565b91505092915050565b600080604083850312156132d557600080fd5b60006132e38582860161315f565b92505060206132f48582860161315f565b9150509250929050565b60008060006060848603121561331357600080fd5b60006133218682870161315f565b93505060206133328682870161315f565b92505060406133438682870161325b565b9150509250925092565b6000806000806080858703121561336357600080fd5b60006133718782880161315f565b94505060206133828782880161315f565b93505060406133938782880161325b565b925050606085013567ffffffffffffffff8111156133b057600080fd5b6133bc87828801613207565b91505092959194509250565b600080604083850312156133db57600080fd5b60006133e98582860161315f565b92505060206133fa858286016131b3565b9150509250929050565b6000806040838503121561341757600080fd5b60006134258582860161315f565b92505060206134368582860161325b565b9150509250929050565b60006020828403121561345257600080fd5b600082013567ffffffffffffffff81111561346c57600080fd5b61347884828501613189565b91505092915050565b60006020828403121561349357600080fd5b60006134a1848285016131c8565b91505092915050565b6000602082840312156134bc57600080fd5b60006134ca848285016131dd565b91505092915050565b6000602082840312156134e557600080fd5b60006134f3848285016131f2565b91505092915050565b60006020828403121561350e57600080fd5b600082013567ffffffffffffffff81111561352857600080fd5b61353484828501613231565b91505092915050565b60006020828403121561354f57600080fd5b600061355d8482850161325b565b91505092915050565b60006135728383613fe3565b60208301905092915050565b613587816146f1565b82525050565b6000613598826145ca565b6135a281856145f8565b93506135ad836145ba565b8060005b838110156135de5781516135c58882613566565b97506135d0836145eb565b9250506001810190506135b1565b5085935050505092915050565b6135f481614703565b82525050565b6000613605826145d5565b61360f8185614609565b935061361f818560208601614774565b6136288161490f565b840191505092915050565b600061363e826145e0565b613648818561461a565b9350613658818560208601614774565b6136618161490f565b840191505092915050565b6000613677826145e0565b613681818561462b565b9350613691818560208601614774565b80840191505092915050565b60006136aa602b8361461a565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061371060328361461a565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061377660268361461a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137dc601c8361461a565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061381c600f8361461a565b91507f4e6f74207661756c7465642079657400000000000000000000000000000000006000830152602082019050919050565b600061385c60248361461a565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138c260198361461a565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613902602c8361461a565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061396860388361461a565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006139ce602a8361461a565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a3460298361461a565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a9a60288361461a565b91507f43616e27742065766f6c7665206d6f7265207468616e2032302042756c6c732060008301527f6174206f6e63652e0000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b0060208361461a565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613b40602c8361461a565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ba660208361461a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613be660298361461a565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c4c602f8361461a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613cb260328361461a565b91507f436f6e7472616374206973206e6f7420617070726f76656420746f207472616e60008301527f7366657220796f7572204f472042756c6c2e00000000000000000000000000006020830152604082019050919050565b6000613d1860178361461a565b91507f50686f656e697820616c7265616479206d696e7465642e0000000000000000006000830152602082019050919050565b6000613d58601f8361461a565b91507f476f6473206861766520616c7265616479206265656e2072656c6561736564006000830152602082019050919050565b6000613d98601d8361461a565b91507f596f75206d757374206f776e20746865207265717565737465642049440000006000830152602082019050919050565b6000613dd860218361461a565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e3e601e8361461a565b91507f596f75206d757374206f776e20746865207265717565737465642049442e00006000830152602082019050919050565b6000613e7e60238361461a565b91507f546f6b656e206964206f75747369646520636f6c6c656374696f6e20626f756e60008301527f64732100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ee460318361461a565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613f4a602c8361461a565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613fb060168361461a565b91507f45766f6c76696e67206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b613fec8161475b565b82525050565b613ffb8161475b565b82525050565b600061400d828561366c565b9150614019828461366c565b91508190509392505050565b600060208201905061403a600083018461357e565b92915050565b6000604082019050614055600083018561357e565b614062602083018461357e565b9392505050565b600060608201905061407e600083018661357e565b61408b602083018561357e565b6140986040830184613ff2565b949350505050565b60006080820190506140b5600083018761357e565b6140c2602083018661357e565b6140cf6040830185613ff2565b81810360608301526140e181846135fa565b905095945050505050565b6000604082019050614101600083018561357e565b8181036020830152614113818461358d565b90509392505050565b6000604082019050614131600083018561357e565b61413e6020830184613ff2565b9392505050565b600060208201905061415a60008301846135eb565b92915050565b6000602082019050818103600083015261417a8184613633565b905092915050565b6000602082019050818103600083015261419b8161369d565b9050919050565b600060208201905081810360008301526141bb81613703565b9050919050565b600060208201905081810360008301526141db81613769565b9050919050565b600060208201905081810360008301526141fb816137cf565b9050919050565b6000602082019050818103600083015261421b8161380f565b9050919050565b6000602082019050818103600083015261423b8161384f565b9050919050565b6000602082019050818103600083015261425b816138b5565b9050919050565b6000602082019050818103600083015261427b816138f5565b9050919050565b6000602082019050818103600083015261429b8161395b565b9050919050565b600060208201905081810360008301526142bb816139c1565b9050919050565b600060208201905081810360008301526142db81613a27565b9050919050565b600060208201905081810360008301526142fb81613a8d565b9050919050565b6000602082019050818103600083015261431b81613af3565b9050919050565b6000602082019050818103600083015261433b81613b33565b9050919050565b6000602082019050818103600083015261435b81613b99565b9050919050565b6000602082019050818103600083015261437b81613bd9565b9050919050565b6000602082019050818103600083015261439b81613c3f565b9050919050565b600060208201905081810360008301526143bb81613ca5565b9050919050565b600060208201905081810360008301526143db81613d0b565b9050919050565b600060208201905081810360008301526143fb81613d4b565b9050919050565b6000602082019050818103600083015261441b81613d8b565b9050919050565b6000602082019050818103600083015261443b81613dcb565b9050919050565b6000602082019050818103600083015261445b81613e31565b9050919050565b6000602082019050818103600083015261447b81613e71565b9050919050565b6000602082019050818103600083015261449b81613ed7565b9050919050565b600060208201905081810360008301526144bb81613f3d565b9050919050565b600060208201905081810360008301526144db81613fa3565b9050919050565b60006020820190506144f76000830184613ff2565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614524576145236148e0565b5b8060405250919050565b600067ffffffffffffffff821115614549576145486148e0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614575576145746148e0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156145a5576145a46148e0565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006146418261475b565b915061464c8361475b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561468157614680614853565b5b828201905092915050565b60006146978261475b565b91506146a28361475b565b9250826146b2576146b1614882565b5b828204905092915050565b60006146c88261475b565b91506146d38361475b565b9250828210156146e6576146e5614853565b5b828203905092915050565b60006146fc8261473b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614792578082015181840152602081019050614777565b838111156147a1576000848401525b50505050565b600060028204905060018216806147bf57607f821691505b602082108114156147d3576147d26148b1565b5b50919050565b60006147e48261475b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561481757614816614853565b5b600182019050919050565b600061482d8261475b565b91506148388361475b565b92508261484857614847614882565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614929816146f1565b811461493457600080fd5b50565b61494081614703565b811461494b57600080fd5b50565b6149578161470f565b811461496257600080fd5b50565b61496e8161475b565b811461497957600080fd5b5056fea2646970667358221220f985f98a25577b3d90e64e2322bb78269b639daf19f64c2b000e773c9eab47bb64736f6c63430008000033
Deployed Bytecode Sourcemap
42324:3464:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33682:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20802:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22361:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21884:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42522:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34322:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45020:255;;;:::i;:::-;;23251:347;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42564:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33990:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42857:93;;;:::i;:::-;;45283:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23669:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42410:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44509:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34512:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45697:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20496:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20226:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41393:94;;;:::i;:::-;;42958:660;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40742:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20971:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22654:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43626:875;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44701:151;;;:::i;:::-;;23925:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21146:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23020:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41642:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45486:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33682:224;33784:4;33823:35;33808:50;;;:11;:50;;;;:90;;;;33862:36;33886:11;33862:23;:36::i;:::-;33808:90;33801:97;;33682:224;;;:::o;20802:100::-;20856:13;20889:5;20882:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20802:100;:::o;22361:221::-;22437:7;22465:16;22473:7;22465;:16::i;:::-;22457:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22550:15;:24;22566:7;22550:24;;;;;;;;;;;;;;;;;;;;;22543:31;;22361:221;;;:::o;21884:411::-;21965:13;21981:23;21996:7;21981:14;:23::i;:::-;21965:39;;22029:5;22023:11;;:2;:11;;;;22015:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22123:5;22107:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22132:37;22149:5;22156:12;:10;:12::i;:::-;22132:16;:37::i;:::-;22107:62;22085:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22266:21;22275:2;22279:7;22266:8;:21::i;:::-;21884:411;;;:::o;42522:35::-;;;;;;;;;;;;;:::o;34322:113::-;34383:7;34410:10;:17;;;;34403:24;;34322:113;:::o;45020:255::-;40973:12;:10;:12::i;:::-;40962:23;;:7;:5;:7::i;:::-;:23;;;40954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45085:15:::1;;;;;;;;;;;45084:16;45076:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;45152:6;45161:5;45152:14;;45147:88;45172:5;45168:1;:9;45147:88;;;45199:24;45209:10;45221:1;45199:9;:24::i;:::-;45179:3;;;;;:::i;:::-;;;;45147:88;;;;45263:4;45245:15;;:22;;;;;;;;;;;;;;;;;;45020:255::o:0;23251:347::-;23454:41;23473:12;:10;:12::i;:::-;23487:7;23454:18;:41::i;:::-;23446:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23562:28;23572:4;23578:2;23582:7;23562:9;:28::i;:::-;23251:347;;;:::o;42564:34::-;;;;;;;;;;;;;:::o;33990:256::-;34087:7;34123:23;34140:5;34123:16;:23::i;:::-;34115:5;:31;34107:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34212:12;:19;34225:5;34212:19;;;;;;;;;;;;;;;:26;34232:5;34212:26;;;;;;;;;;;;34205:33;;33990:256;;;;:::o;42857:93::-;40973:12;:10;:12::i;:::-;40962:23;;:7;:5;:7::i;:::-;:23;;;40954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42928:14:::1;;;;;;;;;;;42927:15;42910:14;;:32;;;;;;;;;;;;;;;;;;42857:93::o:0;45283:195::-;45347:7;45404:1;45374:18;:27;45393:7;45374:27;;;;;;;;;;;;:31;45366:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;45443:18;:27;45462:7;45443:27;;;;;;;;;;;;45436:34;;45283:195;;;:::o;23669:185::-;23807:39;23824:4;23830:2;23834:7;23807:39;;;;;;;;;;;;:16;:39::i;:::-;23669:185;;;:::o;42410:23::-;;;;;;;;;;;;;:::o;44509:184::-;44569:4;44605:5;44594:8;:16;44586:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44668:17;44676:8;44668:7;:17::i;:::-;44661:24;;44509:184;;;:::o;34512:233::-;34587:7;34623:30;:28;:30::i;:::-;34615:5;:38;34607:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34720:10;34731:5;34720:17;;;;;;;;;;;;;;;;;;;;;;;;34713:24;;34512:233;;;:::o;45697:88::-;40973:12;:10;:12::i;:::-;40962:23;;:7;:5;:7::i;:::-;:23;;;40954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45774:3:::1;45764:7;:13;;;;;;;;;;;;:::i;:::-;;45697:88:::0;:::o;20496:239::-;20568:7;20588:13;20604:7;:16;20612:7;20604:16;;;;;;;;;;;;;;;;;;;;;20588:32;;20656:1;20639:19;;:5;:19;;;;20631:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20722:5;20715:12;;;20496:239;;;:::o;20226:208::-;20298:7;20343:1;20326:19;;:5;:19;;;;20318:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20410:9;:16;20420:5;20410:16;;;;;;;;;;;;;;;;20403:23;;20226:208;;;:::o;41393:94::-;40973:12;:10;:12::i;:::-;40962:23;;:7;:5;:7::i;:::-;:23;;;40954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41458:21:::1;41476:1;41458:9;:21::i;:::-;41393:94::o:0;42958:660::-;43022:14;;;;;;;;;;;43014:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;43107:10;43082:35;;:3;;;;;;;;;;;:11;;;43094:8;43082:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;;43074:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;43171:3;;;;;;;;;;;:20;;;43192:10;43212:4;43171:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43163:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;43385:3;;;;;;;;;;;:20;;;43406:10;43418:8;;;;;;;;;;;43428;43385:52;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43479:15;43448:18;:28;43467:8;43448:28;;;;;;;;;;;:46;;;;43535:31;43545:10;43557:8;43535:9;:31::i;:::-;43582:28;43589:10;43601:8;43582:28;;;;;;;:::i;:::-;;;;;;;;42958:660;:::o;40742:87::-;40788:7;40815:6;;;;;;;;;;;40808:13;;40742:87;:::o;20971:104::-;21027:13;21060:7;21053:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20971:104;:::o;22654:295::-;22769:12;:10;:12::i;:::-;22757:24;;:8;:24;;;;22749:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22869:8;22824:18;:32;22843:12;:10;:12::i;:::-;22824:32;;;;;;;;;;;;;;;:42;22857:8;22824:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22922:8;22893:48;;22908:12;:10;:12::i;:::-;22893:48;;;22932:8;22893:48;;;;;;:::i;:::-;;;;;;;;22654:295;;:::o;43626:875::-;43702:14;;;;;;;;;;;43694:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;43762:3;;;;;;;;;;;:20;;;43783:10;43803:4;43762:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43754:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;43902:2;43883:9;:16;:21;43875:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;43965:6;43960:481;43981:9;:16;43977:1;:20;43960:481;;;44056:10;44027:39;;:3;;;;;;;;;;;:11;;;44039:9;44049:1;44039:12;;;;;;;;;;;;;;;;;;;;;;44027:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;44019:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;44224:3;;;;;;;;;;;:20;;;44245:10;44257:8;;;;;;;;;;;44267:9;44277:1;44267:12;;;;;;;;;;;;;;;;;;;;;;44224:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44330:15;44295:18;:32;44314:9;44324:1;44314:12;;;;;;;;;;;;;;;;;;;;;;44295:32;;;;;;;;;;;:50;;;;44394:35;44404:10;44416:9;44426:1;44416:12;;;;;;;;;;;;;;;;;;;;;;44394:9;:35::i;:::-;43999:3;;;;;:::i;:::-;;;;43960:481;;;;44456:37;44471:10;44483:9;44456:37;;;;;;;:::i;:::-;;;;;;;;43626:875;:::o;44701:151::-;40973:12;:10;:12::i;:::-;40962:23;;:7;:5;:7::i;:::-;:23;;;40954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44763:14:::1;44771:5;44763:7;:14::i;:::-;44762:15;44754:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;44816:28;44826:10;44838:5;44816:9;:28::i;:::-;44701:151::o:0;23925:328::-;24100:41;24119:12;:10;:12::i;:::-;24133:7;24100:18;:41::i;:::-;24092:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24206:39;24220:4;24226:2;24230:7;24239:5;24206:13;:39::i;:::-;23925:328;;;;:::o;21146:334::-;21219:13;21253:16;21261:7;21253;:16::i;:::-;21245:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21334:21;21358:10;:8;:10::i;:::-;21334:34;;21410:1;21392:7;21386:21;:25;:86;;;;;;;;;;;;;;;;;21438:7;21447:18;:7;:16;:18::i;:::-;21421:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21386:86;21379:93;;;21146:334;;;:::o;23020:164::-;23117:4;23141:18;:25;23160:5;23141:25;;;;;;;;;;;;;;;:35;23167:8;23141:35;;;;;;;;;;;;;;;;;;;;;;;;;23134:42;;23020:164;;;;:::o;41642:192::-;40973:12;:10;:12::i;:::-;40962:23;;:7;:5;:7::i;:::-;:23;;;40954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41751:1:::1;41731:22;;:8;:22;;;;41723:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41807:19;41817:8;41807:9;:19::i;:::-;41642:192:::0;:::o;45486:95::-;40973:12;:10;:12::i;:::-;40962:23;;:7;:5;:7::i;:::-;:23;;;40954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45565:8:::1;45554;;:19;;;;;;;;;;;;;;;;;;45486:95:::0;:::o;19857:305::-;19959:4;20011:25;19996:40;;;:11;:40;;;;:105;;;;20068:33;20053:48;;;:11;:48;;;;19996:105;:158;;;;20118:36;20142:11;20118:23;:36::i;:::-;19996:158;19976:178;;19857:305;;;:::o;25763:127::-;25828:4;25880:1;25852:30;;:7;:16;25860:7;25852:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25845:37;;25763:127;;;:::o;15563:98::-;15616:7;15643:10;15636:17;;15563:98;:::o;29745:174::-;29847:2;29820:15;:24;29836:7;29820:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29903:7;29899:2;29865:46;;29874:23;29889:7;29874:14;:23::i;:::-;29865:46;;;;;;;;;;;;29745:174;;:::o;26747:110::-;26823:26;26833:2;26837:7;26823:26;;;;;;;;;;;;:9;:26::i;:::-;26747:110;;:::o;26057:348::-;26150:4;26175:16;26183:7;26175;:16::i;:::-;26167:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26251:13;26267:23;26282:7;26267:14;:23::i;:::-;26251:39;;26320:5;26309:16;;:7;:16;;;:51;;;;26353:7;26329:31;;:20;26341:7;26329:11;:20::i;:::-;:31;;;26309:51;:87;;;;26364:32;26381:5;26388:7;26364:16;:32::i;:::-;26309:87;26301:96;;;26057:348;;;;:::o;29049:578::-;29208:4;29181:31;;:23;29196:7;29181:14;:23::i;:::-;:31;;;29173:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29291:1;29277:16;;:2;:16;;;;29269:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29347:39;29368:4;29374:2;29378:7;29347:20;:39::i;:::-;29451:29;29468:1;29472:7;29451:8;:29::i;:::-;29512:1;29493:9;:15;29503:4;29493:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29541:1;29524:9;:13;29534:2;29524:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29572:2;29553:7;:16;29561:7;29553:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29611:7;29607:2;29592:27;;29601:4;29592:27;;;;;;;;;;;;29049:578;;;:::o;41842:173::-;41898:16;41917:6;;;;;;;;;;;41898:25;;41943:8;41934:6;;:17;;;;;;;;;;;;;;;;;;41998:8;41967:40;;41988:8;41967:40;;;;;;;;;;;;41842:173;;:::o;25135:315::-;25292:28;25302:4;25308:2;25312:7;25292:9;:28::i;:::-;25339:48;25362:4;25368:2;25372:7;25381:5;25339:22;:48::i;:::-;25331:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25135:315;;;;:::o;45589:100::-;45641:13;45674:7;45667:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45589:100;:::o;16005:723::-;16061:13;16291:1;16282:5;:10;16278:53;;;16309:10;;;;;;;;;;;;;;;;;;;;;16278:53;16341:12;16356:5;16341:20;;16372:14;16397:78;16412:1;16404:4;:9;16397:78;;16430:8;;;;;:::i;:::-;;;;16461:2;16453:10;;;;;:::i;:::-;;;16397:78;;;16485:19;16517:6;16507:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16485:39;;16535:154;16551:1;16542:5;:10;16535:154;;16579:1;16569:11;;;;;:::i;:::-;;;16646:2;16638:5;:10;;;;:::i;:::-;16625:2;:24;;;;:::i;:::-;16612:39;;16595:6;16602;16595:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16675:2;16666:11;;;;;:::i;:::-;;;16535:154;;;16713:6;16699:21;;;;;16005:723;;;;:::o;18464:157::-;18549:4;18588:25;18573:40;;;:11;:40;;;;18566:47;;18464:157;;;:::o;27084:321::-;27214:18;27220:2;27224:7;27214:5;:18::i;:::-;27265:54;27296:1;27300:2;27304:7;27313:5;27265:22;:54::i;:::-;27243:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27084:321;;;:::o;35358:589::-;35502:45;35529:4;35535:2;35539:7;35502:26;:45::i;:::-;35580:1;35564:18;;:4;:18;;;35560:187;;;35599:40;35631:7;35599:31;:40::i;:::-;35560:187;;;35669:2;35661:10;;:4;:10;;;35657:90;;35688:47;35721:4;35727:7;35688:32;:47::i;:::-;35657:90;35560:187;35775:1;35761:16;;:2;:16;;;35757:183;;;35794:45;35831:7;35794:36;:45::i;:::-;35757:183;;;35867:4;35861:10;;:2;:10;;;35857:83;;35888:40;35916:2;35920:7;35888:27;:40::i;:::-;35857:83;35757:183;35358:589;;;:::o;30484:799::-;30639:4;30660:15;:2;:13;;;:15::i;:::-;30656:620;;;30712:2;30696:36;;;30733:12;:10;:12::i;:::-;30747:4;30753:7;30762:5;30696:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30692:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30955:1;30938:6;:13;:18;30934:272;;;30981:60;;;;;;;;;;:::i;:::-;;;;;;;;30934:272;31156:6;31150:13;31141:6;31137:2;31133:15;31126:38;30692:529;30829:41;;;30819:51;;;:6;:51;;;;30812:58;;;;;30656:620;31260:4;31253:11;;30484:799;;;;;;;:::o;27741:382::-;27835:1;27821:16;;:2;:16;;;;27813:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27894:16;27902:7;27894;:16::i;:::-;27893:17;27885:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27956:45;27985:1;27989:2;27993:7;27956:20;:45::i;:::-;28031:1;28014:9;:13;28024:2;28014:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28062:2;28043:7;:16;28051:7;28043:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28107:7;28103:2;28082:33;;28099:1;28082:33;;;;;;;;;;;;27741:382;;:::o;31855:126::-;;;;:::o;36670:164::-;36774:10;:17;;;;36747:15;:24;36763:7;36747:24;;;;;;;;;;;:44;;;;36802:10;36818:7;36802:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36670:164;:::o;37461:988::-;37727:22;37777:1;37752:22;37769:4;37752:16;:22::i;:::-;:26;;;;:::i;:::-;37727:51;;37789:18;37810:17;:26;37828:7;37810:26;;;;;;;;;;;;37789:47;;37957:14;37943:10;:28;37939:328;;37988:19;38010:12;:18;38023:4;38010:18;;;;;;;;;;;;;;;:34;38029:14;38010:34;;;;;;;;;;;;37988:56;;38094:11;38061:12;:18;38074:4;38061:18;;;;;;;;;;;;;;;:30;38080:10;38061:30;;;;;;;;;;;:44;;;;38211:10;38178:17;:30;38196:11;38178:30;;;;;;;;;;;:43;;;;37939:328;;38363:17;:26;38381:7;38363:26;;;;;;;;;;;38356:33;;;38407:12;:18;38420:4;38407:18;;;;;;;;;;;;;;;:34;38426:14;38407:34;;;;;;;;;;;38400:41;;;37461:988;;;;:::o;38744:1079::-;38997:22;39042:1;39022:10;:17;;;;:21;;;;:::i;:::-;38997:46;;39054:18;39075:15;:24;39091:7;39075:24;;;;;;;;;;;;39054:45;;39426:19;39448:10;39459:14;39448:26;;;;;;;;;;;;;;;;;;;;;;;;39426:48;;39512:11;39487:10;39498;39487:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;39623:10;39592:15;:28;39608:11;39592:28;;;;;;;;;;;:41;;;;39764:15;:24;39780:7;39764:24;;;;;;;;;;;39757:31;;;39799:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38744:1079;;;;:::o;36248:221::-;36333:14;36350:20;36367:2;36350:16;:20::i;:::-;36333:37;;36408:7;36381:12;:16;36394:2;36381:16;;;;;;;;;;;;;;;:24;36398:6;36381:24;;;;;;;;;;;:34;;;;36455:6;36426:17;:26;36444:7;36426:26;;;;;;;;;;;:35;;;;36248:221;;;:::o;7690:387::-;7750:4;7958:12;8025:7;8013:20;8005:28;;8068:1;8061:4;:8;8054:15;;;7690:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1495:143::-;;1583:6;1577:13;1568:22;;1599:33;1626:5;1599:33;:::i;:::-;1558:80;;;;:::o;1661:303::-;;1781:3;1774:4;1766:6;1762:17;1758:27;1748:2;;1799:1;1796;1789:12;1748:2;1839:6;1826:20;1864:94;1954:3;1946:6;1939:4;1931:6;1927:17;1864:94;:::i;:::-;1855:103;;1738:226;;;;;:::o;1970:133::-;;2051:6;2038:20;2029:29;;2067:30;2091:5;2067:30;:::i;:::-;2019:84;;;;:::o;2109:137::-;;2194:6;2188:13;2179:22;;2210:30;2234:5;2210:30;:::i;:::-;2169:77;;;;:::o;2252:137::-;;2335:6;2322:20;2313:29;;2351:32;2377:5;2351:32;:::i;:::-;2303:86;;;;:::o;2395:141::-;;2482:6;2476:13;2467:22;;2498:32;2524:5;2498:32;:::i;:::-;2457:79;;;;:::o;2555:271::-;;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:78;2816:3;2808:6;2801:4;2793:6;2789:17;2742:78;:::i;:::-;2733:87;;2616:210;;;;;:::o;2846:273::-;;2951:3;2944:4;2936:6;2932:17;2928:27;2918:2;;2969:1;2966;2959:12;2918:2;3009:6;2996:20;3034:79;3109:3;3101:6;3094:4;3086:6;3082:17;3034:79;:::i;:::-;3025:88;;2908:211;;;;;:::o;3125:139::-;;3209:6;3196:20;3187:29;;3225:33;3252:5;3225:33;:::i;:::-;3177:87;;;;:::o;3270:262::-;;3378:2;3366:9;3357:7;3353:23;3349:32;3346:2;;;3394:1;3391;3384:12;3346:2;3437:1;3462:53;3507:7;3498:6;3487:9;3483:22;3462:53;:::i;:::-;3452:63;;3408:117;3336:196;;;;:::o;3538:284::-;;3657:2;3645:9;3636:7;3632:23;3628:32;3625:2;;;3673:1;3670;3663:12;3625:2;3716:1;3741:64;3797:7;3788:6;3777:9;3773:22;3741:64;:::i;:::-;3731:74;;3687:128;3615:207;;;;:::o;3828:407::-;;;3953:2;3941:9;3932:7;3928:23;3924:32;3921:2;;;3969:1;3966;3959:12;3921:2;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;3911:324;;;;;:::o;4241:552::-;;;;4383:2;4371:9;4362:7;4358:23;4354:32;4351:2;;;4399:1;4396;4389:12;4351:2;4442:1;4467:53;4512:7;4503:6;4492:9;4488:22;4467:53;:::i;:::-;4457:63;;4413:117;4569:2;4595:53;4640:7;4631:6;4620:9;4616:22;4595:53;:::i;:::-;4585:63;;4540:118;4697:2;4723:53;4768:7;4759:6;4748:9;4744:22;4723:53;:::i;:::-;4713:63;;4668:118;4341:452;;;;;:::o;4799:809::-;;;;;4967:3;4955:9;4946:7;4942:23;4938:33;4935:2;;;4984:1;4981;4974:12;4935:2;5027:1;5052:53;5097:7;5088:6;5077:9;5073:22;5052:53;:::i;:::-;5042:63;;4998:117;5154:2;5180:53;5225:7;5216:6;5205:9;5201:22;5180:53;:::i;:::-;5170:63;;5125:118;5282:2;5308:53;5353:7;5344:6;5333:9;5329:22;5308:53;:::i;:::-;5298:63;;5253:118;5438:2;5427:9;5423:18;5410:32;5469:18;5461:6;5458:30;5455:2;;;5501:1;5498;5491:12;5455:2;5529:62;5583:7;5574:6;5563:9;5559:22;5529:62;:::i;:::-;5519:72;;5381:220;4925:683;;;;;;;:::o;5614:401::-;;;5736:2;5724:9;5715:7;5711:23;5707:32;5704:2;;;5752:1;5749;5742:12;5704:2;5795:1;5820:53;5865:7;5856:6;5845:9;5841:22;5820:53;:::i;:::-;5810:63;;5766:117;5922:2;5948:50;5990:7;5981:6;5970:9;5966:22;5948:50;:::i;:::-;5938:60;;5893:115;5694:321;;;;;:::o;6021:407::-;;;6146:2;6134:9;6125:7;6121:23;6117:32;6114:2;;;6162:1;6159;6152:12;6114:2;6205:1;6230:53;6275:7;6266:6;6255:9;6251:22;6230:53;:::i;:::-;6220:63;;6176:117;6332:2;6358:53;6403:7;6394:6;6383:9;6379:22;6358:53;:::i;:::-;6348:63;;6303:118;6104:324;;;;;:::o;6434:405::-;;6567:2;6555:9;6546:7;6542:23;6538:32;6535:2;;;6583:1;6580;6573:12;6535:2;6654:1;6643:9;6639:17;6626:31;6684:18;6676:6;6673:30;6670:2;;;6716:1;6713;6706:12;6670:2;6744:78;6814:7;6805:6;6794:9;6790:22;6744:78;:::i;:::-;6734:88;;6597:235;6525:314;;;;:::o;6845:278::-;;6961:2;6949:9;6940:7;6936:23;6932:32;6929:2;;;6977:1;6974;6967:12;6929:2;7020:1;7045:61;7098:7;7089:6;7078:9;7074:22;7045:61;:::i;:::-;7035:71;;6991:125;6919:204;;;;:::o;7129:260::-;;7236:2;7224:9;7215:7;7211:23;7207:32;7204:2;;;7252:1;7249;7242:12;7204:2;7295:1;7320:52;7364:7;7355:6;7344:9;7340:22;7320:52;:::i;:::-;7310:62;;7266:116;7194:195;;;;:::o;7395:282::-;;7513:2;7501:9;7492:7;7488:23;7484:32;7481:2;;;7529:1;7526;7519:12;7481:2;7572:1;7597:63;7652:7;7643:6;7632:9;7628:22;7597:63;:::i;:::-;7587:73;;7543:127;7471:206;;;;:::o;7683:375::-;;7801:2;7789:9;7780:7;7776:23;7772:32;7769:2;;;7817:1;7814;7807:12;7769:2;7888:1;7877:9;7873:17;7860:31;7918:18;7910:6;7907:30;7904:2;;;7950:1;7947;7940:12;7904:2;7978:63;8033:7;8024:6;8013:9;8009:22;7978:63;:::i;:::-;7968:73;;7831:220;7759:299;;;;:::o;8064:262::-;;8172:2;8160:9;8151:7;8147:23;8143:32;8140:2;;;8188:1;8185;8178:12;8140:2;8231:1;8256:53;8301:7;8292:6;8281:9;8277:22;8256:53;:::i;:::-;8246:63;;8202:117;8130:196;;;;:::o;8332:179::-;;8422:46;8464:3;8456:6;8422:46;:::i;:::-;8500:4;8495:3;8491:14;8477:28;;8412:99;;;;:::o;8517:118::-;8604:24;8622:5;8604:24;:::i;:::-;8599:3;8592:37;8582:53;;:::o;8671:732::-;;8819:54;8867:5;8819:54;:::i;:::-;8889:86;8968:6;8963:3;8889:86;:::i;:::-;8882:93;;8999:56;9049:5;8999:56;:::i;:::-;9078:7;9109:1;9094:284;9119:6;9116:1;9113:13;9094:284;;;9195:6;9189:13;9222:63;9281:3;9266:13;9222:63;:::i;:::-;9215:70;;9308:60;9361:6;9308:60;:::i;:::-;9298:70;;9154:224;9141:1;9138;9134:9;9129:14;;9094:284;;;9098:14;9394:3;9387:10;;8795:608;;;;;;;:::o;9409:109::-;9490:21;9505:5;9490:21;:::i;:::-;9485:3;9478:34;9468:50;;:::o;9524:360::-;;9638:38;9670:5;9638:38;:::i;:::-;9692:70;9755:6;9750:3;9692:70;:::i;:::-;9685:77;;9771:52;9816:6;9811:3;9804:4;9797:5;9793:16;9771:52;:::i;:::-;9848:29;9870:6;9848:29;:::i;:::-;9843:3;9839:39;9832:46;;9614:270;;;;;:::o;9890:364::-;;10006:39;10039:5;10006:39;:::i;:::-;10061:71;10125:6;10120:3;10061:71;:::i;:::-;10054:78;;10141:52;10186:6;10181:3;10174:4;10167:5;10163:16;10141:52;:::i;:::-;10218:29;10240:6;10218:29;:::i;:::-;10213:3;10209:39;10202:46;;9982:272;;;;;:::o;10260:377::-;;10394:39;10427:5;10394:39;:::i;:::-;10449:89;10531:6;10526:3;10449:89;:::i;:::-;10442:96;;10547:52;10592:6;10587:3;10580:4;10573:5;10569:16;10547:52;:::i;:::-;10624:6;10619:3;10615:16;10608:23;;10370:267;;;;;:::o;10643:375::-;;10806:67;10870:2;10865:3;10806:67;:::i;:::-;10799:74;;10903:34;10899:1;10894:3;10890:11;10883:55;10969:13;10964:2;10959:3;10955:12;10948:35;11009:2;11004:3;11000:12;10993:19;;10789:229;;;:::o;11024:382::-;;11187:67;11251:2;11246:3;11187:67;:::i;:::-;11180:74;;11284:34;11280:1;11275:3;11271:11;11264:55;11350:20;11345:2;11340:3;11336:12;11329:42;11397:2;11392:3;11388:12;11381:19;;11170:236;;;:::o;11412:370::-;;11575:67;11639:2;11634:3;11575:67;:::i;:::-;11568:74;;11672:34;11668:1;11663:3;11659:11;11652:55;11738:8;11733:2;11728:3;11724:12;11717:30;11773:2;11768:3;11764:12;11757:19;;11558:224;;;:::o;11788:326::-;;11951:67;12015:2;12010:3;11951:67;:::i;:::-;11944:74;;12048:30;12044:1;12039:3;12035:11;12028:51;12105:2;12100:3;12096:12;12089:19;;11934:180;;;:::o;12120:313::-;;12283:67;12347:2;12342:3;12283:67;:::i;:::-;12276:74;;12380:17;12376:1;12371:3;12367:11;12360:38;12424:2;12419:3;12415:12;12408:19;;12266:167;;;:::o;12439:368::-;;12602:67;12666:2;12661:3;12602:67;:::i;:::-;12595:74;;12699:34;12695:1;12690:3;12686:11;12679:55;12765:6;12760:2;12755:3;12751:12;12744:28;12798:2;12793:3;12789:12;12782:19;;12585:222;;;:::o;12813:323::-;;12976:67;13040:2;13035:3;12976:67;:::i;:::-;12969:74;;13073:27;13069:1;13064:3;13060:11;13053:48;13127:2;13122:3;13118:12;13111:19;;12959:177;;;:::o;13142:376::-;;13305:67;13369:2;13364:3;13305:67;:::i;:::-;13298:74;;13402:34;13398:1;13393:3;13389:11;13382:55;13468:14;13463:2;13458:3;13454:12;13447:36;13509:2;13504:3;13500:12;13493:19;;13288:230;;;:::o;13524:388::-;;13687:67;13751:2;13746:3;13687:67;:::i;:::-;13680:74;;13784:34;13780:1;13775:3;13771:11;13764:55;13850:26;13845:2;13840:3;13836:12;13829:48;13903:2;13898:3;13894:12;13887:19;;13670:242;;;:::o;13918:374::-;;14081:67;14145:2;14140:3;14081:67;:::i;:::-;14074:74;;14178:34;14174:1;14169:3;14165:11;14158:55;14244:12;14239:2;14234:3;14230:12;14223:34;14283:2;14278:3;14274:12;14267:19;;14064:228;;;:::o;14298:373::-;;14461:67;14525:2;14520:3;14461:67;:::i;:::-;14454:74;;14558:34;14554:1;14549:3;14545:11;14538:55;14624:11;14619:2;14614:3;14610:12;14603:33;14662:2;14657:3;14653:12;14646:19;;14444:227;;;:::o;14677:372::-;;14840:67;14904:2;14899:3;14840:67;:::i;:::-;14833:74;;14937:34;14933:1;14928:3;14924:11;14917:55;15003:10;14998:2;14993:3;14989:12;14982:32;15040:2;15035:3;15031:12;15024:19;;14823:226;;;:::o;15055:330::-;;15218:67;15282:2;15277:3;15218:67;:::i;:::-;15211:74;;15315:34;15311:1;15306:3;15302:11;15295:55;15376:2;15371:3;15367:12;15360:19;;15201:184;;;:::o;15391:376::-;;15554:67;15618:2;15613:3;15554:67;:::i;:::-;15547:74;;15651:34;15647:1;15642:3;15638:11;15631:55;15717:14;15712:2;15707:3;15703:12;15696:36;15758:2;15753:3;15749:12;15742:19;;15537:230;;;:::o;15773:330::-;;15936:67;16000:2;15995:3;15936:67;:::i;:::-;15929:74;;16033:34;16029:1;16024:3;16020:11;16013:55;16094:2;16089:3;16085:12;16078:19;;15919:184;;;:::o;16109:373::-;;16272:67;16336:2;16331:3;16272:67;:::i;:::-;16265:74;;16369:34;16365:1;16360:3;16356:11;16349:55;16435:11;16430:2;16425:3;16421:12;16414:33;16473:2;16468:3;16464:12;16457:19;;16255:227;;;:::o;16488:379::-;;16651:67;16715:2;16710:3;16651:67;:::i;:::-;16644:74;;16748:34;16744:1;16739:3;16735:11;16728:55;16814:17;16809:2;16804:3;16800:12;16793:39;16858:2;16853:3;16849:12;16842:19;;16634:233;;;:::o;16873:382::-;;17036:67;17100:2;17095:3;17036:67;:::i;:::-;17029:74;;17133:34;17129:1;17124:3;17120:11;17113:55;17199:20;17194:2;17189:3;17185:12;17178:42;17246:2;17241:3;17237:12;17230:19;;17019:236;;;:::o;17261:321::-;;17424:67;17488:2;17483:3;17424:67;:::i;:::-;17417:74;;17521:25;17517:1;17512:3;17508:11;17501:46;17573:2;17568:3;17564:12;17557:19;;17407:175;;;:::o;17588:329::-;;17751:67;17815:2;17810:3;17751:67;:::i;:::-;17744:74;;17848:33;17844:1;17839:3;17835:11;17828:54;17908:2;17903:3;17899:12;17892:19;;17734:183;;;:::o;17923:327::-;;18086:67;18150:2;18145:3;18086:67;:::i;:::-;18079:74;;18183:31;18179:1;18174:3;18170:11;18163:52;18241:2;18236:3;18232:12;18225:19;;18069:181;;;:::o;18256:365::-;;18419:67;18483:2;18478:3;18419:67;:::i;:::-;18412:74;;18516:34;18512:1;18507:3;18503:11;18496:55;18582:3;18577:2;18572:3;18568:12;18561:25;18612:2;18607:3;18603:12;18596:19;;18402:219;;;:::o;18627:328::-;;18790:67;18854:2;18849:3;18790:67;:::i;:::-;18783:74;;18887:32;18883:1;18878:3;18874:11;18867:53;18946:2;18941:3;18937:12;18930:19;;18773:182;;;:::o;18961:367::-;;19124:67;19188:2;19183:3;19124:67;:::i;:::-;19117:74;;19221:34;19217:1;19212:3;19208:11;19201:55;19287:5;19282:2;19277:3;19273:12;19266:27;19319:2;19314:3;19310:12;19303:19;;19107:221;;;:::o;19334:381::-;;19497:67;19561:2;19556:3;19497:67;:::i;:::-;19490:74;;19594:34;19590:1;19585:3;19581:11;19574:55;19660:19;19655:2;19650:3;19646:12;19639:41;19706:2;19701:3;19697:12;19690:19;;19480:235;;;:::o;19721:376::-;;19884:67;19948:2;19943:3;19884:67;:::i;:::-;19877:74;;19981:34;19977:1;19972:3;19968:11;19961:55;20047:14;20042:2;20037:3;20033:12;20026:36;20088:2;20083:3;20079:12;20072:19;;19867:230;;;:::o;20103:320::-;;20266:67;20330:2;20325:3;20266:67;:::i;:::-;20259:74;;20363:24;20359:1;20354:3;20350:11;20343:45;20414:2;20409:3;20405:12;20398:19;;20249:174;;;:::o;20429:108::-;20506:24;20524:5;20506:24;:::i;:::-;20501:3;20494:37;20484:53;;:::o;20543:118::-;20630:24;20648:5;20630:24;:::i;:::-;20625:3;20618:37;20608:53;;:::o;20667:435::-;;20869:95;20960:3;20951:6;20869:95;:::i;:::-;20862:102;;20981:95;21072:3;21063:6;20981:95;:::i;:::-;20974:102;;21093:3;21086:10;;20851:251;;;;;:::o;21108:222::-;;21239:2;21228:9;21224:18;21216:26;;21252:71;21320:1;21309:9;21305:17;21296:6;21252:71;:::i;:::-;21206:124;;;;:::o;21336:332::-;;21495:2;21484:9;21480:18;21472:26;;21508:71;21576:1;21565:9;21561:17;21552:6;21508:71;:::i;:::-;21589:72;21657:2;21646:9;21642:18;21633:6;21589:72;:::i;:::-;21462:206;;;;;:::o;21674:442::-;;21861:2;21850:9;21846:18;21838:26;;21874:71;21942:1;21931:9;21927:17;21918:6;21874:71;:::i;:::-;21955:72;22023:2;22012:9;22008:18;21999:6;21955:72;:::i;:::-;22037;22105:2;22094:9;22090:18;22081:6;22037:72;:::i;:::-;21828:288;;;;;;:::o;22122:640::-;;22355:3;22344:9;22340:19;22332:27;;22369:71;22437:1;22426:9;22422:17;22413:6;22369:71;:::i;:::-;22450:72;22518:2;22507:9;22503:18;22494:6;22450:72;:::i;:::-;22532;22600:2;22589:9;22585:18;22576:6;22532:72;:::i;:::-;22651:9;22645:4;22641:20;22636:2;22625:9;22621:18;22614:48;22679:76;22750:4;22741:6;22679:76;:::i;:::-;22671:84;;22322:440;;;;;;;:::o;22768:483::-;;22977:2;22966:9;22962:18;22954:26;;22990:71;23058:1;23047:9;23043:17;23034:6;22990:71;:::i;:::-;23108:9;23102:4;23098:20;23093:2;23082:9;23078:18;23071:48;23136:108;23239:4;23230:6;23136:108;:::i;:::-;23128:116;;22944:307;;;;;:::o;23257:332::-;;23416:2;23405:9;23401:18;23393:26;;23429:71;23497:1;23486:9;23482:17;23473:6;23429:71;:::i;:::-;23510:72;23578:2;23567:9;23563:18;23554:6;23510:72;:::i;:::-;23383:206;;;;;:::o;23595:210::-;;23720:2;23709:9;23705:18;23697:26;;23733:65;23795:1;23784:9;23780:17;23771:6;23733:65;:::i;:::-;23687:118;;;;:::o;23811:313::-;;23962:2;23951:9;23947:18;23939:26;;24011:9;24005:4;24001:20;23997:1;23986:9;23982:17;23975:47;24039:78;24112:4;24103:6;24039:78;:::i;:::-;24031:86;;23929:195;;;;:::o;24130:419::-;;24334:2;24323:9;24319:18;24311:26;;24383:9;24377:4;24373:20;24369:1;24358:9;24354:17;24347:47;24411:131;24537:4;24411:131;:::i;:::-;24403:139;;24301:248;;;:::o;24555:419::-;;24759:2;24748:9;24744:18;24736:26;;24808:9;24802:4;24798:20;24794:1;24783:9;24779:17;24772:47;24836:131;24962:4;24836:131;:::i;:::-;24828:139;;24726:248;;;:::o;24980:419::-;;25184:2;25173:9;25169:18;25161:26;;25233:9;25227:4;25223:20;25219:1;25208:9;25204:17;25197:47;25261:131;25387:4;25261:131;:::i;:::-;25253:139;;25151:248;;;:::o;25405:419::-;;25609:2;25598:9;25594:18;25586:26;;25658:9;25652:4;25648:20;25644:1;25633:9;25629:17;25622:47;25686:131;25812:4;25686:131;:::i;:::-;25678:139;;25576:248;;;:::o;25830:419::-;;26034:2;26023:9;26019:18;26011:26;;26083:9;26077:4;26073:20;26069:1;26058:9;26054:17;26047:47;26111:131;26237:4;26111:131;:::i;:::-;26103:139;;26001:248;;;:::o;26255:419::-;;26459:2;26448:9;26444:18;26436:26;;26508:9;26502:4;26498:20;26494:1;26483:9;26479:17;26472:47;26536:131;26662:4;26536:131;:::i;:::-;26528:139;;26426:248;;;:::o;26680:419::-;;26884:2;26873:9;26869:18;26861:26;;26933:9;26927:4;26923:20;26919:1;26908:9;26904:17;26897:47;26961:131;27087:4;26961:131;:::i;:::-;26953:139;;26851:248;;;:::o;27105:419::-;;27309:2;27298:9;27294:18;27286:26;;27358:9;27352:4;27348:20;27344:1;27333:9;27329:17;27322:47;27386:131;27512:4;27386:131;:::i;:::-;27378:139;;27276:248;;;:::o;27530:419::-;;27734:2;27723:9;27719:18;27711:26;;27783:9;27777:4;27773:20;27769:1;27758:9;27754:17;27747:47;27811:131;27937:4;27811:131;:::i;:::-;27803:139;;27701:248;;;:::o;27955:419::-;;28159:2;28148:9;28144:18;28136:26;;28208:9;28202:4;28198:20;28194:1;28183:9;28179:17;28172:47;28236:131;28362:4;28236:131;:::i;:::-;28228:139;;28126:248;;;:::o;28380:419::-;;28584:2;28573:9;28569:18;28561:26;;28633:9;28627:4;28623:20;28619:1;28608:9;28604:17;28597:47;28661:131;28787:4;28661:131;:::i;:::-;28653:139;;28551:248;;;:::o;28805:419::-;;29009:2;28998:9;28994:18;28986:26;;29058:9;29052:4;29048:20;29044:1;29033:9;29029:17;29022:47;29086:131;29212:4;29086:131;:::i;:::-;29078:139;;28976:248;;;:::o;29230:419::-;;29434:2;29423:9;29419:18;29411:26;;29483:9;29477:4;29473:20;29469:1;29458:9;29454:17;29447:47;29511:131;29637:4;29511:131;:::i;:::-;29503:139;;29401:248;;;:::o;29655:419::-;;29859:2;29848:9;29844:18;29836:26;;29908:9;29902:4;29898:20;29894:1;29883:9;29879:17;29872:47;29936:131;30062:4;29936:131;:::i;:::-;29928:139;;29826:248;;;:::o;30080:419::-;;30284:2;30273:9;30269:18;30261:26;;30333:9;30327:4;30323:20;30319:1;30308:9;30304:17;30297:47;30361:131;30487:4;30361:131;:::i;:::-;30353:139;;30251:248;;;:::o;30505:419::-;;30709:2;30698:9;30694:18;30686:26;;30758:9;30752:4;30748:20;30744:1;30733:9;30729:17;30722:47;30786:131;30912:4;30786:131;:::i;:::-;30778:139;;30676:248;;;:::o;30930:419::-;;31134:2;31123:9;31119:18;31111:26;;31183:9;31177:4;31173:20;31169:1;31158:9;31154:17;31147:47;31211:131;31337:4;31211:131;:::i;:::-;31203:139;;31101:248;;;:::o;31355:419::-;;31559:2;31548:9;31544:18;31536:26;;31608:9;31602:4;31598:20;31594:1;31583:9;31579:17;31572:47;31636:131;31762:4;31636:131;:::i;:::-;31628:139;;31526:248;;;:::o;31780:419::-;;31984:2;31973:9;31969:18;31961:26;;32033:9;32027:4;32023:20;32019:1;32008:9;32004:17;31997:47;32061:131;32187:4;32061:131;:::i;:::-;32053:139;;31951:248;;;:::o;32205:419::-;;32409:2;32398:9;32394:18;32386:26;;32458:9;32452:4;32448:20;32444:1;32433:9;32429:17;32422:47;32486:131;32612:4;32486:131;:::i;:::-;32478:139;;32376:248;;;:::o;32630:419::-;;32834:2;32823:9;32819:18;32811:26;;32883:9;32877:4;32873:20;32869:1;32858:9;32854:17;32847:47;32911:131;33037:4;32911:131;:::i;:::-;32903:139;;32801:248;;;:::o;33055:419::-;;33259:2;33248:9;33244:18;33236:26;;33308:9;33302:4;33298:20;33294:1;33283:9;33279:17;33272:47;33336:131;33462:4;33336:131;:::i;:::-;33328:139;;33226:248;;;:::o;33480:419::-;;33684:2;33673:9;33669:18;33661:26;;33733:9;33727:4;33723:20;33719:1;33708:9;33704:17;33697:47;33761:131;33887:4;33761:131;:::i;:::-;33753:139;;33651:248;;;:::o;33905:419::-;;34109:2;34098:9;34094:18;34086:26;;34158:9;34152:4;34148:20;34144:1;34133:9;34129:17;34122:47;34186:131;34312:4;34186:131;:::i;:::-;34178:139;;34076:248;;;:::o;34330:419::-;;34534:2;34523:9;34519:18;34511:26;;34583:9;34577:4;34573:20;34569:1;34558:9;34554:17;34547:47;34611:131;34737:4;34611:131;:::i;:::-;34603:139;;34501:248;;;:::o;34755:419::-;;34959:2;34948:9;34944:18;34936:26;;35008:9;35002:4;34998:20;34994:1;34983:9;34979:17;34972:47;35036:131;35162:4;35036:131;:::i;:::-;35028:139;;34926:248;;;:::o;35180:419::-;;35384:2;35373:9;35369:18;35361:26;;35433:9;35427:4;35423:20;35419:1;35408:9;35404:17;35397:47;35461:131;35587:4;35461:131;:::i;:::-;35453:139;;35351:248;;;:::o;35605:222::-;;35736:2;35725:9;35721:18;35713:26;;35749:71;35817:1;35806:9;35802:17;35793:6;35749:71;:::i;:::-;35703:124;;;;:::o;35833:283::-;;35899:2;35893:9;35883:19;;35941:4;35933:6;35929:17;36048:6;36036:10;36033:22;36012:18;36000:10;35997:34;35994:62;35991:2;;;36059:18;;:::i;:::-;35991:2;36099:10;36095:2;36088:22;35873:243;;;;:::o;36122:311::-;;36289:18;36281:6;36278:30;36275:2;;;36311:18;;:::i;:::-;36275:2;36361:4;36353:6;36349:17;36341:25;;36421:4;36415;36411:15;36403:23;;36204:229;;;:::o;36439:331::-;;36590:18;36582:6;36579:30;36576:2;;;36612:18;;:::i;:::-;36576:2;36697:4;36693:9;36686:4;36678:6;36674:17;36670:33;36662:41;;36758:4;36752;36748:15;36740:23;;36505:265;;;:::o;36776:332::-;;36928:18;36920:6;36917:30;36914:2;;;36950:18;;:::i;:::-;36914:2;37035:4;37031:9;37024:4;37016:6;37012:17;37008:33;37000:41;;37096:4;37090;37086:15;37078:23;;36843:265;;;:::o;37114:132::-;;37204:3;37196:11;;37234:4;37229:3;37225:14;37217:22;;37186:60;;;:::o;37252:114::-;;37353:5;37347:12;37337:22;;37326:40;;;:::o;37372:98::-;;37457:5;37451:12;37441:22;;37430:40;;;:::o;37476:99::-;;37562:5;37556:12;37546:22;;37535:40;;;:::o;37581:113::-;;37683:4;37678:3;37674:14;37666:22;;37656:38;;;:::o;37700:184::-;;37833:6;37828:3;37821:19;37873:4;37868:3;37864:14;37849:29;;37811:73;;;;:::o;37890:168::-;;38007:6;38002:3;37995:19;38047:4;38042:3;38038:14;38023:29;;37985:73;;;;:::o;38064:169::-;;38182:6;38177:3;38170:19;38222:4;38217:3;38213:14;38198:29;;38160:73;;;;:::o;38239:148::-;;38378:3;38363:18;;38353:34;;;;:::o;38393:305::-;;38452:20;38470:1;38452:20;:::i;:::-;38447:25;;38486:20;38504:1;38486:20;:::i;:::-;38481:25;;38640:1;38572:66;38568:74;38565:1;38562:81;38559:2;;;38646:18;;:::i;:::-;38559:2;38690:1;38687;38683:9;38676:16;;38437:261;;;;:::o;38704:185::-;;38761:20;38779:1;38761:20;:::i;:::-;38756:25;;38795:20;38813:1;38795:20;:::i;:::-;38790:25;;38834:1;38824:2;;38839:18;;:::i;:::-;38824:2;38881:1;38878;38874:9;38869:14;;38746:143;;;;:::o;38895:191::-;;38955:20;38973:1;38955:20;:::i;:::-;38950:25;;38989:20;39007:1;38989:20;:::i;:::-;38984:25;;39028:1;39025;39022:8;39019:2;;;39033:18;;:::i;:::-;39019:2;39078:1;39075;39071:9;39063:17;;38940:146;;;;:::o;39092:96::-;;39158:24;39176:5;39158:24;:::i;:::-;39147:35;;39137:51;;;:::o;39194:90::-;;39271:5;39264:13;39257:21;39246:32;;39236:48;;;:::o;39290:149::-;;39366:66;39359:5;39355:78;39344:89;;39334:105;;;:::o;39445:126::-;;39522:42;39515:5;39511:54;39500:65;;39490:81;;;:::o;39577:77::-;;39643:5;39632:16;;39622:32;;;:::o;39660:154::-;39744:6;39739:3;39734;39721:30;39806:1;39797:6;39792:3;39788:16;39781:27;39711:103;;;:::o;39820:307::-;39888:1;39898:113;39912:6;39909:1;39906:13;39898:113;;;39997:1;39992:3;39988:11;39982:18;39978:1;39973:3;39969:11;39962:39;39934:2;39931:1;39927:10;39922:15;;39898:113;;;40029:6;40026:1;40023:13;40020:2;;;40109:1;40100:6;40095:3;40091:16;40084:27;40020:2;39869:258;;;;:::o;40133:320::-;;40214:1;40208:4;40204:12;40194:22;;40261:1;40255:4;40251:12;40282:18;40272:2;;40338:4;40330:6;40326:17;40316:27;;40272:2;40400;40392:6;40389:14;40369:18;40366:38;40363:2;;;40419:18;;:::i;:::-;40363:2;40184:269;;;;:::o;40459:233::-;;40521:24;40539:5;40521:24;:::i;:::-;40512:33;;40567:66;40560:5;40557:77;40554:2;;;40637:18;;:::i;:::-;40554:2;40684:1;40677:5;40673:13;40666:20;;40502:190;;;:::o;40698:176::-;;40747:20;40765:1;40747:20;:::i;:::-;40742:25;;40781:20;40799:1;40781:20;:::i;:::-;40776:25;;40820:1;40810:2;;40825:18;;:::i;:::-;40810:2;40866:1;40863;40859:9;40854:14;;40732:142;;;;:::o;40880:180::-;40928:77;40925:1;40918:88;41025:4;41022:1;41015:15;41049:4;41046:1;41039:15;41066:180;41114:77;41111:1;41104:88;41211:4;41208:1;41201:15;41235:4;41232:1;41225:15;41252:180;41300:77;41297:1;41290:88;41397:4;41394:1;41387:15;41421:4;41418:1;41411:15;41438:180;41486:77;41483:1;41476:88;41583:4;41580:1;41573:15;41607:4;41604:1;41597:15;41624:102;;41716:2;41712:7;41707:2;41700:5;41696:14;41692:28;41682:38;;41672:54;;;:::o;41732:122::-;41805:24;41823:5;41805:24;:::i;:::-;41798:5;41795:35;41785:2;;41844:1;41841;41834:12;41785:2;41775:79;:::o;41860:116::-;41930:21;41945:5;41930:21;:::i;:::-;41923:5;41920:32;41910:2;;41966:1;41963;41956:12;41910:2;41900:76;:::o;41982:120::-;42054:23;42071:5;42054:23;:::i;:::-;42047:5;42044:34;42034:2;;42092:1;42089;42082:12;42034:2;42024:78;:::o;42108:122::-;42181:24;42199:5;42181:24;:::i;:::-;42174:5;42171:35;42161:2;;42220:1;42217;42210:12;42161:2;42151:79;:::o
Swarm Source
ipfs://f985f98a25577b3d90e64e2322bb78269b639daf19f64c2b000e773c9eab47bb
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.