ERC-721
Overview
Max Total Supply
63 KEY
Holders
42
Market
Fully Diluted Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
0 KEYLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
FrogCultKeycard
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-12-28 */ // Sources flattened with hardhat v2.4.3 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // 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); } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { 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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @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(); } } // File @openzeppelin/contracts/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File contracts/FrogCultKeycard.sol pragma solidity ^0.8.2; contract FrogCultKeycard is ERC721, ERC721Enumerable, Pausable, Ownable, ERC721Burnable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; constructor() ERC721("Frog Cult Keycard", "KEY") {} mapping(address => bool) public Whitelist; string public baseURI; function setBaseURI(string memory newBaseURI) public onlyOwner { baseURI = newBaseURI; } function _baseURI() internal view override returns (string memory) { return baseURI; } function whitelistToggle(address who) public onlyOwner { Whitelist[who] = Whitelist[who] ? false : true; } function whitelistToggle(address[] memory addresses) public onlyOwner { for (uint256 i; i < addresses.length; i++) { address who = addresses[i]; Whitelist[who] = Whitelist[who] ? false : true; } } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function internalMint(address to) internal { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } function safeMint(address to) public onlyOwner { internalMint(to); } function claim() public { address who = msg.sender; require(Whitelist[who] == true, "you are not whitelisted to claim"); Whitelist[who] = false; internalMint(who); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) whenNotPaused { super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"whitelistToggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"whitelistToggle","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601181526020017f46726f672043756c74204b6579636172640000000000000000000000000000008152506040518060400160405280600381526020017f4b45590000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001c1565b508060019080519060200190620000af929190620001c1565b5050506000600a60006101000a81548160ff021916908315150217905550620000ed620000e1620000f360201b60201c565b620000fb60201b60201c565b620002d6565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cf9062000271565b90600052602060002090601f016020900481019282620001f357600085556200023f565b82601f106200020e57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023e57825182559160200191906001019062000221565b5b5090506200024e919062000252565b5090565b5b808211156200026d57600081600090555060010162000253565b5090565b600060028204905060018216806200028a57607f821691505b60208210811415620002a157620002a0620002a7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61432d80620002e66000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636352211e1161010457806395d89b41116100a2578063c87b56dd11610071578063c87b56dd146104f3578063e985e9c514610523578063eb73900b14610553578063f2fde38b14610583576101da565b806395d89b4114610481578063a22cb4651461049f578063b112783c146104bb578063b88d4fde146104d7576101da565b806370a08231116100de57806370a082311461041f578063715018a61461044f5780638456cb59146104595780638da5cb5b14610463576101da565b80636352211e146103b557806366c8b52f146103e55780636c0360eb14610401576101da565b80633f4ba83a1161017c5780634e71d92d1161014b5780634e71d92d146103415780634f6ccce71461034b57806355f804b31461037b5780635c975abb14610397576101da565b80633f4ba83a146102e357806340d097c3146102ed57806342842e0e1461030957806342966c6814610325576101da565b8063095ea7b3116101b8578063095ea7b31461025d57806318160ddd1461027957806323b872dd146102975780632f745c59146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f4919061300e565b61059f565b604051610206919061353b565b60405180910390f35b6102176105b1565b6040516102249190613556565b60405180910390f35b610247600480360381019061024291906130b1565b610643565b60405161025491906134d4565b60405180910390f35b61027760048036038101906102729190612f85565b6106c8565b005b6102816107e0565b60405161028e9190613838565b60405180910390f35b6102b160048036038101906102ac9190612e6f565b6107ed565b005b6102cd60048036038101906102c89190612f85565b61084d565b6040516102da9190613838565b60405180910390f35b6102eb6108f2565b005b61030760048036038101906103029190612e02565b610978565b005b610323600480360381019061031e9190612e6f565b610a00565b005b61033f600480360381019061033a91906130b1565b610a20565b005b610349610a7c565b005b610365600480360381019061036091906130b1565b610b78565b6040516103729190613838565b60405180910390f35b61039560048036038101906103909190613068565b610be9565b005b61039f610c7f565b6040516103ac919061353b565b60405180910390f35b6103cf60048036038101906103ca91906130b1565b610c96565b6040516103dc91906134d4565b60405180910390f35b6103ff60048036038101906103fa9190612e02565b610d48565b005b610409610e78565b6040516104169190613556565b60405180910390f35b61043960048036038101906104349190612e02565b610f06565b6040516104469190613838565b60405180910390f35b610457610fbe565b005b610461611046565b005b61046b6110cc565b60405161047891906134d4565b60405180910390f35b6104896110f6565b6040516104969190613556565b60405180910390f35b6104b960048036038101906104b49190612f45565b611188565b005b6104d560048036038101906104d09190612fc5565b611309565b005b6104f160048036038101906104ec9190612ec2565b611479565b005b61050d600480360381019061050891906130b1565b6114db565b60405161051a9190613556565b60405180910390f35b61053d60048036038101906105389190612e2f565b611582565b60405161054a919061353b565b60405180910390f35b61056d60048036038101906105689190612e02565b611616565b60405161057a919061353b565b60405180910390f35b61059d60048036038101906105989190612e02565b611636565b005b60006105aa8261172e565b9050919050565b6060600080546105c090613aba565b80601f01602080910402602001604051908101604052809291908181526020018280546105ec90613aba565b80156106395780601f1061060e57610100808354040283529160200191610639565b820191906000526020600020905b81548152906001019060200180831161061c57829003601f168201915b5050505050905090565b600061064e826117a8565b61068d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068490613718565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106d382610c96565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073b90613798565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610763611814565b73ffffffffffffffffffffffffffffffffffffffff16148061079257506107918161078c611814565b611582565b5b6107d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c890613698565b60405180910390fd5b6107db838361181c565b505050565b6000600880549050905090565b6107fe6107f8611814565b826118d5565b61083d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610834906137b8565b60405180910390fd5b6108488383836119b3565b505050565b600061085883610f06565b8210610899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089090613598565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108fa611814565b73ffffffffffffffffffffffffffffffffffffffff166109186110cc565b73ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096590613738565b60405180910390fd5b610976611c0f565b565b610980611814565b73ffffffffffffffffffffffffffffffffffffffff1661099e6110cc565b73ffffffffffffffffffffffffffffffffffffffff16146109f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109eb90613738565b60405180910390fd5b6109fd81611cb1565b50565b610a1b83838360405180602001604052806000815250611479565b505050565b610a31610a2b611814565b826118d5565b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6790613818565b60405180910390fd5b610a7981611cd7565b50565b600033905060011515600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0b906137d8565b60405180910390fd5b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610b7581611cb1565b50565b6000610b826107e0565b8210610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba906137f8565b60405180910390fd5b60088281548110610bd757610bd6613c53565b5b90600052602060002001549050919050565b610bf1611814565b73ffffffffffffffffffffffffffffffffffffffff16610c0f6110cc565b73ffffffffffffffffffffffffffffffffffffffff1614610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90613738565b60405180910390fd5b80600d9080519060200190610c7b929190612b78565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d36906136d8565b60405180910390fd5b80915050919050565b610d50611814565b73ffffffffffffffffffffffffffffffffffffffff16610d6e6110cc565b73ffffffffffffffffffffffffffffffffffffffff1614610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb90613738565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e1c576001610e1f565b60005b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600d8054610e8590613aba565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb190613aba565b8015610efe5780601f10610ed357610100808354040283529160200191610efe565b820191906000526020600020905b815481529060010190602001808311610ee157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e906136b8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fc6611814565b73ffffffffffffffffffffffffffffffffffffffff16610fe46110cc565b73ffffffffffffffffffffffffffffffffffffffff161461103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103190613738565b60405180910390fd5b6110446000611de8565b565b61104e611814565b73ffffffffffffffffffffffffffffffffffffffff1661106c6110cc565b73ffffffffffffffffffffffffffffffffffffffff16146110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b990613738565b60405180910390fd5b6110ca611eae565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461110590613aba565b80601f016020809104026020016040519081016040528092919081815260200182805461113190613aba565b801561117e5780601f106111535761010080835404028352916020019161117e565b820191906000526020600020905b81548152906001019060200180831161116157829003601f168201915b5050505050905090565b611190611814565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f590613638565b60405180910390fd5b806005600061120b611814565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112b8611814565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112fd919061353b565b60405180910390a35050565b611311611814565b73ffffffffffffffffffffffffffffffffffffffff1661132f6110cc565b73ffffffffffffffffffffffffffffffffffffffff1614611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c90613738565b60405180910390fd5b60005b81518110156114755760008282815181106113a6576113a5613c53565b5b60200260200101519050600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661140857600161140b565b60005b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061146d90613b1d565b915050611388565b5050565b61148a611484611814565b836118d5565b6114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c0906137b8565b60405180910390fd5b6114d584848484611f51565b50505050565b60606114e6826117a8565b611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90613778565b60405180910390fd5b600061152f611fad565b9050600081511161154f576040518060200160405280600081525061157a565b806115598461203f565b60405160200161156a9291906134b0565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c6020528060005260406000206000915054906101000a900460ff1681565b61163e611814565b73ffffffffffffffffffffffffffffffffffffffff1661165c6110cc565b73ffffffffffffffffffffffffffffffffffffffff16146116b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a990613738565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611719906135d8565b60405180910390fd5b61172b81611de8565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117a157506117a0826121a0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661188f83610c96565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118e0826117a8565b61191f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191690613658565b60405180910390fd5b600061192a83610c96565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061199957508373ffffffffffffffffffffffffffffffffffffffff1661198184610643565b73ffffffffffffffffffffffffffffffffffffffff16145b806119aa57506119a98185611582565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119d382610c96565b73ffffffffffffffffffffffffffffffffffffffff1614611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2090613758565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9090613618565b60405180910390fd5b611aa4838383612282565b611aaf60008261181c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aff91906139d0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b569190613949565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611c17610c7f565b611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d90613578565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c9a611814565b604051611ca791906134d4565b60405180910390a1565b6000611cbd600b6122da565b9050611cc9600b6122e8565b611cd382826122fe565b5050565b6000611ce282610c96565b9050611cf081600084612282565b611cfb60008361181c565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d4b91906139d0565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611eb6610c7f565b15611ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eed90613678565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f3a611814565b604051611f4791906134d4565b60405180910390a1565b611f5c8484846119b3565b611f688484848461231c565b611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e906135b8565b60405180910390fd5b50505050565b6060600d8054611fbc90613aba565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe890613aba565b80156120355780601f1061200a57610100808354040283529160200191612035565b820191906000526020600020905b81548152906001019060200180831161201857829003601f168201915b5050505050905090565b60606000821415612087576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061219b565b600082905060005b600082146120b95780806120a290613b1d565b915050600a826120b2919061399f565b915061208f565b60008167ffffffffffffffff8111156120d5576120d4613c82565b5b6040519080825280601f01601f1916602001820160405280156121075781602001600182028036833780820191505090505b5090505b600085146121945760018261212091906139d0565b9150600a8561212f9190613b66565b603061213b9190613949565b60f81b81838151811061215157612150613c53565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561218d919061399f565b945061210b565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061226b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061227b575061227a826124b3565b5b9050919050565b61228a610c7f565b156122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c190613678565b60405180910390fd5b6122d583838361251d565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612318828260405180602001604052806000815250612631565b5050565b600061233d8473ffffffffffffffffffffffffffffffffffffffff1661268c565b156124a6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612366611814565b8786866040518563ffffffff1660e01b815260040161238894939291906134ef565b602060405180830381600087803b1580156123a257600080fd5b505af19250505080156123d357506040513d601f19601f820116820180604052508101906123d0919061303b565b60015b612456573d8060008114612403576040519150601f19603f3d011682016040523d82523d6000602084013e612408565b606091505b5060008151141561244e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612445906135b8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124ab565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61252883838361269f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561256b57612566816126a4565b6125aa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125a9576125a883826126ed565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ed576125e88161285a565b61262c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461262b5761262a828261292b565b5b5b505050565b61263b83836129aa565b612648600084848461231c565b612687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267e906135b8565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016126fa84610f06565b61270491906139d0565b90506000600760008481526020019081526020016000205490508181146127e9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061286e91906139d0565b905060006009600084815260200190815260200160002054905060006008838154811061289e5761289d613c53565b5b9060005260206000200154905080600883815481106128c0576128bf613c53565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061290f5761290e613c24565b5b6001900381819060005260206000200160009055905550505050565b600061293683610f06565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a11906136f8565b60405180910390fd5b612a23816117a8565b15612a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5a906135f8565b60405180910390fd5b612a6f60008383612282565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612abf9190613949565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612b8490613aba565b90600052602060002090601f016020900481019282612ba65760008555612bed565b82601f10612bbf57805160ff1916838001178555612bed565b82800160010185558215612bed579182015b82811115612bec578251825591602001919060010190612bd1565b5b509050612bfa9190612bfe565b5090565b5b80821115612c17576000816000905550600101612bff565b5090565b6000612c2e612c2984613878565b613853565b90508083825260208201905082856020860282011115612c5157612c50613cb6565b5b60005b85811015612c815781612c678882612d0f565b845260208401935060208301925050600181019050612c54565b5050509392505050565b6000612c9e612c99846138a4565b613853565b905082815260208101848484011115612cba57612cb9613cbb565b5b612cc5848285613a78565b509392505050565b6000612ce0612cdb846138d5565b613853565b905082815260208101848484011115612cfc57612cfb613cbb565b5b612d07848285613a78565b509392505050565b600081359050612d1e8161429b565b92915050565b600082601f830112612d3957612d38613cb1565b5b8135612d49848260208601612c1b565b91505092915050565b600081359050612d61816142b2565b92915050565b600081359050612d76816142c9565b92915050565b600081519050612d8b816142c9565b92915050565b600082601f830112612da657612da5613cb1565b5b8135612db6848260208601612c8b565b91505092915050565b600082601f830112612dd457612dd3613cb1565b5b8135612de4848260208601612ccd565b91505092915050565b600081359050612dfc816142e0565b92915050565b600060208284031215612e1857612e17613cc5565b5b6000612e2684828501612d0f565b91505092915050565b60008060408385031215612e4657612e45613cc5565b5b6000612e5485828601612d0f565b9250506020612e6585828601612d0f565b9150509250929050565b600080600060608486031215612e8857612e87613cc5565b5b6000612e9686828701612d0f565b9350506020612ea786828701612d0f565b9250506040612eb886828701612ded565b9150509250925092565b60008060008060808587031215612edc57612edb613cc5565b5b6000612eea87828801612d0f565b9450506020612efb87828801612d0f565b9350506040612f0c87828801612ded565b925050606085013567ffffffffffffffff811115612f2d57612f2c613cc0565b5b612f3987828801612d91565b91505092959194509250565b60008060408385031215612f5c57612f5b613cc5565b5b6000612f6a85828601612d0f565b9250506020612f7b85828601612d52565b9150509250929050565b60008060408385031215612f9c57612f9b613cc5565b5b6000612faa85828601612d0f565b9250506020612fbb85828601612ded565b9150509250929050565b600060208284031215612fdb57612fda613cc5565b5b600082013567ffffffffffffffff811115612ff957612ff8613cc0565b5b61300584828501612d24565b91505092915050565b60006020828403121561302457613023613cc5565b5b600061303284828501612d67565b91505092915050565b60006020828403121561305157613050613cc5565b5b600061305f84828501612d7c565b91505092915050565b60006020828403121561307e5761307d613cc5565b5b600082013567ffffffffffffffff81111561309c5761309b613cc0565b5b6130a884828501612dbf565b91505092915050565b6000602082840312156130c7576130c6613cc5565b5b60006130d584828501612ded565b91505092915050565b6130e781613a04565b82525050565b6130f681613a16565b82525050565b600061310782613906565b613111818561391c565b9350613121818560208601613a87565b61312a81613cca565b840191505092915050565b600061314082613911565b61314a818561392d565b935061315a818560208601613a87565b61316381613cca565b840191505092915050565b600061317982613911565b613183818561393e565b9350613193818560208601613a87565b80840191505092915050565b60006131ac60148361392d565b91506131b782613cdb565b602082019050919050565b60006131cf602b8361392d565b91506131da82613d04565b604082019050919050565b60006131f260328361392d565b91506131fd82613d53565b604082019050919050565b600061321560268361392d565b915061322082613da2565b604082019050919050565b6000613238601c8361392d565b915061324382613df1565b602082019050919050565b600061325b60248361392d565b915061326682613e1a565b604082019050919050565b600061327e60198361392d565b915061328982613e69565b602082019050919050565b60006132a1602c8361392d565b91506132ac82613e92565b604082019050919050565b60006132c460108361392d565b91506132cf82613ee1565b602082019050919050565b60006132e760388361392d565b91506132f282613f0a565b604082019050919050565b600061330a602a8361392d565b915061331582613f59565b604082019050919050565b600061332d60298361392d565b915061333882613fa8565b604082019050919050565b600061335060208361392d565b915061335b82613ff7565b602082019050919050565b6000613373602c8361392d565b915061337e82614020565b604082019050919050565b600061339660208361392d565b91506133a18261406f565b602082019050919050565b60006133b960298361392d565b91506133c482614098565b604082019050919050565b60006133dc602f8361392d565b91506133e7826140e7565b604082019050919050565b60006133ff60218361392d565b915061340a82614136565b604082019050919050565b600061342260318361392d565b915061342d82614185565b604082019050919050565b600061344560208361392d565b9150613450826141d4565b602082019050919050565b6000613468602c8361392d565b9150613473826141fd565b604082019050919050565b600061348b60308361392d565b91506134968261424c565b604082019050919050565b6134aa81613a6e565b82525050565b60006134bc828561316e565b91506134c8828461316e565b91508190509392505050565b60006020820190506134e960008301846130de565b92915050565b600060808201905061350460008301876130de565b61351160208301866130de565b61351e60408301856134a1565b818103606083015261353081846130fc565b905095945050505050565b600060208201905061355060008301846130ed565b92915050565b600060208201905081810360008301526135708184613135565b905092915050565b600060208201905081810360008301526135918161319f565b9050919050565b600060208201905081810360008301526135b1816131c2565b9050919050565b600060208201905081810360008301526135d1816131e5565b9050919050565b600060208201905081810360008301526135f181613208565b9050919050565b600060208201905081810360008301526136118161322b565b9050919050565b600060208201905081810360008301526136318161324e565b9050919050565b6000602082019050818103600083015261365181613271565b9050919050565b6000602082019050818103600083015261367181613294565b9050919050565b60006020820190508181036000830152613691816132b7565b9050919050565b600060208201905081810360008301526136b1816132da565b9050919050565b600060208201905081810360008301526136d1816132fd565b9050919050565b600060208201905081810360008301526136f181613320565b9050919050565b6000602082019050818103600083015261371181613343565b9050919050565b6000602082019050818103600083015261373181613366565b9050919050565b6000602082019050818103600083015261375181613389565b9050919050565b60006020820190508181036000830152613771816133ac565b9050919050565b60006020820190508181036000830152613791816133cf565b9050919050565b600060208201905081810360008301526137b1816133f2565b9050919050565b600060208201905081810360008301526137d181613415565b9050919050565b600060208201905081810360008301526137f181613438565b9050919050565b600060208201905081810360008301526138118161345b565b9050919050565b600060208201905081810360008301526138318161347e565b9050919050565b600060208201905061384d60008301846134a1565b92915050565b600061385d61386e565b90506138698282613aec565b919050565b6000604051905090565b600067ffffffffffffffff82111561389357613892613c82565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156138bf576138be613c82565b5b6138c882613cca565b9050602081019050919050565b600067ffffffffffffffff8211156138f0576138ef613c82565b5b6138f982613cca565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061395482613a6e565b915061395f83613a6e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561399457613993613b97565b5b828201905092915050565b60006139aa82613a6e565b91506139b583613a6e565b9250826139c5576139c4613bc6565b5b828204905092915050565b60006139db82613a6e565b91506139e683613a6e565b9250828210156139f9576139f8613b97565b5b828203905092915050565b6000613a0f82613a4e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613aa5578082015181840152602081019050613a8a565b83811115613ab4576000848401525b50505050565b60006002820490506001821680613ad257607f821691505b60208210811415613ae657613ae5613bf5565b5b50919050565b613af582613cca565b810181811067ffffffffffffffff82111715613b1457613b13613c82565b5b80604052505050565b6000613b2882613a6e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b5b57613b5a613b97565b5b600182019050919050565b6000613b7182613a6e565b9150613b7c83613a6e565b925082613b8c57613b8b613bc6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f796f7520617265206e6f742077686974656c697374656420746f20636c61696d600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6142a481613a04565b81146142af57600080fd5b50565b6142bb81613a16565b81146142c657600080fd5b50565b6142d281613a22565b81146142dd57600080fd5b50565b6142e981613a6e565b81146142f457600080fd5b5056fea26469706673582212209ac5918abbe91a3d890b20fd93c30303bcd611b12ca7a944a488c6cede225aac64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80636352211e1161010457806395d89b41116100a2578063c87b56dd11610071578063c87b56dd146104f3578063e985e9c514610523578063eb73900b14610553578063f2fde38b14610583576101da565b806395d89b4114610481578063a22cb4651461049f578063b112783c146104bb578063b88d4fde146104d7576101da565b806370a08231116100de57806370a082311461041f578063715018a61461044f5780638456cb59146104595780638da5cb5b14610463576101da565b80636352211e146103b557806366c8b52f146103e55780636c0360eb14610401576101da565b80633f4ba83a1161017c5780634e71d92d1161014b5780634e71d92d146103415780634f6ccce71461034b57806355f804b31461037b5780635c975abb14610397576101da565b80633f4ba83a146102e357806340d097c3146102ed57806342842e0e1461030957806342966c6814610325576101da565b8063095ea7b3116101b8578063095ea7b31461025d57806318160ddd1461027957806323b872dd146102975780632f745c59146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f4919061300e565b61059f565b604051610206919061353b565b60405180910390f35b6102176105b1565b6040516102249190613556565b60405180910390f35b610247600480360381019061024291906130b1565b610643565b60405161025491906134d4565b60405180910390f35b61027760048036038101906102729190612f85565b6106c8565b005b6102816107e0565b60405161028e9190613838565b60405180910390f35b6102b160048036038101906102ac9190612e6f565b6107ed565b005b6102cd60048036038101906102c89190612f85565b61084d565b6040516102da9190613838565b60405180910390f35b6102eb6108f2565b005b61030760048036038101906103029190612e02565b610978565b005b610323600480360381019061031e9190612e6f565b610a00565b005b61033f600480360381019061033a91906130b1565b610a20565b005b610349610a7c565b005b610365600480360381019061036091906130b1565b610b78565b6040516103729190613838565b60405180910390f35b61039560048036038101906103909190613068565b610be9565b005b61039f610c7f565b6040516103ac919061353b565b60405180910390f35b6103cf60048036038101906103ca91906130b1565b610c96565b6040516103dc91906134d4565b60405180910390f35b6103ff60048036038101906103fa9190612e02565b610d48565b005b610409610e78565b6040516104169190613556565b60405180910390f35b61043960048036038101906104349190612e02565b610f06565b6040516104469190613838565b60405180910390f35b610457610fbe565b005b610461611046565b005b61046b6110cc565b60405161047891906134d4565b60405180910390f35b6104896110f6565b6040516104969190613556565b60405180910390f35b6104b960048036038101906104b49190612f45565b611188565b005b6104d560048036038101906104d09190612fc5565b611309565b005b6104f160048036038101906104ec9190612ec2565b611479565b005b61050d600480360381019061050891906130b1565b6114db565b60405161051a9190613556565b60405180910390f35b61053d60048036038101906105389190612e2f565b611582565b60405161054a919061353b565b60405180910390f35b61056d60048036038101906105689190612e02565b611616565b60405161057a919061353b565b60405180910390f35b61059d60048036038101906105989190612e02565b611636565b005b60006105aa8261172e565b9050919050565b6060600080546105c090613aba565b80601f01602080910402602001604051908101604052809291908181526020018280546105ec90613aba565b80156106395780601f1061060e57610100808354040283529160200191610639565b820191906000526020600020905b81548152906001019060200180831161061c57829003601f168201915b5050505050905090565b600061064e826117a8565b61068d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068490613718565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106d382610c96565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073b90613798565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610763611814565b73ffffffffffffffffffffffffffffffffffffffff16148061079257506107918161078c611814565b611582565b5b6107d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c890613698565b60405180910390fd5b6107db838361181c565b505050565b6000600880549050905090565b6107fe6107f8611814565b826118d5565b61083d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610834906137b8565b60405180910390fd5b6108488383836119b3565b505050565b600061085883610f06565b8210610899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089090613598565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108fa611814565b73ffffffffffffffffffffffffffffffffffffffff166109186110cc565b73ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096590613738565b60405180910390fd5b610976611c0f565b565b610980611814565b73ffffffffffffffffffffffffffffffffffffffff1661099e6110cc565b73ffffffffffffffffffffffffffffffffffffffff16146109f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109eb90613738565b60405180910390fd5b6109fd81611cb1565b50565b610a1b83838360405180602001604052806000815250611479565b505050565b610a31610a2b611814565b826118d5565b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6790613818565b60405180910390fd5b610a7981611cd7565b50565b600033905060011515600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0b906137d8565b60405180910390fd5b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610b7581611cb1565b50565b6000610b826107e0565b8210610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba906137f8565b60405180910390fd5b60088281548110610bd757610bd6613c53565b5b90600052602060002001549050919050565b610bf1611814565b73ffffffffffffffffffffffffffffffffffffffff16610c0f6110cc565b73ffffffffffffffffffffffffffffffffffffffff1614610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90613738565b60405180910390fd5b80600d9080519060200190610c7b929190612b78565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d36906136d8565b60405180910390fd5b80915050919050565b610d50611814565b73ffffffffffffffffffffffffffffffffffffffff16610d6e6110cc565b73ffffffffffffffffffffffffffffffffffffffff1614610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb90613738565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e1c576001610e1f565b60005b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600d8054610e8590613aba565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb190613aba565b8015610efe5780601f10610ed357610100808354040283529160200191610efe565b820191906000526020600020905b815481529060010190602001808311610ee157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e906136b8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fc6611814565b73ffffffffffffffffffffffffffffffffffffffff16610fe46110cc565b73ffffffffffffffffffffffffffffffffffffffff161461103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103190613738565b60405180910390fd5b6110446000611de8565b565b61104e611814565b73ffffffffffffffffffffffffffffffffffffffff1661106c6110cc565b73ffffffffffffffffffffffffffffffffffffffff16146110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b990613738565b60405180910390fd5b6110ca611eae565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461110590613aba565b80601f016020809104026020016040519081016040528092919081815260200182805461113190613aba565b801561117e5780601f106111535761010080835404028352916020019161117e565b820191906000526020600020905b81548152906001019060200180831161116157829003601f168201915b5050505050905090565b611190611814565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f590613638565b60405180910390fd5b806005600061120b611814565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112b8611814565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112fd919061353b565b60405180910390a35050565b611311611814565b73ffffffffffffffffffffffffffffffffffffffff1661132f6110cc565b73ffffffffffffffffffffffffffffffffffffffff1614611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c90613738565b60405180910390fd5b60005b81518110156114755760008282815181106113a6576113a5613c53565b5b60200260200101519050600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661140857600161140b565b60005b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061146d90613b1d565b915050611388565b5050565b61148a611484611814565b836118d5565b6114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c0906137b8565b60405180910390fd5b6114d584848484611f51565b50505050565b60606114e6826117a8565b611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90613778565b60405180910390fd5b600061152f611fad565b9050600081511161154f576040518060200160405280600081525061157a565b806115598461203f565b60405160200161156a9291906134b0565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c6020528060005260406000206000915054906101000a900460ff1681565b61163e611814565b73ffffffffffffffffffffffffffffffffffffffff1661165c6110cc565b73ffffffffffffffffffffffffffffffffffffffff16146116b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a990613738565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611719906135d8565b60405180910390fd5b61172b81611de8565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117a157506117a0826121a0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661188f83610c96565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118e0826117a8565b61191f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191690613658565b60405180910390fd5b600061192a83610c96565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061199957508373ffffffffffffffffffffffffffffffffffffffff1661198184610643565b73ffffffffffffffffffffffffffffffffffffffff16145b806119aa57506119a98185611582565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119d382610c96565b73ffffffffffffffffffffffffffffffffffffffff1614611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2090613758565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9090613618565b60405180910390fd5b611aa4838383612282565b611aaf60008261181c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aff91906139d0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b569190613949565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611c17610c7f565b611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d90613578565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c9a611814565b604051611ca791906134d4565b60405180910390a1565b6000611cbd600b6122da565b9050611cc9600b6122e8565b611cd382826122fe565b5050565b6000611ce282610c96565b9050611cf081600084612282565b611cfb60008361181c565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d4b91906139d0565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611eb6610c7f565b15611ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eed90613678565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f3a611814565b604051611f4791906134d4565b60405180910390a1565b611f5c8484846119b3565b611f688484848461231c565b611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e906135b8565b60405180910390fd5b50505050565b6060600d8054611fbc90613aba565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe890613aba565b80156120355780601f1061200a57610100808354040283529160200191612035565b820191906000526020600020905b81548152906001019060200180831161201857829003601f168201915b5050505050905090565b60606000821415612087576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061219b565b600082905060005b600082146120b95780806120a290613b1d565b915050600a826120b2919061399f565b915061208f565b60008167ffffffffffffffff8111156120d5576120d4613c82565b5b6040519080825280601f01601f1916602001820160405280156121075781602001600182028036833780820191505090505b5090505b600085146121945760018261212091906139d0565b9150600a8561212f9190613b66565b603061213b9190613949565b60f81b81838151811061215157612150613c53565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561218d919061399f565b945061210b565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061226b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061227b575061227a826124b3565b5b9050919050565b61228a610c7f565b156122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c190613678565b60405180910390fd5b6122d583838361251d565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612318828260405180602001604052806000815250612631565b5050565b600061233d8473ffffffffffffffffffffffffffffffffffffffff1661268c565b156124a6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612366611814565b8786866040518563ffffffff1660e01b815260040161238894939291906134ef565b602060405180830381600087803b1580156123a257600080fd5b505af19250505080156123d357506040513d601f19601f820116820180604052508101906123d0919061303b565b60015b612456573d8060008114612403576040519150601f19603f3d011682016040523d82523d6000602084013e612408565b606091505b5060008151141561244e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612445906135b8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124ab565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61252883838361269f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561256b57612566816126a4565b6125aa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125a9576125a883826126ed565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ed576125e88161285a565b61262c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461262b5761262a828261292b565b5b5b505050565b61263b83836129aa565b612648600084848461231c565b612687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267e906135b8565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016126fa84610f06565b61270491906139d0565b90506000600760008481526020019081526020016000205490508181146127e9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061286e91906139d0565b905060006009600084815260200190815260200160002054905060006008838154811061289e5761289d613c53565b5b9060005260206000200154905080600883815481106128c0576128bf613c53565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061290f5761290e613c24565b5b6001900381819060005260206000200160009055905550505050565b600061293683610f06565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a11906136f8565b60405180910390fd5b612a23816117a8565b15612a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5a906135f8565b60405180910390fd5b612a6f60008383612282565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612abf9190613949565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612b8490613aba565b90600052602060002090601f016020900481019282612ba65760008555612bed565b82601f10612bbf57805160ff1916838001178555612bed565b82800160010185558215612bed579182015b82811115612bec578251825591602001919060010190612bd1565b5b509050612bfa9190612bfe565b5090565b5b80821115612c17576000816000905550600101612bff565b5090565b6000612c2e612c2984613878565b613853565b90508083825260208201905082856020860282011115612c5157612c50613cb6565b5b60005b85811015612c815781612c678882612d0f565b845260208401935060208301925050600181019050612c54565b5050509392505050565b6000612c9e612c99846138a4565b613853565b905082815260208101848484011115612cba57612cb9613cbb565b5b612cc5848285613a78565b509392505050565b6000612ce0612cdb846138d5565b613853565b905082815260208101848484011115612cfc57612cfb613cbb565b5b612d07848285613a78565b509392505050565b600081359050612d1e8161429b565b92915050565b600082601f830112612d3957612d38613cb1565b5b8135612d49848260208601612c1b565b91505092915050565b600081359050612d61816142b2565b92915050565b600081359050612d76816142c9565b92915050565b600081519050612d8b816142c9565b92915050565b600082601f830112612da657612da5613cb1565b5b8135612db6848260208601612c8b565b91505092915050565b600082601f830112612dd457612dd3613cb1565b5b8135612de4848260208601612ccd565b91505092915050565b600081359050612dfc816142e0565b92915050565b600060208284031215612e1857612e17613cc5565b5b6000612e2684828501612d0f565b91505092915050565b60008060408385031215612e4657612e45613cc5565b5b6000612e5485828601612d0f565b9250506020612e6585828601612d0f565b9150509250929050565b600080600060608486031215612e8857612e87613cc5565b5b6000612e9686828701612d0f565b9350506020612ea786828701612d0f565b9250506040612eb886828701612ded565b9150509250925092565b60008060008060808587031215612edc57612edb613cc5565b5b6000612eea87828801612d0f565b9450506020612efb87828801612d0f565b9350506040612f0c87828801612ded565b925050606085013567ffffffffffffffff811115612f2d57612f2c613cc0565b5b612f3987828801612d91565b91505092959194509250565b60008060408385031215612f5c57612f5b613cc5565b5b6000612f6a85828601612d0f565b9250506020612f7b85828601612d52565b9150509250929050565b60008060408385031215612f9c57612f9b613cc5565b5b6000612faa85828601612d0f565b9250506020612fbb85828601612ded565b9150509250929050565b600060208284031215612fdb57612fda613cc5565b5b600082013567ffffffffffffffff811115612ff957612ff8613cc0565b5b61300584828501612d24565b91505092915050565b60006020828403121561302457613023613cc5565b5b600061303284828501612d67565b91505092915050565b60006020828403121561305157613050613cc5565b5b600061305f84828501612d7c565b91505092915050565b60006020828403121561307e5761307d613cc5565b5b600082013567ffffffffffffffff81111561309c5761309b613cc0565b5b6130a884828501612dbf565b91505092915050565b6000602082840312156130c7576130c6613cc5565b5b60006130d584828501612ded565b91505092915050565b6130e781613a04565b82525050565b6130f681613a16565b82525050565b600061310782613906565b613111818561391c565b9350613121818560208601613a87565b61312a81613cca565b840191505092915050565b600061314082613911565b61314a818561392d565b935061315a818560208601613a87565b61316381613cca565b840191505092915050565b600061317982613911565b613183818561393e565b9350613193818560208601613a87565b80840191505092915050565b60006131ac60148361392d565b91506131b782613cdb565b602082019050919050565b60006131cf602b8361392d565b91506131da82613d04565b604082019050919050565b60006131f260328361392d565b91506131fd82613d53565b604082019050919050565b600061321560268361392d565b915061322082613da2565b604082019050919050565b6000613238601c8361392d565b915061324382613df1565b602082019050919050565b600061325b60248361392d565b915061326682613e1a565b604082019050919050565b600061327e60198361392d565b915061328982613e69565b602082019050919050565b60006132a1602c8361392d565b91506132ac82613e92565b604082019050919050565b60006132c460108361392d565b91506132cf82613ee1565b602082019050919050565b60006132e760388361392d565b91506132f282613f0a565b604082019050919050565b600061330a602a8361392d565b915061331582613f59565b604082019050919050565b600061332d60298361392d565b915061333882613fa8565b604082019050919050565b600061335060208361392d565b915061335b82613ff7565b602082019050919050565b6000613373602c8361392d565b915061337e82614020565b604082019050919050565b600061339660208361392d565b91506133a18261406f565b602082019050919050565b60006133b960298361392d565b91506133c482614098565b604082019050919050565b60006133dc602f8361392d565b91506133e7826140e7565b604082019050919050565b60006133ff60218361392d565b915061340a82614136565b604082019050919050565b600061342260318361392d565b915061342d82614185565b604082019050919050565b600061344560208361392d565b9150613450826141d4565b602082019050919050565b6000613468602c8361392d565b9150613473826141fd565b604082019050919050565b600061348b60308361392d565b91506134968261424c565b604082019050919050565b6134aa81613a6e565b82525050565b60006134bc828561316e565b91506134c8828461316e565b91508190509392505050565b60006020820190506134e960008301846130de565b92915050565b600060808201905061350460008301876130de565b61351160208301866130de565b61351e60408301856134a1565b818103606083015261353081846130fc565b905095945050505050565b600060208201905061355060008301846130ed565b92915050565b600060208201905081810360008301526135708184613135565b905092915050565b600060208201905081810360008301526135918161319f565b9050919050565b600060208201905081810360008301526135b1816131c2565b9050919050565b600060208201905081810360008301526135d1816131e5565b9050919050565b600060208201905081810360008301526135f181613208565b9050919050565b600060208201905081810360008301526136118161322b565b9050919050565b600060208201905081810360008301526136318161324e565b9050919050565b6000602082019050818103600083015261365181613271565b9050919050565b6000602082019050818103600083015261367181613294565b9050919050565b60006020820190508181036000830152613691816132b7565b9050919050565b600060208201905081810360008301526136b1816132da565b9050919050565b600060208201905081810360008301526136d1816132fd565b9050919050565b600060208201905081810360008301526136f181613320565b9050919050565b6000602082019050818103600083015261371181613343565b9050919050565b6000602082019050818103600083015261373181613366565b9050919050565b6000602082019050818103600083015261375181613389565b9050919050565b60006020820190508181036000830152613771816133ac565b9050919050565b60006020820190508181036000830152613791816133cf565b9050919050565b600060208201905081810360008301526137b1816133f2565b9050919050565b600060208201905081810360008301526137d181613415565b9050919050565b600060208201905081810360008301526137f181613438565b9050919050565b600060208201905081810360008301526138118161345b565b9050919050565b600060208201905081810360008301526138318161347e565b9050919050565b600060208201905061384d60008301846134a1565b92915050565b600061385d61386e565b90506138698282613aec565b919050565b6000604051905090565b600067ffffffffffffffff82111561389357613892613c82565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156138bf576138be613c82565b5b6138c882613cca565b9050602081019050919050565b600067ffffffffffffffff8211156138f0576138ef613c82565b5b6138f982613cca565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061395482613a6e565b915061395f83613a6e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561399457613993613b97565b5b828201905092915050565b60006139aa82613a6e565b91506139b583613a6e565b9250826139c5576139c4613bc6565b5b828204905092915050565b60006139db82613a6e565b91506139e683613a6e565b9250828210156139f9576139f8613b97565b5b828203905092915050565b6000613a0f82613a4e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613aa5578082015181840152602081019050613a8a565b83811115613ab4576000848401525b50505050565b60006002820490506001821680613ad257607f821691505b60208210811415613ae657613ae5613bf5565b5b50919050565b613af582613cca565b810181811067ffffffffffffffff82111715613b1457613b13613c82565b5b80604052505050565b6000613b2882613a6e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b5b57613b5a613b97565b5b600182019050919050565b6000613b7182613a6e565b9150613b7c83613a6e565b925082613b8c57613b8b613bc6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f796f7520617265206e6f742077686974656c697374656420746f20636c61696d600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6142a481613a04565b81146142af57600080fd5b50565b6142bb81613a16565b81146142c657600080fd5b50565b6142d281613a22565b81146142dd57600080fd5b50565b6142e981613a6e565b81146142f457600080fd5b5056fea26469706673582212209ac5918abbe91a3d890b20fd93c30303bcd611b12ca7a944a488c6cede225aac64736f6c63430008070033
Deployed Bytecode Sourcemap
47497:2102:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49384:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21497:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23056:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22579:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35244:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23946:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34912:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48516:65;;;:::i;:::-;;48773:82;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24356:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45753:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48863:206;;;:::i;:::-;;35434:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47848:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41828:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21191:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48066:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47818:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20921:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44665:94;;;:::i;:::-;;48447:61;;;:::i;:::-;;44014:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21666:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23349:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48194:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24612:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21841:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23715:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47770:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44914:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49384:212;49523:4;49552:36;49576:11;49552:23;:36::i;:::-;49545:43;;49384:212;;;:::o;21497:100::-;21551:13;21584:5;21577:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21497:100;:::o;23056:221::-;23132:7;23160:16;23168:7;23160;:16::i;:::-;23152:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23245:15;:24;23261:7;23245:24;;;;;;;;;;;;;;;;;;;;;23238:31;;23056:221;;;:::o;22579:411::-;22660:13;22676:23;22691:7;22676:14;:23::i;:::-;22660:39;;22724:5;22718:11;;:2;:11;;;;22710:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22818:5;22802:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22827:37;22844:5;22851:12;:10;:12::i;:::-;22827:16;:37::i;:::-;22802:62;22780:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22961:21;22970:2;22974:7;22961:8;:21::i;:::-;22649:341;22579:411;;:::o;35244:113::-;35305:7;35332:10;:17;;;;35325:24;;35244:113;:::o;23946:339::-;24141:41;24160:12;:10;:12::i;:::-;24174:7;24141:18;:41::i;:::-;24133:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24249:28;24259:4;24265:2;24269:7;24249:9;:28::i;:::-;23946:339;;;:::o;34912:256::-;35009:7;35045:23;35062:5;35045:16;:23::i;:::-;35037:5;:31;35029:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35134:12;:19;35147:5;35134:19;;;;;;;;;;;;;;;:26;35154:5;35134:26;;;;;;;;;;;;35127:33;;34912:256;;;;:::o;48516:65::-;44245:12;:10;:12::i;:::-;44234:23;;:7;:5;:7::i;:::-;:23;;;44226:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48563:10:::1;:8;:10::i;:::-;48516:65::o:0;48773:82::-;44245:12;:10;:12::i;:::-;44234:23;;:7;:5;:7::i;:::-;:23;;;44226:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48831:16:::1;48844:2;48831:12;:16::i;:::-;48773:82:::0;:::o;24356:185::-;24494:39;24511:4;24517:2;24521:7;24494:39;;;;;;;;;;;;:16;:39::i;:::-;24356:185;;;:::o;45753:245::-;45871:41;45890:12;:10;:12::i;:::-;45904:7;45871:18;:41::i;:::-;45863:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;45976:14;45982:7;45976:5;:14::i;:::-;45753:245;:::o;48863:206::-;48898:11;48912:10;48898:24;;48959:4;48941:22;;:9;:14;48951:3;48941:14;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;48933:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;49028:5;49011:9;:14;49021:3;49011:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;49044:17;49057:3;49044:12;:17::i;:::-;48887:182;48863:206::o;35434:233::-;35509:7;35545:30;:28;:30::i;:::-;35537:5;:38;35529:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35642:10;35653:5;35642:17;;;;;;;;:::i;:::-;;;;;;;;;;35635:24;;35434:233;;;:::o;47848:102::-;44245:12;:10;:12::i;:::-;44234:23;;:7;:5;:7::i;:::-;:23;;;44226:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47932:10:::1;47922:7;:20;;;;;;;;;;;;:::i;:::-;;47848:102:::0;:::o;41828:86::-;41875:4;41899:7;;;;;;;;;;;41892:14;;41828:86;:::o;21191:239::-;21263:7;21283:13;21299:7;:16;21307:7;21299:16;;;;;;;;;;;;;;;;;;;;;21283:32;;21351:1;21334:19;;:5;:19;;;;21326:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21417:5;21410:12;;;21191:239;;;:::o;48066:120::-;44245:12;:10;:12::i;:::-;44234:23;;:7;:5;:7::i;:::-;:23;;;44226:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48149:9:::1;:14;48159:3;48149:14;;;;;;;;;;;;;;;;;;;;;;;;;:29;;48174:4;48149:29;;;48166:5;48149:29;48132:9;:14;48142:3;48132:14;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48066:120:::0;:::o;47818:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20921:208::-;20993:7;21038:1;21021:19;;:5;:19;;;;21013:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21105:9;:16;21115:5;21105:16;;;;;;;;;;;;;;;;21098:23;;20921:208;;;:::o;44665:94::-;44245:12;:10;:12::i;:::-;44234:23;;:7;:5;:7::i;:::-;:23;;;44226:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44730:21:::1;44748:1;44730:9;:21::i;:::-;44665:94::o:0;48447:61::-;44245:12;:10;:12::i;:::-;44234:23;;:7;:5;:7::i;:::-;:23;;;44226:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48492:8:::1;:6;:8::i;:::-;48447:61::o:0;44014:87::-;44060:7;44087:6;;;;;;;;;;;44080:13;;44014:87;:::o;21666:104::-;21722:13;21755:7;21748:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21666:104;:::o;23349:295::-;23464:12;:10;:12::i;:::-;23452:24;;:8;:24;;;;23444:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23564:8;23519:18;:32;23538:12;:10;:12::i;:::-;23519:32;;;;;;;;;;;;;;;:42;23552:8;23519:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23617:8;23588:48;;23603:12;:10;:12::i;:::-;23588:48;;;23627:8;23588:48;;;;;;:::i;:::-;;;;;;;;23349:295;;:::o;48194:245::-;44245:12;:10;:12::i;:::-;44234:23;;:7;:5;:7::i;:::-;:23;;;44226:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48280:9:::1;48275:157;48295:9;:16;48291:1;:20;48275:157;;;48333:11;48347:9;48357:1;48347:12;;;;;;;;:::i;:::-;;;;;;;;48333:26;;48391:9;:14;48401:3;48391:14;;;;;;;;;;;;;;;;;;;;;;;;;:29;;48416:4;48391:29;;;48408:5;48391:29;48374:9;:14;48384:3;48374:14;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48318:114;48313:3;;;;;:::i;:::-;;;;48275:157;;;;48194:245:::0;:::o;24612:328::-;24787:41;24806:12;:10;:12::i;:::-;24820:7;24787:18;:41::i;:::-;24779:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24893:39;24907:4;24913:2;24917:7;24926:5;24893:13;:39::i;:::-;24612:328;;;;:::o;21841:334::-;21914:13;21948:16;21956:7;21948;:16::i;:::-;21940:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22029:21;22053:10;:8;:10::i;:::-;22029:34;;22105:1;22087:7;22081:21;:25;:86;;;;;;;;;;;;;;;;;22133:7;22142:18;:7;:16;:18::i;:::-;22116:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22081:86;22074:93;;;21841:334;;;:::o;23715:164::-;23812:4;23836:18;:25;23855:5;23836:25;;;;;;;;;;;;;;;:35;23862:8;23836:35;;;;;;;;;;;;;;;;;;;;;;;;;23829:42;;23715:164;;;;:::o;47770:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;44914:192::-;44245:12;:10;:12::i;:::-;44234:23;;:7;:5;:7::i;:::-;:23;;;44226:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45023:1:::1;45003:22;;:8;:22;;;;44995:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45079:19;45089:8;45079:9;:19::i;:::-;44914:192:::0;:::o;34604:224::-;34706:4;34745:35;34730:50;;;:11;:50;;;;:90;;;;34784:36;34808:11;34784:23;:36::i;:::-;34730:90;34723:97;;34604:224;;;:::o;26450:127::-;26515:4;26567:1;26539:30;;:7;:16;26547:7;26539:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26532:37;;26450:127;;;:::o;15966:98::-;16019:7;16046:10;16039:17;;15966:98;:::o;30432:174::-;30534:2;30507:15;:24;30523:7;30507:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30590:7;30586:2;30552:46;;30561:23;30576:7;30561:14;:23::i;:::-;30552:46;;;;;;;;;;;;30432:174;;:::o;26744:348::-;26837:4;26862:16;26870:7;26862;:16::i;:::-;26854:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26938:13;26954:23;26969:7;26954:14;:23::i;:::-;26938:39;;27007:5;26996:16;;:7;:16;;;:51;;;;27040:7;27016:31;;:20;27028:7;27016:11;:20::i;:::-;:31;;;26996:51;:87;;;;27051:32;27068:5;27075:7;27051:16;:32::i;:::-;26996:87;26988:96;;;26744:348;;;;:::o;29736:578::-;29895:4;29868:31;;:23;29883:7;29868:14;:23::i;:::-;:31;;;29860:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29978:1;29964:16;;:2;:16;;;;29956:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30034:39;30055:4;30061:2;30065:7;30034:20;:39::i;:::-;30138:29;30155:1;30159:7;30138:8;:29::i;:::-;30199:1;30180:9;:15;30190:4;30180:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30228:1;30211:9;:13;30221:2;30211:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30259:2;30240:7;:16;30248:7;30240:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30298:7;30294:2;30279:27;;30288:4;30279:27;;;;;;;;;;;;29736:578;;;:::o;42887:120::-;42431:8;:6;:8::i;:::-;42423:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;42956:5:::1;42946:7;;:15;;;;;;;;;;;;;;;;;;42977:22;42986:12;:10;:12::i;:::-;42977:22;;;;;;:::i;:::-;;;;;;;;42887:120::o:0;48589:176::-;48643:15;48661:25;:15;:23;:25::i;:::-;48643:43;;48697:27;:15;:25;:27::i;:::-;48735:22;48745:2;48749:7;48735:9;:22::i;:::-;48632:133;48589:176;:::o;29039:360::-;29099:13;29115:23;29130:7;29115:14;:23::i;:::-;29099:39;;29151:48;29172:5;29187:1;29191:7;29151:20;:48::i;:::-;29240:29;29257:1;29261:7;29240:8;:29::i;:::-;29302:1;29282:9;:16;29292:5;29282:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;29321:7;:16;29329:7;29321:16;;;;;;;;;;;;29314:23;;;;;;;;;;;29383:7;29379:1;29355:36;;29364:5;29355:36;;;;;;;;;;;;29088:311;29039:360;:::o;45114:173::-;45170:16;45189:6;;;;;;;;;;;45170:25;;45215:8;45206:6;;:17;;;;;;;;;;;;;;;;;;45270:8;45239:40;;45260:8;45239:40;;;;;;;;;;;;45159:128;45114:173;:::o;42628:118::-;42154:8;:6;:8::i;:::-;42153:9;42145:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;42698:4:::1;42688:7;;:14;;;;;;;;;;;;;;;;;;42718:20;42725:12;:10;:12::i;:::-;42718:20;;;;;;:::i;:::-;;;;;;;;42628:118::o:0;25822:315::-;25979:28;25989:4;25995:2;25999:7;25979:9;:28::i;:::-;26026:48;26049:4;26055:2;26059:7;26068:5;26026:22;:48::i;:::-;26018:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25822:315;;;;:::o;47958:100::-;48010:13;48043:7;48036:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47958:100;:::o;16495:723::-;16551:13;16781:1;16772:5;:10;16768:53;;;16799:10;;;;;;;;;;;;;;;;;;;;;16768:53;16831:12;16846:5;16831:20;;16862:14;16887:78;16902:1;16894:4;:9;16887:78;;16920:8;;;;;:::i;:::-;;;;16951:2;16943:10;;;;;:::i;:::-;;;16887:78;;;16975:19;17007:6;16997:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16975:39;;17025:154;17041:1;17032:5;:10;17025:154;;17069:1;17059:11;;;;;:::i;:::-;;;17136:2;17128:5;:10;;;;:::i;:::-;17115:2;:24;;;;:::i;:::-;17102:39;;17085:6;17092;17085:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17165:2;17156:11;;;;;:::i;:::-;;;17025:154;;;17203:6;17189:21;;;;;16495:723;;;;:::o;20552:305::-;20654:4;20706:25;20691:40;;;:11;:40;;;;:105;;;;20763:33;20748:48;;;:11;:48;;;;20691:105;:158;;;;20813:36;20837:11;20813:23;:36::i;:::-;20691:158;20671:178;;20552:305;;;:::o;49077:229::-;42154:8;:6;:8::i;:::-;42153:9;42145:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;49253:45:::1;49280:4;49286:2;49290:7;49253:26;:45::i;:::-;49077:229:::0;;;:::o;46826:114::-;46891:7;46918;:14;;;46911:21;;46826:114;;;:::o;46948:127::-;47055:1;47037:7;:14;;;:19;;;;;;;;;;;46948:127;:::o;27434:110::-;27510:26;27520:2;27524:7;27510:26;;;;;;;;;;;;:9;:26::i;:::-;27434:110;;:::o;31171:803::-;31326:4;31347:15;:2;:13;;;:15::i;:::-;31343:624;;;31399:2;31383:36;;;31420:12;:10;:12::i;:::-;31434:4;31440:7;31449:5;31383:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31379:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31646:1;31629:6;:13;:18;31625:272;;;31672:60;;;;;;;;;;:::i;:::-;;;;;;;;31625:272;31847:6;31841:13;31832:6;31828:2;31824:15;31817:38;31379:533;31516:45;;;31506:55;;;:6;:55;;;;31499:62;;;;;31343:624;31951:4;31944:11;;31171:803;;;;;;;:::o;19054:157::-;19139:4;19178:25;19163:40;;;:11;:40;;;;19156:47;;19054:157;;;:::o;36280:589::-;36424:45;36451:4;36457:2;36461:7;36424:26;:45::i;:::-;36502:1;36486:18;;:4;:18;;;36482:187;;;36521:40;36553:7;36521:31;:40::i;:::-;36482:187;;;36591:2;36583:10;;:4;:10;;;36579:90;;36610:47;36643:4;36649:7;36610:32;:47::i;:::-;36579:90;36482:187;36697:1;36683:16;;:2;:16;;;36679:183;;;36716:45;36753:7;36716:36;:45::i;:::-;36679:183;;;36789:4;36783:10;;:2;:10;;;36779:83;;36810:40;36838:2;36842:7;36810:27;:40::i;:::-;36779:83;36679:183;36280:589;;;:::o;27771:321::-;27901:18;27907:2;27911:7;27901:5;:18::i;:::-;27952:54;27983:1;27987:2;27991:7;28000:5;27952:22;:54::i;:::-;27930:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27771:321;;;:::o;8224:387::-;8284:4;8492:12;8559:7;8547:20;8539:28;;8602:1;8595:4;:8;8588:15;;;8224:387;;;:::o;32546:126::-;;;;:::o;37592:164::-;37696:10;:17;;;;37669:15;:24;37685:7;37669:24;;;;;;;;;;;:44;;;;37724:10;37740:7;37724:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37592:164;:::o;38383:988::-;38649:22;38699:1;38674:22;38691:4;38674:16;:22::i;:::-;:26;;;;:::i;:::-;38649:51;;38711:18;38732:17;:26;38750:7;38732:26;;;;;;;;;;;;38711:47;;38879:14;38865:10;:28;38861:328;;38910:19;38932:12;:18;38945:4;38932:18;;;;;;;;;;;;;;;:34;38951:14;38932:34;;;;;;;;;;;;38910:56;;39016:11;38983:12;:18;38996:4;38983:18;;;;;;;;;;;;;;;:30;39002:10;38983:30;;;;;;;;;;;:44;;;;39133:10;39100:17;:30;39118:11;39100:30;;;;;;;;;;;:43;;;;38895:294;38861:328;39285:17;:26;39303:7;39285:26;;;;;;;;;;;39278:33;;;39329:12;:18;39342:4;39329:18;;;;;;;;;;;;;;;:34;39348:14;39329:34;;;;;;;;;;;39322:41;;;38464:907;;38383:988;;:::o;39666:1079::-;39919:22;39964:1;39944:10;:17;;;;:21;;;;:::i;:::-;39919:46;;39976:18;39997:15;:24;40013:7;39997:24;;;;;;;;;;;;39976:45;;40348:19;40370:10;40381:14;40370:26;;;;;;;;:::i;:::-;;;;;;;;;;40348:48;;40434:11;40409:10;40420;40409:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40545:10;40514:15;:28;40530:11;40514:28;;;;;;;;;;;:41;;;;40686:15;:24;40702:7;40686:24;;;;;;;;;;;40679:31;;;40721:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39737:1008;;;39666:1079;:::o;37170:221::-;37255:14;37272:20;37289:2;37272:16;:20::i;:::-;37255:37;;37330:7;37303:12;:16;37316:2;37303:16;;;;;;;;;;;;;;;:24;37320:6;37303:24;;;;;;;;;;;:34;;;;37377:6;37348:17;:26;37366:7;37348:26;;;;;;;;;;;:35;;;;37244:147;37170:221;;:::o;28428:382::-;28522:1;28508:16;;:2;:16;;;;28500:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28581:16;28589:7;28581;:16::i;:::-;28580:17;28572:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28643:45;28672:1;28676:2;28680:7;28643:20;:45::i;:::-;28718:1;28701:9;:13;28711:2;28701:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28749:2;28730:7;:16;28738:7;28730:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28794:7;28790:2;28769:33;;28786:1;28769:33;;;;;;;;;;;;28428:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6758:539;;;;:::o;7303:327::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:119;;;7416:79;;:::i;:::-;7378:119;7536:1;7561:52;7605:7;7596:6;7585:9;7581:22;7561:52;:::i;:::-;7551:62;;7507:116;7303:327;;;;:::o;7636:349::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:119;;;7760:79;;:::i;:::-;7722:119;7880:1;7905:63;7960:7;7951:6;7940:9;7936:22;7905:63;:::i;:::-;7895:73;;7851:127;7636:349;;;;:::o;7991:509::-;8060:6;8109:2;8097:9;8088:7;8084:23;8080:32;8077:119;;;8115:79;;:::i;:::-;8077:119;8263:1;8252:9;8248:17;8235:31;8293:18;8285:6;8282:30;8279:117;;;8315:79;;:::i;:::-;8279:117;8420:63;8475:7;8466:6;8455:9;8451:22;8420:63;:::i;:::-;8410:73;;8206:287;7991:509;;;;:::o;8506:329::-;8565:6;8614:2;8602:9;8593:7;8589:23;8585:32;8582:119;;;8620:79;;:::i;:::-;8582:119;8740:1;8765:53;8810:7;8801:6;8790:9;8786:22;8765:53;:::i;:::-;8755:63;;8711:117;8506:329;;;;:::o;8841:118::-;8928:24;8946:5;8928:24;:::i;:::-;8923:3;8916:37;8841:118;;:::o;8965:109::-;9046:21;9061:5;9046:21;:::i;:::-;9041:3;9034:34;8965:109;;:::o;9080:360::-;9166:3;9194:38;9226:5;9194:38;:::i;:::-;9248:70;9311:6;9306:3;9248:70;:::i;:::-;9241:77;;9327:52;9372:6;9367:3;9360:4;9353:5;9349:16;9327:52;:::i;:::-;9404:29;9426:6;9404:29;:::i;:::-;9399:3;9395:39;9388:46;;9170:270;9080:360;;;;:::o;9446:364::-;9534:3;9562:39;9595:5;9562:39;:::i;:::-;9617:71;9681:6;9676:3;9617:71;:::i;:::-;9610:78;;9697:52;9742:6;9737:3;9730:4;9723:5;9719:16;9697:52;:::i;:::-;9774:29;9796:6;9774:29;:::i;:::-;9769:3;9765:39;9758:46;;9538:272;9446:364;;;;:::o;9816:377::-;9922:3;9950:39;9983:5;9950:39;:::i;:::-;10005:89;10087:6;10082:3;10005:89;:::i;:::-;9998:96;;10103:52;10148:6;10143:3;10136:4;10129:5;10125:16;10103:52;:::i;:::-;10180:6;10175:3;10171:16;10164:23;;9926:267;9816:377;;;;:::o;10199:366::-;10341:3;10362:67;10426:2;10421:3;10362:67;:::i;:::-;10355:74;;10438:93;10527:3;10438:93;:::i;:::-;10556:2;10551:3;10547:12;10540:19;;10199:366;;;:::o;10571:::-;10713:3;10734:67;10798:2;10793:3;10734:67;:::i;:::-;10727:74;;10810:93;10899:3;10810:93;:::i;:::-;10928:2;10923:3;10919:12;10912:19;;10571:366;;;:::o;10943:::-;11085:3;11106:67;11170:2;11165:3;11106:67;:::i;:::-;11099:74;;11182:93;11271:3;11182:93;:::i;:::-;11300:2;11295:3;11291:12;11284:19;;10943:366;;;:::o;11315:::-;11457:3;11478:67;11542:2;11537:3;11478:67;:::i;:::-;11471:74;;11554:93;11643:3;11554:93;:::i;:::-;11672:2;11667:3;11663:12;11656:19;;11315:366;;;:::o;11687:::-;11829:3;11850:67;11914:2;11909:3;11850:67;:::i;:::-;11843:74;;11926:93;12015:3;11926:93;:::i;:::-;12044:2;12039:3;12035:12;12028:19;;11687:366;;;:::o;12059:::-;12201:3;12222:67;12286:2;12281:3;12222:67;:::i;:::-;12215:74;;12298:93;12387:3;12298:93;:::i;:::-;12416:2;12411:3;12407:12;12400:19;;12059:366;;;:::o;12431:::-;12573:3;12594:67;12658:2;12653:3;12594:67;:::i;:::-;12587:74;;12670:93;12759:3;12670:93;:::i;:::-;12788:2;12783:3;12779:12;12772:19;;12431:366;;;:::o;12803:::-;12945:3;12966:67;13030:2;13025:3;12966:67;:::i;:::-;12959:74;;13042:93;13131:3;13042:93;:::i;:::-;13160:2;13155:3;13151:12;13144:19;;12803:366;;;:::o;13175:::-;13317:3;13338:67;13402:2;13397:3;13338:67;:::i;:::-;13331:74;;13414:93;13503:3;13414:93;:::i;:::-;13532:2;13527:3;13523:12;13516:19;;13175:366;;;:::o;13547:::-;13689:3;13710:67;13774:2;13769:3;13710:67;:::i;:::-;13703:74;;13786:93;13875:3;13786:93;:::i;:::-;13904:2;13899:3;13895:12;13888:19;;13547:366;;;:::o;13919:::-;14061:3;14082:67;14146:2;14141:3;14082:67;:::i;:::-;14075:74;;14158:93;14247:3;14158:93;:::i;:::-;14276:2;14271:3;14267:12;14260:19;;13919:366;;;:::o;14291:::-;14433:3;14454:67;14518:2;14513:3;14454:67;:::i;:::-;14447:74;;14530:93;14619:3;14530:93;:::i;:::-;14648:2;14643:3;14639:12;14632:19;;14291:366;;;:::o;14663:::-;14805:3;14826:67;14890:2;14885:3;14826:67;:::i;:::-;14819:74;;14902:93;14991:3;14902:93;:::i;:::-;15020:2;15015:3;15011:12;15004:19;;14663:366;;;:::o;15035:::-;15177:3;15198:67;15262:2;15257:3;15198:67;:::i;:::-;15191:74;;15274:93;15363:3;15274:93;:::i;:::-;15392:2;15387:3;15383:12;15376:19;;15035:366;;;:::o;15407:::-;15549:3;15570:67;15634:2;15629:3;15570:67;:::i;:::-;15563:74;;15646:93;15735:3;15646:93;:::i;:::-;15764:2;15759:3;15755:12;15748:19;;15407:366;;;:::o;15779:::-;15921:3;15942:67;16006:2;16001:3;15942:67;:::i;:::-;15935:74;;16018:93;16107:3;16018:93;:::i;:::-;16136:2;16131:3;16127:12;16120:19;;15779:366;;;:::o;16151:::-;16293:3;16314:67;16378:2;16373:3;16314:67;:::i;:::-;16307:74;;16390:93;16479:3;16390:93;:::i;:::-;16508:2;16503:3;16499:12;16492:19;;16151:366;;;:::o;16523:::-;16665:3;16686:67;16750:2;16745:3;16686:67;:::i;:::-;16679:74;;16762:93;16851:3;16762:93;:::i;:::-;16880:2;16875:3;16871:12;16864:19;;16523:366;;;:::o;16895:::-;17037:3;17058:67;17122:2;17117:3;17058:67;:::i;:::-;17051:74;;17134:93;17223:3;17134:93;:::i;:::-;17252:2;17247:3;17243:12;17236:19;;16895:366;;;:::o;17267:::-;17409:3;17430:67;17494:2;17489:3;17430:67;:::i;:::-;17423:74;;17506:93;17595:3;17506:93;:::i;:::-;17624:2;17619:3;17615:12;17608:19;;17267:366;;;:::o;17639:::-;17781:3;17802:67;17866:2;17861:3;17802:67;:::i;:::-;17795:74;;17878:93;17967:3;17878:93;:::i;:::-;17996:2;17991:3;17987:12;17980:19;;17639:366;;;:::o;18011:::-;18153:3;18174:67;18238:2;18233:3;18174:67;:::i;:::-;18167:74;;18250:93;18339:3;18250:93;:::i;:::-;18368:2;18363:3;18359:12;18352:19;;18011:366;;;:::o;18383:118::-;18470:24;18488:5;18470:24;:::i;:::-;18465:3;18458:37;18383:118;;:::o;18507:435::-;18687:3;18709:95;18800:3;18791:6;18709:95;:::i;:::-;18702:102;;18821:95;18912:3;18903:6;18821:95;:::i;:::-;18814:102;;18933:3;18926:10;;18507:435;;;;;:::o;18948:222::-;19041:4;19079:2;19068:9;19064:18;19056:26;;19092:71;19160:1;19149:9;19145:17;19136:6;19092:71;:::i;:::-;18948:222;;;;:::o;19176:640::-;19371:4;19409:3;19398:9;19394:19;19386:27;;19423:71;19491:1;19480:9;19476:17;19467:6;19423:71;:::i;:::-;19504:72;19572:2;19561:9;19557:18;19548:6;19504:72;:::i;:::-;19586;19654:2;19643:9;19639:18;19630:6;19586:72;:::i;:::-;19705:9;19699:4;19695:20;19690:2;19679:9;19675:18;19668:48;19733:76;19804:4;19795:6;19733:76;:::i;:::-;19725:84;;19176:640;;;;;;;:::o;19822:210::-;19909:4;19947:2;19936:9;19932:18;19924:26;;19960:65;20022:1;20011:9;20007:17;19998:6;19960:65;:::i;:::-;19822:210;;;;:::o;20038:313::-;20151:4;20189:2;20178:9;20174:18;20166:26;;20238:9;20232:4;20228:20;20224:1;20213:9;20209:17;20202:47;20266:78;20339:4;20330:6;20266:78;:::i;:::-;20258:86;;20038:313;;;;:::o;20357:419::-;20523:4;20561:2;20550:9;20546:18;20538:26;;20610:9;20604:4;20600:20;20596:1;20585:9;20581:17;20574:47;20638:131;20764:4;20638:131;:::i;:::-;20630:139;;20357:419;;;:::o;20782:::-;20948:4;20986:2;20975:9;20971:18;20963:26;;21035:9;21029:4;21025:20;21021:1;21010:9;21006:17;20999:47;21063:131;21189:4;21063:131;:::i;:::-;21055:139;;20782:419;;;:::o;21207:::-;21373:4;21411:2;21400:9;21396:18;21388:26;;21460:9;21454:4;21450:20;21446:1;21435:9;21431:17;21424:47;21488:131;21614:4;21488:131;:::i;:::-;21480:139;;21207:419;;;:::o;21632:::-;21798:4;21836:2;21825:9;21821:18;21813:26;;21885:9;21879:4;21875:20;21871:1;21860:9;21856:17;21849:47;21913:131;22039:4;21913:131;:::i;:::-;21905:139;;21632:419;;;:::o;22057:::-;22223:4;22261:2;22250:9;22246:18;22238:26;;22310:9;22304:4;22300:20;22296:1;22285:9;22281:17;22274:47;22338:131;22464:4;22338:131;:::i;:::-;22330:139;;22057:419;;;:::o;22482:::-;22648:4;22686:2;22675:9;22671:18;22663:26;;22735:9;22729:4;22725:20;22721:1;22710:9;22706:17;22699:47;22763:131;22889:4;22763:131;:::i;:::-;22755:139;;22482:419;;;:::o;22907:::-;23073:4;23111:2;23100:9;23096:18;23088:26;;23160:9;23154:4;23150:20;23146:1;23135:9;23131:17;23124:47;23188:131;23314:4;23188:131;:::i;:::-;23180:139;;22907:419;;;:::o;23332:::-;23498:4;23536:2;23525:9;23521:18;23513:26;;23585:9;23579:4;23575:20;23571:1;23560:9;23556:17;23549:47;23613:131;23739:4;23613:131;:::i;:::-;23605:139;;23332:419;;;:::o;23757:::-;23923:4;23961:2;23950:9;23946:18;23938:26;;24010:9;24004:4;24000:20;23996:1;23985:9;23981:17;23974:47;24038:131;24164:4;24038:131;:::i;:::-;24030:139;;23757:419;;;:::o;24182:::-;24348:4;24386:2;24375:9;24371:18;24363:26;;24435:9;24429:4;24425:20;24421:1;24410:9;24406:17;24399:47;24463:131;24589:4;24463:131;:::i;:::-;24455:139;;24182:419;;;:::o;24607:::-;24773:4;24811:2;24800:9;24796:18;24788:26;;24860:9;24854:4;24850:20;24846:1;24835:9;24831:17;24824:47;24888:131;25014:4;24888:131;:::i;:::-;24880:139;;24607:419;;;:::o;25032:::-;25198:4;25236:2;25225:9;25221:18;25213:26;;25285:9;25279:4;25275:20;25271:1;25260:9;25256:17;25249:47;25313:131;25439:4;25313:131;:::i;:::-;25305:139;;25032:419;;;:::o;25457:::-;25623:4;25661:2;25650:9;25646:18;25638:26;;25710:9;25704:4;25700:20;25696:1;25685:9;25681:17;25674:47;25738:131;25864:4;25738:131;:::i;:::-;25730:139;;25457:419;;;:::o;25882:::-;26048:4;26086:2;26075:9;26071:18;26063:26;;26135:9;26129:4;26125:20;26121:1;26110:9;26106:17;26099:47;26163:131;26289:4;26163:131;:::i;:::-;26155:139;;25882:419;;;:::o;26307:::-;26473:4;26511:2;26500:9;26496:18;26488:26;;26560:9;26554:4;26550:20;26546:1;26535:9;26531:17;26524:47;26588:131;26714:4;26588:131;:::i;:::-;26580:139;;26307:419;;;:::o;26732:::-;26898:4;26936:2;26925:9;26921:18;26913:26;;26985:9;26979:4;26975:20;26971:1;26960:9;26956:17;26949:47;27013:131;27139:4;27013:131;:::i;:::-;27005:139;;26732:419;;;:::o;27157:::-;27323:4;27361:2;27350:9;27346:18;27338:26;;27410:9;27404:4;27400:20;27396:1;27385:9;27381:17;27374:47;27438:131;27564:4;27438:131;:::i;:::-;27430:139;;27157:419;;;:::o;27582:::-;27748:4;27786:2;27775:9;27771:18;27763:26;;27835:9;27829:4;27825:20;27821:1;27810:9;27806:17;27799:47;27863:131;27989:4;27863:131;:::i;:::-;27855:139;;27582:419;;;:::o;28007:::-;28173:4;28211:2;28200:9;28196:18;28188:26;;28260:9;28254:4;28250:20;28246:1;28235:9;28231:17;28224:47;28288:131;28414:4;28288:131;:::i;:::-;28280:139;;28007:419;;;:::o;28432:::-;28598:4;28636:2;28625:9;28621:18;28613:26;;28685:9;28679:4;28675:20;28671:1;28660:9;28656:17;28649:47;28713:131;28839:4;28713:131;:::i;:::-;28705:139;;28432:419;;;:::o;28857:::-;29023:4;29061:2;29050:9;29046:18;29038:26;;29110:9;29104:4;29100:20;29096:1;29085:9;29081:17;29074:47;29138:131;29264:4;29138:131;:::i;:::-;29130:139;;28857:419;;;:::o;29282:::-;29448:4;29486:2;29475:9;29471:18;29463:26;;29535:9;29529:4;29525:20;29521:1;29510:9;29506:17;29499:47;29563:131;29689:4;29563:131;:::i;:::-;29555:139;;29282:419;;;:::o;29707:222::-;29800:4;29838:2;29827:9;29823:18;29815:26;;29851:71;29919:1;29908:9;29904:17;29895:6;29851:71;:::i;:::-;29707:222;;;;:::o;29935:129::-;29969:6;29996:20;;:::i;:::-;29986:30;;30025:33;30053:4;30045:6;30025:33;:::i;:::-;29935:129;;;:::o;30070:75::-;30103:6;30136:2;30130:9;30120:19;;30070:75;:::o;30151:311::-;30228:4;30318:18;30310:6;30307:30;30304:56;;;30340:18;;:::i;:::-;30304:56;30390:4;30382:6;30378:17;30370:25;;30450:4;30444;30440:15;30432:23;;30151:311;;;:::o;30468:307::-;30529:4;30619:18;30611:6;30608:30;30605:56;;;30641:18;;:::i;:::-;30605:56;30679:29;30701:6;30679:29;:::i;:::-;30671:37;;30763:4;30757;30753:15;30745:23;;30468:307;;;:::o;30781:308::-;30843:4;30933:18;30925:6;30922:30;30919:56;;;30955:18;;:::i;:::-;30919:56;30993:29;31015:6;30993:29;:::i;:::-;30985:37;;31077:4;31071;31067:15;31059:23;;30781:308;;;:::o;31095:98::-;31146:6;31180:5;31174:12;31164:22;;31095:98;;;:::o;31199:99::-;31251:6;31285:5;31279:12;31269:22;;31199:99;;;:::o;31304:168::-;31387:11;31421:6;31416:3;31409:19;31461:4;31456:3;31452:14;31437:29;;31304:168;;;;:::o;31478:169::-;31562:11;31596:6;31591:3;31584:19;31636:4;31631:3;31627:14;31612:29;;31478:169;;;;:::o;31653:148::-;31755:11;31792:3;31777:18;;31653:148;;;;:::o;31807:305::-;31847:3;31866:20;31884:1;31866:20;:::i;:::-;31861:25;;31900:20;31918:1;31900:20;:::i;:::-;31895:25;;32054:1;31986:66;31982:74;31979:1;31976:81;31973:107;;;32060:18;;:::i;:::-;31973:107;32104:1;32101;32097:9;32090:16;;31807:305;;;;:::o;32118:185::-;32158:1;32175:20;32193:1;32175:20;:::i;:::-;32170:25;;32209:20;32227:1;32209:20;:::i;:::-;32204:25;;32248:1;32238:35;;32253:18;;:::i;:::-;32238:35;32295:1;32292;32288:9;32283:14;;32118:185;;;;:::o;32309:191::-;32349:4;32369:20;32387:1;32369:20;:::i;:::-;32364:25;;32403:20;32421:1;32403:20;:::i;:::-;32398:25;;32442:1;32439;32436:8;32433:34;;;32447:18;;:::i;:::-;32433:34;32492:1;32489;32485:9;32477:17;;32309:191;;;;:::o;32506:96::-;32543:7;32572:24;32590:5;32572:24;:::i;:::-;32561:35;;32506:96;;;:::o;32608:90::-;32642:7;32685:5;32678:13;32671:21;32660:32;;32608:90;;;:::o;32704:149::-;32740:7;32780:66;32773:5;32769:78;32758:89;;32704:149;;;:::o;32859:126::-;32896:7;32936:42;32929:5;32925:54;32914:65;;32859:126;;;:::o;32991:77::-;33028:7;33057:5;33046:16;;32991:77;;;:::o;33074:154::-;33158:6;33153:3;33148;33135:30;33220:1;33211:6;33206:3;33202:16;33195:27;33074:154;;;:::o;33234:307::-;33302:1;33312:113;33326:6;33323:1;33320:13;33312:113;;;33411:1;33406:3;33402:11;33396:18;33392:1;33387:3;33383:11;33376:39;33348:2;33345:1;33341:10;33336:15;;33312:113;;;33443:6;33440:1;33437:13;33434:101;;;33523:1;33514:6;33509:3;33505:16;33498:27;33434:101;33283:258;33234:307;;;:::o;33547:320::-;33591:6;33628:1;33622:4;33618:12;33608:22;;33675:1;33669:4;33665:12;33696:18;33686:81;;33752:4;33744:6;33740:17;33730:27;;33686:81;33814:2;33806:6;33803:14;33783:18;33780:38;33777:84;;;33833:18;;:::i;:::-;33777:84;33598:269;33547:320;;;:::o;33873:281::-;33956:27;33978:4;33956:27;:::i;:::-;33948:6;33944:40;34086:6;34074:10;34071:22;34050:18;34038:10;34035:34;34032:62;34029:88;;;34097:18;;:::i;:::-;34029:88;34137:10;34133:2;34126:22;33916:238;33873:281;;:::o;34160:233::-;34199:3;34222:24;34240:5;34222:24;:::i;:::-;34213:33;;34268:66;34261:5;34258:77;34255:103;;;34338:18;;:::i;:::-;34255:103;34385:1;34378:5;34374:13;34367:20;;34160:233;;;:::o;34399:176::-;34431:1;34448:20;34466:1;34448:20;:::i;:::-;34443:25;;34482:20;34500:1;34482:20;:::i;:::-;34477:25;;34521:1;34511:35;;34526:18;;:::i;:::-;34511:35;34567:1;34564;34560:9;34555:14;;34399:176;;;;:::o;34581:180::-;34629:77;34626:1;34619:88;34726:4;34723:1;34716:15;34750:4;34747:1;34740:15;34767:180;34815:77;34812:1;34805:88;34912:4;34909:1;34902:15;34936:4;34933:1;34926:15;34953:180;35001:77;34998:1;34991:88;35098:4;35095:1;35088:15;35122:4;35119:1;35112:15;35139:180;35187:77;35184:1;35177:88;35284:4;35281:1;35274:15;35308:4;35305:1;35298:15;35325:180;35373:77;35370:1;35363:88;35470:4;35467:1;35460:15;35494:4;35491:1;35484:15;35511:180;35559:77;35556:1;35549:88;35656:4;35653:1;35646:15;35680:4;35677:1;35670:15;35697:117;35806:1;35803;35796:12;35820:117;35929:1;35926;35919:12;35943:117;36052:1;36049;36042:12;36066:117;36175:1;36172;36165:12;36189:117;36298:1;36295;36288:12;36312:102;36353:6;36404:2;36400:7;36395:2;36388:5;36384:14;36380:28;36370:38;;36312:102;;;:::o;36420:170::-;36560:22;36556:1;36548:6;36544:14;36537:46;36420:170;:::o;36596:230::-;36736:34;36732:1;36724:6;36720:14;36713:58;36805:13;36800:2;36792:6;36788:15;36781:38;36596:230;:::o;36832:237::-;36972:34;36968:1;36960:6;36956:14;36949:58;37041:20;37036:2;37028:6;37024:15;37017:45;36832:237;:::o;37075:225::-;37215:34;37211:1;37203:6;37199:14;37192:58;37284:8;37279:2;37271:6;37267:15;37260:33;37075:225;:::o;37306:178::-;37446:30;37442:1;37434:6;37430:14;37423:54;37306:178;:::o;37490:223::-;37630:34;37626:1;37618:6;37614:14;37607:58;37699:6;37694:2;37686:6;37682:15;37675:31;37490:223;:::o;37719:175::-;37859:27;37855:1;37847:6;37843:14;37836:51;37719:175;:::o;37900:231::-;38040:34;38036:1;38028:6;38024:14;38017:58;38109:14;38104:2;38096:6;38092:15;38085:39;37900:231;:::o;38137:166::-;38277:18;38273:1;38265:6;38261:14;38254:42;38137:166;:::o;38309:243::-;38449:34;38445:1;38437:6;38433:14;38426:58;38518:26;38513:2;38505:6;38501:15;38494:51;38309:243;:::o;38558:229::-;38698:34;38694:1;38686:6;38682:14;38675:58;38767:12;38762:2;38754:6;38750:15;38743:37;38558:229;:::o;38793:228::-;38933:34;38929:1;38921:6;38917:14;38910:58;39002:11;38997:2;38989:6;38985:15;38978:36;38793:228;:::o;39027:182::-;39167:34;39163:1;39155:6;39151:14;39144:58;39027:182;:::o;39215:231::-;39355:34;39351:1;39343:6;39339:14;39332:58;39424:14;39419:2;39411:6;39407:15;39400:39;39215:231;:::o;39452:182::-;39592:34;39588:1;39580:6;39576:14;39569:58;39452:182;:::o;39640:228::-;39780:34;39776:1;39768:6;39764:14;39757:58;39849:11;39844:2;39836:6;39832:15;39825:36;39640:228;:::o;39874:234::-;40014:34;40010:1;40002:6;39998:14;39991:58;40083:17;40078:2;40070:6;40066:15;40059:42;39874:234;:::o;40114:220::-;40254:34;40250:1;40242:6;40238:14;40231:58;40323:3;40318:2;40310:6;40306:15;40299:28;40114:220;:::o;40340:236::-;40480:34;40476:1;40468:6;40464:14;40457:58;40549:19;40544:2;40536:6;40532:15;40525:44;40340:236;:::o;40582:182::-;40722:34;40718:1;40710:6;40706:14;40699:58;40582:182;:::o;40770:231::-;40910:34;40906:1;40898:6;40894:14;40887:58;40979:14;40974:2;40966:6;40962:15;40955:39;40770:231;:::o;41007:235::-;41147:34;41143:1;41135:6;41131:14;41124:58;41216:18;41211:2;41203:6;41199:15;41192:43;41007:235;:::o;41248:122::-;41321:24;41339:5;41321:24;:::i;:::-;41314:5;41311:35;41301:63;;41360:1;41357;41350:12;41301:63;41248:122;:::o;41376:116::-;41446:21;41461:5;41446:21;:::i;:::-;41439:5;41436:32;41426:60;;41482:1;41479;41472:12;41426:60;41376:116;:::o;41498:120::-;41570:23;41587:5;41570:23;:::i;:::-;41563:5;41560:34;41550:62;;41608:1;41605;41598:12;41550:62;41498:120;:::o;41624:122::-;41697:24;41715:5;41697:24;:::i;:::-;41690:5;41687:35;41677:63;;41736:1;41733;41726:12;41677:63;41624:122;:::o
Swarm Source
ipfs://9ac5918abbe91a3d890b20fd93c30303bcd611b12ca7a944a488c6cede225aac
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.