ERC-721
Overview
Max Total Supply
800 FTM.Shrooms
Holders
190
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
1 FTM.ShroomsLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
Shrooms
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-11-19 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC-721 Non-Fungible Token Standard, optional 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; } } /** * @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 Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } /** * @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); } } contract Shrooms is ERC721Enumerable, Ownable { using Strings for uint256; string _baseTokenURI; address private admin = 0x27DF8590c11F2e5E7B0d0e00Ac8f39aFE0BA127E; uint256 public constant MAX_ENTRIES = 2500; uint[5] private PRICES = [ 35 ether, 45 ether, 60 ether, 80 ether, 0 ether ]; uint8 private currentPriceId; uint8 public maxPurchaseCount = 10; mapping (address=>uint256) public preMintedCnt; uint256 public whitelistAccessCount; mapping (address=>bool) public whitelisted; mapping (address=>uint256) public freeminted; bool public paused; enum STAGES { PRESALE, PUBLICSALE, FREESALE } STAGES stage = STAGES.PRESALE; uint256 public totalMinted; uint256 public sold; IERC721 private fantomBunch = IERC721(0x8e511Aefa68af20634A19577d40Ccf3C6504eaa3); IERC721 private babyPunk = IERC721(0xd7179025B82cb188A6Ce5A58E69e00F16c4E1843); IERC721 private degenerabBits = IERC721(0x8E7c434B248d49D873D0F8448E0FcEc895b1b92D); uint256[MAX_ENTRIES] internal availableIds; uint public maxCountForTeam = 250; uint public reservedCount; uint public startTime; constructor(string memory baseURI) ERC721("Fantom Shrooms", "FTM.Shrooms") { setBaseURI(baseURI); paused = true; } function reservedForTeam(uint amount) external { require(reservedCount + amount <= maxCountForTeam, "AMOUNT EXCEED FOR TEAM"); for(uint i = 0; i < amount; i++) { _safeMint(admin, _getNewId(totalMinted+i)); } totalMinted += amount; } function _getNewId(uint256 _totalMinted) internal returns(uint256 value) { uint256 remaining = MAX_ENTRIES - _totalMinted; uint256 rand = uint256(keccak256(abi.encodePacked(msg.sender, block.difficulty, block.timestamp, remaining))) % remaining; value = 0; // if array value exists, use, otherwise, use generated random value if (availableIds[rand] != 0) value = availableIds[rand]; else value = rand; // store remaining - 1 in used ID to create mapping if (availableIds[remaining - 1] == 0) availableIds[rand] = remaining - 1; else availableIds[rand] = availableIds[remaining - 1]; value += 1; } function mint(uint256 _amount) external payable { require(paused == false, 'Unable to mint'); require(_amount + totalMinted <= MAX_ENTRIES, 'Amount exceed'); if (stage == STAGES.PRESALE && (block.timestamp - startTime) >= 86400) { stage = STAGES.PUBLICSALE; } if (stage == STAGES.PRESALE) { require(getWhitelistState(msg.sender), 'Only whitelisted address can mint first 250 NFTs'); require(preMintedCnt[msg.sender]+_amount <= maxPurchaseCount, 'BUYABLE LIMIT EXCEED'); preMintedCnt[msg.sender] += _amount; } else if (stage == STAGES.PUBLICSALE) { require(sold + _amount <= 2000, 'Public sale amount exceed'); } else if (stage == STAGES.FREESALE) { require(balanceOf(msg.sender) > 0, 'Only a holder can mint this NFT'); require(freeminted[msg.sender] == 0, 'FREE MINT LIMIT EXCEED'); freeminted[msg.sender] += _amount; } uint256 amountForNextPrice = 500 - (sold % 500); uint256 estimatedPrice = 0; if (_amount > amountForNextPrice) estimatedPrice = PRICES[currentPriceId] * amountForNextPrice + PRICES[currentPriceId+1] * (_amount-amountForNextPrice); else estimatedPrice = PRICES[currentPriceId] * _amount; if (degenerabBits.balanceOf(msg.sender) > 0) { estimatedPrice = estimatedPrice * 90 / 100; } require(msg.value >= estimatedPrice, "FTM.Shrooms: incorrect price"); payable(admin).transfer(address(this).balance); for (uint8 i = 0; i < _amount; i++) _mint(msg.sender, _getNewId(totalMinted + i)); if (sold < 250 && sold + _amount >= 250) stage = STAGES.PUBLICSALE; else if (sold < 2000 && sold + _amount >= 2000) stage = STAGES.FREESALE; totalMinted += _amount; sold += _amount; if (_amount >= amountForNextPrice) currentPriceId += 1; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function getCurrentPrice() external view returns (uint256) { return PRICES[currentPriceId]; } function getCurrentStage() external view returns (STAGES) { if (stage == STAGES.PRESALE && (block.timestamp - startTime) >= 86400) { return STAGES.PUBLICSALE; } return stage; } function getWhitelistState(address user) public view returns(bool) { if(whitelisted[user] || fantomBunch.balanceOf(user) > 0 || babyPunk.balanceOf(user) > 0) { return true; } else return false; } function setWhitelistAddresses(address[] calldata addresses) external onlyOwner { for (uint8 i = 0; i < addresses.length; i++) whitelisted[addresses[i]] = true; whitelistAccessCount += addresses.length; } function isDiscountAddress(address user) external view returns (bool) { if (degenerabBits.balanceOf(user) > 0) return true; return false; } function startSale() external onlyOwner { require(paused == true); startTime = block.timestamp; paused = false; } function finishSale() external onlyOwner { require(paused == false); paused = true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_ENTRIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finishSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeminted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentStage","outputs":[{"internalType":"enum Shrooms.STAGES","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getWhitelistState","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":"address","name":"user","type":"address"}],"name":"isDiscountAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCountForTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchaseCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preMintedCnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reservedForTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setWhitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistAccessCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040527327df8590c11f2e5e7b0d0e00ac8f39afe0ba127e600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060a001604052806801e5b8fa8fe2ac000068ffffffffffffffffff168152602001680270801d946c94000068ffffffffffffffffff168152602001680340aad21b3b70000068ffffffffffffffffff1681526020016804563918244f40000068ffffffffffffffffff168152602001600068ffffffffffffffffff16815250600d906005620000ee92919062000507565b50600a601260016101000a81548160ff021916908360ff1602179055506000601760016101000a81548160ff0219169083600281111562000134576200013362000609565b5b0217905550738e511aefa68af20634a19577d40ccf3c6504eaa3601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d7179025b82cb188a6ce5a58e69e00f16c4e1843601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550738e7c434b248d49d873d0f8448e0fcec895b1b92d601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060fa6109e1553480156200024b57600080fd5b5060405162005c5738038062005c578339818101604052810190620002719190620007d5565b6040518060400160405280600e81526020017f46616e746f6d205368726f6f6d730000000000000000000000000000000000008152506040518060400160405280600b81526020017f46544d2e5368726f6f6d730000000000000000000000000000000000000000008152508160009080519060200190620002f592919062000559565b5080600190805190602001906200030e92919062000559565b50505062000331620003256200036460201b60201c565b6200036c60201b60201c565b62000342816200043260201b60201c565b6001601760006101000a81548160ff021916908315150217905550506200090e565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004426200036460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000468620004dd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004b89062000887565b60405180910390fd5b80600b9080519060200190620004d992919062000559565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b826005810192821562000546579160200282015b8281111562000545578251829068ffffffffffffffffff169055916020019190600101906200051b565b5b509050620005559190620005ea565b5090565b8280546200056790620008d8565b90600052602060002090601f0160209004810192826200058b5760008555620005d7565b82601f10620005a657805160ff1916838001178555620005d7565b82800160010185558215620005d7579182015b82811115620005d6578251825591602001919060010190620005b9565b5b509050620005e69190620005ea565b5090565b5b8082111562000605576000816000905550600101620005eb565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006a18262000656565b810181811067ffffffffffffffff82111715620006c357620006c262000667565b5b80604052505050565b6000620006d862000638565b9050620006e6828262000696565b919050565b600067ffffffffffffffff82111562000709576200070862000667565b5b620007148262000656565b9050602081019050919050565b60005b838110156200074157808201518184015260208101905062000724565b8381111562000751576000848401525b50505050565b60006200076e6200076884620006eb565b620006cc565b9050828152602081018484840111156200078d576200078c62000651565b5b6200079a84828562000721565b509392505050565b600082601f830112620007ba57620007b96200064c565b5b8151620007cc84826020860162000757565b91505092915050565b600060208284031215620007ee57620007ed62000642565b5b600082015167ffffffffffffffff8111156200080f576200080e62000647565b5b6200081d84828501620007a2565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200086f60208362000826565b91506200087c8262000837565b602082019050919050565b60006020820190508181036000830152620008a28162000860565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620008f157607f821691505b60208210811415620009085762000907620008a9565b5b50919050565b615339806200091e6000396000f3fe6080604052600436106102465760003560e01c806378e9792511610139578063b88d4fde116100b6578063eb91d37e1161007a578063eb91d37e14610899578063eedbe31d146108c4578063ef56267e146108ef578063f2fde38b1461092c578063f52ccc2d14610955578063ff2b75911461097e57610246565b8063b88d4fde1461078e578063c38f7617146107b7578063c87b56dd146107e2578063d936547e1461081f578063e985e9c51461085c57610246565b80639cf9fd73116100fd5780639cf9fd73146106dc578063a0712d6814610707578063a22cb46514610723578063a2309ff81461074c578063b66a0e5d1461077757610246565b806378e97925146106195780637d4cb964146106445780638da5cb5b1461066f5780638f86f5ea1461069a57806395d89b41146106b157610246565b80634007ed7c116101c75780635a64fa6b1161018b5780635a64fa6b146105205780635c975abb1461055d5780636352211e1461058857806370a08231146105c5578063715018a61461060257610246565b80634007ed7c1461042957806342842e0e146104665780634f6ccce71461048f5780635482fa25146104cc57806355f804b3146104f757610246565b806318160ddd1161020e57806318160ddd1461034457806323b872dd1461036f5780632f745c59146103985780633cf924a0146103d55780633d4373c01461040057610246565b806301ffc9a71461024b57806302c7e7af1461028857806306fdde03146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613865565b6109bb565b60405161027f91906138ad565b60405180910390f35b34801561029457600080fd5b5061029d610a35565b6040516102aa91906138e1565b60405180910390f35b3480156102bf57600080fd5b506102c8610a3b565b6040516102d59190613995565b60405180910390f35b3480156102ea57600080fd5b50610305600480360381019061030091906139e3565b610acd565b6040516103129190613a51565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613a98565b610b52565b005b34801561035057600080fd5b50610359610c6a565b60405161036691906138e1565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613ad8565b610c77565b005b3480156103a457600080fd5b506103bf60048036038101906103ba9190613a98565b610cd7565b6040516103cc91906138e1565b60405180910390f35b3480156103e157600080fd5b506103ea610d7c565b6040516103f79190613b47565b60405180910390f35b34801561040c57600080fd5b50610427600480360381019061042291906139e3565b610d8f565b005b34801561043557600080fd5b50610450600480360381019061044b9190613b62565b610e5f565b60405161045d91906138ad565b60405180910390f35b34801561047257600080fd5b5061048d60048036038101906104889190613ad8565b611030565b005b34801561049b57600080fd5b506104b660048036038101906104b191906139e3565b611050565b6040516104c391906138e1565b60405180910390f35b3480156104d857600080fd5b506104e16110c1565b6040516104ee91906138e1565b60405180910390f35b34801561050357600080fd5b5061051e60048036038101906105199190613cc4565b6110c8565b005b34801561052c57600080fd5b5061054760048036038101906105429190613b62565b61115e565b60405161055491906138ad565b60405180910390f35b34801561056957600080fd5b50610572611225565b60405161057f91906138ad565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa91906139e3565b611238565b6040516105bc9190613a51565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e79190613b62565b6112ea565b6040516105f991906138e1565b60405180910390f35b34801561060e57600080fd5b506106176113a2565b005b34801561062557600080fd5b5061062e61142a565b60405161063b91906138e1565b60405180910390f35b34801561065057600080fd5b50610659611431565b60405161066691906138e1565b60405180910390f35b34801561067b57600080fd5b50610684611437565b6040516106919190613a51565b60405180910390f35b3480156106a657600080fd5b506106af611461565b005b3480156106bd57600080fd5b506106c661151a565b6040516106d39190613995565b60405180910390f35b3480156106e857600080fd5b506106f16115ac565b6040516106fe91906138e1565b60405180910390f35b610721600480360381019061071c91906139e3565b6115b2565b005b34801561072f57600080fd5b5061074a60048036038101906107459190613d39565b611e1e565b005b34801561075857600080fd5b50610761611f9f565b60405161076e91906138e1565b60405180910390f35b34801561078357600080fd5b5061078c611fa5565b005b34801561079a57600080fd5b506107b560048036038101906107b09190613e1a565b612066565b005b3480156107c357600080fd5b506107cc6120c8565b6040516107d991906138e1565b60405180910390f35b3480156107ee57600080fd5b50610809600480360381019061080491906139e3565b6120cf565b6040516108169190613995565b60405180910390f35b34801561082b57600080fd5b5061084660048036038101906108419190613b62565b612176565b60405161085391906138ad565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190613e9d565b612196565b60405161089091906138ad565b60405180910390f35b3480156108a557600080fd5b506108ae61222a565b6040516108bb91906138e1565b60405180910390f35b3480156108d057600080fd5b506108d9612259565b6040516108e69190613f54565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613b62565b6122d2565b60405161092391906138e1565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190613b62565b6122ea565b005b34801561096157600080fd5b5061097c60048036038101906109779190613fcf565b6123e2565b005b34801561098a57600080fd5b506109a560048036038101906109a09190613b62565b612525565b6040516109b291906138e1565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2e5750610a2d8261253d565b5b9050919050565b60195481565b606060008054610a4a9061404b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a769061404b565b8015610ac35780601f10610a9857610100808354040283529160200191610ac3565b820191906000526020600020905b815481529060010190602001808311610aa657829003601f168201915b5050505050905090565b6000610ad88261261f565b610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e906140ef565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5d82611238565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc590614181565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bed61268b565b73ffffffffffffffffffffffffffffffffffffffff161480610c1c5750610c1b81610c1661268b565b612196565b5b610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5290614213565b60405180910390fd5b610c658383612693565b505050565b6000600880549050905090565b610c88610c8261268b565b8261274c565b610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe906142a5565b60405180910390fd5b610cd283838361282a565b505050565b6000610ce2836112ea565b8210610d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1a90614337565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601260019054906101000a900460ff1681565b6109e154816109e254610da29190614386565b1115610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90614428565b60405180910390fd5b60005b81811015610e4257610e2f600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610e2a83601854610e259190614386565b612a86565b612bc7565b8080610e3a90614448565b915050610de6565b508060186000828254610e559190614386565b9250508190555050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610f6357506000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610f119190613a51565b60206040518083038186803b158015610f2957600080fd5b505afa158015610f3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6191906144a6565b115b8061101857506000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610fc69190613a51565b60206040518083038186803b158015610fde57600080fd5b505afa158015610ff2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101691906144a6565b115b15611026576001905061102b565b600090505b919050565b61104b83838360405180602001604052806000815250612066565b505050565b600061105a610c6a565b821061109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290614545565b60405180910390fd5b600882815481106110af576110ae614565565b5b90600052602060002001549050919050565b6109e15481565b6110d061268b565b73ffffffffffffffffffffffffffffffffffffffff166110ee611437565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b906145e0565b60405180910390fd5b80600b908051906020019061115a929190613756565b5050565b600080601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016111bc9190613a51565b60206040518083038186803b1580156111d457600080fd5b505afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c91906144a6565b111561121b5760019050611220565b600090505b919050565b601760009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890614672565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561135b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135290614704565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113aa61268b565b73ffffffffffffffffffffffffffffffffffffffff166113c8611437565b73ffffffffffffffffffffffffffffffffffffffff161461141e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611415906145e0565b60405180910390fd5b6114286000612be5565b565b6109e35481565b6109c481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61146961268b565b73ffffffffffffffffffffffffffffffffffffffff16611487611437565b73ffffffffffffffffffffffffffffffffffffffff16146114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d4906145e0565b60405180910390fd5b60001515601760009054906101000a900460ff161515146114fd57600080fd5b6001601760006101000a81548160ff021916908315150217905550565b6060600180546115299061404b565b80601f01602080910402602001604051908101604052809291908181526020018280546115559061404b565b80156115a25780601f10611577576101008083540402835291602001916115a2565b820191906000526020600020905b81548152906001019060200180831161158557829003601f168201915b5050505050905090565b60145481565b60001515601760009054906101000a900460ff16151514611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff90614770565b60405180910390fd5b6109c4601854826116199190614386565b111561165a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611651906147dc565b60405180910390fd5b6000600281111561166e5761166d613edd565b5b601760019054906101000a900460ff1660028111156116905761168f613edd565b5b1480156116ae5750620151806109e354426116ab91906147fc565b10155b156116df576001601760016101000a81548160ff021916908360028111156116d9576116d8613edd565b5b02179055505b600060028111156116f3576116f2613edd565b5b601760019054906101000a900460ff16600281111561171557611714613edd565b5b141561185d5761172433610e5f565b611763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175a906148a2565b60405180910390fd5b601260019054906101000a900460ff1660ff1681601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117c19190614386565b1115611802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f99061490e565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118519190614386565b92505081905550611a51565b6001600281111561187157611870613edd565b5b601760019054906101000a900460ff16600281111561189357611892613edd565b5b14156118f0576107d0816019546118aa9190614386565b11156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e29061497a565b60405180910390fd5b611a50565b60028081111561190357611902613edd565b5b601760019054906101000a900460ff16600281111561192557611924613edd565b5b1415611a4f576000611936336112ea565b11611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196d906149e6565b60405180910390fd5b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90614a52565b60405180910390fd5b80601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a479190614386565b925050819055505b5b5b60006101f4601954611a639190614aa1565b6101f4611a7091906147fc565b9050600081831115611b0a578183611a8891906147fc565b600d6001601260009054906101000a900460ff16611aa69190614ad2565b60ff1660058110611aba57611ab9614565565b5b0154611ac69190614b09565b82600d601260009054906101000a900460ff1660ff1660058110611aed57611aec614565565b5b0154611af99190614b09565b611b039190614386565b9050611b40565b82600d601260009054906101000a900460ff1660ff1660058110611b3157611b30614565565b5b0154611b3d9190614b09565b90505b6000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611b9d9190613a51565b60206040518083038186803b158015611bb557600080fd5b505afa158015611bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bed91906144a6565b1115611c0f576064605a82611c029190614b09565b611c0c9190614b63565b90505b80341015611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990614be0565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611cba573d6000803e3d6000fd5b5060005b838160ff161015611cfe57611ceb33611ce68360ff16601854611ce19190614386565b612a86565b612cab565b8080611cf690614c00565b915050611cbe565b5060fa601954108015611d1f575060fa83601954611d1c9190614386565b10155b15611d54576001601760016101000a81548160ff02191690836002811115611d4a57611d49613edd565b5b0217905550611da8565b6107d0601954108015611d7657506107d083601954611d739190614386565b10155b15611da7576002601760016101000a81548160ff02191690836002811115611da157611da0613edd565b5b02179055505b5b8260186000828254611dba9190614386565b925050819055508260196000828254611dd39190614386565b92505081905550818310611e19576001601260008282829054906101000a900460ff16611e009190614ad2565b92506101000a81548160ff021916908360ff1602179055505b505050565b611e2661268b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90614c76565b60405180910390fd5b8060056000611ea161268b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f4e61268b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f9391906138ad565b60405180910390a35050565b60185481565b611fad61268b565b73ffffffffffffffffffffffffffffffffffffffff16611fcb611437565b73ffffffffffffffffffffffffffffffffffffffff1614612021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612018906145e0565b60405180910390fd5b60011515601760009054906101000a900460ff1615151461204157600080fd5b426109e3819055506000601760006101000a81548160ff021916908315150217905550565b61207761207161268b565b8361274c565b6120b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ad906142a5565b60405180910390fd5b6120c284848484612e79565b50505050565b6109e25481565b60606120da8261261f565b612119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211090614d08565b60405180910390fd5b6000612123612ed5565b90506000815111612143576040518060200160405280600081525061216e565b8061214d84612f67565b60405160200161215e929190614d64565b6040516020818303038152906040525b915050919050565b60156020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600d601260009054906101000a900460ff1660ff166005811061225257612251614565565b5b0154905090565b600080600281111561226e5761226d613edd565b5b601760019054906101000a900460ff1660028111156122905761228f613edd565b5b1480156122ae5750620151806109e354426122ab91906147fc565b10155b156122bc57600190506122cf565b601760019054906101000a900460ff1690505b90565b60166020528060005260406000206000915090505481565b6122f261268b565b73ffffffffffffffffffffffffffffffffffffffff16612310611437565b73ffffffffffffffffffffffffffffffffffffffff1614612366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235d906145e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614dfa565b60405180910390fd5b6123df81612be5565b50565b6123ea61268b565b73ffffffffffffffffffffffffffffffffffffffff16612408611437565b73ffffffffffffffffffffffffffffffffffffffff161461245e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612455906145e0565b60405180910390fd5b60005b828290508160ff1610156125045760016015600085858560ff1681811061248b5761248a614565565b5b90506020020160208101906124a09190613b62565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806124fc90614c00565b915050612461565b50818190506014600082825461251a9190614386565b925050819055505050565b60136020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061260857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126185750612617826130c8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661270683611238565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127578261261f565b612796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d90614e8c565b60405180910390fd5b60006127a183611238565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061281057508373ffffffffffffffffffffffffffffffffffffffff166127f884610acd565b73ffffffffffffffffffffffffffffffffffffffff16145b8061282157506128208185612196565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661284a82611238565b73ffffffffffffffffffffffffffffffffffffffff16146128a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289790614f1e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290790614fb0565b60405180910390fd5b61291b838383613132565b612926600082612693565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461297691906147fc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129cd9190614386565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080826109c4612a9791906147fc565b905060008133444285604051602001612ab39493929190615039565b6040516020818303038152906040528051906020012060001c612ad69190614aa1565b9050600092506000601d826109c48110612af357612af2614565565b5b015414612b1857601d816109c48110612b0f57612b0e614565565b5b01549250612b1c565b8092505b6000601d600184612b2d91906147fc565b6109c48110612b3f57612b3e614565565b5b01541415612b7357600182612b5491906147fc565b601d826109c48110612b6957612b68614565565b5b0181905550612bb1565b601d600183612b8291906147fc565b6109c48110612b9457612b93614565565b5b0154601d826109c48110612bab57612baa614565565b5b01819055505b600183612bbe9190614386565b92505050919050565b612be1828260405180602001604052806000815250613246565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d12906150d3565b60405180910390fd5b612d248161261f565b15612d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5b9061513f565b60405180910390fd5b612d7060008383613132565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dc09190614386565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612e8484848461282a565b612e90848484846132a1565b612ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec6906151d1565b60405180910390fd5b50505050565b6060600b8054612ee49061404b565b80601f0160208091040260200160405190810160405280929190818152602001828054612f109061404b565b8015612f5d5780601f10612f3257610100808354040283529160200191612f5d565b820191906000526020600020905b815481529060010190602001808311612f4057829003601f168201915b5050505050905090565b60606000821415612faf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130c3565b600082905060005b60008214612fe1578080612fca90614448565b915050600a82612fda9190614b63565b9150612fb7565b60008167ffffffffffffffff811115612ffd57612ffc613b99565b5b6040519080825280601f01601f19166020018201604052801561302f5781602001600182028036833780820191505090505b5090505b600085146130bc5760018261304891906147fc565b9150600a856130579190614aa1565b60306130639190614386565b60f81b81838151811061307957613078614565565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130b59190614b63565b9450613033565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61313d838383613438565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131805761317b8161343d565b6131bf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131be576131bd8382613486565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613202576131fd816135f3565b613241565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132405761323f82826136c4565b5b5b505050565b6132508383612cab565b61325d60008484846132a1565b61329c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613293906151d1565b60405180910390fd5b505050565b60006132c28473ffffffffffffffffffffffffffffffffffffffff16613743565b1561342b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132eb61268b565b8786866040518563ffffffff1660e01b815260040161330d9493929190615246565b602060405180830381600087803b15801561332757600080fd5b505af192505050801561335857506040513d601f19601f8201168201806040525081019061335591906152a7565b60015b6133db573d8060008114613388576040519150601f19603f3d011682016040523d82523d6000602084013e61338d565b606091505b506000815114156133d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ca906151d1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613430565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613493846112ea565b61349d91906147fc565b9050600060076000848152602001908152602001600020549050818114613582576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061360791906147fc565b905060006009600084815260200190815260200160002054905060006008838154811061363757613636614565565b5b90600052602060002001549050806008838154811061365957613658614565565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136a8576136a76152d4565b5b6001900381819060005260206000200160009055905550505050565b60006136cf836112ea565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546137629061404b565b90600052602060002090601f01602090048101928261378457600085556137cb565b82601f1061379d57805160ff19168380011785556137cb565b828001600101855582156137cb579182015b828111156137ca5782518255916020019190600101906137af565b5b5090506137d891906137dc565b5090565b5b808211156137f55760008160009055506001016137dd565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138428161380d565b811461384d57600080fd5b50565b60008135905061385f81613839565b92915050565b60006020828403121561387b5761387a613803565b5b600061388984828501613850565b91505092915050565b60008115159050919050565b6138a781613892565b82525050565b60006020820190506138c2600083018461389e565b92915050565b6000819050919050565b6138db816138c8565b82525050565b60006020820190506138f660008301846138d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561393657808201518184015260208101905061391b565b83811115613945576000848401525b50505050565b6000601f19601f8301169050919050565b6000613967826138fc565b6139718185613907565b9350613981818560208601613918565b61398a8161394b565b840191505092915050565b600060208201905081810360008301526139af818461395c565b905092915050565b6139c0816138c8565b81146139cb57600080fd5b50565b6000813590506139dd816139b7565b92915050565b6000602082840312156139f9576139f8613803565b5b6000613a07848285016139ce565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a3b82613a10565b9050919050565b613a4b81613a30565b82525050565b6000602082019050613a666000830184613a42565b92915050565b613a7581613a30565b8114613a8057600080fd5b50565b600081359050613a9281613a6c565b92915050565b60008060408385031215613aaf57613aae613803565b5b6000613abd85828601613a83565b9250506020613ace858286016139ce565b9150509250929050565b600080600060608486031215613af157613af0613803565b5b6000613aff86828701613a83565b9350506020613b1086828701613a83565b9250506040613b21868287016139ce565b9150509250925092565b600060ff82169050919050565b613b4181613b2b565b82525050565b6000602082019050613b5c6000830184613b38565b92915050565b600060208284031215613b7857613b77613803565b5b6000613b8684828501613a83565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bd18261394b565b810181811067ffffffffffffffff82111715613bf057613bef613b99565b5b80604052505050565b6000613c036137f9565b9050613c0f8282613bc8565b919050565b600067ffffffffffffffff821115613c2f57613c2e613b99565b5b613c388261394b565b9050602081019050919050565b82818337600083830152505050565b6000613c67613c6284613c14565b613bf9565b905082815260208101848484011115613c8357613c82613b94565b5b613c8e848285613c45565b509392505050565b600082601f830112613cab57613caa613b8f565b5b8135613cbb848260208601613c54565b91505092915050565b600060208284031215613cda57613cd9613803565b5b600082013567ffffffffffffffff811115613cf857613cf7613808565b5b613d0484828501613c96565b91505092915050565b613d1681613892565b8114613d2157600080fd5b50565b600081359050613d3381613d0d565b92915050565b60008060408385031215613d5057613d4f613803565b5b6000613d5e85828601613a83565b9250506020613d6f85828601613d24565b9150509250929050565b600067ffffffffffffffff821115613d9457613d93613b99565b5b613d9d8261394b565b9050602081019050919050565b6000613dbd613db884613d79565b613bf9565b905082815260208101848484011115613dd957613dd8613b94565b5b613de4848285613c45565b509392505050565b600082601f830112613e0157613e00613b8f565b5b8135613e11848260208601613daa565b91505092915050565b60008060008060808587031215613e3457613e33613803565b5b6000613e4287828801613a83565b9450506020613e5387828801613a83565b9350506040613e64878288016139ce565b925050606085013567ffffffffffffffff811115613e8557613e84613808565b5b613e9187828801613dec565b91505092959194509250565b60008060408385031215613eb457613eb3613803565b5b6000613ec285828601613a83565b9250506020613ed385828601613a83565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613f1d57613f1c613edd565b5b50565b6000819050613f2e82613f0c565b919050565b6000613f3e82613f20565b9050919050565b613f4e81613f33565b82525050565b6000602082019050613f696000830184613f45565b92915050565b600080fd5b600080fd5b60008083601f840112613f8f57613f8e613b8f565b5b8235905067ffffffffffffffff811115613fac57613fab613f6f565b5b602083019150836020820283011115613fc857613fc7613f74565b5b9250929050565b60008060208385031215613fe657613fe5613803565b5b600083013567ffffffffffffffff81111561400457614003613808565b5b61401085828601613f79565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061406357607f821691505b602082108114156140775761407661401c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006140d9602c83613907565b91506140e48261407d565b604082019050919050565b60006020820190508181036000830152614108816140cc565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061416b602183613907565b91506141768261410f565b604082019050919050565b6000602082019050818103600083015261419a8161415e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006141fd603883613907565b9150614208826141a1565b604082019050919050565b6000602082019050818103600083015261422c816141f0565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061428f603183613907565b915061429a82614233565b604082019050919050565b600060208201905081810360008301526142be81614282565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614321602b83613907565b915061432c826142c5565b604082019050919050565b6000602082019050818103600083015261435081614314565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614391826138c8565b915061439c836138c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143d1576143d0614357565b5b828201905092915050565b7f414d4f554e542045584345454420464f52205445414d00000000000000000000600082015250565b6000614412601683613907565b915061441d826143dc565b602082019050919050565b6000602082019050818103600083015261444181614405565b9050919050565b6000614453826138c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561448657614485614357565b5b600182019050919050565b6000815190506144a0816139b7565b92915050565b6000602082840312156144bc576144bb613803565b5b60006144ca84828501614491565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061452f602c83613907565b915061453a826144d3565b604082019050919050565b6000602082019050818103600083015261455e81614522565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006145ca602083613907565b91506145d582614594565b602082019050919050565b600060208201905081810360008301526145f9816145bd565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061465c602983613907565b915061466782614600565b604082019050919050565b6000602082019050818103600083015261468b8161464f565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006146ee602a83613907565b91506146f982614692565b604082019050919050565b6000602082019050818103600083015261471d816146e1565b9050919050565b7f556e61626c6520746f206d696e74000000000000000000000000000000000000600082015250565b600061475a600e83613907565b915061476582614724565b602082019050919050565b600060208201905081810360008301526147898161474d565b9050919050565b7f416d6f756e742065786365656400000000000000000000000000000000000000600082015250565b60006147c6600d83613907565b91506147d182614790565b602082019050919050565b600060208201905081810360008301526147f5816147b9565b9050919050565b6000614807826138c8565b9150614812836138c8565b92508282101561482557614824614357565b5b828203905092915050565b7f4f6e6c792077686974656c697374656420616464726573732063616e206d696e60008201527f7420666972737420323530204e46547300000000000000000000000000000000602082015250565b600061488c603083613907565b915061489782614830565b604082019050919050565b600060208201905081810360008301526148bb8161487f565b9050919050565b7f42555941424c45204c494d495420455843454544000000000000000000000000600082015250565b60006148f8601483613907565b9150614903826148c2565b602082019050919050565b60006020820190508181036000830152614927816148eb565b9050919050565b7f5075626c69632073616c6520616d6f756e742065786365656400000000000000600082015250565b6000614964601983613907565b915061496f8261492e565b602082019050919050565b6000602082019050818103600083015261499381614957565b9050919050565b7f4f6e6c79206120686f6c6465722063616e206d696e742074686973204e465400600082015250565b60006149d0601f83613907565b91506149db8261499a565b602082019050919050565b600060208201905081810360008301526149ff816149c3565b9050919050565b7f46524545204d494e54204c494d49542045584345454400000000000000000000600082015250565b6000614a3c601683613907565b9150614a4782614a06565b602082019050919050565b60006020820190508181036000830152614a6b81614a2f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614aac826138c8565b9150614ab7836138c8565b925082614ac757614ac6614a72565b5b828206905092915050565b6000614add82613b2b565b9150614ae883613b2b565b92508260ff03821115614afe57614afd614357565b5b828201905092915050565b6000614b14826138c8565b9150614b1f836138c8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b5857614b57614357565b5b828202905092915050565b6000614b6e826138c8565b9150614b79836138c8565b925082614b8957614b88614a72565b5b828204905092915050565b7f46544d2e5368726f6f6d733a20696e636f727265637420707269636500000000600082015250565b6000614bca601c83613907565b9150614bd582614b94565b602082019050919050565b60006020820190508181036000830152614bf981614bbd565b9050919050565b6000614c0b82613b2b565b915060ff821415614c1f57614c1e614357565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614c60601983613907565b9150614c6b82614c2a565b602082019050919050565b60006020820190508181036000830152614c8f81614c53565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614cf2602f83613907565b9150614cfd82614c96565b604082019050919050565b60006020820190508181036000830152614d2181614ce5565b9050919050565b600081905092915050565b6000614d3e826138fc565b614d488185614d28565b9350614d58818560208601613918565b80840191505092915050565b6000614d708285614d33565b9150614d7c8284614d33565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614de4602683613907565b9150614def82614d88565b604082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614e76602c83613907565b9150614e8182614e1a565b604082019050919050565b60006020820190508181036000830152614ea581614e69565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614f08602983613907565b9150614f1382614eac565b604082019050919050565b60006020820190508181036000830152614f3781614efb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f9a602483613907565b9150614fa582614f3e565b604082019050919050565b60006020820190508181036000830152614fc981614f8d565b9050919050565b60008160601b9050919050565b6000614fe882614fd0565b9050919050565b6000614ffa82614fdd565b9050919050565b61501261500d82613a30565b614fef565b82525050565b6000819050919050565b61503361502e826138c8565b615018565b82525050565b60006150458287615001565b6014820191506150558286615022565b6020820191506150658285615022565b6020820191506150758284615022565b60208201915081905095945050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006150bd602083613907565b91506150c882615087565b602082019050919050565b600060208201905081810360008301526150ec816150b0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615129601c83613907565b9150615134826150f3565b602082019050919050565b600060208201905081810360008301526151588161511c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006151bb603283613907565b91506151c68261515f565b604082019050919050565b600060208201905081810360008301526151ea816151ae565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615218826151f1565b61522281856151fc565b9350615232818560208601613918565b61523b8161394b565b840191505092915050565b600060808201905061525b6000830187613a42565b6152686020830186613a42565b61527560408301856138d2565b8181036060830152615287818461520d565b905095945050505050565b6000815190506152a181613839565b92915050565b6000602082840312156152bd576152bc613803565b5b60006152cb84828501615292565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220860a06add574cdb6a37fa589c781958c06c2b8a94dbdbed6522937383295a27764736f6c634300080900330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d53767755777765564e5733754633654d756d393659313658555445753739764676526a554a4e6f75653456582f000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102465760003560e01c806378e9792511610139578063b88d4fde116100b6578063eb91d37e1161007a578063eb91d37e14610899578063eedbe31d146108c4578063ef56267e146108ef578063f2fde38b1461092c578063f52ccc2d14610955578063ff2b75911461097e57610246565b8063b88d4fde1461078e578063c38f7617146107b7578063c87b56dd146107e2578063d936547e1461081f578063e985e9c51461085c57610246565b80639cf9fd73116100fd5780639cf9fd73146106dc578063a0712d6814610707578063a22cb46514610723578063a2309ff81461074c578063b66a0e5d1461077757610246565b806378e97925146106195780637d4cb964146106445780638da5cb5b1461066f5780638f86f5ea1461069a57806395d89b41146106b157610246565b80634007ed7c116101c75780635a64fa6b1161018b5780635a64fa6b146105205780635c975abb1461055d5780636352211e1461058857806370a08231146105c5578063715018a61461060257610246565b80634007ed7c1461042957806342842e0e146104665780634f6ccce71461048f5780635482fa25146104cc57806355f804b3146104f757610246565b806318160ddd1161020e57806318160ddd1461034457806323b872dd1461036f5780632f745c59146103985780633cf924a0146103d55780633d4373c01461040057610246565b806301ffc9a71461024b57806302c7e7af1461028857806306fdde03146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613865565b6109bb565b60405161027f91906138ad565b60405180910390f35b34801561029457600080fd5b5061029d610a35565b6040516102aa91906138e1565b60405180910390f35b3480156102bf57600080fd5b506102c8610a3b565b6040516102d59190613995565b60405180910390f35b3480156102ea57600080fd5b50610305600480360381019061030091906139e3565b610acd565b6040516103129190613a51565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613a98565b610b52565b005b34801561035057600080fd5b50610359610c6a565b60405161036691906138e1565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613ad8565b610c77565b005b3480156103a457600080fd5b506103bf60048036038101906103ba9190613a98565b610cd7565b6040516103cc91906138e1565b60405180910390f35b3480156103e157600080fd5b506103ea610d7c565b6040516103f79190613b47565b60405180910390f35b34801561040c57600080fd5b50610427600480360381019061042291906139e3565b610d8f565b005b34801561043557600080fd5b50610450600480360381019061044b9190613b62565b610e5f565b60405161045d91906138ad565b60405180910390f35b34801561047257600080fd5b5061048d60048036038101906104889190613ad8565b611030565b005b34801561049b57600080fd5b506104b660048036038101906104b191906139e3565b611050565b6040516104c391906138e1565b60405180910390f35b3480156104d857600080fd5b506104e16110c1565b6040516104ee91906138e1565b60405180910390f35b34801561050357600080fd5b5061051e60048036038101906105199190613cc4565b6110c8565b005b34801561052c57600080fd5b5061054760048036038101906105429190613b62565b61115e565b60405161055491906138ad565b60405180910390f35b34801561056957600080fd5b50610572611225565b60405161057f91906138ad565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa91906139e3565b611238565b6040516105bc9190613a51565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e79190613b62565b6112ea565b6040516105f991906138e1565b60405180910390f35b34801561060e57600080fd5b506106176113a2565b005b34801561062557600080fd5b5061062e61142a565b60405161063b91906138e1565b60405180910390f35b34801561065057600080fd5b50610659611431565b60405161066691906138e1565b60405180910390f35b34801561067b57600080fd5b50610684611437565b6040516106919190613a51565b60405180910390f35b3480156106a657600080fd5b506106af611461565b005b3480156106bd57600080fd5b506106c661151a565b6040516106d39190613995565b60405180910390f35b3480156106e857600080fd5b506106f16115ac565b6040516106fe91906138e1565b60405180910390f35b610721600480360381019061071c91906139e3565b6115b2565b005b34801561072f57600080fd5b5061074a60048036038101906107459190613d39565b611e1e565b005b34801561075857600080fd5b50610761611f9f565b60405161076e91906138e1565b60405180910390f35b34801561078357600080fd5b5061078c611fa5565b005b34801561079a57600080fd5b506107b560048036038101906107b09190613e1a565b612066565b005b3480156107c357600080fd5b506107cc6120c8565b6040516107d991906138e1565b60405180910390f35b3480156107ee57600080fd5b50610809600480360381019061080491906139e3565b6120cf565b6040516108169190613995565b60405180910390f35b34801561082b57600080fd5b5061084660048036038101906108419190613b62565b612176565b60405161085391906138ad565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190613e9d565b612196565b60405161089091906138ad565b60405180910390f35b3480156108a557600080fd5b506108ae61222a565b6040516108bb91906138e1565b60405180910390f35b3480156108d057600080fd5b506108d9612259565b6040516108e69190613f54565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613b62565b6122d2565b60405161092391906138e1565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190613b62565b6122ea565b005b34801561096157600080fd5b5061097c60048036038101906109779190613fcf565b6123e2565b005b34801561098a57600080fd5b506109a560048036038101906109a09190613b62565b612525565b6040516109b291906138e1565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2e5750610a2d8261253d565b5b9050919050565b60195481565b606060008054610a4a9061404b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a769061404b565b8015610ac35780601f10610a9857610100808354040283529160200191610ac3565b820191906000526020600020905b815481529060010190602001808311610aa657829003601f168201915b5050505050905090565b6000610ad88261261f565b610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e906140ef565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5d82611238565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc590614181565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bed61268b565b73ffffffffffffffffffffffffffffffffffffffff161480610c1c5750610c1b81610c1661268b565b612196565b5b610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5290614213565b60405180910390fd5b610c658383612693565b505050565b6000600880549050905090565b610c88610c8261268b565b8261274c565b610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe906142a5565b60405180910390fd5b610cd283838361282a565b505050565b6000610ce2836112ea565b8210610d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1a90614337565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601260019054906101000a900460ff1681565b6109e154816109e254610da29190614386565b1115610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90614428565b60405180910390fd5b60005b81811015610e4257610e2f600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610e2a83601854610e259190614386565b612a86565b612bc7565b8080610e3a90614448565b915050610de6565b508060186000828254610e559190614386565b9250508190555050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610f6357506000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610f119190613a51565b60206040518083038186803b158015610f2957600080fd5b505afa158015610f3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6191906144a6565b115b8061101857506000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610fc69190613a51565b60206040518083038186803b158015610fde57600080fd5b505afa158015610ff2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101691906144a6565b115b15611026576001905061102b565b600090505b919050565b61104b83838360405180602001604052806000815250612066565b505050565b600061105a610c6a565b821061109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290614545565b60405180910390fd5b600882815481106110af576110ae614565565b5b90600052602060002001549050919050565b6109e15481565b6110d061268b565b73ffffffffffffffffffffffffffffffffffffffff166110ee611437565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b906145e0565b60405180910390fd5b80600b908051906020019061115a929190613756565b5050565b600080601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016111bc9190613a51565b60206040518083038186803b1580156111d457600080fd5b505afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c91906144a6565b111561121b5760019050611220565b600090505b919050565b601760009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890614672565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561135b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135290614704565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113aa61268b565b73ffffffffffffffffffffffffffffffffffffffff166113c8611437565b73ffffffffffffffffffffffffffffffffffffffff161461141e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611415906145e0565b60405180910390fd5b6114286000612be5565b565b6109e35481565b6109c481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61146961268b565b73ffffffffffffffffffffffffffffffffffffffff16611487611437565b73ffffffffffffffffffffffffffffffffffffffff16146114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d4906145e0565b60405180910390fd5b60001515601760009054906101000a900460ff161515146114fd57600080fd5b6001601760006101000a81548160ff021916908315150217905550565b6060600180546115299061404b565b80601f01602080910402602001604051908101604052809291908181526020018280546115559061404b565b80156115a25780601f10611577576101008083540402835291602001916115a2565b820191906000526020600020905b81548152906001019060200180831161158557829003601f168201915b5050505050905090565b60145481565b60001515601760009054906101000a900460ff16151514611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff90614770565b60405180910390fd5b6109c4601854826116199190614386565b111561165a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611651906147dc565b60405180910390fd5b6000600281111561166e5761166d613edd565b5b601760019054906101000a900460ff1660028111156116905761168f613edd565b5b1480156116ae5750620151806109e354426116ab91906147fc565b10155b156116df576001601760016101000a81548160ff021916908360028111156116d9576116d8613edd565b5b02179055505b600060028111156116f3576116f2613edd565b5b601760019054906101000a900460ff16600281111561171557611714613edd565b5b141561185d5761172433610e5f565b611763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175a906148a2565b60405180910390fd5b601260019054906101000a900460ff1660ff1681601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117c19190614386565b1115611802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f99061490e565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118519190614386565b92505081905550611a51565b6001600281111561187157611870613edd565b5b601760019054906101000a900460ff16600281111561189357611892613edd565b5b14156118f0576107d0816019546118aa9190614386565b11156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e29061497a565b60405180910390fd5b611a50565b60028081111561190357611902613edd565b5b601760019054906101000a900460ff16600281111561192557611924613edd565b5b1415611a4f576000611936336112ea565b11611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196d906149e6565b60405180910390fd5b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90614a52565b60405180910390fd5b80601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a479190614386565b925050819055505b5b5b60006101f4601954611a639190614aa1565b6101f4611a7091906147fc565b9050600081831115611b0a578183611a8891906147fc565b600d6001601260009054906101000a900460ff16611aa69190614ad2565b60ff1660058110611aba57611ab9614565565b5b0154611ac69190614b09565b82600d601260009054906101000a900460ff1660ff1660058110611aed57611aec614565565b5b0154611af99190614b09565b611b039190614386565b9050611b40565b82600d601260009054906101000a900460ff1660ff1660058110611b3157611b30614565565b5b0154611b3d9190614b09565b90505b6000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611b9d9190613a51565b60206040518083038186803b158015611bb557600080fd5b505afa158015611bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bed91906144a6565b1115611c0f576064605a82611c029190614b09565b611c0c9190614b63565b90505b80341015611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990614be0565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611cba573d6000803e3d6000fd5b5060005b838160ff161015611cfe57611ceb33611ce68360ff16601854611ce19190614386565b612a86565b612cab565b8080611cf690614c00565b915050611cbe565b5060fa601954108015611d1f575060fa83601954611d1c9190614386565b10155b15611d54576001601760016101000a81548160ff02191690836002811115611d4a57611d49613edd565b5b0217905550611da8565b6107d0601954108015611d7657506107d083601954611d739190614386565b10155b15611da7576002601760016101000a81548160ff02191690836002811115611da157611da0613edd565b5b02179055505b5b8260186000828254611dba9190614386565b925050819055508260196000828254611dd39190614386565b92505081905550818310611e19576001601260008282829054906101000a900460ff16611e009190614ad2565b92506101000a81548160ff021916908360ff1602179055505b505050565b611e2661268b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90614c76565b60405180910390fd5b8060056000611ea161268b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f4e61268b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f9391906138ad565b60405180910390a35050565b60185481565b611fad61268b565b73ffffffffffffffffffffffffffffffffffffffff16611fcb611437565b73ffffffffffffffffffffffffffffffffffffffff1614612021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612018906145e0565b60405180910390fd5b60011515601760009054906101000a900460ff1615151461204157600080fd5b426109e3819055506000601760006101000a81548160ff021916908315150217905550565b61207761207161268b565b8361274c565b6120b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ad906142a5565b60405180910390fd5b6120c284848484612e79565b50505050565b6109e25481565b60606120da8261261f565b612119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211090614d08565b60405180910390fd5b6000612123612ed5565b90506000815111612143576040518060200160405280600081525061216e565b8061214d84612f67565b60405160200161215e929190614d64565b6040516020818303038152906040525b915050919050565b60156020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600d601260009054906101000a900460ff1660ff166005811061225257612251614565565b5b0154905090565b600080600281111561226e5761226d613edd565b5b601760019054906101000a900460ff1660028111156122905761228f613edd565b5b1480156122ae5750620151806109e354426122ab91906147fc565b10155b156122bc57600190506122cf565b601760019054906101000a900460ff1690505b90565b60166020528060005260406000206000915090505481565b6122f261268b565b73ffffffffffffffffffffffffffffffffffffffff16612310611437565b73ffffffffffffffffffffffffffffffffffffffff1614612366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235d906145e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614dfa565b60405180910390fd5b6123df81612be5565b50565b6123ea61268b565b73ffffffffffffffffffffffffffffffffffffffff16612408611437565b73ffffffffffffffffffffffffffffffffffffffff161461245e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612455906145e0565b60405180910390fd5b60005b828290508160ff1610156125045760016015600085858560ff1681811061248b5761248a614565565b5b90506020020160208101906124a09190613b62565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806124fc90614c00565b915050612461565b50818190506014600082825461251a9190614386565b925050819055505050565b60136020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061260857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126185750612617826130c8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661270683611238565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127578261261f565b612796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d90614e8c565b60405180910390fd5b60006127a183611238565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061281057508373ffffffffffffffffffffffffffffffffffffffff166127f884610acd565b73ffffffffffffffffffffffffffffffffffffffff16145b8061282157506128208185612196565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661284a82611238565b73ffffffffffffffffffffffffffffffffffffffff16146128a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289790614f1e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290790614fb0565b60405180910390fd5b61291b838383613132565b612926600082612693565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461297691906147fc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129cd9190614386565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080826109c4612a9791906147fc565b905060008133444285604051602001612ab39493929190615039565b6040516020818303038152906040528051906020012060001c612ad69190614aa1565b9050600092506000601d826109c48110612af357612af2614565565b5b015414612b1857601d816109c48110612b0f57612b0e614565565b5b01549250612b1c565b8092505b6000601d600184612b2d91906147fc565b6109c48110612b3f57612b3e614565565b5b01541415612b7357600182612b5491906147fc565b601d826109c48110612b6957612b68614565565b5b0181905550612bb1565b601d600183612b8291906147fc565b6109c48110612b9457612b93614565565b5b0154601d826109c48110612bab57612baa614565565b5b01819055505b600183612bbe9190614386565b92505050919050565b612be1828260405180602001604052806000815250613246565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d12906150d3565b60405180910390fd5b612d248161261f565b15612d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5b9061513f565b60405180910390fd5b612d7060008383613132565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dc09190614386565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612e8484848461282a565b612e90848484846132a1565b612ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec6906151d1565b60405180910390fd5b50505050565b6060600b8054612ee49061404b565b80601f0160208091040260200160405190810160405280929190818152602001828054612f109061404b565b8015612f5d5780601f10612f3257610100808354040283529160200191612f5d565b820191906000526020600020905b815481529060010190602001808311612f4057829003601f168201915b5050505050905090565b60606000821415612faf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130c3565b600082905060005b60008214612fe1578080612fca90614448565b915050600a82612fda9190614b63565b9150612fb7565b60008167ffffffffffffffff811115612ffd57612ffc613b99565b5b6040519080825280601f01601f19166020018201604052801561302f5781602001600182028036833780820191505090505b5090505b600085146130bc5760018261304891906147fc565b9150600a856130579190614aa1565b60306130639190614386565b60f81b81838151811061307957613078614565565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130b59190614b63565b9450613033565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61313d838383613438565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131805761317b8161343d565b6131bf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131be576131bd8382613486565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613202576131fd816135f3565b613241565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132405761323f82826136c4565b5b5b505050565b6132508383612cab565b61325d60008484846132a1565b61329c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613293906151d1565b60405180910390fd5b505050565b60006132c28473ffffffffffffffffffffffffffffffffffffffff16613743565b1561342b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132eb61268b565b8786866040518563ffffffff1660e01b815260040161330d9493929190615246565b602060405180830381600087803b15801561332757600080fd5b505af192505050801561335857506040513d601f19601f8201168201806040525081019061335591906152a7565b60015b6133db573d8060008114613388576040519150601f19603f3d011682016040523d82523d6000602084013e61338d565b606091505b506000815114156133d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ca906151d1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613430565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613493846112ea565b61349d91906147fc565b9050600060076000848152602001908152602001600020549050818114613582576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061360791906147fc565b905060006009600084815260200190815260200160002054905060006008838154811061363757613636614565565b5b90600052602060002001549050806008838154811061365957613658614565565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136a8576136a76152d4565b5b6001900381819060005260206000200160009055905550505050565b60006136cf836112ea565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546137629061404b565b90600052602060002090601f01602090048101928261378457600085556137cb565b82601f1061379d57805160ff19168380011785556137cb565b828001600101855582156137cb579182015b828111156137ca5782518255916020019190600101906137af565b5b5090506137d891906137dc565b5090565b5b808211156137f55760008160009055506001016137dd565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138428161380d565b811461384d57600080fd5b50565b60008135905061385f81613839565b92915050565b60006020828403121561387b5761387a613803565b5b600061388984828501613850565b91505092915050565b60008115159050919050565b6138a781613892565b82525050565b60006020820190506138c2600083018461389e565b92915050565b6000819050919050565b6138db816138c8565b82525050565b60006020820190506138f660008301846138d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561393657808201518184015260208101905061391b565b83811115613945576000848401525b50505050565b6000601f19601f8301169050919050565b6000613967826138fc565b6139718185613907565b9350613981818560208601613918565b61398a8161394b565b840191505092915050565b600060208201905081810360008301526139af818461395c565b905092915050565b6139c0816138c8565b81146139cb57600080fd5b50565b6000813590506139dd816139b7565b92915050565b6000602082840312156139f9576139f8613803565b5b6000613a07848285016139ce565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a3b82613a10565b9050919050565b613a4b81613a30565b82525050565b6000602082019050613a666000830184613a42565b92915050565b613a7581613a30565b8114613a8057600080fd5b50565b600081359050613a9281613a6c565b92915050565b60008060408385031215613aaf57613aae613803565b5b6000613abd85828601613a83565b9250506020613ace858286016139ce565b9150509250929050565b600080600060608486031215613af157613af0613803565b5b6000613aff86828701613a83565b9350506020613b1086828701613a83565b9250506040613b21868287016139ce565b9150509250925092565b600060ff82169050919050565b613b4181613b2b565b82525050565b6000602082019050613b5c6000830184613b38565b92915050565b600060208284031215613b7857613b77613803565b5b6000613b8684828501613a83565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bd18261394b565b810181811067ffffffffffffffff82111715613bf057613bef613b99565b5b80604052505050565b6000613c036137f9565b9050613c0f8282613bc8565b919050565b600067ffffffffffffffff821115613c2f57613c2e613b99565b5b613c388261394b565b9050602081019050919050565b82818337600083830152505050565b6000613c67613c6284613c14565b613bf9565b905082815260208101848484011115613c8357613c82613b94565b5b613c8e848285613c45565b509392505050565b600082601f830112613cab57613caa613b8f565b5b8135613cbb848260208601613c54565b91505092915050565b600060208284031215613cda57613cd9613803565b5b600082013567ffffffffffffffff811115613cf857613cf7613808565b5b613d0484828501613c96565b91505092915050565b613d1681613892565b8114613d2157600080fd5b50565b600081359050613d3381613d0d565b92915050565b60008060408385031215613d5057613d4f613803565b5b6000613d5e85828601613a83565b9250506020613d6f85828601613d24565b9150509250929050565b600067ffffffffffffffff821115613d9457613d93613b99565b5b613d9d8261394b565b9050602081019050919050565b6000613dbd613db884613d79565b613bf9565b905082815260208101848484011115613dd957613dd8613b94565b5b613de4848285613c45565b509392505050565b600082601f830112613e0157613e00613b8f565b5b8135613e11848260208601613daa565b91505092915050565b60008060008060808587031215613e3457613e33613803565b5b6000613e4287828801613a83565b9450506020613e5387828801613a83565b9350506040613e64878288016139ce565b925050606085013567ffffffffffffffff811115613e8557613e84613808565b5b613e9187828801613dec565b91505092959194509250565b60008060408385031215613eb457613eb3613803565b5b6000613ec285828601613a83565b9250506020613ed385828601613a83565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613f1d57613f1c613edd565b5b50565b6000819050613f2e82613f0c565b919050565b6000613f3e82613f20565b9050919050565b613f4e81613f33565b82525050565b6000602082019050613f696000830184613f45565b92915050565b600080fd5b600080fd5b60008083601f840112613f8f57613f8e613b8f565b5b8235905067ffffffffffffffff811115613fac57613fab613f6f565b5b602083019150836020820283011115613fc857613fc7613f74565b5b9250929050565b60008060208385031215613fe657613fe5613803565b5b600083013567ffffffffffffffff81111561400457614003613808565b5b61401085828601613f79565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061406357607f821691505b602082108114156140775761407661401c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006140d9602c83613907565b91506140e48261407d565b604082019050919050565b60006020820190508181036000830152614108816140cc565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061416b602183613907565b91506141768261410f565b604082019050919050565b6000602082019050818103600083015261419a8161415e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006141fd603883613907565b9150614208826141a1565b604082019050919050565b6000602082019050818103600083015261422c816141f0565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061428f603183613907565b915061429a82614233565b604082019050919050565b600060208201905081810360008301526142be81614282565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614321602b83613907565b915061432c826142c5565b604082019050919050565b6000602082019050818103600083015261435081614314565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614391826138c8565b915061439c836138c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143d1576143d0614357565b5b828201905092915050565b7f414d4f554e542045584345454420464f52205445414d00000000000000000000600082015250565b6000614412601683613907565b915061441d826143dc565b602082019050919050565b6000602082019050818103600083015261444181614405565b9050919050565b6000614453826138c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561448657614485614357565b5b600182019050919050565b6000815190506144a0816139b7565b92915050565b6000602082840312156144bc576144bb613803565b5b60006144ca84828501614491565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061452f602c83613907565b915061453a826144d3565b604082019050919050565b6000602082019050818103600083015261455e81614522565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006145ca602083613907565b91506145d582614594565b602082019050919050565b600060208201905081810360008301526145f9816145bd565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061465c602983613907565b915061466782614600565b604082019050919050565b6000602082019050818103600083015261468b8161464f565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006146ee602a83613907565b91506146f982614692565b604082019050919050565b6000602082019050818103600083015261471d816146e1565b9050919050565b7f556e61626c6520746f206d696e74000000000000000000000000000000000000600082015250565b600061475a600e83613907565b915061476582614724565b602082019050919050565b600060208201905081810360008301526147898161474d565b9050919050565b7f416d6f756e742065786365656400000000000000000000000000000000000000600082015250565b60006147c6600d83613907565b91506147d182614790565b602082019050919050565b600060208201905081810360008301526147f5816147b9565b9050919050565b6000614807826138c8565b9150614812836138c8565b92508282101561482557614824614357565b5b828203905092915050565b7f4f6e6c792077686974656c697374656420616464726573732063616e206d696e60008201527f7420666972737420323530204e46547300000000000000000000000000000000602082015250565b600061488c603083613907565b915061489782614830565b604082019050919050565b600060208201905081810360008301526148bb8161487f565b9050919050565b7f42555941424c45204c494d495420455843454544000000000000000000000000600082015250565b60006148f8601483613907565b9150614903826148c2565b602082019050919050565b60006020820190508181036000830152614927816148eb565b9050919050565b7f5075626c69632073616c6520616d6f756e742065786365656400000000000000600082015250565b6000614964601983613907565b915061496f8261492e565b602082019050919050565b6000602082019050818103600083015261499381614957565b9050919050565b7f4f6e6c79206120686f6c6465722063616e206d696e742074686973204e465400600082015250565b60006149d0601f83613907565b91506149db8261499a565b602082019050919050565b600060208201905081810360008301526149ff816149c3565b9050919050565b7f46524545204d494e54204c494d49542045584345454400000000000000000000600082015250565b6000614a3c601683613907565b9150614a4782614a06565b602082019050919050565b60006020820190508181036000830152614a6b81614a2f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614aac826138c8565b9150614ab7836138c8565b925082614ac757614ac6614a72565b5b828206905092915050565b6000614add82613b2b565b9150614ae883613b2b565b92508260ff03821115614afe57614afd614357565b5b828201905092915050565b6000614b14826138c8565b9150614b1f836138c8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b5857614b57614357565b5b828202905092915050565b6000614b6e826138c8565b9150614b79836138c8565b925082614b8957614b88614a72565b5b828204905092915050565b7f46544d2e5368726f6f6d733a20696e636f727265637420707269636500000000600082015250565b6000614bca601c83613907565b9150614bd582614b94565b602082019050919050565b60006020820190508181036000830152614bf981614bbd565b9050919050565b6000614c0b82613b2b565b915060ff821415614c1f57614c1e614357565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614c60601983613907565b9150614c6b82614c2a565b602082019050919050565b60006020820190508181036000830152614c8f81614c53565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614cf2602f83613907565b9150614cfd82614c96565b604082019050919050565b60006020820190508181036000830152614d2181614ce5565b9050919050565b600081905092915050565b6000614d3e826138fc565b614d488185614d28565b9350614d58818560208601613918565b80840191505092915050565b6000614d708285614d33565b9150614d7c8284614d33565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614de4602683613907565b9150614def82614d88565b604082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614e76602c83613907565b9150614e8182614e1a565b604082019050919050565b60006020820190508181036000830152614ea581614e69565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614f08602983613907565b9150614f1382614eac565b604082019050919050565b60006020820190508181036000830152614f3781614efb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f9a602483613907565b9150614fa582614f3e565b604082019050919050565b60006020820190508181036000830152614fc981614f8d565b9050919050565b60008160601b9050919050565b6000614fe882614fd0565b9050919050565b6000614ffa82614fdd565b9050919050565b61501261500d82613a30565b614fef565b82525050565b6000819050919050565b61503361502e826138c8565b615018565b82525050565b60006150458287615001565b6014820191506150558286615022565b6020820191506150658285615022565b6020820191506150758284615022565b60208201915081905095945050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006150bd602083613907565b91506150c882615087565b602082019050919050565b600060208201905081810360008301526150ec816150b0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615129601c83613907565b9150615134826150f3565b602082019050919050565b600060208201905081810360008301526151588161511c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006151bb603283613907565b91506151c68261515f565b604082019050919050565b600060208201905081810360008301526151ea816151ae565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615218826151f1565b61522281856151fc565b9350615232818560208601613918565b61523b8161394b565b840191505092915050565b600060808201905061525b6000830187613a42565b6152686020830186613a42565b61527560408301856138d2565b8181036060830152615287818461520d565b905095945050505050565b6000815190506152a181613839565b92915050565b6000602082840312156152bd576152bc613803565b5b60006152cb84828501615292565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220860a06add574cdb6a37fa589c781958c06c2b8a94dbdbed6522937383295a27764736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d53767755777765564e5733754633654d756d393659313658555445753739764676526a554a4e6f75653456582f000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://gateway.pinata.cloud/ipfs/QmSvwUwweVNW3uF3eMum96Y16XUTEu79vFvRjUJNoue4VX/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d53767755777765564e5733754633654d756d39365931365855544575
Arg [4] : 3739764676526a554a4e6f75653456582f000000000000000000000000000000
Deployed Bytecode Sourcemap
42002:5493:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33660:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42716:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21668:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23227:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22750:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34300:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24117:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33968:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42345:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43280:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46642:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24527:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34490:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43046:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46226:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47092:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42575:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21362:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21092:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41371:94;;;;;;;;;;;;;:::i;:::-;;43114:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42181:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40720:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47394:98;;;;;;;;;;;;;:::i;:::-;;21837:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42437:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44237:1869;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23520:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42685:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47257:131;;;;;;;;;;;;;:::i;:::-;;24783:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43084:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22012:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42477:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23886:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46328:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46435:201;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42524:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41620:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46861:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42384:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33660:224;33762:4;33801:35;33786:50;;;:11;:50;;;;:90;;;;33840:36;33864:11;33840:23;:36::i;:::-;33786:90;33779:97;;33660:224;;;:::o;42716:19::-;;;;:::o;21668:100::-;21722:13;21755:5;21748:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21668:100;:::o;23227:221::-;23303:7;23331:16;23339:7;23331;:16::i;:::-;23323:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23416:15;:24;23432:7;23416:24;;;;;;;;;;;;;;;;;;;;;23409:31;;23227:221;;;:::o;22750:411::-;22831:13;22847:23;22862:7;22847:14;:23::i;:::-;22831:39;;22895:5;22889:11;;:2;:11;;;;22881:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22989:5;22973:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22998:37;23015:5;23022:12;:10;:12::i;:::-;22998:16;:37::i;:::-;22973:62;22951:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23132:21;23141:2;23145:7;23132:8;:21::i;:::-;22820:341;22750:411;;:::o;34300:113::-;34361:7;34388:10;:17;;;;34381:24;;34300:113;:::o;24117:339::-;24312:41;24331:12;:10;:12::i;:::-;24345:7;24312:18;:41::i;:::-;24304:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24420:28;24430:4;24436:2;24440:7;24420:9;:28::i;:::-;24117:339;;;:::o;33968:256::-;34065:7;34101:23;34118:5;34101:16;:23::i;:::-;34093:5;:31;34085:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34190:12;:19;34203:5;34190:19;;;;;;;;;;;;;;;:26;34210:5;34190:26;;;;;;;;;;;;34183:33;;33968:256;;;;:::o;42345:34::-;;;;;;;;;;;;;:::o;43280:267::-;43368:15;;43358:6;43342:13;;:22;;;;:::i;:::-;:41;;43334:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;43421:6;43417:97;43437:6;43433:1;:10;43417:97;;;43464:42;43474:5;;;;;;;;;;;43481:24;43503:1;43491:11;;:13;;;;:::i;:::-;43481:9;:24::i;:::-;43464:9;:42::i;:::-;43445:3;;;;;:::i;:::-;;;;43417:97;;;;43535:6;43520:11;;:21;;;;;;;:::i;:::-;;;;;;;;43280:267;:::o;46642:215::-;46703:4;46719:11;:17;46731:4;46719:17;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;46770:1;46740:11;;;;;;;;;;;:21;;;46762:4;46740:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;46719:52;:84;;;;46802:1;46775:8;;;;;;;;;;;:18;;;46794:4;46775:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;46719:84;46716:135;;;46821:4;46814:11;;;;46716:135;46846:5;46839:12;;46642:215;;;;:::o;24527:185::-;24665:39;24682:4;24688:2;24692:7;24665:39;;;;;;;;;;;;:16;:39::i;:::-;24527:185;;;:::o;34490:233::-;34565:7;34601:30;:28;:30::i;:::-;34593:5;:38;34585:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34698:10;34709:5;34698:17;;;;;;;;:::i;:::-;;;;;;;;;;34691:24;;34490:233;;;:::o;43046:33::-;;;;:::o;46226:96::-;40951:12;:10;:12::i;:::-;40940:23;;:7;:5;:7::i;:::-;:23;;;40932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46309:7:::1;46293:13;:23;;;;;;;;;;;;:::i;:::-;;46226:96:::0;:::o;47092:159::-;47156:4;47205:1;47173:13;;;;;;;;;;;:23;;;47197:4;47173:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;47169:57;;;47222:4;47215:11;;;;47169:57;47240:5;47233:12;;47092:159;;;;:::o;42575:18::-;;;;;;;;;;;;;:::o;21362:239::-;21434:7;21454:13;21470:7;:16;21478:7;21470:16;;;;;;;;;;;;;;;;;;;;;21454:32;;21522:1;21505:19;;:5;:19;;;;21497:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21588:5;21581:12;;;21362:239;;;:::o;21092:208::-;21164:7;21209:1;21192:19;;:5;:19;;;;21184:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21276:9;:16;21286:5;21276:16;;;;;;;;;;;;;;;;21269:23;;21092:208;;;:::o;41371:94::-;40951:12;:10;:12::i;:::-;40940:23;;:7;:5;:7::i;:::-;:23;;;40932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41436:21:::1;41454:1;41436:9;:21::i;:::-;41371:94::o:0;43114:21::-;;;;:::o;42181:42::-;42219:4;42181:42;:::o;40720:87::-;40766:7;40793:6;;;;;;;;;;;40786:13;;40720:87;:::o;47394:98::-;40951:12;:10;:12::i;:::-;40940:23;;:7;:5;:7::i;:::-;:23;;;40932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47460:5:::1;47450:15;;:6;;;;;;;;;;;:15;;;47442:24;;;::::0;::::1;;47482:4;47473:6;;:13;;;;;;;;;;;;;;;;;;47394:98::o:0;21837:104::-;21893:13;21926:7;21919:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21837:104;:::o;42437:35::-;;;;:::o;44237:1869::-;44310:5;44300:15;;:6;;;;;;;;;;;:15;;;44292:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;42219:4;44359:11;;44349:7;:21;;;;:::i;:::-;:36;;44341:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44423:14;44414:23;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;:65;;;;;44474:5;44460:9;;44442:15;:27;;;;:::i;:::-;44441:38;;44414:65;44410:113;;;44498:17;44490:5;;:25;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;44410:113;44542:14;44533:23;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;44529:634;;;44575:29;44593:10;44575:17;:29::i;:::-;44567:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;44710:16;;;;;;;;;;;44674:52;;44699:7;44674:12;:24;44687:10;44674:24;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:52;;44666:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;44788:7;44760:12;:24;44773:10;44760:24;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;44529:634;;;44827:17;44818:26;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;44814:349;;;44881:4;44870:7;44863:4;;:14;;;;:::i;:::-;:22;;44855:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;44814:349;;;44947:15;44938:24;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:24;;;;;;;;:::i;:::-;;;44934:229;;;45005:1;44981:21;44991:10;44981:9;:21::i;:::-;:25;44973:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;45085:1;45059:10;:22;45070:10;45059:22;;;;;;;;;;;;;;;;:27;45051:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45148:7;45122:10;:22;45133:10;45122:22;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;44934:229;44814:349;44529:634;45169:26;45212:3;45205:4;;:10;;;;:::i;:::-;45198:3;:18;;;;:::i;:::-;45169:47;;45223:22;45270:18;45260:7;:28;45256:227;;;45396:18;45388:7;:26;;;;:::i;:::-;45360:6;45382:1;45367:14;;;;;;;;;;;:16;;;;:::i;:::-;45360:24;;;;;;;;;:::i;:::-;;;;:55;;;;:::i;:::-;45339:18;45314:6;45321:14;;;;;;;;;;;45314:22;;;;;;;;;:::i;:::-;;;;:43;;;;:::i;:::-;:101;;;;:::i;:::-;45297:118;;45256:227;;;45476:7;45451:6;45458:14;;;;;;;;;;;45451:22;;;;;;;;;:::i;:::-;;;;:32;;;;:::i;:::-;45434:49;;45256:227;45532:1;45494:13;;;;;;;;;;;:23;;;45518:10;45494:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;45490:104;;;45583:3;45578:2;45561:14;:19;;;;:::i;:::-;:25;;;;:::i;:::-;45544:42;;45490:104;45621:14;45608:9;:27;;45600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45683:5;;;;;;;;;;;45675:23;;:46;45699:21;45675:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45733:7;45728:88;45750:7;45746:1;:11;;;45728:88;;;45771:45;45777:10;45789:26;45813:1;45799:15;;:11;;:15;;;;:::i;:::-;45789:9;:26::i;:::-;45771:5;:45::i;:::-;45759:3;;;;;:::i;:::-;;;;45728:88;;;;45834:3;45827:4;;:10;:35;;;;;45859:3;45848:7;45841:4;;:14;;;;:::i;:::-;:21;;45827:35;45823:158;;;45879:17;45871:5;;:25;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;45823:158;;;45919:4;45912;;:11;:37;;;;;45945:4;45934:7;45927:4;;:14;;;;:::i;:::-;:22;;45912:37;45908:73;;;45966:15;45958:5;;:23;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;45908:73;45823:158;46003:7;45988:11;;:22;;;;;;;:::i;:::-;;;;;;;;46025:7;46017:4;;:15;;;;;;;:::i;:::-;;;;;;;;46054:18;46043:7;:29;46039:61;;46099:1;46081:14;;:19;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46039:61;44285:1821;;44237:1869;:::o;23520:295::-;23635:12;:10;:12::i;:::-;23623:24;;:8;:24;;;;23615:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23735:8;23690:18;:32;23709:12;:10;:12::i;:::-;23690:32;;;;;;;;;;;;;;;:42;23723:8;23690:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23788:8;23759:48;;23774:12;:10;:12::i;:::-;23759:48;;;23798:8;23759:48;;;;;;:::i;:::-;;;;;;;;23520:295;;:::o;42685:26::-;;;;:::o;47257:131::-;40951:12;:10;:12::i;:::-;40940:23;;:7;:5;:7::i;:::-;:23;;;40932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47322:4:::1;47312:14;;:6;;;;;;;;;;;:14;;;47304:23;;;::::0;::::1;;47346:15;47334:9;:27;;;;47377:5;47368:6;;:14;;;;;;;;;;;;;;;;;;47257:131::o:0;24783:328::-;24958:41;24977:12;:10;:12::i;:::-;24991:7;24958:18;:41::i;:::-;24950:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25064:39;25078:4;25084:2;25088:7;25097:5;25064:13;:39::i;:::-;24783:328;;;;:::o;43084:25::-;;;;:::o;22012:334::-;22085:13;22119:16;22127:7;22119;:16::i;:::-;22111:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22200:21;22224:10;:8;:10::i;:::-;22200:34;;22276:1;22258:7;22252:21;:25;:86;;;;;;;;;;;;;;;;;22304:7;22313:18;:7;:16;:18::i;:::-;22287:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22252:86;22245:93;;;22012:334;;;:::o;42477:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;23886:164::-;23983:4;24007:18;:25;24026:5;24007:25;;;;;;;;;;;;;;;:35;24033:8;24007:35;;;;;;;;;;;;;;;;;;;;;;;;;24000:42;;23886:164;;;;:::o;46328:101::-;46378:7;46401:6;46408:14;;;;;;;;;;;46401:22;;;;;;;;;:::i;:::-;;;;46394:29;;46328:101;:::o;46435:201::-;46485:6;46513:14;46504:23;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;:65;;;;;46564:5;46550:9;;46532:15;:27;;;;:::i;:::-;46531:38;;46504:65;46500:112;;;46587:17;46580:24;;;;46500:112;46625:5;;;;;;;;;;;46618:12;;46435:201;;:::o;42524:44::-;;;;;;;;;;;;;;;;;:::o;41620:192::-;40951:12;:10;:12::i;:::-;40940:23;;:7;:5;:7::i;:::-;:23;;;40932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41729:1:::1;41709:22;;:8;:22;;;;41701:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41785:19;41795:8;41785:9;:19::i;:::-;41620:192:::0;:::o;46861:225::-;40951:12;:10;:12::i;:::-;40940:23;;:7;:5;:7::i;:::-;:23;;;40932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46953:7:::1;46948:85;46970:9;;:16;;46966:1;:20;;;46948:85;;;47029:4;47001:11;:25;47013:9;;47023:1;47013:12;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;47001:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;46988:3;;;;;:::i;:::-;;;;46948:85;;;;47064:9;;:16;;47040:20;;:40;;;;;;;:::i;:::-;;;;;;;;46861:225:::0;;:::o;42384:46::-;;;;;;;;;;;;;;;;;:::o;20723:305::-;20825:4;20877:25;20862:40;;;:11;:40;;;;:105;;;;20934:33;20919:48;;;:11;:48;;;;20862:105;:158;;;;20984:36;21008:11;20984:23;:36::i;:::-;20862:158;20842:178;;20723:305;;;:::o;26621:127::-;26686:4;26738:1;26710:30;;:7;:16;26718:7;26710:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26703:37;;26621:127;;;:::o;15557:98::-;15610:7;15637:10;15630:17;;15557:98;:::o;30603:174::-;30705:2;30678:15;:24;30694:7;30678:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30761:7;30757:2;30723:46;;30732:23;30747:7;30732:14;:23::i;:::-;30723:46;;;;;;;;;;;;30603:174;;:::o;26915:348::-;27008:4;27033:16;27041:7;27033;:16::i;:::-;27025:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27109:13;27125:23;27140:7;27125:14;:23::i;:::-;27109:39;;27178:5;27167:16;;:7;:16;;;:51;;;;27211:7;27187:31;;:20;27199:7;27187:11;:20::i;:::-;:31;;;27167:51;:87;;;;27222:32;27239:5;27246:7;27222:16;:32::i;:::-;27167:87;27159:96;;;26915:348;;;;:::o;29907:578::-;30066:4;30039:31;;:23;30054:7;30039:14;:23::i;:::-;:31;;;30031:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30149:1;30135:16;;:2;:16;;;;30127:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30205:39;30226:4;30232:2;30236:7;30205:20;:39::i;:::-;30309:29;30326:1;30330:7;30309:8;:29::i;:::-;30370:1;30351:9;:15;30361:4;30351:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30399:1;30382:9;:13;30392:2;30382:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30430:2;30411:7;:16;30419:7;30411:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30469:7;30465:2;30450:27;;30459:4;30450:27;;;;;;;;;;;;29907:578;;;:::o;43553:677::-;43611:13;43633:17;43667:12;42219:4;43653:26;;;;:::i;:::-;43633:46;;43686:12;43798:9;43736:10;43748:16;43766:15;43783:9;43719:74;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43709:85;;;;;;43701:94;;:106;;;;:::i;:::-;43686:121;;43822:1;43814:9;;43930:1;43908:12;43921:4;43908:18;;;;;;;:::i;:::-;;;;:23;43904:93;;43948:12;43961:4;43948:18;;;;;;;:::i;:::-;;;;43940:26;;43904:93;;;43993:4;43985:12;;43904:93;44096:1;44065:12;44090:1;44078:9;:13;;;;:::i;:::-;44065:27;;;;;;;:::i;:::-;;;;:32;44061:146;;;44139:1;44127:9;:13;;;;:::i;:::-;44106:12;44119:4;44106:18;;;;;;;:::i;:::-;;;:34;;;;44061:146;;;44180:12;44205:1;44193:9;:13;;;;:::i;:::-;44180:27;;;;;;;:::i;:::-;;;;44159:12;44172:4;44159:18;;;;;;;:::i;:::-;;;:48;;;;44061:146;44223:1;44214:10;;;;;:::i;:::-;;;43626:604;;43553:677;;;:::o;27605:110::-;27681:26;27691:2;27695:7;27681:26;;;;;;;;;;;;:9;:26::i;:::-;27605:110;;:::o;41820:173::-;41876:16;41895:6;;;;;;;;;;;41876:25;;41921:8;41912:6;;:17;;;;;;;;;;;;;;;;;;41976:8;41945:40;;41966:8;41945:40;;;;;;;;;;;;41865:128;41820:173;:::o;28599:382::-;28693:1;28679:16;;:2;:16;;;;28671:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28752:16;28760:7;28752;:16::i;:::-;28751:17;28743:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28814:45;28843:1;28847:2;28851:7;28814:20;:45::i;:::-;28889:1;28872:9;:13;28882:2;28872:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28920:2;28901:7;:16;28909:7;28901:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28965:7;28961:2;28940:33;;28957:1;28940:33;;;;;;;;;;;;28599:382;;:::o;25993:315::-;26150:28;26160:4;26166:2;26170:7;26150:9;:28::i;:::-;26197:48;26220:4;26226:2;26230:7;26239:5;26197:22;:48::i;:::-;26189:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25993:315;;;;:::o;46112:108::-;46172:13;46201;46194:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46112:108;:::o;15997:723::-;16053:13;16283:1;16274:5;:10;16270:53;;;16301:10;;;;;;;;;;;;;;;;;;;;;16270:53;16333:12;16348:5;16333:20;;16364:14;16389:78;16404:1;16396:4;:9;16389:78;;16422:8;;;;;:::i;:::-;;;;16453:2;16445:10;;;;;:::i;:::-;;;16389:78;;;16477:19;16509:6;16499:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16477:39;;16527:154;16543:1;16534:5;:10;16527:154;;16571:1;16561:11;;;;;:::i;:::-;;;16638:2;16630:5;:10;;;;:::i;:::-;16617:2;:24;;;;:::i;:::-;16604:39;;16587:6;16594;16587:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16667:2;16658:11;;;;;:::i;:::-;;;16527:154;;;16705:6;16691:21;;;;;15997:723;;;;:::o;18454:157::-;18539:4;18578:25;18563:40;;;:11;:40;;;;18556:47;;18454:157;;;:::o;35336:589::-;35480:45;35507:4;35513:2;35517:7;35480:26;:45::i;:::-;35558:1;35542:18;;:4;:18;;;35538:187;;;35577:40;35609:7;35577:31;:40::i;:::-;35538:187;;;35647:2;35639:10;;:4;:10;;;35635:90;;35666:47;35699:4;35705:7;35666:32;:47::i;:::-;35635:90;35538:187;35753:1;35739:16;;:2;:16;;;35735:183;;;35772:45;35809:7;35772:36;:45::i;:::-;35735:183;;;35845:4;35839:10;;:2;:10;;;35835:83;;35866:40;35894:2;35898:7;35866:27;:40::i;:::-;35835:83;35735:183;35336:589;;;:::o;27942:321::-;28072:18;28078:2;28082:7;28072:5;:18::i;:::-;28123:54;28154:1;28158:2;28162:7;28171:5;28123:22;:54::i;:::-;28101:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27942:321;;;:::o;31342:799::-;31497:4;31518:15;:2;:13;;;:15::i;:::-;31514:620;;;31570:2;31554:36;;;31591:12;:10;:12::i;:::-;31605:4;31611:7;31620:5;31554:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31550:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31813:1;31796:6;:13;:18;31792:272;;;31839:60;;;;;;;;;;:::i;:::-;;;;;;;;31792:272;32014:6;32008:13;31999:6;31995:2;31991:15;31984:38;31550:529;31687:41;;;31677:51;;;:6;:51;;;;31670:58;;;;;31514:620;32118:4;32111:11;;31342:799;;;;;;;:::o;32713:126::-;;;;:::o;36648:164::-;36752:10;:17;;;;36725:15;:24;36741:7;36725:24;;;;;;;;;;;:44;;;;36780:10;36796:7;36780:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36648:164;:::o;37439:988::-;37705:22;37755:1;37730:22;37747:4;37730:16;:22::i;:::-;:26;;;;:::i;:::-;37705:51;;37767:18;37788:17;:26;37806:7;37788:26;;;;;;;;;;;;37767:47;;37935:14;37921:10;:28;37917:328;;37966:19;37988:12;:18;38001:4;37988:18;;;;;;;;;;;;;;;:34;38007:14;37988:34;;;;;;;;;;;;37966:56;;38072:11;38039:12;:18;38052:4;38039:18;;;;;;;;;;;;;;;:30;38058:10;38039:30;;;;;;;;;;;:44;;;;38189:10;38156:17;:30;38174:11;38156:30;;;;;;;;;;;:43;;;;37951:294;37917:328;38341:17;:26;38359:7;38341:26;;;;;;;;;;;38334:33;;;38385:12;:18;38398:4;38385:18;;;;;;;;;;;;;;;:34;38404:14;38385:34;;;;;;;;;;;38378:41;;;37520:907;;37439:988;;:::o;38722:1079::-;38975:22;39020:1;39000:10;:17;;;;:21;;;;:::i;:::-;38975:46;;39032:18;39053:15;:24;39069:7;39053:24;;;;;;;;;;;;39032:45;;39404:19;39426:10;39437:14;39426:26;;;;;;;;:::i;:::-;;;;;;;;;;39404:48;;39490:11;39465:10;39476;39465:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39601:10;39570:15;:28;39586:11;39570:28;;;;;;;;;;;:41;;;;39742:15;:24;39758:7;39742:24;;;;;;;;;;;39735:31;;;39777:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38793:1008;;;38722:1079;:::o;36226:221::-;36311:14;36328:20;36345:2;36328:16;:20::i;:::-;36311:37;;36386:7;36359:12;:16;36372:2;36359:16;;;;;;;;;;;;;;;:24;36376:6;36359:24;;;;;;;;;;;:34;;;;36433:6;36404:17;:26;36422:7;36404:26;;;;;;;;;;;:35;;;;36300:147;36226:221;;:::o;7686:387::-;7746:4;7954:12;8021:7;8009:20;8001:28;;8064:1;8057:4;:8;8050:15;;;7686:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:86::-;5950:7;5990:4;5983:5;5979:16;5968:27;;5915:86;;;:::o;6007:112::-;6090:22;6106:5;6090:22;:::i;:::-;6085:3;6078:35;6007:112;;:::o;6125:214::-;6214:4;6252:2;6241:9;6237:18;6229:26;;6265:67;6329:1;6318:9;6314:17;6305:6;6265:67;:::i;:::-;6125:214;;;;:::o;6345:329::-;6404:6;6453:2;6441:9;6432:7;6428:23;6424:32;6421:119;;;6459:79;;:::i;:::-;6421:119;6579:1;6604:53;6649:7;6640:6;6629:9;6625:22;6604:53;:::i;:::-;6594:63;;6550:117;6345:329;;;;:::o;6680:117::-;6789:1;6786;6779:12;6803:117;6912:1;6909;6902:12;6926:180;6974:77;6971:1;6964:88;7071:4;7068:1;7061:15;7095:4;7092:1;7085:15;7112:281;7195:27;7217:4;7195:27;:::i;:::-;7187:6;7183:40;7325:6;7313:10;7310:22;7289:18;7277:10;7274:34;7271:62;7268:88;;;7336:18;;:::i;:::-;7268:88;7376:10;7372:2;7365:22;7155:238;7112:281;;:::o;7399:129::-;7433:6;7460:20;;:::i;:::-;7450:30;;7489:33;7517:4;7509:6;7489:33;:::i;:::-;7399:129;;;:::o;7534:308::-;7596:4;7686:18;7678:6;7675:30;7672:56;;;7708:18;;:::i;:::-;7672:56;7746:29;7768:6;7746:29;:::i;:::-;7738:37;;7830:4;7824;7820:15;7812:23;;7534:308;;;:::o;7848:154::-;7932:6;7927:3;7922;7909:30;7994:1;7985:6;7980:3;7976:16;7969:27;7848:154;;;:::o;8008:412::-;8086:5;8111:66;8127:49;8169:6;8127:49;:::i;:::-;8111:66;:::i;:::-;8102:75;;8200:6;8193:5;8186:21;8238:4;8231:5;8227:16;8276:3;8267:6;8262:3;8258:16;8255:25;8252:112;;;8283:79;;:::i;:::-;8252:112;8373:41;8407:6;8402:3;8397;8373:41;:::i;:::-;8092:328;8008:412;;;;;:::o;8440:340::-;8496:5;8545:3;8538:4;8530:6;8526:17;8522:27;8512:122;;8553:79;;:::i;:::-;8512:122;8670:6;8657:20;8695:79;8770:3;8762:6;8755:4;8747:6;8743:17;8695:79;:::i;:::-;8686:88;;8502:278;8440:340;;;;:::o;8786:509::-;8855:6;8904:2;8892:9;8883:7;8879:23;8875:32;8872:119;;;8910:79;;:::i;:::-;8872:119;9058:1;9047:9;9043:17;9030:31;9088:18;9080:6;9077:30;9074:117;;;9110:79;;:::i;:::-;9074:117;9215:63;9270:7;9261:6;9250:9;9246:22;9215:63;:::i;:::-;9205:73;;9001:287;8786:509;;;;:::o;9301:116::-;9371:21;9386:5;9371:21;:::i;:::-;9364:5;9361:32;9351:60;;9407:1;9404;9397:12;9351:60;9301:116;:::o;9423:133::-;9466:5;9504:6;9491:20;9482:29;;9520:30;9544:5;9520:30;:::i;:::-;9423:133;;;;:::o;9562:468::-;9627:6;9635;9684:2;9672:9;9663:7;9659:23;9655:32;9652:119;;;9690:79;;:::i;:::-;9652:119;9810:1;9835:53;9880:7;9871:6;9860:9;9856:22;9835:53;:::i;:::-;9825:63;;9781:117;9937:2;9963:50;10005:7;9996:6;9985:9;9981:22;9963:50;:::i;:::-;9953:60;;9908:115;9562:468;;;;;:::o;10036:307::-;10097:4;10187:18;10179:6;10176:30;10173:56;;;10209:18;;:::i;:::-;10173:56;10247:29;10269:6;10247:29;:::i;:::-;10239:37;;10331:4;10325;10321:15;10313:23;;10036:307;;;:::o;10349:410::-;10426:5;10451:65;10467:48;10508:6;10467:48;:::i;:::-;10451:65;:::i;:::-;10442:74;;10539:6;10532:5;10525:21;10577:4;10570:5;10566:16;10615:3;10606:6;10601:3;10597:16;10594:25;10591:112;;;10622:79;;:::i;:::-;10591:112;10712:41;10746:6;10741:3;10736;10712:41;:::i;:::-;10432:327;10349:410;;;;;:::o;10778:338::-;10833:5;10882:3;10875:4;10867:6;10863:17;10859:27;10849:122;;10890:79;;:::i;:::-;10849:122;11007:6;10994:20;11032:78;11106:3;11098:6;11091:4;11083:6;11079:17;11032:78;:::i;:::-;11023:87;;10839:277;10778:338;;;;:::o;11122:943::-;11217:6;11225;11233;11241;11290:3;11278:9;11269:7;11265:23;11261:33;11258:120;;;11297:79;;:::i;:::-;11258:120;11417:1;11442:53;11487:7;11478:6;11467:9;11463:22;11442:53;:::i;:::-;11432:63;;11388:117;11544:2;11570:53;11615:7;11606:6;11595:9;11591:22;11570:53;:::i;:::-;11560:63;;11515:118;11672:2;11698:53;11743:7;11734:6;11723:9;11719:22;11698:53;:::i;:::-;11688:63;;11643:118;11828:2;11817:9;11813:18;11800:32;11859:18;11851:6;11848:30;11845:117;;;11881:79;;:::i;:::-;11845:117;11986:62;12040:7;12031:6;12020:9;12016:22;11986:62;:::i;:::-;11976:72;;11771:287;11122:943;;;;;;;:::o;12071:474::-;12139:6;12147;12196:2;12184:9;12175:7;12171:23;12167:32;12164:119;;;12202:79;;:::i;:::-;12164:119;12322:1;12347:53;12392:7;12383:6;12372:9;12368:22;12347:53;:::i;:::-;12337:63;;12293:117;12449:2;12475:53;12520:7;12511:6;12500:9;12496:22;12475:53;:::i;:::-;12465:63;;12420:118;12071:474;;;;;:::o;12551:180::-;12599:77;12596:1;12589:88;12696:4;12693:1;12686:15;12720:4;12717:1;12710:15;12737:116;12821:1;12814:5;12811:12;12801:46;;12827:18;;:::i;:::-;12801:46;12737:116;:::o;12859:133::-;12907:7;12936:5;12925:16;;12942:44;12980:5;12942:44;:::i;:::-;12859:133;;;:::o;12998:::-;13057:9;13090:35;13119:5;13090:35;:::i;:::-;13077:48;;12998:133;;;:::o;13137:149::-;13233:46;13273:5;13233:46;:::i;:::-;13228:3;13221:59;13137:149;;:::o;13292:240::-;13394:4;13432:2;13421:9;13417:18;13409:26;;13445:80;13522:1;13511:9;13507:17;13498:6;13445:80;:::i;:::-;13292:240;;;;:::o;13538:117::-;13647:1;13644;13637:12;13661:117;13770:1;13767;13760:12;13801:568;13874:8;13884:6;13934:3;13927:4;13919:6;13915:17;13911:27;13901:122;;13942:79;;:::i;:::-;13901:122;14055:6;14042:20;14032:30;;14085:18;14077:6;14074:30;14071:117;;;14107:79;;:::i;:::-;14071:117;14221:4;14213:6;14209:17;14197:29;;14275:3;14267:4;14259:6;14255:17;14245:8;14241:32;14238:41;14235:128;;;14282:79;;:::i;:::-;14235:128;13801:568;;;;;:::o;14375:559::-;14461:6;14469;14518:2;14506:9;14497:7;14493:23;14489:32;14486:119;;;14524:79;;:::i;:::-;14486:119;14672:1;14661:9;14657:17;14644:31;14702:18;14694:6;14691:30;14688:117;;;14724:79;;:::i;:::-;14688:117;14837:80;14909:7;14900:6;14889:9;14885:22;14837:80;:::i;:::-;14819:98;;;;14615:312;14375:559;;;;;:::o;14940:180::-;14988:77;14985:1;14978:88;15085:4;15082:1;15075:15;15109:4;15106:1;15099:15;15126:320;15170:6;15207:1;15201:4;15197:12;15187:22;;15254:1;15248:4;15244:12;15275:18;15265:81;;15331:4;15323:6;15319:17;15309:27;;15265:81;15393:2;15385:6;15382:14;15362:18;15359:38;15356:84;;;15412:18;;:::i;:::-;15356:84;15177:269;15126:320;;;:::o;15452:231::-;15592:34;15588:1;15580:6;15576:14;15569:58;15661:14;15656:2;15648:6;15644:15;15637:39;15452:231;:::o;15689:366::-;15831:3;15852:67;15916:2;15911:3;15852:67;:::i;:::-;15845:74;;15928:93;16017:3;15928:93;:::i;:::-;16046:2;16041:3;16037:12;16030:19;;15689:366;;;:::o;16061:419::-;16227:4;16265:2;16254:9;16250:18;16242:26;;16314:9;16308:4;16304:20;16300:1;16289:9;16285:17;16278:47;16342:131;16468:4;16342:131;:::i;:::-;16334:139;;16061:419;;;:::o;16486:220::-;16626:34;16622:1;16614:6;16610:14;16603:58;16695:3;16690:2;16682:6;16678:15;16671:28;16486:220;:::o;16712:366::-;16854:3;16875:67;16939:2;16934:3;16875:67;:::i;:::-;16868:74;;16951:93;17040:3;16951:93;:::i;:::-;17069:2;17064:3;17060:12;17053:19;;16712:366;;;:::o;17084:419::-;17250:4;17288:2;17277:9;17273:18;17265:26;;17337:9;17331:4;17327:20;17323:1;17312:9;17308:17;17301:47;17365:131;17491:4;17365:131;:::i;:::-;17357:139;;17084:419;;;:::o;17509:243::-;17649:34;17645:1;17637:6;17633:14;17626:58;17718:26;17713:2;17705:6;17701:15;17694:51;17509:243;:::o;17758:366::-;17900:3;17921:67;17985:2;17980:3;17921:67;:::i;:::-;17914:74;;17997:93;18086:3;17997:93;:::i;:::-;18115:2;18110:3;18106:12;18099:19;;17758:366;;;:::o;18130:419::-;18296:4;18334:2;18323:9;18319:18;18311:26;;18383:9;18377:4;18373:20;18369:1;18358:9;18354:17;18347:47;18411:131;18537:4;18411:131;:::i;:::-;18403:139;;18130:419;;;:::o;18555:236::-;18695:34;18691:1;18683:6;18679:14;18672:58;18764:19;18759:2;18751:6;18747:15;18740:44;18555:236;:::o;18797:366::-;18939:3;18960:67;19024:2;19019:3;18960:67;:::i;:::-;18953:74;;19036:93;19125:3;19036:93;:::i;:::-;19154:2;19149:3;19145:12;19138:19;;18797:366;;;:::o;19169:419::-;19335:4;19373:2;19362:9;19358:18;19350:26;;19422:9;19416:4;19412:20;19408:1;19397:9;19393:17;19386:47;19450:131;19576:4;19450:131;:::i;:::-;19442:139;;19169:419;;;:::o;19594:230::-;19734:34;19730:1;19722:6;19718:14;19711:58;19803:13;19798:2;19790:6;19786:15;19779:38;19594:230;:::o;19830:366::-;19972:3;19993:67;20057:2;20052:3;19993:67;:::i;:::-;19986:74;;20069:93;20158:3;20069:93;:::i;:::-;20187:2;20182:3;20178:12;20171:19;;19830:366;;;:::o;20202:419::-;20368:4;20406:2;20395:9;20391:18;20383:26;;20455:9;20449:4;20445:20;20441:1;20430:9;20426:17;20419:47;20483:131;20609:4;20483:131;:::i;:::-;20475:139;;20202:419;;;:::o;20627:180::-;20675:77;20672:1;20665:88;20772:4;20769:1;20762:15;20796:4;20793:1;20786:15;20813:305;20853:3;20872:20;20890:1;20872:20;:::i;:::-;20867:25;;20906:20;20924:1;20906:20;:::i;:::-;20901:25;;21060:1;20992:66;20988:74;20985:1;20982:81;20979:107;;;21066:18;;:::i;:::-;20979:107;21110:1;21107;21103:9;21096:16;;20813:305;;;;:::o;21124:172::-;21264:24;21260:1;21252:6;21248:14;21241:48;21124:172;:::o;21302:366::-;21444:3;21465:67;21529:2;21524:3;21465:67;:::i;:::-;21458:74;;21541:93;21630:3;21541:93;:::i;:::-;21659:2;21654:3;21650:12;21643:19;;21302:366;;;:::o;21674:419::-;21840:4;21878:2;21867:9;21863:18;21855:26;;21927:9;21921:4;21917:20;21913:1;21902:9;21898:17;21891:47;21955:131;22081:4;21955:131;:::i;:::-;21947:139;;21674:419;;;:::o;22099:233::-;22138:3;22161:24;22179:5;22161:24;:::i;:::-;22152:33;;22207:66;22200:5;22197:77;22194:103;;;22277:18;;:::i;:::-;22194:103;22324:1;22317:5;22313:13;22306:20;;22099:233;;;:::o;22338:143::-;22395:5;22426:6;22420:13;22411:22;;22442:33;22469:5;22442:33;:::i;:::-;22338:143;;;;:::o;22487:351::-;22557:6;22606:2;22594:9;22585:7;22581:23;22577:32;22574:119;;;22612:79;;:::i;:::-;22574:119;22732:1;22757:64;22813:7;22804:6;22793:9;22789:22;22757:64;:::i;:::-;22747:74;;22703:128;22487:351;;;;:::o;22844:231::-;22984:34;22980:1;22972:6;22968:14;22961:58;23053:14;23048:2;23040:6;23036:15;23029:39;22844:231;:::o;23081:366::-;23223:3;23244:67;23308:2;23303:3;23244:67;:::i;:::-;23237:74;;23320:93;23409:3;23320:93;:::i;:::-;23438:2;23433:3;23429:12;23422:19;;23081:366;;;:::o;23453:419::-;23619:4;23657:2;23646:9;23642:18;23634:26;;23706:9;23700:4;23696:20;23692:1;23681:9;23677:17;23670:47;23734:131;23860:4;23734:131;:::i;:::-;23726:139;;23453:419;;;:::o;23878:180::-;23926:77;23923:1;23916:88;24023:4;24020:1;24013:15;24047:4;24044:1;24037:15;24064:182;24204:34;24200:1;24192:6;24188:14;24181:58;24064:182;:::o;24252:366::-;24394:3;24415:67;24479:2;24474:3;24415:67;:::i;:::-;24408:74;;24491:93;24580:3;24491:93;:::i;:::-;24609:2;24604:3;24600:12;24593:19;;24252:366;;;:::o;24624:419::-;24790:4;24828:2;24817:9;24813:18;24805:26;;24877:9;24871:4;24867:20;24863:1;24852:9;24848:17;24841:47;24905:131;25031:4;24905:131;:::i;:::-;24897:139;;24624:419;;;:::o;25049:228::-;25189:34;25185:1;25177:6;25173:14;25166:58;25258:11;25253:2;25245:6;25241:15;25234:36;25049:228;:::o;25283:366::-;25425:3;25446:67;25510:2;25505:3;25446:67;:::i;:::-;25439:74;;25522:93;25611:3;25522:93;:::i;:::-;25640:2;25635:3;25631:12;25624:19;;25283:366;;;:::o;25655:419::-;25821:4;25859:2;25848:9;25844:18;25836:26;;25908:9;25902:4;25898:20;25894:1;25883:9;25879:17;25872:47;25936:131;26062:4;25936:131;:::i;:::-;25928:139;;25655:419;;;:::o;26080:229::-;26220:34;26216:1;26208:6;26204:14;26197:58;26289:12;26284:2;26276:6;26272:15;26265:37;26080:229;:::o;26315:366::-;26457:3;26478:67;26542:2;26537:3;26478:67;:::i;:::-;26471:74;;26554:93;26643:3;26554:93;:::i;:::-;26672:2;26667:3;26663:12;26656:19;;26315:366;;;:::o;26687:419::-;26853:4;26891:2;26880:9;26876:18;26868:26;;26940:9;26934:4;26930:20;26926:1;26915:9;26911:17;26904:47;26968:131;27094:4;26968:131;:::i;:::-;26960:139;;26687:419;;;:::o;27112:164::-;27252:16;27248:1;27240:6;27236:14;27229:40;27112:164;:::o;27282:366::-;27424:3;27445:67;27509:2;27504:3;27445:67;:::i;:::-;27438:74;;27521:93;27610:3;27521:93;:::i;:::-;27639:2;27634:3;27630:12;27623:19;;27282:366;;;:::o;27654:419::-;27820:4;27858:2;27847:9;27843:18;27835:26;;27907:9;27901:4;27897:20;27893:1;27882:9;27878:17;27871:47;27935:131;28061:4;27935:131;:::i;:::-;27927:139;;27654:419;;;:::o;28079:163::-;28219:15;28215:1;28207:6;28203:14;28196:39;28079:163;:::o;28248:366::-;28390:3;28411:67;28475:2;28470:3;28411:67;:::i;:::-;28404:74;;28487:93;28576:3;28487:93;:::i;:::-;28605:2;28600:3;28596:12;28589:19;;28248:366;;;:::o;28620:419::-;28786:4;28824:2;28813:9;28809:18;28801:26;;28873:9;28867:4;28863:20;28859:1;28848:9;28844:17;28837:47;28901:131;29027:4;28901:131;:::i;:::-;28893:139;;28620:419;;;:::o;29045:191::-;29085:4;29105:20;29123:1;29105:20;:::i;:::-;29100:25;;29139:20;29157:1;29139:20;:::i;:::-;29134:25;;29178:1;29175;29172:8;29169:34;;;29183:18;;:::i;:::-;29169:34;29228:1;29225;29221:9;29213:17;;29045:191;;;;:::o;29242:235::-;29382:34;29378:1;29370:6;29366:14;29359:58;29451:18;29446:2;29438:6;29434:15;29427:43;29242:235;:::o;29483:366::-;29625:3;29646:67;29710:2;29705:3;29646:67;:::i;:::-;29639:74;;29722:93;29811:3;29722:93;:::i;:::-;29840:2;29835:3;29831:12;29824:19;;29483:366;;;:::o;29855:419::-;30021:4;30059:2;30048:9;30044:18;30036:26;;30108:9;30102:4;30098:20;30094:1;30083:9;30079:17;30072:47;30136:131;30262:4;30136:131;:::i;:::-;30128:139;;29855:419;;;:::o;30280:170::-;30420:22;30416:1;30408:6;30404:14;30397:46;30280:170;:::o;30456:366::-;30598:3;30619:67;30683:2;30678:3;30619:67;:::i;:::-;30612:74;;30695:93;30784:3;30695:93;:::i;:::-;30813:2;30808:3;30804:12;30797:19;;30456:366;;;:::o;30828:419::-;30994:4;31032:2;31021:9;31017:18;31009:26;;31081:9;31075:4;31071:20;31067:1;31056:9;31052:17;31045:47;31109:131;31235:4;31109:131;:::i;:::-;31101:139;;30828:419;;;:::o;31253:175::-;31393:27;31389:1;31381:6;31377:14;31370:51;31253:175;:::o;31434:366::-;31576:3;31597:67;31661:2;31656:3;31597:67;:::i;:::-;31590:74;;31673:93;31762:3;31673:93;:::i;:::-;31791:2;31786:3;31782:12;31775:19;;31434:366;;;:::o;31806:419::-;31972:4;32010:2;31999:9;31995:18;31987:26;;32059:9;32053:4;32049:20;32045:1;32034:9;32030:17;32023:47;32087:131;32213:4;32087:131;:::i;:::-;32079:139;;31806:419;;;:::o;32231:181::-;32371:33;32367:1;32359:6;32355:14;32348:57;32231:181;:::o;32418:366::-;32560:3;32581:67;32645:2;32640:3;32581:67;:::i;:::-;32574:74;;32657:93;32746:3;32657:93;:::i;:::-;32775:2;32770:3;32766:12;32759:19;;32418:366;;;:::o;32790:419::-;32956:4;32994:2;32983:9;32979:18;32971:26;;33043:9;33037:4;33033:20;33029:1;33018:9;33014:17;33007:47;33071:131;33197:4;33071:131;:::i;:::-;33063:139;;32790:419;;;:::o;33215:172::-;33355:24;33351:1;33343:6;33339:14;33332:48;33215:172;:::o;33393:366::-;33535:3;33556:67;33620:2;33615:3;33556:67;:::i;:::-;33549:74;;33632:93;33721:3;33632:93;:::i;:::-;33750:2;33745:3;33741:12;33734:19;;33393:366;;;:::o;33765:419::-;33931:4;33969:2;33958:9;33954:18;33946:26;;34018:9;34012:4;34008:20;34004:1;33993:9;33989:17;33982:47;34046:131;34172:4;34046:131;:::i;:::-;34038:139;;33765:419;;;:::o;34190:180::-;34238:77;34235:1;34228:88;34335:4;34332:1;34325:15;34359:4;34356:1;34349:15;34376:176;34408:1;34425:20;34443:1;34425:20;:::i;:::-;34420:25;;34459:20;34477:1;34459:20;:::i;:::-;34454:25;;34498:1;34488:35;;34503:18;;:::i;:::-;34488:35;34544:1;34541;34537:9;34532:14;;34376:176;;;;:::o;34558:237::-;34596:3;34615:18;34631:1;34615:18;:::i;:::-;34610:23;;34647:18;34663:1;34647:18;:::i;:::-;34642:23;;34737:1;34731:4;34727:12;34724:1;34721:19;34718:45;;;34743:18;;:::i;:::-;34718:45;34787:1;34784;34780:9;34773:16;;34558:237;;;;:::o;34801:348::-;34841:7;34864:20;34882:1;34864:20;:::i;:::-;34859:25;;34898:20;34916:1;34898:20;:::i;:::-;34893:25;;35086:1;35018:66;35014:74;35011:1;35008:81;35003:1;34996:9;34989:17;34985:105;34982:131;;;35093:18;;:::i;:::-;34982:131;35141:1;35138;35134:9;35123:20;;34801:348;;;;:::o;35155:185::-;35195:1;35212:20;35230:1;35212:20;:::i;:::-;35207:25;;35246:20;35264:1;35246:20;:::i;:::-;35241:25;;35285:1;35275:35;;35290:18;;:::i;:::-;35275:35;35332:1;35329;35325:9;35320:14;;35155:185;;;;:::o;35346:178::-;35486:30;35482:1;35474:6;35470:14;35463:54;35346:178;:::o;35530:366::-;35672:3;35693:67;35757:2;35752:3;35693:67;:::i;:::-;35686:74;;35769:93;35858:3;35769:93;:::i;:::-;35887:2;35882:3;35878:12;35871:19;;35530:366;;;:::o;35902:419::-;36068:4;36106:2;36095:9;36091:18;36083:26;;36155:9;36149:4;36145:20;36141:1;36130:9;36126:17;36119:47;36183:131;36309:4;36183:131;:::i;:::-;36175:139;;35902:419;;;:::o;36327:167::-;36364:3;36387:22;36403:5;36387:22;:::i;:::-;36378:31;;36431:4;36424:5;36421:15;36418:41;;;36439:18;;:::i;:::-;36418:41;36486:1;36479:5;36475:13;36468:20;;36327:167;;;:::o;36500:175::-;36640:27;36636:1;36628:6;36624:14;36617:51;36500:175;:::o;36681:366::-;36823:3;36844:67;36908:2;36903:3;36844:67;:::i;:::-;36837:74;;36920:93;37009:3;36920:93;:::i;:::-;37038:2;37033:3;37029:12;37022:19;;36681:366;;;:::o;37053:419::-;37219:4;37257:2;37246:9;37242:18;37234:26;;37306:9;37300:4;37296:20;37292:1;37281:9;37277:17;37270:47;37334:131;37460:4;37334:131;:::i;:::-;37326:139;;37053:419;;;:::o;37478:234::-;37618:34;37614:1;37606:6;37602:14;37595:58;37687:17;37682:2;37674:6;37670:15;37663:42;37478:234;:::o;37718:366::-;37860:3;37881:67;37945:2;37940:3;37881:67;:::i;:::-;37874:74;;37957:93;38046:3;37957:93;:::i;:::-;38075:2;38070:3;38066:12;38059:19;;37718:366;;;:::o;38090:419::-;38256:4;38294:2;38283:9;38279:18;38271:26;;38343:9;38337:4;38333:20;38329:1;38318:9;38314:17;38307:47;38371:131;38497:4;38371:131;:::i;:::-;38363:139;;38090:419;;;:::o;38515:148::-;38617:11;38654:3;38639:18;;38515:148;;;;:::o;38669:377::-;38775:3;38803:39;38836:5;38803:39;:::i;:::-;38858:89;38940:6;38935:3;38858:89;:::i;:::-;38851:96;;38956:52;39001:6;38996:3;38989:4;38982:5;38978:16;38956:52;:::i;:::-;39033:6;39028:3;39024:16;39017:23;;38779:267;38669:377;;;;:::o;39052:435::-;39232:3;39254:95;39345:3;39336:6;39254:95;:::i;:::-;39247:102;;39366:95;39457:3;39448:6;39366:95;:::i;:::-;39359:102;;39478:3;39471:10;;39052:435;;;;;:::o;39493:225::-;39633:34;39629:1;39621:6;39617:14;39610:58;39702:8;39697:2;39689:6;39685:15;39678:33;39493:225;:::o;39724:366::-;39866:3;39887:67;39951:2;39946:3;39887:67;:::i;:::-;39880:74;;39963:93;40052:3;39963:93;:::i;:::-;40081:2;40076:3;40072:12;40065:19;;39724:366;;;:::o;40096:419::-;40262:4;40300:2;40289:9;40285:18;40277:26;;40349:9;40343:4;40339:20;40335:1;40324:9;40320:17;40313:47;40377:131;40503:4;40377:131;:::i;:::-;40369:139;;40096:419;;;:::o;40521:231::-;40661:34;40657:1;40649:6;40645:14;40638:58;40730:14;40725:2;40717:6;40713:15;40706:39;40521:231;:::o;40758:366::-;40900:3;40921:67;40985:2;40980:3;40921:67;:::i;:::-;40914:74;;40997:93;41086:3;40997:93;:::i;:::-;41115:2;41110:3;41106:12;41099:19;;40758:366;;;:::o;41130:419::-;41296:4;41334:2;41323:9;41319:18;41311:26;;41383:9;41377:4;41373:20;41369:1;41358:9;41354:17;41347:47;41411:131;41537:4;41411:131;:::i;:::-;41403:139;;41130:419;;;:::o;41555:228::-;41695:34;41691:1;41683:6;41679:14;41672:58;41764:11;41759:2;41751:6;41747:15;41740:36;41555:228;:::o;41789:366::-;41931:3;41952:67;42016:2;42011:3;41952:67;:::i;:::-;41945:74;;42028:93;42117:3;42028:93;:::i;:::-;42146:2;42141:3;42137:12;42130:19;;41789:366;;;:::o;42161:419::-;42327:4;42365:2;42354:9;42350:18;42342:26;;42414:9;42408:4;42404:20;42400:1;42389:9;42385:17;42378:47;42442:131;42568:4;42442:131;:::i;:::-;42434:139;;42161:419;;;:::o;42586:223::-;42726:34;42722:1;42714:6;42710:14;42703:58;42795:6;42790:2;42782:6;42778:15;42771:31;42586:223;:::o;42815:366::-;42957:3;42978:67;43042:2;43037:3;42978:67;:::i;:::-;42971:74;;43054:93;43143:3;43054:93;:::i;:::-;43172:2;43167:3;43163:12;43156:19;;42815:366;;;:::o;43187:419::-;43353:4;43391:2;43380:9;43376:18;43368:26;;43440:9;43434:4;43430:20;43426:1;43415:9;43411:17;43404:47;43468:131;43594:4;43468:131;:::i;:::-;43460:139;;43187:419;;;:::o;43612:94::-;43645:8;43693:5;43689:2;43685:14;43664:35;;43612:94;;;:::o;43712:::-;43751:7;43780:20;43794:5;43780:20;:::i;:::-;43769:31;;43712:94;;;:::o;43812:100::-;43851:7;43880:26;43900:5;43880:26;:::i;:::-;43869:37;;43812:100;;;:::o;43918:157::-;44023:45;44043:24;44061:5;44043:24;:::i;:::-;44023:45;:::i;:::-;44018:3;44011:58;43918:157;;:::o;44081:79::-;44120:7;44149:5;44138:16;;44081:79;;;:::o;44166:157::-;44271:45;44291:24;44309:5;44291:24;:::i;:::-;44271:45;:::i;:::-;44266:3;44259:58;44166:157;;:::o;44329:679::-;44525:3;44540:75;44611:3;44602:6;44540:75;:::i;:::-;44640:2;44635:3;44631:12;44624:19;;44653:75;44724:3;44715:6;44653:75;:::i;:::-;44753:2;44748:3;44744:12;44737:19;;44766:75;44837:3;44828:6;44766:75;:::i;:::-;44866:2;44861:3;44857:12;44850:19;;44879:75;44950:3;44941:6;44879:75;:::i;:::-;44979:2;44974:3;44970:12;44963:19;;44999:3;44992:10;;44329:679;;;;;;;:::o;45014:182::-;45154:34;45150:1;45142:6;45138:14;45131:58;45014:182;:::o;45202:366::-;45344:3;45365:67;45429:2;45424:3;45365:67;:::i;:::-;45358:74;;45441:93;45530:3;45441:93;:::i;:::-;45559:2;45554:3;45550:12;45543:19;;45202:366;;;:::o;45574:419::-;45740:4;45778:2;45767:9;45763:18;45755:26;;45827:9;45821:4;45817:20;45813:1;45802:9;45798:17;45791:47;45855:131;45981:4;45855:131;:::i;:::-;45847:139;;45574:419;;;:::o;45999:178::-;46139:30;46135:1;46127:6;46123:14;46116:54;45999:178;:::o;46183:366::-;46325:3;46346:67;46410:2;46405:3;46346:67;:::i;:::-;46339:74;;46422:93;46511:3;46422:93;:::i;:::-;46540:2;46535:3;46531:12;46524:19;;46183:366;;;:::o;46555:419::-;46721:4;46759:2;46748:9;46744:18;46736:26;;46808:9;46802:4;46798:20;46794:1;46783:9;46779:17;46772:47;46836:131;46962:4;46836:131;:::i;:::-;46828:139;;46555:419;;;:::o;46980:237::-;47120:34;47116:1;47108:6;47104:14;47097:58;47189:20;47184:2;47176:6;47172:15;47165:45;46980:237;:::o;47223:366::-;47365:3;47386:67;47450:2;47445:3;47386:67;:::i;:::-;47379:74;;47462:93;47551:3;47462:93;:::i;:::-;47580:2;47575:3;47571:12;47564:19;;47223:366;;;:::o;47595:419::-;47761:4;47799:2;47788:9;47784:18;47776:26;;47848:9;47842:4;47838:20;47834:1;47823:9;47819:17;47812:47;47876:131;48002:4;47876:131;:::i;:::-;47868:139;;47595:419;;;:::o;48020:98::-;48071:6;48105:5;48099:12;48089:22;;48020:98;;;:::o;48124:168::-;48207:11;48241:6;48236:3;48229:19;48281:4;48276:3;48272:14;48257:29;;48124:168;;;;:::o;48298:360::-;48384:3;48412:38;48444:5;48412:38;:::i;:::-;48466:70;48529:6;48524:3;48466:70;:::i;:::-;48459:77;;48545:52;48590:6;48585:3;48578:4;48571:5;48567:16;48545:52;:::i;:::-;48622:29;48644:6;48622:29;:::i;:::-;48617:3;48613:39;48606:46;;48388:270;48298:360;;;;:::o;48664:640::-;48859:4;48897:3;48886:9;48882:19;48874:27;;48911:71;48979:1;48968:9;48964:17;48955:6;48911:71;:::i;:::-;48992:72;49060:2;49049:9;49045:18;49036:6;48992:72;:::i;:::-;49074;49142:2;49131:9;49127:18;49118:6;49074:72;:::i;:::-;49193:9;49187:4;49183:20;49178:2;49167:9;49163:18;49156:48;49221:76;49292:4;49283:6;49221:76;:::i;:::-;49213:84;;48664:640;;;;;;;:::o;49310:141::-;49366:5;49397:6;49391:13;49382:22;;49413:32;49439:5;49413:32;:::i;:::-;49310:141;;;;:::o;49457:349::-;49526:6;49575:2;49563:9;49554:7;49550:23;49546:32;49543:119;;;49581:79;;:::i;:::-;49543:119;49701:1;49726:63;49781:7;49772:6;49761:9;49757:22;49726:63;:::i;:::-;49716:73;;49672:127;49457:349;;;;:::o;49812:180::-;49860:77;49857:1;49850:88;49957:4;49954:1;49947:15;49981:4;49978:1;49971:15
Swarm Source
ipfs://860a06add574cdb6a37fa589c781958c06c2b8a94dbdbed6522937383295a277
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.